From de2cb886169b3963b9ed70154bde0b7c6baaae40 Mon Sep 17 00:00:00 2001 From: 1fexd <58902674+1fexd@users.noreply.github.com> Date: Thu, 28 Dec 2023 22:38:30 +0100 Subject: [PATCH 01/44] feat(ID Austria): Remove constraint on any version (#2526) --- .../patches/idaustria/detection/root/RootDetectionPatch.kt | 2 +- .../idaustria/detection/signature/SpoofSignaturePatch.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt b/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt index 0c47f8da..2b720d3b 100644 --- a/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt @@ -12,7 +12,7 @@ import app.revanced.util.returnEarly @Patch( name = "Remove root detection", description = "Removes the check for root permissions and unlocked bootloader.", - compatiblePackages = [CompatiblePackage("at.gv.oe.app", ["3.0.2"])] + compatiblePackages = [CompatiblePackage("at.gv.oe.app")] ) @Suppress("unused") object RootDetectionPatch : BytecodePatch( diff --git a/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/SpoofSignaturePatch.kt b/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/SpoofSignaturePatch.kt index a98c90bc..ae427b74 100644 --- a/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/SpoofSignaturePatch.kt +++ b/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/SpoofSignaturePatch.kt @@ -10,7 +10,7 @@ import app.revanced.patches.idaustria.detection.signature.fingerprints.SpoofSign @Patch( name = "Spoof signature", description = "Spoofs the signature of the app.", - compatiblePackages = [CompatiblePackage("at.gv.oe.app", ["3.0.2"])] + compatiblePackages = [CompatiblePackage("at.gv.oe.app")] ) @Suppress("unused") object SpoofSignaturePatch : BytecodePatch( From 4a479f8fdb0f3d0c707086cc0c00b1618b5def4c Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 28 Dec 2023 21:40:18 +0000 Subject: [PATCH 02/44] chore(release): 3.3.0-dev.1 [skip ci] # [3.3.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v3.2.0...v3.3.0-dev.1) (2023-12-28) ### Features * **ID Austria:** Remove constraint on any version ([#2526](https://github.com/ReVanced/revanced-patches/issues/2526)) ([de2cb88](https://github.com/ReVanced/revanced-patches/commit/de2cb886169b3963b9ed70154bde0b7c6baaae40)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- patches.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48750638..2dd7c8d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [3.3.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v3.2.0...v3.3.0-dev.1) (2023-12-28) + + +### Features + +* **ID Austria:** Remove constraint on any version ([#2526](https://github.com/ReVanced/revanced-patches/issues/2526)) ([de2cb88](https://github.com/ReVanced/revanced-patches/commit/de2cb886169b3963b9ed70154bde0b7c6baaae40)) + # [3.2.0](https://github.com/ReVanced/revanced-patches/compare/v3.1.0...v3.2.0) (2023-12-28) diff --git a/gradle.properties b/gradle.properties index 1cafda7a..5616ad2e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 3.2.0 +version = 3.3.0-dev.1 diff --git a/patches.json b/patches.json index 2bb35ffd..5d4904ae 100644 --- a/patches.json +++ b/patches.json @@ -1 +1 @@ -[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":["3.0.2"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":["3.0.2"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Disables panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Disables resuming the Shorts player on app startup if a Short was last opened.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Enables the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Hides the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Hides the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons under a video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide or change navigation buttons.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Hides previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Hides the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Tricks YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Disable forced captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Changes the app name and icon to your choice (defaults to \"YouTube ReVanced\" and the ReVanced logo).","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Premium heading","description":"Show or hide the premium heading.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"usePremiumHeading","default":true,"values":null,"title":"Use premium heading","description":"Whether to use the premium heading.","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails with still image captures of the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Spoofs the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Shows the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Changes the start page of the app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Change the opacity of the player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the background from the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Hides components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Hides info cards in videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Hides the floating microphone button which appears in search.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Hides the album cards below the artist description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Hides the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Hides player flyout menu items.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Hides the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Hides the suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Disables the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Hides general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Hides components from YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Hides the filter bar in video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Hides the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Disables rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Hides the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Hides timestamp in video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Disables the suggested video end screen at the end of a video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Replaces the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Restores the old seekbar thumbnails that appear above the seekbar instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Integrates SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Removes the dialog that appears when you try to watch a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video url","description":"Adds buttons in player to copy video links.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Enables tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Disables the gesture that is used to seek precisely when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds the ability to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Makes the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Restores the old video quality with advanced video quality options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds custom playback speeds and ability to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Removes ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Enables minimized and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds debugging options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Open links outside of the app directly in your browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always autorepeat","description":"Always repeats the playing video again.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Remove the tracking query parameter from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Spoofs the client to allow playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Spoofs the device dimensions in order to unlock higher video qualities that may not be available on your device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Shows ReVanced announcements on startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Disables haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file +[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Disables panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Disables resuming the Shorts player on app startup if a Short was last opened.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Enables the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Hides the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Hides the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons under a video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide or change navigation buttons.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Hides previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Hides the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Tricks YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Disable forced captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Changes the app name and icon to your choice (defaults to \"YouTube ReVanced\" and the ReVanced logo).","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Premium heading","description":"Show or hide the premium heading.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"usePremiumHeading","default":true,"values":null,"title":"Use premium heading","description":"Whether to use the premium heading.","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails with still image captures of the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Spoofs the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Shows the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Changes the start page of the app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Change the opacity of the player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the background from the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Hides components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Hides info cards in videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Hides the floating microphone button which appears in search.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Hides the album cards below the artist description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Hides the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Hides player flyout menu items.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Hides the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Hides the suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Disables the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Hides general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Hides components from YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Hides the filter bar in video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Hides the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Disables rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Hides the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Hides timestamp in video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Disables the suggested video end screen at the end of a video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Replaces the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Restores the old seekbar thumbnails that appear above the seekbar instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Integrates SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Removes the dialog that appears when you try to watch a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video url","description":"Adds buttons in player to copy video links.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Enables tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Disables the gesture that is used to seek precisely when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds the ability to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Makes the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Restores the old video quality with advanced video quality options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds custom playback speeds and ability to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Removes ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Enables minimized and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds debugging options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Open links outside of the app directly in your browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always autorepeat","description":"Always repeats the playing video again.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Remove the tracking query parameter from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Spoofs the client to allow playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Spoofs the device dimensions in order to unlock higher video qualities that may not be available on your device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Shows ReVanced announcements on startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Disables haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file From 5b31408fa7a0f1d43b0d4962e041aa4681e51c26 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Thu, 28 Dec 2023 22:52:17 +0100 Subject: [PATCH 03/44] ci: Do not use any label for Dependabot --- .github/dependabot.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 165c9c93..049157d2 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,16 +1,19 @@ version: 2 updates: - package-ecosystem: github-actions + labels: [] directory: / schedule: interval: monthly - package-ecosystem: npm + labels: [] directory: / schedule: interval: monthly - package-ecosystem: gradle + labels: [] directory: / schedule: interval: monthly From 1b442afe7bdb524852e9b2facb8f4655e3d44a8e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Dec 2023 19:15:18 +0100 Subject: [PATCH 04/44] build(deps): bump jvm from 1.9.21 to 1.9.22 (#2553) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index b98f2cf1..a818fb54 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,7 @@ import org.gradle.kotlin.dsl.support.listFilesOrdered plugins { - kotlin("jvm") version "1.9.21" + kotlin("jvm") version "1.9.22" alias(libs.plugins.binary.compatibility.validator) `maven-publish` } From 1db33e4f931249a90582e2a617f35147130d734f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Dec 2023 19:15:24 +0100 Subject: [PATCH 05/44] build(deps): bump com.google.guava:guava from 32.1.3-jre to 33.0.0-jre (#2552) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fe1189f8..5fa81a52 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] revanced-patcher = "19.1.0" smali = "3.0.3" -guava = "32.1.3-jre" +guava = "33.0.0-jre" gson = "2.10.1" binary-compatibility-validator = "0.13.2" From 75becc84258995feef6b9b4a4c952a47e69d148f Mon Sep 17 00:00:00 2001 From: Caner Karaca <37447503+CanerKaraca23@users.noreply.github.com> Date: Fri, 29 Dec 2023 21:29:54 +0300 Subject: [PATCH 06/44] ci: Target branch `dev` for Dependabot (#2564) --- .github/dependabot.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 049157d2..93e7caf3 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,17 +3,20 @@ updates: - package-ecosystem: github-actions labels: [] directory: / + target-branch: dev schedule: interval: monthly - package-ecosystem: npm labels: [] directory: / + target-branch: dev schedule: interval: monthly - package-ecosystem: gradle labels: [] directory: / + target-branch: dev schedule: interval: monthly From e8d1389d3367b2fb688f0b85c136c512981b4fdc Mon Sep 17 00:00:00 2001 From: KobeW50 <84587632+KobeW50@users.noreply.github.com> Date: Mon, 1 Jan 2024 10:30:04 -0500 Subject: [PATCH 07/44] feat(YouTube): Improve patch descriptions (#2519) --- .../shared/misc/gms/AbstractGmsCoreSupportPatch.kt | 4 ++-- .../revanced/patches/youtube/ad/general/HideAdsPatch.kt | 2 +- .../revanced/patches/youtube/ad/video/VideoAdsPatch.kt | 2 +- .../copyvideourl/CopyVideoUrlBytecodePatch.kt | 4 ++-- .../dialog/RemoveViewerDiscretionDialogPatch.kt | 4 ++-- .../downloads/ExternalDownloadsBytecodePatch.kt | 2 +- .../seekbar/DisablePreciseSeekingGesturePatch.kt | 2 +- .../interaction/seekbar/EnableSeekbarTappingPatch.kt | 2 +- .../interaction/seekbar/EnableSlideToSeekPatch.kt | 2 +- .../swipecontrols/SwipeControlsBytecodePatch.kt | 2 +- .../youtube/layout/autocaptions/AutoCaptionsPatch.kt | 2 +- .../youtube/layout/branding/CustomBrandingPatch.kt | 2 +- .../layout/branding/header/PremiumHeadingPatch.kt | 4 ++-- .../youtube/layout/buttons/action/HideButtonsPatch.kt | 2 +- .../layout/buttons/autoplay/HideAutoplayButtonPatch.kt | 2 +- .../layout/buttons/captions/HideCaptionsButtonPatch.kt | 2 +- .../youtube/layout/buttons/cast/HideCastButtonPatch.kt | 2 +- .../layout/buttons/navigation/NavigationButtonsPatch.kt | 2 +- .../layout/buttons/player/hide/HidePlayerButtonsPatch.kt | 2 +- .../youtube/layout/hide/albumcards/AlbumCardsPatch.kt | 2 +- .../layout/hide/breakingnews/BreakingNewsPatch.kt | 2 +- .../youtube/layout/hide/comments/CommentsPatch.kt | 2 +- .../layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt | 2 +- .../hide/endscreencards/HideEndscreenCardsPatch.kt | 2 +- .../youtube/layout/hide/filterbar/HideFilterBarPatch.kt | 2 +- .../HideFloatingMicrophoneButtonPatch.kt | 2 +- .../DisableFullscreenAmbientModePatch.kt | 2 +- .../layout/hide/general/HideLayoutComponentsPatch.kt | 2 +- .../youtube/layout/hide/infocards/HideInfoCardsPatch.kt | 2 +- .../hide/loadmorebutton/HideLoadMoreButtonPatch.kt | 2 +- .../player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt | 2 +- .../rollingnumber/DisableRollingNumberAnimationPatch.kt | 2 +- .../youtube/layout/hide/seekbar/HideSeekbarPatch.kt | 2 +- .../layout/hide/shorts/HideShortsComponentsPatch.kt | 2 +- .../DisableSuggestedVideoEndScreenPatch.kt | 2 +- .../youtube/layout/hide/time/HideTimestampPatch.kt | 2 +- .../layout/panels/popup/PlayerPopupPanelsPatch.kt | 2 +- .../player/background/PlayerControlsBackgroundPatch.kt | 2 +- .../player/overlay/CustomPlayerOverlayOpacityPatch.kt | 2 +- .../returnyoutubedislike/ReturnYouTubeDislikePatch.kt | 2 +- .../youtube/layout/searchbar/WideSearchbarPatch.kt | 2 +- .../layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt | 2 +- .../layout/sponsorblock/SponsorBlockBytecodePatch.kt | 2 +- .../layout/spoofappversion/SpoofAppVersionPatch.kt | 2 +- .../youtube/layout/startpage/ChangeStartPagePatch.kt | 2 +- .../DisableResumingShortsOnStartupPatch.kt | 2 +- .../youtube/layout/tablet/EnableTabletLayoutPatch.kt | 2 +- .../layout/tabletminiplayer/TabletMiniPlayerPatch.kt | 2 +- .../patches/youtube/layout/theme/ThemeBytecodePatch.kt | 2 +- .../layout/thumbnails/AlternativeThumbnailsPatch.kt | 4 ++-- .../youtube/misc/announcements/AnnouncementsPatch.kt | 2 +- .../patches/youtube/misc/autorepeat/AutoRepeatPatch.kt | 4 ++-- .../patches/youtube/misc/debugging/DebuggingPatch.kt | 2 +- .../misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt | 9 ++++++--- .../youtube/misc/fix/playback/ClientSpoofPatch.kt | 2 +- .../youtube/misc/links/BypassURLRedirectsPatch.kt | 2 +- .../youtube/misc/links/OpenLinksExternallyPatch.kt | 2 +- .../misc/minimizedplayback/MinimizedPlaybackPatch.kt | 2 +- .../misc/privacy/RemoveTrackingQueryParameterPatch.kt | 2 +- .../patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt | 2 +- .../youtube/video/hdrbrightness/HDRBrightnessPatch.kt | 2 +- .../youtube/video/quality/RememberVideoQualityPatch.kt | 2 +- .../patches/youtube/video/speed/PlaybackSpeedPatch.kt | 2 +- .../videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt | 2 +- .../returnyoutubedislike/host/values/strings.xml | 2 +- src/main/resources/sponsorblock/host/values/strings.xml | 2 +- 66 files changed, 77 insertions(+), 74 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportPatch.kt b/src/main/kotlin/app/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportPatch.kt index dfb06c28..4214c797 100644 --- a/src/main/kotlin/app/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportPatch.kt @@ -24,7 +24,7 @@ import com.android.tools.smali.dexlib2.immutable.reference.ImmutableStringRefere import com.android.tools.smali.dexlib2.util.MethodUtil /** - * A patch that allows Google apps to run without root and under a different package name + * A patch that allows patched Google apps to run without root and under a different package name * by using GmsCore instead of Google Play Services. * * @param fromPackageName The package name of the original app. @@ -47,7 +47,7 @@ abstract class AbstractGmsCoreSupportPatch( fingerprints: Set = emptySet(), ) : BytecodePatch( name = "GmsCore support", - description = "Allows Google apps to run without root and under a different package name " + + description = "Allows patched Google apps to run without root and under a different package name " + "by using GmsCore instead of Google Play Services.", dependencies = setOf(ChangePackageNamePatch::class, abstractGmsCoreSupportResourcePatch::class) + dependencies, compatiblePackages = compatiblePackages, diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt index 521d3ac9..d7d81558 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt @@ -15,7 +15,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c @Patch( name = "Hide ads", - description = "Removes general ads.", + description = "Adds options to remove general ads.", dependencies = [ HideGetPremiumPatch::class, HideAdsResourcePatch::class, diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt index 3bf896f1..5211b80f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt @@ -15,7 +15,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Video ads", - description = "Removes ads in the video player.", + description = "Adds an option to remove ads in the video player.", dependencies = [ IntegrationsPatch::class, SettingsPatch::class diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt index 556888f8..c9e86b90 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt @@ -8,8 +8,8 @@ import app.revanced.patches.youtube.misc.playercontrols.PlayerControlsBytecodePa import app.revanced.patches.youtube.video.information.VideoInformationPatch @Patch( - name = "Copy video url", - description = "Adds buttons in player to copy video links.", + name = "Copy video URL", + description = "Adds options to display buttons in the video player to copy video URLs.", dependencies = [ CopyVideoUrlResourcePatch::class, PlayerControlsBytecodePatch::class, diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt index 1492ea97..14de79c0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt @@ -16,7 +16,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @Patch( name = "Remove viewer discretion dialog", - description = "Removes the dialog that appears when you try to watch a video that has been age-restricted " + + description = "Adds an option to remove the dialog that appears when opening a video that has been age-restricted " + "by accepting it automatically. This does not bypass the age restriction.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ @@ -51,7 +51,7 @@ object RemoveViewerDiscretionDialogPatch : BytecodePatch( ), StringResource( "revanced_remove_viewer_discretion_dialog_user_dialog_message", - "This does not bypass the age restriction, it just accepts it automatically." + "This does not bypass the age restriction. It just accepts it automatically." ) ) ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt index be70a0d3..25042570 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt @@ -9,7 +9,7 @@ import app.revanced.patches.youtube.video.information.VideoInformationPatch @Patch( name = "External downloads", - description = "Adds support to download and save YouTube videos using an external app.", + description = "Adds support to download and save YouTube videos using an external downloader app.", dependencies = [ ExternalDownloadsResourcePatch::class, PlayerControlsBytecodePatch::class, diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt index 4578915f..e02b65c8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt @@ -16,7 +16,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @Patch( name = "Disable precise seeking gesture", - description = "Disables the gesture that is used to seek precisely when swiping up on the seekbar.", + description = "Adds an option to disable precise seeking when swiping up on the seekbar.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt index de7bb508..1451da2d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt @@ -20,7 +20,7 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Patch( name = "Seekbar tapping", - description = "Enables tap-to-seek on the seekbar of the video player.", + description = "Adds an option to enable tap-to-seek on the seekbar of the video player.", dependencies = [ IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt index b8e884a4..42bd8727 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt @@ -17,7 +17,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( name = "Enable slide to seek", - description = "Enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.", + description = "Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsBytecodePatch.kt index 08f6dc5c..6db26ca8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsBytecodePatch.kt @@ -16,7 +16,7 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod @Patch( name = "Swipe controls", - description = "Adds volume and brightness swipe controls.", + description = "Adds options to enable and configure volume and brightness swipe controls.", dependencies = [ IntegrationsPatch::class, PlayerTypeHookPatch::class, diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt index c0f0f396..4af37c85 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt @@ -18,7 +18,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Disable auto captions", - description = "Disable forced captions from being automatically enabled.", + description = "Adds an option to disable captions from being automatically enabled.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt index 244eb773..0730c15e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt @@ -12,7 +12,7 @@ import java.nio.file.Files @Patch( name = "Custom branding", - description = "Changes the app name and icon to your choice (defaults to \"YouTube ReVanced\" and the ReVanced logo).", + description = "Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.", compatiblePackages = [ CompatiblePackage("com.google.android.youtube") ], diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/PremiumHeadingPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/PremiumHeadingPatch.kt index 167d18b7..a255c868 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/PremiumHeadingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/PremiumHeadingPatch.kt @@ -10,7 +10,7 @@ import kotlin.io.path.copyTo @Patch( name = "Premium heading", - description = "Show or hide the premium heading.", + description = "Adds or removes the YouTube Premium logo at the top of feeds.", compatiblePackages = [ CompatiblePackage("com.google.android.youtube") ] @@ -24,7 +24,7 @@ object PremiumHeadingPatch : ResourcePatch() { key = "usePremiumHeading", default = true, title = "Use premium heading", - description = "Whether to use the premium heading.", + description = "Whether to use the YouTube Premium logo.", required = true, ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt index 2ee75c96..4e905b25 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt @@ -13,7 +13,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Hide video action buttons", - description = "Adds options to hide action buttons under a video.", + description = "Adds options to hide action buttons (such as the Download button) under videos.", dependencies = [ ResourceMappingPatch::class, LithoFilterPatch::class diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt index 0d2e40cf..b7ac4be4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt @@ -22,7 +22,7 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Patch( name = "Hide autoplay button", - description = "Hides the autoplay button in the video player.", + description = "Adds an option to hide the autoplay button in the video player.", dependencies = [ IntegrationsPatch::class, SettingsPatch::class, diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt index 55f09f2d..1ce3e7ee 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt @@ -14,7 +14,7 @@ import com.android.tools.smali.dexlib2.Opcode @Patch( name = "Hide captions button", - description = "Hides the captions button in the video player.", + description = "Adds an option to hide the captions button in the video player.", dependencies = [ IntegrationsPatch::class, SettingsPatch::class diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/cast/HideCastButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/cast/HideCastButtonPatch.kt index fe3f8332..394d7623 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/cast/HideCastButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/cast/HideCastButtonPatch.kt @@ -13,7 +13,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Hide cast button", - description = "Hides the cast button in the video player.", + description = "Adds an option to hide the cast button in the video player.", dependencies = [ IntegrationsPatch::class, SettingsPatch::class diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt index 5727bb93..524ebca8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt @@ -19,7 +19,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( name = "Navigation buttons", - description = "Adds options to hide or change navigation buttons.", + description = "Adds options to hide and change navigation buttons (such as the Shorts button).", dependencies = [ IntegrationsPatch::class, SettingsPatch::class, diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt index 22066eff..c03b210a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt @@ -18,7 +18,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction3rc @Patch( name = "Hide player buttons", - description = "Hides previous and next buttons in the video player.", + description = "Adds an option to hide the previous and next buttons in the video player.", dependencies = [ IntegrationsPatch::class, SettingsPatch::class diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt index 7286431a..22fb37d7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt @@ -13,7 +13,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( name = "Hide album cards", - description = "Hides the album cards below the artist description.", + description = "Adds an option to hide album cards below artist descriptions.", dependencies = [ IntegrationsPatch::class, AlbumCardsResourcePatch::class diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt index 9ca0ae79..9b988c61 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt @@ -13,7 +13,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( name = "Hide breaking news shelf", - description = "Hides the breaking news shelf on the homepage tab.", + description = "Adds an option to hide the breaking news shelf on the homepage tab.", dependencies = [ IntegrationsPatch::class, BreakingNewsResourcePatch::class diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt index a2ef81a1..5036a5a5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt @@ -12,7 +12,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Comments", - description = "Hides components related to comments.", + description = "Adds options to hide components related to comments.", dependencies = [ SettingsPatch::class, LithoFilterPatch::class diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt index 075a59e6..d818f0de 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt @@ -13,7 +13,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @Patch( name = "Hide crowdfunding box", - description = "Hides the crowdfunding box between the player and video description.", + description = "Adds an option to hide the crowdfunding box between the player and video description.", dependencies = [ IntegrationsPatch::class, CrowdfundingBoxResourcePatch::class diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt index 254a88d1..47cf5955 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt @@ -16,7 +16,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction21c @Patch( name = "Hide endscreen cards", - description = "Hides the suggested video cards at the end of videos.", + description = "Adds an option to hide suggested video cards at the end of videos.", dependencies = [ IntegrationsPatch::class, HideEndscreenCardsResourcePatch::class diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt index 85a64955..83f79fc3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt @@ -16,7 +16,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @Patch( name = "Hide filter bar", - description = "Hides the filter bar in video feeds.", + description = "Adds options to hide the category bar at the top of video feeds.", dependencies = [HideFilterBarResourcePatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt index 75fa8290..7e0ce5ab 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt @@ -12,7 +12,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @Patch( name = "Hide floating microphone button", - description = "Hides the floating microphone button which appears in search.", + description = "Adds an option to hide the floating microphone button when searching.", dependencies = [HideFloatingMicrophoneButtonResourcePatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt index 6240eba9..e563d23a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt @@ -14,7 +14,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Disable fullscreen ambient mode", - description = "Disables the ambient mode when in fullscreen.", + description = "Adds an option to disable the ambient mode when in fullscreen.", dependencies = [SettingsPatch::class, IntegrationsPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index 78444f21..be721d5c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -24,7 +24,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @Patch( name = "Hide layout components", - description = "Hides general layout components.", + description = "Adds options to hide general layout components.", dependencies = [ LithoFilterPatch::class, SettingsPatch::class diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt index ffead3bc..3cab5a89 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt @@ -19,7 +19,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction @Patch( name = "Hide info cards", - description = "Hides info cards in videos.", + description = "Adds an option to hide info cards that creators add in the video player.", dependencies = [ IntegrationsPatch::class, LithoFilterPatch::class, diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt index 47d4ff3f..1e4538b3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt @@ -12,7 +12,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( name = "Hide \'Load more\' button", - description = "Hides the button under videos that loads similar videos.", + description = "Adds an option to hide the button under videos that loads similar videos.", dependencies = [HideLoadMoreButtonResourcePatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt index ceea41f6..7e8dc69e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt @@ -13,7 +13,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Player flyout menu", - description = "Hides player flyout menu items.", + description = "Adds options to hide menu items that appear when pressing the gear icon in the video player.", dependencies = [ LithoFilterPatch::class, PlayerTypeHookPatch::class, diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt index 43b0d454..76c9cbe4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt @@ -18,7 +18,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( name = "Disable rolling number animations", - description = "Disables rolling number animations of video view count, user likes, and upload time.", + description = "Adds an option to disable rolling number animations of video view count, user likes, and upload time.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt index 3d3c8dc2..99e05677 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt @@ -16,7 +16,7 @@ import app.revanced.patches.youtube.shared.fingerprints.SeekbarOnDrawFingerprint @Patch( name = "Hide seekbar", - description = "Hides the seekbar.", + description = "Adds an option to hide the seekbar.", dependencies = [ IntegrationsPatch::class, SettingsPatch::class, diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index e5904008..e3438a81 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -20,7 +20,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @Patch( name = "Hide Shorts components", - description = "Hides components from YouTube Shorts.", + description = "Adds options to hide components related to YouTube Shorts.", dependencies = [ IntegrationsPatch::class, LithoFilterPatch::class, diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt index b51a02f4..156e22ef 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt @@ -13,7 +13,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @Patch( name = "Disable suggested video end screen", - description = "Disables the suggested video end screen at the end of a video.", + description = "Adds an option to disable the suggested video end screen at the end of videos.", dependencies = [IntegrationsPatch::class, DisableSuggestedVideoEndScreenResourcePatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt index 0712c6cc..c979fd3a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt @@ -14,7 +14,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Hide timestamp", - description = "Hides timestamp in video player.", + description = "Adds an option to hide the timestamp in the bottom left of the video player.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt index f2d8d5dd..c1ef985a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt @@ -14,7 +14,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Disable player popup panels", - description = "Disables panels (such as live chat) from opening automatically.", + description = "Adds an option to disable panels (such as live chat) from opening automatically.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt index b465b0a8..b083a028 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt @@ -9,7 +9,7 @@ import org.w3c.dom.Element @Patch( name = "Remove player controls background", - description = "Removes the background from the video player controls.", + description = "Removes the dark background surrounding the video player controls.", compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt index 66ce9a7f..e0f767b0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt @@ -13,7 +13,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( name = "Custom player overlay opacity", - description = "Change the opacity of the player background when player controls are visible.", + description = "Adds an option to change the opacity of the video player background when player controls are visible.", dependencies = [CustomPlayerOverlayOpacityResourcePatch::class], compatiblePackages = [ CompatiblePackage("com.google.android.youtube") diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index ef19a1c1..f35e863d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -27,7 +27,7 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Patch( name = "Return YouTube Dislike", - description = "Shows the dislike count of videos using the Return YouTube Dislike API.", + description = "Adds an option to show the dislike count of videos using the Return YouTube Dislike API.", dependencies = [ IntegrationsPatch::class, LithoFilterPatch::class, diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt index bc259068..2a81f45a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt @@ -17,7 +17,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Wide searchbar", - description = "Replaces the search icon with a wide search bar. This will hide the YouTube logo when active.", + description = "Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt index bebf677c..a95ca861 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt @@ -15,7 +15,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Restore old seekbar thumbnails", - description = "Restores the old seekbar thumbnails that appear above the seekbar instead of fullscreen thumbnails.", + description = "Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.", dependencies = [IntegrationsPatch::class, SeekbarPreferencesPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt index d865f31c..f4adedbb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt @@ -34,7 +34,7 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference @Patch( name = "SponsorBlock", - description = "Integrates SponsorBlock, which can skip undesired video segments such as sponsored content.", + description = "Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.", compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index f0892f8b..f9dd4ea9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -17,7 +17,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( name = "Spoof app version", - description = "Tricks YouTube into thinking you are running an older version of the app. " + + description = "Adds an option to trick YouTube into thinking you are running an older version of the app. " + "This can be used to restore old UI elements and features.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt index 5e11bf83..80d1ee6e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt @@ -16,7 +16,7 @@ import app.revanced.util.exception @Patch( name = "Change start page", - description = "Changes the start page of the app.", + description = "Adds an option to set which page the app opens in instead of the homepage.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt index 0bef8144..523e1c6a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt @@ -14,7 +14,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Disable resuming Shorts on startup", - description = "Disables resuming the Shorts player on app startup if a Short was last opened.", + description = "Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt index 9b785d66..38fb7953 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt @@ -17,7 +17,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Enable tablet layout", - description = "Spoofs the device form factor to a tablet which enables the tablet layout.", + description = "Adds an option to spoof the device form factor to a tablet which enables the tablet layout.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [CompatiblePackage("com.google.android.youtube")] ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt index 5a22ce5b..7e0318f3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt @@ -22,7 +22,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( name = "Tablet mini player", - description = "Enables the tablet mini player layout.", + description = "Adds an option to enable the tablet mini player layout.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt index 50f7c2bf..a78093b3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt @@ -19,7 +19,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( name = "Theme", - description = "Applies a custom theme.", + description = "Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).", dependencies = [ LithoColorHookPatch::class, SeekbarColorBytecodePatch::class, diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt index 958b8aac..15fbe4de 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt @@ -29,7 +29,7 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod @Patch( name = "Alternative thumbnails", - description = "Adds options to replace video thumbnails with still image captures of the video.", + description = "Adds options to replace video thumbnails using the DeArrow API or image captures from the video.", dependencies = [IntegrationsPatch::class, SettingsPatch::class, AlternativeThumbnailsResourcePatch::class], compatiblePackages = [ CompatiblePackage( @@ -150,7 +150,7 @@ object AlternativeThumbnailsPatch : BytecodePatch( "revanced_alt_thumbnail_dearrow_about_summary", "DeArrow provides crowd-sourced thumbnails for YouTube videos. " + "These thumbnails are often more relevant than those provided by YouTube. " + - "If enabled, video URLs will be sent to the API server and no other data is sent." + "If enabled, video URLs will be sent to the API server and no other data is sent" + "\\n\\nTap here to learn more about DeArrow" ), // Custom about preference with link to the DeArrow website. diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt index 1636a9d6..aeced767 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt @@ -15,7 +15,7 @@ import com.android.tools.smali.dexlib2.Opcode @Patch( name = "Announcements", - description = "Shows ReVanced announcements on startup.", + description = "Adds an option to show announcements from ReVanced on app startup.", compatiblePackages = [CompatiblePackage("com.google.android.youtube")], dependencies = [SettingsPatch::class] ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt index 293b25b5..9e3ab04b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt @@ -16,8 +16,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( - name = "Always autorepeat", - description = "Always repeats the playing video again.", + name = "Always repeat", + description = "Adds an option to always repeat videos when they end.", dependencies = [IntegrationsPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/DebuggingPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/DebuggingPatch.kt index 8898b76e..a2ad3a6a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/DebuggingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/DebuggingPatch.kt @@ -11,7 +11,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Enable debugging", - description = "Adds debugging options.", + description = "Adds options for debugging.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [CompatiblePackage("com.google.android.youtube")] ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt index 974a344d..7bfc795a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt @@ -14,8 +14,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Spoof device dimensions", - description = "Spoofs the device dimensions in order to unlock higher video qualities " + - "that may not be available on your device.", + description = "Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren't available on the device.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( @@ -42,7 +41,11 @@ object SpoofDeviceDimensionsPatch : BytecodePatch( "revanced_spoof_device_dimensions", StringResource("revanced_spoof_device_dimensions_title", "Spoof device dimensions"), StringResource("revanced_spoof_device_dimensions_summary_on", "Device dimensions spoofed"), - StringResource("revanced_spoof_device_dimensions_summary_off", "Device dimensions not spoofed"), + StringResource( + "revanced_spoof_device_dimensions_summary_off", + "Device dimensions not spoofed\\n\\n" + + "Spoofing the device dimensions can unlock higher video qualities but unknown side effects may occur" + ), ) ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt index 6d330051..243bad27 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt @@ -13,7 +13,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @Patch( name = "Client spoof", - description = "Spoofs the client to allow playback.", + description = "Adds options to spoof the client to allow video playback.", dependencies = [SpoofSignaturePatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt index 143d5954..4c612bae 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt @@ -17,7 +17,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @Patch( name = "Bypass URL redirects", - description = "Bypass URL redirects and open the original URL directly.", + description = "Adds an option to bypass URL redirects and open the original URL directly.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt index b8508db0..44a43506 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt @@ -18,7 +18,7 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference @Patch( name = "Open links externally", - description = "Open links outside of the app directly in your browser.", + description = "Adds an option to always open links in your browser instead of in the in-app-browser.", compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt index 3704443d..9f19871e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt @@ -23,7 +23,7 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Patch( name = "Minimized playback", - description = "Enables minimized and background playback.", + description = "Unlocks options for picture-in-picture and background playback.", dependencies = [ IntegrationsPatch::class, PlayerTypeHookPatch::class, diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt index 1a10eb18..5d3d1ac5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt @@ -22,7 +22,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @Patch( name = "Remove tracking query parameter", - description = "Remove the tracking query parameter from links you share.", + description = "Adds an option to remove the tracking info from links you share.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt index 3c14f81a..f54a716b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt @@ -14,7 +14,7 @@ import app.revanced.patches.youtube.misc.zoomhaptics.fingerprints.ZoomHapticsFin @Patch( name = "Disable zoom haptics", - description = "Disables haptics when zooming.", + description = "Adds an option to disable haptics when zooming.", dependencies = [SettingsPatch::class], compatiblePackages = [CompatiblePackage("com.google.android.youtube")] ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt index d565d0a4..5429cb4e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt @@ -16,7 +16,7 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference @Patch( name = "HDR auto brightness", - description = "Makes the brightness of HDR videos follow the system default.", + description = "Adds an option to make the brightness of HDR videos follow the system default.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt index 1f1ca337..f8377a7f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt @@ -26,7 +26,7 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference @Patch( name = "Remember video quality", - description = "Adds the ability to remember the last video quality selected.", + description = "Adds an option to remember the last video quality selected.", dependencies = [IntegrationsPatch::class, VideoInformationPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt index 8cd2146a..244e8955 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt @@ -9,7 +9,7 @@ import app.revanced.patches.youtube.video.speed.remember.RememberPlaybackSpeedPa @Patch( name = "Playback speed", - description = "Adds custom playback speeds and ability to remember the last playback speed selected.", + description = "Adds options to customize available playback speeds and to remember the last playback speed selected.", dependencies = [CustomPlaybackSpeedPatch::class, RememberPlaybackSpeedPatch::class], compatiblePackages = [ CompatiblePackage( diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt index e72ce38e..1dac2a7a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt @@ -14,7 +14,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( name = "Restore old video quality menu", - description = "Restores the old video quality with advanced video quality options.", + description = "Adds an option to restore the old video quality menu with specific video resolution options.", dependencies = [ IntegrationsPatch::class, RestoreOldVideoQualityMenuResourcePatch::class, diff --git a/src/main/resources/returnyoutubedislike/host/values/strings.xml b/src/main/resources/returnyoutubedislike/host/values/strings.xml index 003547b3..b88a5795 100644 --- a/src/main/resources/returnyoutubedislike/host/values/strings.xml +++ b/src/main/resources/returnyoutubedislike/host/values/strings.xml @@ -32,7 +32,7 @@ About ReturnYouTubeDislike.com - Data is provided by the Return YouTube Dislike API. Tap here to learn more. + Data is provided by the Return YouTube Dislike API. Tap here to learn more ReturnYouTubeDislike API statistics of this device diff --git a/src/main/resources/sponsorblock/host/values/strings.xml b/src/main/resources/sponsorblock/host/values/strings.xml index 62919d78..2322f375 100644 --- a/src/main/resources/sponsorblock/host/values/strings.xml +++ b/src/main/resources/sponsorblock/host/values/strings.xml @@ -53,7 +53,7 @@ API URL changed Import/Export settings Copy - Your SponsorBlock JSON configuration that can be imported/exported to ReVanced and other SponsorBlock platforms. %s + Your SponsorBlock JSON configuration that can be imported/exported to ReVanced and other SponsorBlock platforms %s This includes your private user id. Be sure to share this wisely Settings imported successfully Failed to import: %s From 0974e0e1ea31a2be201bc800b81619a422adadb3 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 1 Jan 2024 15:31:56 +0000 Subject: [PATCH 08/44] chore(release): 3.3.0-dev.2 [skip ci] # [3.3.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v3.3.0-dev.1...v3.3.0-dev.2) (2024-01-01) ### Features * **YouTube:** Improve patch descriptions ([#2519](https://github.com/ReVanced/revanced-patches/issues/2519)) ([e8d1389](https://github.com/ReVanced/revanced-patches/commit/e8d1389d3367b2fb688f0b85c136c512981b4fdc)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- patches.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dd7c8d7..313dd263 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [3.3.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v3.3.0-dev.1...v3.3.0-dev.2) (2024-01-01) + + +### Features + +* **YouTube:** Improve patch descriptions ([#2519](https://github.com/ReVanced/revanced-patches/issues/2519)) ([e8d1389](https://github.com/ReVanced/revanced-patches/commit/e8d1389d3367b2fb688f0b85c136c512981b4fdc)) + # [3.3.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v3.2.0...v3.3.0-dev.1) (2023-12-28) diff --git a/gradle.properties b/gradle.properties index 5616ad2e..38365776 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 3.3.0-dev.1 +version = 3.3.0-dev.2 diff --git a/patches.json b/patches.json index 5d4904ae..a94ac439 100644 --- a/patches.json +++ b/patches.json @@ -1 +1 @@ -[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Disables panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Disables resuming the Shorts player on app startup if a Short was last opened.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Enables the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Hides the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Hides the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons under a video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide or change navigation buttons.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Hides previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Hides the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Tricks YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Disable forced captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Changes the app name and icon to your choice (defaults to \"YouTube ReVanced\" and the ReVanced logo).","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Premium heading","description":"Show or hide the premium heading.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"usePremiumHeading","default":true,"values":null,"title":"Use premium heading","description":"Whether to use the premium heading.","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails with still image captures of the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Spoofs the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Shows the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Changes the start page of the app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Change the opacity of the player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the background from the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Hides components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Hides info cards in videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Hides the floating microphone button which appears in search.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Hides the album cards below the artist description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Hides the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Hides player flyout menu items.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Hides the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Hides the suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Disables the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Hides general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Hides components from YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Hides the filter bar in video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Hides the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Disables rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Hides the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Hides timestamp in video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Disables the suggested video end screen at the end of a video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Replaces the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Restores the old seekbar thumbnails that appear above the seekbar instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Integrates SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Removes the dialog that appears when you try to watch a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video url","description":"Adds buttons in player to copy video links.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Enables tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Disables the gesture that is used to seek precisely when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds the ability to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Makes the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Restores the old video quality with advanced video quality options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds custom playback speeds and ability to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Removes ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Enables minimized and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds debugging options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Open links outside of the app directly in your browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always autorepeat","description":"Always repeats the playing video again.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Remove the tracking query parameter from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Spoofs the client to allow playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Spoofs the device dimensions in order to unlock higher video qualities that may not be available on your device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Shows ReVanced announcements on startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Disables haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file +[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Premium heading","description":"Adds or removes the YouTube Premium logo at the top of feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"usePremiumHeading","default":true,"values":null,"title":"Use premium heading","description":"Whether to use the YouTube Premium logo.","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file From a08457e406f4b2e37458a4835c11d370a02d2ce6 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Mon, 1 Jan 2024 16:33:07 +0100 Subject: [PATCH 09/44] refactor: Fix package and code structure (#2541) BREAKING CHANGE: Various public APIs have changed names and packages or were removed entirely --- api/revanced-patches.api | 28 +++--- .../connectivity/wifi/spoof/SpoofWifiPatch.kt | 2 +- .../RemoveCaptureRestrictionPatch.kt | 2 +- .../RemoveScreenshotRestrictionPatch.kt | 2 +- .../patches/reddit/ad/general/HideAdsPatch.kt | 2 +- .../integrations/AbstractIntegrationsPatch.kt | 28 ++++-- .../settings/AbstractSettingsResourcePatch.kt | 3 + .../preference/DefaultBasePreference.kt | 32 ------- .../preference/impl/ListPreference.kt | 12 ++- .../preference/impl/SwitchPreference.kt | 8 +- .../preference/impl/TextPreference.kt | 8 +- .../tiktok/feedfilter/FeedFilterPatch.kt | 4 +- .../cleardisplay/RememberClearModePatch.kt | 4 +- .../interaction/downloads/DownloadsPatch.kt | 8 +- .../misc/integrations/IntegrationsPatch.kt | 1 - .../tiktok/misc/settings/SettingsPatch.kt | 4 +- .../SettingsStatusLoadFingerprint.kt | 2 +- .../tiktok/misc/spoof/sim/SpoofSimPatch.kt | 4 +- .../lockscreen/patch/ShowOnLockscreenPatch.kt | 2 +- .../timelinefilter/TimelineFilterPatch.kt | 2 +- .../patches/twitch/ad/audio/AudioAdsPatch.kt | 5 +- .../twitch/ad/embedded/EmbeddedAdsPatch.kt | 5 +- .../patches/twitch/ad/video/VideoAdsPatch.kt | 5 +- .../antidelete/ShowDeletedMessagesPatch.kt | 7 +- .../autoclaim/AutoClaimChannelPointsPatch.kt | 5 +- .../patches/twitch/debug/DebugModePatch.kt | 19 ++-- .../misc/integrations/IntegrationsPatch.kt | 3 +- .../twitch/misc/settings/SettingsPatch.kt | 48 +++++----- .../twitter/misc/hook/json/JsonHookPatch.kt | 2 +- .../misc/hook/patch/ads/HideAdsPatch.kt | 2 +- .../HideRecommendedUsersPatch.kt | 2 +- .../youtube/ad/general/HideAdsPatch.kt | 2 +- .../ad/general/HideAdsResourcePatch.kt | 2 +- .../ad/getpremium/HideGetPremiumPatch.kt | 2 +- .../patches/youtube/ad/video/VideoAdsPatch.kt | 2 +- .../copyvideourl/CopyVideoUrlBytecodePatch.kt | 2 +- .../RemoveViewerDiscretionDialogPatch.kt | 2 +- .../ExternalDownloadsBytecodePatch.kt | 2 +- .../DisablePreciseSeekingGesturePatch.kt | 2 +- .../seekbar/EnableSeekbarTappingPatch.kt | 2 +- .../seekbar/EnableSlideToSeekPatch.kt | 2 +- .../SwipeControlsHostActivityFingerprint.kt | 2 +- .../layout/autocaptions/AutoCaptionsPatch.kt | 6 +- .../layout/buttons/action/HideButtonsPatch.kt | 2 +- .../autoplay/HideAutoplayButtonPatch.kt | 2 +- .../captions/HideCaptionsButtonPatch.kt | 2 +- .../buttons/cast/HideCastButtonPatch.kt | 2 +- .../navigation/NavigationButtonsPatch.kt | 2 +- .../player/hide/HidePlayerButtonsPatch.kt | 4 +- .../layout/hide/albumcards/AlbumCardsPatch.kt | 2 +- .../hide/breakingnews/BreakingNewsPatch.kt | 2 +- .../layout/hide/comments/CommentsPatch.kt | 2 +- .../crowdfundingbox/CrowdfundingBoxPatch.kt | 2 +- .../endscreencards/HideEndscreenCardsPatch.kt | 2 +- .../hide/filterbar/HideFilterBarPatch.kt | 2 +- .../HideFloatingMicrophoneButtonPatch.kt | 2 +- .../DisableFullscreenAmbientModePatch.kt | 2 +- .../hide/general/HideLayoutComponentsPatch.kt | 4 +- .../hide/infocards/HideInfoCardsPatch.kt | 6 +- .../loadmorebutton/HideLoadMoreButtonPatch.kt | 2 +- .../HideEmailAddressPatch.kt | 2 +- .../HidePlayerFlyoutMenuPatch.kt | 2 +- .../DisableRollingNumberAnimationPatch.kt | 2 +- .../layout/hide/seekbar/HideSeekbarPatch.kt | 2 +- .../hide/shorts/HideShortsComponentsPatch.kt | 2 +- .../DisableSuggestedVideoEndScreenPatch.kt | 2 +- .../layout/hide/time/HideTimestampPatch.kt | 2 +- .../panels/popup/PlayerPopupPanelsPatch.kt | 2 +- .../CustomPlayerOverlayOpacityPatch.kt | 2 +- .../ReturnYouTubeDislikePatch.kt | 4 +- .../layout/searchbar/WideSearchbarPatch.kt | 2 +- .../RestoreOldSeekbarThumbnailsPatch.kt | 3 +- .../seekbar/SeekbarColorBytecodePatch.kt | 2 +- .../seekbar/SeekbarColorResourcePatch.kt | 2 +- .../sponsorblock/SponsorBlockBytecodePatch.kt | 8 +- .../spoofappversion/SpoofAppVersionPatch.kt | 2 +- .../layout/startpage/ChangeStartPagePatch.kt | 5 +- .../DisableResumingShortsOnStartupPatch.kt | 2 +- .../layout/tablet/EnableTabletLayoutPatch.kt | 2 +- .../tabletminiplayer/TabletMiniPlayerPatch.kt | 2 +- .../layout/theme/ThemeBytecodePatch.kt | 2 +- .../thumbnails/AlternativeThumbnailsPatch.kt | 6 +- .../misc/announcements/AnnouncementsPatch.kt | 8 +- .../misc/autorepeat/AutoRepeatPatch.kt | 4 +- .../spoof/SpoofDeviceDimensionsPatch.kt | 2 +- .../FixBackToExitGesturePatch.kt | 2 +- .../misc/fix/playback/SpoofSignaturePatch.kt | 2 +- .../youtube/misc/gms/GmsCoreSupportPatch.kt | 2 +- .../misc/integrations/IntegrationsPatch.kt | 1 - .../misc/links/BypassURLRedirectsPatch.kt | 2 +- .../misc/links/OpenLinksExternallyPatch.kt | 2 +- .../misc/litho/filter/LithoFilterPatch.kt | 2 +- .../MinimizedPlaybackPatch.kt | 2 +- .../playeroverlay/PlayerOverlaysHookPatch.kt | 2 +- .../misc/playertype/PlayerTypeHookPatch.kt | 2 +- .../RemoveTrackingQueryParameterPatch.kt | 2 +- .../youtube/misc/settings/SettingsPatch.kt | 87 ++++++++----------- .../misc/settings/SettingsResourcePatch.kt | 4 +- ... => LicenseActivityOnCreateFingerprint.kt} | 2 +- .../misc/zoomhaptics/ZoomHapticsPatch.kt | 2 +- .../video/hdrbrightness/HDRBrightnessPatch.kt | 2 +- .../information/VideoInformationPatch.kt | 2 +- .../quality/RememberVideoQualityPatch.kt | 2 +- .../speed/custom/CustomPlaybackSpeedPatch.kt | 4 +- .../remember/RememberPlaybackSpeedPatch.kt | 2 +- .../RestoreOldVideoQualityMenuPatch.kt | 4 +- .../settings/host/values/strings.xml | 3 + .../layout/inline_sponsor_overlay.xml | 6 +- 108 files changed, 249 insertions(+), 297 deletions(-) delete mode 100644 src/main/kotlin/app/revanced/patches/shared/settings/preference/DefaultBasePreference.kt rename src/main/kotlin/app/revanced/patches/youtube/misc/settings/fingerprints/{LicenseActivityFingerprint.kt => LicenseActivityOnCreateFingerprint.kt} (86%) diff --git a/api/revanced-patches.api b/api/revanced-patches.api index 9a086a78..4832ac31 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -525,6 +525,7 @@ public final class app/revanced/patches/shared/fingerprints/HomeActivityFingerpr public abstract class app/revanced/patches/shared/integrations/AbstractIntegrationsPatch : app/revanced/patcher/patch/BytecodePatch { public fun (Ljava/lang/String;Ljava/util/Set;)V + public fun (Ljava/util/Set;)V public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } @@ -616,13 +617,6 @@ public abstract class app/revanced/patches/shared/settings/preference/BaseResour public static synthetic fun serialize$default (Lapp/revanced/patches/shared/settings/preference/BaseResource;Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/w3c/dom/Element; } -public abstract class app/revanced/patches/shared/settings/preference/DefaultBasePreference : app/revanced/patches/shared/settings/preference/BasePreference { - public fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Ljava/lang/String;Ljava/lang/Object;)V - public synthetic fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Ljava/lang/String;Ljava/lang/Object;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getDefault ()Ljava/lang/Object; - public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; -} - public final class app/revanced/patches/shared/settings/preference/SummaryType : java/lang/Enum { public static final field DEFAULT Lapp/revanced/patches/shared/settings/preference/SummaryType; public static final field OFF Lapp/revanced/patches/shared/settings/preference/SummaryType; @@ -650,11 +644,9 @@ public final class app/revanced/patches/shared/settings/preference/impl/InputTyp public static fun values ()[Lapp/revanced/patches/shared/settings/preference/impl/InputType; } -public final class app/revanced/patches/shared/settings/preference/impl/ListPreference : app/revanced/patches/shared/settings/preference/DefaultBasePreference { - public fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/ArrayResource;Lapp/revanced/patches/shared/settings/preference/impl/ArrayResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/ArrayResource;Lapp/revanced/patches/shared/settings/preference/impl/ArrayResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getEntries ()Lapp/revanced/patches/shared/settings/preference/impl/ArrayResource; - public final fun getEntryValues ()Lapp/revanced/patches/shared/settings/preference/impl/ArrayResource; +public final class app/revanced/patches/shared/settings/preference/impl/ListPreference : app/revanced/patches/shared/settings/preference/BasePreference { + public fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/ArrayResource;Lapp/revanced/patches/shared/settings/preference/impl/ArrayResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;)V + public synthetic fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/ArrayResource;Lapp/revanced/patches/shared/settings/preference/impl/ArrayResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } @@ -700,18 +692,18 @@ public final class app/revanced/patches/shared/settings/preference/impl/StringRe public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } -public final class app/revanced/patches/shared/settings/preference/impl/SwitchPreference : app/revanced/patches/shared/settings/preference/DefaultBasePreference { - public fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Z)V - public synthetic fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V +public final class app/revanced/patches/shared/settings/preference/impl/SwitchPreference : app/revanced/patches/shared/settings/preference/BasePreference { + public fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;)V + public synthetic fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getSummaryOff ()Lapp/revanced/patches/shared/settings/preference/impl/StringResource; public final fun getSummaryOn ()Lapp/revanced/patches/shared/settings/preference/impl/StringResource; public final fun getUserDialogMessage ()Lapp/revanced/patches/shared/settings/preference/impl/StringResource; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } -public final class app/revanced/patches/shared/settings/preference/impl/TextPreference : app/revanced/patches/shared/settings/preference/DefaultBasePreference { - public fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/InputType;Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/InputType;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +public final class app/revanced/patches/shared/settings/preference/impl/TextPreference : app/revanced/patches/shared/settings/preference/BasePreference { + public fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/InputType;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/InputType;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getInputType ()Lapp/revanced/patches/shared/settings/preference/impl/InputType; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } diff --git a/src/main/kotlin/app/revanced/patches/all/connectivity/wifi/spoof/SpoofWifiPatch.kt b/src/main/kotlin/app/revanced/patches/all/connectivity/wifi/spoof/SpoofWifiPatch.kt index c25f8030..5871749a 100644 --- a/src/main/kotlin/app/revanced/patches/all/connectivity/wifi/spoof/SpoofWifiPatch.kt +++ b/src/main/kotlin/app/revanced/patches/all/connectivity/wifi/spoof/SpoofWifiPatch.kt @@ -18,7 +18,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.Instruction ) @Suppress("unused") object SpoofWifiPatch : AbstractTransformInstructionsPatch() { - private const val INTEGRATIONS_CLASS_DESCRIPTOR_PREFIX = "Lapp/revanced/all/connectivity/wifi/spoof/SpoofWifiPatch" + private const val INTEGRATIONS_CLASS_DESCRIPTOR_PREFIX = "Lapp/revanced/integrations/all/connectivity/wifi/spoof/SpoofWifiPatch" private const val INTEGRATIONS_CLASS_DESCRIPTOR = "$INTEGRATIONS_CLASS_DESCRIPTOR_PREFIX;" override fun filterMap( diff --git a/src/main/kotlin/app/revanced/patches/all/screencapture/removerestriction/RemoveCaptureRestrictionPatch.kt b/src/main/kotlin/app/revanced/patches/all/screencapture/removerestriction/RemoveCaptureRestrictionPatch.kt index 4815f523..3bc82166 100644 --- a/src/main/kotlin/app/revanced/patches/all/screencapture/removerestriction/RemoveCaptureRestrictionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/all/screencapture/removerestriction/RemoveCaptureRestrictionPatch.kt @@ -20,7 +20,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.Instruction @Suppress("unused") object RemoveCaptureRestrictionPatch : AbstractTransformInstructionsPatch() { private const val INTEGRATIONS_CLASS_DESCRIPTOR_PREFIX = - "Lapp/revanced/all/screencapture/removerestriction/RemoveScreencaptureRestrictionPatch" + "Lapp/revanced/integrations/all/screencapture/removerestriction/RemoveScreencaptureRestrictionPatch" private const val INTEGRATIONS_CLASS_DESCRIPTOR = "$INTEGRATIONS_CLASS_DESCRIPTOR_PREFIX;" // Information about method calls we want to replace enum class MethodCall( diff --git a/src/main/kotlin/app/revanced/patches/all/screenshot/removerestriction/RemoveScreenshotRestrictionPatch.kt b/src/main/kotlin/app/revanced/patches/all/screenshot/removerestriction/RemoveScreenshotRestrictionPatch.kt index 4f1db9ef..12006f65 100644 --- a/src/main/kotlin/app/revanced/patches/all/screenshot/removerestriction/RemoveScreenshotRestrictionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/all/screenshot/removerestriction/RemoveScreenshotRestrictionPatch.kt @@ -24,7 +24,7 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference @Suppress("unused") object RemoveScreenshotRestrictionPatch : AbstractTransformInstructionsPatch() { private const val INTEGRATIONS_CLASS_DESCRIPTOR_PREFIX = - "Lapp/revanced/all/screenshot/removerestriction/RemoveScreenshotRestrictionPatch" + "Lapp/revanced/integrations/all/screenshot/removerestriction/RemoveScreenshotRestrictionPatch" private const val INTEGRATIONS_CLASS_DESCRIPTOR = "$INTEGRATIONS_CLASS_DESCRIPTOR_PREFIX;" override fun execute(context: BytecodeContext) { diff --git a/src/main/kotlin/app/revanced/patches/reddit/ad/general/HideAdsPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/ad/general/HideAdsPatch.kt index 23a1c69e..02465c90 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/ad/general/HideAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/ad/general/HideAdsPatch.kt @@ -26,7 +26,7 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Suppress("unused") object HideAdsPatch : BytecodePatch(setOf(AdPostFingerprint, NewAdPostFingerprint)) { private const val FILTER_METHOD_DESCRIPTOR = - "Lapp/revanced/reddit/patches/FilterPromotedLinksPatch;" + + "Lapp/revanced/integrations/reddit/patches/FilterPromotedLinksPatch;" + "->filterChildren(Ljava/lang/Iterable;)Ljava/util/List;" override fun execute(context: BytecodeContext) { diff --git a/src/main/kotlin/app/revanced/patches/shared/integrations/AbstractIntegrationsPatch.kt b/src/main/kotlin/app/revanced/patches/shared/integrations/AbstractIntegrationsPatch.kt index d9d051fa..9b75a18a 100644 --- a/src/main/kotlin/app/revanced/patches/shared/integrations/AbstractIntegrationsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/integrations/AbstractIntegrationsPatch.kt @@ -11,9 +11,27 @@ import com.android.tools.smali.dexlib2.iface.ClassDef import com.android.tools.smali.dexlib2.iface.Method abstract class AbstractIntegrationsPatch( - private val integrationsDescriptor: String, private val hooks: Set ) : BytecodePatch(hooks) { + + @Deprecated( + "Use the constructor without the integrationsDescriptor parameter", + ReplaceWith("AbstractIntegrationsPatch(hooks)") + ) + @Suppress("UNUSED_PARAMETER") + constructor( + integrationsDescriptor: String, + hooks: Set + ) : this(hooks) + + override fun execute(context: BytecodeContext) { + if (context.findClass(INTEGRATIONS_CLASS_DESCRIPTOR) == null) throw PatchException( + "Integrations have not been merged yet. This patch can not succeed without merging the integrations." + ) + + for (hook in hooks) hook.invoke(INTEGRATIONS_CLASS_DESCRIPTOR) + } + /** * [MethodFingerprint] for integrations. * @@ -53,11 +71,7 @@ abstract class AbstractIntegrationsPatch( } } - override fun execute(context: BytecodeContext) { - if (context.findClass(integrationsDescriptor) == null) throw PatchException( - "Integrations have not been merged yet. This patch can not succeed without merging the integrations." - ) - - for (hook in hooks) hook.invoke(integrationsDescriptor) + private companion object { + private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/shared/Utils;" } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/AbstractSettingsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/shared/settings/AbstractSettingsResourcePatch.kt index 4935370d..c5fb9a23 100644 --- a/src/main/kotlin/app/revanced/patches/shared/settings/AbstractSettingsResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/settings/AbstractSettingsResourcePatch.kt @@ -11,6 +11,7 @@ import app.revanced.patches.shared.settings.preference.impl.ArrayResource import app.revanced.patches.shared.settings.preference.impl.StringResource import app.revanced.util.ResourceGroup import app.revanced.util.copyResources +import app.revanced.util.mergeStrings import org.w3c.dom.Node import java.io.Closeable @@ -37,6 +38,8 @@ abstract class AbstractSettingsResourcePatch( stringsEditor = context.xmlEditor["res/values/strings.xml"] arraysEditor = context.xmlEditor["res/values/arrays.xml"] revancedPreferencesEditor = context.xmlEditor["res/xml/$preferenceFileName.xml"] + + context.mergeStrings("settings/host/values/strings.xml") } internal companion object { diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/DefaultBasePreference.kt b/src/main/kotlin/app/revanced/patches/shared/settings/preference/DefaultBasePreference.kt deleted file mode 100644 index 9371d48f..00000000 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/DefaultBasePreference.kt +++ /dev/null @@ -1,32 +0,0 @@ -package app.revanced.patches.shared.settings.preference - -import app.revanced.patches.shared.settings.preference.impl.StringResource -import org.w3c.dom.Document - -/** - * Base preference class that also has a default value. - * - * @param key The key of the preference. - * @param title The title of the preference. - * @param tag The tag of the preference. - * @param summary The summary of the preference. - * @param default The default value of the preference. - */ -abstract class DefaultBasePreference( - key: String?, - title: StringResource, - summary: StringResource? = null, - tag: String, - val default: T? = null, -) : BasePreference(key, title, summary, tag) { - - /** - * Serialize preference element to XML. - * Overriding methods should invoke super and operate on its return value. - * @param ownerDocument Target document to create elements from. - * @param resourceCallback Called when a resource has been processed. - * @return The serialized element. - */ - override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = - super.serialize(ownerDocument, resourceCallback).apply { addDefault(default) } -} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/ListPreference.kt b/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/ListPreference.kt index 37181267..7d849d72 100644 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/ListPreference.kt +++ b/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/ListPreference.kt @@ -1,7 +1,7 @@ package app.revanced.patches.shared.settings.preference.impl +import app.revanced.patches.shared.settings.preference.BasePreference import app.revanced.patches.shared.settings.preference.BaseResource -import app.revanced.patches.shared.settings.preference.DefaultBasePreference import app.revanced.patches.shared.settings.preference.addSummary import org.w3c.dom.Document @@ -13,16 +13,14 @@ import org.w3c.dom.Document * @param entries The human-readable entries of the list preference. * @param entryValues The entry values of the list preference. * @param summary The summary of the list preference. - * @param default The default entry value of the list preference. */ class ListPreference( key: String, title: StringResource, - val entries: ArrayResource, - val entryValues: ArrayResource, - summary: StringResource? = null, - default: String? = null, -) : DefaultBasePreference(key, title, summary, "ListPreference", default) { + private val entries: ArrayResource, + private val entryValues: ArrayResource, + summary: StringResource? = null +) : BasePreference(key, title, summary, "ListPreference") { override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = super.serialize(ownerDocument, resourceCallback).apply { setAttribute("android:entries", "@array/${entries.also { resourceCallback.invoke(it) }.name}") diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/SwitchPreference.kt b/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/SwitchPreference.kt index 6623c3bf..b8e30c3e 100644 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/SwitchPreference.kt +++ b/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/SwitchPreference.kt @@ -1,10 +1,10 @@ package app.revanced.patches.shared.settings.preference.impl +import app.revanced.patches.shared.settings.AbstractSettingsResourcePatch.Companion.include +import app.revanced.patches.shared.settings.preference.BasePreference import app.revanced.patches.shared.settings.preference.BaseResource -import app.revanced.patches.shared.settings.preference.DefaultBasePreference import app.revanced.patches.shared.settings.preference.SummaryType import app.revanced.patches.shared.settings.preference.addSummary -import app.revanced.patches.shared.settings.AbstractSettingsResourcePatch.Companion.include import org.w3c.dom.Document import org.w3c.dom.Element @@ -16,15 +16,13 @@ import org.w3c.dom.Element * @param summaryOn The summary to show when the preference is enabled. * @param summaryOff The summary to show when the preference is disabled. * @param userDialogMessage The message to show in a dialog when the user toggles the preference. - * @param default The default value of the switch. */ class SwitchPreference( key: String, title: StringResource, val summaryOn: StringResource, val summaryOff: StringResource, val userDialogMessage: StringResource? = null, - default: Boolean = false, -) : DefaultBasePreference( key, title, null, "SwitchPreference", default) { +) : BasePreference(key, title, null, "SwitchPreference") { override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit): Element { userDialogMessage?.include() diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/TextPreference.kt b/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/TextPreference.kt index aaac8c5c..1eea68db 100644 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/TextPreference.kt +++ b/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/TextPreference.kt @@ -1,7 +1,7 @@ package app.revanced.patches.shared.settings.preference.impl +import app.revanced.patches.shared.settings.preference.BasePreference import app.revanced.patches.shared.settings.preference.BaseResource -import app.revanced.patches.shared.settings.preference.DefaultBasePreference import org.w3c.dom.Document /** @@ -11,16 +11,14 @@ import org.w3c.dom.Document * @param title The title of the text preference. * @param inputType The input type of the text preference. * @param summary The summary of the text preference. - * @param default The default value of the text preference. */ class TextPreference( key: String?, title: StringResource, summary: StringResource?, val inputType: InputType = InputType.TEXT, - default: String? = null, - tag: String = "app.revanced.integrations.settingsmenu.ResettableEditTextPreference" -) : DefaultBasePreference(key, title, summary, tag, default) { + tag: String = "app.revanced.integrations.shared.settings.preference.ResettableEditTextPreference" +) : BasePreference(key, title, summary, tag) { override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = super.serialize(ownerDocument, resourceCallback).apply { diff --git a/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/FeedFilterPatch.kt b/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/FeedFilterPatch.kt index 01f7c2f8..35a6f77f 100644 --- a/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/FeedFilterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/FeedFilterPatch.kt @@ -36,13 +36,13 @@ object FeedFilterPatch : BytecodePatch( addInstruction( returnFeedItemInstruction.location.index, "invoke-static { v$feedItemsRegister }, " + - "Lapp/revanced/tiktok/feedfilter/FeedItemsFilter;->filter(Lcom/ss/android/ugc/aweme/feed/model/FeedItemList;)V" + "Lapp/revanced/integrations/tiktok/feedfilter/FeedItemsFilter;->filter(Lcom/ss/android/ugc/aweme/feed/model/FeedItemList;)V" ) } ?: throw FeedApiServiceLIZFingerprint.exception SettingsStatusLoadFingerprint.result?.mutableMethod?.addInstruction( 0, - "invoke-static {}, Lapp/revanced/tiktok/settingsmenu/SettingsStatus;->enableFeedFilter()V" + "invoke-static {}, Lapp/revanced/integrations/tiktok/settings/SettingsStatus;->enableFeedFilter()V" ) ?: throw SettingsStatusLoadFingerprint.exception } } diff --git a/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearModePatch.kt b/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearModePatch.kt index 7cf98bec..7399e0b5 100644 --- a/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearModePatch.kt +++ b/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearModePatch.kt @@ -40,7 +40,7 @@ object RememberClearDisplayPatch : BytecodePatch( it.addInstructions( isEnabledIndex, "invoke-static { v$isEnabledRegister }, " + - "Lapp/revanced/tiktok/cleardisplay/RememberClearDisplayPatch;->rememberClearDisplayState(Z)V" + "Lapp/revanced/integrations/tiktok/cleardisplay/RememberClearDisplayPatch;->rememberClearDisplayState(Z)V" ) // endregion @@ -55,7 +55,7 @@ object RememberClearDisplayPatch : BytecodePatch( # Create a new clearDisplayEvent and post it to the EventBus (https://github.com/greenrobot/EventBus) # The state of clear display. - invoke-static { }, Lapp/revanced/tiktok/cleardisplay/RememberClearDisplayPatch;->getClearDisplayState()Z + invoke-static { }, Lapp/revanced/integrations/tiktok/cleardisplay/RememberClearDisplayPatch;->getClearDisplayState()Z move-result v3 if-eqz v3, :clear_display_disabled diff --git a/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt b/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt index afb08892..59b08b0f 100644 --- a/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt @@ -69,7 +69,7 @@ object DownloadsPatch : BytecodePatch( addInstructionsWithLabels( 0, """ - invoke-static {}, Lapp/revanced/tiktok/download/DownloadsPatch;->shouldRemoveWatermark()Z + invoke-static {}, Lapp/revanced/integrations/tiktok/download/DownloadsPatch;->shouldRemoveWatermark()Z move-result v0 if-eqz v0, :noremovewatermark const/4 v0, 0x1 @@ -99,7 +99,7 @@ object DownloadsPatch : BytecodePatch( downloadUriMethod.addInstructions( secondIndex, """ - invoke-static {}, Lapp/revanced/tiktok/download/DownloadsPatch;->getDownloadPath()Ljava/lang/String; + invoke-static {}, Lapp/revanced/integrations/tiktok/download/DownloadsPatch;->getDownloadPath()Ljava/lang/String; move-result-object v0 """ ) @@ -107,7 +107,7 @@ object DownloadsPatch : BytecodePatch( downloadUriMethod.addInstructions( firstIndex, """ - invoke-static {}, Lapp/revanced/tiktok/download/DownloadsPatch;->getDownloadPath()Ljava/lang/String; + invoke-static {}, Lapp/revanced/integrations/tiktok/download/DownloadsPatch;->getDownloadPath()Ljava/lang/String; move-result-object v0 """ ) @@ -115,7 +115,7 @@ object DownloadsPatch : BytecodePatch( SettingsStatusLoadFingerprint to { addInstruction( 0, - "invoke-static {}, Lapp/revanced/tiktok/settingsmenu/SettingsStatus;->enableDownload()V" + "invoke-static {}, Lapp/revanced/integrations/tiktok/settings/SettingsStatus;->enableDownload()V" ) } ).forEach { (fingerprint, patch) -> diff --git a/src/main/kotlin/app/revanced/patches/tiktok/misc/integrations/IntegrationsPatch.kt b/src/main/kotlin/app/revanced/patches/tiktok/misc/integrations/IntegrationsPatch.kt index b13321c0..824e5df8 100644 --- a/src/main/kotlin/app/revanced/patches/tiktok/misc/integrations/IntegrationsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/tiktok/misc/integrations/IntegrationsPatch.kt @@ -6,6 +6,5 @@ import app.revanced.patches.tiktok.misc.integrations.fingerprints.InitFingerprin @Patch(requiresIntegrations = true) object IntegrationsPatch : AbstractIntegrationsPatch( - "Lapp/revanced/tiktok/utils/ReVancedUtils;", setOf(InitFingerprint) ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/SettingsPatch.kt b/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/SettingsPatch.kt index d5980924..f3d5a2b0 100644 --- a/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/SettingsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/SettingsPatch.kt @@ -37,10 +37,10 @@ object SettingsPatch : BytecodePatch( ) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/tiktok/settingsmenu/SettingsMenu;" + "Lapp/revanced/integrations/tiktok/settings/AdPersonalizationActivityHook;" private const val INITIALIZE_SETTINGS_METHOD_DESCRIPTOR = - "$INTEGRATIONS_CLASS_DESCRIPTOR->initializeSettings(" + + "$INTEGRATIONS_CLASS_DESCRIPTOR->initialize(" + "Lcom/bytedance/ies/ugc/aweme/commercialize/compliance/personalization/AdPersonalizationActivity;" + ")Z" diff --git a/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/fingerprints/SettingsStatusLoadFingerprint.kt b/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/fingerprints/SettingsStatusLoadFingerprint.kt index 2f390f23..b689e785 100644 --- a/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/fingerprints/SettingsStatusLoadFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/fingerprints/SettingsStatusLoadFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint internal object SettingsStatusLoadFingerprint : MethodFingerprint( customFingerprint = { methodDef, _ -> - methodDef.definingClass.endsWith("Lapp/revanced/tiktok/settingsmenu/SettingsStatus;") && + methodDef.definingClass.endsWith("Lapp/revanced/integrations/tiktok/settings/SettingsStatus;") && methodDef.name == "load" } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt b/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt index 137347aa..39d412d2 100644 --- a/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt +++ b/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt @@ -85,7 +85,7 @@ object SpoofSimPatch : BytecodePatch() { with(SettingsStatusLoadFingerprint.result!!.mutableMethod) { addInstruction( 0, - "invoke-static {}, Lapp/revanced/tiktok/settingsmenu/SettingsStatus;->enableSimSpoof()V" + "invoke-static {}, Lapp/revanced/integrations/tiktok/settings/SettingsStatus;->enableSimSpoof()V" ) } } @@ -97,7 +97,7 @@ object SpoofSimPatch : BytecodePatch() { addInstructions( index + 2, """ - invoke-static {v$resultReg}, Lapp/revanced/tiktok/spoof/sim/SpoofSimPatch;->$replacement(Ljava/lang/String;)Ljava/lang/String; + invoke-static {v$resultReg}, Lapp/revanced/integrations/tiktok/spoof/sim/SpoofSimPatch;->$replacement(Ljava/lang/String;)Ljava/lang/String; move-result-object v$resultReg """ ) diff --git a/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/patch/ShowOnLockscreenPatch.kt b/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/patch/ShowOnLockscreenPatch.kt index 9e335aef..368879cf 100644 --- a/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/patch/ShowOnLockscreenPatch.kt +++ b/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/patch/ShowOnLockscreenPatch.kt @@ -25,7 +25,7 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference object ShowOnLockscreenPatch : BytecodePatch( setOf(BrightnessFingerprint) ) { - private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/tudortmund/lockscreen/ShowOnLockscreenPatch;" + private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/tudortmund/lockscreen/ShowOnLockscreenPatch;" override fun execute(context: BytecodeContext) { BrightnessFingerprint.result?.mutableMethod?.apply { diff --git a/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/TimelineFilterPatch.kt b/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/TimelineFilterPatch.kt index 6b47bc1e..4c418050 100644 --- a/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/TimelineFilterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/TimelineFilterPatch.kt @@ -60,7 +60,7 @@ object TimelineFilterPatch : BytecodePatch( fingerprint.result?.mutableMethod?.addInstructions( 0, "invoke-static {p$timelineObjectsRegister}, " + - "Lapp/revanced/tumblr/patches/TimelineFilterPatch;->" + + "Lapp/revanced/integrations/tumblr/patches/TimelineFilterPatch;->" + "filterTimeline(Ljava/util/List;)V" ) ?: throw fingerprint.exception } diff --git a/src/main/kotlin/app/revanced/patches/twitch/ad/audio/AudioAdsPatch.kt b/src/main/kotlin/app/revanced/patches/twitch/ad/audio/AudioAdsPatch.kt index bd25a2cb..44f0215a 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/ad/audio/AudioAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/ad/audio/AudioAdsPatch.kt @@ -29,7 +29,7 @@ object AudioAdsPatch : BytecodePatch( mutableMethod.addInstructionsWithLabels( 0, """ - invoke-static { }, Lapp/revanced/twitch/patches/AudioAdsPatch;->shouldBlockAudioAds()Z + invoke-static { }, Lapp/revanced/integrations/twitch/patches/AudioAdsPatch;->shouldBlockAudioAds()Z move-result v0 if-eqz v0, :show_audio_ads return-void @@ -52,8 +52,7 @@ object AudioAdsPatch : BytecodePatch( StringResource( "revanced_block_audio_ads_off", "Audio ads are unblocked" - ), - default = true, + ) ) ) } diff --git a/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch.kt b/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch.kt index 5b7f6d8d..c1ee8f1e 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch.kt @@ -31,7 +31,7 @@ object EmbeddedAdsPatch : BytecodePatch( result.mutableMethod.addInstructions( 3, """ - invoke-static {}, Lapp/revanced/twitch/patches/EmbeddedAdsPatch;->createRequestInterceptor()Lapp/revanced/twitch/api/RequestInterceptor; + invoke-static {}, Lapp/revanced/integrations/twitch/patches/EmbeddedAdsPatch;->createRequestInterceptor()Lapp/revanced/integrations/twitch/api/RequestInterceptor; move-result-object v2 invoke-virtual {v0, v2}, Lokhttp3/OkHttpClient${"$"}Builder;->addInterceptor(Lokhttp3/Interceptor;)Lokhttp3/OkHttpClient${"$"}Builder; """ @@ -59,8 +59,7 @@ object EmbeddedAdsPatch : BytecodePatch( StringResource("key_revanced_proxy_luminous", "luminous"), StringResource("key_revanced_proxy_purpleadblock", "purpleadblock") ) - ), - default = "luminous" + ) ) ) diff --git a/src/main/kotlin/app/revanced/patches/twitch/ad/video/VideoAdsPatch.kt b/src/main/kotlin/app/revanced/patches/twitch/ad/video/VideoAdsPatch.kt index 00b13477..562ad6a9 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/ad/video/VideoAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/ad/video/VideoAdsPatch.kt @@ -24,7 +24,7 @@ import app.revanced.patches.twitch.misc.settings.SettingsPatch compatiblePackages = [CompatiblePackage("tv.twitch.android.app", ["15.4.1", "16.1.0", "16.9.1"])] ) object VideoAdsPatch : AbstractAdPatch( - "Lapp/revanced/twitch/patches/VideoAdsPatch;->shouldBlockVideoAds()Z", + "Lapp/revanced/integrations/twitch/patches/VideoAdsPatch;->shouldBlockVideoAds()Z", "show_video_ads", setOf( ContentConfigShowAdsFingerprint, @@ -135,8 +135,7 @@ object VideoAdsPatch : AbstractAdPatch( StringResource( "revanced_block_video_ads_off", "Video ads are unblocked" - ), - default = true + ) ) ) } diff --git a/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatch.kt b/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatch.kt index d5224f60..5e316a4c 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatch.kt @@ -33,7 +33,7 @@ object ShowDeletedMessagesPatch : BytecodePatch( ) ) { private fun createSpoilerConditionInstructions(register: String = "v0") = """ - invoke-static {}, Lapp/revanced/twitch/patches/ShowDeletedMessagesPatch;->shouldUseSpoiler()Z + invoke-static {}, Lapp/revanced/integrations/twitch/patches/ShowDeletedMessagesPatch;->shouldUseSpoiler()Z move-result $register if-eqz $register, :no_spoiler """ @@ -61,7 +61,7 @@ object ShowDeletedMessagesPatch : BytecodePatch( addInstructionsWithLabels( 0, """ - invoke-static {p2}, Lapp/revanced/twitch/patches/ShowDeletedMessagesPatch;->reformatDeletedMessage(Landroid/text/Spanned;)Landroid/text/Spanned; + invoke-static {p2}, Lapp/revanced/integrations/twitch/patches/ShowDeletedMessagesPatch;->reformatDeletedMessage(Landroid/text/Spanned;)Landroid/text/Spanned; move-result-object v0 if-eqz v0, :no_reformat return-object v0 @@ -92,8 +92,7 @@ object ShowDeletedMessagesPatch : BytecodePatch( StringResource("key_revanced_deleted_messages_spoiler", "spoiler"), StringResource("key_revanced_deleted_messages_cross_out", "cross-out") ) - ), - default = "cross-out" + ) ) ) diff --git a/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt b/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt index a1196696..3883265e 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt @@ -38,8 +38,7 @@ object AutoClaimChannelPointPatch : BytecodePatch( StringResource( "revanced_auto_claim_channel_points_off", "Channel Points are not claimed automatically" - ), - default = true + ) ) ) @@ -48,7 +47,7 @@ object AutoClaimChannelPointPatch : BytecodePatch( addInstructionsWithLabels( lastIndex, // place in front of return-void """ - invoke-static {}, Lapp/revanced/twitch/patches/AutoClaimChannelPointsPatch;->shouldAutoClaim()Z + invoke-static {}, Lapp/revanced/integrations/twitch/patches/AutoClaimChannelPointsPatch;->shouldAutoClaim()Z move-result v0 if-eqz v0, :auto_claim diff --git a/src/main/kotlin/app/revanced/patches/twitch/debug/DebugModePatch.kt b/src/main/kotlin/app/revanced/patches/twitch/debug/DebugModePatch.kt index ac07bdc5..a81fc17f 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/debug/DebugModePatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/debug/DebugModePatch.kt @@ -39,7 +39,7 @@ object DebugModePatch : BytecodePatch( addInstructions( 0, """ - invoke-static {}, Lapp/revanced/twitch/patches/DebugModePatch;->isDebugModeEnabled()Z + invoke-static {}, Lapp/revanced/integrations/twitch/patches/DebugModePatch;->isDebugModeEnabled()Z move-result v0 return v0 """ @@ -49,20 +49,19 @@ object DebugModePatch : BytecodePatch( SettingsPatch.PreferenceScreen.MISC.OTHER.addPreferences( SwitchPreference( - "revanced_debug_mode", + "revanced_twitch_debug_mode", StringResource( - "revanced_debug_mode_enable", - "Enable debug mode" + "revanced_twitch_debug_mode_title", + "Enable Twitch debug mode" ), StringResource( - "revanced_debug_mode_on", - "Debug mode is enabled (not recommended)" + "revanced_twitch_debug_mode_summary_on", + "Twitch debug mode is enabled (not recommended)" ), StringResource( - "revanced_debug_mode_off", - "Debug mode is disabled" - ), - default = false, + "revanced_twitch_debug_mode_summary_off", + "Twitch debug mode is disabled" + ) ) ) } diff --git a/src/main/kotlin/app/revanced/patches/twitch/misc/integrations/IntegrationsPatch.kt b/src/main/kotlin/app/revanced/patches/twitch/misc/integrations/IntegrationsPatch.kt index 66f6b035..6e0dd245 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/misc/integrations/IntegrationsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/misc/integrations/IntegrationsPatch.kt @@ -6,6 +6,5 @@ import app.revanced.patches.twitch.misc.integrations.fingerprints.InitFingerprin @Patch(requiresIntegrations = true) object IntegrationsPatch : AbstractIntegrationsPatch( - "Lapp/revanced/twitch/utils/ReVancedUtils;", setOf(InitFingerprint) -) \ No newline at end of file +) diff --git a/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt b/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt index 36245a25..f1e59c6f 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.twitch.misc.settings -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels @@ -14,12 +13,14 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMut import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.shared.settings.preference.impl.PreferenceCategory import app.revanced.patches.shared.settings.preference.impl.StringResource +import app.revanced.patches.shared.settings.preference.impl.SwitchPreference import app.revanced.patches.shared.settings.util.AbstractPreferenceScreen import app.revanced.patches.twitch.misc.integrations.IntegrationsPatch import app.revanced.patches.twitch.misc.settings.fingerprints.MenuGroupsOnClickFingerprint import app.revanced.patches.twitch.misc.settings.fingerprints.MenuGroupsUpdatedFingerprint import app.revanced.patches.twitch.misc.settings.fingerprints.SettingsActivityOnCreateFingerprint import app.revanced.patches.twitch.misc.settings.fingerprints.SettingsMenuItemEnumFingerprint +import app.revanced.util.exception import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.immutable.ImmutableField import java.io.Closeable @@ -46,12 +47,12 @@ object SettingsPatch : BytecodePatch( private const val REVANCED_SETTINGS_MENU_ITEM_TITLE_RES = "revanced_settings" private const val REVANCED_SETTINGS_MENU_ITEM_ICON_RES = "ic_settings" - private const val MENU_ITEM_ENUM_CLASS = "Ltv/twitch/android/feature/settings/menu/SettingsMenuItem;" - private const val MENU_DISMISS_EVENT_CLASS = "Ltv/twitch/android/feature/settings/menu/SettingsMenuViewDelegate\$Event\$OnDismissClicked;" + private const val MENU_ITEM_ENUM_CLASS_DESCRIPTOR = "Ltv/twitch/android/feature/settings/menu/SettingsMenuItem;" + private const val MENU_DISMISS_EVENT_CLASS_DESCRIPTOR = "Ltv/twitch/android/feature/settings/menu/SettingsMenuViewDelegate\$Event\$OnDismissClicked;" - private const val INTEGRATIONS_PACKAGE = "app/revanced/twitch" - private const val SETTINGS_HOOKS_CLASS = "L$INTEGRATIONS_PACKAGE/settingsmenu/SettingsHooks;" - private const val REVANCED_UTILS_CLASS = "L$INTEGRATIONS_PACKAGE/utils/ReVancedUtils;" + private const val INTEGRATIONS_PACKAGE = "app/revanced/integrations/twitch" + private const val ACTIVITY_HOOKS_CLASS_DESCRIPTOR = "L$INTEGRATIONS_PACKAGE/settings/AppCompatActivityHook;" + private const val UTILS_CLASS_DESCRIPTOR = "L$INTEGRATIONS_PACKAGE/Utils;" override fun execute(context: BytecodeContext) { // Hook onCreate to handle fragment creation @@ -60,7 +61,7 @@ object SettingsPatch : BytecodePatch( mutableMethod.addInstructionsWithLabels( insertIndex, """ - invoke-static {p0}, $SETTINGS_HOOKS_CLASS->handleSettingsCreation(Landroidx/appcompat/app/AppCompatActivity;)Z + invoke-static {p0}, $ACTIVITY_HOOKS_CLASS_DESCRIPTOR->handleSettingsCreation(Landroidx/appcompat/app/AppCompatActivity;)Z move-result v0 if-eqz v0, :no_rv_settings_init return-void @@ -84,8 +85,8 @@ object SettingsPatch : BytecodePatch( mutableMethod.addInstructions( 0, """ - sget-object v0, $MENU_ITEM_ENUM_CLASS->$REVANCED_SETTINGS_MENU_ITEM_NAME:$MENU_ITEM_ENUM_CLASS - invoke-static {p1, v0}, $SETTINGS_HOOKS_CLASS->handleSettingMenuCreation(Ljava/util/List;Ljava/lang/Object;)Ljava/util/List; + sget-object v0, $MENU_ITEM_ENUM_CLASS_DESCRIPTOR->$REVANCED_SETTINGS_MENU_ITEM_NAME:$MENU_ITEM_ENUM_CLASS_DESCRIPTOR + invoke-static {p1, v0}, $ACTIVITY_HOOKS_CLASS_DESCRIPTOR->handleSettingMenuCreation(Ljava/util/List;Ljava/lang/Object;)Ljava/util/List; move-result-object p1 """ ) @@ -97,10 +98,10 @@ object SettingsPatch : BytecodePatch( mutableMethod.addInstructionsWithLabels( insertIndex, """ - invoke-static {p1}, $SETTINGS_HOOKS_CLASS->handleSettingMenuOnClick(Ljava/lang/Enum;)Z + invoke-static {p1}, $ACTIVITY_HOOKS_CLASS_DESCRIPTOR->handleSettingMenuOnClick(Ljava/lang/Enum;)Z move-result p2 if-eqz p2, :no_rv_settings_onclick - sget-object p1, $MENU_DISMISS_EVENT_CLASS->INSTANCE:$MENU_DISMISS_EVENT_CLASS + sget-object p1, $MENU_DISMISS_EVENT_CLASS_DESCRIPTOR->INSTANCE:$MENU_DISMISS_EVENT_CLASS_DESCRIPTOR invoke-virtual {p0, p1}, Ltv/twitch/android/core/mvp/viewdelegate/RxViewDelegate;->pushEvent(Ltv/twitch/android/core/mvp/viewdelegate/ViewDelegateEvent;)V return-void """, @@ -109,8 +110,15 @@ object SettingsPatch : BytecodePatch( } ?: throw MenuGroupsOnClickFingerprint.exception addString("revanced_settings", "ReVanced Settings", false) - addString("revanced_reboot_message", "Twitch needs to restart to apply your changes. Restart now?", false) - addString("revanced_reboot", "Restart", false) + + PreferenceScreen.MISC.OTHER.addPreferences( + SwitchPreference( + "revanced_debug", + StringResource("revanced_debug_title", "Debug logging"), + StringResource("revanced_debug_summary_on", "Debug logs are enabled"), + StringResource("revanced_debug_summary_off", "Debug logs are disabled") + ), + ) } fun addString(identifier: String, value: String, formatted: Boolean = true) = @@ -130,7 +138,7 @@ object SettingsPatch : BytecodePatch( ImmutableField( mutableMethod.definingClass, name, - MENU_ITEM_ENUM_CLASS, + MENU_ITEM_ENUM_CLASS_DESCRIPTOR, AccessFlags.PUBLIC or AccessFlags.FINAL or AccessFlags.ENUM or AccessFlags.STATIC, null, null, @@ -142,17 +150,17 @@ object SettingsPatch : BytecodePatch( mutableMethod.addInstructions( mutableMethod.implementation!!.instructions.size - 4, """ - new-instance v0, $MENU_ITEM_ENUM_CLASS + new-instance v0, $MENU_ITEM_ENUM_CLASS_DESCRIPTOR const-string v1, "$titleResourceName" - invoke-static {v1}, $REVANCED_UTILS_CLASS->getStringId(Ljava/lang/String;)I + invoke-static {v1}, $UTILS_CLASS_DESCRIPTOR->getStringId(Ljava/lang/String;)I move-result v1 const-string v3, "$iconResourceName" - invoke-static {v3}, $REVANCED_UTILS_CLASS->getDrawableId(Ljava/lang/String;)I + invoke-static {v3}, $UTILS_CLASS_DESCRIPTOR->getDrawableId(Ljava/lang/String;)I move-result v3 const-string v4, "$name" const/4 v5, $value - invoke-direct {v0, v4, v5, v1, v3}, $MENU_ITEM_ENUM_CLASS->(Ljava/lang/String;III)V - sput-object v0, $MENU_ITEM_ENUM_CLASS->$name:$MENU_ITEM_ENUM_CLASS + invoke-direct {v0, v4, v5, v1, v3}, $MENU_ITEM_ENUM_CLASS_DESCRIPTOR->(Ljava/lang/String;III)V + sput-object v0, $MENU_ITEM_ENUM_CLASS_DESCRIPTOR->$name:$MENU_ITEM_ENUM_CLASS_DESCRIPTOR """ ) } @@ -179,7 +187,7 @@ object SettingsPatch : BytecodePatch( key, StringResource("${key}_title", title), preferences.sortedBy { it.title.value }, - "app.revanced.twitch.settingsmenu.preference.CustomPreferenceCategory" + "app.revanced.integrations.twitch.settings.preference.CustomPreferenceCategory" ) } } diff --git a/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt b/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt index 847a6770..d7e3687c 100644 --- a/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt @@ -20,7 +20,7 @@ import java.io.InvalidClassException object JsonHookPatch : BytecodePatch( setOf(LoganSquareFingerprint) ), Closeable { - private const val JSON_HOOK_CLASS_NAMESPACE = "app/revanced/twitter/patches/hook/json" + private const val JSON_HOOK_CLASS_NAMESPACE = "app/revanced/integrations/twitter/patches/hook/json" private const val JSON_HOOK_PATCH_CLASS_DESCRIPTOR = "L$JSON_HOOK_CLASS_NAMESPACE/JsonHookPatch;" private const val BASE_PATCH_CLASS_NAME = "BaseJsonHook" private const val JSON_HOOK_CLASS_DESCRIPTOR = "L$JSON_HOOK_CLASS_NAMESPACE/$BASE_PATCH_CLASS_NAME;" diff --git a/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/ads/HideAdsPatch.kt b/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/ads/HideAdsPatch.kt index 40ff710b..15a8f3b2 100644 --- a/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/ads/HideAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/ads/HideAdsPatch.kt @@ -12,4 +12,4 @@ import app.revanced.patches.twitter.misc.hook.patch.BaseHookPatchPatch compatiblePackages = [CompatiblePackage("com.twitter.android")] ) @Suppress("unused") -object HideAdsPatch : BaseHookPatchPatch("Lapp/revanced/twitter/patches/hook/patch/ads/AdsHook;") \ No newline at end of file +object HideAdsPatch : BaseHookPatchPatch("Lapp/revanced/integrations/twitter/patches/hook/patch/ads/AdsHook;") \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/recommendation/HideRecommendedUsersPatch.kt b/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/recommendation/HideRecommendedUsersPatch.kt index d510df7d..211e0f7c 100644 --- a/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/recommendation/HideRecommendedUsersPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/recommendation/HideRecommendedUsersPatch.kt @@ -12,5 +12,5 @@ import app.revanced.patches.twitter.misc.hook.patch.BaseHookPatchPatch ) @Suppress("unused") object HideRecommendedUsersPatch : BaseHookPatchPatch( - "Lapp/revanced/twitter/patches/hook/patch/recommendation/RecommendedUsersHook;" + "Lapp/revanced/integrations/twitter/patches/hook/patch/recommendation/RecommendedUsersHook;" ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt index d7d81558..84167225 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt @@ -65,7 +65,7 @@ object HideAdsPatch : BytecodePatch() { .injectHideViewCall( insertIndex, viewRegister, - "Lapp/revanced/integrations/patches/components/AdsFilter;", + "Lapp/revanced/integrations/youtube/patches/components/AdsFilter;", "hideAdAttributionView" ) } diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsResourcePatch.kt index d7c0ac13..94c53bc9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsResourcePatch.kt @@ -19,7 +19,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch.PreferenceScreen ) object HideAdsResourcePatch : ResourcePatch() { private const val FILTER_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/components/AdsFilter;" + "Lapp/revanced/integrations/youtube/patches/components/AdsFilter;" internal var adAttributionId: Long = -1 diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt index e337874a..9ec7fa8c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt @@ -33,7 +33,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction ) object HideGetPremiumPatch : BytecodePatch(setOf(GetPremiumViewFingerprint)) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/HideGetPremiumPatch;" + "Lapp/revanced/integrations/youtube/patches/HideGetPremiumPatch;" override fun execute(context: BytecodeContext) { SettingsPatch.PreferenceScreen.ADS.addPreferences( diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt index 5211b80f..370e9957 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt @@ -53,7 +53,7 @@ object VideoAdsPatch : BytecodePatch( loadVideoAdsFingerprintMethod.addInstructionsWithLabels( 0, """ - invoke-static { }, Lapp/revanced/integrations/patches/VideoAdsPatch;->shouldShowAds()Z + invoke-static { }, Lapp/revanced/integrations/youtube/patches/VideoAdsPatch;->shouldShowAds()Z move-result v0 if-nez v0, :show_video_ads return-void diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt index c9e86b90..659b2ff1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt @@ -32,7 +32,7 @@ import app.revanced.patches.youtube.video.information.VideoInformationPatch ) @Suppress("unused") object CopyVideoUrlBytecodePatch : BytecodePatch() { - private const val INTEGRATIONS_PLAYER_PACKAGE = "Lapp/revanced/integrations/videoplayer" + private const val INTEGRATIONS_PLAYER_PACKAGE = "Lapp/revanced/integrations/youtube/videoplayer" private val BUTTONS_DESCRIPTORS = listOf( "$INTEGRATIONS_PLAYER_PACKAGE/CopyVideoUrlButton;", "$INTEGRATIONS_PLAYER_PACKAGE/CopyVideoUrlTimestampButton;" diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt index 14de79c0..40bd6e3f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt @@ -30,7 +30,7 @@ object RemoveViewerDiscretionDialogPatch : BytecodePatch( setOf(CreateDialogFingerprint) ) { private const val INTEGRATIONS_METHOD_DESCRIPTOR = - "Lapp/revanced/integrations/patches/RemoveViewerDiscretionDialogPatch;->" + + "Lapp/revanced/integrations/youtube/patches/RemoveViewerDiscretionDialogPatch;->" + "confirmDialog(Landroid/app/AlertDialog;)V" override fun execute(context: BytecodeContext) { diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt index 25042570..015aeba1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt @@ -32,7 +32,7 @@ import app.revanced.patches.youtube.video.information.VideoInformationPatch ) @Suppress("unused") object ExternalDownloadsBytecodePatch : BytecodePatch() { - private const val BUTTON_DESCRIPTOR = "Lapp/revanced/integrations/videoplayer/ExternalDownloadButton;" + private const val BUTTON_DESCRIPTOR = "Lapp/revanced/integrations/youtube/videoplayer/ExternalDownloadButton;" override fun execute(context: BytecodeContext) { /* diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt index e02b65c8..df776163 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt @@ -38,7 +38,7 @@ object DisablePreciseSeekingGesturePatch : BytecodePatch( setOf(IsSwipingUpFingerprint) ) { private const val INTEGRATIONS_METHOD_DESCRIPTOR = - "Lapp/revanced/integrations/patches/DisablePreciseSeekingGesturePatch;->" + + "Lapp/revanced/integrations/youtube/patches/DisablePreciseSeekingGesturePatch;->" + "disableGesture(Landroid/view/VelocityTracker;Landroid/view/MotionEvent;)V" override fun execute(context: BytecodeContext) { diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt index 1451da2d..5d0816a6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt @@ -85,7 +85,7 @@ object EnableSeekbarTappingPatch : BytecodePatch( addInstructionsWithLabels( insertIndex, """ - invoke-static { }, Lapp/revanced/integrations/patches/SeekbarTappingPatch;->seekbarTappingEnabled()Z + invoke-static { }, Lapp/revanced/integrations/youtube/patches/SeekbarTappingPatch;->seekbarTappingEnabled()Z move-result v$freeRegister if-eqz v$freeRegister, :disabled ${oMethod.toInvokeInstructionString()} diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt index 42bd8727..d597625c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt @@ -38,7 +38,7 @@ object EnableSlideToSeekPatch : BytecodePatch( DoubleSpeedSeekNoticeFingerprint ) ) { - private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/SlideToSeekPatch;" + private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/SlideToSeekPatch;" override fun execute(context: BytecodeContext) { SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences( diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/fingerprints/SwipeControlsHostActivityFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/fingerprints/SwipeControlsHostActivityFingerprint.kt index 14bdfb9b..a4b6100a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/fingerprints/SwipeControlsHostActivityFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/fingerprints/SwipeControlsHostActivityFingerprint.kt @@ -8,6 +8,6 @@ internal object SwipeControlsHostActivityFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, parameters = listOf(), customFingerprint = { methodDef, _ -> - methodDef.definingClass == "Lapp/revanced/integrations/swipecontrols/SwipeControlsHostActivity;" + methodDef.definingClass == "Lapp/revanced/integrations/youtube/swipecontrols/SwipeControlsHostActivity;" } ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt index 4af37c85..dec88bf0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt @@ -57,7 +57,7 @@ object AutoCaptionsPatch : BytecodePatch( 0, """ const/4 v0, 0x$enabled - sput-boolean v0, Lapp/revanced/integrations/patches/DisableAutoCaptionsPatch;->captionsButtonDisabled:Z + sput-boolean v0, Lapp/revanced/integrations/youtube/patches/DisableAutoCaptionsPatch;->captionsButtonDisabled:Z """ ) ?: throw fingerprint.exception } @@ -65,10 +65,10 @@ object AutoCaptionsPatch : BytecodePatch( SubtitleTrackFingerprint.result?.mutableMethod?.addInstructionsWithLabels( 0, """ - invoke-static {}, Lapp/revanced/integrations/patches/DisableAutoCaptionsPatch;->autoCaptionsEnabled()Z + invoke-static {}, Lapp/revanced/integrations/youtube/patches/DisableAutoCaptionsPatch;->autoCaptionsEnabled()Z move-result v0 if-eqz v0, :auto_captions_enabled - sget-boolean v0, Lapp/revanced/integrations/patches/DisableAutoCaptionsPatch;->captionsButtonDisabled:Z + sget-boolean v0, Lapp/revanced/integrations/youtube/patches/DisableAutoCaptionsPatch;->captionsButtonDisabled:Z if-nez v0, :auto_captions_enabled const/4 v0, 0x1 return v0 diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt index 4e905b25..7f88b2b7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt @@ -36,7 +36,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Suppress("unused") object HideButtonsPatch : ResourcePatch() { private const val FILTER_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/components/ButtonsFilter;" + "Lapp/revanced/integrations/youtube/patches/components/ButtonsFilter;" override fun execute(context: ResourceContext) { SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt index b7ac4be4..4e3ab1d1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt @@ -78,7 +78,7 @@ object HideAutoplayButtonPatch : BytecodePatch( addInstructionsWithLabels( insertIndex, """ - invoke-static {}, Lapp/revanced/integrations/patches/HideAutoplayButtonPatch;->isButtonShown()Z + invoke-static {}, Lapp/revanced/integrations/youtube/patches/HideAutoplayButtonPatch;->isButtonShown()Z move-result v$clobberRegister if-eqz v$clobberRegister, :hidden """, diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt index 1ce3e7ee..a3114d60 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt @@ -58,7 +58,7 @@ object HideCaptionsButtonPatch : BytecodePatch( subtitleButtonControllerMethod.addInstruction( insertIndex, """ - invoke-static {v0}, Lapp/revanced/integrations/patches/HideCaptionsButtonPatch;->hideCaptionsButton(Landroid/widget/ImageView;)V + invoke-static {v0}, Lapp/revanced/integrations/youtube/patches/HideCaptionsButtonPatch;->hideCaptionsButton(Landroid/widget/ImageView;)V """ ) } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/cast/HideCastButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/cast/HideCastButtonPatch.kt index 394d7623..89cb368f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/cast/HideCastButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/cast/HideCastButtonPatch.kt @@ -40,7 +40,7 @@ object HideCastButtonPatch : BytecodePatch() { addInstructions( 0, """ - invoke-static {p1}, Lapp/revanced/integrations/patches/HideCastButtonPatch;->getCastButtonOverrideV2(I)I + invoke-static {p1}, Lapp/revanced/integrations/youtube/patches/HideCastButtonPatch;->getCastButtonOverrideV2(I)I move-result p1 """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt index 524ebca8..ceb78d6c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt @@ -45,7 +45,7 @@ object NavigationButtonsPatch : BytecodePatch( setOf(AddCreateButtonViewFingerprint) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/NavigationButtonsPatch;" + "Lapp/revanced/integrations/youtube/patches/NavigationButtonsPatch;" override fun execute(context: BytecodeContext) { SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt index c03b210a..dc64b939 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt @@ -72,10 +72,10 @@ object HidePlayerButtonsPatch : BytecodePatch( mutableMethod.addInstructions( callIndex, """ - invoke-static { v$hasNextParameterRegister }, Lapp/revanced/integrations/patches/HidePlayerButtonsPatch;->previousOrNextButtonIsVisible(Z)Z + invoke-static { v$hasNextParameterRegister }, Lapp/revanced/integrations/youtube/patches/HidePlayerButtonsPatch;->previousOrNextButtonIsVisible(Z)Z move-result v$hasNextParameterRegister - invoke-static { v$hasPreviousParameterRegister }, Lapp/revanced/integrations/patches/HidePlayerButtonsPatch;->previousOrNextButtonIsVisible(Z)Z + invoke-static { v$hasPreviousParameterRegister }, Lapp/revanced/integrations/youtube/patches/HidePlayerButtonsPatch;->previousOrNextButtonIsVisible(Z)Z move-result v$hasPreviousParameterRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt index 22fb37d7..ae2d3c40 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt @@ -48,7 +48,7 @@ object AlbumCardsPatch : BytecodePatch( addInstruction( insertIndex, "invoke-static {v$albumCardViewRegister}, " + - "Lapp/revanced/integrations/patches/HideAlbumCardsPatch;" + + "Lapp/revanced/integrations/youtube/patches/HideAlbumCardsPatch;" + "->" + "hideAlbumCard(Landroid/view/View;)V" ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt index 9b988c61..7fb2202f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt @@ -50,7 +50,7 @@ object BreakingNewsPatch : BytecodePatch( insertIndex, """ invoke-static {v$breakingNewsViewRegister}, - Lapp/revanced/integrations/patches/HideBreakingNewsPatch; + Lapp/revanced/integrations/youtube/patches/HideBreakingNewsPatch; -> hideBreakingNews(Landroid/view/View;)V """ diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt index 5036a5a5..dd81aa19 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt @@ -35,7 +35,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Suppress("unused") object CommentsPatch : ResourcePatch() { private const val FILTER_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/components/CommentsFilter;" + "Lapp/revanced/integrations/youtube/patches/components/CommentsFilter;" override fun execute(context: ResourceContext) { LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt index d818f0de..f01894d0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt @@ -38,7 +38,7 @@ object CrowdfundingBoxPatch : BytecodePatch( setOf(CrowdfundingBoxFingerprint) ) { private const val INTEGRATIONS_METHOD_DESCRIPTOR = - "Lapp/revanced/integrations/patches/HideCrowdfundingBoxPatch;->hideCrowdfundingBox(Landroid/view/View;)V" + "Lapp/revanced/integrations/youtube/patches/HideCrowdfundingBoxPatch;->hideCrowdfundingBox(Landroid/view/View;)V" override fun execute(context: BytecodeContext) { CrowdfundingBoxFingerprint.result?.let { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt index 47cf5955..c85e6380 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt @@ -53,7 +53,7 @@ object HideEndscreenCardsPatch : BytecodePatch( addInstruction( insertIndex, - "invoke-static { v$viewRegister }, Lapp/revanced/integrations/patches/HideEndscreenCardsPatch;->hideEndscreen(Landroid/view/View;)V" + "invoke-static { v$viewRegister }, Lapp/revanced/integrations/youtube/patches/HideEndscreenCardsPatch;->hideEndscreen(Landroid/view/View;)V" ) } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt index 83f79fc3..940cb4ca 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt @@ -42,7 +42,7 @@ object HideFilterBarPatch : BytecodePatch( ) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/HideFilterBarPatch;" + "Lapp/revanced/integrations/youtube/patches/HideFilterBarPatch;" override fun execute(context: BytecodeContext) { FilterBarHeightFingerprint.patch { register -> diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt index 7e0ce5ab..dd98a8ae 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt @@ -34,7 +34,7 @@ object HideFloatingMicrophoneButtonPatch : BytecodePatch( setOf(ShowFloatingMicrophoneButtonFingerprint) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/HideFloatingMicrophoneButtonPatch;" + "Lapp/revanced/integrations/youtube/patches/HideFloatingMicrophoneButtonPatch;" override fun execute(context: BytecodeContext) { ShowFloatingMicrophoneButtonFingerprint.result?.let { result -> diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt index e563d23a..60a2264d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt @@ -34,7 +34,7 @@ object DisableFullscreenAmbientModePatch : BytecodePatch( setOf(InitializeAmbientModeFingerprint) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/DisableFullscreenAmbientModePatch;" + "Lapp/revanced/integrations/youtube/patches/DisableFullscreenAmbientModePatch;" override fun execute(context: BytecodeContext) { SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index be721d5c..244c90da 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -48,9 +48,9 @@ object HideLayoutComponentsPatch : BytecodePatch( setOf(ParseElementFromBufferFingerprint, PlayerOverlayFingerprint) ) { private const val LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/components/LayoutComponentsFilter;" + "Lapp/revanced/integrations/youtube/patches/components/LayoutComponentsFilter;" private const val DESCRIPTION_COMPONENTS_FILTER_CLASS_NAME = - "Lapp/revanced/integrations/patches/components/DescriptionComponentsFilter;" + "Lapp/revanced/integrations/youtube/patches/components/DescriptionComponentsFilter;" override fun execute(context: BytecodeContext) { PreferenceScreen.LAYOUT.addPreferences( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt index 3cab5a89..d49c32e4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt @@ -48,7 +48,7 @@ object HideInfoCardsPatch : BytecodePatch( ) ) { private const val FILTER_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/components/HideInfoCardsFilterPatch;" + "Lapp/revanced/integrations/youtube/patches/components/HideInfoCardsFilterPatch;" override fun execute(context: BytecodeContext) { InfocardsIncognitoFingerprint.also { @@ -62,7 +62,7 @@ object HideInfoCardsPatch : BytecodePatch( addInstruction( invokeInstructionIndex, "invoke-static {v${getInstruction(invokeInstructionIndex).registerC}}," + - " Lapp/revanced/integrations/patches/HideInfoCardsPatch;->hideInfoCardsIncognito(Landroid/view/View;)V" + " Lapp/revanced/integrations/youtube/patches/HideInfoCardsPatch;->hideInfoCardsIncognito(Landroid/view/View;)V" ) } @@ -75,7 +75,7 @@ object HideInfoCardsPatch : BytecodePatch( hideInfoCardsCallMethod.addInstructionsWithLabels( invokeInterfaceIndex, """ - invoke-static {}, Lapp/revanced/integrations/patches/HideInfoCardsPatch;->hideInfoCardsMethodCall()Z + invoke-static {}, Lapp/revanced/integrations/youtube/patches/HideInfoCardsPatch;->hideInfoCardsMethodCall()Z move-result v$toggleRegister if-nez v$toggleRegister, :hide_info_cards """, diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt index 1e4538b3..fdd2fc1e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt @@ -34,7 +34,7 @@ object HideLoadMoreButtonPatch : BytecodePatch( setOf(HideLoadMoreButtonFingerprint) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/HideLoadMoreButtonPatch;" + "Lapp/revanced/integrations/youtube/patches/HideLoadMoreButtonPatch;" override fun execute(context: BytecodeContext) { HideLoadMoreButtonFingerprint.result?.let { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt index 011ec9df..d505f2c9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt @@ -44,7 +44,7 @@ object HideEmailAddressPatch : BytecodePatch( addInstructions( setVisibilityConstIndex, """ - invoke-static {v$setVisibilityConstRegister}, Lapp/revanced/integrations/patches/HideEmailAddressPatch;->hideEmailAddress(I)I + invoke-static {v$setVisibilityConstRegister}, Lapp/revanced/integrations/youtube/patches/HideEmailAddressPatch;->hideEmailAddress(I)I move-result v$setVisibilityConstRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt index 7e8dc69e..df8387a9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt @@ -36,7 +36,7 @@ object HidePlayerFlyoutMenuPatch : ResourcePatch() { private const val KEY = "revanced_hide_player_flyout" private const val FILTER_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/components/PlayerFlyoutMenuItemsFilter;" + "Lapp/revanced/integrations/youtube/patches/components/PlayerFlyoutMenuItemsFilter;" override fun execute(context: ResourceContext) { SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt index 76c9cbe4..169741ca 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt @@ -38,7 +38,7 @@ object DisableRollingNumberAnimationPatch : BytecodePatch( ) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/DisableRollingNumberAnimationsPatch;" + "Lapp/revanced/integrations/youtube/patches/DisableRollingNumberAnimationsPatch;" override fun execute(context: BytecodeContext) { SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt index 99e05677..ef8853b3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt @@ -63,7 +63,7 @@ object HideSeekbarPatch : BytecodePatch( 0, """ const/4 v0, 0x0 - invoke-static { }, Lapp/revanced/integrations/patches/HideSeekbarPatch;->hideSeekbar()Z + invoke-static { }, Lapp/revanced/integrations/youtube/patches/HideSeekbarPatch;->hideSeekbar()Z move-result v0 if-eqz v0, :hide_seekbar return-void diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index e3438a81..ddd7c735 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -51,7 +51,7 @@ object HideShortsComponentsPatch : BytecodePatch( SetPivotBarVisibilityParentFingerprint ) ) { - private const val FILTER_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/components/ShortsFilter;" + private const val FILTER_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/components/ShortsFilter;" override fun execute(context: BytecodeContext) { // region Hide the Shorts shelf. diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt index 156e22ef..0715c65c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt @@ -33,7 +33,7 @@ object DisableSuggestedVideoEndScreenPatch : BytecodePatch( setOf(CreateEndScreenViewFingerprint) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/DisableSuggestedVideoEndScreenPatch;" + "Lapp/revanced/integrations/youtube/patches/DisableSuggestedVideoEndScreenPatch;" override fun execute(context: BytecodeContext) { CreateEndScreenViewFingerprint.result?.let { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt index c979fd3a..39e1f6ff 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt @@ -48,7 +48,7 @@ object HideTimestampPatch : BytecodePatch( mutableMethod.addInstructionsWithLabels( 0, """ - invoke-static { }, Lapp/revanced/integrations/patches/HideTimestampPatch;->hideTimestamp()Z + invoke-static { }, Lapp/revanced/integrations/youtube/patches/HideTimestampPatch;->hideTimestamp()Z move-result v0 if-eqz v0, :hide_time return-void diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt index c1ef985a..602bf6a3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt @@ -50,7 +50,7 @@ object PlayerPopupPanelsPatch : BytecodePatch( engagementPanelControllerMethod.addInstructionsWithLabels( 0, """ - invoke-static { }, Lapp/revanced/integrations/patches/DisablePlayerPopupPanelsPatch;->disablePlayerPopupPanels()Z + invoke-static { }, Lapp/revanced/integrations/youtube/patches/DisablePlayerPopupPanelsPatch;->disablePlayerPopupPanels()Z move-result v0 if-eqz v0, :player_popup_panels if-eqz p4, :player_popup_panels diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt index e0f767b0..fd00bf39 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt @@ -21,7 +21,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction ) @Suppress("unused") object CustomPlayerOverlayOpacityPatch : BytecodePatch(setOf(CreatePlayerOverviewFingerprint)) { - private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/CustomPlayerOverlayOpacityPatch;" + private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/CustomPlayerOverlayOpacityPatch;" override fun execute(context: BytecodeContext) { CreatePlayerOverviewFingerprint.result?.let { result -> diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index f35e863d..0af09a95 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -62,10 +62,10 @@ object ReturnYouTubeDislikePatch : BytecodePatch( ) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/ReturnYouTubeDislikePatch;" + "Lapp/revanced/integrations/youtube/patches/ReturnYouTubeDislikePatch;" private const val FILTER_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/components/ReturnYouTubeDislikeFilterPatch;" + "Lapp/revanced/integrations/youtube/patches/components/ReturnYouTubeDislikeFilterPatch;" override fun execute(context: BytecodeContext) { // region Inject newVideoLoaded event handler to update dislikes when a new video is loaded. diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt index 2a81f45a..3bbe66fa 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt @@ -80,7 +80,7 @@ object WideSearchbarPatch : BytecodePatch( addInstructions( implementation!!.instructions.size - 1, """ - invoke-static {}, Lapp/revanced/integrations/patches/WideSearchbarPatch;->enableWideSearchbar()Z + invoke-static {}, Lapp/revanced/integrations/youtube/patches/WideSearchbarPatch;->enableWideSearchbar()Z move-result p0 """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt index a95ca861..1df0b139 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt @@ -11,7 +11,6 @@ import app.revanced.patches.shared.settings.preference.impl.StringResource import app.revanced.patches.shared.settings.preference.impl.SwitchPreference import app.revanced.patches.youtube.layout.seekbar.fingerprints.FullscreenSeekbarThumbnailsFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch -import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Restore old seekbar thumbnails", @@ -35,7 +34,7 @@ object RestoreOldSeekbarThumbnailsPatch : BytecodePatch( setOf(FullscreenSeekbarThumbnailsFingerprint) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/RestoreOldSeekbarThumbnailsPatch;" + "Lapp/revanced/integrations/youtube/patches/RestoreOldSeekbarThumbnailsPatch;" override fun execute(context: BytecodeContext) { SeekbarPreferencesPatch.addPreferences( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorBytecodePatch.kt index 84aae5b8..98acf716 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorBytecodePatch.kt @@ -26,7 +26,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction internal object SeekbarColorBytecodePatch : BytecodePatch( setOf(PlayerSeekbarColorFingerprint, ShortsSeekbarColorFingerprint, SetSeekbarClickedColorFingerprint) ) { - private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/theme/SeekbarColorPatch;" + private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/theme/SeekbarColorPatch;" override fun execute(context: BytecodeContext) { fun MutableMethod.addColorChangeInstructions(resourceId: Long) { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorResourcePatch.kt index ae968743..9f774a60 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorResourcePatch.kt @@ -38,7 +38,7 @@ internal object SeekbarColorResourcePatch : ResourcePatch(){ val scaleNode = progressNode.getElementsByTagName("scale").item(0) as Element val shapeNode = scaleNode.getElementsByTagName("shape").item(0) as Element val replacementNode = editor.file.createElement( - "app.revanced.integrations.patches.theme.ProgressBarDrawable") + "app.revanced.integrations.youtube.patches.theme.ProgressBarDrawable") scaleNode.replaceChild(replacementNode, shapeNode) } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt index f4adedbb..6199e007 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt @@ -69,13 +69,13 @@ object SponsorBlockBytecodePatch : BytecodePatch( ) ) { private const val INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/sponsorblock/SegmentPlaybackController;" + "Lapp/revanced/integrations/youtube/sponsorblock/SegmentPlaybackController;" private const val INTEGRATIONS_CREATE_SEGMENT_BUTTON_CONTROLLER_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/sponsorblock/ui/CreateSegmentButtonController;" + "Lapp/revanced/integrations/youtube/sponsorblock/ui/CreateSegmentButtonController;" private const val INTEGRATIONS_VOTING_BUTTON_CONTROLLER_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/sponsorblock/ui/VotingButtonController;" + "Lapp/revanced/integrations/youtube/sponsorblock/ui/VotingButtonController;" private const val INTEGRATIONS_SPONSORBLOCK_VIEW_CONTROLLER_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/sponsorblock/ui/SponsorBlockViewController;" + "Lapp/revanced/integrations/youtube/sponsorblock/ui/SponsorBlockViewController;" override fun execute(context: BytecodeContext) { LayoutConstructorFingerprint.result?.let { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index f9dd4ea9..bcd23e80 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -38,7 +38,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction object SpoofAppVersionPatch : BytecodePatch( setOf(SpoofAppVersionFingerprint) ) { - private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/spoof/SpoofAppVersionPatch;" + private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/spoof/SpoofAppVersionPatch;" override fun execute(context: BytecodeContext) { SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt index 80d1ee6e..64047aaa 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt @@ -29,7 +29,7 @@ object ChangeStartPagePatch : BytecodePatch( setOf(HomeActivityFingerprint) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/ChangeStartPagePatch;" + "Lapp/revanced/integrations/youtube/patches/ChangeStartPagePatch;" override fun execute(context: BytecodeContext) { SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( @@ -60,8 +60,7 @@ object ChangeStartPagePatch : BytecodePatch( StringResource("revanced_start_page_explore_value_4", "open.explore"), StringResource("revanced_start_page_shorts_value_5", "open.shorts"), ) - ), - default = "" + ) ) ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt index 523e1c6a..9518cc55 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt @@ -36,7 +36,7 @@ object DisableResumingShortsOnStartupPatch : BytecodePatch( ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/DisableResumingStartupShortsPlayerPatch;" + "Lapp/revanced/integrations/youtube/patches/DisableResumingStartupShortsPlayerPatch;" override fun execute(context: BytecodeContext) { SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt index 38fb7953..60521497 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt @@ -44,7 +44,7 @@ object EnableTabletLayoutPatch : BytecodePatch( addInstructionsWithLabels( 0, """ - invoke-static { }, Lapp/revanced/integrations/patches/EnableTabletLayoutPatch;->enableTabletLayout()Z + invoke-static { }, Lapp/revanced/integrations/youtube/patches/EnableTabletLayoutPatch;->enableTabletLayout()Z move-result v0 # Free register if-nez v0, :is_large_form_factor """, diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt index 7e0318f3..e85cd940 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt @@ -120,7 +120,7 @@ object TabletMiniPlayerPatch : BytecodePatch( this.addInstructions( index, """ - invoke-static {v$overrideRegister}, Lapp/revanced/integrations/patches/TabletMiniPlayerOverridePatch;->getTabletMiniPlayerOverride(Z)Z + invoke-static {v$overrideRegister}, Lapp/revanced/integrations/youtube/patches/TabletMiniPlayerOverridePatch;->getTabletMiniPlayerOverride(Z)Z move-result v$overrideRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt index a78093b3..afd6e6cb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt @@ -46,7 +46,7 @@ object ThemeBytecodePatch : BytecodePatch( setOf(UseGradientLoadingScreenFingerprint) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/theme/ThemePatch;" + "Lapp/revanced/integrations/youtube/patches/theme/ThemePatch;" internal const val GRADIENT_LOADING_SCREEN_AB_CONSTANT = 45412406L diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt index 15fbe4de..70b9ba1b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt @@ -55,7 +55,7 @@ object AlternativeThumbnailsPatch : BytecodePatch( ) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/AlternativeThumbnailsPatch;" + "Lapp/revanced/integrations/youtube/patches/AlternativeThumbnailsPatch;" private lateinit var loadImageUrlMethod: MutableMethod private var loadImageUrlIndex = 0 @@ -115,7 +115,7 @@ object AlternativeThumbnailsPatch : BytecodePatch( NonInteractivePreference( StringResource("revanced_alt_thumbnail_about_title", "Thumbnails in use"), null, // Summary is dynamically updated based on the current settings. - tag = "app.revanced.integrations.settingsmenu.AlternativeThumbnailsStatusPreference" + tag = "app.revanced.integrations.youtube.settings.preference.AlternativeThumbnailsStatusPreference" ), SwitchPreference( "revanced_alt_thumbnail_dearrow", @@ -154,7 +154,7 @@ object AlternativeThumbnailsPatch : BytecodePatch( + "\\n\\nTap here to learn more about DeArrow" ), // Custom about preference with link to the DeArrow website. - tag = "app.revanced.integrations.settingsmenu.AlternativeThumbnailsAboutDeArrowPreference", + tag = "app.revanced.integrations.youtube.settings.preference.AlternativeThumbnailsAboutDeArrowPreference", selectable = true ), SwitchPreference( diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt index aeced767..0e0c8b5a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt @@ -24,7 +24,7 @@ object AnnouncementsPatch : BytecodePatch( setOf(WatchWhileActivityFingerprint) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/announcements/AnnouncementsPatch;" + "Lapp/revanced/integrations/youtube/patches/announcements/AnnouncementsPatch;" override fun execute(context: BytecodeContext) { val onCreateMethod = WatchWhileActivityFingerprint.result?.let { @@ -48,10 +48,12 @@ object AnnouncementsPatch : BytecodePatch( StringResource( "revanced_announcements_summary_on", "Announcements are shown on startup" - ), StringResource( + ), + StringResource( "revanced_announcements_summary_off", "Announcements are not shown on startup" - ), StringResource( + ), + StringResource( "revanced_announcements_enabled_summary", "Show announcements on startup" ), diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt index 9e3ab04b..86f38ec8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt @@ -52,7 +52,7 @@ object AutoRepeatPatch : BytecodePatch( val parentResult = AutoRepeatParentFingerprint.result ?: throw PatchException("ParentFingerprint did not resolve.") - //this one needs to be called when app/revanced/integrations/patches/AutoRepeatPatch;->shouldAutoRepeat() returns true + //this one needs to be called when app/revanced/integrations/youtube/patches/AutoRepeatPatch;->shouldAutoRepeat() returns true val playMethod = parentResult.mutableMethod AutoRepeatFingerprint.resolve(context, parentResult.classDef) //String is: Laamp;->E()V @@ -65,7 +65,7 @@ object AutoRepeatPatch : BytecodePatch( //Instructions to add to the smali code val instructions = """ - invoke-static {}, Lapp/revanced/integrations/patches/AutoRepeatPatch;->shouldAutoRepeat()Z + invoke-static {}, Lapp/revanced/integrations/youtube/patches/AutoRepeatPatch;->shouldAutoRepeat()Z move-result v0 if-eqz v0, :noautorepeat invoke-virtual {p0}, $methodToCall diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt index 7bfc795a..9bada899 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt @@ -33,7 +33,7 @@ object SpoofDeviceDimensionsPatch : BytecodePatch( setOf(DeviceDimensionsModelToStringFingerprint) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/spoof/SpoofDeviceDimensionsPatch;" + "Lapp/revanced/integrations/youtube/patches/spoof/SpoofDeviceDimensionsPatch;" override fun execute(context: BytecodeContext) { SettingsPatch.PreferenceScreen.MISC.addPreferences( diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt index e5c73683..663299b9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt @@ -64,6 +64,6 @@ internal object FixBackToExitGesturePatch : BytecodePatch( val register: String = "", val methodName: String, val parameterTypes: String = "" ) { override fun toString() = - "invoke-static {$register}, Lapp/revanced/integrations/patches/FixBackToExitGesturePatch;->$methodName($parameterTypes)V" + "invoke-static {$register}, Lapp/revanced/integrations/youtube/patches/FixBackToExitGesturePatch;->$methodName($parameterTypes)V" } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofSignaturePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofSignaturePatch.kt index fda87848..7b9512d4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofSignaturePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofSignaturePatch.kt @@ -43,7 +43,7 @@ object SpoofSignaturePatch : BytecodePatch( ) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/spoof/SpoofSignaturePatch;" + "Lapp/revanced/integrations/youtube/patches/spoof/SpoofSignaturePatch;" override fun execute(context: BytecodeContext) { SettingsPatch.PreferenceScreen.MISC.addPreferences( diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt index 7d1a11e3..d7d344cc 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt @@ -59,7 +59,7 @@ object GmsCoreSupportPatch : AbstractGmsCoreSupportPatch( // Check the availability of GmsCore. HomeActivityFingerprint.result?.mutableMethod?.addInstruction( 0, - "invoke-static {}, Lapp/revanced/integrations/patches/GmsCoreSupport;->checkAvailability()V" + "invoke-static {}, Lapp/revanced/integrations/youtube/patches/GmsCoreSupport;->checkAvailability()V" ) ?: throw HomeActivityFingerprint.exception super.execute(context) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/IntegrationsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/IntegrationsPatch.kt index aa21e110..7a1d842d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/IntegrationsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/IntegrationsPatch.kt @@ -6,7 +6,6 @@ import app.revanced.patches.youtube.misc.integrations.fingerprints.* @Patch(requiresIntegrations = true) object IntegrationsPatch : AbstractIntegrationsPatch( - "Lapp/revanced/integrations/utils/ReVancedUtils;", setOf( ApplicationInitFingerprint, StandalonePlayerActivityFingerprint, diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt index 4c612bae..38bb6353 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt @@ -57,7 +57,7 @@ object BypassURLRedirectsPatch : BytecodePatch( replaceInstruction( insertIndex, "invoke-static {v$uriStringRegister}," + - "Lapp/revanced/integrations/patches/BypassURLRedirectsPatch;" + + "Lapp/revanced/integrations/youtube/patches/BypassURLRedirectsPatch;" + "->" + "parseRedirectUri(Ljava/lang/String;)Landroid/net/Uri;" ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt index 44a43506..4aae45df 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt @@ -55,7 +55,7 @@ object OpenLinksExternallyPatch : AbstractTransformInstructionsPatchgetIntent(Ljava/lang/String;)Ljava/lang/String; + invoke-static {v$register}, Lapp/revanced/integrations/youtube/patches/OpenLinksExternallyPatch;->getIntent(Ljava/lang/String;)Ljava/lang/String; move-result-object v$register """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt index b19466aa..e85f11c4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt @@ -37,7 +37,7 @@ object LithoFilterPatch : BytecodePatch( private val Instruction.descriptor get() = (this as ReferenceInstruction).reference.toString() - private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/components/LithoFilterPatch;" + private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/components/LithoFilterPatch;" internal lateinit var addFilter: (String) -> Unit private set diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt index 9f19871e..a4cbad51 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt @@ -53,7 +53,7 @@ object MinimizedPlaybackPatch : BytecodePatch( KidsMinimizedPlaybackPolicyControllerFingerprint ) ) { - private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/MinimizedPlaybackPatch;" + private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/MinimizedPlaybackPatch;" override fun execute(context: BytecodeContext) { // TODO: remove this empty preference sometime after mid 2023 diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/playeroverlay/PlayerOverlaysHookPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/playeroverlay/PlayerOverlaysHookPatch.kt index d4a7083b..a48cc48c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/playeroverlay/PlayerOverlaysHookPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/playeroverlay/PlayerOverlaysHookPatch.kt @@ -26,7 +26,7 @@ object PlayerOverlaysHookPatch : BytecodePatch( // TODO: delete this unused outd val method = PlayerOverlaysOnFinishInflateFingerprint.result!!.mutableMethod method.addInstruction( method.implementation!!.instructions.size - 2, - "invoke-static { p0 }, Lapp/revanced/integrations/patches/PlayerOverlaysHookPatch;->YouTubePlayerOverlaysLayout_onFinishInflateHook(Ljava/lang/Object;)V" + "invoke-static { p0 }, Lapp/revanced/integrations/youtube/patches/PlayerOverlaysHookPatch;->YouTubePlayerOverlaysLayout_onFinishInflateHook(Ljava/lang/Object;)V" ) } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt index 186e3b11..0e239e8d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt @@ -20,7 +20,7 @@ object PlayerTypeHookPatch : BytecodePatch( setOf(PlayerTypeFingerprint, VideoStateFingerprint) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/PlayerTypeHookPatch;" + "Lapp/revanced/integrations/youtube/patches/PlayerTypeHookPatch;" override fun execute(context: BytecodeContext) { PlayerTypeFingerprint.result?.mutableMethod?.addInstruction( diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt index 5d3d1ac5..53cd733d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt @@ -40,7 +40,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction object RemoveTrackingQueryParameterPatch : BytecodePatch( setOf(CopyTextFingerprint, SystemShareSheetFingerprint, YouTubeShareSheetFingerprint) ) { - private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/RemoveTrackingQueryParameterPatch;" + private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/RemoveTrackingQueryParameterPatch;" override fun execute(context: BytecodeContext) { SettingsPatch.PreferenceScreen.MISC.addPreferences( diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt index 67ad2c00..d3eb504b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.misc.settings -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions @@ -11,8 +10,9 @@ import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.settings.preference.impl.Preference import app.revanced.patches.shared.settings.util.AbstractPreferenceScreen import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch -import app.revanced.patches.youtube.misc.settings.fingerprints.LicenseActivityFingerprint +import app.revanced.patches.youtube.misc.settings.fingerprints.LicenseActivityOnCreateFingerprint import app.revanced.patches.youtube.misc.settings.fingerprints.SetThemeFingerprint +import app.revanced.util.exception import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.util.MethodUtil @@ -23,72 +23,53 @@ import java.io.Closeable dependencies = [IntegrationsPatch::class, SettingsResourcePatch::class] ) object SettingsPatch : BytecodePatch( - setOf(LicenseActivityFingerprint, SetThemeFingerprint) + setOf(LicenseActivityOnCreateFingerprint, SetThemeFingerprint) ), Closeable { - private const val INTEGRATIONS_PACKAGE = "app/revanced/integrations" - private const val SETTINGS_ACTIVITY_DESCRIPTOR = "L$INTEGRATIONS_PACKAGE/settingsmenu/ReVancedSettingActivity;" - private const val THEME_HELPER_DESCRIPTOR = "L$INTEGRATIONS_PACKAGE/utils/ThemeHelper;" - private const val SET_THEME_METHOD_NAME = "setTheme" + private const val INTEGRATIONS_PACKAGE = "app/revanced/integrations/youtube" + private const val ACTIVITY_HOOK_CLASS_DESCRIPTOR = "L$INTEGRATIONS_PACKAGE/settings/LicenseActivityHook;" + + private const val THEME_HELPER_DESCRIPTOR = "L$INTEGRATIONS_PACKAGE/ThemeHelper;" + private const val SET_THEME_METHOD_NAME: String = "setTheme" override fun execute(context: BytecodeContext) { - // TODO: Remove this when it is only required at one place. - fun getSetThemeInstructionString( - registers: String = "v0", - classDescriptor: String = THEME_HELPER_DESCRIPTOR, - methodName: String = SET_THEME_METHOD_NAME, - parameters: String = "Ljava/lang/Object;" - ) = "invoke-static { $registers }, $classDescriptor->$methodName($parameters)V" - SetThemeFingerprint.result?.mutableMethod?.let { setThemeMethod -> setThemeMethod.implementation!!.instructions.mapIndexedNotNull { i, instruction -> - if (instruction.opcode == Opcode.RETURN_OBJECT) i else null - } - .asReversed() // Prevent index shifting. - .forEach { returnIndex -> - // The following strategy is to replace the return instruction with the setTheme instruction, - // then add a return instruction after the setTheme instruction. - // This is done because the return instruction is a target of another instruction. + if (instruction.opcode == Opcode.RETURN_OBJECT) i else null + }.asReversed().forEach { returnIndex -> + // The following strategy is to replace the return instruction with the setTheme instruction, + // then add a return instruction after the setTheme instruction. + // This is done because the return instruction is a target of another instruction. - setThemeMethod.apply { - // This register is returned by the setTheme method. - val register = getInstruction(returnIndex).registerA - - val setThemeInstruction = getSetThemeInstructionString("v$register") - replaceInstruction(returnIndex, setThemeInstruction) - addInstruction(returnIndex + 1, "return-object v0") - } + setThemeMethod.apply { + // This register is returned by the setTheme method. + val register = getInstruction(returnIndex).registerA + replaceInstruction( + returnIndex, + "invoke-static { v$register }, " + + "$THEME_HELPER_DESCRIPTOR->$SET_THEME_METHOD_NAME(Ljava/lang/Object;)V" + ) + addInstruction(returnIndex + 1, "return-object v$register") } + } } ?: throw SetThemeFingerprint.exception - // Modify the license activity and remove all existing layout code. // Must modify an existing activity and cannot add a new activity to the manifest, // as that fails for root installations. - LicenseActivityFingerprint.result!!.apply licenseActivity@{ - mutableMethod.apply { - fun buildSettingsActivityInvokeString( - registers: String = "p0", - classDescriptor: String = SETTINGS_ACTIVITY_DESCRIPTOR, - methodName: String = "initializeSettings", - parameters: String = "Landroid/app/Activity;" - ) = getSetThemeInstructionString(registers, classDescriptor, methodName, parameters) + LicenseActivityOnCreateFingerprint.result?.let { result -> + result.mutableMethod.addInstructions( + 1, + """ + invoke-static { p0 }, $ACTIVITY_HOOK_CLASS_DESCRIPTOR->initialize(Landroid/app/Activity;)V + return-void + """ + ) - // initialize the settings - addInstructions( - 1, - """ - ${buildSettingsActivityInvokeString()} - return-void - """ - ) - } - - // remove method overrides - mutableClass.apply { + // Remove other methods as they will break as the onCreate method is modified above. + result.mutableClass.apply { methods.removeIf { it.name != "onCreate" && !MethodUtil.isConstructor(it) } } - } - + } ?: throw LicenseActivityOnCreateFingerprint.exception } fun addString(identifier: String, value: String, formatted: Boolean = true) = diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsResourcePatch.kt index a95eb31a..a4a5243c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsResourcePatch.kt @@ -96,11 +96,9 @@ object SettingsResourcePatch : AbstractSettingsResourcePatch( title = StringResource("revanced_pref_import_export_title", "Import / Export"), summary = StringResource("revanced_pref_import_export_summary", "Import / Export ReVanced settings"), inputType = InputType.TEXT_MULTI_LINE, - tag = "app.revanced.integrations.settingsmenu.ImportExportPreference" + tag = "app.revanced.integrations.shared.settings.preference.ImportExportPreference" ) ) - - context.mergeStrings("settings/host/values/strings.xml") } override fun close() { diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/settings/fingerprints/LicenseActivityFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/settings/fingerprints/LicenseActivityOnCreateFingerprint.kt similarity index 86% rename from src/main/kotlin/app/revanced/patches/youtube/misc/settings/fingerprints/LicenseActivityFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/settings/fingerprints/LicenseActivityOnCreateFingerprint.kt index 87534b58..ce3a4a7b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/settings/fingerprints/LicenseActivityFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/settings/fingerprints/LicenseActivityOnCreateFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal object LicenseActivityFingerprint : MethodFingerprint( +internal object LicenseActivityOnCreateFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt index f54a716b..458b6f25 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt @@ -37,7 +37,7 @@ object ZoomHapticsPatch : BytecodePatch( zoomHapticsFingerprintMethod.addInstructionsWithLabels( 0, """ - invoke-static { }, Lapp/revanced/integrations/patches/ZoomHapticsPatch;->shouldVibrate()Z + invoke-static { }, Lapp/revanced/integrations/youtube/patches/ZoomHapticsPatch;->shouldVibrate()Z move-result v0 if-nez v0, :vibrate return-void diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt index 5429cb4e..8d94373b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt @@ -59,7 +59,7 @@ object HDRBrightnessPatch : BytecodePatch( method.addInstructions( insertIndex, """ - invoke-static {v$register}, Lapp/revanced/integrations/patches/HDRAutoBrightnessPatch;->getHDRBrightness(F)F + invoke-static {v$register}, Lapp/revanced/integrations/youtube/patches/HDRAutoBrightnessPatch;->getHDRBrightness(F)F move-result v$register """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt index 1de0f90a..353edcbd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt @@ -37,7 +37,7 @@ object VideoInformationPatch : BytecodePatch( OnPlaybackSpeedItemClickFingerprint ) ) { - private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/VideoInformation;" + private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/VideoInformation;" private lateinit var playerInitMethod: MutableMethod private var playerInitInsertIndex = 4 diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt index f8377a7f..49a578e9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt @@ -51,7 +51,7 @@ object RememberVideoQualityPatch : BytecodePatch( ) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/playback/quality/RememberVideoQualityPatch;" + "Lapp/revanced/integrations/youtube/patches/playback/quality/RememberVideoQualityPatch;" override fun execute(context: BytecodeContext) { // This is bloated as each value has it's own String key/value diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt index 4c572ffa..2e5afea5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt @@ -40,10 +40,10 @@ object CustomPlaybackSpeedPatch : BytecodePatch( ) ) { private const val FILTER_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/components/PlaybackSpeedMenuFilterPatch;" + "Lapp/revanced/integrations/youtube/patches/components/PlaybackSpeedMenuFilterPatch;" private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/playback/speed/CustomPlaybackSpeedPatch;" + "Lapp/revanced/integrations/youtube/patches/playback/speed/CustomPlaybackSpeedPatch;" override fun execute(context: BytecodeContext) { SettingsPatch.PreferenceScreen.VIDEO.addPreferences( diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt index c37c7792..f53105fc 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt @@ -25,7 +25,7 @@ object RememberPlaybackSpeedPatch : BytecodePatch( setOf(InitializePlaybackSpeedValuesFingerprint) ){ private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/playback/speed/RememberPlaybackSpeedPatch;" + "Lapp/revanced/integrations/youtube/patches/playback/speed/RememberPlaybackSpeedPatch;" override fun execute(context: BytecodeContext) { SettingsPatch.PreferenceScreen.VIDEO.addPreferences( diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt index 1dac2a7a..86f7db13 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt @@ -41,10 +41,10 @@ object RestoreOldVideoQualityMenuPatch : BytecodePatch( setOf(VideoQualityMenuViewInflateFingerprint) ) { private const val FILTER_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/components/VideoQualityMenuFilterPatch;" + "Lapp/revanced/integrations/youtube/patches/components/VideoQualityMenuFilterPatch;" private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/patches/playback/quality/RestoreOldVideoQualityMenuPatch;" + "Lapp/revanced/integrations/youtube/patches/playback/quality/RestoreOldVideoQualityMenuPatch;" override fun execute(context: BytecodeContext) { // region Patch for the old type of the video quality menu. diff --git a/src/main/resources/settings/host/values/strings.xml b/src/main/resources/settings/host/values/strings.xml index 75802473..a897f37a 100644 --- a/src/main/resources/settings/host/values/strings.xml +++ b/src/main/resources/settings/host/values/strings.xml @@ -4,6 +4,9 @@ Do you wish to proceed? Reset + Refresh and restart + Restart + Import Copy ReVanced settings reset to default diff --git a/src/main/resources/sponsorblock/layout/inline_sponsor_overlay.xml b/src/main/resources/sponsorblock/layout/inline_sponsor_overlay.xml index 2c038554..2e2270a3 100644 --- a/src/main/resources/sponsorblock/layout/inline_sponsor_overlay.xml +++ b/src/main/resources/sponsorblock/layout/inline_sponsor_overlay.xml @@ -1,7 +1,7 @@ - - - Date: Mon, 1 Jan 2024 15:35:13 +0000 Subject: [PATCH 10/44] chore(release): 4.0.0-dev.1 [skip ci] # [4.0.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v3.3.0-dev.2...v4.0.0-dev.1) (2024-01-01) ### Code Refactoring * Fix package and code structure ([#2541](https://github.com/ReVanced/revanced-patches/issues/2541)) ([a08457e](https://github.com/ReVanced/revanced-patches/commit/a08457e406f4b2e37458a4835c11d370a02d2ce6)) ### BREAKING CHANGES * Various public APIs have changed names and packages or were removed entirely --- CHANGELOG.md | 12 ++++++++++++ gradle.properties | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 313dd263..fa00e790 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# [4.0.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v3.3.0-dev.2...v4.0.0-dev.1) (2024-01-01) + + +### Code Refactoring + +* Fix package and code structure ([#2541](https://github.com/ReVanced/revanced-patches/issues/2541)) ([a08457e](https://github.com/ReVanced/revanced-patches/commit/a08457e406f4b2e37458a4835c11d370a02d2ce6)) + + +### BREAKING CHANGES + +* Various public APIs have changed names and packages or were removed entirely + # [3.3.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v3.3.0-dev.1...v3.3.0-dev.2) (2024-01-01) diff --git a/gradle.properties b/gradle.properties index 38365776..7577b227 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 3.3.0-dev.2 +version = 4.0.0-dev.1 From 75f785d1ef6026cbbdf7073c10aace1b28d93a30 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Tue, 2 Jan 2024 15:34:20 +0100 Subject: [PATCH 11/44] feat(YouTube - Change header): Change to ReVanced borderless logo header by default (#2512) Co-authored-by: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> --- api/revanced-patches.api | 6 + .../layout/branding/CustomBrandingPatch.kt | 2 +- .../branding/header/ChangeHeaderPatch.kt | 137 ++++++++++++++++++ .../branding/header/PremiumHeadingPatch.kt | 57 +------- .../kotlin/app/revanced/util/ResourceUtils.kt | 8 +- .../drawable-hdpi/yt_wordmark_header_dark.png | Bin 0 -> 2352 bytes .../yt_wordmark_header_light.png | Bin 0 -> 2329 bytes .../drawable-mdpi/yt_wordmark_header_dark.png | Bin 0 -> 1566 bytes .../yt_wordmark_header_light.png | Bin 0 -> 1538 bytes .../yt_wordmark_header_dark.png | Bin 0 -> 3137 bytes .../yt_wordmark_header_light.png | Bin 0 -> 3119 bytes .../yt_wordmark_header_dark.png | Bin 0 -> 4992 bytes .../yt_wordmark_header_light.png | Bin 0 -> 4953 bytes .../yt_wordmark_header_dark.png | Bin 0 -> 6642 bytes .../yt_wordmark_header_light.png | Bin 0 -> 6602 bytes .../drawable-hdpi/yt_wordmark_header_dark.png | Bin 0 -> 3445 bytes .../yt_wordmark_header_light.png | Bin 0 -> 3478 bytes .../drawable-mdpi/yt_wordmark_header_dark.png | Bin 0 -> 2105 bytes .../yt_wordmark_header_light.png | Bin 0 -> 2088 bytes .../yt_wordmark_header_dark.png | Bin 0 -> 4807 bytes .../yt_wordmark_header_light.png | Bin 0 -> 4777 bytes .../yt_wordmark_header_dark.png | Bin 0 -> 7324 bytes .../yt_wordmark_header_light.png | Bin 0 -> 7307 bytes .../yt_wordmark_header_dark.png | Bin 0 -> 9726 bytes .../yt_wordmark_header_light.png | Bin 0 -> 9688 bytes ...veproduct_youtube_background_color_108.png | Bin ...veproduct_youtube_foreground_color_108.png | Bin .../mipmap-hdpi/ic_launcher.png | Bin .../mipmap-hdpi/ic_launcher_round.png | Bin ...veproduct_youtube_background_color_108.png | Bin ...veproduct_youtube_foreground_color_108.png | Bin .../mipmap-mdpi/ic_launcher.png | Bin .../mipmap-mdpi/ic_launcher_round.png | Bin ...veproduct_youtube_background_color_108.png | Bin ...veproduct_youtube_foreground_color_108.png | Bin .../mipmap-xhdpi/ic_launcher.png | Bin .../mipmap-xhdpi/ic_launcher_round.png | Bin ...veproduct_youtube_background_color_108.png | Bin ...veproduct_youtube_foreground_color_108.png | Bin .../mipmap-xxhdpi/ic_launcher.png | Bin .../mipmap-xxhdpi/ic_launcher_round.png | Bin ...veproduct_youtube_background_color_108.png | Bin ...veproduct_youtube_foreground_color_108.png | Bin .../mipmap-xxxhdpi/ic_launcher.png | Bin .../mipmap-xxxhdpi/ic_launcher_round.png | Bin 45 files changed, 153 insertions(+), 57 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt create mode 100644 src/main/resources/change-header/revanced-borderless/drawable-hdpi/yt_wordmark_header_dark.png create mode 100644 src/main/resources/change-header/revanced-borderless/drawable-hdpi/yt_wordmark_header_light.png create mode 100644 src/main/resources/change-header/revanced-borderless/drawable-mdpi/yt_wordmark_header_dark.png create mode 100644 src/main/resources/change-header/revanced-borderless/drawable-mdpi/yt_wordmark_header_light.png create mode 100644 src/main/resources/change-header/revanced-borderless/drawable-xhdpi/yt_wordmark_header_dark.png create mode 100644 src/main/resources/change-header/revanced-borderless/drawable-xhdpi/yt_wordmark_header_light.png create mode 100644 src/main/resources/change-header/revanced-borderless/drawable-xxhdpi/yt_wordmark_header_dark.png create mode 100644 src/main/resources/change-header/revanced-borderless/drawable-xxhdpi/yt_wordmark_header_light.png create mode 100644 src/main/resources/change-header/revanced-borderless/drawable-xxxhdpi/yt_wordmark_header_dark.png create mode 100644 src/main/resources/change-header/revanced-borderless/drawable-xxxhdpi/yt_wordmark_header_light.png create mode 100644 src/main/resources/change-header/revanced/drawable-hdpi/yt_wordmark_header_dark.png create mode 100644 src/main/resources/change-header/revanced/drawable-hdpi/yt_wordmark_header_light.png create mode 100644 src/main/resources/change-header/revanced/drawable-mdpi/yt_wordmark_header_dark.png create mode 100644 src/main/resources/change-header/revanced/drawable-mdpi/yt_wordmark_header_light.png create mode 100644 src/main/resources/change-header/revanced/drawable-xhdpi/yt_wordmark_header_dark.png create mode 100644 src/main/resources/change-header/revanced/drawable-xhdpi/yt_wordmark_header_light.png create mode 100644 src/main/resources/change-header/revanced/drawable-xxhdpi/yt_wordmark_header_dark.png create mode 100644 src/main/resources/change-header/revanced/drawable-xxhdpi/yt_wordmark_header_light.png create mode 100644 src/main/resources/change-header/revanced/drawable-xxxhdpi/yt_wordmark_header_dark.png create mode 100644 src/main/resources/change-header/revanced/drawable-xxxhdpi/yt_wordmark_header_light.png rename src/main/resources/{branding => custom-branding}/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-hdpi/ic_launcher.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-hdpi/ic_launcher_round.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-mdpi/ic_launcher.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-mdpi/ic_launcher_round.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-xhdpi/ic_launcher.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-xhdpi/ic_launcher_round.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-xxhdpi/ic_launcher.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-xxhdpi/ic_launcher_round.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-xxxhdpi/ic_launcher.png (100%) rename src/main/resources/{branding => custom-branding}/mipmap-xxxhdpi/ic_launcher_round.png (100%) diff --git a/api/revanced-patches.api b/api/revanced-patches.api index 4832ac31..3c16fdee 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -1128,6 +1128,12 @@ public final class app/revanced/patches/youtube/layout/branding/CustomBrandingPa public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V } +public final class app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch : app/revanced/patcher/patch/ResourcePatch { + public static final field INSTANCE Lapp/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch; + public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V + public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V +} + public final class app/revanced/patches/youtube/layout/branding/header/PremiumHeadingPatch : app/revanced/patcher/patch/ResourcePatch { public static final field INSTANCE Lapp/revanced/patches/youtube/layout/branding/header/PremiumHeadingPatch; public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt index 0730c15e..b5a21432 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt @@ -93,7 +93,7 @@ object CustomBrandingPatch : ResourcePatch() { ) } } - } else resourceGroups.forEach { context.copyResources("branding", it) } + } else resourceGroups.forEach { context.copyResources("custom-branding", it) } } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt new file mode 100644 index 00000000..d1dfe722 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt @@ -0,0 +1,137 @@ +package app.revanced.patches.youtube.layout.branding.header + +import app.revanced.patcher.data.ResourceContext +import app.revanced.patcher.patch.PatchException +import app.revanced.patcher.patch.ResourcePatch +import app.revanced.patcher.patch.annotation.CompatiblePackage +import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption +import app.revanced.util.ResourceGroup +import app.revanced.util.copyResources +import java.io.File + +@Patch( + name = "Change header", + description = "Change the in app header. Defaults to the ReVanced header.", + compatiblePackages = [ + CompatiblePackage("com.google.android.youtube") + ], + use = false +) +@Suppress("unused") +object ChangeHeaderPatch : ResourcePatch() { + private const val HEADER_NAME = "yt_wordmark_header" + private const val PREMIUM_HEADER_NAME = "yt_premium_wordmark_header" + private const val REVANCED_HEADER_NAME = "ReVanced" + private const val REVANCED_BORDERLESS_HEADER_NAME = "ReVanced (borderless logo)" + + private val targetResourceDirectoryNames = arrayOf( + "xxxhdpi", + "xxhdpi", + "xhdpi", + "mdpi", + "hdpi", + ).map { dpi -> + "drawable-$dpi" + } + + private val variants = arrayOf("light", "dark") + + private val header by stringPatchOption( + key = "header", + default = REVANCED_BORDERLESS_HEADER_NAME, + values = mapOf( + "YouTube" to HEADER_NAME, + "YouTube Premium" to PREMIUM_HEADER_NAME, + "ReVanced" to REVANCED_HEADER_NAME, + "ReVanced (borderless logo)" to REVANCED_BORDERLESS_HEADER_NAME, + ), + title = "Header", + description = """ + The header to use in top bar or the path to a custom header. + The path to a folder containing one or more of the following folders matching the DPI of your device: + + ${targetResourceDirectoryNames.joinToString("\n") { "- $it" }} + + These folders must contain the following files: + + ${variants.joinToString("\n") { variant -> "- ${HEADER_NAME}_$variant.png" }} + """.trimIndent(), + required = true, + ) + + override fun execute(context: ResourceContext) { + // The directories to copy the header to. + val targetResourceDirectories = targetResourceDirectoryNames.mapNotNull { + context["res"].resolve(it).takeIf(File::exists) + } + // The files to replace in the target directories. + val targetResourceFiles = targetResourceDirectoryNames.map { directoryName -> + ResourceGroup( + directoryName, + *variants.map { variant -> "${HEADER_NAME}_$variant.png" }.toTypedArray() + ) + } + + /** + * A function that overwrites both header variants from [from] to [to] in the target resource directories. + */ + val overwriteFromTo: (String, String) -> Unit = { from: String, to: String -> + targetResourceDirectories.forEach { directory -> + variants.forEach { variant -> + val fromPath = directory.resolve("${from}_$variant.png") + val toPath = directory.resolve("${to}_$variant.png") + + fromPath.copyTo(toPath, true) + } + } + } + + // Functions to overwrite the header to the different variants. + val toPremium = { overwriteFromTo(PREMIUM_HEADER_NAME, HEADER_NAME) } + val toHeader = { overwriteFromTo(HEADER_NAME, PREMIUM_HEADER_NAME) } + val toReVanced = { + // Copy the ReVanced header to the resource directories. + targetResourceFiles.forEach { context.copyResources("change-header/revanced", it) } + + // Overwrite the premium with the custom header as well. + toHeader() + } + val toReVancedBorderless = { + // Copy the ReVanced borderless header to the resource directories. + targetResourceFiles.forEach { context.copyResources("change-header/revanced-borderless", it) } + + // Overwrite the premium with the custom header as well. + toHeader() + } + val toCustom = { + var copiedReplacementImages = false + // For all the resource groups in the custom header folder, copy them to the resource directories. + File(header!!).listFiles { file -> file.isDirectory }?.forEach { folder -> + val targetDirectory = context["res"].resolve(folder.name) + // Skip if the target directory (DPI) doesn't exist. + if (!targetDirectory.exists()) return@forEach + + folder.listFiles { file -> file.isFile }?.forEach { + val targetResourceFile = targetDirectory.resolve(it.name) + + it.copyTo(targetResourceFile, true) + copiedReplacementImages = true + } + } + + if (!copiedReplacementImages) throw PatchException("Could not find any custom images resources in directory: $header") + + // Overwrite the premium with the custom header as well. + toHeader() + } + + when (header) { + HEADER_NAME -> toHeader + PREMIUM_HEADER_NAME -> toPremium + REVANCED_HEADER_NAME -> toReVanced + REVANCED_BORDERLESS_HEADER_NAME -> toReVancedBorderless + else -> toCustom + }() + } +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/PremiumHeadingPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/PremiumHeadingPatch.kt index a255c868..5b88c8c2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/PremiumHeadingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/PremiumHeadingPatch.kt @@ -1,62 +1,9 @@ package app.revanced.patches.youtube.layout.branding.header import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.booleanPatchOption -import kotlin.io.path.copyTo -@Patch( - name = "Premium heading", - description = "Adds or removes the YouTube Premium logo at the top of feeds.", - compatiblePackages = [ - CompatiblePackage("com.google.android.youtube") - ] -) -@Suppress("unused") +@Deprecated("Use PremiumHeadingPatch instead.") object PremiumHeadingPatch : ResourcePatch() { - private const val DEFAULT_HEADING_RES = "yt_wordmark_header" - private const val PREMIUM_HEADING_RES = "yt_premium_wordmark_header" - - private val usePremiumHeading by booleanPatchOption( - key = "usePremiumHeading", - default = true, - title = "Use premium heading", - description = "Whether to use the YouTube Premium logo.", - required = true, - ) - - override fun execute(context: ResourceContext) { - val resDirectory = context["res"] - - val (original, replacement) = if (usePremiumHeading!!) - PREMIUM_HEADING_RES to DEFAULT_HEADING_RES - else - DEFAULT_HEADING_RES to PREMIUM_HEADING_RES - - val variants = arrayOf("light", "dark") - - arrayOf( - "xxxhdpi", - "xxhdpi", - "xhdpi", - "hdpi", - "mdpi" - ).mapNotNull { dpi -> - resDirectory.resolve("drawable-$dpi").takeIf { it.exists() }?.toPath() - }.also { - if (it.isEmpty()) - throw PatchException("The drawable folder can not be found. Therefore, the patch can not be applied.") - }.forEach { path -> - - variants.forEach { mode -> - val fromPath = path.resolve("${original}_$mode.png") - val toPath = path.resolve("${replacement}_$mode.png") - - fromPath.copyTo(toPath, true) - } - } - } + override fun execute(context: ResourceContext) = ChangeHeaderPatch.execute(context) } diff --git a/src/main/kotlin/app/revanced/util/ResourceUtils.kt b/src/main/kotlin/app/revanced/util/ResourceUtils.kt index d7aef39b..02425150 100644 --- a/src/main/kotlin/app/revanced/util/ResourceUtils.kt +++ b/src/main/kotlin/app/revanced/util/ResourceUtils.kt @@ -5,6 +5,7 @@ import app.revanced.patcher.util.DomFileEditor import app.revanced.patches.shared.settings.preference.impl.StringResource import app.revanced.patches.youtube.misc.settings.SettingsPatch import org.w3c.dom.Node +import java.io.InputStream import java.nio.file.Files import java.nio.file.StandardCopyOption @@ -53,13 +54,18 @@ fun ResourceContext.copyResources(sourceResourceDirectory: String, vararg resour resourceGroup.resources.forEach { resource -> val resourceFile = "${resourceGroup.resourceDirectoryName}/$resource" Files.copy( - classLoader.getResourceAsStream("$sourceResourceDirectory/$resourceFile")!!, + inputStreamFromBundledResource(sourceResourceDirectory, resourceFile)!!, targetResourceDirectory.resolve(resourceFile).toPath(), StandardCopyOption.REPLACE_EXISTING ) } } } +internal fun inputStreamFromBundledResource( + sourceResourceDirectory: String, + resourceFile: String +): InputStream? = classLoader.getResourceAsStream("$sourceResourceDirectory/$resourceFile") + /** * Resource names mapped to their corresponding resource data. * @param resourceDirectoryName The name of the directory of the resource. diff --git a/src/main/resources/change-header/revanced-borderless/drawable-hdpi/yt_wordmark_header_dark.png b/src/main/resources/change-header/revanced-borderless/drawable-hdpi/yt_wordmark_header_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..17e3539031333dbbd760d15f8657580b2c6fa094 GIT binary patch literal 2352 zcmV-03D5S4P)W71w|BZ{dtTjt)o&5p z3C?#t^KUAb4-y|ApTWYv8;h|I%CZNa;&z7PG>FGjo+AAL`mnfHK!w1EMd$)44<1iM zHp&1b(tM~gnidxqcM`L6*xErnQOP?Zq^73EvrxA|McA&iw6r*gTS}?A7!kxkoC*n} zY8YXt4+-K_j4;%J03JhYjBxaXl$C^IBi4m+q`eDqODT0G-1a>NL&D@I=w?BJcpJL^ zq6!4?7$!pZWmF6Ti>*IYIV$BetTDs|w}W8j!xfM)cnZ41s0Hz(5_UoN9>h~|24OW+ zIh$98Bf?JnYAJwOK2jlN)EQ<2Abzxm*>Fe&;0;1bN=gGa3-^&n9#K=LPF3AcZ=p8! ze&VP)oYqv$n>SD0efQn29=gTG#->Ap(1Q?cG1kP>FuM~HKn&uMfEWmDm9Y=H*CBp9 z0bK#=LSUyPDDGDYbdn1ZA4i>v7e$Pamad=+L2Vj|w+Hf^atoKvisoZY~724w!)gYvIm9 zYl!6o=ynBIygx#>5MnqHFJLFkaxn!BA(j@{==caH<9Qr_&WBZK3-O~e&c_CnLbo3u z;Vg(Br{fjmKv#^l7><}AgYyV>Lsx`(SQk};z&ZGGH;a}Zr+)hBC-vcnAF6H*x~lo3 zW&xNtYNqO((NWEuIa7W0)mPy@J#s$?z&z;ILJTpuA3pf21Q$aLBVg7NV#$En@_DSD0wxlnH0amO7h zKR;hJYSc*G*fUGLIqtI~uI_%n%FN7E#l^+ynrp5JWf1;~z#y!LZVAM2CG56i2h4ov z2yxW0jvfy}EVo-fKMCSk3^(mTZEFxh=@(Rn7^cEahpi(+D-^?QAO1us%x-}gYT`%O z9Yjgg4FZeo1Sq#oJMA=;ot>?+va-}!To2rL_EL54_{HkXQ~#r0eDOuKd-ra|egBYN z&TG)1K{ZGqAq+wX_@H|c;)umz=zc>c#F2_`p<53zd>rI2ZY^{hA&wO6fo?V$p$bwl z0cL}O48pr;fCQY6gD~p^arA@P9~gvqw809Py#qlEzJcx#h9Jf`%FKW+7so>!cff2d z8bDA3_eIqp#B#Cfe$fIiz4VgWwQJXr1>e2Xt*T3hYyTdQ#~*)Og}OZ+=A8%$A9)xDinjJX>y6UQ{ z{{FVxZo5qt78a@|O`1f05Zt!_Vps@WF&;yf@GZ_B_Oq1Kl!+4QJsPh~ZwCy@M>9wc~jXf>@Zn4YA>(3VCW|nlopP z`tr*!&5LL?VZsFc{gFR43f@BdFBe}U)UJdWHu>2*&xh_$#6S#*n1WIS>(&5+&;w#a zE_81|P#b11L)>8-q4z!nnJ~K^Vnf$xyI9VF3dNv7gA}PDLx!mFCQRloPRn9*N15k>LDAtzfcWgcnW5NA(oc784V$R{0`lRcpthv z`{QB}bZbx|y$VQaKKP%}@D`u+=p&@QZl06Y$} zvmu76cpt%9Y3%)M)sP3f5}W|Bq#_&sI)J4S83Z5=-yu+?xCmmo0mTT^R-6T~bVgqE zzhYr=E?iZ4VDKhD+)_%NhHOJ`hz+sWg>1)a#6T=#unu;=;#yRN1n?fRE%PCMG{qK} z`LF~Tc-Yv^wGc-~WEO*ngpVO(?TQCP zM>7*<~_s-&ceXeGTXJ%$*QD$;- zaxqvg*T1PizDRm{dL9e^AuPduh+!{2#eED%WmpBt<#PH9bY*d`goMG1#b^twAh=wP z9Fzgbr1_BZG%YPHEg6=RT&{>8Fe4+Q9t-#{NQ7+TnE9}r;&MgwVC)2aS-8g`5q5-Q zcY_t}T<$eOBNprlh(nGuY|UZ0qLRBKpLL^JX zKuryVsuBijih+#WnqZ*P3DJ>xVeGK?VA)00AU1uEK8RF5L6lht)jJU7zlaAJxlM#9 zUq;Ii^netgbDW0Nfn`H@g8+DOJtEOKh;kf75U5z}hA8i&5akZS8b|?~cOE;!F8pdZ z3DKNDF3z_$5KT`6ss%(d0B(h05OQ*IYT8-2Pe1*%Or1JaI#g*Wo4Sngt7YYSGH>2I zdFY{sY&~>KO--!;D-^0`V=-Qc@es`e2v!Wzk%1WaD-Qc1${PsO7>IHb#o@0DQ2{B4 zMYzQv19>Qoa7sW9vJr=HDvNByBiu?Ge{XaR0t@nSNGKOwbdivBXx~9*bR8#K`cKfw zl+L52Ti32a(yw1XySu{eutEqr2u2Cm22tk1Uo9~MCyj+W3r%45Aw=07Wbyt8Q5Hh4 z9A3mOh~^-spcc#;Vw3VQQt$$f7^i`&(F}o#!)4fra}eb)K1Ou}stR7k0f=%2>o5Q@ zAqMAZ?13n!F%RpbY7jUFUtwp_^4G~vKm8;hee{vEuh~xK51s{J-r$+iCa;yuoH<9-TcHDpe{c_^O38`JXw%pNaq`Wo! zGlAUH;W5e2&zCc2&dAL--yF^${N=zPY=9_Bp?3qsumd|G8ZTPGS21Jvcmihk8GnBk zd@X_4uop$mK?uVyh=bl#hz-Y$ouM(#Ks5XDC(c1McSG+&{0K1|#o4GE1QuCYh+UN{ zR~C=QBO^zSlcMK$K(Xix_Q}nPHsXm4UDOA)0ll35zbkqfs>osa&jv zd$;H1mtU6MyLSrjZ*DXCkx zuJeOn-va0@G%of=VWi{ekuAz^n?i$jK9v& zQ=?E8q9pXbhJ@(`=xz4*>1K|;7E$RKotzYao_H(^mxh~^d8?M+CS zK7d8}5Y27ySG#DtSUvy=NAKRfMW}DzzA|FO2odVgp@aF?IeD?X6`yJJg|H77!0b0j zm~MjJqsCpHQYeNK5amVaCF4&BO#83|UYmo^3jW#wa}Y{FG;hFe6Ch#wSi9vbnp@zn zHih!`scGxht+Hy>D%rGYldN31(){xUef#u&n71y?RzQ>kD1*`=Btb79q8W_-5KSlO zJr2>V!zJ4FM-j+*4#IYG5LCw?%3|1UG(^(~r9&vH?S7(p5&pU;+6LjVuop0HxZwuz zb@9a)|I?j|gm^LVv;%qd&bhjE(khmMP z5SAS_2cZlOLzG_;@9$k8!x@}_7^cHtogo1Xhncw(O~9=fYYdSSgAj*x5W^vygJ@2p z4t({87ozdv2*mJ{@m6kG?1pF#Vl%cy)dMx-^r+jvFbK^fJP7_ii7tX(0zQC*unHyN zuS6Vz7|xkPsMgJ=nM(V;<3Ic;S z0hV1<86Hg+_$w8=;ZfEg24+LC9%A?vw;%z*dLJIcd<3crK1_zp#tLIWYy3KEs%kNE)g}*32l%HyOls#Q(YD9F2woHX#&K)Gaz#CN5R75S z!en?M=V7w>Vx7z71V<09e(2X?NEp2Ml!0mm%jGJxJA#RYT^0A^Gwg*JcB_YEck{Hm zBCP+lcgH3G03i?r`>_8)^_ozG2_}Ac*wotuCy!<*Bp0(Ml6pN9f}s!)0tf+w073vE zfDk|kAOsKs2myouLI5Fv5I_hZ1P}rU!6!ficBE@BeS=#J00000NkvXXu0mjfm!T>h literal 0 HcmV?d00001 diff --git a/src/main/resources/change-header/revanced-borderless/drawable-mdpi/yt_wordmark_header_dark.png b/src/main/resources/change-header/revanced-borderless/drawable-mdpi/yt_wordmark_header_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..167d4c9de676b0a29f0ec614c626bb46038de358 GIT binary patch literal 1566 zcmV+(2I2XMP)p;Rg%=00000z_YE6U3-9$n25}!xK1tW9TQ#`9?mE@oi6GAgpJ<;TXU?4IQ9VbF9P@D!4`6T> z>)F@R&3SS_+!$lBV2X>eXo8H8 zNO&7lR62-55=_$lUqGHg-(d>=3yF+KP396%C)xo}oNGM9jWOmGgf-6V!b$`s!F4^h z48$R~?t5qj>{(M940AQsLclXLnRfgphCITD5C>-ndZUHvkDFRw0EvX@dfX(4!zkUi z3gVqF1ckgU=%h)LOs&e*&EEW@%%MX61yJ^zd?qk3&}$GlXCH`zGX$?eEVZ?M5Ah-D z6^y_>1Yicfg{TVFKPfRp#luP6*BF9?sEf5YggqFBoDlU5rl2WG>D&|8h5CpGvAl%g z*oy$n!LJa9VpxJ;Y)5x5m#`vOhC|qZDX|^`7VY0KZVDADWHxQuWU7Bz$t*50^RYg^ zcQr$X3^Coich`BY0wGS}gy2`LhaedQpW_Og;{ggmkO2?0{u@MnY0ZBfg8#v796@Rb zN^0!}+(uo9`Vg1k93iL*QG?(%_97KTwTJtNAI&V*0gy1-gH}&e(Gt;L}H(z{G#QgnpThp>-OEYH7n20opo^Tq&z1XJC zz&QRXUt6`R_*DIfM_T_5f@UrYv|npIAePtgG76&&&coImGf(be&2%lPpXnhw19d-K_QrgXJT!i2lj5mIMe&*P*W9GBZJ~Ld`ANK-3{q$2r zLXay8cL)DOA_yuXyipp0*R0z6j_q$CssQ}qHaa>&@X*m?d}hsk6$Pzr55$XY2y0w| zV61L$g;@OJA_SXY!qTf(FEeP+AXBz%S+ioriU{2yxP92<2thp*Lp`fj0;0-W^&#l# z;uDApu%6LP_3=3*uzG}tT0e}zsE7bBA-D~(yz97><+iq8fq1b+=lG+ill61|sq^+h zEN?xr#?bcu`|q36r%#)`d-s|$Wy)wBG1nL_xBda~A$Z@KTgCCrXot^quBhHRcN5m? z<9|U^7p-kZLI_gedK5#D!@4ZBfT*9a5S@|Mx=lUnXadV>&@)3&&uV)8AgXe#hk%#q zg5fSI=mU(uzrW#<5bj*&^p4~$;?GvSAVe+H+I{>ReQ-i+7m)#?zSH_6Jajo%JFOkV zkN6X-VWJoU!Bp$gF$R6D9>X8;^td}(3q)^BK#10cLXZiUwHA!V8l-D+@@5f1I1}e@ z7Fi)sYpsqvp4HK>hjU!P&k##|oQ1I#F$F~BvO0Ww&gy7{AR{(=dFS&3h$`acmUEFy z6L<^uco6F$&`Uxsm>4n!;zsYqtE9n(fOZ3@TzWChFH>h`P~ztCe%}&St%$YISYFQCLH%MJoF1Gkf)1Jv`^sic+&CeP>n^Nixaqy5WSOF8yb`>S+cwgc{=&T z{0V(uIe+H({t5qYmyQJh00006`CIQDL`Mc80TLhq5+DH*AOR8}0TLj=5$z4}g?M89 QHvj+t07*qoM6N<$f)6y}f&c&j literal 0 HcmV?d00001 diff --git a/src/main/resources/change-header/revanced-borderless/drawable-mdpi/yt_wordmark_header_light.png b/src/main/resources/change-header/revanced-borderless/drawable-mdpi/yt_wordmark_header_light.png new file mode 100644 index 0000000000000000000000000000000000000000..471e0079ce3d381e6d96e058826532225ecaa22f GIT binary patch literal 1538 zcmV+d2L1VoP)p;Rg%=00000z_YE6U3-A7qzmIPK5N^$U3|7}+t%8)ZQHhO+h(=4 z?c)DEO=gnGN$n>0Nq)lA?%9x8xoCX7dYFb%IECH4-cVGI&3ZUNQfJ^%pMng}aAR1%8BMLdbL0S7;`C$FF!2g6CnGj3MZT#zn}0RDOFTlxF@M>q&vvpX!4F$9mmT{Q>~kQz=UF&GEnhgoWDG0c9&G6Z5LIw2R# ze#QzM!6r;g@F8H)MnU2E@y8#vWy=;-dcCZc{ytk!_fI>hfB*jK)TxtsyqiBPQxrq+ zF@#WLf<>?58e|B4fPp60F z7ReB##TW>uU9V(c2s`lxN?;&_v&aC8)5-@TPTf(5dJlWK-h(E z@H;L+I1Z;B5KiJxe2cvhZXgRjg=}q55^v!cgto3tZZL$ocoA=5Ut$cwNhl&UYu41v znKSj;OF!$&4_l~7lO`HBZd`OWh@L1mhWoL@b`CQBQ{IGZ74Wj{eS|=G2NpGixj+XY zbcVY}Py#=pIW9tI4s!@zf>TwR&gGFVaDE#GGSlOO6e*PAm zzK1UaQyXIlf{i`KE0C=eet>KqMAQx_5?5f+cnI6!&L=U3U<(wPu3fvTZ{NQ9=bwMH zYSpS}Jt3HHHo+W%n)nqpA=~e8`VX@8M;DXvO7(-#91S2`KpNK`AsE6@^g|i=MKA<+ z;qGb3_6WX$Y$Xv<+aUO&i^=upj(~6g?w&}>jUj+%pM6$m&z{x({rmOz-+#M)FWxqW zD;vTM>nm;vQ69@N-D3EN_#tHb0Zxk{ zJj5t;$0-Pxkq1uiKnOuF%xkrTa02h+bF778H3US{Ap~O_df*}iU!=m*xCg->-7pEE z5C*`ae7FiB5cSXwHxlKOMGV5ZB=}^}BXGAK!Y-t8?dUf`hHLl`?o#7CWV?$ja4LpN zka5h~I1E8vY=sOL@tpDOe+x1!F*kv@1Gxkx_z>8)gsMI8CQM`moco`OzLM4=gyIc|c-P7S0^u_>GM|PMM zL>&x5cYJ|VF!P`}hM^^%KqZtxf|l0x7IIviDORjlVOUAeE5;`<1bO55R`MNgEw95$ z9=u|8l067(pcp#MAiWAJ`S6PMiD6$}#xOKuVXr|^c!)t^UyuSTdGU(#1w0;4E7zP`f{F*OF#sO o01+SpM1Tko0U|&IhyW3+n0T9QH`>$_M*si-07*qoM6N<$f?AuT)Bpeg literal 0 HcmV?d00001 diff --git a/src/main/resources/change-header/revanced-borderless/drawable-xhdpi/yt_wordmark_header_dark.png b/src/main/resources/change-header/revanced-borderless/drawable-xhdpi/yt_wordmark_header_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..75bec79b4f09e61318fe6cbdb165eea34844f349 GIT binary patch literal 3137 zcmZ{mc{~%2|Ho}+n_*jG?%8}KG;ED%MKgqoTqz}I=!c3(Q_juI^>sv!G)8jE(MLJ@ zm@DL1lpIm!R-%n46hEKu-@o7MkN4yK$Me6}`*_9MSer}0?#VfX z$JyFb**Poo5qpndc@K0SgoJpPymS5VcIlz8ja9U(T}%4kByC~o>d1vtZ=N_R-_w9sGV+ExZxsJ zi|gaW1ouWMG3@cj=On!4r7=TJnbM=&-YgwgnsJk?8hkUbaZtp=Df4B+oz8P?96jjZ zImM@i`ki&SyMnK!iVQahCl}PiMs6@JWzOT!#Ap@qE-k!hMnWGp)9aAiX)>02%vOYa zoV!pYkL;_9&@i7epjXSB)2`DzabF^dprc{|pH@mTAy~kd#aSmXfO8CPRcgcY)mZC0 z7M1g3Cj@_#XyN$AevE}|6B5+#;tY9X92#h|(JU<4dU<18DkBQyJx*zD%@Io%Tk#>< zyIYV8V9{rM6%*Qm2FoCV0>yV9{HEytLN+h_#~+9{q~jZhv#DID1N@1qDsvLZ(m*Q5 zQhZcZ@qH-ZDk=#UyBYYTf-vxmpjYllR5}r&o33VcwBBzN zei<6_x(4Yy%_E7o9qEbTI#|Fp64uK(7m&)I?W+4I(iU!+S|IU9H}J-lSDQz!d3ojZ zX*c&zj{Z-^*4rwbhL54|(~BcENZuW>5?!gQpPC_g(hmC`DXBuUC>UFDCihGn!fa4f zm>~IQP<{)G{%rrpi~TsIg{+ zvPl&-U`dLcb9{kp{1sbeNxK8VZEi`Xh+)fZN-L%Uc5ryC)>DEYhQi^keD!pfZ-svj z8wrYj62AgAg@G9z{-2ukzRkC-5FQv`Z7C>TsWISFN* zqGbHej)`p3x-SsYq&VX`GFpBM<2_;)8<(+1JqXyvv~V#hg=97`)JJ*_J*bpQH@AoShml;w!%pX%^3mUvDT zc$oC}r2W-_q74M%K#6SoPET+kI${lxMGQE^Jo~^5iFivX$?>&^RZQzc20Irk=K;Tk zBaVvB6d1KI@~=(9=b{aIm^*1Ar<}fcz8I2YA~BYZ&@u9l>!s206Sp{@kU?(^e`bHZ zP?2kXD|86=_2;yX^ZOa_`$99Z^al?-Hdj9>Xkf5AXZ_w6TLI$Ek86Oc$t4D+a)~(5 zn+S(!^(zj|@6}~_FJ>bZi^uXY*LRauxC~72(INB<8w^*uev_#lO3_AEn*-wLnFfhG z%R0F>ST|E51T|J1Eyw4uC{(5uRMs|7*y5kUW|-875loz>>INaEeqNw;uyobR!y zUl}Y4|LMH}k+^rLFN4Pu5dz%jF3Y7?Vz#?NtRp~w(|b1ca?p}%yj#B@cGDTQSXi4# zQLC16qtxF60ex~Ql-zk6=hGb;Og=cT?RM7eZ$nd!xK9DSftB6h$EV-P&^R428*6B;H?8hhp62Zqz zGVTn9cDO%slCNODcdYk=v6#S0YuAMUt7-`MkFOFNgr;*L09YI3I>;Cu+&+poLXmfx z#rgMbGV*8yC8}wfMo$%x~%2 zT6XU!x%j=D^H%djuoa7t_b%=)d7&@l(HWp#0`nZyyHAld>v86bgul z8J>66?m8I{Cy8OS?-`d=`>uyZ&Gsc~y>W(eTd#GOU#Ji#7~cC4_xm5Siit~NrOI3D z$x0_w?us?tSw;ce?bn>2tDh#2&;7@b{&{4|h0?qYOhX|g2>(3dUUAyjnze9^;N7B+ zzfq*{u*uJgDR%>8hi(rxB0<|K%Hpi!so(4A+!Lv($>hbUUnP*MaU;epqX0GD=E@^Z ziyqKx^x4(4voY2zlG$#u1prfgKHsP*ynO@;R27-Uz+1>TyY}gk(OUJ~m}5DvY7$Qk zTkumuu6zOx#K35OG+ET{`FWGU4NpbFu&6E6+COM)vd*cx2lYrC^UbrV-OZP=**I&$9go^-HF z;&c*5`n<@GZuRb;s+}hBuH#&aPs+))IBeP?Qro$~ZQuH0G`=^}>UhKRnx`EZtBRUr zMI3{BBUM&C-XSX-^4+8aW%>oqO3$9VEmvy@V6a7ljp$T$Xke`ji4z?&tlKHLW3j+u zT!@Qjj8t98{rhj-b(2-jUc?8rD+`N!)GUHcl$mjp4E~&QyQ}G-K3iQi!3&;yN0apJ z%iht}yIM{1Gi+ULH8ygtTVv_(H7aTvxf?r*mt&Tly+l&h|YO!GbP%kCpej#r4DuT7X1h(xhH55Nw(^IhG zIp~z4f_zG_KD_huFIkxiKp#(^=-oef7gpzYSQU;?s^T|{YT?dvrvARa)Nv1gIVqR`E5n{(^b0N=uohigSha+l(2Wn=FLAW2S3 zynr{^qO58HRBK3%(_x!Bw+A;n>~_0sC{PoWMOidBL(Y&Ki^q=_%D_w}3n#w|KrYf* zfX(x-m>U++me;XDH_fxZnPR)2-)=Yw4&?98_ZBSL?vg6q zO+~h&XnqAj!?W_uQhBGruO38~e3%ft1G_YibZgZ!_-8bWpSZNc0I4#>K=@Fdq#hRi z^_Su+AHkJ5230-DJWaH^(&X|{6wvUJ4|7AE*3QW1bG z2?XWhl{c_}xi;P3BWCV#h*5WqO`g=I2XTRo26+unpb@tB%8wDT=-!!^y@!y9hj`(> z8s(BeDOa9lFcUNgK)5L+&*;M4KdiFb2Lcbx5dq&L(DA)e*J0BQH@vhjNE970#&v zwiP2jO^2F$k%H^%{lp+waD`fAAZ`?k?wtnXl>-*-`$2bZXBRc)T-lD5g~;#^xwNu- zA0D|FbtzNY<(ZLzwsHc&votpLL&e4FfmWTvDxrt0Yq$0`dF1~F_@2G`0}dDdKS^sg VE{z5+Ju~>1wKTIfeMWJk{Vyido+tnS literal 0 HcmV?d00001 diff --git a/src/main/resources/change-header/revanced-borderless/drawable-xhdpi/yt_wordmark_header_light.png b/src/main/resources/change-header/revanced-borderless/drawable-xhdpi/yt_wordmark_header_light.png new file mode 100644 index 0000000000000000000000000000000000000000..7f9f53fb006dbd5beb35ecf1e2880cd9824f80ce GIT binary patch literal 3119 zcmZveYdjN-7soe-Vc6X7Z1mVj3~82PGv&IBa=%PPDhWmDaUa{<}ac4jhI za;I;A5+4EpvK!6>+|kRx#eo*-RC@@ZoBQ6nu!c?+{-?B{dGM0(e#jrk|1CPb?QY{z za`@+0!=f$U?nl8JOJW0g)$TJLs>8#L#qUmiw%k7)8Qzgof*KwkcI!9i4yzO0ru&8? z&AO(h?wYN8k3@tw-0;4Ud^h=__e8{DYV!Eln17uGf284P{hP1889`8rRU(CnZocw; zK?T;j+oYqT3ot3XXL(z%TiyxaC!#BM7F#%{=jFLqWhmb9?Ti)9YV>IoA~&ha3A*@6 zzakapbqg|W8eqs|CmcTjgb%eMa^_zQ7MTX*;;>4J;sG6jbM(UfL#@Z-5#eGijWQE` zG$UUZY}2;e#M{W&0oE{cuMel{I4%pf+!3LbkbUGpiLC02Wodqm;hgbVvlt;Ep;a9Lt(6UP;*7tasM#lr;gSbN6)X(J{0U>H3qaw!dY?5g?Z zj66rxNq0=I5^xkIdZaOHu6yX zSXXCo)}SnTb`8X0;=&Xy&s6L;D(LaW7|9RGPP%&$MV4Y=M%f1Ku_!_bz)S-~qW1Kw zru~j?CqJ0tB)r(g9N=>(y}qt0qfts@Q_Xx=iJF!s3`|MmTgj+mL6@Ry~@Ib;Xr z9KIW64GnEVXjQopqFCnnch^i)ne6)&Oo~f$iz9Tdl`Pj+@H|J&l}OAlOWvA~P5Bx6 z?Ms*$)<0#{%d`EAso$f>67c*RR*vXE$PMFT{ssa{Cm3-GOej$>LuG8t(JJTiRGl&d zCVggy@EQuU*s6+lO`qq|6?$ z8h2sh9wk`!1MG%IT6?7Dhz+29yiXSMDK;TSE1SbG(RT^y5F+TYrWZZY@^*)P)svvY zX~sP7$36!S`H^W%A6aQn22;6Dd0P@a(9fL%n4K;tD3nI?=#@@sOh)es3<&L;laLh% z`UOuucF)`WQPfA{`T6-b4StrLRWI#J{+%%$tquCNn<+7I^7C*B;^f@xN?Z;(43a~Z zB%lNq6pYL&|FBgmQKEO(3rL61hW^G^$4g8Wu6xeGp`fiuYSo~R5)WCpZ{x&muB_i# zoP4^U4Y+)zEk~G@yasf8${$^c`7xE!1@8R*HXxIm)^f*B0p3Kc0zcbHLbBXje(Y7R z2s|>avq(cO<7PGKv9$$xP73uWws4Tvl>^BHY#-S-6@j5z(J2KwGUs;nap26VmuSXN zG@T>Q&N_wuXF4ueu6&yZM)Pu5zEp~n2q6M0j+->G5%>-*XtM2Mm670W+K})w(3KVQ zG~ToNklee6XMH-%HLWAn+2HO)VPFPZ#uqe;XWV%0Cq|mIam-ogr<7=fb40;;eO*=ipBTu>-z1okC#X6`xoX(Ei@Ebd z;k{3ibb9^!4)!*jFYf*FL{eg+^Ooy6f+sC~*Q<_rt-RcHD*5L*QH;3cZxQFLpvN*w z-mU@@Qw2_#&Qx2!K$(MO?oBV1j2nfu^NVSha#W#Vl%b=~G+W)5`Nnn__aDcsHB~Lw zaCHY8`!#J9ygcP(v!<@>PB+s|9#PSm+%@9CHKifjISg0rSGO{hG$cs19Mng+i&@;T z+QHxu3-4XAFzs{@RYF#kUf3A)gsQjiT(ZqsU|erkaC=mcC<-_Gs=S&6qI_zuoJ$Se z`|A+hLNaPIQ0MpFi@F&|cL*hb@ed5;d`4m$lG{^F&1?>_RmIt1geba&_t)%k;bnj$ zpV7XmDXAsNGlH`AmU)8x7DRQchX)O~(e<9n#QC3Qqs8-86jfoS&|6dBcWe&YNTR8 z#A||q3aKP>p{tX!vgL=Z_e!DHU&{CmBW9rXbTaY;(_h&zEXh)}4D z%pl;T=h)#NtQXl+WO=vK4QeA*fgrzVSMd|DjuG`Gd?6#9zmf=Jc(`yp^qr^nmPNU*c6uZMWvC z@jbU3F!77Ui|^XF+rVnFx8T#Oo^UGaBaA^o?HGmhL)iu&L#H@WP?qGy$M%e0>a=UG z{j_L^2r%g&E#O-(>Lz>;1ui`V3=a91FzM%;fZ48| z0wzUeqGt35rC^gSOFfy$T&I!~yauny=DOb|dUg-zw2M6zxicQ1dJKS6+RI4ir7f>w z`>VyTMI*-a2fs(V$bHDqcSK^*PUYp+5{(jf;Ui4nX$CjZE&9#KP%&;Nb&=9<$H;%E}jq3#If69|5#lC(U{i0Zo^bD6`P0n` zdk0Ls!1D@*V4pYZDs~$`^-$-l3cU?E3>SIvMI&|r%Zbu=54?U6oBAEeUvJdzo-r4a zoXC&CisbwJ&$j+z0cZYc3sLRHm!083`N44#gu$0kwIe;I1@^Y3DqMsU z=K-L7-xm&J4^Lrr+Fd|FNuc+=awMl@qa`M!Dgo)LoCIjtzU&@`;$=xcsG8qpNyq73 zrtm$l)}md{Vf!4he^nE6bL@>YykbC#oW!HFfHMi&Y+B5&Ytu#Pmm%+>5jKg zNd&F=!iK%ZLb^HuKE}Zosy@bXw%apLfU?axQZ2G3(fb#Aj$AXB_Q4{-W;S|lEz(lW z8YVGAQ^`kI<3Due%A*#F>!V#y2iBL#v>)wO9_Dy!_eCXU)xDNTexs^zTrPe_|52#? zUsc-MHPX8MK0F#l1Z$60>bK;IBz^02hU! z&^FRx9;E@*UUC6PQg$5dFz^qv5dt<2O}w< z!YqXqZjz6d)=dy`Fy;K}$7~565RIWWtsu618hl%{@kL=0%(@V5rh;QJ`Y7(#-DCIO zp5!w(kNh3&0RjNTa1q@9D$m83-F}=3`@h)!=a?$>()hHd^DH;w&*tn%BsAj5>Hh-_ C9f(!{ literal 0 HcmV?d00001 diff --git a/src/main/resources/change-header/revanced-borderless/drawable-xxhdpi/yt_wordmark_header_dark.png b/src/main/resources/change-header/revanced-borderless/drawable-xxhdpi/yt_wordmark_header_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..76626d93c442960809e69e26b0b67ffa8f6dd097 GIT binary patch literal 4992 zcmcIo={FP()SkhNiNQ?B*oQxe8_hMCc?P>O^QC1aN@Sw>^4 z&DE zzot~SqU~((yI-bssXb4Oa3cD?<6-?{_5S1auX0`2T>ZyW-klT&ekqHqcDYwH!>t?c z1lYtL|Ja?Xnv5~~nI(`&ersv-+pNI8*Uwqg+(tZ+2geej*!5ymd+#X9W*d6grUik+ zN$BMK(T(E@%0A>FDAkp1;?dxwv^Xlw?V(avjlAPTuY%q1F?D4rTtz#4vs2&}pva6& zHj8TC@;|0T>Rw?N$M9~=y!&P*caaT)wFbTZK=rb<(dF(U@MOw=xjdgq$WBGL`z>jl zDhK9KC^A2|oZfh#$>c`X_x-)A2%B8+%lyqM4G7#)@LVi#z|Zq;HYIYl3012Al#rZ# zfyVk)w(R6k_W2@`b&!(p3kD$Yz5NoB1q67TLCwl#4L(jd{F-OPJ%|<=HI+2w&e3V(AjWh6G_kb zSmaO&=vovPWSE6B4i=2SKJ^%VMp@=6Dk<^>-*b0$NyAQX7X+LSYFfm+T{IwTLTAO% zszN%%mYuOLUoS0+O#3%X`s67Fe%TjX`89KOWqmxbxa>oAw!_-)?s#C^*w3}*t$rm^ zJCC6blsoRxLDjh&wn_tmKi`9q$s??oBNrxKKhC0wnlGW@KF z_UjnNu=*C9eL~+gyR5dpvVP1*&*L-S*Mpt$Kxdmm`@5qa8o=bDN?es}4?qMYYO3o+ zTS&M7^SPJ?bU3Y5P~1e_dv#d^{CFm5(|hBlSk$W0`mbJH$y zfV4abk2eOFdV8TBp0%97NokJZIv)*+vJdllF@aGst)9PJBQ!NP+tkB80NCx5lw zS%CVlt+jqT`@9O*3eB~@H{jUivK$lshoQScW&JFxudlzt1x7y@y&13eJf(6&HsCTR+5Dg& zKtu*D-$V88>ArsRKmU%0zb}r9p{TuKLUt z>I^LytSkW>6VIHvaHZpPStsTpE$EMdgAc;X0<7JopP%rp__{cMGWO{!5a$_e!?xE5 zy03N5S#9^pu4rH5lK*hM3uotX{qPI5=xHl^`z)X7)|h-6pi}~V3Wpd%gYd%%2ra}e zj`K?PgDDv6D0f?G;~#$fWZ*{rSZtM8fCDjJ;jXnVywVv~Bq1z}vjVy7+{5Yc9#w@}p{h0d|8ebqlME9=+Yomi?TMNXF7 zZ(ZdzZU__PJNkQcuxn?VcYnXc&5`NDsECo20<`n6=EIsCFwmTozKtprF)>E*-?ar=N|s+*XzXtlU(2PG_3It1S`dL1 zr8UN2>Q{OgM@PFTnHo44T$S498%r+uFW;9yd!Zr>!+r@$?8aG$Pz@Xi?nvUko5tae zOg{h@nmRw-M;JetUjcBJJ86aj6s% z?DE=iI}WC#>3@T_O=3x%X^=e_VGhT0R`Yap1&_o7%(+-su6lM_;F!;{d={_mc+~nb z6o&KBgryy^i(hT8dmbNZT)%x>G^X}b@MzPv+@Yi;YFE}MDJf}S{KlwQ#_V@^DBHTkKi{d!R1?)+Ljm6?tjZX%i_`b7&E_vUeqc5U6IRyT&bOTroXc{mnv6^ zqY>@LX;uo7-W$$T8j{Psz&B|t{li#m7o6MtMrC3J9QFuK-)8A(=cR9pNu|h>L%&_ZZ_~zH_AF)`sznf@LT(L3-Pcv77?)V4C~0Ys#HqM z1}DC+OAp4r1`DoEufhk9ye~rgl_gZjiT*13)G3d3RU3+~*7ZNwLx2ff{Vjpp5tL=M zG*SVVhIy(An z{JQ=;PVF`|diX=P|FiL5jdR={+he|!_Tz?O-%MqO6ZU?nLdA?y9vy5VT9um-BbQ@^ zOSUu`3XCsi23(BPu1b#2#xan6bj5@U5RoUn zZb0Wt4clKYkOA***EAgQBD-3@gE~pRpa#`4OjFGGLr0bH1mCX=CU3mxRCr zjnhlhtJCNu@(M~M&s7GW%M3<1tfkXkCd4HCpaLMu#r;+t?Q8gqTg_g^qe;UMQ`0?{*kZpYK7w-FcPV-8p&2 zt%&nhWOLO$F?`={gz(x$7!Nl!3z4E&%?)oXNj?!Cb~i5;ye?02unhj$`{)OM4ao68 zI)D55hxme_h4ZML=GfQ~8-dx6EFBq5o@o$6BGl4$y=B*BB2Oh?LerzuwW?m`iy8q* zp?biCW3A&0(~m5n&NANp^Oy5iZfBbFO{9od3EcNxz#&%S8d2b;DPl*2VABEyv!Qu< zI9Z{>#*f(e2kd4(dG#q|LQKfH)7sM1G}&jeX?yy9vtvU5IsX z?4H2m&S(9c#plXKVZtDK7_U^9E9tC|QWei{Rk^p)k%+QW8&4V`;ETR{3BBP)&WbZzP)a*sC_qyt?*J0X6AAfiFe;?mKGME$s1NfoBB%*zrkC3VTC=le9K zt!*17Ld@}wE-o)?X5&@*Dz7frB`a64G}Q~cz$V!5UhVo1_?~yxwP|KjA@d+weMawj zJ!skup@5Aka_`dDfr6Vv!0Q;s^%H`)oEmJREb0zav zR^yzrgY#$@FZ0q-R1cv-)P%t1r-@&~3Q0*dfbZ_|ZMgd&I+*|VxKB;~o$VH%ixt!R zx95IvD|=#Hr%kOWTm*Nz0d(WoaZwYwpAiDO{mKoXB&tPDPa) zN1Na=cW6KLA5iDH9Y6`st@?T@{t##_dGS`O(^24H@pU`D>$Qin>d>7|&!zog*ToSS ze97VVUYcdNHPz>=3l*dZaa%e?8nnG`$S8)1GdLBLon-D{>V(1lJP2DvYYkp?Rg1^1 zU5cdtE_LQZ;UbNKm}Xukk-A&sD)h6I9(|1G--i=o6?+#d!ZU4DYDLqurAzZK$nI8H{Pv7=lzRx9S4UQqc#6Hk? z2EMc(m~$NM1o`kFNDN!3{-(X6Vf$8Q{h9$M`Ld8pe8mtd|B8ataYm1*5<_-~*-jXy z7Z~#DL*hKrWcM(KtW}^Ub)hn?G4A;)U!Ey!Y)+E75??5DNNXr4`2Jn(3EP60z=Xg3 z-j}%F+2<|rThxhy4_x_IA26dP$e}@Jh^`_zkyh^vb3w(@?&lS#qm95ocf}m7$pv3; zrPZ-V>;n*QlkQ+m9^M=4Dkv%nQ7|1WE&ej7mH%`RAhW7J$@!>ny^y;Z(tm0-1ACC0 zjCh-DwItioqRCk-$*JhZ{#J;Gl_`(KM9v`LRc{|@l6K;4q!TSJN55&GGY4fiKfDmMIUTK=S)3~NxOWebsy&}xD$&B_(@-}LOd#Cy6 zLFILocmuK%ZDBkqR0JRGY7!z5N;bA1fexA}fm4f!@uP-bTlr5CJuRD<7hYEwrgY7~ zGE*+6Jo-;Up^kQ5p6=u%*X^d0Vw)B>giR?R!cw`76&8H^y)#`oemw}izwh~@Blv0G zidv{@1)-6C`jXJ1p_7SWU~`5qG>u zypMr@GcQ57%2HXE-Ska*eC)+zRgL{kdX$4+ZL2-n9}%B*@j=`aNUt<`g|@Ifxrzoi zV%H|m)$-vG-81czM+Yt<94||xWRLuc228wUW)!$0F&qjlPlDF?r;K<5RA^iJii{lWClto(3NbJWs0&}%;a^P|JVDE8biRW*Ry2B&S=O{I#bAti-*%6j@x2W6Fa zwEFT;#85-(Y2WztWeItdBla$~hCs56`~AN;h)W zrpo!2?>d}Gkb_&^U`2vsO#`syVQDT$a}b@YgqayrPtP4iTeB=t_`$z+nT%VRRy(~p zmqLAf0Q>n{#z;xe46B{*4&wi2AQOtO{f-a&3IRt0*=L^!+xt#F?LX?u`xgB?CBsVn z4LH9tGOFXuMTc4~$@AI-hDC1ie;usDOG?(i;V%Jhu!J0+JTGGZ;G`61#E006*mX@R`} z0B{fweJT&=@La)x(*Xb>v?bQWK7wP7F3SNx!?`e=?gs?rWf{bIasc09*8j<3XM5Ka zO4g&-CKP{*m>@eh6Py1v!@^7Cxf>dJQ?$ja_NavLb&l|ovj|qsLHpj;`&Cx(`=zM< z&kf$;*Fm((ZoQD@0Tb5D)3v*bau>Q2J=Wzs^a8jDIeCLR=jz##g0Sg5-B^BS<+OX0 zWluYFC2))c=pVd(u8%1t75eAYBN+6n*7J-DEJKXkHfMxY8F$MAN*@p`ux73#cR`6H z^)7fD<}S1M{PX?RvmG;9o{ZnJLV~KqHvZm8pp%uGYCS6a0MK8!Q0!={`g|%H(ZWd$ zUaV?{DGLb>atHGzQAPm!cHM>5bx*9Z&nUr0=vBBN81U>#MerXNFFCnMG40~AizQ(o z0_j5BlVh(ReEytq;arM@PL&mQ3P6P{zsjyJQF@kfq5O30jSR>dPd0_Zf{JgzpCiUi zl;nz1P1;|U*drWRt!b5cSZqif)SYwhg}q$9Jg1iiNu!{WH*?rP{H&D9M%*j$BQL)B z33#8#GUm4|o68ts%G?R(ko@pS!`&$@yX{`~V*O}uZ*MY3_WG3`d=1hz&qa#_#oPAc zN$UmKhvu!W<=g-7hFbB^aPFPvJKy@fo~^%Mx$2{}6?6;OxaVT)_+%A5!LPm+DJu=S zfhIe*X<8W5d89$o6q!pwLh%})4`_%DQ$eReUl#Iu?hLL{TPEJia}SQNq4LyWiaTcZW$8h}u83~5 ze(DT1!xAqBqG7P-26cIGKKG0(0Jz3vQ_Pe9s_H*{Fji^sx;XLGVkQTH^RJ+4ivTWy zJ1&z8#}){b{U`-uiD5s;Dut|kwnPXCJ$Gpin>lc6!di-5t|uDUw^RhQSG*Cj<=SeE zZU~%yw^1FsI;xaNAH~3k(xm}~vSbfK19(atB}2~`xs4vkG)3+Mb#%f-MQ7BO{rnY^ ziqEFrA9yH#Hi0-abh0W>^8041XQ+p|m9z5`=SG4_!pVS1uRzfPudcLExHn}4qXJW& zPFcOY`1mC3s4-HF?i-HgpHBoUGQWKj0JfK;_mi@Yc`~4zkEm3p%eL>AgNITrhPCTY zg^OEm{^>pbiBjE_uACclZW4(V^9U1#xA5R}Nus(M%9HMrtskze(FH0yju^!2>VCgS zXq-#jIA zXFf?Y!JC27 zxKgKGWQ{R|QUpwp<#gNiAW=jCj4IL;NI%hcuD^@fo%$K@o+al5;cY`8`GQ5KVyn>{ z<08xrEAC1%mk(H+W@%1^@(vueH$&Ic@Dwo?#sboL?xdliYgF{!*4T_Us>hM~X{Yz$ z2FuzpXK>Z?o(5_)dQZ_RlTzLPRG+WM6i?^~6oc<^;Cz4;(s5wKGjA1S$C4g0Y?T`~ z4s%efmGPiCP9c~WixU`X*n+_LOVm-*_}|J+?Y57Cco5I*>*CW{^iT@^_4EQaSvqfhrso|_%1i~1Y<%Z#=gM6}~4I>1TaPJ-e@ ze;*I#VsEy_PaBd|tOwVQyYgxIy!eH8|Li_P$6k+0<|;=9WT4(1B%m! zj+&Xy-BZqkyH&s6ZwkNMg?R2|`sw^)%bl40yLlTsjyvC<-CF8LxyheN=J|?YtF|T5 zFH=nUOZ_B@jIsuW)p>9h<}pr>+C3D9#rJOuAUH$!>3F6Ia9J(c6W+dE9D7Y?Mwo(^ zph`5IV?sNmK;QDcG9kR&(%GulKjop)el2~n`up>1OHZ!j>XB*z_QFAgH*MoWv&Zp` zo{CG=M;~jt38$GQ3Phei?;TmXmc*RKZXIz%>iF(E{V~<I4=M+H@}a3d;0UGomb}Q z*6|A#ZiYoYtH;6y5P;2f#`E`UUmv>(yLmE_1v5!Qp=N(}v`#~dv|vRwrwi1><2DFM zfkZ)lG-RRB&j358;j{(8;)QonH)}n_Q*-C4e~yE2<3fv=#s^EN2HBhLo<1c$tPOj9 zX$nK4(R}mmMy!vdd2;@2iaMM$?8E7xl~sB5;f*%}<>TzzZf4Sbj-5*3qU?!hmZUfe(ekHigOi(VP8E?M}(UqS@GqN z2u}6m(KGi-i4;F8uACYVec7-eD493Er}o zURY<#Q6Om}m108_4^_kvMLCy@KdYuo=EO01-K3Ba^WJtVG_$f_Bx!PeeEB? z`YB{IFkDnSHsQ*L2U4A5@!Whvj}KYtx}qcAm3{X4@Z*4qSLPq@DB)gT>uWm(9lxR~ zvhxKex^>*%CQikloSqk}VgPm6FhMemM}{Y>C!D!)Frt<~{#D6RO%xN;2oCE`eUFA{ zqHk%)ibvxcWC%Pma? z*!QvOe0Gk`&Agf;`T=5D!D1-jySHCJ)&yoQ0OlV?RH@|qp*;zPTl^gqT=>Di-3AOQ z@Q7_M5MA5m!_L`wv2c{O6Ug{!2+g(~4Ux9)-~w0qz2W?Y_B4|fuO$rKrpU0gh;|Yu z{4&@%CvIfUj%6F&ZDo64*qPTKdxDgn70QG>O^SV)9%VsN$-u4kY#AfF_1>A&+u5kc zvL@w{G>k6r-}i>)7xK3@Op&8#WDArxeMsPegCu#_FrGb^XM^;6BE8a*R5tKP{nE2D zDdKIxfJ0f9Sy!hmIN2KA{HN$dCUAo3F9$rzJi6S?$D8gj@aS-juxzV=n}g$OI*fTv ztmb07djs7i_!jl8rYvMu4%ru*V0pr8Er8N?9}Pa#87f!qK8?G)z(^5tOINZv=O(a0 z_i#%!+$r6UHs22gy@)2is#!T{k>wAauPXjUeVdPlc;X!d*8^YtfDyL{LqLHTN|0yzqTi~XRxPgq>2dQBzK2E z3PbK)z{lbmzwEx(E<51JfVPY9Tw5kM+2s5#pO(`;3`U$goWq*Zw!vdQEDKTId}9)h z_N?~1skZ#CVH!_Wb@aG5=lu8N%^8C|P)M%M&Fw%9NrMQxgeun-wG%f+p{p2L0nb~h zPB?|(Gya_mJExfNTG^k~orUUf=s6VxDhd)kU#Mpv(B;wYUfD@s^~nm9#LgWl5-gY2 z4%~5aP(KV8a5<4P8vbnl&Qy|9>CTLYdW~vjcN_|S zFohrBM%W%o)y!mmiIZ#j7}xmyQl2PuOiU7y20kRW-+~@?0b$6n3o&(5 zn2aK`To>b?1~aug3bm1B!@X`_iNK+${BNf%grz}mYlVvD=;s?nTn2cHF)|)=4xNxt z#f~;Pg(9$?r^1VcV;!b<`Zk7?C=7Fhq`UIsS}JjYPJp1qICCg*GY573O*^U|CfBV% zY^aIhEYkYCANiRPIneo0_1^6y_mZ|o2u?Rad5||iFts5Fl=eK41E(B;CcDrAa+-Tw z$qBT_10$pKv0Sn`96W`mwS=+;oKv1mKWW|D{=z5MjZSZ8f}W66*3Q^2catLF?Mm&w z(KZII7l)VNORwk{^le^`arE+i7#%*DdKEviIAF9rG_9Al<8}<1XPn_n&JWo(z{<~j zv-`{K@$oDrZWuCutRwDjd*BEGg-G}mq?RN=l*|&)TI3%0MOK+Xbtz8csv>FAcz9dm zX{?~5-;(Uac%hv?iuN1R$gL`T$%R2Hcg{-IKBVVdPzQP-CVsq*&sGA_F{aD+Hb`zL zG46$EGT+aoC@C1-Qi|VzdZ2?Or3Wt*qwkhX;|r3aXJKBy@B?6+;CpXlZ8{TZExrJw zm>Cs;;@4d%HtBGS=^%v1MF`7WTV)jrwCStioF6c?KZ~A@SG6GN5_sgPz&PR5c6e@; z2gH?-7}t_CFlzcr45;&bxR`Enp;64XS;|tpWv*^Ai?Vf}cw?-VSF>2p+CkLvWT)&v zAVbIroH}1O-Wk#RY5)7bhZ))5jQuPXRH5Yba#_nl{U^v2;RrtchcDQtZqn>OlkWwZ zamEZu78sE=2P7ihi*`lh-3Yi^R1JqGJW0imqF~e{YsMNiiFC|UrTQ;&mAn=<%it?; zRv}&~CF<^K-U;W`a6poRcA2dHnT-^YDTH82nuUdDi2%fY!tw_F0k+Ty z!OQ8*8;|X<0J}Qwz^sYmfAi$Sr=}GE03Bk6N_ualYX0IK^31u{^#*A;9@zwjuhsNk z2uLH-=*En)h^DK7n<*4f@I#%+N(v1!^uDI~^-g@=4a2jyPp2}t03Megx|-EL4Zg*h zI25HSqTRBN@ZbgvR*kdS>?`3$N5=Zr9!6zuy#L|K>hcaZQV8V*7;^+iU3=;LHh6-~ zju`1ZSs!!N8}>Cg@r?%J`@iof(BG@)@c=0;E;JC}1&D z0MLVI{T?tQt&RE_B@6)Yx0<31Y$E73@yc{GV=v+a*VM1zO6&fw9O%yrI*F#?3~oX- z5h7jj#IhRO{o5^b zqtD{fk55jd6Q&s0*(bUmKc9=fXR9M1qW-Z6kybBCrbCK%OVhnIL!nSdg7o1Z{yZq@YRQ+eba!Pe^H;%|P!;uaPbxNY}UE}t+M_QzmYUHRcOd%Z;a;2-I;){}HE zb#RH7W>8ss4a5+IvT5Kt+;g_oX;nzjCm@{PRQ@r*VzE!NMn$fAj0SlB1sV1|UfF72 zJ)ukH^hi@4_`MGp-J}Dvg)?o-^D&BxQ*=OHP3#@863GP`N*!7#@vcoJ`t;yK5Akts zpUS&7`-uNBE*R~I5|JHxgQJG|ttYU z&7n7yKc*nwqHMPvgZsIqF%Twpb}Rn_uz z_#27fHTQ76mwkY^N)a#(TlUm@$Y_8ERlk^Y+8f4##b)(}fq4|1TTE>A$nYK5_LSSz zK6r0L?yb08#FJdQP;sv~t^k?QC%J5f*;wVk_71puI4e+A@ir_ucTr^W=C4mWJn4IY3 zb|>@Yj6j<&TP9{Sxd`!f5rKL_*0*HxQitg#>7Q>HeHd2~d`q7M13kZ=40*fwt|uJ6 z0m{T|0_Gc3z*eu2@E}ABn7+SaeHg)A9*Gz_;rj~kZOIq=DvMxfWpwXkHq3@YLAIfX z(_@?V;Hm#UQ~Fcw0hewIGh#X(xCLf1&T_Z;0z9*CU}_LwO%W*OMSV-P%kBL1Y{O*; z$@e4rnTPCqs{b(FaQ9y@l}}BH_kZvuUKA4oS7wvG2!CBkt617HZ$33mdcFnlt(8W6 z?L?GrUdQfBUI&PoftfHettZ@l?S>MzI?_q2aMTa_w-IP_t#fn2+}1>utRwldcgB(}RNf&edek^UK}O@9+2?w0eh+A84r3k3467 zv7&Eb*;sr_5PP#)hGKqD;9@+j`}D8_!$st`F-Rgian#k;b}qJ>6b(wd#=yu7uinPFLD~REEnb zI0EV71cTw4I7q1ULnT~%SC|{*`x664s`@jFn)~707oRW&V zDqsBwIfuP&=%#$$EZX?$^uV^n(qy?IV%I(Yki#Zn#x)QD5Q(?w6Vt84r0j}Fxr)4` z*pCt{_j(GEoD{q;u|k1R`iZ#4fMqQU5`K-MAMj9kDe{r;#V&*9l6nFClMO=p-mN{TesTnv+ z8kiB8QeoWz2|0qb9G**ptZc)|h?%K@cF^7H3mwb&jc}>P(pGt7rt)NW9<&Wzw!|zLrC(%nh=2uyZ3;wBQ&( zu^PPiE83D()SdUb`5;Q08qEEc;U$mjMTuTt>a#$lHN-;dZ!L9&YkHf>rkDPTeUg4J zxT^#0c}tpLU6zN)++32*-McK(mqbf-e!MGtHrrfBdD8<@b%f{WS`;ECkM zqjKimVcT4mnzG{X?1h!@^t0r$8+d)!??AZ`F0}x4mzz zGUk7D`b?o!uj^)!u1vj%PUK9?4@9e7mE%3c1W!UdIfjZBArQG8nDs__{gch#%9q@d z$C`Uz;I!zxzjNsThAOSG)MNn~_)7HD^io-N4YY(XMfZx^2bYhnsmbWS-@Tkymf8(; zlgBXeJ%gQ0c@EmQHDjK3YoDp8RWF0p%Jz}+9*z+EMww}}b98NoG+zEHI*HtNQ9iWU zQ1i_+BEdFwGLsQ^#ui)wM7Qx!$aX>~Rl!6KT_|WnnPq~?j5QDDvG5|bb_j*CyhAt& z8|z@1yealbUI++(3IqsM|IrJcyzGabHFf+!`kT9S%G{*v8J2)@f-qv<7vIuGO?rUE ze(WdsN^Xt;+ig4EG3Ub*IH@7fbnBrET@;1cGv<`=Yq<}s&d8+T50~YTNHn< z*cE|%&V*sN{V(l&)55%OW!?1lCrib1&BlIAB2;F{dR}J){Io zx|u!bm*xXwPMKJGR!}na?{4I;i1<6UCmsJTdBso}yR6fCHaaX4KW5PWOlz<2OdFH$G%Gj^ja;b zPYJM;34W2a3u6W1bwBh=31RXX`8r}EQ%5)>#qHdf=2SVXAv%5Q`x9|qo&*Co|ji;fnAMDVU(PmT*tSb1O1>?2RgX^BT7du?gKGhr@)~pKcLG`DDHxoov1D={enZ0m_fP&@P+zkaA2A0c?U3B1bjwdaA_hQ)Mgk(QMruG`?R(+^l{Uf+7LAd zez?)SOlsfGH}*EQ6uyh;cN5}!-h?cFQhRpvgtI8-xZ>%DTR4kB;hLz8k@cfNJJ0rC z?{FDfUpu41xxcq>cL|=j^?Y^#NdXPajWU)36jNEhVJxg3&_voz7mBX3-}axT;x zs~9_{1ExI&wpYq@IO)Dt+XQ@(1AZ&a4ok*S>)s8Z4h$5IwRw@3oO`DSTig+ z!iL42e0?r%oIC{)Wx}9x5=QP2eXIJ&xhy!ta!9ZnNPPC0C=tqQ@H|H{)0V#MFn5=KO5$+xwrmNruGzc07e2;>o)I(RU4~l;DnGol`-IvUE;Tcm7 zMDFFYAC4MHYx`PWk+o2ZU&Qn5)fuy*m#yE79)~Dw^|j|F-PtMSrqRE=n8J;OTP5_# zQ#mD*g7A?QLmWfy8lD|FJ?(pwBjwmo+lLbZy1M($kgfad`2D9#LeTfK54v?oHC6UC zE(hO!Hn`$3LreG@Ne3)TV%X%^(ps*s&W^D&DTf*bDVa$RUh|g7#u)NV_>^S;4I0a1 zLf+Dgu>OJ-t{chCvbDdep*#i_3K(g(G+cy&@E$1wuVapVxxa^#qI0&tK?T*XU;Ww@ zeL@T1k@ApbksJFi=Hm6jvZJAUQU#H8Ss8;RlVfmRKZ?`azNiC6%pWm@utW=Qqu)v* zns-?0sGeN!x>A0+iK8o_yJS(kzU7p<)EB)cUfoAZxa@4Me*c(^b4_R37mbX({Eg*? zz*+VF<&2>kW_78jF|lne$ydNh6%nF2LEie>kN?d5qA<22I}#xg<7fJoJd`glh-*S7 zA}hJDbh`r9lUJni%i~M>@7{yzG4aJ0@89`QLd%d$ee*)3ECso9cC!6`C}K}(yGU`S z4e7W~cm+3Fx=D;LzEJR~M-QPODt0o^FFpLKw(u^{K#GvSqzwh>8Q`+usT8YR0oZWg zII)6@P-;X2!FBik+Y;k+fpzLcsSHk7>tQ(yx6Drw?@6&n?{Sg;CQFP`Y-q~%&)E?s zNAT)<^-OUkc)|9c3yxI??9?3E+?7pIi38mW1@XgSd5?s^D+ahp1dpw;n;%#L_NQd> z6&yyvaAV&5JN95B#h!OQO^ad;$>{w3NmfRsN&ey4m4t7i%~PrZnpFlu1fo9IJBt(_ z$JG$tZc(xgi$#)8B-CYu;0GD#4pxjT)Cc0DMVK&8h-(!0m|?QNiHMX_8`Dx6S%kh_ zgQv@7#-hA=E+myD$xsGYW}dSm;?(}I>eD4zS@Y?NTR0*cXfA((nBf7i0w>!I&9nBvr!DocQc@BEMez`hPO;11EX@9t0fqQNJ{KjkT+vlqdTJX8Y z7$`{UytGE&IeQ`hjPY$|1+Z`{sBV9q)A-xxee(hDmfL?EBevaD;pilbLc~kSyz}oL zPGIO`7$ISWCKuVIU*1AKDKp}h3Y=}SwNUf_`auZ_y7oxr4MgJ88#TC%0S~%O)-3A9 zIk;{-$DX$vc4Y;KPe{npv8w`O$d{yX1LS zL~X1n-mtva>-2bErkkcT%g#f;t1-|Q)IQJ>Vl0fo@F9hLd0yYG7AececO~C)5*rM7 z)=OG6MygHr&(8<{?WB2ci`q@GWT*5t4-sS@r%MMn4s_qJr>ZhgtbLuIAYq4^iDVmr z&q*x}sx;kn01!(Z0ivUYMGWI?t!|8mp2795S- zZ)ixk4{LGwDw@=BEPNWIXt7_L>a0?*p1eg|Q^CHo25&t0_P&aXhqo`D%uVGQ&{-%d zSB~u8VM!2;eU}=4ZlZhh^{A1C^Wsu8s6rw6H%G1@1XR}^P|HzSdqgeGm^!a{K%$?S!eW;E z_38KTl|2SLyF0*s1T6c3hWM95o9F!CIA5Z#6rm?o$yY$2__}Tm__e+`dgS*`-r^wH z#w0ZN80_wovt?>*#Q&ICCK*V#a|zA54C^7z2Sy%A3qlE60<{$-!6gSWf=u+OAdHRgMF z`m8_q8N&>4(lD<^wIRXk~Rj3MAo&x1YB~L1xamt6@iq4 z)KpyCyQ3o(KXF9-0+<;=Iz1zPZ>0|sq4PToXN*=#@HkSnUShxdv)du+~ut z?hv$?#QT+u;>4(M3{gzeW#IX8Y#_Gc*+w|<7khG5JrO{e=w56z5V5;xO}5AD10Zo@ zA{s5v!t%dTz~$A@Iva4l^_!raS+&JvSodT&JruT~JyYe^^n%Gs|1S~o_~57I!h zEV1NhtlvX8mX+!duH}~$ExgYPE5z*Yv_Eh8NYnp46}jm?2c0A4SH0bzB~2HxA{1=# zq*_ZFS2;`m)kIGCp8%{q?ZKlOV*HH3i#!3zq`>}0cu_Q3!f3zZM}l7A!)@s`tTc@x_;!5OgmlJe_(Bz6B1}!{VEgaWa7PcH@{m1~sWfN}$0NI{aYl{g9 zS=se`OZTCiaN6`L@67fGvJ;D0vBQkC=t0(QS_Hlv>Y42mHDN~tZ8P8)j@GYp_z-%i zl?4gPDYK>r05-*_iFd%{cI=(v*ckaw{G3&4a;zq{-m-ByaU0cRUL~o|N68^j#;vu=m0|0zs!YbPh z$%My#VLAo54CVd!@k4;QlQzT41*Kb5ly{)iqDYch^SZm-6p+Qt0RT`3?fDVHqHe7L zY9C+xo}1S*`(m-Z{7NWiOnIRHd{)++sz|%&C$H5-uJy41>*(lH=lPn<|0=lG{5k#o z{QM;M!T|s!&a+0RK^iguAmLxtYHj<46aYXB07wJ?;Pe1}@c-2T1_%Iatuj^JG8{7a PpT(PAwLn!Hx?=txmyX6r literal 0 HcmV?d00001 diff --git a/src/main/resources/change-header/revanced-borderless/drawable-xxxhdpi/yt_wordmark_header_light.png b/src/main/resources/change-header/revanced-borderless/drawable-xxxhdpi/yt_wordmark_header_light.png new file mode 100644 index 0000000000000000000000000000000000000000..6c21e375a22bc60dc5c6912ad1dd38cb2eeb2bde GIT binary patch literal 6602 zcmd6L`8$+v^#8+5V=TjD-_3~ZOG#uMV{D0#WQ##$Z^%}*#u$d|ODc&byRu|A2s09u zWQi=_0E9BlFb1{}O!V$EOpMDO#6ek8uQHag{a;xjgI{&y`-6>x1Z({A z{}reuwq1Mfyvp3R}D1KYmo0e*OsnZ~rhC=bRqkzA*58wR&-{f_8&JOKd5n+7chlX4}`m)+D3%-kRTLvX!4*{H;trOpEYjRNrS zLODwQ7Z2{#rC&Agy0^Z4$X9T9&IDNfRV$)UB0uB|dwT8O$7KJL5_l`0rOwE9iSB%( z*zxo~W3|;h?=x3hhiAqgZ~*tnxf_^|m*fhj4-JZx{{@>}^l7>Q0K6sVWNcGa>kF27 zlFn~EqWpHzhMj##B9Y3Q#P2=QMSS}93+va70DuWJ){A{9I*D^5u*BxerB|W=u-;&( z-ZPW#^R|;YbBcuKTq!1%M=eCKNbWcIJnVgvHf9Jao@Q;*oDrvvh*;jc1;9?_Z_jK#+m69Ai zEOb9H+|kX*P~Fjs7u%3iB6s#wAFo_n65|yjXO215^4hn+`0*D4_c2>@b5|V~zbWt1 z%{wOIxmP?{9?2DazQcV%FDKLH#-7A zOd3ydd00j{b@Kn4DrccObB6o>#|$I!4l?{}Mlo}dPp;BWD!5$^lX@S2Z#p_!?cgeN zXvJWmek`nC*g`48`_(N^51*B=+;YQ0j_}1Lg(OiKR_jG~1VWACfVO&VF70=&5k)=` zC3Stc`a^C^lIX!ZT(dKolbu+8<_z3wO@GEfY*6rOxNGZ3xcvK|#D?3KO_y4(B~a9) zgQMg;;{UVCptyDu4(5t;2IZ)F;0q7TC}HK8v_j7|j%%lu#F9kw*sVR>5k*g*J{`!g zlcJ^n(%aJ5{l%2Kr=V@e{RzxsB)H z#F+KUkus~i2?KC_+Cf2MwGl@z`Y)ac1Q{b4S?c-T)aCtJT8D zI39UFE)l)L*ARC%y%auPUJh{gCw%rLF~{Sj?8{O%K0Xyo-@ZNQ_}9i0`8HgjgFeu; zNXd(SQU6iT3H>YsuFo*!^R;m!(Qtyb7?oq8OV_9y~a zdCq?+H?1D0_Ow^@Me<*VL0XkyTvI~q1BZPU$fD7EYNTuz+j|b> zT@g@qM&wQlw^AG)ab&{sE8!t-F;(MY2#<`VVq_%2BQ4YH`kQwG$59_L50yQZA3jf) zJFu^5-%Q4Y_wrqPC<;xG`GLwvmO$`#5~eu2p;3@JH;L1WI+}7~`AB~8gek~D!>)md zPTUSWKUo!&hv2bXCC0I}Cw=$zkcx?)sD*Knl@EVvUh0C7V3F&uK5AE~t#db_{r81D zhK9O|g2lcjPOLLk(=s=NpmBJtG!3lmlB0jLZz#Do-Fn5b$={*rrN_Ib&6paEWrEAC zFFgmQ6n;+=;o{KM&#xl)0+Y7isk}C&CcrE>!MC%55eVTbos|MknX7%?{=}9B?y~N{ z8noge(5ytT-{+Y8IcJuG)>%LGx5sSUP=5V_KhIfj#}s*p1!}M9?gVT4lKFcGS5H#QYlSO&^5a#AWIynIaWrUj2^HzNWCxkUECG1 zC@?D|ZtgFW(z~t0YlU|@F8$QM;yEXD&C#V0D{S}~`ajVn!HNFf6mBHx<7w2CGl@8c zo8%=C^)o74=7QB|_f8J7FhAdY)=G7oyF+5Sb&7A&*MpCCQya(jBt%s&!S)v(Aqd?> z8uzyFV0V6wEl&w+cq?Asjk@kai3lW$|Nc{XZlRGsT$M&;Hw&9`D^`XR+lEG2rQwEw z@ueb2ezYcYSQY-dIEU(^eQx)+;^!>(@xVh)N@~1di1xV>H#STrdDTCQEXwp;~Gf${(ZPId9TD zHKfFqTbH<#l=byrM~O7U2Wq#rmg?R;pq<-qFWWt^SMz$G@%`>DUFahoYo5gkR?v+K zJmw|A3Oz*s7KsgZ-4RTdhL=#UGI zt~ch*W)sg*cs_EeVZ<^!D~mg6yH~&!)6|=qv?44h4jsHF+x|Rusb)aqJEUrIF?{*s zqNaUl*{1&7kHT5TJVwg{ffNUT}d7n1s73*{wOO ze^zR0tqWk>B$N}b!ZuhjJ{<0$Y#3z96t*k~PR!;F=c6ac($P0X2wU~tDC`lm+kt`Z ze88kF8#}x7Fhd4PYim=YBJ1hrgQq;--I!RG$ZgFXIq}89(d^Hz*M}RcpI>tOjFego z7n||8IkgvLNR@E}ZzwTbynaTuOqBKS%dDM(FZT_`UDdA|tXid9ZVf|6i-3k+uQT;z z$P(PjIF|PgD*Hg)HJUw%(hcgXnjG&N` z3aU2n<5TfP%@)_@^;nuuDkWY`H{gX(&D87qc3ji{QlG_2@;&aftM*+f_Q3J*FE|xb z0~e9}rz3UX+le!FhP+-yz`=j~{fQTII!Gmph+6A#sx-BqEDW`-jbQ_G8>+Ro=jN_X>W_h3K%>sm@aI zb1aF3cdc-uIzQpLSD6U)q%TH!f4;aKXuEkbY`P})mcFF_X@|5gFh4745Nq^c1dD=X}=+{mJ`<|H)a^D(HoQ`#qTXn~FHM zmz!3vOQT4{k2+fKJ2+iJWtC|ld(sY^E9&PwYDmN~pS=!Vi8bwDh#rkg&0un^D7*6n zBNx*fkEOaIS}I&s;ZkEp#JdvF+nE@)L~8Khg%#2D#~fdm=v9MS3gM}Vk(^i&I}w` zKUqPtU7ss`&0rpznXvNknb2{w5S7mT1t!;n&rY|@LO?8>DPP5>!@P~5&4yE8Q|5}Q z_T^V#_jxbT@+t(|&2F=o8_dZF-wg>UXW|INkoPCjZUn&=OX&ASalbVujd76B<}E)m zun5y8V$!zur&lr(#*_6o)7Kx){&P)SOxJhWU7M20j5*vencp_q_KPDX9quVic3ajM zaGN$ICgN5IqQ@((Oh0O`$Ojso0hil?4AeE(gh}XVnr~f<_qoYu@GXDWkM*O=s8S_Z zNjECP)?8pURY=X4OxgPy`Me3lrMsPh>3f-2r)O6iQWtCdoRfb3C4=e-x#nNQnS(>v zziicBfhpbtasv^v_YtzL3S4h?y!tOgv7$higN}L01wu3v>VfWIpzxp~w zYPc}=NG?@aU4C|uZ1^f@(Kx9g`XJ2bYx|uS>3llVZ}tD7a$^vh(~C|Gf9HDX*Vs0*QFYXFg9;n-fgbsN4LQV?bj<;7L$d2OkZL&9^2J8DC9eFNy&B%+Bahn0n zvoRD*->crw5^52LLAOfG7~GM`M(JQPL$DZ3IVM)^cf5#dz$tlCPA=H6c6P1qYbbX; zym$`o{5=@)kjYxJExGV)1ZUl2&+o!1gbxh0?ra}%jl5I z*kDQ)QN`YKj$CWxo_XO=zb!FBN8#+G#h~;&Az9&{h=d9@#-cq0m`?m|HLFWNBQS3C-FQdvj;4(?yoy}NBn z!(#=)jc*`(Z^ppDAFSA{HOI>u`)3WwCD9=phNSJ<&Ar>_8aklX4_D`KdsA1v5tH@g06-;4mKZ67}sS;JYC7?RqDrezvX(m8n(>#(3uEfUUNJ|o=eDfL9y!f-EM)% z$i-+-k!W_qUUBfbcR zh7;3jM;Nt{f*VFokR%mpRt*UP*8ywq)I|i_F|nX&GIk=XvMEDe4Gw=9C)*C8h~Z~4 z1b4A~;=R&uYdf?g;BUU*hArTS_?7j`q8!?M`%!G`H%u8J#+G*1CAHj6?d(-;+gTkq zUwo6w6O2G@(e%+pzVaA1KKeO;9CC)9lMs$PbC|-~0yNGQ3s1o6RGCj9+4|54u`qH0+VoswkJ8*<%xF_TB z2!RDE;m%n`hf*rG&#_etxIUx(137J1JasM~|5}E82_|GD+m}3J|7=jXkFt^=!t;-M zA|EF5aTZ$bE6P{0_rUXG-pIeF2K&cP@S@Ya#_=6+kxp8KbMn?F7OJYy0V3%P9NdiP z6sJ#!y)(R+C5Eis^51<_J7OlAAh@gjv)iHysT^Q*njTj5pu@ za;>qB%xNa-aU~JzhQc&xKsLx=DAPpzOR|^+l)JVhM_c_dvKMg$WMD!Xma82>#Um4P z$fu@vZ;{Mvy3G>ZxM&?%#E|&k-R`SHwxB8`B-;D7{fDjrMsXN)f|r4{Bc@!?7lXx- zh=2OK{cpmn?;<(w2{htcMg=S>TnpKaS3?lxse1^>Qn%$!9lv{*uqcG0-c`fk{3sJv zORt+e3FY96nq$M+YSb~7VMxnBn^Tbb5(a(6yt%)7Y9$3c+5P3k*c1eyNawRlRYSC-Mg z?Q?=dzs&o`f#scZ*K6o>Iw6yrrIaPk1x|!dcA2T;RKifslf+0I{IFb%_AGzS$i)2w zjfi&UBx4bzQJ5b>Jc3JxS{1CL zEbXH`pC&0T8K`kq9s&}tp0!n&q% zZ>FjP%sKv`7V5VlbAB;0>fSY+LYko@f5?PeqS#>UKrDKfXMe5y*yFc2mQEt8rp>m& z##>f8_ez_nj&;J6pvAN09#vje6oUX3BmeqjUyr{QVXwL;DQd?mf7bLA+H}SbnFB)nShLZh=DH)3~ww#3uVmT9Uk?GEp_O-pM&fsfdE7vEH3^m z=2+$8lPfoc?bvzHP^7<+sHfMS^x&h_D`l2q%GGL&N%pjWutwlCRE>fNvUE-+dl$D1 zG6RTgSNQ@xO{t&b3||g zz)yGxiq|OAD@+5FidV3aV_X?SwU7m9d+Fbhg$iQ-&EKV3`|)rzRF41t^4EjwpyKHb z*9)T~CW0U!V@f5^tA45daINe<KN+RICXfdIgK&f2LQ+)r;l#oCY($F8UUb700Io$g9HCp4=eyY XYchGx-GqtzKk#NomY8ZZHtzoc4PvhC literal 0 HcmV?d00001 diff --git a/src/main/resources/change-header/revanced/drawable-hdpi/yt_wordmark_header_dark.png b/src/main/resources/change-header/revanced/drawable-hdpi/yt_wordmark_header_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8e95d04f2241b92c6939edb563df3786d3039bdc GIT binary patch literal 3445 zcma)9`8O1f7afc>+caU>3M!L&y>{2BWc!C41H|3@KxY$WoT5##VMh5|s#J z%1*XOL@~zNrmydR@Hywc_s)6eo_F4PKiqR)ij{>450?lR007`IMWd`w>g$t0bFiJ{ z@D`=f-@)^`cYi0$>d0oSVT5Iuuxa2w zCNFEmKCUX_lJ}?FdsyM^!&!hiHqTBo8x?dx8W@hXG!4UkhAx(bA8&_7H*>+mVn`v~ zYg*e2zh6upZXGIZyI$u9BK`v!-PMU3L}{9AWg$l9)k{O|)}X^B;dC+XksulWISJ}7 zvP(`|$bH(;)9*|-E#VvtOIW|&R-ETQp;NVILb`P-74H{Rg|bbY?O?l{Mf=;WF5c>W zlU{U=JASU#4?>L|VzI{XB`N(Z^EhJDs&(Sq=Kk0-j3`5_%G{6R-CA-FWPcfT$QBjg zOm7LlkDf9p`dSKbUTt1V+qmdH1m$sC=!DZ(&B0w=TfY2Xu6bs-)0Tl0pR43DmY^Qk3IM>7QG%G@bx!pfz~&pm9Vhh;GW0ScQLnt+N+ z9+)Tiy`TsQImv|{^ANU`pAXR!8GPT*(7&s|{zWeRjH?n&NS?2}&|}k2kg+jL-I$cx zV#U4s@WKypZ9$2tXOaZPj(WF&-r^*$1Xi-Q0V9I=L#J{NFOySycC`~6+Cbw?=k4$h*)>u|}dudO{3 zK{;l!;It1&LcyrHJnaUm?FYTb+t#Im*mYX|hT{KcpB4xax*!t8pBDpex4=zvOx3%w z^Vx?_L)*A5jBj+BC*{@lQhSA!T-pJxt*yp=b`j~oHmGUuuEryGUpHVf7>B9Mejt4>Y%*pvIs6r=RBd9p8J z?ZHErNAfp)j30@u3^`?itYKG6hDGgpf}&rhZ#1Z?s`ljM=CTaNyjdzcdhjVvOGR*W zbTsz*^4k>SzR-q{#JR>Kch4`iR3DMJm;q|fE-~Xy9O_d_kTo=%J-Z%#oZb_HwO?b6 zja;fGj}pb@Kl`Xj=${UhX7HzICRY`V`HX1wp{A-&wujwKjE9Gu{#c269=qnNRF_I@ zicYzbQpaSefaSp|23%ozS8Pe(j5rpLB&~x}Rgg}9K54>@e`w&$@BTTu>F4jyEGjBG z0BuX|+Mn6K`;zSPY(7{_Cyd+4$*E^@a&o;L{C?_d8dmHNE(7G(qFG#N>@7uI)y`Bp zmWqs%7cyDh0aZ`s52~4F9dLit6lb15AWtM~>5?Tukg%(h?NaXgPiB_&SBL4D3)UJ1 z@KQ)^9~;}G3)}3e(jZ{5+1Q2XIS+_H$B2|k2?xVX5?9*BZFf$;t*WEK9Qoet!)9Q_WeqN4YQi})`K?`Ei!+@Z?Fs9|um<|FwV z(&$fo?{@UCe1ja6;KXZNfF2E%3{jL){4H9DtV z!#2!HCyJ8UNw_twK`c2OsM>z=4)P;63C5^gQa zTP-%wvVl;*;4L(c8~1yK%sOZ}@YubBQMbwp!t6=Y&sKPDPaZC{U|5Mxy`iFk>}$6R ztHiLHbt9Tf+bCfbq;R&*a})Hkb|HWD<2zdUVHxQ(s#Oe1%;uXYP;Je0>1V#5R+OvC z5Wcb?{3URIqNw2l~QrM7%%m7K_aGVkpqaWSBeWsZ)~gg5%zTbe`0& z0O$t?iIbC8Wa{xf*^5YpW~wp(XP`=0bkFAK9`kR2}#w6RxE4SNj6<`;D^- zu2jsNGB-}o5y`&TndhvmkFJ=pzG<@$@yJ9!lC`-FXT=GO=U9Fct}d?2#?&$ed9Rtl zq}t+W&b)thfFt8^6e-XTvWrN@gRj#v>2|keib@m-dO~_|$YgHEi#Y!5BRbBM|NdOx5)+yo{ng5GpU?!AD6kItIhw z$ozpfdQ6mDzHAB0ns#jLVK zK_{z|_@s=t!w6qsVqTL#Kcf1Cx^%eILH`yixz_yEi#ou&o1)Pw3fCI^1=5QD@EpDO z-Pai9Ac22?(9<9#u%6WE6=#*w!Yat6ac3fNjWox2ggtIe1glK$=T5#x8!MaVAVW5sRP1Cdy;rm{1`;vb zyt-dSKI;Yow|>?4G}C~Riext-(VO*=96tII(%KskFOV?@wBy^C^|Y}MQ+-oUM{2Lu z##KCd!sO7@)HM9SD`1r%_u_{~4cVi{Wkl9f*?wu+K*H)Y_==M4e!$QZy z{NF?gqZ0JOe-cP z<=0Yy*x9y$NXB0&#e@s%+(rCpTs_}jnbh7X^Ydt};-PfRpM z0hgXA2bDRkWKdgc$Ja}XQ>e`Qm-zw;>$WL z2#@vB4Ju|p(I>K8u`+>|!78j*77rNp`y9#g_b#XLKOR0zC*2l=Ss&(9WKdl-k!VI( zGHC*ET*Io$mbQc@*gf{pX6Ts{uvzsFt5VV3z|T*V{RK^ZdAuI$)i>{)|1p|-7w~Zn zR<>y}2QM?=mvyyLO0Ie1X7Wdw^>#sO`Jt5jsK-ENN_ph$mgU~LX!ZD1J9IHgX%o?6 zV7TV5+dwM4-4b9ybpX? zk`SJ$lL_9(BFn!5-zwsnaE!##6AnD5QQ;!?)JU6=kSlXaB+s;V=VCS!9$M0?e^Z#- zZH^gxKb^m*g>ny(6~(l8WW>}v#^(a<-h-nAHDYhPMmB}hHQoclENF3-cqO?t5}U?I zL-E9`qcn#zz2XCU#)Yvv0jY+&8!`3*{{Yw_<5+Jt)T^I9L=o85Z4Ax-dJ* z^xc&$zV@zqME@}B?XOD7P6v7otFIZBZETdM3c2sqkHlOh4wdli2bSkAWYMNWu62B8 zMm_8Dx5^$;j)z4pO8@&ZF_Z_MB%FA25~}Cue&&(1fF*B{ZMWUSospX}d-FUAzIUc| zBWAZkM*np?%bLy~WzLJ8s=@&5%5m+vwa@8mV)W-l&*U(X+2kH_=z`r-M|$-$bR7s3kw0QgZh=bis?*FV^R zxc<$T1FG5oba&Kwi;K~0zova7M59>d42zA;Ebhz&XjX9FlP}P-(XKXuhRh{#;`hoq zs@SY_plDRN`J~9~hPuGtR}|wdYL?(NzWh1?PVJGRvO<>k;@SHrx=UtfXZw1)GXt4>F8CycKYX{( zd0GqNTz)^#{XDxV?m{O$qG=s}Z@s6MyrPOUOz5nY2D;u^MQBLbNJs6+G5D+Qzc-R>s!)WPYq( z`cet3eHFb=Ze;xR*BEHjfnJdf*Y_V*N*m*X2v4!LrBRvwH)mHV+M~{RU@c^k5D-G^ z-Er9}(4Cu2((@lyNOR$m5`U@{5;R~ykgP!xp9Y!K1Flyz!$~1pSs!Z7;&NBmE?9(% zLo>_}Rz6W1kl<3!MN0MM>S6~Cz$$&oIy}thYC&uMzU3bXs8|Pt#^101gKtQZc^(&f z=XJH{ip1tSU|7?g9@qQ>G17%=3^_AGCfpw>dgZOS3_1EodBZfmS|2Ly?g2Q9i-fIj zkZx-qDfn|*l&9n)dytA@eyXY)pyV!RlZW2Y(_H0>I?EQrQBGt3H>N2ox z*bTl4$?16Q^+?}?i*O~Fb&LwS*@7J~&; z%i#^Hz0IzyF#kon(LsGH0GP<>YE z63e)s(iC)synV!?&*;5rh|(KKWO2vBck{L@q*Pvle#$aUOG3pY6;C|t3i0iB7pSc8 zlPRIwvYn*g(VsV_#z^71edSi7_8_SUd$UQtR!)Yh9i}6HtWy?xD!BSoM5-AhS)FzI z3;^EvR8{k2;?2SDn6ezOFR#k5a?8N8cD~m)uGA?bCn$;ran0`ZQKLg5hI@VXWB8Bt zb<~u7@4}lA2%s>nDkYKFo^+hp8qd^@iHVsq+hj#g&$j(~!1{M49%Os@Ju?zQL%m;s z=J5Yrkfx&8ypf13xX?CR$u8Hy$yz{EB@g53UmzRxWBl# zXfx86D=!T(sGB-Ju=c5-xQO);g9{^o+NR=XC`arnXS)J4+!adMq2 zv!CJh!3Ht%uW@jfY8!rMa`g!qJeBWu3lmKL$aZUiO=xU{N}(I(EQYpt24;A@1>>jn zegT?-wZ|*@$7g0r-gvaznnZ059hU}6*>>aMXckUn3*K=3@|NircXxFr2@_PMl3m%_Zd@EuOFzMYf!FvU*qmoSKlu4?T2SybZ>_*G zkxv|`b?3e)R06nQzs8Zou7wU}iX(=k(lG{d;LqINpS`Syt7xnwIkthusv+m)olVOR za~6mp2M~u@_PNXdQjFN4?gy-6`@Q?`?mb&g;}NlO++HD}!SKNOK*dYMyhSS2t2K%) zv%IomY>HEPC$Zj9gRUx#7`@14*?0eF$Z4<3tI8j6oHvKCyWlj&oBrEptQDYTZri`- zp*==DWyWhoyxF?L+3|m6_fJ1;2Olxs#pHb360eLC$4{f2_9MU zyV;!~V;U_p#h2-a8{_pQ#~<%55A4i@cKo+OD#_IKNEj3%CuOU|UIqKVf{ETJBg*~- z5pLlqEr&CZ zRBXL?{Y>*ARjA3v-RUL2fw8f15*;41_2XdV+ygMwEM%IXLXOT_x`oExKE^e!5pP%2 zfiuDY`dablS_HB&#m4}nS`&tkN>ofawq`+`mDox|Q_tk2Y&43=OuMG-d*x?xSw_pG zGbL#xq#U=pS9AQsbsj6Nf{dA(hh_TT?GorUunw8u-GcDZtdj;?*<7a`%U>?_X6LoF z#pQm@Xnv!3@a*3sH?Dfe@=dIvF+frL`FWA24c@IFZ{{Mwm!Gi+fp*FDLU z=i(6Tx~6h!dD7%xx6ZjoIxX%8NNBmYHQXDAK^y01z;uJmj{V!_PS<64`seC|N%t+g+4u?By zqtHW$MUh{J-}o0wE1gGMZv@X&2c)kcO z9C4g|yLR7AMR5xf*#r?MPt5o1lUzrG-@XQYje8-$MTe0%ReJ=3=`}dm!HuPFj|vc3 z1$U=$`+Ofv+CXRK7#bBo)8q)JJhs2dykRm2h^#5bF^{dgFwEO34JTl1uih5?weIn% zyaqClP@QjVnBBExeLBUD&si$bw>TB;fl&+oEbYWaA*8q?GR8(lR1p?M>>aA($@P>6 z>|AjZAyh&6DMK@+ysWSEf>-{{;PSePm6$@Ws+{?AqLa3Ucqr2?Ioo})|Y}@Wl%h-+-c~= zoF!2>qYsllx$q4k@}ecfELp`DiTy#-5rwa5GWW491P=2{flhYw?)jzRk73vBfASRz z4O2@~rtPH5bhm(Cz|)RTF|g|{sjr%9W1iEMV|IMC-QaHEf38JBik-AyLb2fr@XK;( zg`7)J&9hFp!UJ!eY$x*Mpy<=xFSes;VM;Xuez9?WezR+1f+DA{E9U)?-+FcGDjpck zyj;cDby2=?;G1zW{29z7L04KAT1r}He}H?O=|7vqYT(IhaG@2N@`mV$PY4hN#5&so z?RindxI*-4lx)p({@0GT+U3%yQM#K3%E#!062uEUikzsC|QTk0nI$x-s(E|4k# zF4{~kio77*mU*%rTcE+*`vyH`oac3bSp6pzqcED&))oeF;L^2&d)1Kv2v7bD<1`9>LYHQc(N(+~|LO3xKk8IR6IemHIzE52n%p literal 0 HcmV?d00001 diff --git a/src/main/resources/change-header/revanced/drawable-mdpi/yt_wordmark_header_dark.png b/src/main/resources/change-header/revanced/drawable-mdpi/yt_wordmark_header_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..4aff279ef6bd905baab7f748e4e24e0d15f9ef6b GIT binary patch literal 2105 zcmV-92*&q`P)OT3~npe;sCBKE;9$q;A|lrr)e0R7efOLr_9{C z452bJGjo@z%*>c9mYJD+-v4#Z2aV@C4m>Yfo!?A!bY#-Gz0xf;PTeehasAGlzYXbq zdV6@zt(_4A@2(5&cWF&f_ajsNS`E*tmHr_JyT7L5PgW(Ao8aGe=I-b*PmgLR(Tw_? z$>`CLn$*%zvRgQHa*v}SzRhS;%$c+#?j3 z-6ke~O`g^LOI`rX(b17|4YR3Tc+LtCG9s!-1-C1_u%eL4!yTTRsxThSW6z`l`@2a2 zLc3*?B4`?xv#fK>B*n$7RH+hOxpIXJ?jiI$7F9Mz-I`XeTuGffcUGJm?wLfrV;9~7 zAu}t2;n0(fhI<_U7DN%O;(1FI#-{PuCJS@zMbO?b_j;snGmBUC>eZ`h@ZiBTHawd) zHC*|^kMT<=%qN6y-@Z*Ml}d45Mb~PSm9d3l1ABRaVCF?o8HA)Q#~(u}DP9q#z%e)l ztHECyZzTOl<)rvaaE`~ia;yxrhpq4n9DzyT2!g3$IT#_CbI-yd=*X`tB(5+Sj`HXG z5<)?kNq`^WC)f{zE!@K5U>$$H9kAS{MbIUElSx%gZLtV68Vy~%c#-N>_oA68-_V@Y zA1K|w9Zj4#k><>q!+FYD#4V-R@Z7;5n6)AZ<+ur6;g}cP1oQS38gR~g@RZ|WAefJo zUxj1yNV)w6Z*oo&$L?ClZ4ZLghU*GBCTK3@jU(lD6yA{X1}G)jtOz3gy1d)2*+Fu3 ztybV-?%A`4+O};=vB7<)d-69_t*VNyU%yU)fq@0ii_=b}n8=Y!L9l{~pbX6A_&MoH zKFP8D;0qOC62~q;dCuL!v2h^SV2&N<{)c>ZnIId~&Cf{LJq-#C^nZE~M+>p?K{A~*{B*hL_-AH`3KH3ttC2+uiQ zk8`^#EYNX|4FMsk%*7N7ec=k{^;IYWcMz`bRmpC+A7_hRRtpPx@jNlDh9BF4_9 z@c)cm0)iFhbTAXjf`G#IR9J)9)vmSt81&&>81o>FclFi3r85EksC zg4=b@TfqIjAS5m}-4i6WK47X=Gr;PC=H}+omtTHKX=!PcmzPH<2CH-Q>0eW*cH|%s z%)AIXKmv4-Vu>JFh7_LwLlwwZ>M7}pHuB$>p|rF|c*gNxVLTVwDGNpL0E9$kb}NgP z`V~P~u!nO_Dt!m(eP?psF%XjKHZ1~e#uwMTgF0AU&>A&ryf_V|3 zolj97R-?OCgT#oIAG8}si?i8~K z9HiS)Pbn`5zJnZiTRNs*GTQ{EaiM?6{SMNm*G0-}YSSVJiJ!Pcld*yquV7QBPJMAw z!1DvEx$XhYNY`@hT@aFjiXd2u8>IMm9D4$@VFaAz*fn_1?8zGO!aP%Wt^OQ44S^5| zn}Ld11Oiq_w~qNR60S&B{!2XXA;vJ8a8+7WT9v?G5>+R<+Z^LCR9M@UNX)ke}Hz9x-3NjrQw zXLAXP;Ci??KNf{?gLV{b|E(x8QrFc~_+yC4*3q}OPmFz(2UJsmQk3b=E=2j^7cep3*V zcPxDNvJekrU?Q}W#$_KvXP68lAWABBnKSg|&)6TT^LsY7SrPcf40Oe$u#15O#mAA|?C9505cq<(u5Y+ZMY3D%J3zm|lA+xaqugAng8pMV_Ee z9@#;clV?&VjUY!Smm(E_N*z!7oIDC?wPd%*%q#`M?$1}ONxn%#f};BFx*wf+h-!s3 zw^|HU>I6|xn`NXM_Pfcy@$@Mm{yOZ6JrPe5%cz^rn5G$Y?1^^dX$okwkUV4iQLTtp zh+51U1`aA`8Ty@AZZCEuBe=T-Wr}(@Zk4p*YxNK8U&+mT=8?fV6 zc=qnQA$>Po4D9yBVV|Z`hIk}rz7OKR?b0C;0001k!2Ydg7Xk6&3ve_c0w%x&m;e)C j0!)AjFaajO1eoA4n^(jakD(K}00000NkvXXu0mjfk(%|| literal 0 HcmV?d00001 diff --git a/src/main/resources/change-header/revanced/drawable-mdpi/yt_wordmark_header_light.png b/src/main/resources/change-header/revanced/drawable-mdpi/yt_wordmark_header_light.png new file mode 100644 index 0000000000000000000000000000000000000000..48855aa3bd8dc995912cc5a06029ca7a034e540f GIT binary patch literal 2088 zcmV+@2-o+CP)OTfQc)68!&#?-F?xz3|qn7*%m%*k;SP~cj|)G z-QC^0Zk2W4y3*CUyX7l%-v5*4PI7ZIFlZ&2hy1E{B%JrQ=gh;Cz1w80@bB^MXTbvw z{}`5k>F0NcUELfq_|(S0KD%dmwI7q)DC2b~R`;ihKiH7?_*9=x^L~w(ShOci19Zz zMNE>kMiF9fYbQ1~HYM_@?JRSG`pX|N^Nr*Dy3K`h|FA0e1BUu`>Aod)fpLIWd)?w& z7SS+BHpR@BsUd@Z&*8rj+y`IQuX0_S?b|8plep!^6z6z#Vau;c%|@~+W{!*u9=rw0 zy=PVC3%dq(wO#by;-WU5ZPf*>IM+I^vN~~%WCvvDL%FxC%6wt}cZdC$7d}C3ZEPz! z1VD^SqD+rlUewyB^>a|P=nbqfV<~#$Rg|X&SfhFg`kufltbsco#C)*^i%|7tcz1J} zmhy?X*7vFW0H|zjZKWV~fpiYbUkgQxYC=kJ1`SZwp1>6d(x5K_f?~Xi2eDKLE}`mc z9h$$oN91&~i&?8yEje@MjKn$z%YQ7Y)CvNy*~f;tCd+`hW!Io+=!ako z`l%-18U&xAJgtXd74*%9;2W6BIs{!}7oBhB*`~z1dc%edGGfFCnG}{M-@L!>j;|6{ zN~lM$T)uo+3hP57N)$h2H8l#_c)53=!S=&%@H%O2M6&HLZB}ZU*S(| z!w9?teeu|gzwr~+RO=A*%=pG=sOMec5QK+^%gK``rD=UPnV0&hEKK`SGJHDAv}x01 z;lhRLb>_8;UnOy21tXxSEDb>j1V%gsQrvJ6qEm$TK*}p9f*=&8JRqt%AZ0PcjDPVw zNJ)m^D#VN~Fx436Av#91g{jF9Gxp#)m>LSvtF|F%=GF7%&TV#xqhq~N7xTB@ev?j} zI!Rp6K(2vpkcK*$ic%(lD5#=@x}D=SNO?b;;{4t2!f6ej)q z_m@qZHd)*thJ}xp@TeJEps4gium^vrPC|6w6fcOXEnHLqxDA0XNa=B9~_y<$a5(i5df*a6gfT(IC0-~yklKKsT0~n>JdEI#s z?1i@a)j9-GnIE2W5A14jK^rt^aOX5|^ypE^&d#=YJ^#8$YL9~w&^+G_imJ3d!4?Si zYEB04KvZpXcg7I7>P``3AovB}Logqv3Ly9uk3ykmaHWDnV1wHb^n< zh9C%{iiN4qA-IJF7>lD2oWm3;D0V4#{pwMf$0KuQ=g?wDD)*#UW-k7|dAp6eQ$oc#2ep^jUccQ6Ow4^2iWWVOEYo<9XNBL7zPaVGf3%KC;jf)st7`Fq`N;f86qn&Z+bO)N%5YxWR?upFBASiq*YUu8X}A z#ze;E9x^(Ib*k_H)N0@%k^O&{pw^2wL$SK|%KZTElyP07^9zmM$z#RV&Y@fbVDL_m znEXNsZol$ZB`4=$C|37gg&yRYJTkEPpkJ;>TNqhuSI}LqS86u6wq+7L^vB?cbVfFh-Hv+AaiyXpj-6p9i|Nh~4`bSg z>{FgA(yuH6?u+bYDtjC;U4>#W&`Y45EuFVs;GSS@X+g)$C+#mONxJOeRV;7nx;yOM)W}S2UthVY#i%bSps7Xy#D)LSL=0mq9>;G&?f@3!QU%mDA|2 zn>%0ikOEXhM*jU+ws zytmV(`Daf{Du>SgrET@*C??LomMnj`Lvpy%z8wO@EWQ?s|f$Jw_-nsnFSS)2!UW(Vu8BXU4z~n#p=~KAD@A!*(&zd!@W8-38 z#dgg4XC~P<&g};GTG=$t{Xyt4$Lki^aQ|<*8gZXk2R2MfqA<(l+@oQpB)Xzws7kt2 zBDw`oM1!|1ba<7e;>Q%#8!ucG?S{tU=?3g#(drAkl7AbmIU6-I2GS|5t&`7!-cE-w z=4AoDjt+`?dLZ?KP0eA|IZ~Wk9}rwrvY`Db?JVx7-j%!S(j6@|knBZZ#}T>C()q(> zM-4<(dZYPTEx?JeSo?FG2`9BmtnSf&A`3I_1il`RlGN;>ctFYzqCqm?1gh1|S8UH& z2*WJ5^h7dH98}y%{!a-Lb9b8;FMq@K;MqSq^e3uevC{kk0@df6e#Q)|tg{?Gaz6HF zdu(iMqhG&*XyM$*%4*UJP|>k&)5;$%4c{1B4b`_2wU*Z}l&D;y#^Rq|Lab^1Xa2d3 zRY37LwW>S;WAeT~oDFJjX^Epyob=7iqJ@|(SH-$vG{V``vw-|K6Jz5GyJKos@;0Um znB1d_VOB00UUvaX!)&horZl~HJDvL;y&>~&nlz>TvLrlUB=!Fgp6z2lv3WcZh}5#q z_swhNaw*QRIcChHHIwM3sH=BR2B7Pu+`9S?n=3J`tpx#-_G|3^{{9b}gnA=?{GMoI zo>j8Gsia$|@u(9U5;|Nm;!CqanlWkWA1gi1x#_C&=y?CvlF9ef47^@(`*nu&j=oqt zttr3q@d{tcpVc=tq8qYIT+u#1o}e9M!@X`BK=4cz#0D^)uC$1;S3}_)P(_GdebI6t z_xbj_7s1xJw&~*O4ummYCxA8ug{%x4c-@aej1@Dy13pAtK}J*}sDC9x)VBE{3q zohaX!2zr$0HJSs|r7<-4V~Z1d<;y~xB`%d<*l;`}%9UJKSI3{4n!5PDH>v7N+9cuB zO1Q)YVDi=?z4~FNp49yO{A5l%`)>jH&FU`PC0?YdEA#$TzYw>j;jJrU!ZffG_dJzTagO|b!x5tscV`jS2bAI>Yu zU7KG~b=|wsfF*?Xr+210VqT?I!!)A+(BYwO_bPO88^!^@v?xoU#jt{Gmb1|2U>^6~k} z2cAt7)_RhaQ`ltO%sYN($NXemI^t9B3#C`@w?_vs1Q5b)WvE7ef-|!*M2oq=1a~u7 zfIze4tr(Imb`HqG&*V9_)Zr5JQfc<0Y(XuNdtM_K6X^mOHO{w;nc zByuUB#xDQxD`lhIcYiVpMc+L?0F0+xy{EH`gDclMh0cH3`*q%@;vfxywX(-nvksTR z0R^8?Hx6qz;9<4`01OO=%Y7W4?IbTly$R>Ci|x|LGF=YDm!@M2*hlki)= zaFChe zq$bbQni|j9Q0xuP;=q9~n)pY&mWM1~cBL;I##l(Wj8D{!L@|T*8twbe;=!F`@7*Q$ zW>^D`>)q?aUZ=mHeA3&#c?$fzn>(mpbi#)L6?CEg?ka2t!7d=-KRNTh%tbo$#dLn9 z@~I0Z4Y|{+c{Mx{VIuLA#!MDYABqwaxo+t^`tjcTeCv!&`VoScBiW5)cK=lB0`DU8 z$LQiHih-Jn_#o6L#6(4x+Wn_pcTz`92Xb$1QFa!Eg`F6`f`kZOWug#AT3gDCE4~WgnHu7Que3FIc`Y8 zH9dMY-tG8zvr5kQ66M&)`Ut%rPvg`_<$N`xk3RPcckEr?wG9TD1_lI-!c|UHrDj_F z{o4e2?xx6lFMyUA?vmyd z)O8K^3#$lL3Zq*TT{0k~wr^7%z?^@29~bsGJi!dqWLFktR;Ha0cpe246O7vDG@CIhCRYlH^BIu$7lrcUzrR5!C%69sEgQgl&I+%YWW7E`ph)43uRk zLLehWhS0NPL@p-#1Ibl_{JxbIsI*insZg<7B6lurht0p$D^6ZnJ4+k_N|6J zH!PE>DitJBkGR+I^1*G^mDjHSJX)q=Rz)W-14lvv=t0tbgG)9-+g8!wSouh?s%+=F zF2Xo+W1tj?<(n$-lTb}TOsh;wqw0}!2+#45E*eT zR%YX&ogBXg{1eW|+PtvWPfL4|cLg9U2@Wyxg-%MncN(TCz$F7Z^jV&D2cnv;fy69= z4EbAz5?kHtKO45!q6r0!l<}CopCg&@tJBBL2`>ecIXxYt6Pi@BY)cV0O!w1NDzjJ> z=uPYMF-QyZm#12LpxL2V>UC%kL+;!aeIN_f6FKui1EFFC5zB!a2yhvoc}GM08L$p( z+O+vJG3U43{es!!8kmUlEXBoeXqbt=pHwmtKcbdpxAOp}+tMJsNY^h~WugM_exX)0 zGxm;KLVM&zD#J}um;@Hi@> zZ9&|KVZ-?3T~|8%*>QPn?Eyl-TnvOJVr{TVXL7?4&x?kXvP%DOZkmi%w0tp{FMt76&Kc7Kie> zlxtJZBs;s_KVov3{w+G_ecb=~FFpQ2s4mLsdN*D?`9qrQPX83oWVdHBEVSE{_0jxV z9laWSz)*;;8(+39oEIjt&E$sb3jB+~)Q`yI?7Mv?41$Vx(z>!Z!bbzRrEIUBQcZht zA9g{VA>A~Mwp8o*y<}Kt_uV6&4n;S0SQhAH{<33_usOgkmOSkM4?+jFz17@+q2G@KG5P(IIC%nf(EmBBw<`UBAVHCMIaK9{}-Ravmz zgcV_MYG5M*5n<1ZFSnta*s=B<6FBLq{^ zt#@l~8{8_Kel!ct-Csj#H*8F$hw+l~hrOvmd#q8O9W`ak=Ui%NeC2_K1t6Ghxvp=R*#Se`JUKb{3TE%qH^lZyl*SiY4Jrg`P!QR* zRwmNJ@KSK-f}fiE>yZ7)6W=#W=XCVwuU3U=qwDmc3z1cFwkBTiD*7#)(_gVszmGI% z?`dvpAmrXPs+qTGOXTWb&D5gj%_mFiDV>7l8EE|RyZB85nQ6I$_2+LEXi>HW&tcBh zk*Mn4%~|d+dLA7a^CdF=yW8SYs%N8hY&WFR9a5|;;i!N)isP#HiheLVF_KZ5RFpAW za#lo1qn7e@MO=1$j#1OG;&#mPE28Alf?sGC*(E;tT#Bh8Hm~i^?1rGr4==!P%?HJU zp(2i5k9vmpw!}X2Xc+Z1v#5D~44Lb92ipvT=lVT??G>~{{w=9@`_EqOH*A@AVa-G= zuAXD`xuOxP=fISdj>$uDh9%8vIhW*Tr|E$o_-f08#>Dq_ql+?wmaYm0{Xw^wWwWR~ zg{eCeVf^2WiUKoR#?M}xNooA7d8{Qm-Sfi2JBGQ#QC8ZwOCjfcUrOw^y_wkSi&dKl zhM-R`cf2#||1WriJAJDyiAzLMX#!#Z2q20|6%+;mTmtX{{$D}ZCFPND`VT|A5C086 N-O5~YQNtl5*D8M`c5veTFd4Oz0LFd|D~CVRvT z6=fTgLAIaI_x%3+p6~tRp65L0+~wTozTfA(o>Zi@8H|CS0RRBNEX<8<0RSNAJa(po zp3hWBR4V|$9$;Z?Xcq?D=mo;glOIHnsx<~RozKJnWxzaE74f)F)A}fX*Uop(*mZzr zWTNOoGE!Tx(Gx02L+iD%wZ*@#$~|rWC|#y%aGE|6q@*oL*(Z4@k{(PiL}JLuQ0iHD z3}NI|SN^96!kkaTsM}FTrW#jZpk*D$>g!gk#im~UpG3*zzZL77wk-8+d~c((#RJFW zKW5dqqz!4Ja);euGaEuf-*@M%n}u^)dY2Y#p1#Xl>|Sn1)gLO^t-m2fX|LUg@`*QE z+3|Xk03koRkUL!bdP)2vYu`(%7Z)bX>h0Neyo*cpZ@n^V2lqJls^Hv@OG$0ZJ&`*H zKA0lh%q=NhsRc)ug4<3H`KbH>#ph>QEjm9pnf;t5q{!sb9mVI}yH_xoc2EPa2j(ot{u-h9+--j2bsq7G4r>U3GX^S3J#@Q;~Z2glMbkQnw zNSAG$_ed*1wdkrth358i-_l`Ig2faD+90+V)Gp4C)C7A7sb8DPH=LKA(om=A=+P@;`Ww-x_3p<_Zt0sO5^G!8mG@O|7~@CB z%Hx4n)H0)}vlWPZm%y^tvKRSu%T2XQctfv!xv%y^==hu7vvU0^_hYh8;Nq6I$>% z*9^aCSR9x8G$m=fagYeNuqDD!*%wYU)?jZ2^lgJUo=fg?A0AXK__yc|7_R&YCG%xn z-~sJfgvfo>Gzd}}rIV|+-pK6buBr`WDbC;nl1LIWaie%Igs&Kq;>W=m{}G-(#veny z*g=SD6Z|oh2#*#N5}Gea@{3Sb^ENQia`RM|j@;j}vMf-1+2lHi6CT_Ts-Ss-^){hC zy3y5BQAYhs>L#DcfWOzE0XPqv6dm)wTbMRGRWYv2~0V#4hNQ`$)y$dH_ zl`{^?|8>cp)b1~`Q=}8B$QPnqxw)wJySZHbMO(Pl#du~Rub-dt`aRaCUu(CP2))ld zh>;4j#zCxwdJ*ONJMi@Aa*O8x8e@cb0{U{x%|CC0s=8>mbD+LcfT>`?{&8q00`MNJ zLWb#;W5c=cim};>GW|mhzmaK(7nM+Q{RnXgf`_PXgHkXy5{DR8-?&Am zYNSDuNjXe8-WY$xpS85K)W5niT7r{_fr}{3iF8^#^B|xnn>}ngL)N)>cJ}tBd~>rW zc$bgLaCd__wA3FdK%%TcQ-5^KKSJ{18U4RavirrIK&%%)mCKC%LqLs9F|M&!w|L7K z8sZ$LKQ!$1_sKQVot`^7dlWoZm-$uzn>pTSmR_UWg0m641*Sg`X2%M7=G=7V{sv*+ zR@v}XPs9)E*9QA-T>F%vXS&h_U3-t(-)twbW4?X6JN2D?pS~qL;BwloW14+KL0%pk z28WX^n{QcLZCDGn9$^b=w~l4gl7UG>)=|7R<|CqhKreFokmj}zs9ItjE}Mqp?ZU=9 zj|ao~J0W`NrL9*J)!_W*G_M|^8_<`Kj4z4MgmLC7xIz|`>ZLs2h?aw|wG<=B6jeXt z$KU8bW$IX)CRJ&(e5$LHUk*M!4quyXx=?ig^?kM*)BC(IBmKP{eidChVzq;MbivJZGe4 zR=#x~$8sWEise3l?qk+Tvu6!tw&hD8x`SO9i2WNM3p}ym0vWXLd>&smc!^zlC-BIE zFgsgVf3L?n%Ei^yp760F{iV#8GYCpKInSnN~D&?_`03S_kdJ(X}ULc80$=qWtG1sn3S^$-ODaKV)-UNcO1d^bfh6I%CZxFA_#QhL?e$)=KR4? zrXZDRlmi0A8;_0ApLh}LyW~(S16e#x(|>AlP^=rhy8d8>bS~jk!ntJap6ZZIvA`P? za*vSx({_K7byU96z4`)bR9@{b!YM(AsT30JEB(*WSzV7MC7a3i@LBj758hptwc;tB zEIHtfEYKKX=wM7wC;~CwUsacfWQ*p9!_zt4Z~ibs_pDb>Zj?CC1cJa1d04;usuuu7 zlqndNkZ^l)%MVFim`keXxqK&Ld%yg`lCqu#B|1T?s;i}T-bU^#?yb)>ociEkX0y7L zbH)jy#t~iwgTLVABg&S}JCGLrKUv5Q-o0e#$7=AgP^`&_5+j|2c*{B-B}g?q{&5 zUYIF)dT?rUUoV+JLRD6`X(MNeHmQ`J zwEap8yoHyu7!u{sO*>F7a4YGEM$&G>rsVSTN}o zE6qwH%U?&jPTZkR2#3=;aXy`_I5K0KS$sMQex*C%Z4KLS4AwELdR{p+d3~}OQ@!X; zlbD#;zxs~Sece}CJ9vd@XLxLE`i?;KKib-VLfN}Qx8ALG(Uo#4D2h-y3dg7La-z>N z;7k{PT_AjL%#NlN0jZ>;Gr+9hHO;v$XB>3!F&Ns24pfWgnHkC(fK(PCjuV#2r?*;h zk+5g5ozYtf6Y8j z7%Daosg;E=pK^@%HIK131c&-`!R!PC1R@T$#l&!*lTMEIXXcyU?LEeJ>d!}TB?7B6 znROWVuQ+zQstTFof#%5$yo@9Oy*apvm#!2y=^a?6E1Z%I+xsIf5A+^D5RKeQs28Qt z4nxm60%a4wN(EkZGy8s<7Z|9_rkJ+D+rqB(Ad0U4fc-_e$SgiGK&Zx^D=sSww)sqE zkdmCCZPuor7;!SaLNUGD>dh54k?8Iji(l~tS%W(leULJHzMuM8yC;@z@A;G~9>UpI z;_Tc3UY({T8j01Xa8kta3eq%U=apjl*sHG0GY>CLklLSK^7g1 z6vV2#G-TuF*u$DH+xxVg@W;)%hu`c4z~eG<(@43K0#6At5*|$oSBQ!7-WaQ4bx;H zZP@E}Ck(=&Y-a}H5&>%)$t z6}>Y)fZ6G*nLllwqvV6(r;{^Y=FObw7;y5dxz(ekBKupezi%G%pOfc?0skKPN!D_V zQ^nI0wo6M4GK2TTYsoHa#4qKk+)&uCWRxt{m+R@qr(z&F{Qo25FPH;NQ9X!ox=Q(E zaWhp@Ia;cS`o?QgocI>Q@zz7Ayi;RARkmIRG}y&(PJ2iGR^urlL(im2P5rdlwGL%z ztlydfb7LfH8|mFV=ZqR?@HLhqw#K9Q9i@|ZWuM&&I$pf-80z>Rp!`tWqGB>KBG?e8 zM4_>MXRX^q&oitY#85v1(2qY0%My!%dzu}Hd)=?!#b}0i)a2_k~#OX z?yTB(d@X3b-$YHJqT1wk5?2rO{EdCI4waV9=3co1&s#$%!_(;tg@$GfKyiREAO*k* l6a~Q{C^`Te;QvhE>5L!Cs2Og^5B}F*vM{kWu17e>{Xge&=b8Wj literal 0 HcmV?d00001 diff --git a/src/main/resources/change-header/revanced/drawable-xxhdpi/yt_wordmark_header_dark.png b/src/main/resources/change-header/revanced/drawable-xxhdpi/yt_wordmark_header_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0e79b3899a8f93deda6be1b5887d37559b4c5be6 GIT binary patch literal 7324 zcmbtZg;x|nx8Eg}TsoHS?yePS7G1hSSdf%%qy&}*Q9*hM0ci5+u4?e{k5iO=%k!&j$Os>XH+Q6dRj2P7E>qeC0m&M5c%j4;9k{vNO76P68YAO zXp*yse8NhvxJ%k}^5d!K9>a2}o9}hghu##vt-B*pYIulsd(~+nrKzT%_WFz8^gN%W zYn{#FY=*s>LyK^ga4+TBAq6~6SFXkyaq;97UnHxI8^3vvKmmd#pwJq&XiM!a2MHND z6*DKLiJuWNJP{;Hcd(zwu6ptPYJC+#^ObuyD~Y}&!B4pOF%h|+`EM-1SSTI(Y@)WB|nif!fkb-+BZJi+(UP!!yZu;)C8}XTN^LbdhYt zD0F^L^{@!VJBG#u&IbXU&afxQ4A3x9Yg(Qx?!037Y+9yu^Xz->mMU6wjI}kEO z8}#VbE$?!UsL}k%lhmSE2umc%Y4|WZ2LZpR&)4=|d9vJw2}#1hK4*nMpU&RLfNByl z3PO&xAz`cOo@tgDJ31gzbkF@$itZY5d@P<4t_Z`lT;2K6u+Pq+Phy}Nv8n(pai~k^ zmk_HoH!gk;EuyUKg1}YGH^*HHCh$&!v{nI^g|l$rDZz~xe0Htds23722M>`N+urya zHH3BNP^OkFTGKDTn>ive^+DV037Gh{wzP-Ix|<7rD(dnZOnelAz$ez@Yw=e)&L^)CDD%5UVHbJi7W`eX@RUe@1? z+nM<|viq#~&R_YCESej#N+WVmWHL5jIY76r0c81AiLs^;(4_NHsO zxSAUhAYCk$NRvN3n9@ntZEqUZXH^e)m?4#iz#lBS1yC#u^GZ^xCeBOytivqaFLs8z zI{(y9doZ)MotqH34!pQ(W+0`cn*9QKtO$%a#(=YyC{}ytO=G{8r^3=pO1IPwbabE2QVTZ;D?!V7Qk% zfNVGQt|nPlu(3gk&c5cMYI)yHHL3OgVL0xwT(CH03i1aU8#XimgJ~ufRc99&>Z33? z#~X}Ez6#e=b8~9V$;dLy$j&S-KCv>5ZtnIH|Gp zulz!GaRX_KZStFZe&-t%#+243X$zO z;>b*<4c4j>th%4GVLs+PP+yJ|;=IhjeB6#Pgs);ipagdWSn80R0D``UV6b5LhMN{~ zM&eRTH4AWY8RL?cUe#Y5mfehrfJ=%(7;4|M*L6|req=SgpNtCITYU_ZwKqj+=joz{ zSPOD&pSdaXc6U~cdWiIq?B6Q~kY{K#uR`PW^|#Mas7@HloxTdvef9k!kD(dWbRTeW zHBAkya%@`@=lMf@Inyhd8)9tsnH+wrEeM+0#_v`TM2u!UW7jIhp0BPN7kn8eBO{X# zuGmGV)hzPJ3tOX&@aYGPgDCo92&}XGOM23?sg9Cm4}^VeLb%-}ktN`qkVa`O*tO$4 z1%}E*qfn?GbiUEjBRQ?4Cme!vbrs5#7#g7$5%1~KSQ|TzzSp?{#X1;!6b7V5XK0jO zl5NXE9lWm9VW{u_wOu-U{ODHoCvP%)j8LJ{WxVNl2NkzY*zRP7x}~M%eL&Gf2|}h^ zzp22@4jSJ#&tp(Zf{lfx^O{zoQckXP*7OCYX}v?WFak7N0f9LY?9;p>2<7q&)^z#G z9p}wtiMh40!4CpqP5=6HJQHgtE)wWlEP03I-?NymdiE4*ZEc-d-IEF~NC216dO?rG zoPgOwzbnnY#0Rjlu?fsBM?kC}vG5wYC5!;q{V>G(a(h--TM74Rjua7ww zjaC>umytwNE>LxKQ5Rna)CZDg0AKXvlN#vgg6GiqeaxHnfb+ys^)-}u?V={T77jv7 zYs3bj)41Z4o?=$Xrg8t4sc29-&A0M3ofIcy*=d@r=gwI-t>?Jj`<8tt(U@`y{_M-! z)9q2N+;2e_W^xDlE^K82w$}2ufj}{ZPY?=>Vr497Xt8{~jSyOstfVR2wT*Zu;e*Io5?nR2^!d+Cb-Z3~_auy|;uy5ZuQde$p6R2r>T1oiUmxG&8-_EcfIA zfI(K`pW(J9V6Iis8zOUNY|znYY!t6D#tlGj2MqR7wp& znlkH8WGkBg51Dw3wzU9#SV|4GkpgRglAs3_a!Vf1v&+nlwMwsFHjNsol_N{~=4V_w zzp3cy*%T#PO)gqH>t-&X0qT4H>qlYS_RZz##(~>ya`tb`_V@Ee<`eD{VKj&YnB0JTPtWCXD=xWKTX%f}41#_k9yodRm5w9!ZS$;$Ey1$w#J@~HjrNUP^y zD9&mX$)%n{?2|W{pP1%XVweP0&r8=NF$DB&~qAQt20YV`@eQ_cym@K;_=hJjaI~ z5Ps# z-Vp)Kpc67Ly`Tn}xLq2)1CfuU5Y1gL&wDPyl#=J%D**aUJ1RTferA+h?<(G9KYGN) z!9hA2ML^xxwSJ$FL~O5oD;Qi`aIBcJarv&rXGaO@f4H>iK$FJzY{>itx#@%%(k6Vz zuF$3?y1NV;u1eg;d^$^5ojEfti57pMw1(2n^xh&gO;J8-=&afr&f=QcG-Uw)H6 zQ=3Taqg0ZJzwWpC>M+WSE$)aYAdyZ8 zf1_PN{q@U|(xbWkz774~k0lva<=mHAx#WQc7;myT3n%XR11IleE99QswQy=?-K_Vs z^A9@B_qemB^}CYO{^_AY1kRR1EZ95;Fvv??3#~Gi;u#{P{l$}B_Z5!!|0QU17oO#$ z%(D^c8}pdm!j#sY+9qr*@Sr(lHqHBX1Qo^>^hizYH6`5rdv>-r?nmvpIfyk|?>#Ip znXg-@b`muF?RrIIGi3>Gd_xwaF7%Ka znqr9U><0Lp86!)O?(pG{9I;_dIi~4PjAknzREY;;797}kH4h_t@ zZu5m!T|3&CI5ttp1?|5sP@PPThT?$~%l>$V=D+*-MbYcG7OQ34)H8=rvC^|;ONP1M z9923UUXq81!otEh_1%RE!wSy!ZNrb0XWbk$8ohm+~NRPuukI~$8oqgcz=&>Ph?m+f{JUS5UhB&~>w;+f`B?a%&+-FU_? zlZ%;L1{;<`;P8gt)7Cf}l8V*2YYt?3xjle}du~CFc7&`PIB4_!$!bM`=j-?!&t^tW)zdQ(3y*yp9S2*RdB5w}(<5&CQzE0??l%l_YS0u;&4H6#z9^~daGUvq4+E5J zo6`vtJW5VZPTk~8Ory(nJXY;k&91Dh`VSAE#wSQ(cmOt@FcsB{RvHtn8%WueP@|f& z2C5uHU08+%&!>nxC0QD;O*VA+Yt$Qvg9Ae~f~k<2Xz^e00Vg5uD<}35#@ERH0le>@ z>BDTfvwpjr5tBLK3%@q|wV>seT5!qLiUmh55j`V(F-dppG+L=0p03sK>i({q z&G$q#fhu*G&!m*quxgI#{(!YzGT;cY*6g_+EpA@+?0jOPX4A`Iuuf z5-{P2cLNk-!I!77O4EZ==1jbf^+Ka(&5aSX-|*frG(i4NKYikInTPCtdE`{#T8Ze0 z@cBI_v8Dlok%WG#sNl4sO`JT>DIR#HjF5duWENs|Vkxllhv|d9Kcf&cA(RId>+;5(Qr5TxCQHBZNwNvW&H%X@ z9t^X0a5FISqOk4T50<0fr!Zv@1<^ksn$*~zWZh!+#Kuo;G*`dwp|&C!-I*x)sC6G_ zHQnH9zV`CZFH*yDgMPQ`U&j7L3zC{_=?mD!DUae6WyNudSFXf7{7#YwCLS?HI5$7Z z@sZEbr|^kM^~f74i43>#pv)j5*FZI+KW9E!+sCrUT<;6@oc63<(?-Y+do9@L_y_D! z)yBl~S=2`_%Ff|a^4j_xKtGu`hOSM!F12O`gkEk^-?cpZNrd8V)LcJ$PlxvT>?_iQ zw^~kKGAlG6&I4odlm!lQ8f_*UaZ6V_t*E=;@XQXk+IYKHMJm?(~Sl^ zqU%+9;T#uJ!qBkbtX!qfR_B=+zCJQFE@=-jAu;lDR z#&Z2JIZ3IWFhdLZaKZryEH8szOp3)FSTS#|=Yu;W63OGd`}1-;vF!295$3VWa$8Qj zo7C`pRr)+<{>~qPhdtVfzyQS^LALEKBDIViT`rhgmdNXJ2IR~jCqc)vCI?TE8EkmW z`GZp>vhA<*=7im@@;Tk6IPenonB44A(`-ZH0$C=OIPF_qze5lI-*c+a<&cYbC3|G%XqqG5z$XIAg{5Em8yZAsg=Ue z0>M(f2@otF)J=X65EnMgnkK!cD;=1;<_#`ed*qyOl4?@~j_T8^r>>nJbdnN*#p(Tu z4xfBA!OVW|x@ic8lCGRu--|4Fmu|MwZk1n>gG%9%e!?-7$W`_cLrVpLG}xNO`r`?; z7PCKpC>jSoBq-+C>l>;0$*CnDjo|c6YCQ+5I5V(wap|viM(vzz4t9&#bmM-dE_-qJ zEw=HgN_y9ZY2&>*+DFu!Fjqe_YbD})+>%l0a_pCEGF}EF%K)OP%#6{}mVx!8E(t=l z0kFTfi3si&504LA6q93_F;49x?lQ0Rv;e}dPZYA0sWA`pi;~_gz9BdMZ1Hwc&XQl} z^bHShl|}PIesi$!VXY@&J|u5feJFjtNH^Qg37uGjkc~GX08Rbj*!+oAtb5p=ie*10 zlFHNM{7$-2g1>wsygTzlp;!^U5utpT4}lwNJ9eYu02mhaZVY0P>yaYAXdC2BY5kDL zrt?EG(lOwL3e3IoVx<#%sbf{wVyuCTTpGh+EPjUpKV}{LuCxb+GR1zkJr=BDjFe16)I6cr670~K-?RDnDthYo^2Wv8MGI)!7X#~zkOR(IvPzT!-3y$)D=N`j#E+qd6sLU!e9FjtmSBF0I~jLj*ju^c;p(rzA01FmjmbitN9nwIz$4XA4RCW6=Hb)#{nyP zH~Cc|rq>!WPOV|M!9~`TP0gL7AHAxScv3UNN`Nv6z`v3jxl}){**$v(r|N=m_IGwP zc6N5&OO%zB-GqECCzm&OOL#jXH}O&3Bb)|dC=y`0$$4Z7u1hi+tEm}w%>cXR%SS3O zy>|YU8?o(Uk@rpMDn-yjN-=2L$HaO#M(SnnTVz7VsRz7k4r7p+2;+miPb6hgE?xwY zFI}0#qd(zlV*ndO)pycWUrPC>*AkU*7BD<)|{v>TwBd zZQf^1e<$*x=1_v_S)&K+{g!dw-1P8NUWlx@>T-D<5Fyk|rK5ZwGpFp~am{+1eNw1< z!~S9)o&jP)E2mx_Un_@{f^~&ysxUTJY|xW2gmkY1UKv~a&0gDP-w?tTT^V|_iHK2r zIXtD)C)fI`A=>ZQ>!(=;jKhS)-Iuu%iozX$K%hah*Jg>{+j1Osm@9Jy4OA2>L(zx| zIc=C*BLjRX0nMpLRceb0=P2=;TI%nskL97P2%BncL(DMrN$ilUKAwN20qz}Z6F{;$`%{MPPtlpv}4EyLFz8o;iriv3kZ<*~gdqp>-zS=TZ z2+u=Qj~~4q+Ei~sDJLj0W;~s;!x9F|nl+7_AIjP@h7jpJFb=HY3~5%xbRN;{!+}if z7s09w50nZ`s^o8t* zHNIk7#K%(8Jmg6&j=$xr^xBT*@JwqY_OZHYQ8#f|1%kiSQVYXJ?nc^Bd3NtDd7jDl?350ogKQ6x#!B$Pz& zyi3ye!VD21&(fsM5wXdEgq`L03x&I;1c^s2 zJP3QPjVYS%@%EhUL^)Rr*H}>`N-jO+!b@3<*JHcO7o}HIK;@-c-2EN)b1Uz@8M5Hd zmdN$Gioj`%obxrV|EPa&QCN#yRgd6(HCMTBMchl?{U#zeoRlvC-6;d;q`i}4sV?xB zh)w3q`wwP0qiC;5gXL}GzsI7RXppp}V^=$ZPp9tJd>A(FTC~EC#;r)y=c*ocm40$C zRu48VOZTpa&(@$&-<5H=jbj(yFVr-;dunek2UhG3NCKLYEXiNLcj@qLKlGZe|AEy* z`CxGsW+@W#h5?tTd3*D?7kgk8O#NXDSA>W;d+YJGr!~?t6odE{QTpLnQ1v# zjr8_uNBcPriQOY&w{lJod_GW6yFm@9I`WGSc7uG}3dwu$2NA7 zEQvT^2V!UNpaOG?zgvytyF%%p`rEI3E{>P0eOwJ4J1U9QF>l*0ac*ft=Ty>Pi9gFY z9XF47|3k%iy3!mMpC$6|K?~iCSi>pHXb~ySMK{YFTkSIB)rlhRG1eXY&#NF`{(pab z!hOqu6xXsgxBwaeGbX?m5Jm`i3j~M)6hMGJ!2f%42!NY^u!k-x5mNf+O+!^nrAi4A F@jvUfgZKad literal 0 HcmV?d00001 diff --git a/src/main/resources/change-header/revanced/drawable-xxhdpi/yt_wordmark_header_light.png b/src/main/resources/change-header/revanced/drawable-xxhdpi/yt_wordmark_header_light.png new file mode 100644 index 0000000000000000000000000000000000000000..43c273f4867de2aee233e1e45b5e61e2cc59610e GIT binary patch literal 7307 zcmbtZ_d6S2)K7$n9ea-uo0_%v9yMxJTh-LwqbRjWR8XY$s!@BCs9mG6XHja8qH2_q zDy8P@`~C;-^WGosbDr~@=bri8d+z7NnHuX-kg|{h000VoJuNc;0EoP$F%aOvwsz(lh`Dr|1;}w%9vOqShc4+0#(ehu z#OH00mzq5vPyBt^(o$vaepsd$;x+T2w(ExZk{>_2xJ~GPGVHY?C|+#DKgaER zV?y%N=oM5$M&9B%Yv+UP!oYL#b{kVTTs{n%3e+xI#Qe%GMU>95muB>+r+J(DrxF zct72Bi=@NRiCgemji9HZG_L>(`a!#cvS7Ka8fz=<(Ysnv^Ql%)Xx;K7Tr8HpDAk(| z671}Z3Oq*@LN$i0@RI(|+Ydgpb<>XLr>3S@S*T7?>r;!6WD{urBF4>Ifp@k=k;bCj zYAY7x@qFCkcd3vEqQwYI9Zkwo022ILV4m&`c)I|<-1(&~B6AYyL`CcJiBF(Q69Ti1 zN%UONmX>umN|!3ZObEJj_*mG2n@T2$FDj${;)y~+F19z;Hw_qcpz!8B%4%-2`E6B1 zUCG)vjo`_9T@fvjP>l{qHnqx8s?hH&-q_7_AA^U1$+Yp0vX~{AKfW~7i))u~yq@~P z5f0U5=zXDI^kcRC{p))-chx5wh}C~nYe0Ne5H*Fdu15C`3I;7Gd|G-(9t|;4!~#rI z%dk($_=$CQ4tS91_ZK`U6L>~~E67<|BK$873aIG{xKPmYUV5U$swG2%8|-3e@+I!g z+Tm)npi8xnzfWY+ssz^d(Xm={|NV!blDwCc(S>IOFq9l~6{qKUm5lWDRQQQ>>(a)K z4cbe{i8PxwE4h@9G`N=|{a=3G65ZV!-bs)>Njw!)1ML?zFxmOGOtY zt4x#4!X8uOc1Mrlak`>h{|O5jqnP-1eg_!&A0+Pu_(eKq&}op(IdwcD6hYR}%(^%~ za(Y;vOOdMGD@;NPL$wb51oqkeZts7?JU6$q1*{fQ;8c366x0T>Ht;5?nHsMjYcx}2 z)gd8H=KJq>mTF=&Sw7Y+CR_!}vPnPLS1M7*2prw4i*0w#eeZS_Sm6`NsSZOyGp%JK zU3Ma4&R=5tu=pfbA*rDDkflCu#0kZYeRlGFxZs(}2+vPYv<3uLi(Tx$(!OHfv)qbc zU}6B-cZE}>AU@P{vx&a>M$nr#z98( zrl7MOko?p70?zs6u;eYyV`*g@FIE!88&vOSSfw>KA`qvM}xe@*_1XwP4whDM(AMLKjy%@!tA)qgSLDzM6&}?VPh5Gg>*agp1 zoewes2g)8P=g=QD;1|lzM8osi9r<0(O$5N_?G*K<tm zH>p+U@vDE-dxCSBMa&k(ZlVo>;5H4<_U-T&>L#(zzIPV_%b9kz9t%*^nGN_XUU*OD zSd9N>jONX-j*nXOujgb^Rg_H45@_#ovV=Uhtb3F?r6GkoCv>o zHTimaHpG;saZ`HxEF2NXn_*WdgH#NEv70cIm?kXhAv#lK^&k`2tdq#Hd2nF-YpLaC zl;6)^#j{6p9Xk+_m3?)oy51Ttxa%j3ToU}Ygre|KJc_H^QL?5GhrKP10n^1hV z{=Lq%LfcBtTV9CNz`R6OSsFtvE!3S~?_E7Lr+K7ex^{j^oB)`56Z?XmQTHD2yGF2Egj_wedD|*7p9F=uf;=7N2jK(?s+4>xD@OU|G{NMP*N~>+X zV^Z%?()!Mhp1iz#-^T84<>TD%N@b8R2^A0RW@JF7B*Ikl9n+bHA4&5h{j4S>RF^-< za%0?eo5(cxZQl34goYyZbfBi)ZRJBNxAOOC?m?5MZJECQtkzeTmuMnn;3`-CMey?_ z)be`)diniNs7G@iDW^ALkDFgxC$Y)DJM2L6b+v`TAOTD=5OOy?I^?55_&WXrI@Hy$ zH$vX?J+Z+b4u=FbF=C;pod5NUQ2uqLxXg19Z{TYF;HN9ViuV|Yfa}p45GE4U9u+x??PrWN zk^d%HS)!-XqJG9;UtJ1P)?&c9YXr;DPZ6>XI7kIia2Y+k`xMJLe&s6WfOGKy3r`B) zEmSS(<&Xn0u5r~M9eiSG3Y|wZ#6!W4*W_#>d9WNQ-IVcBrA&m1aNgH@9jRFv6gB~3 z;LhL^?u=#i4s|5>Wu0ydq&%@(b>t`_JRzpEf!`=cOJuJ0NpY3s$+zbX?c13e1;=D( zd}QQqOhrtggbQliDuA|12+tZAb59Wm+=RzRu=PI#!nsL;>Z9|0Nc5soCylz*W;iOK zr+?^+1zHK69 z1{*1gKkjoEQn$j*NPt#WE`N*R4J=(U<{mV1OKY0B{K04>r|0E) zqz&Fv#@0#gWtJE(4No`U3?fVow(W37!Wgs;7rz&t6=Oi=a5>dQBqoQ%C z;!~*U>qCNK<=%pv90QTLx~Kf^d#dqCAS=x)84vn7>AHtK=Xzo1$FPjSWX^^L@|C+) z?j}35>XD-ra^eDxC3aY5JrtRqBVZHY+DInk=HmVU!y3Uwoyj|!*G67~OvPu6*x~hJ zqy0HnL2bU##A+>iR3ZeyzD1)26mhGDYAWOQudT>`&eavj z1~tIpaL6HrZ-EvW_iTdO;|cw@_>z9RSiyM+kfo zsWm?;Kv+_Iqvo3)u{yyen-HZnwq_%x0x2mjJxYkWA4>LoiXk7cyUE;`;_JP}fHD41 zC^0l#&O&-yS8{Uxg41HbvJ^WXRg;mPRK?@?Cm;P?i%bABgT-a8OvlbTo|l{?UbHa< ze@;(tMpO0YGp1W}zoF{r&-wcH5>^nVL)QIkcQ9x^t_(_@^B86k2{jB_S8`j2E|bY2 zuL%1ZEE&xZVJ|WC#&=;WtQB0+Flw6b$9zbL8BbCZTq~tn2AU0B2E{@9XbO zuHk1;tjz>9~=|EC= zT{Nz=asm*i2dpmv#AOkgWrN{%%yb!gaZ!RqtEe6`GUMNTpIt@3V$WU=Np5;N(ESn_ zKQ~TvSf)CsS*3BkVCG7yMpzC7e$VbR`0z_j#0oROIwbE*OyLl^Iw5bOZ5eH!AqC2e zp!m7)3nJ0vCUf^3z)DZAEyA=sJUeR@R2Q~)M;e;x5V=wRTDo?L?C^88RIK%QfvQRR zwRK8Q#j?Vs;Z81ol0Lb+5R>1(#(oAy+w;+7nBf&M=rB{#k}0<5bmTN5%``|uiM1ah z7_>Mvfr1>_Nwlb})oT}WPmrSjHkwVRxk6%=qJRxOpzUggZw7+wpVa+#_$F|rbvKaS z8S@nA8w&e=aYAh)duX?olfpLrOF&|FHXu<2X9q2BaGszUt$EmRbo=}1A^23@n$`QY zN*jd_eyb25AS|3nO)>0d=TO8ACodOw1HNZ*?)>3~~Xl}xYiS$67h zPW+goJf$lFB+?Jh=g0v)pVnXZt%1jHd7Cn9I$$3%f*4Qr3jz+p^Rk32t8yJM>?)yh z^#}|AO+hVV+j`$95!FBOgK&*};hFf|wd5BN1u97sAq zjpl)DI^De_C4f^TOjvqt+N!E|$$)|QY`~Mv;Ms<jDaCvgVhmIy zpryC2JsK#J#h^8XIE#OQ+{`GIxR^6~wdw!d`B^0b=8Rf)Ac#97C3WJ$pczS>B{GTS zoNKAfNo&C zqW(S4+~!-|xw78*vaJnTy1I<#e(f)Qac2}nTrZR;76jn)V8@A1tp~zx--As%{8LD3 zy$?(Fkjfe_NKZ>lAWQC=Ik6@!`gb0^h0#Ou@x37Z16F~of=I0zfc@q-HNGjxk+Td2 zt^AWLmze<+(o&yv|93gsb^hyM3DQ$X2VB2DU;jO#V9VE!2i4#lz26T1jr!0sicCV~@C~zpD#z`iMzocQLVnd3TGkOf|$b^@OkAkaN+x zRu)3v6O}SMHuvLLq%b_+lg%yare8i<;?45Mp8Wk=cIg{%wHIIcE#gMGet)TDVl#xB zc+i9Pe1HdW?RD#7pB;wq`OzIr-2N<?p(jxA^i4bA?wFk z?^aJwn~Si1{>an{9$$cdITQiLoTwP5C#udxw$G_Qdc-nQ`y|(E<)gL;E#E!ymv24< zaA?&$?YYR~R%}`4yv=Z8e_=`A6ycoXo#W>G2%g!JN-+sUdSr^vgWh1B0zIVzIokmT zxNwk7U%WaxDV6LOPG^skS0Z*B_xmYSy$9&4Yy}iCoM} zw~k&S((BV?&i#2zNK>!YjnLDsVd|h-P*~Oqr{y5%4jV$z;gJS0%Ow-D^WQ{75#UzM zhwOY?j*-hj1lgzAQG10)u(0GGC@LjgwO>jDS)ptFhyvLi#*7#;#+(l2bnFuAIm)`A z_0`xCC7AwL09?xZ!t0}uy-$tk?~d#H*{QD=>CgH<5j5Z!g(8>lrM7z9rPb?8j;!c< zx<+MIA3etXfV_mC$q5P4bEJXB%5F|r#i>r;-&*|=ODf{sMM?wbOMagsN7k77(h56R zlK>noee0K8=d3~3oUeO2xCqM*-53dAKV@lih|z2>b)?MesDr3}@)a%(|q6>Yt=n(14P^ zX^TD37N}f1-}g*!c>j$!{0uoQIG#`Cjg2aTFe1%-tOiyI++jeaBA&k9U@nqrZSdDl zHJavbC_csn#xUhL4hj4onwc~_FKb8lHOdY_l#Xl1^(182O)iF?Qj^GnFJN0K=`yNh5GS(03bc>J^G<#%o=;JGdso@}RO)SuL*+gyz-R}L;EdqXj zN(Pg9y581ze%4#W;~%M)MG+Vo?<0ZOg~;pV{Jy4i4p=Bx)4|i?r_{T*KfiL$csnlV zdw99hk1b*Xz#Jy^tE`Zo(%y^w3F5zBD=8^eSXNs_7^YKj{=d zeVw0tmWg)VyPHITaVm}v5G7^v(b@qW&W{lzCN;L-jt>BQwMImQvegtG5?Tpmz78iX zQDevC>fqV*keq8))S}>i7`q-nt(x&hz_RlNBav`&28!HJVp1?)d2WS_-8VaufViNr zYQ|%%imCC12|V;gRG8_awYW=RphOVa2e{LdN5hx>`bZD1bX%M$mZ0e&8GKsaG{=Ra zz?V5KnpGRigtb=xFz{(RbCN2pPcxR{pKMQTA-ojvX5dizws~))%950Z?~+RV0+r<$ z!78j8U__Miu+SHWt4reRE{*g|jbFkvFXI%v5K{~?Ai+j(PUI{cFf2{-wU5|~U^tD4 z#FQNK&XQcta}iWBY2`xhcEm6isjEhMNxD)bS78Ld1jDEOvVgQA{ajC#Xs`c#!@OaF z!sK?jXI%Fk82WL7p?B7$$o7%WaHP6$2^l;-h&FBOiQXmzQ0huq>0`aQwP+{@HZPLc zNk4_%FIy~>@$M0qgFiRAVD^YrkFhB@5S_{olv{G=i{BwIn1aw~pGBt7frzt+oMDeQ z5C1_z!JpNWJ3zkJ3_s*G%OwP8%5tnHkA8LUjqbarIBKTML$kE^dQU@;|N6%x3=oq; z33N*5nM&;6=j>>#W^Tc%in%G)f|GcBw(^G63IS4H!yx*uG?KxTb);97_eY^hW8{`8 zeLS+Ql;G>g9Mwz_Ig=vi=H3k$4`Wj7FLLWT^f$_u$`kdCvkevq8oO!mqr%pE-e-zD zZJ<}0ZI)MPw!3?Q--8sfaoZb~tM8Tw9?4nK zW{8av0Z!VhD(rzfb^N_V()e2dn5=eT&HBlTec5kws&b1uaP?+YIuze*X+X<_iiII0TW8?17r zFZ;a9z!lhQ^;w5V^dyP~`?c=Fp`9qm^)Ic7IZ7J>>$?ZlH%?7`(Nhp2YP5&bk$ou? zM2P-(LT2w*D*A~%^Je*iP8|ZXlA!04X%jS+T0iZ~$T&gRS3M?=vZ1`Vk>C7D;j3Lo z;n3`EOKj7fP+)p%ul0Zpm#ft_&xo(8C-c{jz$E^WeK0XUBVPheSem-g@#ZaNZn*;t zm%p00|DX7vLj``5WPoE6v}oE?!3%+4SV=7R`oH}CrVNp5?g3itDmUhCtYoEewr&2>9EZ0AXJmy5>} zX+R`6#rfXzTAE7)d}{NfWt;fg#o^E|hSU`gq&LJdYglNinak4~XX>gP|BCoAd=+Sp zGPy`+z4`m$Xhx z6(iU4w5eZGbg5Nt@#x#phkdEm?C@8q1aC1X9K_2sJUYY+1T!! zHvl3YD)c!8MpbPbns3d!urhLF&~@T-Y;0djX`kI<>p{$q(w2(RoEQBB_NQR+6EAt5 zusun=tYeT~e10s%kO<|XtA+?wIny`qe&7MTY4w1ZF=$qVlWRFQMTMS)6jtSvZYw;P z7T<;{|M>+q|8YgPu6PS<2b^V%G1Pku<$kOF>C7(u*E2?Vc(MVw!5`jYY=PIxJ@FKd zhunsa#GXXM3;p>}a7(A_BKgDCH|1B?qKMGYCEn?PS|t|M-KD0K6vkEbi0kP)G!%xy zaAnf`Xl~VIRQe*o{&%b8h~()V!;A``tZFMC)=WbeOmf>KI6p%( zJB~91>J$}~I(8W1A?zBECxK+T<#VcZZ>Q<$vRAsb9a}zd*WPtWME{NS z!2cd6+db7K2XcV`4uD8<00sz<1gL=lLjV9X;Qz}+G6R7ABD;pG)OvIOY17v>)~eM& GME?&vVM=WP literal 0 HcmV?d00001 diff --git a/src/main/resources/change-header/revanced/drawable-xxxhdpi/yt_wordmark_header_dark.png b/src/main/resources/change-header/revanced/drawable-xxxhdpi/yt_wordmark_header_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..59a8783e681116b1f73f72d1e0712d40005f4dbd GIT binary patch literal 9726 zcmc(F^;cBi7wAaC5JSU&z$o1y(m6EJCEXp;-7%naN=hg(beD9uASKe>4bt)E^L>BA zTkrmG*FEd*v+L}<`+iYXmc_vWV*vmF9C??Eo-6L*` zmzyFxg4;Yj<%f)Eg0``h9e@(_lH^#K5vLz|(!sk@E6Ch1vA@Tse_=O&e$# zS*h)Y8b-bud^v-;Fa=oa?Q7?fV-5SP9yUB(PiR`==$P)gunZ#hJd-NFAPw+Mt+uHy zn?pTr;VPmVz4!LhrDX?CeROfh_v@#>Fn>|-8&!4Ym?PjnM*rb6`N{pqsFeC*;}8?5 z9B6B#l(V*d>+?QK5Kov(Es?yR3jtT+rd+qPwI9_mxT*Xt}9Yn;orBUqoGnq;i9ec@*KyLcnWaAl^u_Df} z(r&sY0&iR8nn32tk82r~r#tgeL4r+KpLBicrTD>ew^ZUQW~?)NXuQbvyru2-YPK1& zBs`b{_wb+O9LAbe+-FbGSPjk)u$=l;^t6Ff1 z>KBh`u zygYjw^yprvL9~JEold%ZQ!vc|#o`p+-wnAHm-$EdkN*BlRbe65{o{qv+Z}wLei?73 z7#>r$5+Jz8sfA;;KKSc)zM%nX$OzK;17!a^Y$e>bz^zto(>uK7`I zrhr4Hto7av8vw}b0BdrY&x*Xm1AlzH`CbujAY#2NwK>xcZ&}kta-A+!qZyyVDIj&| zckcju(XroIlLej8{%2nYKe~yyC6>J=T`qkGFXaojN|{aZ_mNUU*O{Ga*d%RpT~NPO z%^?@1GDMcNTDc%-iI=0P^`SUEUlGo|@ue?0q6GHJY6Kg*4>-fXl+TYilxuLWMSUD*5_CFm54=sWn-t2-)~C4EIv2#l7P`o{o6h+whs^ ze+q~yPo~a45!$s;7kJ&|RB7JX@OeWoQYfKG!$TJ3ZNH${Ng~Y(CR3?du86#FwdpA$PjBziUa`Aj258V zKUf{tf91!eccRPZo>n-RuWxq~_oeg5i)z%LOSU&|)SLTubmy&%GWZJ}A+skY>7H-X zqJwUbtMLdg!GgoG`0H>Ep`(Tm5}aBKQNs;l(nYB+SL!#u3FegumMl`s5gysW`RVzl zRiiO^l2;!ShJuz$6$M&RP?;Uh8g5XzG_&&W;rfUGu2t~#@0;%xQfHR8X$=7G>qq>= zmX@)4={fvNB@MT2iamg$#54{;B+Kcq5va%1Z*kAD;U7k5sv9F@1$%Ukgs@^G|+0`r=BHfdxVg9{5E)ul*>KvG8Gu?&lmg zznh6G6#g0&r%~LgPgb}|U=0?~^h0UPD`)~gFeH(qQV6% z5}IvBx$cmw+jHFs@4Vel7#km_i|m!KHXBZ&v*w7#!!D|dW!cl8R%p8IX^w$r){FSP5EB!- z)7#nE4ViGt>6PVHiH$2((3{3H(51fglC?&(a0xp=oMo^FE$j-0taX=;cXoAy=r@+k z;(Uk!tSD2XnAAdkfpho-wWWR^o^>w^U3Pge3QNE>XMq769K$p+v+_RZ|(xns= znhKspkBGBKSP?&bM`1Jit|*~OZ}xPn^dRFAj0 zU(utg?nYlnN3Q2~JI$DphDQ9tm$(9I|G+ZC7x-L8=|)%s3<)z&+c*8hdPDjJ7&%7$ z;p{}~*&(3R!Zt-DkT&rCq#JpA$bzu&+FaG z%k2usY$r3Q3NBtwAsZ<(h6z|-w|+f{h(tc}foki7TC)OjmR1FF&2Ofx(EqOfI{B3? zCnqAs9d+0lX>nQO+2@={aR%8D9lv7p8h*X1aS)20n z_~%p3(GQ?ZwC4J22~5SoiR#R|qy)8bT zFlSYxHkiep6-AUJe*x>9IA0oPf8nz5+jBa1S3w;NgQ;e_7Y3QeWhU9C)#Nv&C$tm5 zR}DP0TO0&)oii|J^cA`*+ zbj)IcE)WKKeZMq+hCNxKfMG7Nqzkd~4z_||Gv5%)8Fx3-L~DBTw}_1UJVUIV=4WmG zl9m^&H%`=YD^R(+Hih4I7t4F87wzd<3M)mRl=n;b7&tiZD}7A-XD8j(-}{0GC~b(i zo9V-gVi-|U4KjB=!OEOjKCq4HErqdgjyhvxElAQ4LlkHFP@6Lfo5#DM&Pdcv% zY&+e<4k6=EN&)-6LETtff zz|^fsRib!{=5OSnsJR~2R)~WhTHRxw^Lt%TXKyt2EF+514i?rTEAr)<^hyK2hBKaL z_wnPGC=l->dM@;BH*_syZ=mXwdg(m4?Gxx@X^ZRjc=h|2-HBX|*t@5jRm2kNq z^Bzu?b?`^{X31@eY$SwLx7H%!^=@+8zsa;FV2nBSw8f4Zh7!3NMno6uaMbi=i!-j# zj#K~NXa-QQt{_xr28G!ckQgU%CRiuTf^uJinh$4BTDPoZ5{={rQ%TvMSFB9RAu5qd zjj__Q0HHwUs_3ZnZ|g$HmByV$V7G%Ars2cTl4}&Q;luEWhUJ_hiE@P@Oup@hC6WZO zr>kThD?|n*56nK+52T4TU){-Qnvk#=`3$X|?hbfJ>sE*}Vb;s%EzRRXGX-kaQ9`?| zIY+rMqIY^&gVu4AnYMt{NuAXcrzTuq-@ekmz&p9j13ku>^H-cZubKfDRf0?}!*hb) z-r{>+h)M}Ytwr^(=34HB(8HrZQtKX%fZ1?89pOEs@-1#{Go<@G4tn!FM?Uv@Ezc43>nB z{qB)ppC?cfJlGL1Ryqp$Da?+d<^GcR4vsgQErX0f=yBG*;hhr7$)$Wwz1B)Yv|Mx> zwT%8VT8g}ugw2^j3XElrsX0AX2t7lW`5_KA*G7BCmc#n2ZqRJQSZ;xO@CH3xf-0s# z$0SK9=foI&c5L7+Xup|)11i{DxBC)iN5C~(pt;jqY65ZA{ezo3a&jK25e~zhSR33nxDKegOtFUSlW=(bF^@`9S)}_ia>wNwROcJED zvtRcChJvpXWg6_RZ~BLmcF{ilEXBjbl>hh5tPSUP)l)}`-&ug}TJaeU3u~jzZ|F*T zb2Gm&rFr|$WcAp9NY7RzgtD1Yv|P}bG4nuDf;piI>>FGd(P+%iO?8s#w|f6Netx$m z{-f+Y34H~Q2*Bt{e+443&=Ovu!zB%MI)@JsEC?R**M}(}+1Q?cc}P|r-UZouQ!r;Z zx}kQXppUEq;6)rsYb!jqcPJDN(}V0MO&|=wz%$o_@|r7to6LyJd|$Q8*#UDYc~V7 zA@j@Qt>dLC*WB~?PNSF&(`C2+bk~Yx<+IZLhgIvV96MGjcIafv>_8~D%DP9oWqTNm zrrXNJ7A2MP9a9`L!?FcYaP_(f*(EYbJ{whJGYkW65wVzMUwG-ZBbBs)DzAo-6^9NC z>4hG~;oAP$PUp!3xu1<=)+uIiUyP)(Or^^w&!lPPyt9tu+3A4+YgO~19ReK(5M+&5 zk!Mn1_a_+3_T#-15+gZgUAacKUOPseqWjr;Ll21E2jnqHQCCga*{$Fypo3u)QVogR z(8DE#e1c#z|HU+&p4N$5VMNQ{Lzpygc*H7?)f8BgE*EO!O{arFIWYXgX0dXxP%RZK z;_upnvJ&(XV2fRa$6Ud#Qy`a^r7hzB^zToAhXcga9AS!C?71H>3`LnyKB^h*=W{mr z$KrtF%9Q?<8E!NuhV1<8txAY$f>Bwo$JSgqH5P~Zc;(El z91*_)E_6I9#hV9V9!7-S+uM%ST8{dA8F)~1CfObR5Oh!ppWF_ECd530qO7`9T8z(A zN2SsW`TE%0LlsIT=T#{$U5M|`D?!3YrqclU)~nAv{@AHRp=Xod&NN7%1?z5sEuA5^a|0q{ zg=ZQULj15+D(EKlgt3FLNg8T^3(oy{2WTs}x&)|sK_dm`)#r%K@y5uJ-t@_-$b>1* zI?7>@AVo?yuDUlUO(b9Zj7W^;KBFxO?C0 zp9LA%O|}(Yy=UG@iWG||iktCzc33Pf9Sr0@1^Yf~VGuxg`s_$T+f|2;K~y7nV%z4Q zd5*#qYN0ki$yiZvqd(uR74x<$4jW;iVt81`dy~%7mG)Xu9HsM`CrU z_yFJFEaoL;gTS>Y)))pLDgiI!!<-$*O ze?-G4w+4EosG)SSiKso_>CQAxV5;s*JIsO6L`@_e6i_vlJ$n4yO(kqu6#5rZ;?SZ@ z*cu^x>x*LGs0q6iSlj0cdmt!u0@R$RoV*XzyAfcE#Ud>`8PyGKaoa6wtrXWgBvH%} z{+l+aUh4m@Hyt@YHizO>{%~wzwA&_FbBeO(`=7ids-e?YEQMB48)zZ}OjC>JS@%)C z3MYMd)tRej^u9k9*m63kv%g?<`yaMG`@9iCimDpl@zNLEY*G!Pu%o*}WN=hSY>~Uu z@=ZMtvvEU(v2u113mz`DsPOjX{&ewbeXS{?>1<_6ceHi%Mhr&7gTnzrLP)E8C@Ri#v$A=_$7O4&_8)CdXK>K^Zr{>_LPvl<)`= zL_rpM;1MZIwYXalbLd4c{jF&F$pcAiK8vQJ9gl?FU~h5LhV0U+l*?)M$t2hVQVZR4 zEddcp5ok^g6*dgth~LH>%=L3X#n>DP<{o$zDY>xNRr? zZWl`%;Bq3mS@8nlI=eOXdgUdxgGiR5S*Y4N4Q2`>yAk!2HH5}_0LCR;*qj!iO@ZeW z@a+p$$bsJD@DR|n*PnI+W9K_?gz0ewJ48WSay|veGC_J%H`1ct@dtHi^}b0psJXys z)Tea=%^wnrMO3-AsP4Qqgl|iN73vi9OkhbtHUP$Oygm>DDLdDIQpCA63D8Wt72sRQ zu`tEJel3SS8lp&NaTHB;%EG*)L=Z{#$7P4%@8E=tA`qZ8FR2hjA`%sppv`VdY9wO- zM$HFl5{N5dQ23Jb8e~RWpHa)I%-uHuSWvu#+|}eZZ6(dnb5do9?L5zqF&lzjo~KxA zYHB*3?#d$Lxntg|wm;8DAULT20Y)pFJbx6hX%gC->%AZsq*ieu<2UP@6SoAJe9b3A zO--q9jy4q!Xfd+XtzjV~34JC}Zd0mXf!B2OpFx0~qQ$X2FQlIo-!z&rDhS1^pU9l4ibdBx<|eh`!J!7xu1p3OX^fJRlz+!-&^+CF^0TBtbG^)2w~f6DnGr z)PNy*t-thUF9ropFK?c;?wwAjTcg;HZTfqnlz|-eFBb*31_{#IdpLdY9UPDtQR_`w zDh~~Dw{q+VwtMbl+)~-K&Vt$FmaE&;la=1RQX=})(1t_Kib929d*9>6B}q`AHtXB# z?`Otl_|ttP6L}z8EXat2RcEqE%uBA06vrHUCMtajw}**}D6~{n$s-z%=XJ#F{oXyaE}WTcQR=xx(lxMCE>NnYtQ+md}mxK!5;kJ zS^ro=oyg-`V(sMe=0YDTgNRhhex7<6!ulQ)|8SNBggYlLunjH~{ylZ3vD!4Z#+9xc8pQXOu8G3{cBT#zK|JzACQuZ8R}G?28|+zZ z^Wd?XPn&{YX|O%{g>DNVx_|poG#v0_nM^D=V&bV--A1K%9!W)Z!U%7jHXciYOj85D zC)5+8tBe+c4V`x0vnmuVOeztD zD^2uNP)-!U)~Jp`NHZ`^yTkZ#Ib5;vBz01Nt57k7=GtWpwZBDEou~3Jt8u;YR{x_Z zT2N=I7;@%$nhkT#jD+QJAzars3-7=%Our?{6ND>>+yHk;>=jf5CNc};L+B@$lLhHIQSF2x&ey#NI)g?z*hPL}T> zv-rJqYr{>j?rycFjG@#*nPb}$(T5-tPT z;PW=Xc$1%Gkus@sYfbPR{^@x@Y6-X=x=@{E1j6;k7RpO@+XKA9XGLKGuaRXBQE3J{ z%lV*N14T8AjJthZTCl%SO5;2t-c!Me?>3s@zgOjcSRr4JF8KgaRnADZSu|xt-(7{f zu%0)R&$%nmh65{&wQ}E`M}}oR91RMfR!P_leM#iUExW@aJjV!+uH9hCu7kw)X0dz7 zgvP!(GXQJ!c{sDbUW6#RYm$W-)9~-^;&!u03 zmN@(gHQvx@i#v4S!tk1@J6%e!qKW87}RgJ<~kZ?OevLQ_QI zuG8bj`6Eu9agEnObL+bGw=YM_<|dc6B&cUE3yr#2YR8|zKL+d<%N;8nPvibA@Y++D zyJrfi2$ojR?)Fv21aYQi*cC#l^>oKwq(E~94AfuR}5#zPC=2O+AonZCrWMGeWUE`Wnw+fzWp zB>zoQHZ!HjH2djKyc-RY@mFCx;}OYJ+Jr(TvJ=Dqz}}ZTJv!x17x4a8J=hYgU1w4Q z$T*)F$sDAhfm=AL;1|YRORE1DFkWRNQj%9>xlrD|D4!^jIsx`WEUHVWe7P`8+IA}k z>ElaT#JUV(kjU8_0*i9j-+$IeKDZ(QD|oJvJPk!zUs!haFa;BRN#$`BGi~MQpx2}g zNd3PXhVrEoQT2RW3zfh9hDySY+byOFyOw_ETA({k548{Bu7KC%lLN?c0RR(LG@)k3 z?4#!wy(FEyKMybk3>z~ ziryiOvSFD#?hI~|Lvp34t9v!S$x|6Jwfe|)gn;yBXRq2eg0B56t=^T?E=K&Oj$qH% zkA0j4c771H#A2$`liB`g!IQvP#QN=j@a9AiVe?ULBJzI)BeoR%PUFV=eq!}JKe^AI zs2A0{243PabaT|o2&G6)E%^}x#S+dOPPKmhg8f-R%TGeFw4&ayv2RGRyQVNCI{Bp2 zDIHxpc`x)^e1Uar#AuaMONKatG=~@>-||qzT@@yyzEz*ZSd`xJfDG(y*X~-%Y14l6 zJX@n?dCMYN1>_-L!RAB!Z~~Aa9TE}l6}H)}dp+`q3y!A!M$ml0pQ~x_-vj0w^C`QP{z59N$;LwQ?OUPEZ`$0MRn^W7f`Yi!7((2p6 z1RNsYTP!6WAr`EvvmX~J{}YQshMJR+_eO(?CFt@qPjLv5wBaT}@e0J$05e12o?Q?B zwx*r*{D&(O>r;1lor2qe`@NzV?(!8^1Y*>h&X$aMK$5Zfy85BT)5nEWiQf5?%k}GV zA+?bA#Gw+_eHO}?0n)IRM|vpUw_hdd}> z4So1&%iNcdy47$pvBkKeuu}=STBg<=e^f)V^0XLEPDr+3@Ns%%kax8!<_YV-zCHDA z)B+__4?4TyAT(wX1~iY>Mm-XlqUYFu<70bM|GAE3IOyixR?U4AtsEmmp!>;Mp}+OM zvK47dDIQ*+QgeBz@Sn#Vr0dr|s+TftU#N9m(C?1D%ZHV+DlMDu5PoBF0bCp0VQS}l zdALxiWk$EK6sac)w_4i2S-Aa^{0aZ>^Z!)1x^f4&@|q-Mq--j+s^ z#NVmB+q#+f@EE?KbRVh2y%dTNne0ir`ZsMr3h76pUiLz<^`;v+YaLUJ(+udAg*$Nf&Mr*Eqxc@91=} zs>1~k0W2+C_=AyVTt5*9-&p&IM_c!JU;zBqAizR{tkqttPK?bW;>*o zPdccMI7vCxyr{g8&GKi**H{|ph^a3RA0lAvZ03b^-E>+rLQFnOY3pO_SBBW7O4#!T zd$WEzVJj}AxZ?mKow%6WDbCsJ?`YcxT^?CmXUuPO-v*Vf-X_oy&Yf(ZN%}3W%xq7H zcH9%J;Qc7EZ+-i`zUG2pwK^f*x7NSoU9!8#dto;?!7N}{pl5E?<=`EXZZMO(={h3# zV%Q-j+1vkq8H=O zJh~>h>iEXYX6@#058UzxtS9VOtUWl!Eu_A8@KQ3&DV=^yF-P(cPeWY|R;k5KGdTR> zM~kx%a6u|fw2XCxyEJbgY?P|q5_VgG=-MGbBb#E$p|G=5tu4curlCCuz6}UI%;Hn-<25eT{aQgcjp(7yL&O@K4-r? zOtnN(B!raKgzZ`F+F@n8z3Q!__pz`!YZSx_Vf-rROU91s@8pDJXbyGcWYFVTKApvR z0TJKyd~VXshFYo7yQ@fx7?FX-Z^U+|DnS8_t~<){s3<7%j=i8P$dvoBRsM)zzCfD# z`@D^3Z9fE)lb9lt?5-KsCDL<3mESE8xf(Df6p%b-cZjD;bX|3%&vbnI`42t%)WDBx z?Bv6AU-)BG#f!O0nPaz?JBXXod6r6(&E~wLFnhc!*OP7I?5T}#mXBh+?o3pIi zM{fE5p;W8e!^t`9xYLgt;@9o{TT61;_HIZ*lfb>vfOHpBLt5Hbv1Q4_fA=yifRMa7I5c-EDo)^tJw;U z_A5_E{e5a&Z|VQxbgt9$ib+;jbf=p0Y1nUs-{MeJld)qWkteV>-U2qgVJ$Qu9thS24tu6i@d~z#|1ScXC@( zw>fWu+|Z~nhj#ci5|V~nS)xDt#VWeW+U|ZfM$CSlGfBytE<~X-k1Ga=f0I`%N7G|T z9V@bKs{YeJ#4>r}c0=2Sq7BEgS;g^MQG3<~Q}&@BBIdeafI$|`L;I;@+)ihs%H#Y%;O?@ZC5vj_2^eS$;*BLNaNAi>4G^L;kh7o0)q&ulpcF8B z`XRKl&|}`8g?NDvOfXd|cFf-E(8paHmemtf$k^)+>cj@n=^3=n&Vwg^umA?B3`8)8Wj)e!W4>W!XIH*A)@k z6?v)1QU0x?gUbswK;49a9k!^%Ou)jQo*SQky3=c{8YuNC%MmADk&%i^3oWMEHsuF_ zZTx}!k^D&>Jvx51?CTjo_kz>E~F&clnCXR@Mq3M?>X=o27PiCyZjWgrl?(MLxAO}kG8{z*9ydg%q z_UuR7w#gO|@lXDg@p{Pt?&}_SIrww=prOjl!-w_e(zJh*nq5L*=6qJTtc$lPy8Zrn zwKB?vsXZC(*++)DhQPxBl2@(N4%xLiylLhw{b!m-?*$N=0xqYbL=V?AjRAoi8`MD- zSUfJLLE@*wY!+@VzeM@f;R-gTOxU5_>1lVx$sTl5rA~fH$kCfWKE?U>b$vJ5xr9tC zPqf*;~ZVyHg;`h;Z{VHmXIQ~kXqTDK_i$-Rg**T9rS z4&`kgPA8Sie^J;R;>SH#7aBSeB0x1Pdfvpc&%jtt9^s;F*B@Sx(AmeD@ld89Q$xtT zSRy%ik#CM=7GnaInDjtD1`Xygfu|{)@h<;@_J~zy0*olz{<6j^s318PCI~S$9*?Za zhk=!E@1cGl2b;ZkD?;h@uo7hsqpz1T8X1}d80elEp%L)NE!fol9bY`y(*)HR?0tL9 zicJm`yA;_q+2!)CjV|YnQpm5Mj#?WkCV(P2lVKkCvxr_&WBbGsez~c4_wp(W4n{e> zxL}l%gA=r}M#M9UGq*D^5mHXCw@2bpNvgEP()ARI`a+cZV&o&yIfPV^e~Y%F_&Y2_vP_JYaCh z!otE{_Q7h;)8Zmp?(!bLkyuwDSK{DshoLK-$kF1ivyDxG^W?&UA{Y!7sF|KH1v*CA zfK3y4rT>aMKXn?|ZvL3SAIzV3)`_`ij}ceA_nF~}Zgb*K7QupsqeNXP&bP2#qG4yI zxH&!=xLH{-VW0J3(j_)Fy4^X7sn(uD3uSo5_G0A4+#T-RhPO{I86`4q&UP0&SG>oX zEtYpF>ZYTpljWVsp!ddhYe(w_!u#QFBZ0gTFNt1cxI{yj{Gm$ZFL54EAf=rd?W_Z0d=t zokE^ZCO(KA_b^z0DV`V2TF<}9ITLA7%5MMe|L&-(|9WSlb^hQjLSLpCcx}qpYVzin z6zEzVBi)Wb)W2D5`sOR~U<`R3(A)OTWc6=Z^T(IGqE6qZd$y_J#%7JKC>yKH6K5T4r>!VW^1&&TK*Ur0Xec@#nT+`%_W@0UWA2}khA+c zm~;cn%Q#h~LFWS{S!L9Lc|C;0gXHxB#+}~by-H?-8K0&^96>ej2t8d60Q1EPB-luZ z?2dL{?t7#kHqd2FK6GC%J*{NCHkZl9CFjKA5)kq1bbOAN(tF}GYoh0NUA-m&9xug} z>65GHNu5A_Z-PDZ0$;Qqjn3pvRw3UA16mP1v6UuvQGs}Du@J2U;YgoZwdBInLfE!9 z>cBWqw}_hriuoGgY|eWL-V8eY#`7jVtqn(YnBnXa}K}Cc_Z1 zhVLKGAwPh@KA^N0j&G>NHJPzj6 z(WWZ3+2FGb6pMk)Htk~!)c)vTY(<{6tN?eR-0vq_O9^eR_DvG5Fcj46kO zQC>1RFcbADPKb)Fx-;U?T+}J$B)4@-(dIm3Gd$P}Bg_j^hN={OC-B#~T;{Sv3%i10 z(QwKhtIwnO-=trc!KXf`>+@7j$@Z1R5 zwkHv?0KDvJ17zO4vzvW0uFCIjsI2!9oBC>JeSoUhTEi3s#dPQxrAasgW_MO?)(%Yz zVPc!{#g_8Q^gUpuVF=+j_}oY9>tS7*(+*-RoAQAPaz<9TuZ4CL{m~kJ(7~XYDc=ZS z!?+>o*GyBZ)YFzh^Q{hu8O!$(iyA_pjh_}WOHXi(1y&oKo&z+@)3wpPJEil-ZU^9mqz{sfIn%9p zL~c=hOSQ}7*~WDoeVY9kWYlzXG5fK^Y$&=tU$@33{S7=-Jo_2xUd6SKMuWrl(nsAY z9S&i?%W50mfZKB^(O;EI?IxXPFvrtD|7+z}u~NWi>Mk@|lUVw|$n$W;TPf)GZyXrT z6_1vZA*>-?z{ng)##wSS6YO&<>OslS!Xz_2EXa4lwiSuYEX;Npq+s!fD>tU{vwS}$ zUfSvxI-!A{KYukpKVLLDUMPL$&n(cCP=DYYlC_ebvpYMI#jn&kI97 z?|b8i7HcW8ULF7Uj6YTzTX=mZFdvR~IzT866FBZXQ!S*k-fiv8jqOdlD#>na zzsdA0h-}P^veX0x!|avL%f%3>wGwN1++$#cD5G5Co*eFj3?&^MSBQeV{P(lmdcTDq zpxXLpDpsHJ@9f|0-W&y^K9iv`W(OH_v!8D|%x<7h#0TsaZ(FbP{`e!MMqXr6dz;py zNKnWMWyD#16)(pD7-kp>3a$&Yi)K}A$S&)UPl1k&6X??SXbp)1WgQ(}0eVc|yxQiq z^5Djt7r`CZ#!CByK`X~6#cHETK;l7`aX{~U6-1zZ&g1k>vK{BW6#LTr*^?y5($qIm zLmze6krQC->v^N$TXyu5lt#EC@qLPfuWyGgwCGiLOfnHKv$3Z&zxKzRG0t z+t0LZP<-GE;2E3qQqWID&sR_-gZ{0jD>4y+TE3O((-k4ltth>w*g%Tj1w`j4$hrlh z(~#mwcJz}vV3zN^hCyuwKv2G+x7-Gsbg&{O952kk@slrRJkS#MZYWDu^u4RNObA_Q z0rM0X=SV$68_^mM_lWZV?do<)nP_G-20A7c4KY? zV|c8j-Qfk&zOtfef1>HNJ#N0B-9`4UoAgsu9JehcIofPc@PT$^s#quRgCjhhM zjgESu6#C80ZoX``;EMNV(J{aM8uLf8_|jCG5t7eN- z-q`+34V!}@!$RzH{-6AC@)?(MKztCu%aPikVq5_mEA3@87mX3_XMHs64G35x80(c+WUbvsh(2;m{PZ)U7#q+Fdu$`A^dTssN3%MOi4wKt zpvUPB%Y0)V07k5U%U2q#J8Y)$|86FcFmZbw8BRp}3017Z)v3}sEYc>-4|?>`rTO4} z9`?q3wGd7lGR7cC3O#GnJt^THSlE*N>>;Azk1}G(WvP>Ot4xwQRH~v#Jq+L~| zn)UkiYvK&!E?@Kq4-#fokmHvxU$#OpX|we<<0^F(Pv-w zut%_zqcOXo56Z5{1nT3ctI=4w*63n6$ZK5j1x1QsGRRp>QPzq=N=r)>O$?fl7sp`(24V4 zmNwKI%Vu9&cRoR>9J7spyk;icOuOiHs4f<}s>81KuITw&df}|0ZtZJkrEs=K*%-2i zzgMkJ%awt0g}`RV9_1$URVJSaXGEqpEZhW5QQDd8V^O#XY(t}E7D|yNb(s~y_Jb6N z?!*qz=T5dr4mV+w>9cg97b4I?0_3JSGUikBSQL_;B}#$tb7T<6irn zO(+1$Cv4w)UkxbJu5_*AUh(0xJ6rO<9{FNwT66+^yKA0OXW+nLlVCbIsDM9Sl zs|vEZfyrO$F^^683{3YKwXh7b*#VVfz0O=433$e`f%-?|q7+XjE8u#tI)`=7L|`v? zqSDv8ob8yn^LD=qy_PL;wF6zVOx0t%;de)C93bA$;!NLsjdwVrBxZQun|7JZ_l#Ob zl1|HA0!xcm1rnOK@%@Kov|CsDzP}cNMyBi|g7)^aSgnjn1bLwpqT{wUD87{8K6=WE zZJ{Rk#81Db+(wAk*O_$;>@DCT#05Thedt>0M6 zmQWJ-TMc=Gg)t@fBZcq>b6=1LFiSZs2nOIRrTJoz#b8IW>^a>ux~)0CNl+WIUZ09q z15==?bAwcw2eul7KfMN`o0~8lB9AX=DXO?O4xe6B1xj}zU9G?KPQs8^$0~`dE11sR zH>LIopYTS&@Ni0i_*!ipPdQw4f46c55)1n%o?PvEmha%h zpksJTM~~%Lq|h`Vy1fZs354|As&KxfpGKYv22JHohIb(k%?0;|gRzvpNJjX}w=?aR zGS8`~*tUu&F{^ZHaK4BZ`7NoJ<}h5YzFc_ioOgO6h|ur-wM-x$#xjTVwjE=aI-|#M zxir1cI2-^02n#z5P|#{E4R;HjGXUT*YG5^^7;&m?Q-->ixL;3R`L5B1uVxbg(erz4 z6blHXlso?>*0ebCt@7vbA-AWLZ;(1iMat7=8|_Npe0!z7qvfxRdMsGA4>$Hp%UWn~ z(J!Nobp6)oRJfA(7SbRY>Gx@ppb_4N#2;fq38@qjUrl5UBtc8z21rZ`nakWATZ;3z z<%w7T3l2~gZ*pHZ+(*te#z__L=d3KXejZ}I2^ic-fk6LA-4m?GXKxi6Z-~|cR-7UQ zm^z1IiGD~Yz-9vQecLX>M7$9u*lAl^7PF7{g|9amTsoz*l^rnh(Un1HCG3;U^Krf+ zQXodEwi@xe;0GdO88$;pGt%}Ruw?9@5Dc27rUJQ6P5-O?9^&u{8g5b_PvWek$!mA+ z{JK*UUdQEFfOx{jP7H6Rh*}`)mUEerVC9P77a&99A{2Xbdpp>7$LKTn$#7I;#N!Z~ z9}y7JOD*CK^Lg}YJKyb*Ubr;Owyrk6bL>IM*LL6pT=hE-WDk}g@MR>)L?jq>_w}$( zs3Ydu()!;W1Op&=z8cCWzf^qoel#Y&(8E&Pdn%Ry1w<_tBz0U% z!tII$G23xnX^YmdeoFAamq5}s&hjuo1e_x9LQv$2HJa~?KH%i}pDNt6;?apMHH%;6 zdOWxPMgddsu_pJ|X=n$QAF^Op2j}4h?;$9Q)QLmd$(BE%s=K3Vn=(`+(tjZx{yjCG zO_!?5W5*hm4wh{KmcI{2zxSrO0{1M%CAdEdS8MeeW!HhDAA5zg*w?K6u%9xFO1SBr zr9lCaX*dZ6V!=XcSe;?5fo3|BFuaM%S??74_tnkzv%ieoB(jkkg~ImFRHHk$$W|W> zGtv3w8v}PT^Lx+3F+aJ?Q({q@ zG8=fC<0}5{dSj9=*u}#6(sDf64?#F+y1L<;@xuzHP^O0F%d58g!|%Dq1kuYAwC-?; zPN{+$pInc35Q9DYL@93k%1kr}6dxH{QjWa3Vu}-aWzb9)?RJcvb_ICx;zhCTR4E!Z zF7A~7kr<)OWoqw9fY8Y{*IHwebU6LJ8iHXKp^F7_ z3RtYljwja_l%{SnvexH_k4v{fx@z@@vGGx#6QXp^oQ6m8@!qDSf0- zDwH{$GD!D*=WUubQ@k*f0soP+RfUYU&;5+B%{#shkt7zKp+;C${dAhp*Nb>b9 zyb%oXZ#fNAG|7FLJ(Af-T8>)9#xj^in8JqQ*8=r& z%jhuzP#amDPe|vfQzVp$*Z~WM@z(3D>yT+cSjN(|&8si;WPU`ty$(P1{L8lKEQFDk z*|gWVaTNw(mZ|a#_>BADP3!OmxsmZQc|2lYA0PuPOdY|%I^b3@>!l=nJ^EE&<&ypSGPG`-Vqcw$(;CclAWISGR)CDa zP~2@5hn*n#j3ypxwD^C;`adDNyx&qb5o^?^ixBITfS{fnV`noOL$ zP-MJBFLX>LVO@O*PgIi{o@gr}te0xmF>8v#^BT8RBAdm6%;YV!q^h6d9>8lGt&BdK zO}z-J=I5T~!;P8188VUEUk|u4C*}@1!C!`yT-7t7?)yR#j<)@5? z1649yG@7Iqm8X5A&Sjc|RM6nBnJzY^5tO@N?Fn2i6PnA-4;C9N-Gg!z5x!WG>LZp| zaCiS`>1(1)q4)s3;0o9~)^hl;<6i8%UR=O6My60i?lm><1c6{*MT!(j>;PO|8Y6Hh zVJ-pRo9qz6mNPysW1&vnd%V!1pDlUlImN(B^4q)Ra3L_z9vRTw zoNq~O^h&E(gsYxDA*!--o^D*nGXCX-qFHzZjvo`M(b<0FnVy%qPjS@hAw(fDF@#Yh z-DPPHF~4%Ifd5iW7SSvk=9!QR$Wl6HO*q>RV~3+Iy>n5QhYLY9vnT6v%T@Q6E2}i1 z-%oh|@?zgXn&mTwyd#G7vFx%{S=g~uOTVC4cIKv4feKS(N#FEdxFXYkYagRu2{0Y6 zw6YIXea~xmq4cR>z(e7H_;an9&%h(}Up z5tFc3>AWjBowlenoQ>_Iz$l4zN0gDT$iJ$96-V>eoW@wPv9SB;u);-<#Mgk}7p_*R zQI^9$w3=&E=TH+SRa!elm$+Td4p%_p=ko%*xRy$eS+U=usQ>;e{(xgA&kOadb<8no z*OjHYYxXeB1_R*j)oL$4btA~_*s8kM(g*g>EBXE@&^=W;T)jlQ_-{<0FvGM%LE2zt zGbn9YUT|fjbg2uiwi`6RyV67U*urz#XWjEngKVhb2+6~xO`_1&vNpW;ALwV4P zetygFrz*{}0>g&_Ms>AgpyKJs36JMT;#`JbJ8HW}E`D<8AvMKBY~^%BX0$C8P4$Ek ze$|uCchjhltNk#m6Ifu%E*K9ToqD>>Y?-Bwrf?A-dheUAQI+m~7Z4jq#o{@lR3%ki zq7zT^uXILr6~#j}4#a=|r|zg+&wEbD9`^#kYAH?^OMSbC3I3A`p%z_1_ItcR+afvV z>#}|yLwU77`TKTSVDq5H{ly=<^m(&yorr9a9!Q4&Jj1{BqDsM6$j_zJmsz zsCY2gDp)#G_hK`r2AtEYHLSUNR*Gr5m37m3(X!{S5E=!eTb} zxz7G}tPW?imWVH{!%b+01Sv`ZHhd&jDfHBSNjp=U^Ax4;bqVsX1j(aAYdq2nQBW{$ yJ|vh1$q}HUNTHx$p`y?OP=b-U`~U9`b`%MoJx$Yxj==4IQYy%*%G64kK>r7Pkk|kK literal 0 HcmV?d00001 diff --git a/src/main/resources/branding/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png b/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png similarity index 100% rename from src/main/resources/branding/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png rename to src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png diff --git a/src/main/resources/branding/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png b/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png similarity index 100% rename from src/main/resources/branding/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png rename to src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png diff --git a/src/main/resources/branding/mipmap-hdpi/ic_launcher.png b/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher.png similarity index 100% rename from src/main/resources/branding/mipmap-hdpi/ic_launcher.png rename to src/main/resources/custom-branding/mipmap-hdpi/ic_launcher.png diff --git a/src/main/resources/branding/mipmap-hdpi/ic_launcher_round.png b/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from src/main/resources/branding/mipmap-hdpi/ic_launcher_round.png rename to src/main/resources/custom-branding/mipmap-hdpi/ic_launcher_round.png diff --git a/src/main/resources/branding/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png b/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png similarity index 100% rename from src/main/resources/branding/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png rename to src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png diff --git a/src/main/resources/branding/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png b/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png similarity index 100% rename from src/main/resources/branding/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png rename to src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png diff --git a/src/main/resources/branding/mipmap-mdpi/ic_launcher.png b/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher.png similarity index 100% rename from src/main/resources/branding/mipmap-mdpi/ic_launcher.png rename to src/main/resources/custom-branding/mipmap-mdpi/ic_launcher.png diff --git a/src/main/resources/branding/mipmap-mdpi/ic_launcher_round.png b/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from src/main/resources/branding/mipmap-mdpi/ic_launcher_round.png rename to src/main/resources/custom-branding/mipmap-mdpi/ic_launcher_round.png diff --git a/src/main/resources/branding/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png b/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png similarity index 100% rename from src/main/resources/branding/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png rename to src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png diff --git a/src/main/resources/branding/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png b/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png similarity index 100% rename from src/main/resources/branding/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png rename to src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png diff --git a/src/main/resources/branding/mipmap-xhdpi/ic_launcher.png b/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from src/main/resources/branding/mipmap-xhdpi/ic_launcher.png rename to src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher.png diff --git a/src/main/resources/branding/mipmap-xhdpi/ic_launcher_round.png b/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from src/main/resources/branding/mipmap-xhdpi/ic_launcher_round.png rename to src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher_round.png diff --git a/src/main/resources/branding/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png b/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png similarity index 100% rename from src/main/resources/branding/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png rename to src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png diff --git a/src/main/resources/branding/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png b/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png similarity index 100% rename from src/main/resources/branding/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png rename to src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png diff --git a/src/main/resources/branding/mipmap-xxhdpi/ic_launcher.png b/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from src/main/resources/branding/mipmap-xxhdpi/ic_launcher.png rename to src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher.png diff --git a/src/main/resources/branding/mipmap-xxhdpi/ic_launcher_round.png b/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from src/main/resources/branding/mipmap-xxhdpi/ic_launcher_round.png rename to src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher_round.png diff --git a/src/main/resources/branding/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png b/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png similarity index 100% rename from src/main/resources/branding/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png rename to src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png diff --git a/src/main/resources/branding/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png b/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png similarity index 100% rename from src/main/resources/branding/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png rename to src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png diff --git a/src/main/resources/branding/mipmap-xxxhdpi/ic_launcher.png b/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from src/main/resources/branding/mipmap-xxxhdpi/ic_launcher.png rename to src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher.png diff --git a/src/main/resources/branding/mipmap-xxxhdpi/ic_launcher_round.png b/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from src/main/resources/branding/mipmap-xxxhdpi/ic_launcher_round.png rename to src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher_round.png From 4874b03a16cd8036dcee19812d52a6c55d64450e Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 2 Jan 2024 14:36:22 +0000 Subject: [PATCH 12/44] chore(release): 4.0.0-dev.2 [skip ci] # [4.0.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.1...v4.0.0-dev.2) (2024-01-02) ### Features * **YouTube - Change header:** Change to ReVanced borderless logo header by default ([#2512](https://github.com/ReVanced/revanced-patches/issues/2512)) ([75f785d](https://github.com/ReVanced/revanced-patches/commit/75f785d1ef6026cbbdf7073c10aace1b28d93a30)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- patches.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa00e790..d3242a42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [4.0.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.1...v4.0.0-dev.2) (2024-01-02) + + +### Features + +* **YouTube - Change header:** Change to ReVanced borderless logo header by default ([#2512](https://github.com/ReVanced/revanced-patches/issues/2512)) ([75f785d](https://github.com/ReVanced/revanced-patches/commit/75f785d1ef6026cbbdf7073c10aace1b28d93a30)) + # [4.0.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v3.3.0-dev.2...v4.0.0-dev.1) (2024-01-01) diff --git a/gradle.properties b/gradle.properties index 7577b227..863544af 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 4.0.0-dev.1 +version = 4.0.0-dev.2 diff --git a/patches.json b/patches.json index a94ac439..b21166a1 100644 --- a/patches.json +++ b/patches.json @@ -1 +1 @@ -[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Premium heading","description":"Adds or removes the YouTube Premium logo at the top of feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"usePremiumHeading","default":true,"values":null,"title":"Use premium heading","description":"Whether to use the YouTube Premium logo.","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file +[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Change the in app header. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" The header to use in top bar or the path to a custom header.\n The path to a folder containing one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file From 36f86dbf32d41f52e9f6e86cba7daebf86e86bc6 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 3 Jan 2024 19:14:32 +0400 Subject: [PATCH 13/44] fix:(YouTube - Spoof app version): Adjust spoof target description (#2578) --- .../youtube/layout/spoofappversion/SpoofAppVersionPatch.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index bcd23e80..6336df40 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -65,7 +65,7 @@ object SpoofAppVersionPatch : BytecodePatch( StringResource("revanced_spoof_app_version_target_entry_2", "18.20.39 - Restore wide video speed & quality menu"), StringResource("revanced_spoof_app_version_target_entry_3", "17.08.35 - Restore old UI layout"), StringResource("revanced_spoof_app_version_target_entry_4", "16.08.35 - Restore explore tab"), - StringResource("revanced_spoof_app_version_target_entry_5", "16.01.35 - Restore old Shorts player"), + StringResource("revanced_spoof_app_version_target_entry_5", "16.01.35 - Restore fewer video player action buttons"), ) ), ArrayResource( From 427b81a79a5a1de79f14d2261059fb098b22227f Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Tue, 9 Jan 2024 16:39:23 +0100 Subject: [PATCH 14/44] feat(Change package name): Mention caveat of the patch in the description --- .../patches/all/misc/packagename/ChangePackageNamePatch.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/all/misc/packagename/ChangePackageNamePatch.kt b/src/main/kotlin/app/revanced/patches/all/misc/packagename/ChangePackageNamePatch.kt index 40978597..0471427a 100644 --- a/src/main/kotlin/app/revanced/patches/all/misc/packagename/ChangePackageNamePatch.kt +++ b/src/main/kotlin/app/revanced/patches/all/misc/packagename/ChangePackageNamePatch.kt @@ -10,7 +10,7 @@ import java.io.Closeable @Patch( name = "Change package name", - description = "Appends \".revanced\" to the package name by default.", + description = "Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.", use = false ) @Suppress("unused") @@ -59,4 +59,4 @@ object ChangePackageNamePatch : ResourcePatch(), Closeable { manifest.setAttribute("package", replacementPackageName) } -} \ No newline at end of file +} From 9aadcad89292979660e10649557b78f5096b8fa3 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 9 Jan 2024 15:41:21 +0000 Subject: [PATCH 15/44] chore(release): 4.0.0-dev.3 [skip ci] # [4.0.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.2...v4.0.0-dev.3) (2024-01-09) ### Features * **Change package name:** Mention caveat of the patch in the description ([427b81a](https://github.com/ReVanced/revanced-patches/commit/427b81a79a5a1de79f14d2261059fb098b22227f)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- patches.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d3242a42..ca383095 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [4.0.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.2...v4.0.0-dev.3) (2024-01-09) + + +### Features + +* **Change package name:** Mention caveat of the patch in the description ([427b81a](https://github.com/ReVanced/revanced-patches/commit/427b81a79a5a1de79f14d2261059fb098b22227f)) + # [4.0.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.1...v4.0.0-dev.2) (2024-01-02) diff --git a/gradle.properties b/gradle.properties index 863544af..0a06e1be 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 4.0.0-dev.2 +version = 4.0.0-dev.3 diff --git a/patches.json b/patches.json index b21166a1..fe7819e8 100644 --- a/patches.json +++ b/patches.json @@ -1 +1 @@ -[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Change the in app header. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" The header to use in top bar or the path to a custom header.\n The path to a folder containing one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file +[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Change the in app header. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" The header to use in top bar or the path to a custom header.\n The path to a folder containing one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file From fd4b3c79a83f8de6256611629263d3e29e66f2c2 Mon Sep 17 00:00:00 2001 From: mrwedders <16323042+mrwedders@users.noreply.github.com> Date: Tue, 9 Jan 2024 17:26:15 +0000 Subject: [PATCH 16/44] feat(MyFitnessPal): Add `Hide ads` patch (#2594) Co-authored-by: oSumAtrIX --- api/revanced-patches.api | 14 +++++++ .../patches/myfitnesspal/ads/HideAdsPatch.kt | 38 +++++++++++++++++++ .../IsPremiumUseCaseImplFingerprint.kt | 11 ++++++ ...avigateToNativePremiumUpsellFingerprint.kt | 13 +++++++ 4 files changed, 76 insertions(+) create mode 100644 src/main/kotlin/app/revanced/patches/myfitnesspal/ads/HideAdsPatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/myfitnesspal/ads/fingerprints/IsPremiumUseCaseImplFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/myfitnesspal/ads/fingerprints/MainActivityNavigateToNativePremiumUpsellFingerprint.kt diff --git a/api/revanced-patches.api b/api/revanced-patches.api index 3c16fdee..08000ed3 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -333,6 +333,20 @@ public final class app/revanced/patches/myexpenses/misc/pro/UnlockProPatch : app public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } +public final class app/revanced/patches/myfitnesspal/ads/HideAdsPatch : app/revanced/patcher/patch/BytecodePatch { + public static final field INSTANCE Lapp/revanced/patches/myfitnesspal/ads/HideAdsPatch; + public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V + public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V +} + +public final class app/revanced/patches/myfitnesspal/ads/fingerprints/IsPremiumUseCaseImplFingerprint : app/revanced/patcher/fingerprint/MethodFingerprint { + public static final field INSTANCE Lapp/revanced/patches/myfitnesspal/ads/fingerprints/IsPremiumUseCaseImplFingerprint; +} + +public final class app/revanced/patches/myfitnesspal/ads/fingerprints/MainActivityNavigateToNativePremiumUpsellFingerprint : app/revanced/patcher/fingerprint/MethodFingerprint { + public static final field INSTANCE Lapp/revanced/patches/myfitnesspal/ads/fingerprints/MainActivityNavigateToNativePremiumUpsellFingerprint; +} + public final class app/revanced/patches/netguard/broadcasts/removerestriction/RemoveBroadcastsRestrictionPatch : app/revanced/patcher/patch/ResourcePatch { public static final field INSTANCE Lapp/revanced/patches/netguard/broadcasts/removerestriction/RemoveBroadcastsRestrictionPatch; public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V diff --git a/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/HideAdsPatch.kt b/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/HideAdsPatch.kt new file mode 100644 index 00000000..855b486b --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/HideAdsPatch.kt @@ -0,0 +1,38 @@ +package app.revanced.patches.myfitnesspal.ads + +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.annotation.CompatiblePackage +import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.myfitnesspal.ads.fingerprints.IsPremiumUseCaseImplFingerprint +import app.revanced.patches.myfitnesspal.ads.fingerprints.MainActivityNavigateToNativePremiumUpsellFingerprint +import app.revanced.util.exception + +@Patch( + name = "Hide ads", + description = "Hides most of the ads across the app.", + compatiblePackages = [CompatiblePackage("com.myfitnesspal.android")] +) +@Suppress("unused") +object HideAdsPatch : BytecodePatch( + setOf(IsPremiumUseCaseImplFingerprint, MainActivityNavigateToNativePremiumUpsellFingerprint) +) { + override fun execute(context: BytecodeContext) { + // Overwrite the premium status specifically for ads. + IsPremiumUseCaseImplFingerprint.result?.mutableMethod?.replaceInstructions( + 0, + """ + sget-object v0, Ljava/lang/Boolean;->TRUE:Ljava/lang/Boolean; + return-object v0 + """ + ) ?: throw IsPremiumUseCaseImplFingerprint.exception + + // Prevent the premium upsell dialog from showing when the main activity is launched. + // In other places that are premium-only the dialog will still show. + MainActivityNavigateToNativePremiumUpsellFingerprint.result?.mutableMethod?.replaceInstructions( + 0, + "return-void" + ) ?: throw MainActivityNavigateToNativePremiumUpsellFingerprint.exception + } +} diff --git a/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/fingerprints/IsPremiumUseCaseImplFingerprint.kt b/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/fingerprints/IsPremiumUseCaseImplFingerprint.kt new file mode 100644 index 00000000..0f6e50e7 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/fingerprints/IsPremiumUseCaseImplFingerprint.kt @@ -0,0 +1,11 @@ +package app.revanced.patches.myfitnesspal.ads.fingerprints + +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +object IsPremiumUseCaseImplFingerprint : MethodFingerprint( + accessFlags = AccessFlags.PUBLIC.value, + customFingerprint = { methodDef, classDef -> + classDef.type.endsWith("IsPremiumUseCaseImpl;") && methodDef.name == "doWork" + } +) diff --git a/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/fingerprints/MainActivityNavigateToNativePremiumUpsellFingerprint.kt b/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/fingerprints/MainActivityNavigateToNativePremiumUpsellFingerprint.kt new file mode 100644 index 00000000..42cfb88c --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/fingerprints/MainActivityNavigateToNativePremiumUpsellFingerprint.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.myfitnesspal.ads.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +object MainActivityNavigateToNativePremiumUpsellFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, + customFingerprint = { methodDef, classDef -> + classDef.type.endsWith("MainActivity;") && methodDef.name == "navigateToNativePremiumUpsell" + } +) From d43d666ec6ae2127e3e8554699bd103fc7d821b3 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 9 Jan 2024 17:28:21 +0000 Subject: [PATCH 17/44] chore(release): 4.0.0-dev.4 [skip ci] # [4.0.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.3...v4.0.0-dev.4) (2024-01-09) ### Features * **MyFitnessPal:** Add `Hide ads` patch ([#2594](https://github.com/ReVanced/revanced-patches/issues/2594)) ([fd4b3c7](https://github.com/ReVanced/revanced-patches/commit/fd4b3c79a83f8de6256611629263d3e29e66f2c2)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- patches.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca383095..0b99332c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [4.0.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.3...v4.0.0-dev.4) (2024-01-09) + + +### Features + +* **MyFitnessPal:** Add `Hide ads` patch ([#2594](https://github.com/ReVanced/revanced-patches/issues/2594)) ([fd4b3c7](https://github.com/ReVanced/revanced-patches/commit/fd4b3c79a83f8de6256611629263d3e29e66f2c2)) + # [4.0.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.2...v4.0.0-dev.3) (2024-01-09) diff --git a/gradle.properties b/gradle.properties index 0a06e1be..7c4f90ed 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 4.0.0-dev.3 +version = 4.0.0-dev.4 diff --git a/patches.json b/patches.json index fe7819e8..2af114c1 100644 --- a/patches.json +++ b/patches.json @@ -1 +1 @@ -[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Change the in app header. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" The header to use in top bar or the path to a custom header.\n The path to a folder containing one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file +[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Change the in app header. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" The header to use in top bar or the path to a custom header.\n The path to a folder containing one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file From 43a5677397380f14a049ae95532fd5096b94c938 Mon Sep 17 00:00:00 2001 From: KobeW50 <84587632+KobeW50@users.noreply.github.com> Date: Tue, 9 Jan 2024 14:07:11 -0500 Subject: [PATCH 18/44] fix(YouTube - Change header): Improve patch descriptions (#2581) --- .../youtube/layout/branding/header/ChangeHeaderPatch.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt index d1dfe722..74ec3f77 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt @@ -12,7 +12,7 @@ import java.io.File @Patch( name = "Change header", - description = "Change the in app header. Defaults to the ReVanced header.", + description = "Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.", compatiblePackages = [ CompatiblePackage("com.google.android.youtube") ], @@ -48,8 +48,8 @@ object ChangeHeaderPatch : ResourcePatch() { ), title = "Header", description = """ - The header to use in top bar or the path to a custom header. - The path to a folder containing one or more of the following folders matching the DPI of your device: + Either a header name or a path to a custom header folder to use in the top bar. + The path to a folder must contain one or more of the following folders matching the DPI of your device: ${targetResourceDirectoryNames.joinToString("\n") { "- $it" }} From d93a356ec29b9b601047e16762b4120edad42504 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 9 Jan 2024 23:08:01 +0400 Subject: [PATCH 19/44] refactor(YouTube - Return YouTube Dislike): Make patch more robust by removing opcode patterns from fingerprints (#2602) --- .../ReturnYouTubeDislikePatch.kt | 249 ++++++++++-------- .../ConversionContextFingerprint.kt | 18 ++ ...TextComponentAtomicReferenceFingerprint.kt | 33 --- .../TextComponentConstructorFingerprint.kt | 1 - .../TextComponentContextFingerprint.kt | 27 -- .../TextComponentDataFingerprint.kt | 16 ++ .../TextComponentLookupFingerprint.kt | 15 ++ 7 files changed, 185 insertions(+), 174 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/ConversionContextFingerprint.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentAtomicReferenceFingerprint.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentContextFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentDataFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentLookupFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index 0af09a95..76e58255 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -1,8 +1,5 @@ package app.revanced.patches.youtube.layout.returnyoutubedislike -import app.revanced.util.exception -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions @@ -11,19 +8,39 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.* +import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.ConversionContextFingerprint +import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.DislikeFingerprint +import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.DislikesOldLayoutTextViewFingerprint +import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.LikeFingerprint +import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RemoveLikeFingerprint +import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureAnimatedTextFingerprint +import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureStaticLabelFingerprint +import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureTextParentFingerprint +import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberSetterFingerprint +import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberTextViewFingerprint +import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.ShortsTextViewFingerprint +import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.TextComponentConstructorFingerprint +import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.TextComponentDataFingerprint +import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.TextComponentLookupFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.litho.filter.LithoFilterPatch import app.revanced.patches.youtube.misc.playertype.PlayerTypeHookPatch import app.revanced.patches.youtube.shared.fingerprints.RollingNumberTextViewAnimationUpdateFingerprint import app.revanced.patches.youtube.video.videoid.VideoIdPatch +import app.revanced.util.exception +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction +import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import com.android.tools.smali.dexlib2.iface.reference.TypeReference @Patch( name = "Return YouTube Dislike", @@ -38,6 +55,7 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ + "18.38.44", "18.43.45", "18.44.41", "18.45.41", @@ -49,7 +67,9 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Suppress("unused") object ReturnYouTubeDislikePatch : BytecodePatch( setOf( + ConversionContextFingerprint, TextComponentConstructorFingerprint, + TextComponentDataFingerprint, ShortsTextViewFingerprint, DislikesOldLayoutTextViewFingerprint, LikeFingerprint, @@ -67,6 +87,8 @@ object ReturnYouTubeDislikePatch : BytecodePatch( private const val FILTER_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/components/ReturnYouTubeDislikeFilterPatch;" + private fun MethodFingerprint.resultOrThrow() = result ?: throw exception + override fun execute(context: BytecodeContext) { // region Inject newVideoLoaded event handler to update dislikes when a new video is loaded. @@ -97,64 +119,132 @@ object ReturnYouTubeDislikePatch : BytecodePatch( // endregion - // region Hook creation of Spans and the cached lookup of them. + // region Hook code for creation and cached lookup of text Spans. // Alternatively the hook can be made at the creation of Spans in TextComponentSpec, // And it works in all situations except it fails to update the Span when the user dislikes, // since the underlying (likes only) text did not change. // This hook handles all situations, as it's where the created Spans are stored and later reused. - TextComponentContextFingerprint.also { - if (!it.resolve(context, TextComponentConstructorFingerprint.result!!.classDef)) - throw it.exception - }.result?.also { result -> - if (!TextComponentAtomicReferenceFingerprint.resolve(context, result.method, result.classDef)) - throw TextComponentAtomicReferenceFingerprint.exception - }?.let { textComponentContextFingerprintResult -> - val conversionContextIndex = textComponentContextFingerprintResult - .scanResult.patternScanResult!!.endIndex - val atomicReferenceStartIndex = TextComponentAtomicReferenceFingerprint.result!! - .scanResult.patternScanResult!!.startIndex + TextComponentConstructorFingerprint.result?.let { textConstructorResult -> + // Find the field name of the conversion context. + val conversionContextClassType = ConversionContextFingerprint.resultOrThrow().classDef.type + val conversionContextField = textConstructorResult.classDef.fields.find { + it.type == conversionContextClassType + } ?: throw PatchException("Could not find conversion context field") - val insertIndex = atomicReferenceStartIndex + 9 + TextComponentLookupFingerprint.resolve(context, textConstructorResult.classDef) + TextComponentLookupFingerprint.resultOrThrow().mutableMethod.apply { + // Find the instruction for creating the text data object. + val textDataClassType = TextComponentDataFingerprint.resultOrThrow().classDef.type + val insertIndex = indexOfFirstInstruction { + opcode == Opcode.NEW_INSTANCE && + getReference()?.type == textDataClassType + } + if (insertIndex < 0) throw PatchException("Could not find data creation instruction") + val tempRegister = getInstruction(insertIndex).registerA - textComponentContextFingerprintResult.mutableMethod.apply { - // Get the conversion context obfuscated field name - val conversionContextFieldReference = - getInstruction(conversionContextIndex).reference + // Find the instruction that sets the span to an instance field. + // The instruction is only a few lines after the creation of the instance. + // The method has multiple iput-object instructions using a CharSequence, + // so verify the found instruction is in the expected location. + val putFieldInstruction = implementation!!.instructions + .subList(insertIndex, insertIndex + 20) + .find { + it.opcode == Opcode.IPUT_OBJECT && + it.getReference()?.type == "Ljava/lang/CharSequence;" + } ?: throw PatchException("Could not find put object instruction") + val charSequenceRegister = (putFieldInstruction as TwoRegisterInstruction).registerA - // Free register to hold the conversion context - val freeRegister = - getInstruction(atomicReferenceStartIndex).registerB - - val atomicReferenceRegister = - getInstruction(atomicReferenceStartIndex + 6).registerC - - // Instruction that is replaced, and also has the CharacterSequence register. - val moveCharSequenceInstruction = getInstruction(insertIndex) - val charSequenceSourceRegister = moveCharSequenceInstruction.registerB - val charSequenceTargetRegister = moveCharSequenceInstruction.registerA - - // Move the current instance to the free register, and get the conversion context from it. - // Must replace the instruction to preserve the control flow label. - replaceInstruction(insertIndex, "move-object/from16 v$freeRegister, p0") addInstructions( - insertIndex + 1, - """ - # Move context to free register - iget-object v$freeRegister, v$freeRegister, $conversionContextFieldReference - invoke-static {v$freeRegister, v$atomicReferenceRegister, v$charSequenceSourceRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->onLithoTextLoaded(Ljava/lang/Object;Ljava/util/concurrent/atomic/AtomicReference;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; - move-result-object v$freeRegister - # Replace the original instruction - move-object v${charSequenceTargetRegister}, v${freeRegister} + insertIndex, """ + # Copy conversion context + move-object/from16 v$tempRegister, p0 + iget-object v$tempRegister, v$tempRegister, $conversionContextField + invoke-static {v$tempRegister, v$charSequenceRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->onLithoTextLoaded(Ljava/lang/Object;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; + move-result-object v$charSequenceRegister + """ ) } - } ?: throw TextComponentContextFingerprint.exception + } ?: throw TextComponentConstructorFingerprint.exception // endregion + // region Hook for non-litho Short videos. + + ShortsTextViewFingerprint.result?.let { + it.mutableMethod.apply { + val patternResult = it.scanResult.patternScanResult!! + + // If the field is true, the TextView is for a dislike button. + val isDisLikesBooleanReference = getInstruction(patternResult.endIndex).reference + + val textViewFieldReference = // Like/Dislike button TextView field + getInstruction(patternResult.endIndex - 1).reference + + // Check if the hooked TextView object is that of the dislike button. + // If RYD is disabled, or the TextView object is not that of the dislike button, the execution flow is not interrupted. + // Otherwise, the TextView object is modified, and the execution flow is interrupted to prevent it from being changed afterward. + val insertIndex = patternResult.startIndex + 6 + addInstructionsWithLabels( + insertIndex, + """ + # Check, if the TextView is for a dislike button + iget-boolean v0, p0, $isDisLikesBooleanReference + if-eqz v0, :is_like + + # Hook the TextView, if it is for the dislike button + iget-object v0, p0, $textViewFieldReference + invoke-static {v0}, $INTEGRATIONS_CLASS_DESCRIPTOR->setShortsDislikes(Landroid/view/View;)Z + move-result v0 + if-eqz v0, :ryd_disabled + return-void + + :is_like + :ryd_disabled + nop + """ + ) + } + } ?: throw ShortsTextViewFingerprint.exception + + // endregion + + // region Hook for litho Shorts + + // Filter that parses the video id from the UI + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) + + // Player response video id is needed to search for the video ids in Shorts litho components. + VideoIdPatch.hookPlayerResponseVideoId("$FILTER_CLASS_DESCRIPTOR->newPlayerResponseVideoId(Ljava/lang/String;Z)V") + + // endregion + + // region Hook old UI layout dislikes, for the older app spoofs used with spoof-app-version. + + DislikesOldLayoutTextViewFingerprint.result?.let { + it.mutableMethod.apply { + val startIndex = it.scanResult.patternScanResult!!.startIndex + + val resourceIdentifierRegister = getInstruction(startIndex).registerA + val textViewRegister = getInstruction(startIndex + 4).registerA + + addInstruction( + startIndex + 4, + "invoke-static {v$resourceIdentifierRegister, v$textViewRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->setOldUILayoutDislikes(ILandroid/widget/TextView;)V" + ) + } + } ?: throw DislikesOldLayoutTextViewFingerprint.exception + + // endregion + + // region Hook rolling numbers. + // Do this last to allow patching old unsupported versions (if the user really wants), + // On older unsupported version this will fail to resolve and throw an exception, + // but everything will still work correctly anyways. + RollingNumberSetterFingerprint.result?.let { val dislikesIndex = it.scanResult.patternScanResult!!.endIndex @@ -164,7 +254,7 @@ object ReturnYouTubeDislikePatch : BytecodePatch( val charSequenceInstanceRegister = getInstruction(0).registerA val charSequenceFieldReference = - getInstruction(dislikesIndex).reference.toString() + getInstruction(dislikesIndex).reference val registerCount = implementation!!.registerCount @@ -268,73 +358,6 @@ object ReturnYouTubeDislikePatch : BytecodePatch( // endregion - // region Hook for non-litho Short videos. - - ShortsTextViewFingerprint.result?.let { - it.mutableMethod.apply { - val patternResult = it.scanResult.patternScanResult!! - - // If the field is true, the TextView is for a dislike button. - val isDisLikesBooleanReference = getInstruction(patternResult.endIndex).reference - - val textViewFieldReference = // Like/Dislike button TextView field - getInstruction(patternResult.endIndex - 1).reference - - // Check if the hooked TextView object is that of the dislike button. - // If RYD is disabled, or the TextView object is not that of the dislike button, the execution flow is not interrupted. - // Otherwise, the TextView object is modified, and the execution flow is interrupted to prevent it from being changed afterward. - val insertIndex = patternResult.startIndex + 6 - addInstructionsWithLabels( - insertIndex, - """ - # Check, if the TextView is for a dislike button - iget-boolean v0, p0, $isDisLikesBooleanReference - if-eqz v0, :is_like - - # Hook the TextView, if it is for the dislike button - iget-object v0, p0, $textViewFieldReference - invoke-static {v0}, $INTEGRATIONS_CLASS_DESCRIPTOR->setShortsDislikes(Landroid/view/View;)Z - move-result v0 - if-eqz v0, :ryd_disabled - return-void - - :is_like - :ryd_disabled - nop - """ - ) - } - } ?: throw ShortsTextViewFingerprint.exception - - // endregion - - // region Hook for litho Shorts - - // Filter that parses the video id from the UI - LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) - - // Player response video id is needed to search for the video ids in Shorts litho components. - VideoIdPatch.hookPlayerResponseVideoId("$FILTER_CLASS_DESCRIPTOR->newPlayerResponseVideoId(Ljava/lang/String;Z)V") - - // endregion - - // region Hook old UI layout dislikes, for the older app spoofs used with spoof-app-version. - - DislikesOldLayoutTextViewFingerprint.result?.let { - it.mutableMethod.apply { - val startIndex = it.scanResult.patternScanResult!!.startIndex - - val resourceIdentifierRegister = getInstruction(startIndex).registerA - val textViewRegister = getInstruction(startIndex + 4).registerA - - addInstruction( - startIndex + 4, - "invoke-static {v$resourceIdentifierRegister, v$textViewRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->setOldUILayoutDislikes(ILandroid/widget/TextView;)V" - ) - } - } ?: throw DislikesOldLayoutTextViewFingerprint.exception - - // endregion } private fun MethodFingerprint.toPatch(voteKind: Vote) = VotePatch(this, voteKind) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/ConversionContextFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/ConversionContextFingerprint.kt new file mode 100644 index 00000000..75b6eb55 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/ConversionContextFingerprint.kt @@ -0,0 +1,18 @@ +package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints + +import app.revanced.patcher.fingerprint.MethodFingerprint + +internal object ConversionContextFingerprint : MethodFingerprint( + returnType = "Ljava/lang/String;", + parameters = listOf(), + strings = listOf( + ", widthConstraint=", + ", heightConstraint=", + ", templateLoggerFactory=", + ", rootDisposableContainer=", + // 18.37.36 and after this String is: ConversionContext{containerInternal= + // and before it is: ConversionContext{container= + // Use a partial string to match both. + "ConversionContext{container" + ) +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentAtomicReferenceFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentAtomicReferenceFingerprint.kt deleted file mode 100644 index 6a852c9f..00000000 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentAtomicReferenceFingerprint.kt +++ /dev/null @@ -1,33 +0,0 @@ -package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints - -import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.MethodFingerprint -import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode - -/** - * Resolves against the same method that [TextComponentContextFingerprint] resolves to. - */ -internal object TextComponentAtomicReferenceFingerprint : MethodFingerprint( - returnType = "L", - accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL, - parameters = listOf("L"), - opcodes = listOf( - Opcode.MOVE_OBJECT, // Register B is free register - Opcode.MOVE_OBJECT_FROM16, - Opcode.MOVE_OBJECT_FROM16, - Opcode.MOVE_OBJECT_FROM16, - Opcode.MOVE_OBJECT_FROM16, - null, - Opcode.INVOKE_VIRTUAL, // Register C is atomic reference - Opcode.MOVE_RESULT_OBJECT, // Register A is char sequence - Opcode.CHECK_CAST, - Opcode.MOVE_OBJECT, // Replace this instruction with patch code - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT, - Opcode.IF_EQZ, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.GOTO - ) -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentConstructorFingerprint.kt index deb485b1..1b82d14b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentConstructorFingerprint.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints - import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentContextFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentContextFingerprint.kt deleted file mode 100644 index 3377a371..00000000 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentContextFingerprint.kt +++ /dev/null @@ -1,27 +0,0 @@ -package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints - -import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.MethodFingerprint -import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode - -/** - * Resolves against the same class that [TextComponentConstructorFingerprint] resolves to. - */ -internal object TextComponentContextFingerprint : MethodFingerprint( - returnType = "L", - accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL, - parameters = listOf("L"), - opcodes = listOf( - Opcode.MOVE_OBJECT_FROM16, - Opcode.MOVE_OBJECT_FROM16, - Opcode.INVOKE_STATIC_RANGE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IGET_OBJECT, - Opcode.IGET_OBJECT, - Opcode.IGET_OBJECT, - Opcode.IGET_OBJECT, - Opcode.IGET_OBJECT, - Opcode.IGET_OBJECT, // conversion context field name - ) -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentDataFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentDataFingerprint.kt new file mode 100644 index 00000000..2d706640 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentDataFingerprint.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal object TextComponentDataFingerprint : MethodFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, + parameters = listOf("L", "L"), + strings = listOf("text"), + customFingerprint = { _, classDef -> + val fields = classDef.fields + fields.find { it.type == "Ljava/util/BitSet;" } != null && + fields.find { it.type == "[Ljava/lang/String;" } != null + } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentLookupFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentLookupFingerprint.kt new file mode 100644 index 00000000..b6b175ac --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/TextComponentLookupFingerprint.kt @@ -0,0 +1,15 @@ +package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +/** + * Resolves against the same class that [TextComponentConstructorFingerprint] resolves to. + */ +internal object TextComponentLookupFingerprint : MethodFingerprint( + returnType = "L", + accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL, + parameters = listOf("L"), + strings = listOf("…") +) \ No newline at end of file From 6a5e1f3a6e76dc14bf6de7e16c96fef35be5f774 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 9 Jan 2024 19:09:58 +0000 Subject: [PATCH 20/44] chore(release): 4.0.0-dev.5 [skip ci] # [4.0.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.4...v4.0.0-dev.5) (2024-01-09) ### Bug Fixes * **YouTube - Change header:** Improve patch descriptions ([#2581](https://github.com/ReVanced/revanced-patches/issues/2581)) ([43a5677](https://github.com/ReVanced/revanced-patches/commit/43a5677397380f14a049ae95532fd5096b94c938)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- patches.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b99332c..9e697d84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [4.0.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.4...v4.0.0-dev.5) (2024-01-09) + + +### Bug Fixes + +* **YouTube - Change header:** Improve patch descriptions ([#2581](https://github.com/ReVanced/revanced-patches/issues/2581)) ([43a5677](https://github.com/ReVanced/revanced-patches/commit/43a5677397380f14a049ae95532fd5096b94c938)) + # [4.0.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.3...v4.0.0-dev.4) (2024-01-09) diff --git a/gradle.properties b/gradle.properties index 7c4f90ed..2c335cd0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 4.0.0-dev.4 +version = 4.0.0-dev.5 diff --git a/patches.json b/patches.json index 2af114c1..17e66127 100644 --- a/patches.json +++ b/patches.json @@ -1 +1 @@ -[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Change the in app header. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" The header to use in top bar or the path to a custom header.\n The path to a folder containing one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file +[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" Either a header name or a path to a custom header folder to use in the top bar.\n The path to a folder must contain one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file From d2970e54fbbd7e4b1ae1d354ae2d5c4bbe9336b0 Mon Sep 17 00:00:00 2001 From: d4rkk3y <43563783+d4rkk3y@users.noreply.github.com> Date: Wed, 10 Jan 2024 02:10:29 +0700 Subject: [PATCH 21/44] feat(Tiktok - Playback speed): Remember playback speed (#2506) Co-authored-by: oSumAtrIX --- .../AbstractTransformInstructionsPatch.kt | 1 - .../interaction/speed/PlaybackSpeedPatch.kt | 79 +++++++++++++------ .../speed/fingerprints/GetSpeedFingerprint.kt | 9 +++ .../OnRenderFirstFrameFingerprint.kt | 9 +++ .../speed/fingerprints/SetSpeedFingerprint.kt | 16 ++++ .../SpeedControlParentFingerprint.kt | 13 --- 6 files changed, 90 insertions(+), 37 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/GetSpeedFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/OnRenderFirstFrameFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/SetSpeedFingerprint.kt delete mode 100644 src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/SpeedControlParentFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/all/misc/transformation/AbstractTransformInstructionsPatch.kt b/src/main/kotlin/app/revanced/patches/all/misc/transformation/AbstractTransformInstructionsPatch.kt index 71699f19..a4c447e9 100644 --- a/src/main/kotlin/app/revanced/patches/all/misc/transformation/AbstractTransformInstructionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/all/misc/transformation/AbstractTransformInstructionsPatch.kt @@ -10,7 +10,6 @@ import com.android.tools.smali.dexlib2.iface.instruction.Instruction @Suppress("MemberVisibilityCanBePrivate") abstract class AbstractTransformInstructionsPatch : BytecodePatch() { - abstract fun filterMap( classDef: ClassDef, method: Method, diff --git a/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt index 3f7c17e7..6a73e60f 100644 --- a/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt @@ -1,49 +1,82 @@ package app.revanced.patches.tiktok.interaction.speed import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.tiktok.interaction.speed.fingerprints.SpeedControlParentFingerprint +import app.revanced.patches.tiktok.interaction.speed.fingerprints.GetSpeedFingerprint +import app.revanced.patches.tiktok.interaction.speed.fingerprints.OnRenderFirstFrameFingerprint +import app.revanced.patches.tiktok.interaction.speed.fingerprints.SetSpeedFingerprint import app.revanced.util.exception +import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c +import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction11x import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Patch( name = "Playback speed", - description = "Enables the playback speed option for all videos.", + description = "Enables the playback speed option for all videos and " + + "retains the speed configurations in between videos.", compatiblePackages = [ CompatiblePackage("com.ss.android.ugc.trill", ["32.5.3"]), CompatiblePackage("com.zhiliaoapp.musically", ["32.5.3"]) ] ) @Suppress("unused") -object PlaybackSpeedPatch : BytecodePatch(setOf(SpeedControlParentFingerprint)) { +object PlaybackSpeedPatch : BytecodePatch( + setOf( + GetSpeedFingerprint, + OnRenderFirstFrameFingerprint, + SetSpeedFingerprint + ) +) { override fun execute(context: BytecodeContext) { - SpeedControlParentFingerprint.result?.mutableMethod?.apply { - val targetMethodCallIndex = indexOfFirstInstruction { - if (opcode == Opcode.INVOKE_STATIC) { - val paramsTypes = ((this as Instruction35c).reference as MethodReference).parameterTypes - paramsTypes.size == 1 && paramsTypes[0].contains("/Aweme;") - } else false - } + SetSpeedFingerprint.result?.let { onVideoSwiped -> + // Remember the playback speed of the current video. + GetSpeedFingerprint.result?.mutableMethod?.apply { + val injectIndex = indexOfFirstInstruction { getReference()?.returnType == "F" } + 2 + val register = getInstruction(injectIndex - 1).registerA - val isSpeedEnableMethod = context - .toMethodWalker(this) - .nextMethod(targetMethodCallIndex, true) - .getMethod() as MutableMethod + addInstruction( + injectIndex, + "invoke-static { v$register }," + + " Lapp/revanced/tiktok/speed/SpeedPatch;->rememberPlaybackSpeed(F)V" + ) + } ?: throw GetSpeedFingerprint.exception - isSpeedEnableMethod.addInstructions( + // By default, the playback speed will reset to 1.0 at the start of each video. + // Instead, override it with the desired playback speed. + OnRenderFirstFrameFingerprint.result?.mutableMethod?.addInstructions( 0, """ - const/4 v0, 0x1 - return v0 + # Video playback location (e.g. home page, following page or search result page) retrieved using getEnterFrom method. + const/4 v0, 0x1 + invoke-virtual {p0, v0}, Lcom/ss/android/ugc/aweme/feed/panel/BaseListFragmentPanel;->getEnterFrom(Z)Ljava/lang/String; + move-result-object v0 + + # Model of current video retrieved using getCurrentAweme method. + invoke-virtual {p0}, Lcom/ss/android/ugc/aweme/feed/panel/BaseListFragmentPanel;->getCurrentAweme()Lcom/ss/android/ugc/aweme/feed/model/Aweme; + move-result-object v1 + + # Desired playback speed retrieved using getPlaybackSpeed method. + invoke-static {}, Lapp/revanced/tiktok/speed/SpeedPatch;->getPlaybackSpeed()F + move-result-object v2 + invoke-static { v0, v1, v2 }, ${onVideoSwiped.method} + """ + ) ?: throw OnRenderFirstFrameFingerprint.exception + + // Force enable the playback speed option for all videos. + onVideoSwiped.mutableClass.methods.find { method -> method.returnType == "Z" }?.addInstructions( + 0, """ - ) - } ?: throw SpeedControlParentFingerprint.exception + const/4 v0, 0x1 + return v0 + """ + ) ?: throw PatchException("Failed to force enable the playback speed option.") + } ?: throw SetSpeedFingerprint.exception } -} \ No newline at end of file +} diff --git a/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/GetSpeedFingerprint.kt b/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/GetSpeedFingerprint.kt new file mode 100644 index 00000000..f9845d4d --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/GetSpeedFingerprint.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.tiktok.interaction.speed.fingerprints + +import app.revanced.patcher.fingerprint.MethodFingerprint + +internal object GetSpeedFingerprint : MethodFingerprint( + customFingerprint = { methodDef, _ -> + methodDef.definingClass.endsWith("/BaseListFragmentPanel;") && methodDef.name == "onFeedSpeedSelectedEvent" + } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/OnRenderFirstFrameFingerprint.kt b/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/OnRenderFirstFrameFingerprint.kt new file mode 100644 index 00000000..59f930ef --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/OnRenderFirstFrameFingerprint.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.tiktok.interaction.speed.fingerprints + +import app.revanced.patcher.fingerprint.MethodFingerprint + +internal object OnRenderFirstFrameFingerprint : MethodFingerprint( + customFingerprint = { methodDef, _ -> + methodDef.definingClass.endsWith("/BaseListFragmentPanel;") && methodDef.name == "onRenderFirstFrame" + } +) diff --git a/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/SetSpeedFingerprint.kt b/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/SetSpeedFingerprint.kt new file mode 100644 index 00000000..97e566b9 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/SetSpeedFingerprint.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.tiktok.interaction.speed.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal object SetSpeedFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, + parameters = listOf( + "Ljava/lang/String;", + "Lcom/ss/android/ugc/aweme/feed/model/Aweme;", + "F" + ), + strings = listOf("enterFrom") +) diff --git a/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/SpeedControlParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/SpeedControlParentFingerprint.kt deleted file mode 100644 index 7edae32e..00000000 --- a/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/SpeedControlParentFingerprint.kt +++ /dev/null @@ -1,13 +0,0 @@ -package app.revanced.patches.tiktok.interaction.speed.fingerprints - -import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.MethodFingerprint -import com.android.tools.smali.dexlib2.AccessFlags - -internal object SpeedControlParentFingerprint : MethodFingerprint( - strings = listOf( - "onStopTrackingTouch, hasTouchMove=", - ", isCurVideoPaused: ", - "already_shown_edge_speed_guide" - ) -) \ No newline at end of file From 88b348fa5f4256bc43d8c79c5c0e3240a010a059 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 9 Jan 2024 19:12:34 +0000 Subject: [PATCH 22/44] chore(release): 4.0.0-dev.6 [skip ci] # [4.0.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.5...v4.0.0-dev.6) (2024-01-09) ### Features * **Tiktok - Playback speed:** Remember playback speed ([#2506](https://github.com/ReVanced/revanced-patches/issues/2506)) ([d2970e5](https://github.com/ReVanced/revanced-patches/commit/d2970e54fbbd7e4b1ae1d354ae2d5c4bbe9336b0)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- patches.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e697d84..924f552d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [4.0.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.5...v4.0.0-dev.6) (2024-01-09) + + +### Features + +* **Tiktok - Playback speed:** Remember playback speed ([#2506](https://github.com/ReVanced/revanced-patches/issues/2506)) ([d2970e5](https://github.com/ReVanced/revanced-patches/commit/d2970e54fbbd7e4b1ae1d354ae2d5c4bbe9336b0)) + # [4.0.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.4...v4.0.0-dev.5) (2024-01-09) diff --git a/gradle.properties b/gradle.properties index 2c335cd0..e0e4e0fc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 4.0.0-dev.5 +version = 4.0.0-dev.6 diff --git a/patches.json b/patches.json index 17e66127..3544a875 100644 --- a/patches.json +++ b/patches.json @@ -1 +1 @@ -[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" Either a header name or a path to a custom header folder to use in the top bar.\n The path to a folder must contain one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file +[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" Either a header name or a path to a custom header folder to use in the top bar.\n The path to a folder must contain one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos and retains the speed configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file From 66da935519b2e0b72105d766634e06ca1a706d34 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Tue, 9 Jan 2024 20:14:04 +0100 Subject: [PATCH 23/44] chore: Update CI dependencies --- package-lock.json | 5045 ++++++++++++++++++++++++++++++++++++++++++--- package.json | 2 +- 2 files changed, 4721 insertions(+), 326 deletions(-) diff --git a/package-lock.json b/package-lock.json index 825662bd..e6bb3d9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,17 +5,17 @@ "packages": { "": { "devDependencies": { - "@saithodev/semantic-release-backmerge": "^4.0.1", + "@saithodev/semantic-release-backmerge": "^3.2.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", "gradle-semantic-release-plugin": "^1.8.0", - "semantic-release": "^22.0.12" + "semantic-release": "^22.0.8" } }, "node_modules/@babel/code-frame": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", - "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { "@babel/highlight": "^7.23.4", @@ -66,15 +66,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/@babel/code-frame/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -160,15 +151,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -245,9 +227,9 @@ } }, "node_modules/@octokit/core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.1.tgz", - "integrity": "sha512-lyeeeZyESFo+ffI801SaBKmCfsvarO+dgV8/0gD8u1d87clbEdWsP5yC+dSj3zLhb2eIf5SJrn6vDz9AheETHw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.2.tgz", + "integrity": "sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==", "dev": true, "dependencies": { "@octokit/auth-token": "^4.0.0", @@ -263,13 +245,12 @@ } }, "node_modules/@octokit/endpoint": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.2.tgz", - "integrity": "sha512-qhKW8YLIi+Kmc92FQUFGr++DYtkx/1fBv+Thua6baqnjnOsgBYJDCvWZR1YcINuHGOEQt416WOfE+A/oG60NBQ==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", + "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", "dev": true, "dependencies": { "@octokit/types": "^12.0.0", - "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -291,18 +272,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "19.0.2", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.0.2.tgz", - "integrity": "sha512-8li32fUDUeml/ACRp/njCWTsk5t17cfTM1jp9n08pBrqs5cDFJubtjsSnuz56r5Tad6jdEPJld7LxNp9dNcyjQ==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.1.0.tgz", + "integrity": "sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==", "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.4.tgz", - "integrity": "sha512-MvZx4WvfhBnt7PtH5XE7HORsO7bBk4er1FgRIUr1qJ89NR2I6bWjGyKsxk8z42FPQ34hFQm0Baanh4gzdZR4gQ==", + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz", + "integrity": "sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==", "dev": true, "dependencies": { - "@octokit/types": "^12.3.0" + "@octokit/types": "^12.4.0" }, "engines": { "node": ">= 18" @@ -345,15 +326,14 @@ } }, "node_modules/@octokit/request": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.5.tgz", - "integrity": "sha512-zVKbNbX1xUluD9ZR4/tPs1yuYrK9xeh5fGZUXA6u04XGsTvomg0YO8/ZUC0FqAd49hAOEMFPAVUTh+2lBhOhLA==", + "version": "8.1.6", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.6.tgz", + "integrity": "sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==", "dev": true, "dependencies": { "@octokit/endpoint": "^9.0.0", "@octokit/request-error": "^5.0.0", "@octokit/types": "^12.0.0", - "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -375,12 +355,12 @@ } }, "node_modules/@octokit/types": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.3.0.tgz", - "integrity": "sha512-nJ8X2HRr234q3w/FcovDlA+ttUU4m1eJAourvfUUtwAWeqL8AsyRqfnLvVnYn3NFbUnsmzQCzLNdFerPwdmcDQ==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.4.0.tgz", + "integrity": "sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^19.0.2" + "@octokit/openapi-types": "^19.1.0" } }, "node_modules/@pnpm/config.env-replace": { @@ -425,9 +405,9 @@ } }, "node_modules/@saithodev/semantic-release-backmerge": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@saithodev/semantic-release-backmerge/-/semantic-release-backmerge-4.0.1.tgz", - "integrity": "sha512-WDsU28YrXSLx0xny7FgFlEk8DCKGcj6OOhA+4Q9k3te1jJD1GZuqY8sbIkVQaw9cqJ7CT+fCZUN6QDad8JW4Dg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@saithodev/semantic-release-backmerge/-/semantic-release-backmerge-3.2.1.tgz", + "integrity": "sha512-mC9cA6lhNzpy4rKOT5jjRLhlT3myubmVeo+BqWyR2WqF5PRJpG0jaU8pBC87S11GCUHKxqXf0QQDZNPbbNP1bA==", "dev": true, "dependencies": { "@semantic-release/error": "^3.0.0", @@ -435,7 +415,4189 @@ "debug": "^4.3.4", "execa": "^5.1.1", "lodash": "^4.17.21", - "semantic-release": "^22.0.7" + "semantic-release": ">=20.0.0 <22.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/commit-analyzer": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-10.0.4.tgz", + "integrity": "sha512-pFGn99fn8w4/MHE0otb2A/l5kxgOuxaaauIh4u30ncoTJuqWj4hXTgEJ03REqjS+w1R2vPftSsO26WC61yOcpw==", + "dev": true, + "dependencies": { + "conventional-changelog-angular": "^6.0.0", + "conventional-commits-filter": "^3.0.0", + "conventional-commits-parser": "^5.0.0", + "debug": "^4.0.0", + "import-from": "^4.0.0", + "lodash-es": "^4.17.21", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/commit-analyzer/node_modules/conventional-commits-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-3.0.0.tgz", + "integrity": "sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==", + "dev": true, + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/npm": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-10.0.6.tgz", + "integrity": "sha512-DyqHrGE8aUyapA277BB+4kV0C4iMHh3sHzUWdf0jTgp5NNJxVUz76W1f57FB64Ue03him3CBXxFqQD2xGabxow==", + "dev": true, + "dependencies": { + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "execa": "^8.0.0", + "fs-extra": "^11.0.0", + "lodash-es": "^4.17.21", + "nerf-dart": "^1.0.0", + "normalize-url": "^8.0.0", + "npm": "^9.5.0", + "rc": "^1.2.8", + "read-pkg": "^8.0.0", + "registry-auth-token": "^5.0.0", + "semver": "^7.1.2", + "tempy": "^3.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/npm/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/npm/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dev": true, + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/npm/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/npm/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/npm/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/release-notes-generator": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-11.0.7.tgz", + "integrity": "sha512-T09QB9ImmNx7Q6hY6YnnEbw/rEJ6a+22LBxfZq+pSAXg/OL/k0siwEm5cK4k1f9dE2Z2mPIjJKKohzUm0jbxcQ==", + "dev": true, + "dependencies": { + "conventional-changelog-angular": "^6.0.0", + "conventional-changelog-writer": "^6.0.0", + "conventional-commits-filter": "^4.0.0", + "conventional-commits-parser": "^5.0.0", + "debug": "^4.0.0", + "get-stream": "^7.0.0", + "import-from": "^4.0.0", + "into-stream": "^7.0.0", + "lodash-es": "^4.17.21", + "read-pkg-up": "^10.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz", + "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/conventional-changelog-angular": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz", + "integrity": "sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/conventional-changelog-writer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-6.0.1.tgz", + "integrity": "sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==", + "dev": true, + "dependencies": { + "conventional-commits-filter": "^3.0.0", + "dateformat": "^3.0.3", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "meow": "^8.1.2", + "semver": "^7.0.0", + "split": "^1.0.1" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/conventional-changelog-writer/node_modules/conventional-commits-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-3.0.0.tgz", + "integrity": "sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==", + "dev": true, + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/env-ci": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-9.1.1.tgz", + "integrity": "sha512-Im2yEWeF4b2RAMAaWvGioXk6m0UNaIjD8hj28j2ij5ldnIFrDQT0+pzDvpbRkcjurhXhf/AsBKv8P2rtmGi9Aw==", + "dev": true, + "dependencies": { + "execa": "^7.0.0", + "java-properties": "^1.0.2" + }, + "engines": { + "node": "^16.14 || >=18" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/env-ci/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/env-ci/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/marked": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.2.tgz", + "integrity": "sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/marked-terminal": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz", + "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^6.2.0", + "cardinal": "^2.1.1", + "chalk": "^5.2.0", + "cli-table3": "^0.6.3", + "node-emoji": "^1.11.0", + "supports-hyperlinks": "^2.3.0" + }, + "engines": { + "node": ">=14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm": { + "version": "9.9.2", + "resolved": "https://registry.npmjs.org/npm/-/npm-9.9.2.tgz", + "integrity": "sha512-D3tV+W0PzJOlwo8YmO6fNzaB1CrMVYd1V+2TURF6lbCbmZKqMsYgeQfPVvqiM3zbNSJPhFEnmlEXIogH2Vq7PQ==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/promise-spawn", + "@npmcli/run-script", + "abbrev", + "archy", + "cacache", + "chalk", + "ci-info", + "cli-columns", + "cli-table3", + "columnify", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "ms", + "node-gyp", + "nopt", + "normalize-package-data", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "npmlog", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "semver", + "sigstore", + "spdx-expression-parse", + "ssri", + "supports-color", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "dev": true, + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^6.5.0", + "@npmcli/config": "^6.4.0", + "@npmcli/fs": "^3.1.0", + "@npmcli/map-workspaces": "^3.0.4", + "@npmcli/package-json": "^4.0.1", + "@npmcli/promise-spawn": "^6.0.2", + "@npmcli/run-script": "^6.0.2", + "abbrev": "^2.0.0", + "archy": "~1.0.0", + "cacache": "^17.1.3", + "chalk": "^5.3.0", + "ci-info": "^3.8.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.3", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.2", + "glob": "^10.2.7", + "graceful-fs": "^4.2.11", + "hosted-git-info": "^6.1.1", + "ini": "^4.1.1", + "init-package-json": "^5.0.0", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "^3.0.0", + "libnpmaccess": "^7.0.2", + "libnpmdiff": "^5.0.20", + "libnpmexec": "^6.0.4", + "libnpmfund": "^4.2.1", + "libnpmhook": "^9.0.3", + "libnpmorg": "^5.0.4", + "libnpmpack": "^5.0.20", + "libnpmpublish": "^7.5.1", + "libnpmsearch": "^6.0.2", + "libnpmteam": "^5.0.3", + "libnpmversion": "^4.0.2", + "make-fetch-happen": "^11.1.1", + "minimatch": "^9.0.3", + "minipass": "^5.0.0", + "minipass-pipeline": "^1.2.4", + "ms": "^2.1.2", + "node-gyp": "^9.4.0", + "nopt": "^7.2.0", + "normalize-package-data": "^5.0.0", + "npm-audit-report": "^5.0.0", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^10.1.0", + "npm-pick-manifest": "^8.0.2", + "npm-profile": "^7.0.1", + "npm-registry-fetch": "^14.0.5", + "npm-user-validate": "^2.0.0", + "npmlog": "^7.0.1", + "p-map": "^4.0.0", + "pacote": "^15.2.0", + "parse-conflict-json": "^3.0.1", + "proc-log": "^3.0.0", + "qrcode-terminal": "^0.12.0", + "read": "^2.1.0", + "semver": "^7.5.4", + "sigstore": "^1.9.0", + "spdx-expression-parse": "^3.0.1", + "ssri": "^10.0.4", + "supports-color": "^9.4.0", + "tar": "^6.1.15", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^5.0.0", + "which": "^3.0.1", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@colors/colors": { + "version": "1.5.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/arborist": { + "version": "6.5.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.0", + "@npmcli/installed-package-contents": "^2.0.2", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^5.0.0", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^4.0.0", + "@npmcli/query": "^3.0.0", + "@npmcli/run-script": "^6.0.0", + "bin-links": "^4.0.1", + "cacache": "^17.0.4", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^6.1.1", + "json-parse-even-better-errors": "^3.0.0", + "json-stringify-nice": "^1.1.4", + "minimatch": "^9.0.0", + "nopt": "^7.0.0", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^10.1.0", + "npm-pick-manifest": "^8.0.1", + "npm-registry-fetch": "^14.0.3", + "npmlog": "^7.0.1", + "pacote": "^15.0.8", + "parse-conflict-json": "^3.0.0", + "proc-log": "^3.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.2", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.1", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/config": { + "version": "6.4.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^3.0.2", + "ci-info": "^3.8.0", + "ini": "^4.1.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.5", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/disparity-colors": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ansi-styles": "^4.3.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/fs": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/git": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^17.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^15.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/package-json": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^4.1.0", + "glob": "^10.2.2", + "hosted-git-info": "^6.1.1", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "proc-log": "^3.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/query": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/run-script": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@sigstore/bundle": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@sigstore/sign": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@sigstore/tuf": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@tufjs/models": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/abbrev": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/abort-controller": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/agentkeepalive": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "depd": "^2.0.0", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/are-we-there-yet": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^4.1.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/base64-js": { + "version": "1.5.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/bin-links": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/buffer": { + "version": "6.0.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/builtins": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/cacache": { + "version": "17.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/chalk": { + "version": "5.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ci-info": { + "version": "3.8.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/cidr-regex": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^4.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/cli-table3": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/clone": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/cmd-shim": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/color-support": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/columnify": { + "version": "1.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/console-control-strings": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/defaults": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/delegates": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/depd": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/diff": { + "version": "5.1.0", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/event-target-shim": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/events": { + "version": "3.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/exponential-backoff": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/foreground-child": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/function-bind": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/gauge": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^4.0.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/glob": { + "version": "10.2.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2", + "path-scurry": "^1.7.0" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/has": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/hosted-git-info": { + "version": "6.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/humanize-ms": { + "version": "1.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ieee754": { + "version": "1.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ignore-walk": { + "version": "6.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ini": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/init-package-json": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^10.0.0", + "promzard": "^1.0.0", + "read": "^2.0.0", + "read-package-json": "^6.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ip": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ip-regex": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/is-cidr": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "^3.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/is-core-module": { + "version": "2.13.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/jackspeak": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/just-diff": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmaccess": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^10.1.0", + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmdiff": { + "version": "5.0.20", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^6.5.0", + "@npmcli/disparity-colors": "^3.0.0", + "@npmcli/installed-package-contents": "^2.0.2", + "binary-extensions": "^2.2.0", + "diff": "^5.1.0", + "minimatch": "^9.0.0", + "npm-package-arg": "^10.1.0", + "pacote": "^15.0.8", + "tar": "^6.1.13" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmexec": { + "version": "6.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^6.5.0", + "@npmcli/run-script": "^6.0.0", + "ci-info": "^3.7.1", + "npm-package-arg": "^10.1.0", + "npmlog": "^7.0.1", + "pacote": "^15.0.8", + "proc-log": "^3.0.0", + "read": "^2.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmfund": { + "version": "4.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^6.5.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmhook": { + "version": "9.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmorg": { + "version": "5.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmpack": { + "version": "5.0.20", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^6.5.0", + "@npmcli/run-script": "^6.0.0", + "npm-package-arg": "^10.1.0", + "pacote": "^15.0.8" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmpublish": { + "version": "7.5.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ci-info": "^3.6.1", + "normalize-package-data": "^5.0.0", + "npm-package-arg": "^10.1.0", + "npm-registry-fetch": "^14.0.3", + "proc-log": "^3.0.0", + "semver": "^7.3.7", + "sigstore": "^1.4.0", + "ssri": "^10.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmsearch": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmteam": { + "version": "5.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmversion": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^4.0.1", + "@npmcli/run-script": "^6.0.0", + "json-parse-even-better-errors": "^3.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/make-fetch-happen": { + "version": "11.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-collect": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-fetch": { + "version": "3.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^5.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-json-stream": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/mute-stream": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp": { + "version": "9.4.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^11.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/nopt": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/nopt": { + "version": "7.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/normalize-package-data": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-audit-report": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-bundled": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-install-checks": { + "version": "6.2.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-package-arg": { + "version": "10.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-packlist": { + "version": "7.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-pick-manifest": { + "version": "8.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-profile": { + "version": "7.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-registry-fetch": { + "version": "14.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-user-validate": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npmlog": { + "version": "7.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^4.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^5.0.0", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/once": { + "version": "1.4.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/pacote": { + "version": "15.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/parse-conflict-json": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/path-scurry": { + "version": "1.9.2", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1", + "minipass": "^5.0.0 || ^6.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/path-scurry/node_modules/lru-cache": { + "version": "9.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.0.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/proc-log": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/process": { + "version": "0.11.10", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/promise-call-limit": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/promzard": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/read": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/read-cmd-shim": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/read-package-json": { + "version": "6.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/read-package-json-fast": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/readable-stream": { + "version": "4.4.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/signal-exit": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/sigstore": { + "version": "1.9.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/socks": { + "version": "2.7.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/socks-proxy-agent": { + "version": "7.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/spdx-correct": { + "version": "3.2.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.3.0", + "dev": true, + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.13", + "dev": true, + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ssri": { + "version": "10.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/supports-color": { + "version": "9.4.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/tar": { + "version": "6.1.15", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/tuf-js": { + "version": "1.1.7", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/unique-filename": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/unique-slug": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/validate-npm-package-name": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/walk-up-path": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wcwidth": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/which": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wide-align": { + "version": "1.1.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/write-file-atomic": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/p-reduce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", + "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/parse-json": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", + "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.21.4", + "error-ex": "^1.3.2", + "json-parse-even-better-errors": "^3.0.0", + "lines-and-columns": "^2.0.3", + "type-fest": "^3.8.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/parse-json/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/read-pkg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", + "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^6.0.0", + "parse-json": "^7.0.0", + "type-fest": "^4.2.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/read-pkg-up": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz", + "integrity": "sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0", + "read-pkg": "^8.1.0", + "type-fest": "^4.2.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", + "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/read-pkg/node_modules/type-fest": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", + "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/semantic-release": { + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-21.1.2.tgz", + "integrity": "sha512-kz76azHrT8+VEkQjoCBHE06JNQgTgsC4bT8XfCzb7DHcsk9vG3fqeMVik8h5rcWCYi2Fd+M3bwA7BG8Z8cRwtA==", + "dev": true, + "dependencies": { + "@semantic-release/commit-analyzer": "^10.0.0", + "@semantic-release/error": "^4.0.0", + "@semantic-release/github": "^9.0.0", + "@semantic-release/npm": "^10.0.2", + "@semantic-release/release-notes-generator": "^11.0.0", + "aggregate-error": "^5.0.0", + "cosmiconfig": "^8.0.0", + "debug": "^4.0.0", + "env-ci": "^9.0.0", + "execa": "^8.0.0", + "figures": "^5.0.0", + "find-versions": "^5.1.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^3.0.0", + "hosted-git-info": "^7.0.0", + "lodash-es": "^4.17.21", + "marked": "^5.0.0", + "marked-terminal": "^5.1.1", + "micromatch": "^4.0.2", + "p-each-series": "^3.0.0", + "p-reduce": "^3.0.0", + "read-pkg-up": "^10.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "semver-diff": "^4.0.0", + "signale": "^1.2.1", + "yargs": "^17.5.1" + }, + "bin": { + "semantic-release": "bin/semantic-release.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/semantic-release/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/semantic-release/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dev": true, + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/semantic-release/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/semantic-release/node_modules/execa/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/semantic-release/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" } }, "node_modules/@semantic-release/changelog": { @@ -509,9 +4671,9 @@ } }, "node_modules/@semantic-release/github": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-9.2.3.tgz", - "integrity": "sha512-FAjXb1F84CVI6IG8fWi+XS9ErYD+s3MHkP03zBa3+GyUrV4kqwYu/WPppIciHxujGFR51SAWPkOY5rnH6ZlrxA==", + "version": "9.2.6", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-9.2.6.tgz", + "integrity": "sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA==", "dev": true, "dependencies": { "@octokit/core": "^5.0.0", @@ -527,8 +4689,8 @@ "https-proxy-agent": "^7.0.0", "issue-parser": "^6.0.0", "lodash-es": "^4.17.21", - "mime": "^3.0.0", - "p-filter": "^3.0.0", + "mime": "^4.0.0", + "p-filter": "^4.0.0", "url-join": "^5.0.0" }, "engines": { @@ -578,6 +4740,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@semantic-release/github/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@semantic-release/github/node_modules/indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", @@ -591,9 +4765,9 @@ } }, "node_modules/@semantic-release/npm": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-11.0.1.tgz", - "integrity": "sha512-nFcT0pgVwpXsPkzjqP3ObH+pILeN1AbYscCDuYwgZEPZukL+RsGhrtdT4HA1Gjb/y1bVbE90JNtMIcgRi5z/Fg==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-11.0.2.tgz", + "integrity": "sha512-owtf3RjyPvRE63iUKZ5/xO4uqjRpVQDUB9+nnXj0xwfIeM9pRl+cG+zGDzdftR4m3f2s4Wyf3SexW+kF5DFtWA==", "dev": true, "dependencies": { "@semantic-release/error": "^4.0.0", @@ -657,6 +4831,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@semantic-release/npm/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@semantic-release/npm/node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -738,9 +4924,9 @@ } }, "node_modules/@semantic-release/npm/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -863,6 +5049,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", @@ -957,6 +5149,15 @@ "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/before-after-hook": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", @@ -990,6 +5191,32 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cardinal": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", @@ -1166,14 +5393,14 @@ "dev": true }, "node_modules/cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "dependencies": { - "import-fresh": "^3.2.1", + "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", + "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "engines": { @@ -1181,6 +5408,14 @@ }, "funding": { "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/cross-spawn": { @@ -1224,6 +5459,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1241,6 +5485,40 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -1383,9 +5661,9 @@ } }, "node_modules/env-ci/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -1467,15 +5745,12 @@ } }, "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, "node_modules/esprima": { @@ -1531,9 +5806,9 @@ } }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -1566,6 +5841,18 @@ "node": ">=8" } }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/find-up-simple": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", @@ -1604,9 +5891,9 @@ } }, "node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -1670,16 +5957,6 @@ "through2": "~2.0.0" } }, - "node_modules/git-log-parser/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -1731,9 +6008,9 @@ "dev": true }, "node_modules/gradle-semantic-release-plugin": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/gradle-semantic-release-plugin/-/gradle-semantic-release-plugin-1.8.0.tgz", - "integrity": "sha512-lRoKlLJvQbvRykDf6nWVuf/XyHEO9TL8dcnLX9lDag8zn5tkOqp5Tctb4re1YEek0zsSVAVX/1nw5lkV5pfm/Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/gradle-semantic-release-plugin/-/gradle-semantic-release-plugin-1.9.0.tgz", + "integrity": "sha512-8schNX6kF/M9oHFW25d9lWt0U76rXfqyO5sYreROqpwR+TXt6vcHc8w99dSM8cv1rGe+MuKsKlq5zasK+7Cpug==", "dev": true, "funding": [ { @@ -1742,7 +6019,7 @@ } ], "dependencies": { - "promisified-properties": "^2.0.27", + "promisified-properties": "^3.0.0", "split2": "^4.1.0" }, "engines": { @@ -1773,6 +6050,15 @@ "uglify-js": "^3.1.4" } }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1887,6 +6173,18 @@ "node": ">=4" } }, + "node_modules/import-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", + "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", + "dev": true, + "engines": { + "node": ">=12.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/import-from-esm": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-1.3.3.tgz", @@ -2025,10 +6323,10 @@ "node": ">=8" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -2180,6 +6478,15 @@ "node": "*" } }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -2214,6 +6521,19 @@ "node": ">=4" } }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -2238,6 +6558,12 @@ "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", "dev": true }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", + "dev": true + }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -2257,14 +6583,26 @@ "dev": true }, "node_modules/lru-cache": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.3.tgz", - "integrity": "sha512-B7gr+F6MkqB3uzINHXNctGieGsRTMwIBgxkp0yq/5BwcuDzD4A8wQpHQW6vDAm1uKSLQghmRdD9sKqf2vJ1cEg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "dev": true, "engines": { "node": "14 || >=16.14" } }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/marked": { "version": "9.1.6", "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", @@ -2278,23 +6616,23 @@ } }, "node_modules/marked-terminal": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-6.1.0.tgz", - "integrity": "sha512-QaCSF6NV82oo6K0szEnmc65ooDeW0T/Adcyf0fcW+Hto2GT1VADFg8dn1zaeHqzj65fqDH1hMNChGNRaC/lbkA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-6.2.0.tgz", + "integrity": "sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw==", "dev": true, "dependencies": { "ansi-escapes": "^6.2.0", "cardinal": "^2.1.1", "chalk": "^5.3.0", "cli-table3": "^0.6.3", - "node-emoji": "^2.1.0", + "node-emoji": "^2.1.3", "supports-hyperlinks": "^3.0.0" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "marked": ">=1 <11" + "marked": ">=1 <12" } }, "node_modules/meow": { @@ -2338,15 +6676,18 @@ } }, "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.1.tgz", + "integrity": "sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==", "dev": true, + "funding": [ + "https://github.com/sponsors/broofa" + ], "bin": { - "mime": "cli.js" + "mime": "bin/cli.js" }, "engines": { - "node": ">=10.0.0" + "node": ">=16" } }, "node_modules/mimic-fn": { @@ -2358,6 +6699,15 @@ "node": ">=6" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -2367,6 +6717,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -2428,9 +6801,9 @@ } }, "node_modules/npm": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.2.4.tgz", - "integrity": "sha512-umEuYneVEYO9KoEEI8n2sSGmNQeqco/3BSeacRlqIkCzw4E7XGtYSWMeJobxzr6hZ2n9cM+u5TsMTcC5bAgoWA==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.2.5.tgz", + "integrity": "sha512-lXdZ7titEN8CH5YJk9C/aYRU9JeDxQ4d8rwIIDsvH3SMjLjHTukB2CFstMiB30zXs4vCrPN2WH6cDq1yHBeJAw==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -2517,7 +6890,7 @@ "@sigstore/tuf": "^2.2.0", "abbrev": "^2.0.0", "archy": "~1.0.0", - "cacache": "^18.0.0", + "cacache": "^18.0.1", "chalk": "^5.3.0", "ci-info": "^4.0.0", "cli-columns": "^4.0.0", @@ -2531,7 +6904,7 @@ "ini": "^4.1.1", "init-package-json": "^6.0.0", "is-cidr": "^5.0.3", - "json-parse-even-better-errors": "^3.0.0", + "json-parse-even-better-errors": "^3.0.1", "libnpmaccess": "^8.0.1", "libnpmdiff": "^6.0.3", "libnpmexec": "^7.0.4", @@ -2560,7 +6933,7 @@ "npm-user-validate": "^2.0.0", "npmlog": "^7.0.1", "p-map": "^4.0.0", - "pacote": "^17.0.4", + "pacote": "^17.0.5", "parse-conflict-json": "^3.0.1", "proc-log": "^3.0.0", "qrcode-terminal": "^0.12.0", @@ -2671,7 +7044,7 @@ } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "7.2.1", + "version": "7.2.2", "dev": true, "inBundle": true, "license": "ISC", @@ -2718,7 +7091,7 @@ } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "8.0.2", + "version": "8.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -3184,7 +7557,7 @@ } }, "node_modules/npm/node_modules/cacache": { - "version": "18.0.0", + "version": "18.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -3194,7 +7567,7 @@ "glob": "^10.2.2", "lru-cache": "^10.0.1", "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", + "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", @@ -3765,7 +8138,7 @@ "license": "BSD-3-Clause" }, "node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.3", + "version": "6.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -3903,7 +8276,7 @@ } }, "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", + "version": "3.0.1", "dev": true, "inBundle": true, "license": "MIT", @@ -3942,7 +8315,7 @@ "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { - "version": "8.0.1", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -3955,7 +8328,7 @@ } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "6.0.3", + "version": "6.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -3975,7 +8348,7 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "7.0.4", + "version": "7.0.5", "dev": true, "inBundle": true, "license": "ISC", @@ -3997,7 +8370,7 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "5.0.1", + "version": "5.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -4009,7 +8382,7 @@ } }, "node_modules/npm/node_modules/libnpmhook": { - "version": "10.0.0", + "version": "10.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -4022,7 +8395,7 @@ } }, "node_modules/npm/node_modules/libnpmorg": { - "version": "6.0.1", + "version": "6.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -4035,7 +8408,7 @@ } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "6.0.3", + "version": "6.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -4050,7 +8423,7 @@ } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "9.0.2", + "version": "9.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -4069,7 +8442,7 @@ } }, "node_modules/npm/node_modules/libnpmsearch": { - "version": "7.0.0", + "version": "7.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -4081,7 +8454,7 @@ } }, "node_modules/npm/node_modules/libnpmteam": { - "version": "6.0.0", + "version": "6.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -4094,7 +8467,7 @@ } }, "node_modules/npm/node_modules/libnpmversion": { - "version": "5.0.1", + "version": "5.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -4110,13 +8483,10 @@ } }, "node_modules/npm/node_modules/lru-cache": { - "version": "10.0.2", + "version": "10.1.0", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, "engines": { "node": "14 || >=16.14" } @@ -4168,27 +8538,15 @@ } }, "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", + "version": "2.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/npm/node_modules/minipass-fetch": { @@ -4475,12 +8833,12 @@ } }, "node_modules/npm/node_modules/npm-packlist": { - "version": "8.0.0", + "version": "8.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "ignore-walk": "^6.0.0" + "ignore-walk": "^6.0.4" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -4572,7 +8930,7 @@ } }, "node_modules/npm/node_modules/pacote": { - "version": "17.0.4", + "version": "17.0.5", "dev": true, "inBundle": true, "license": "ISC", @@ -5458,15 +9816,15 @@ } }, "node_modules/p-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", - "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", + "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", "dev": true, "dependencies": { - "p-map": "^5.1.0" + "p-map": "^7.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5481,59 +9839,37 @@ "node": ">=8" } }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", - "dev": true, - "dependencies": { - "aggregate-error": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map/node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map/node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.1.tgz", + "integrity": "sha512-2wnaR0XL/FDOj+TgpDuRb2KTjLnu3Fma6b1ZUwGY7LcqenMcvP/YFpjpbPKY6WVGsbuJZRuoUz8iPrt8ORnAFw==", "dev": true, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5548,6 +9884,15 @@ "node": ">=8" } }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5584,6 +9929,15 @@ "integrity": "sha512-u7p959wLfGAhJpSDJVYXoyMCXWYwHia78HhRBWqk7AIbxdmlrfdp5wX0l3xv/iTSH5HvhN9K7o26hwwpgS5Nmw==", "dev": true }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -5593,6 +9947,12 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -5636,73 +9996,6 @@ "node": ">=4" } }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -5710,15 +10003,15 @@ "dev": true }, "node_modules/promisified-properties": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/promisified-properties/-/promisified-properties-2.0.27.tgz", - "integrity": "sha512-fmx256M3b0QcHnqOj+Ok127LoYpmnYRf7g2OyLl7qD7Z0fzNbIZhHHIPKyvegbA29iAPP5BVWv7BJ/y2cMHHjA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/promisified-properties/-/promisified-properties-3.0.0.tgz", + "integrity": "sha512-ARteuBuUpPg/+spsMhcKHvdtOW/q8btyyVYYxxegGgx+7u9ix9at8DjP2KM2t8+4SuI8wBLt+3X876FMQx91yQ==", "dev": true, "dependencies": { "parsimmon": "^1.13.0" }, "engines": { - "node": ">=14.16", + "node": ">=18", "npm": ">=7.12" } }, @@ -5748,6 +10041,15 @@ } ] }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -5801,9 +10103,9 @@ } }, "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.2.tgz", - "integrity": "sha512-mcvrCjixA5166hSrUoJgGb9gBQN4loMYyj9zxuMs/66ibHNEFd5JXMw37YVDx58L4/QID9jIzdTBB4mDwDJ6KQ==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", + "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", "dev": true, "engines": { "node": ">=16" @@ -5812,24 +10114,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/read-pkg/node_modules/parse-json": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.0.1.tgz", - "integrity": "sha512-soKUg/q/8bcfuF3+plsbYldE74cVEVEPSC1BUPIGTaX1byXdz6Fo+CVYBdH0jj/5xWsFrNRksl11QkBgHqPQeQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", + "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", - "index-to-position": "^0.1.1", - "json-parse-even-better-errors": "^3.0.0", + "index-to-position": "^0.1.2", "type-fest": "^4.7.1" }, "engines": { @@ -5840,9 +10132,9 @@ } }, "node_modules/read-pkg/node_modules/type-fest": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.2.tgz", - "integrity": "sha512-mcvrCjixA5166hSrUoJgGb9gBQN4loMYyj9zxuMs/66ibHNEFd5JXMw37YVDx58L4/QID9jIzdTBB4mDwDJ6KQ==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", + "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", "dev": true, "engines": { "node": ">=16" @@ -5866,6 +10158,19 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/redeyed": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", @@ -5896,6 +10201,23 @@ "node": ">=0.10.0" } }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -6027,6 +10349,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/semantic-release/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/semantic-release/node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -6108,9 +10442,9 @@ } }, "node_modules/semantic-release/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -6321,15 +10655,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/signale/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/signale/node_modules/figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -6434,6 +10759,18 @@ "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -6506,6 +10843,18 @@ "node": ">=6" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -6540,6 +10889,18 @@ "node": ">=14.18" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/temp-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", @@ -6609,6 +10970,16 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6622,14 +10993,26 @@ } }, "node_modules/traverse": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", - "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", + "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/type-fest": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", @@ -6698,9 +11081,9 @@ "dev": true }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -6800,9 +11183,9 @@ "dev": true }, "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", @@ -6817,7 +11200,7 @@ "node": ">=12" } }, - "node_modules/yargs/node_modules/yargs-parser": { + "node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", @@ -6825,6 +11208,18 @@ "engines": { "node": ">=12" } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index f9c0647e..1e49342b 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "@saithodev/semantic-release-backmerge": "^4.0.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", - "gradle-semantic-release-plugin": "^1.8.0", + "gradle-semantic-release-plugin": "^1.9.0", "semantic-release": "^22.0.12" } } From 51e2f3b476b49460e2f3fc2b5f302a3a72d7963f Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Wed, 10 Jan 2024 09:14:12 +0100 Subject: [PATCH 24/44] fix: Use new integrations patch path --- .../patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt index 6a73e60f..35c47753 100644 --- a/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt @@ -44,7 +44,7 @@ object PlaybackSpeedPatch : BytecodePatch( addInstruction( injectIndex, "invoke-static { v$register }," + - " Lapp/revanced/tiktok/speed/SpeedPatch;->rememberPlaybackSpeed(F)V" + " Lapp/revanced/integrations/tiktok/speed/PlaybackSpeedPatch;->rememberPlaybackSpeed(F)V" ) } ?: throw GetSpeedFingerprint.exception @@ -63,7 +63,7 @@ object PlaybackSpeedPatch : BytecodePatch( move-result-object v1 # Desired playback speed retrieved using getPlaybackSpeed method. - invoke-static {}, Lapp/revanced/tiktok/speed/SpeedPatch;->getPlaybackSpeed()F + invoke-static {}, Lapp/revanced/integrations/tiktok/speed/PlaybackSpeedPatch;->getPlaybackSpeed()F move-result-object v2 invoke-static { v0, v1, v2 }, ${onVideoSwiped.method} """ From 4dcefe7ba146bde36741ef11b688a24d68b924c5 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 10 Jan 2024 08:16:50 +0000 Subject: [PATCH 25/44] chore(release): 4.0.0-dev.7 [skip ci] # [4.0.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.6...v4.0.0-dev.7) (2024-01-10) ### Bug Fixes * Use new integrations patch path ([51e2f3b](https://github.com/ReVanced/revanced-patches/commit/51e2f3b476b49460e2f3fc2b5f302a3a72d7963f)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 924f552d..20167f8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [4.0.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.6...v4.0.0-dev.7) (2024-01-10) + + +### Bug Fixes + +* Use new integrations patch path ([51e2f3b](https://github.com/ReVanced/revanced-patches/commit/51e2f3b476b49460e2f3fc2b5f302a3a72d7963f)) + # [4.0.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.5...v4.0.0-dev.6) (2024-01-09) diff --git a/gradle.properties b/gradle.properties index e0e4e0fc..90afc19b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 4.0.0-dev.6 +version = 4.0.0-dev.7 From 2e1410bc0f425b7922053c33e1cfe45aaa9b9105 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Wed, 10 Jan 2024 09:33:02 +0100 Subject: [PATCH 26/44] build: Bump dependencies --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5fa81a52..8da2c1cb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -revanced-patcher = "19.1.0" +revanced-patcher = "19.2.0" smali = "3.0.3" guava = "33.0.0-jre" gson = "2.10.1" From b2a5dd3efc39ae8a42159858b9c00b5b2f8655a4 Mon Sep 17 00:00:00 2001 From: KobeW50 <84587632+KobeW50@users.noreply.github.com> Date: Wed, 10 Jan 2024 06:26:24 -0500 Subject: [PATCH 27/44] fix(YouTube): Shorten setting titles to fit on screen (#2579) --- .../youtube/layout/hide/general/HideLayoutComponentsPatch.kt | 2 +- .../patches/youtube/misc/announcements/AnnouncementsPatch.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index 244c90da..d4a58b1d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -97,7 +97,7 @@ object HideLayoutComponentsPatch : BytecodePatch( "revanced_hide_search_result_recommendations", StringResource( "revanced_hide_search_result_recommendations_title", - "Hide search result recommendations (e.g People also watched)" + "Hide \\\'People also watched\\\' recommendations" ), StringResource( "revanced_hide_search_result_recommendations_summary_on", diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt index 0e0c8b5a..2ca8b893 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt @@ -43,7 +43,7 @@ object AnnouncementsPatch : BytecodePatch( "revanced_announcements", StringResource( "revanced_announcements_title", - "Show announcements from ReVanced" + "Show ReVanced announcements" ), StringResource( "revanced_announcements_summary_on", From 1722767ebadb549c703aff3ff25f31391ddb6ea8 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 10 Jan 2024 11:28:55 +0000 Subject: [PATCH 28/44] chore(release): 4.0.0-dev.8 [skip ci] # [4.0.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.7...v4.0.0-dev.8) (2024-01-10) ### Bug Fixes * **YouTube:** Shorten setting titles to fit on screen ([#2579](https://github.com/ReVanced/revanced-patches/issues/2579)) ([b2a5dd3](https://github.com/ReVanced/revanced-patches/commit/b2a5dd3efc39ae8a42159858b9c00b5b2f8655a4)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20167f8d..e6935244 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [4.0.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.7...v4.0.0-dev.8) (2024-01-10) + + +### Bug Fixes + +* **YouTube:** Shorten setting titles to fit on screen ([#2579](https://github.com/ReVanced/revanced-patches/issues/2579)) ([b2a5dd3](https://github.com/ReVanced/revanced-patches/commit/b2a5dd3efc39ae8a42159858b9c00b5b2f8655a4)) + # [4.0.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.6...v4.0.0-dev.7) (2024-01-10) diff --git a/gradle.properties b/gradle.properties index 90afc19b..2de83d0d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 4.0.0-dev.7 +version = 4.0.0-dev.8 From 2fdc4c23b5f39153ad71071359274c39129d691f Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 11 Jan 2024 18:54:10 +0400 Subject: [PATCH 29/44] fix(YouTube - Enable slide to seek): Change patch default to excluded and add description disclaimer (#2610) --- .../youtube/interaction/seekbar/EnableSlideToSeekPatch.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt index d597625c..79f7d20d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt @@ -17,7 +17,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( name = "Enable slide to seek", - description = "Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.", + description = "Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player. Including this patch may cause issues with tapping or double tapping the video player overlay.", dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( @@ -29,7 +29,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.45.43" ] ) - ] + ], + use = false ) @Suppress("unused") object EnableSlideToSeekPatch : BytecodePatch( From 57908dbeefe8c65aff2e72e62cf3e7aab476d0ac Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 11 Jan 2024 14:56:11 +0000 Subject: [PATCH 30/44] chore(release): 4.0.0-dev.9 [skip ci] # [4.0.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.8...v4.0.0-dev.9) (2024-01-11) ### Bug Fixes * **YouTube - Enable slide to seek:** Change patch default to excluded and add description disclaimer ([#2610](https://github.com/ReVanced/revanced-patches/issues/2610)) ([2fdc4c2](https://github.com/ReVanced/revanced-patches/commit/2fdc4c23b5f39153ad71071359274c39129d691f)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- patches.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6935244..0f0a3b05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [4.0.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.8...v4.0.0-dev.9) (2024-01-11) + + +### Bug Fixes + +* **YouTube - Enable slide to seek:** Change patch default to excluded and add description disclaimer ([#2610](https://github.com/ReVanced/revanced-patches/issues/2610)) ([2fdc4c2](https://github.com/ReVanced/revanced-patches/commit/2fdc4c23b5f39153ad71071359274c39129d691f)) + # [4.0.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.7...v4.0.0-dev.8) (2024-01-10) diff --git a/gradle.properties b/gradle.properties index 2de83d0d..215dd66d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 4.0.0-dev.8 +version = 4.0.0-dev.9 diff --git a/patches.json b/patches.json index 3544a875..e2f25baf 100644 --- a/patches.json +++ b/patches.json @@ -1 +1 @@ -[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" Either a header name or a path to a custom header folder to use in the top bar.\n The path to a folder must contain one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos and retains the speed configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file +[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" Either a header name or a path to a custom header folder to use in the top bar.\n The path to a folder must contain one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player. Including this patch may cause issues with tapping or double tapping the video player overlay.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos and retains the speed configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file From a938e736fa2aed1792cfdce5656efa15d0791d71 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Tue, 16 Jan 2024 19:54:06 +0100 Subject: [PATCH 31/44] feat(YouTube): Support versions `18.48.39`, `18.49.37` and `19.01.34` (#2551) Co-authored-by: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> --- .../youtube/ad/general/HideAdsPatch.kt | 9 +-- .../ad/getpremium/HideGetPremiumPatch.kt | 6 +- .../patches/youtube/ad/video/VideoAdsPatch.kt | 6 +- .../copyvideourl/CopyVideoUrlBytecodePatch.kt | 13 ++--- .../ExternalDownloadsBytecodePatch.kt | 13 ++--- .../DisablePreciseSeekingGesturePatch.kt | 6 +- .../seekbar/EnableSeekbarTappingPatch.kt | 6 +- .../seekbar/EnableSlideToSeekPatch.kt | 6 +- .../SwipeControlsBytecodePatch.kt | 20 ++++--- .../layout/autocaptions/AutoCaptionsPatch.kt | 6 +- .../layout/buttons/action/HideButtonsPatch.kt | 6 +- .../autoplay/HideAutoplayButtonPatch.kt | 6 +- .../captions/HideCaptionsButtonPatch.kt | 6 +- .../navigation/NavigationButtonsPatch.kt | 6 +- .../player/hide/HidePlayerButtonsPatch.kt | 6 +- .../layout/hide/albumcards/AlbumCardsPatch.kt | 6 +- .../hide/breakingnews/BreakingNewsPatch.kt | 6 +- .../layout/hide/comments/CommentsPatch.kt | 6 +- .../crowdfundingbox/CrowdfundingBoxPatch.kt | 6 +- .../endscreencards/HideEndscreenCardsPatch.kt | 6 +- .../hide/filterbar/HideFilterBarPatch.kt | 6 +- .../HideFloatingMicrophoneButtonPatch.kt | 6 +- .../DisableFullscreenAmbientModePatch.kt | 6 +- .../hide/general/HideLayoutComponentsPatch.kt | 6 +- .../hide/infocards/HideInfoCardsPatch.kt | 6 +- .../loadmorebutton/HideLoadMoreButtonPatch.kt | 6 +- .../HideEmailAddressPatch.kt | 6 +- .../HidePlayerFlyoutMenuPatch.kt | 23 +++++--- .../DisableRollingNumberAnimationPatch.kt | 6 +- .../layout/hide/seekbar/HideSeekbarPatch.kt | 6 +- .../hide/shorts/HideShortsComponentsPatch.kt | 6 +- .../DisableSuggestedVideoEndScreenPatch.kt | 6 +- .../layout/hide/time/HideTimestampPatch.kt | 7 ++- .../panels/popup/PlayerPopupPanelsPatch.kt | 6 +- .../PlayerControlsBackgroundPatch.kt | 6 +- .../ReturnYouTubeDislikePatch.kt | 46 ++++++--------- ...ingNumberMeasureAnimatedTextFingerprint.kt | 27 +++++---- ...lingNumberMeasureStaticLabelFingerprint.kt | 2 +- ...berMeasureStaticLabelParentFingerprint.kt} | 2 +- .../layout/searchbar/WideSearchbarPatch.kt | 6 +- .../RestoreOldSeekbarThumbnailsPatch.kt | 6 +- .../sponsorblock/SponsorBlockBytecodePatch.kt | 10 +--- .../spoofappversion/SpoofAppVersionPatch.kt | 6 +- .../DisableResumingShortsOnStartupPatch.kt | 6 +- .../tabletminiplayer/TabletMiniPlayerPatch.kt | 6 +- .../layout/theme/ThemeBytecodePatch.kt | 6 +- .../thumbnails/AlternativeThumbnailsPatch.kt | 6 +- .../misc/announcements/AnnouncementsPatch.kt | 8 +-- .../misc/autorepeat/AutoRepeatPatch.kt | 6 +- .../spoof/SpoofDeviceDimensionsPatch.kt | 7 ++- .../FixBackToExitGesturePatch.kt | 4 +- .../fingerprints/OnBackPressedFingerprint.kt | 4 +- .../misc/fix/playback/ClientSpoofPatch.kt | 14 ++--- .../youtube/misc/gms/GmsCoreSupportPatch.kt | 10 +--- .../misc/links/BypassURLRedirectsPatch.kt | 7 ++- .../misc/links/OpenLinksExternallyPatch.kt | 6 +- .../MinimizedPlaybackPatch.kt | 10 +--- .../RemoveTrackingQueryParameterPatch.kt | 6 +- ...gerprint.kt => MainActivityFingerprint.kt} | 6 +- .../video/hdrbrightness/HDRBrightnessPatch.kt | 6 +- .../information/VideoInformationPatch.kt | 2 +- .../PlayerResponseMethodHookPatch.kt | 56 +++++++++++++++---- .../quality/RememberVideoQualityPatch.kt | 10 +--- .../youtube/video/speed/PlaybackSpeedPatch.kt | 10 +--- .../speed/custom/CustomPlaybackSpeedPatch.kt | 8 ++- .../CustomPlaybackSpeedResourcePatch.kt | 15 +++++ .../ShowOldPlaybackSpeedMenuFingerprint.kt | 9 ++- .../youtube/video/videoid/VideoIdPatch.kt | 4 +- .../videoid/fingerprint/VideoIdFingerprint.kt | 10 +--- .../VideoIdFingerprintBackgroundPlay.kt | 10 +--- .../RestoreOldVideoQualityMenuPatch.kt | 6 +- 71 files changed, 362 insertions(+), 260 deletions(-) rename src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/{RollingNumberMeasureTextParentFingerprint.kt => RollingNumberMeasureStaticLabelParentFingerprint.kt} (82%) rename src/main/kotlin/app/revanced/patches/youtube/shared/fingerprints/{WatchWhileActivityFingerprint.kt => MainActivityFingerprint.kt} (55%) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedResourcePatch.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt index 84167225..ef10af3a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt @@ -24,15 +24,16 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c ], compatiblePackages = [ CompatiblePackage( - "com.google.android.youtube", - [ + "com.google.android.youtube", [ "18.32.39", "18.37.36", "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt index 9ec7fa8c..097125ee 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt @@ -25,8 +25,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt index 370e9957..b338686d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt @@ -29,8 +29,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt index 659b2ff1..c1fc4765 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt @@ -17,15 +17,10 @@ import app.revanced.patches.youtube.video.information.VideoInformationPatch ], compatiblePackages = [ CompatiblePackage( - "com.google.android.youtube", - [ - "18.32.39", - "18.37.36", - "18.38.44", - "18.43.45", - "18.44.41", - "18.45.41", - "18.45.43" + "com.google.android.youtube", [ + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt index 015aeba1..0564d57d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt @@ -17,15 +17,10 @@ import app.revanced.patches.youtube.video.information.VideoInformationPatch ], compatiblePackages = [ CompatiblePackage( - "com.google.android.youtube", - [ - "18.32.39", - "18.37.36", - "18.38.44", - "18.43.45", - "18.44.41", - "18.45.41", - "18.45.43" + "com.google.android.youtube", [ + "18.48.39", + "18.49.37", + "19.01.34" ] ), ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt index df776163..0e9892d7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt @@ -27,8 +27,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt index 5d0816a6..41f58f72 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt @@ -29,8 +29,10 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference [ "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt index 79f7d20d..364e9655 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt @@ -25,8 +25,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction [ "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ], diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsBytecodePatch.kt index 6db26ca8..c1a4f644 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsBytecodePatch.kt @@ -1,7 +1,5 @@ package app.revanced.patches.youtube.interaction.swipecontrols -import app.revanced.util.transformMethods -import app.revanced.util.traverseClassHierarchy import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage @@ -10,7 +8,9 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMu import app.revanced.patches.youtube.interaction.swipecontrols.fingerprints.SwipeControlsHostActivityFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.playertype.PlayerTypeHookPatch -import app.revanced.patches.youtube.shared.fingerprints.WatchWhileActivityFingerprint +import app.revanced.patches.youtube.shared.fingerprints.MainActivityFingerprint +import app.revanced.util.transformMethods +import app.revanced.util.traverseClassHierarchy import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.immutable.ImmutableMethod @@ -31,8 +31,10 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] @@ -40,19 +42,19 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod @Suppress("unused") object SwipeControlsBytecodePatch : BytecodePatch( setOf( - WatchWhileActivityFingerprint, + MainActivityFingerprint, SwipeControlsHostActivityFingerprint ) ) { override fun execute(context: BytecodeContext) { val wrapperClass = SwipeControlsHostActivityFingerprint.result!!.mutableClass - val targetClass = WatchWhileActivityFingerprint.result!!.mutableClass + val targetClass = MainActivityFingerprint.result!!.mutableClass - // inject the wrapper class from integrations into the class hierarchy of WatchWhileActivity + // Inject the wrapper class from integrations into the class hierarchy of MainActivity. wrapperClass.setSuperClass(targetClass.superclass) targetClass.setSuperClass(wrapperClass.type) - // ensure all classes and methods in the hierarchy are non-final, so we can override them in integrations + // Ensure all classes and methods in the hierarchy are non-final, so we can override them in integrations. context.traverseClassHierarchy(targetClass) { accessFlags = accessFlags and AccessFlags.FINAL.value.inv() transformMethods { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt index dec88bf0..19b93d79 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt @@ -29,8 +29,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ], diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt index 7f88b2b7..c3b07065 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt @@ -27,8 +27,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt index 4e3ab1d1..4b53c342 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt @@ -37,8 +37,10 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt index a3114d60..ffbd4347 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt @@ -28,8 +28,10 @@ import com.android.tools.smali.dexlib2.Opcode "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt index ceb78d6c..abcad73d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt @@ -34,8 +34,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt index dc64b939..afe026ad 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt @@ -32,8 +32,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction3rc "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt index ae2d3c40..689e89cf 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt @@ -27,8 +27,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt index 7fb2202f..067bfa44 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt @@ -27,8 +27,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt index dd81aa19..777c9c36 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt @@ -26,8 +26,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt index f01894d0..9b01f063 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt @@ -27,8 +27,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt index c85e6380..0ed39df9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt @@ -30,8 +30,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction21c "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt index 940cb4ca..0cf334c7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt @@ -27,8 +27,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt index dd98a8ae..06ee7d04 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt @@ -23,8 +23,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt index 60a2264d..dd8f3900 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt @@ -23,8 +23,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index d4a58b1d..2d45795b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -37,8 +37,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt index d49c32e4..cf9f08d3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt @@ -34,8 +34,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt index fdd2fc1e..076c4b78 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt @@ -23,8 +23,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt index d505f2c9..a8c8157d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt @@ -23,8 +23,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt index df8387a9..074416c1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt @@ -20,15 +20,20 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch SettingsPatch::class ], compatiblePackages = [ - CompatiblePackage("com.google.android.youtube", [ - "18.32.39", - "18.37.36", - "18.38.44", - "18.43.45", - "18.44.41", - "18.45.41", - "18.45.43" - ]) + CompatiblePackage( + "com.google.android.youtube", [ + "18.32.39", + "18.37.36", + "18.38.44", + "18.43.45", + "18.44.41", + "18.45.41", + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" + ] + ) ] ) @Suppress("unused") diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt index 169741ca..4bac1420 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt @@ -25,8 +25,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "com.google.android.youtube", [ "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt index ef8853b3..3a62fd88 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt @@ -31,8 +31,10 @@ import app.revanced.patches.youtube.shared.fingerprints.SeekbarOnDrawFingerprint "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index ddd7c735..429c6f62 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -35,8 +35,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt index 0715c65c..02994d5e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt @@ -22,8 +22,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt index 39e1f6ff..a298db24 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt @@ -19,13 +19,14 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ - "18.32.39", "18.37.36", "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt index 602bf6a3..5c46ca2b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt @@ -24,8 +24,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt index b083a028..c16e76da 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt @@ -18,8 +18,10 @@ import org.w3c.dom.Element "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ], diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index 76e58255..2e0f4ba5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -5,7 +5,6 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException @@ -18,7 +17,7 @@ import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.Lik import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RemoveLikeFingerprint import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureAnimatedTextFingerprint import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureStaticLabelFingerprint -import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureTextParentFingerprint +import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureStaticLabelParentFingerprint import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberSetterFingerprint import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberTextViewFingerprint import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.ShortsTextViewFingerprint @@ -55,11 +54,8 @@ import com.android.tools.smali.dexlib2.iface.reference.TypeReference compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ - "18.38.44", - "18.43.45", - "18.44.41", - "18.45.41", - "18.45.43" + "18.49.37", + "19.01.34" ] ) ] @@ -76,7 +72,8 @@ object ReturnYouTubeDislikePatch : BytecodePatch( DislikeFingerprint, RemoveLikeFingerprint, RollingNumberSetterFingerprint, - RollingNumberMeasureTextParentFingerprint, + RollingNumberMeasureStaticLabelParentFingerprint, + RollingNumberMeasureAnimatedTextFingerprint, RollingNumberTextViewFingerprint, RollingNumberTextViewAnimationUpdateFingerprint ) @@ -276,37 +273,30 @@ object ReturnYouTubeDislikePatch : BytecodePatch( // Rolling Number text views use the measured width of the raw string for layout. // Modify the measure text calculation to include the left drawable separator if needed. - RollingNumberMeasureAnimatedTextFingerprint.also { - if (!it.resolve(context, RollingNumberMeasureTextParentFingerprint.result!!.classDef)) - throw it.exception - }.result?.also { + RollingNumberMeasureAnimatedTextFingerprint.result?.also { + val scanResult = it.scanResult.patternScanResult!! + // Additional check to verify the opcodes are at the start of the method + if (scanResult.startIndex != 0) throw PatchException("Unexpected opcode location") + val endIndex = scanResult.endIndex it.mutableMethod.apply { - val returnInstructionIndex = it.scanResult.patternScanResult!!.endIndex - val measuredTextWidthRegister = - getInstruction(returnInstructionIndex).registerA + val measuredTextWidthRegister = getInstruction(endIndex).registerA - replaceInstruction( // Replace instruction to preserve control flow label. - returnInstructionIndex, - "invoke-static {p1, v$measuredTextWidthRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->onRollingNumberMeasured(Ljava/lang/String;F)F" - ) addInstructions( - returnInstructionIndex + 1, - """ - move-result v$measuredTextWidthRegister - return v$measuredTextWidthRegister + endIndex + 1, """ + invoke-static {p1, v$measuredTextWidthRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->onRollingNumberMeasured(Ljava/lang/String;F)F + move-result v$measuredTextWidthRegister + """ ) } } ?: throw RollingNumberMeasureAnimatedTextFingerprint.exception // Additional text measurement method. Used if YouTube decides not to animate the likes count // and sometimes used for initial video load. - RollingNumberMeasureStaticLabelFingerprint.also { - if (!it.resolve(context, RollingNumberMeasureTextParentFingerprint.result!!.classDef)) - throw it.exception - }.result?.also { + RollingNumberMeasureStaticLabelFingerprint.resolve(context, RollingNumberMeasureStaticLabelParentFingerprint.resultOrThrow().classDef) + RollingNumberMeasureStaticLabelFingerprint.result?.also { + val measureTextIndex = it.scanResult.patternScanResult!!.startIndex + 1 it.mutableMethod.apply { - val measureTextIndex = it.scanResult.patternScanResult!!.startIndex + 1 val freeRegister = getInstruction(0).registerA addInstructions( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/RollingNumberMeasureAnimatedTextFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/RollingNumberMeasureAnimatedTextFingerprint.kt index 717131ff..69d01681 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/RollingNumberMeasureAnimatedTextFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/RollingNumberMeasureAnimatedTextFingerprint.kt @@ -5,19 +5,24 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -/** - * Resolves to class found in [RollingNumberMeasureTextParentFingerprint]. - */ internal object RollingNumberMeasureAnimatedTextFingerprint : MethodFingerprint( - returnType = "F", - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - parameters = listOf("Ljava/lang/String;"), + returnType = "Lj\$/util/Optional;", + accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, + parameters = listOf( + "L", + "Ljava/lang/String;", + "L" + ), opcodes = listOf( - Opcode.INVOKE_VIRTUAL, + Opcode.IGET, // First instruction of method + Opcode.IGET_OBJECT, + Opcode.IGET_OBJECT, + Opcode.CONST_HIGH16, + Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT, - Opcode.ADD_FLOAT_2ADDR, - Opcode.ADD_INT_LIT8, - Opcode.GOTO, - Opcode.RETURN + Opcode.CONST_4, + Opcode.AGET, + Opcode.CONST_4, + Opcode.CONST_4, // Measured text width ) ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/RollingNumberMeasureStaticLabelFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/RollingNumberMeasureStaticLabelFingerprint.kt index 612b711d..d16b580b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/RollingNumberMeasureStaticLabelFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/RollingNumberMeasureStaticLabelFingerprint.kt @@ -6,7 +6,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode /** - * Resolves to class found in [RollingNumberMeasureTextParentFingerprint]. + * Resolves to class found in [RollingNumberMeasureStaticLabelParentFingerprint]. */ internal object RollingNumberMeasureStaticLabelFingerprint : MethodFingerprint( returnType = "F", diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/RollingNumberMeasureTextParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/RollingNumberMeasureStaticLabelParentFingerprint.kt similarity index 82% rename from src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/RollingNumberMeasureTextParentFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/RollingNumberMeasureStaticLabelParentFingerprint.kt index 319605be..aa5229e9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/RollingNumberMeasureTextParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/fingerprints/RollingNumberMeasureStaticLabelParentFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal object RollingNumberMeasureTextParentFingerprint : MethodFingerprint( +internal object RollingNumberMeasureStaticLabelParentFingerprint : MethodFingerprint( returnType = "Ljava/lang/String;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt index 3bbe66fa..d5ea7bce 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt @@ -26,8 +26,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.37.36", "18.38.44", "18.43.45", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt index 1df0b139..779652d1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt @@ -23,8 +23,10 @@ import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt index 6199e007..c15d55c8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt @@ -38,13 +38,9 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ - "18.32.39", - "18.37.36", - "18.38.44", - "18.43.45", - "18.44.41", - "18.45.41", - "18.45.43" + "18.48.39", + "18.49.37", + "19.01.34" ] ) ], diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index 6336df40..b1a46448 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -28,8 +28,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt index 9518cc55..cd9f5343 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt @@ -24,8 +24,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt index e85cd940..c73dcb7a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt @@ -32,8 +32,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ) ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt index afd6e6cb..bffa7f80 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt @@ -35,8 +35,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt index 70b9ba1b..53568213 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt @@ -40,8 +40,10 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt index 2ca8b893..703aa79e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt @@ -10,7 +10,7 @@ import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.settings.preference.impl.StringResource import app.revanced.patches.shared.settings.preference.impl.SwitchPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch -import app.revanced.patches.youtube.shared.fingerprints.WatchWhileActivityFingerprint +import app.revanced.patches.youtube.shared.fingerprints.MainActivityFingerprint import com.android.tools.smali.dexlib2.Opcode @Patch( @@ -21,15 +21,15 @@ import com.android.tools.smali.dexlib2.Opcode ) @Suppress("unused") object AnnouncementsPatch : BytecodePatch( - setOf(WatchWhileActivityFingerprint) + setOf(MainActivityFingerprint) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/announcements/AnnouncementsPatch;" override fun execute(context: BytecodeContext) { - val onCreateMethod = WatchWhileActivityFingerprint.result?.let { + val onCreateMethod = MainActivityFingerprint.result?.let { it.mutableClass.methods.find { method -> method.name == "onCreate" } - } ?: throw WatchWhileActivityFingerprint.exception + } ?: throw MainActivityFingerprint.exception val superCallIndex = onCreateMethod.getInstructions().indexOfFirst { it.opcode == Opcode.INVOKE_SUPER_RANGE } diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt index 86f38ec8..387a9c25 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt @@ -28,8 +28,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt index 9bada899..e521e757 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt @@ -23,12 +23,15 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] ) +@Suppress("unused") object SpoofDeviceDimensionsPatch : BytecodePatch( setOf(DeviceDimensionsModelToStringFingerprint) ) { diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt index 663299b9..bdd3d496 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.misc.fix.backtoexitgesture -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.fingerprint.MethodFingerprint @@ -10,6 +9,7 @@ import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.OnBa import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewScrollingFingerprint import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewTopScrollingFingerprint import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewTopScrollingParentFingerprint +import app.revanced.util.exception @Patch(description = "Fixes the swipe back to exit gesture.") @Suppress("unused") @@ -37,7 +37,7 @@ internal object FixBackToExitGesturePatch : BytecodePatch( methodName = "onScrollingViews" ), OnBackPressedFingerprint to IntegrationsMethod( - "p0", "onBackPressed", "Lcom/google/android/apps/youtube/app/watchwhile/WatchWhileActivity;" + "p0", "onBackPressed", "Landroid/app/Activity;" ) ).forEach { (fingerprint, target) -> fingerprint.injectCall(target) } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/fingerprints/OnBackPressedFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/fingerprints/OnBackPressedFingerprint.kt index d44ddfe7..282122b8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/fingerprints/OnBackPressedFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/fingerprints/OnBackPressedFingerprint.kt @@ -12,7 +12,9 @@ internal object OnBackPressedFingerprint : MethodFingerprint( Opcode.RETURN_VOID ), customFingerprint = { methodDef, _ -> - methodDef.definingClass.endsWith("WatchWhileActivity;") + (methodDef.definingClass.endsWith("MainActivity;") || + // Old versions of YouTube called this class "WatchWhileActivity" instead. + methodDef.definingClass.endsWith("WatchWhileActivity;")) && methodDef.name == "onBackPressed" } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt index 243bad27..7e6f710c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt @@ -10,22 +10,16 @@ import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.misc.fix.playback.fingerprints.UserAgentHeaderBuilderFingerprint import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction - @Patch( name = "Client spoof", description = "Adds options to spoof the client to allow video playback.", dependencies = [SpoofSignaturePatch::class], compatiblePackages = [ CompatiblePackage( - "com.google.android.youtube", - [ - "18.32.39", - "18.37.36", - "18.38.44", - "18.43.45", - "18.44.41", - "18.45.41", - "18.45.43" + "com.google.android.youtube", [ + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt index d7d344cc..9f026008 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt @@ -33,13 +33,9 @@ object GmsCoreSupportPatch : AbstractGmsCoreSupportPatch( compatiblePackages = setOf( CompatiblePackage( "com.google.android.youtube", setOf( - "18.32.39", - "18.37.36", - "18.38.44", - "18.43.45", - "18.44.41", - "18.45.41", - "18.45.43" + "18.48.39", + "18.49.37", + "19.01.34" ) ) ), diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt index 38bb6353..bf94b60a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt @@ -25,12 +25,15 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction [ "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] ) +@Suppress("unused") object BypassURLRedirectsPatch : BytecodePatch( setOf(ABUriParserFingerprint, HTTPUriParserFingerprint) ) { diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt index 4aae45df..a81078f6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt @@ -28,8 +28,10 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt index a4cbad51..b40b3c32 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt @@ -34,13 +34,9 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference CompatiblePackage( "com.google.android.youtube", [ - "18.32.39", - "18.37.36", - "18.38.44", - "18.43.45", - "18.44.41", - "18.45.41", - "18.45.43" + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt index 53cd733d..3e3b69b3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt @@ -30,8 +30,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction [ "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/shared/fingerprints/WatchWhileActivityFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shared/fingerprints/MainActivityFingerprint.kt similarity index 55% rename from src/main/kotlin/app/revanced/patches/youtube/shared/fingerprints/WatchWhileActivityFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/shared/fingerprints/MainActivityFingerprint.kt index b7567b56..f7573bd5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shared/fingerprints/WatchWhileActivityFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shared/fingerprints/MainActivityFingerprint.kt @@ -4,10 +4,12 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal object WatchWhileActivityFingerprint : MethodFingerprint( +internal object MainActivityFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, parameters = listOf(), customFingerprint = { methodDef, _ -> - methodDef.definingClass.endsWith("WatchWhileActivity;") + methodDef.definingClass.endsWith("MainActivity;") + // Old versions of YouTube called this class "WatchWhileActivity" instead. + || methodDef.definingClass.endsWith("WatchWhileActivity;") } ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt index 8d94373b..0c072bbe 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt @@ -26,8 +26,10 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt index 353edcbd..48837009 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.video.information -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions @@ -14,6 +13,7 @@ import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.video.information.fingerprints.* import app.revanced.patches.youtube.video.playerresponse.PlayerResponseMethodHookPatch import app.revanced.patches.youtube.video.videoid.VideoIdPatch +import app.revanced.util.exception import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.BuilderInstruction diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt index 3811b761..135779ee 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt @@ -18,29 +18,44 @@ object PlayerResponseMethodHookPatch : BytecodePatch(setOf(PlayerParameterBuilderFingerprint)), Closeable, MutableSet by mutableSetOf() { - private const val VIDEO_ID_PARAMETER = 1 - private const val IS_SHORT_AND_OPENING_OR_PLAYING_PARAMETER = 11 - private const val PROTO_BUFFER_PARAMETER_PARAMETER = 3 + + // Parameter numbers of the patched method. + private const val PARAMETER_VIDEO_ID = 1 + private const val PARAMETER_PROTO_BUFFER = 3 + private const val PARAMETER_IS_SHORT_AND_OPENING_OR_PLAYING = 11 + + // Temporary 4-bit registers used to pass the parameters to integrations. + private const val REGISTER_VIDEO_ID = 0 + private const val REGISTER_PROTO_BUFFER = 1 + private const val REGISTER_IS_SHORT_AND_OPENING_OR_PLAYING = 2 private lateinit var playerResponseMethod: MutableMethod + private var numberOfInstructionsAdded = 0 + override fun execute(context: BytecodeContext) { playerResponseMethod = PlayerParameterBuilderFingerprint.result?.mutableMethod ?: throw PlayerParameterBuilderFingerprint.exception } override fun close() { - fun hookVideoId(hook: Hook) = playerResponseMethod.addInstruction( - 0, "invoke-static {p$VIDEO_ID_PARAMETER, p$IS_SHORT_AND_OPENING_OR_PLAYING_PARAMETER}, $hook" - ) + fun hookVideoId(hook: Hook) { + playerResponseMethod.addInstruction( + 0, "invoke-static {v$REGISTER_VIDEO_ID, v$REGISTER_IS_SHORT_AND_OPENING_OR_PLAYING}, $hook" + ) + numberOfInstructionsAdded++ + } - fun hookProtoBufferParameter(hook: Hook) = playerResponseMethod.addInstructions( - 0, + fun hookProtoBufferParameter(hook: Hook) { + playerResponseMethod.addInstructions( + 0, + """ + invoke-static {v$REGISTER_PROTO_BUFFER, v$REGISTER_IS_SHORT_AND_OPENING_OR_PLAYING}, $hook + move-result-object v$REGISTER_PROTO_BUFFER """ - invoke-static {p$PROTO_BUFFER_PARAMETER_PARAMETER, p$IS_SHORT_AND_OPENING_OR_PLAYING_PARAMETER}, $hook - move-result-object p$PROTO_BUFFER_PARAMETER_PARAMETER - """ - ) + ) + numberOfInstructionsAdded += 2 + } // Reverse the order in order to preserve insertion order of the hooks. val beforeVideoIdHooks = filterIsInstance().asReversed() @@ -51,6 +66,23 @@ object PlayerResponseMethodHookPatch : afterVideoIdHooks.forEach(::hookProtoBufferParameter) videoIdHooks.forEach(::hookVideoId) beforeVideoIdHooks.forEach(::hookProtoBufferParameter) + + // On some app targets the method has too many registers pushing the parameters past v15. + // Move the parameters to 4-bit registers so they can be passed to integrations. + playerResponseMethod.addInstructions( + 0, """ + move-object/from16 v$REGISTER_VIDEO_ID, p$PARAMETER_VIDEO_ID + move-object/from16 v$REGISTER_PROTO_BUFFER, p$PARAMETER_PROTO_BUFFER + move/from16 v$REGISTER_IS_SHORT_AND_OPENING_OR_PLAYING, p$PARAMETER_IS_SHORT_AND_OPENING_OR_PLAYING + """, + ) + numberOfInstructionsAdded += 3 + + // Move the modified register back. + playerResponseMethod.addInstruction( + numberOfInstructionsAdded, + "move-object/from16 p$PARAMETER_PROTO_BUFFER, v$REGISTER_PROTO_BUFFER" + ) } internal abstract class Hook(private val methodDescriptor: String) { diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt index 49a578e9..ef4d7e3c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt @@ -31,13 +31,9 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ - "18.32.39", - "18.37.36", - "18.38.44", - "18.43.45", - "18.44.41", - "18.45.41", - "18.45.43" + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt index 244e8955..29f3d280 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt @@ -14,13 +14,9 @@ import app.revanced.patches.youtube.video.speed.remember.RememberPlaybackSpeedPa compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ - "18.32.39", - "18.37.36", - "18.38.44", - "18.43.45", - "18.44.41", - "18.45.41", - "18.45.43" + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt index 2e5afea5..a7ba8df2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt @@ -29,7 +29,13 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableField @Patch( description = "Adds custom playback speed options.", - dependencies = [IntegrationsPatch::class, LithoFilterPatch::class, SettingsPatch::class, RecyclerViewTreeHookPatch::class] + dependencies = [ + IntegrationsPatch::class, + LithoFilterPatch::class, + SettingsPatch::class, + RecyclerViewTreeHookPatch::class, + CustomPlaybackSpeedResourcePatch::class + ] ) object CustomPlaybackSpeedPatch : BytecodePatch( setOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedResourcePatch.kt new file mode 100644 index 00000000..93aaf552 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedResourcePatch.kt @@ -0,0 +1,15 @@ +package app.revanced.patches.youtube.video.speed.custom + +import app.revanced.patcher.data.ResourceContext +import app.revanced.patcher.patch.ResourcePatch +import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch + +internal object CustomPlaybackSpeedResourcePatch : ResourcePatch() { + var speedUnavailableId: Long = -1 + + override fun execute(context: ResourceContext) { + speedUnavailableId = ResourceMappingPatch.resourceMappings.single { + it.type == "string" && it.name == "varispeed_unavailable_message" + }.id + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/fingerprints/ShowOldPlaybackSpeedMenuFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/fingerprints/ShowOldPlaybackSpeedMenuFingerprint.kt index 4df113de..f893eb90 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/fingerprints/ShowOldPlaybackSpeedMenuFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/fingerprints/ShowOldPlaybackSpeedMenuFingerprint.kt @@ -1,7 +1,10 @@ package app.revanced.patches.youtube.video.speed.custom.fingerprints -import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.youtube.video.speed.custom.CustomPlaybackSpeedResourcePatch +import app.revanced.util.patch.LiteralValueFingerprint -internal object ShowOldPlaybackSpeedMenuFingerprint : MethodFingerprint( - strings = listOf("PLAYBACK_RATE_MENU_BOTTOM_SHEET_FRAGMENT") +internal object ShowOldPlaybackSpeedMenuFingerprint : LiteralValueFingerprint( + literalSupplier = { + CustomPlaybackSpeedResourcePatch.speedUnavailableId + } ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt index 63295cb8..efe99d7a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.video.videoid -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction @@ -13,6 +12,7 @@ import app.revanced.patches.youtube.misc.playertype.PlayerTypeHookPatch import app.revanced.patches.youtube.video.playerresponse.PlayerResponseMethodHookPatch import app.revanced.patches.youtube.video.videoid.fingerprint.VideoIdFingerprint import app.revanced.patches.youtube.video.videoid.fingerprint.VideoIdFingerprintBackgroundPlay +import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( @@ -49,7 +49,7 @@ object VideoIdPatch : BytecodePatch( consumer(it, insertIndex, videoIdRegister) } - } ?: throw VideoIdFingerprint.exception + } ?: throw exception VideoIdFingerprint.setFields { method, index, register -> videoIdMethod = method diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/videoid/fingerprint/VideoIdFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/video/videoid/fingerprint/VideoIdFingerprint.kt index dfc90619..a01b2ebd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/videoid/fingerprint/VideoIdFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/videoid/fingerprint/VideoIdFingerprint.kt @@ -10,19 +10,13 @@ internal object VideoIdFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), opcodes = listOf( - Opcode.MOVE_RESULT_OBJECT, - Opcode.IF_EQZ, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_INTERFACE, Opcode.MOVE_RESULT_OBJECT, Opcode.IF_EQZ, Opcode.IGET_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, + Opcode.IGET_OBJECT, Opcode.INVOKE_INTERFACE, Opcode.MOVE_RESULT_OBJECT, Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT + Opcode.MOVE_RESULT_OBJECT, ) ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/videoid/fingerprint/VideoIdFingerprintBackgroundPlay.kt b/src/main/kotlin/app/revanced/patches/youtube/video/videoid/fingerprint/VideoIdFingerprintBackgroundPlay.kt index 8a265c91..5bc5d4fd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/videoid/fingerprint/VideoIdFingerprintBackgroundPlay.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/videoid/fingerprint/VideoIdFingerprintBackgroundPlay.kt @@ -10,18 +10,10 @@ internal object VideoIdFingerprintBackgroundPlay : MethodFingerprint( accessFlags = AccessFlags.DECLARED_SYNCHRONIZED or AccessFlags.FINAL or AccessFlags.PUBLIC, parameters = listOf("L"), opcodes = listOf( - Opcode.MONITOR_EXIT, - Opcode.RETURN_VOID, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.NEW_ARRAY, - Opcode.SGET_OBJECT, - Opcode.APUT_OBJECT, Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT, Opcode.IF_EQZ, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, + Opcode.IGET_OBJECT, Opcode.IF_EQZ, Opcode.INVOKE_INTERFACE, Opcode.MOVE_RESULT_OBJECT, diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt index 86f7db13..bb864b2f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt @@ -30,8 +30,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.38.44", "18.43.45", "18.44.41", - "18.45.41", - "18.45.43" + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34" ] ) ] From df8eadbca9fa17c071defb42480eb99004638947 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 16 Jan 2024 18:56:13 +0000 Subject: [PATCH 32/44] chore(release): 4.0.0-dev.10 [skip ci] # [4.0.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.9...v4.0.0-dev.10) (2024-01-16) ### Features * **YouTube:** Support versions `18.48.39`, `18.49.37` and `19.01.34` ([#2551](https://github.com/ReVanced/revanced-patches/issues/2551)) ([a938e73](https://github.com/ReVanced/revanced-patches/commit/a938e736fa2aed1792cfdce5656efa15d0791d71)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- patches.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f0a3b05..8b0bb47e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [4.0.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.9...v4.0.0-dev.10) (2024-01-16) + + +### Features + +* **YouTube:** Support versions `18.48.39`, `18.49.37` and `19.01.34` ([#2551](https://github.com/ReVanced/revanced-patches/issues/2551)) ([a938e73](https://github.com/ReVanced/revanced-patches/commit/a938e736fa2aed1792cfdce5656efa15d0791d71)) + # [4.0.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.8...v4.0.0-dev.9) (2024-01-11) diff --git a/gradle.properties b/gradle.properties index 215dd66d..ddcbb47a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 4.0.0-dev.9 +version = 4.0.0-dev.10 diff --git a/patches.json b/patches.json index e2f25baf..9a01e351 100644 --- a/patches.json +++ b/patches.json @@ -1 +1 @@ -[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" Either a header name or a path to a custom header folder to use in the top bar.\n The path to a folder must contain one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player. Including this patch may cause issues with tapping or double tapping the video player overlay.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.41","18.45.43"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos and retains the speed configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file +[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" Either a header name or a path to a custom header folder to use in the top bar.\n The path to a folder must contain one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player. Including this patch may cause issues with tapping or double tapping the video player overlay.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos and retains the speed configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file From 94e08b74ced394abf9ae7d4fe6355bfe4d0be248 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 18 Jan 2024 00:24:55 +0400 Subject: [PATCH 33/44] feat(YouTube): Support version `19.02.34` (#2627) --- .../youtube/ad/general/HideAdsPatch.kt | 3 ++- .../ad/getpremium/HideGetPremiumPatch.kt | 3 ++- .../patches/youtube/ad/video/VideoAdsPatch.kt | 3 ++- .../copyvideourl/CopyVideoUrlBytecodePatch.kt | 3 ++- .../RemoveViewerDiscretionDialogPatch.kt | 13 +++++++++- .../ExternalDownloadsBytecodePatch.kt | 3 ++- .../DisablePreciseSeekingGesturePatch.kt | 3 ++- .../seekbar/EnableSeekbarTappingPatch.kt | 3 ++- .../seekbar/EnableSlideToSeekPatch.kt | 3 ++- .../SwipeControlsBytecodePatch.kt | 3 ++- .../layout/autocaptions/AutoCaptionsPatch.kt | 3 ++- .../layout/buttons/action/HideButtonsPatch.kt | 3 ++- .../autoplay/HideAutoplayButtonPatch.kt | 3 ++- .../captions/HideCaptionsButtonPatch.kt | 3 ++- .../navigation/NavigationButtonsPatch.kt | 3 ++- .../player/hide/HidePlayerButtonsPatch.kt | 3 ++- .../layout/hide/albumcards/AlbumCardsPatch.kt | 3 ++- .../hide/breakingnews/BreakingNewsPatch.kt | 3 ++- .../layout/hide/comments/CommentsPatch.kt | 3 ++- .../crowdfundingbox/CrowdfundingBoxPatch.kt | 3 ++- .../endscreencards/HideEndscreenCardsPatch.kt | 3 ++- .../hide/filterbar/HideFilterBarPatch.kt | 3 ++- .../HideFloatingMicrophoneButtonPatch.kt | 3 ++- .../DisableFullscreenAmbientModePatch.kt | 3 ++- .../hide/general/HideLayoutComponentsPatch.kt | 3 ++- .../hide/infocards/HideInfoCardsPatch.kt | 3 ++- .../loadmorebutton/HideLoadMoreButtonPatch.kt | 3 ++- .../HideEmailAddressPatch.kt | 3 ++- .../HidePlayerFlyoutMenuPatch.kt | 4 +-- .../DisableRollingNumberAnimationPatch.kt | 3 ++- .../layout/hide/seekbar/HideSeekbarPatch.kt | 3 ++- .../hide/shorts/HideShortsComponentsPatch.kt | 3 ++- .../DisableSuggestedVideoEndScreenPatch.kt | 3 ++- .../layout/hide/time/HideTimestampPatch.kt | 3 ++- .../panels/popup/PlayerPopupPanelsPatch.kt | 3 ++- .../PlayerControlsBackgroundPatch.kt | 3 ++- .../ReturnYouTubeDislikePatch.kt | 3 ++- .../layout/searchbar/WideSearchbarPatch.kt | 3 ++- .../RestoreOldSeekbarThumbnailsPatch.kt | 3 ++- .../sponsorblock/SponsorBlockBytecodePatch.kt | 3 ++- .../spoofappversion/SpoofAppVersionPatch.kt | 3 ++- .../DisableResumingShortsOnStartupPatch.kt | 3 ++- .../tabletminiplayer/TabletMiniPlayerPatch.kt | 3 ++- .../layout/theme/ThemeBytecodePatch.kt | 3 ++- .../thumbnails/AlternativeThumbnailsPatch.kt | 3 ++- .../misc/autorepeat/AutoRepeatPatch.kt | 3 ++- .../spoof/SpoofDeviceDimensionsPatch.kt | 3 ++- .../misc/fix/playback/ClientSpoofPatch.kt | 3 ++- .../youtube/misc/gms/GmsCoreSupportPatch.kt | 3 ++- .../misc/links/BypassURLRedirectsPatch.kt | 3 ++- .../misc/links/OpenLinksExternallyPatch.kt | 3 ++- .../MinimizedPlaybackPatch.kt | 3 ++- .../RemoveTrackingQueryParameterPatch.kt | 3 ++- .../video/hdrbrightness/HDRBrightnessPatch.kt | 3 ++- .../information/VideoInformationPatch.kt | 25 ++++++++++--------- .../OnPlaybackSpeedItemClickFingerprint.kt | 15 +++++------ .../quality/RememberVideoQualityPatch.kt | 3 ++- .../youtube/video/speed/PlaybackSpeedPatch.kt | 3 ++- .../RestoreOldVideoQualityMenuPatch.kt | 3 ++- 59 files changed, 145 insertions(+), 77 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt index ef10af3a..ffd07f30 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt @@ -33,7 +33,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt index 097125ee..399901eb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt @@ -28,7 +28,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt index b338686d..ba861527 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt @@ -32,7 +32,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt index c1fc4765..1e5d5c3a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt @@ -20,7 +20,8 @@ import app.revanced.patches.youtube.video.information.VideoInformationPatch "com.google.android.youtube", [ "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt index 40bd6e3f..1aa5201d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt @@ -21,7 +21,18 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction dependencies = [IntegrationsPatch::class, SettingsPatch::class], compatiblePackages = [ CompatiblePackage( - "com.google.android.youtube" + "com.google.android.youtube", [ + "18.32.39", + "18.37.36", + "18.38.44", + "18.43.45", + "18.44.41", + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34", + "19.02.34" + ] ) ] ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt index 0564d57d..8c2d2669 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt @@ -20,7 +20,8 @@ import app.revanced.patches.youtube.video.information.VideoInformationPatch "com.google.android.youtube", [ "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ), ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt index 0e9892d7..3cea9773 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt @@ -30,7 +30,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt index 41f58f72..07b0b68a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt @@ -32,7 +32,8 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt index 364e9655..b2a12c1c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt @@ -28,7 +28,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ], diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsBytecodePatch.kt index c1a4f644..52808cf9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsBytecodePatch.kt @@ -34,7 +34,8 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt index 19b93d79..e9000247 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt @@ -32,7 +32,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ], diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt index c3b07065..330a899d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt @@ -30,7 +30,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt index 4b53c342..031a3415 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt @@ -40,7 +40,8 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt index ffbd4347..014b99bb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt @@ -31,7 +31,8 @@ import com.android.tools.smali.dexlib2.Opcode "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt index abcad73d..0549c7a9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt @@ -37,7 +37,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt index afe026ad..0c2ece3a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt @@ -35,7 +35,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction3rc "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt index 689e89cf..b93eccfa 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt @@ -30,7 +30,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt index 067bfa44..01523efc 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt @@ -30,7 +30,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt index 777c9c36..221b2064 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt @@ -29,7 +29,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt index 9b01f063..76ffa421 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt @@ -30,7 +30,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt index 0ed39df9..cabcee9e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt @@ -33,7 +33,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction21c "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt index 0cf334c7..8813fedd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt @@ -30,7 +30,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt index 06ee7d04..50883326 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt @@ -26,7 +26,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt index dd8f3900..1f3cf56d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt @@ -26,7 +26,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index 2d45795b..a35c7a84 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -40,7 +40,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt index cf9f08d3..48df410e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt @@ -37,7 +37,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt index 076c4b78..1457ab88 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt @@ -26,7 +26,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt index a8c8157d..8432be9a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt @@ -26,7 +26,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt index 074416c1..bd1af8d5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt @@ -27,11 +27,11 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.38.44", "18.43.45", "18.44.41", - "18.45.41", "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt index 4bac1420..c88bd920 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt @@ -28,7 +28,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt index 3a62fd88..b2c5aa84 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt @@ -34,7 +34,8 @@ import app.revanced.patches.youtube.shared.fingerprints.SeekbarOnDrawFingerprint "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index 429c6f62..072c88b1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -38,7 +38,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt index 02994d5e..4fed8677 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt @@ -25,7 +25,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt index a298db24..2dd801d4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt @@ -26,7 +26,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt index 5c46ca2b..1abcb9ea 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt @@ -27,7 +27,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt index c16e76da..f3a01b48 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt @@ -21,7 +21,8 @@ import org.w3c.dom.Element "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ], diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index 2e0f4ba5..08e3d8bf 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -55,7 +55,8 @@ import com.android.tools.smali.dexlib2.iface.reference.TypeReference CompatiblePackage( "com.google.android.youtube", [ "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt index d5ea7bce..4760b8f8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt @@ -29,7 +29,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt index 779652d1..470efa95 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt @@ -26,7 +26,8 @@ import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt index c15d55c8..46269b11 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt @@ -40,7 +40,8 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference "com.google.android.youtube", [ "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ], diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index b1a46448..19240f16 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -31,7 +31,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt index cd9f5343..f555afd4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt @@ -27,7 +27,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt index c73dcb7a..da301806 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt @@ -35,7 +35,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ) ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt index bffa7f80..465d2495 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt @@ -38,7 +38,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt index 53568213..f58f2496 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt @@ -43,7 +43,8 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt index 387a9c25..f36d05f9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt @@ -31,7 +31,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt index e521e757..6a6b68f8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt @@ -26,7 +26,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt index 7e6f710c..c6d515c3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt @@ -19,7 +19,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction "com.google.android.youtube", [ "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt index 9f026008..4a2c46b8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt @@ -35,7 +35,8 @@ object GmsCoreSupportPatch : AbstractGmsCoreSupportPatch( "com.google.android.youtube", setOf( "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ) ) ), diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt index bf94b60a..3d52e0b0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt @@ -28,7 +28,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt index a81078f6..d9a3d2d8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt @@ -31,7 +31,8 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt index b40b3c32..6c693b44 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt @@ -36,7 +36,8 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference [ "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt index 3e3b69b3..1d4e9d1e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt @@ -33,7 +33,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt index 0c072bbe..45b9c7f5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt @@ -29,7 +29,8 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt index 48837009..36d0066c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt @@ -18,9 +18,9 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.BuilderInstruction import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation -import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter import com.android.tools.smali.dexlib2.util.MethodUtil @@ -135,23 +135,24 @@ object VideoInformationPatch : BytecodePatch( */ videoTimeHook(INTEGRATIONS_CLASS_DESCRIPTOR, "setVideoTime") - /* * Hook the user playback speed selection */ - OnPlaybackSpeedItemClickFingerprint.result?.apply { - speedSelectionInsertMethod = mutableMethod - speedSelectionInsertIndex = scanResult.patternScanResult!!.startIndex - 3 + OnPlaybackSpeedItemClickFingerprint.result?.mutableMethod?.apply { + speedSelectionInsertMethod = this + val speedSelectionMethodInstructions = this.implementation!!.instructions + val speedSelectionValueInstructionIndex = speedSelectionMethodInstructions.indexOfFirst { + it.opcode == Opcode.IGET + } speedSelectionValueRegister = - mutableMethod.getInstruction(speedSelectionInsertIndex).registerD - - val speedSelectionMethodInstructions = mutableMethod.implementation!!.instructions + getInstruction(speedSelectionValueInstructionIndex).registerA + setPlaybackSpeedClassFieldReference = + getInstruction(speedSelectionValueInstructionIndex + 1).reference.toString() + setPlaybackSpeedMethodReference = + getInstruction(speedSelectionValueInstructionIndex + 2).reference.toString() setPlaybackSpeedContainerClassFieldReference = getReference(speedSelectionMethodInstructions, -1, Opcode.IF_EQZ) - setPlaybackSpeedClassFieldReference = - getReference(speedSelectionMethodInstructions, 1, Opcode.IGET) - setPlaybackSpeedMethodReference = - getReference(speedSelectionMethodInstructions, 2, Opcode.IGET) + speedSelectionInsertIndex = speedSelectionValueInstructionIndex + 1 } ?: throw OnPlaybackSpeedItemClickFingerprint.exception userSelectedPlaybackSpeedHook(INTEGRATIONS_CLASS_DESCRIPTOR, "userSelectedPlaybackSpeed") diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/information/fingerprints/OnPlaybackSpeedItemClickFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/video/information/fingerprints/OnPlaybackSpeedItemClickFingerprint.kt index 8a3a700a..249d659b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/information/fingerprints/OnPlaybackSpeedItemClickFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/information/fingerprints/OnPlaybackSpeedItemClickFingerprint.kt @@ -2,18 +2,19 @@ package app.revanced.patches.youtube.video.information.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.util.getReference import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.reference.FieldReference internal object OnPlaybackSpeedItemClickFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", parameters = listOf("L", "L", "I", "J"), - customFingerprint = { methodDef, _ -> methodDef.name == "onItemClick" }, - opcodes = listOf( - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.INVOKE_VIRTUAL, - Opcode.RETURN_VOID - ) + customFingerprint = { methodDef, _ -> + methodDef.name == "onItemClick" && methodDef.implementation?.instructions?.find { + it.opcode == Opcode.IGET_OBJECT && + it.getReference()!!.type == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" + } != null + } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt index ef4d7e3c..1aed3890 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt @@ -33,7 +33,8 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference "com.google.android.youtube", [ "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt index 29f3d280..ae61816f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt @@ -16,7 +16,8 @@ import app.revanced.patches.youtube.video.speed.remember.RememberPlaybackSpeedPa "com.google.android.youtube", [ "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt index bb864b2f..b8b63296 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt @@ -33,7 +33,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.45.43", "18.48.39", "18.49.37", - "19.01.34" + "19.01.34", + "19.02.34" ] ) ] From ba6d1dcd29e42040e9a2c8a3e9a73657a59fd961 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 17 Jan 2024 20:27:00 +0000 Subject: [PATCH 34/44] chore(release): 4.0.0-dev.11 [skip ci] # [4.0.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.10...v4.0.0-dev.11) (2024-01-17) ### Features * **YouTube:** Support version `19.02.34` ([#2627](https://github.com/ReVanced/revanced-patches/issues/2627)) ([94e08b7](https://github.com/ReVanced/revanced-patches/commit/94e08b74ced394abf9ae7d4fe6355bfe4d0be248)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- patches.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b0bb47e..244b8d5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [4.0.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.10...v4.0.0-dev.11) (2024-01-17) + + +### Features + +* **YouTube:** Support version `19.02.34` ([#2627](https://github.com/ReVanced/revanced-patches/issues/2627)) ([94e08b7](https://github.com/ReVanced/revanced-patches/commit/94e08b74ced394abf9ae7d4fe6355bfe4d0be248)) + # [4.0.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.9...v4.0.0-dev.10) (2024-01-16) diff --git a/gradle.properties b/gradle.properties index ddcbb47a..f2933595 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 4.0.0-dev.10 +version = 4.0.0-dev.11 diff --git a/patches.json b/patches.json index 9a01e351..d5ad2299 100644 --- a/patches.json +++ b/patches.json @@ -1 +1 @@ -[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" Either a header name or a path to a custom header folder to use in the top bar.\n The path to a folder must contain one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player. Including this patch may cause issues with tapping or double tapping the video player overlay.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos and retains the speed configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file +[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" Either a header name or a path to a custom header folder to use in the top bar.\n The path to a folder must contain one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player. Including this patch may cause issues with tapping or double tapping the video player overlay.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos and retains the speed configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file From ff08f58ac4ff4d66a8dce599caa1ce47f3366fc6 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 24 Jan 2024 17:19:02 +0400 Subject: [PATCH 35/44] feat(YouTube): Support version `19.03.35` (#2640) --- .../patches/youtube/ad/general/HideAdsPatch.kt | 3 ++- .../youtube/ad/getpremium/HideGetPremiumPatch.kt | 3 ++- .../patches/youtube/ad/video/VideoAdsPatch.kt | 3 ++- .../copyvideourl/CopyVideoUrlBytecodePatch.kt | 3 ++- .../dialog/RemoveViewerDiscretionDialogPatch.kt | 3 ++- .../downloads/ExternalDownloadsBytecodePatch.kt | 3 ++- .../seekbar/DisablePreciseSeekingGesturePatch.kt | 3 ++- .../interaction/seekbar/EnableSeekbarTappingPatch.kt | 3 ++- .../interaction/seekbar/EnableSlideToSeekPatch.kt | 3 ++- .../swipecontrols/SwipeControlsBytecodePatch.kt | 3 ++- .../youtube/layout/autocaptions/AutoCaptionsPatch.kt | 3 ++- .../layout/buttons/action/HideButtonsPatch.kt | 3 ++- .../buttons/autoplay/HideAutoplayButtonPatch.kt | 3 ++- .../buttons/captions/HideCaptionsButtonPatch.kt | 3 ++- .../buttons/navigation/NavigationButtonsPatch.kt | 3 ++- .../buttons/player/hide/HidePlayerButtonsPatch.kt | 3 ++- .../layout/hide/albumcards/AlbumCardsPatch.kt | 3 ++- .../layout/hide/breakingnews/BreakingNewsPatch.kt | 3 ++- .../youtube/layout/hide/comments/CommentsPatch.kt | 3 ++- .../hide/crowdfundingbox/CrowdfundingBoxPatch.kt | 3 ++- .../hide/endscreencards/HideEndscreenCardsPatch.kt | 3 ++- .../layout/hide/filterbar/HideFilterBarPatch.kt | 3 ++- .../HideFloatingMicrophoneButtonPatch.kt | 3 ++- .../DisableFullscreenAmbientModePatch.kt | 3 ++- .../layout/hide/general/HideLayoutComponentsPatch.kt | 3 ++- .../layout/hide/infocards/HideInfoCardsPatch.kt | 3 ++- .../hide/loadmorebutton/HideLoadMoreButtonPatch.kt | 3 ++- .../personalinformation/HideEmailAddressPatch.kt | 3 ++- .../flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt | 3 ++- .../DisableRollingNumberAnimationPatch.kt | 3 ++- .../youtube/layout/hide/seekbar/HideSeekbarPatch.kt | 3 ++- .../layout/hide/shorts/HideShortsComponentsPatch.kt | 7 +++++-- .../hide/shorts/HideShortsComponentsResourcePatch.kt | 12 +++++++++--- .../fingerprints/ReelConstructorFingerprint.kt | 12 +++++++++--- .../DisableSuggestedVideoEndScreenPatch.kt | 3 ++- .../youtube/layout/hide/time/HideTimestampPatch.kt | 3 ++- .../layout/panels/popup/PlayerPopupPanelsPatch.kt | 3 ++- .../background/PlayerControlsBackgroundPatch.kt | 3 ++- .../ReturnYouTubeDislikePatch.kt | 3 ++- .../youtube/layout/searchbar/WideSearchbarPatch.kt | 3 ++- .../seekbar/RestoreOldSeekbarThumbnailsPatch.kt | 3 ++- .../layout/sponsorblock/SponsorBlockBytecodePatch.kt | 3 ++- .../layout/spoofappversion/SpoofAppVersionPatch.kt | 3 ++- .../DisableResumingShortsOnStartupPatch.kt | 3 ++- .../layout/tabletminiplayer/TabletMiniPlayerPatch.kt | 3 ++- .../youtube/layout/theme/ThemeBytecodePatch.kt | 3 ++- .../layout/thumbnails/AlternativeThumbnailsPatch.kt | 3 ++- .../youtube/misc/autorepeat/AutoRepeatPatch.kt | 3 ++- .../dimensions/spoof/SpoofDeviceDimensionsPatch.kt | 3 ++- .../youtube/misc/fix/playback/ClientSpoofPatch.kt | 3 ++- .../patches/youtube/misc/gms/GmsCoreSupportPatch.kt | 3 ++- .../youtube/misc/links/BypassURLRedirectsPatch.kt | 3 ++- .../youtube/misc/links/OpenLinksExternallyPatch.kt | 3 ++- .../misc/minimizedplayback/MinimizedPlaybackPatch.kt | 3 ++- .../privacy/RemoveTrackingQueryParameterPatch.kt | 3 ++- .../video/hdrbrightness/HDRBrightnessPatch.kt | 3 ++- .../video/quality/RememberVideoQualityPatch.kt | 3 ++- .../youtube/video/speed/PlaybackSpeedPatch.kt | 3 ++- .../RestoreOldVideoQualityMenuPatch.kt | 3 ++- 59 files changed, 135 insertions(+), 64 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt index ffd07f30..e53f018a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt @@ -34,7 +34,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt index 399901eb..741dcfa2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt @@ -29,7 +29,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt index ba861527..4762d1be 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt @@ -33,7 +33,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt index 1e5d5c3a..4d9795ce 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlBytecodePatch.kt @@ -21,7 +21,8 @@ import app.revanced.patches.youtube.video.information.VideoInformationPatch "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt index 1aa5201d..a802538c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt @@ -31,7 +31,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt index 8c2d2669..c65ad99f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsBytecodePatch.kt @@ -21,7 +21,8 @@ import app.revanced.patches.youtube.video.information.VideoInformationPatch "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ), ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt index 3cea9773..0bf4fa32 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt @@ -31,7 +31,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt index 07b0b68a..28691355 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt @@ -33,7 +33,8 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt index b2a12c1c..2be99ce9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt @@ -29,7 +29,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ], diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsBytecodePatch.kt index 52808cf9..a3d9640d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsBytecodePatch.kt @@ -35,7 +35,8 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt index e9000247..002f52d8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt @@ -33,7 +33,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ], diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt index 330a899d..2101cac8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt @@ -31,7 +31,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt index 031a3415..e3df1bd6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt @@ -41,7 +41,8 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt index 014b99bb..5d367b36 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt @@ -32,7 +32,8 @@ import com.android.tools.smali.dexlib2.Opcode "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt index 0549c7a9..6ad07a0e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt @@ -38,7 +38,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt index 0c2ece3a..fe4613b4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt @@ -36,7 +36,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction3rc "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt index b93eccfa..45969955 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsPatch.kt @@ -31,7 +31,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt index 01523efc..d33428e0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsPatch.kt @@ -31,7 +31,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt index 221b2064..e102b809 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt @@ -30,7 +30,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt index 76ffa421..0065e130 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxPatch.kt @@ -31,7 +31,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt index cabcee9e..b7c76c7b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt @@ -34,7 +34,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction21c "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt index 8813fedd..225b049b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarPatch.kt @@ -31,7 +31,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt index 50883326..2689051d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonPatch.kt @@ -27,7 +27,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt index 1f3cf56d..92a3c3fd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt @@ -27,7 +27,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index a35c7a84..b39d75fd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -41,7 +41,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt index 48df410e..7426b1a9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt @@ -38,7 +38,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt index 1457ab88..66098591 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonPatch.kt @@ -27,7 +27,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt index 8432be9a..32af2363 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt @@ -27,7 +27,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt index bd1af8d5..aa7d7bdf 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt @@ -31,7 +31,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt index c88bd920..396ff5e0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt @@ -29,7 +29,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt index b2c5aa84..d1b551ba 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt @@ -35,7 +35,8 @@ import app.revanced.patches.youtube.shared.fingerprints.SeekbarOnDrawFingerprint "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index 072c88b1..87c371d8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -39,7 +39,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] @@ -59,6 +60,8 @@ object HideShortsComponentsPatch : BytecodePatch( override fun execute(context: BytecodeContext) { // region Hide the Shorts shelf. + // This patch point is not present in 19.03.x and greater. + // If 19.02.x and lower is dropped, then this section of code and the fingerprint should be removed. ReelConstructorFingerprint.result?.let { it.mutableMethod.apply { val insertIndex = it.scanResult.patternScanResult!!.startIndex + 2 @@ -71,7 +74,7 @@ object HideShortsComponentsPatch : BytecodePatch( "hideShortsShelf" ) } - } ?: throw ReelConstructorFingerprint.exception + } // Do not throw an exception if not resolved. // endregion diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsResourcePatch.kt index 51c05873..d5ba0378 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsResourcePatch.kt @@ -97,9 +97,15 @@ object HideShortsComponentsResourcePatch : ResourcePatch() { ) ) - fun String.getId() = ResourceMappingPatch.resourceMappings.single { it.name == this }.id + ResourceMappingPatch.resourceMappings.find { + it.type == "layout" && it.name == "reel_multiple_items_shelf" + }?.also { + reelMultipleItemShelfId = it.id + } - reelMultipleItemShelfId = "reel_multiple_items_shelf".getId() - reelPlayerRightCellButtonHeight = "reel_player_right_cell_button_height".getId() + reelPlayerRightCellButtonHeight = + ResourceMappingPatch.resourceMappings.single { + it.type == "dimen" && it.name == "reel_player_right_cell_button_height" + }.id } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/fingerprints/ReelConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/fingerprints/ReelConstructorFingerprint.kt index 912aa970..dece9b37 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/fingerprints/ReelConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/fingerprints/ReelConstructorFingerprint.kt @@ -1,13 +1,19 @@ package app.revanced.patches.youtube.layout.hide.shorts.fingerprints import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patches.youtube.layout.hide.shorts.HideShortsComponentsResourcePatch -import app.revanced.util.patch.LiteralValueFingerprint +import app.revanced.util.containsWideLiteralInstructionValue import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal object ReelConstructorFingerprint : LiteralValueFingerprint( +internal object ReelConstructorFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, opcodes = listOf(Opcode.INVOKE_VIRTUAL), - literalSupplier = { HideShortsComponentsResourcePatch.reelMultipleItemShelfId } + customFingerprint = { methodDef, _ -> + // Cannot use LiteralValueFingerprint, because the resource id may not be present. + val reelMultipleItemShelfId = HideShortsComponentsResourcePatch.reelMultipleItemShelfId + reelMultipleItemShelfId != -1L + && methodDef.containsWideLiteralInstructionValue(reelMultipleItemShelfId) + } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt index 4fed8677..a37f3817 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt @@ -26,7 +26,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt index 2dd801d4..3f253272 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt @@ -27,7 +27,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt index 1abcb9ea..fa537124 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt @@ -28,7 +28,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt index f3a01b48..def4a95e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt @@ -22,7 +22,8 @@ import org.w3c.dom.Element "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ], diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index 08e3d8bf..f3f69f10 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -56,7 +56,8 @@ import com.android.tools.smali.dexlib2.iface.reference.TypeReference "com.google.android.youtube", [ "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt index 4760b8f8..f4ecefbb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt @@ -30,7 +30,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt index 470efa95..5325960e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt @@ -27,7 +27,8 @@ import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt index 46269b11..382512f3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt @@ -41,7 +41,8 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ], diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index 19240f16..1f312970 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -32,7 +32,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt index f555afd4..8764fd2d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt @@ -28,7 +28,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt index da301806..4ec86e57 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt @@ -36,7 +36,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ) ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt index 465d2495..a6e4a9b8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt @@ -39,7 +39,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt index f58f2496..2a5b8d8a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt @@ -44,7 +44,8 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt index f36d05f9..f5cefd48 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt @@ -32,7 +32,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt index 6a6b68f8..444321c9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt @@ -27,7 +27,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt index c6d515c3..6a743562 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt @@ -20,7 +20,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt index 4a2c46b8..fb952775 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt @@ -36,7 +36,8 @@ object GmsCoreSupportPatch : AbstractGmsCoreSupportPatch( "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ) ) ), diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt index 3d52e0b0..a07ed78c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt @@ -29,7 +29,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt index d9a3d2d8..c29c71b8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt @@ -32,7 +32,8 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt index 6c693b44..776229a3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt @@ -37,7 +37,8 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt index 1d4e9d1e..9048e71c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt @@ -34,7 +34,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt index 45b9c7f5..0fedb6b2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt @@ -30,7 +30,8 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt index 1aed3890..9cccd7e8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt @@ -34,7 +34,8 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt index ae61816f..d58a99f4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt @@ -17,7 +17,8 @@ import app.revanced.patches.youtube.video.speed.remember.RememberPlaybackSpeedPa "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt index b8b63296..6ccfdf9c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt @@ -34,7 +34,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction "18.48.39", "18.49.37", "19.01.34", - "19.02.34" + "19.02.39", + "19.03.35" ] ) ] From 35344a044949391ef954f77e5a79ac126789d539 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 24 Jan 2024 13:21:05 +0000 Subject: [PATCH 36/44] chore(release): 4.0.0-dev.12 [skip ci] # [4.0.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.11...v4.0.0-dev.12) (2024-01-24) ### Features * **YouTube:** Support version `19.03.35` ([#2640](https://github.com/ReVanced/revanced-patches/issues/2640)) ([ff08f58](https://github.com/ReVanced/revanced-patches/commit/ff08f58ac4ff4d66a8dce599caa1ce47f3366fc6)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- patches.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 244b8d5f..0b830baa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [4.0.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.11...v4.0.0-dev.12) (2024-01-24) + + +### Features + +* **YouTube:** Support version `19.03.35` ([#2640](https://github.com/ReVanced/revanced-patches/issues/2640)) ([ff08f58](https://github.com/ReVanced/revanced-patches/commit/ff08f58ac4ff4d66a8dce599caa1ce47f3366fc6)) + # [4.0.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.10...v4.0.0-dev.11) (2024-01-17) diff --git a/gradle.properties b/gradle.properties index f2933595..6c05f9df 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 4.0.0-dev.11 +version = 4.0.0-dev.12 diff --git a/patches.json b/patches.json index d5ad2299..14c305f2 100644 --- a/patches.json +++ b/patches.json @@ -1 +1 @@ -[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" Either a header name or a path to a custom header folder to use in the top bar.\n The path to a folder must contain one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player. Including this patch may cause issues with tapping or double tapping the video player overlay.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.34"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos and retains the speed configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file +[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" Either a header name or a path to a custom header folder to use in the top bar.\n The path to a folder must contain one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player. Including this patch may cause issues with tapping or double tapping the video player overlay.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos and retains the speed configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file From 012503659628fc5588727a6891b8c9d44177129b Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 26 Jan 2024 01:42:03 +0100 Subject: [PATCH 37/44] build: Bump dependencies --- package-lock.json | 4798 +++------------------------------------------ package.json | 4 +- 2 files changed, 236 insertions(+), 4566 deletions(-) diff --git a/package-lock.json b/package-lock.json index e6bb3d9f..29e79ed2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,11 +5,11 @@ "packages": { "": { "devDependencies": { - "@saithodev/semantic-release-backmerge": "^3.2.1", + "@saithodev/semantic-release-backmerge": "^4.0.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", - "gradle-semantic-release-plugin": "^1.8.0", - "semantic-release": "^22.0.8" + "gradle-semantic-release-plugin": "^1.9.1", + "semantic-release": "^23.0.0" } }, "node_modules/@babel/code-frame": { @@ -227,9 +227,9 @@ } }, "node_modules/@octokit/core": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.2.tgz", - "integrity": "sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.1.0.tgz", + "integrity": "sha512-BDa2VAMLSh3otEiaMJ/3Y36GU4qf6GI+VivQ/P41NC6GHcdxpKlqV0ikSZ5gdQsmS3ojXeRx5vasgNTinF0Q4g==", "dev": true, "dependencies": { "@octokit/auth-token": "^4.0.0", @@ -405,9 +405,9 @@ } }, "node_modules/@saithodev/semantic-release-backmerge": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@saithodev/semantic-release-backmerge/-/semantic-release-backmerge-3.2.1.tgz", - "integrity": "sha512-mC9cA6lhNzpy4rKOT5jjRLhlT3myubmVeo+BqWyR2WqF5PRJpG0jaU8pBC87S11GCUHKxqXf0QQDZNPbbNP1bA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@saithodev/semantic-release-backmerge/-/semantic-release-backmerge-4.0.1.tgz", + "integrity": "sha512-WDsU28YrXSLx0xny7FgFlEk8DCKGcj6OOhA+4Q9k3te1jJD1GZuqY8sbIkVQaw9cqJ7CT+fCZUN6QDad8JW4Dg==", "dev": true, "dependencies": { "@semantic-release/error": "^3.0.0", @@ -415,96 +415,64 @@ "debug": "^4.3.4", "execa": "^5.1.1", "lodash": "^4.17.21", - "semantic-release": ">=20.0.0 <22.0.0" + "semantic-release": "^22.0.7" } }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/commit-analyzer": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-10.0.4.tgz", - "integrity": "sha512-pFGn99fn8w4/MHE0otb2A/l5kxgOuxaaauIh4u30ncoTJuqWj4hXTgEJ03REqjS+w1R2vPftSsO26WC61yOcpw==", + "node_modules/@saithodev/semantic-release-backmerge/node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", "dev": true, "dependencies": { - "conventional-changelog-angular": "^6.0.0", - "conventional-commits-filter": "^3.0.0", - "conventional-commits-parser": "^5.0.0", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash-es": "^4.17.21", - "micromatch": "^4.0.2" + "escape-string-regexp": "5.0.0" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/commit-analyzer/node_modules/conventional-commits-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-3.0.0.tgz", - "integrity": "sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==", - "dev": true, - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/npm": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-10.0.6.tgz", - "integrity": "sha512-DyqHrGE8aUyapA277BB+4kV0C4iMHh3sHzUWdf0jTgp5NNJxVUz76W1f57FB64Ue03him3CBXxFqQD2xGabxow==", - "dev": true, - "dependencies": { - "@semantic-release/error": "^4.0.0", - "aggregate-error": "^5.0.0", - "execa": "^8.0.0", - "fs-extra": "^11.0.0", - "lodash-es": "^4.17.21", - "nerf-dart": "^1.0.0", - "normalize-url": "^8.0.0", - "npm": "^9.5.0", - "rc": "^1.2.8", - "read-pkg": "^8.0.0", - "registry-auth-token": "^5.0.0", - "semver": "^7.1.2", - "tempy": "^3.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/npm/node_modules/@semantic-release/error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", - "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/npm/node_modules/aggregate-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", - "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", - "dev": true, - "dependencies": { - "clean-stack": "^5.2.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=18" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/npm/node_modules/execa": { + "node_modules/@saithodev/semantic-release-backmerge/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/env-ci": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-10.0.0.tgz", + "integrity": "sha512-U4xcd/utDYFgMh0yWj07R1H6L5fwhVbmxBCpnL0DbVSDZVnsC82HONw0wxtxNkIAcua3KtbomQvIk5xFZGAQJw==", + "dev": true, + "dependencies": { + "execa": "^8.0.0", + "java-properties": "^1.0.2" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/env-ci/node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", @@ -527,7 +495,7 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/npm/node_modules/get-stream": { + "node_modules/@saithodev/semantic-release-backmerge/node_modules/env-ci/node_modules/get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", @@ -539,160 +507,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/npm/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/release-notes-generator": { - "version": "11.0.7", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-11.0.7.tgz", - "integrity": "sha512-T09QB9ImmNx7Q6hY6YnnEbw/rEJ6a+22LBxfZq+pSAXg/OL/k0siwEm5cK4k1f9dE2Z2mPIjJKKohzUm0jbxcQ==", - "dev": true, - "dependencies": { - "conventional-changelog-angular": "^6.0.0", - "conventional-changelog-writer": "^6.0.0", - "conventional-commits-filter": "^4.0.0", - "conventional-commits-parser": "^5.0.0", - "debug": "^4.0.0", - "get-stream": "^7.0.0", - "import-from": "^4.0.0", - "into-stream": "^7.0.0", - "lodash-es": "^4.17.21", - "read-pkg-up": "^10.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz", - "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/clean-stack": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", - "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/conventional-changelog-angular": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz", - "integrity": "sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/conventional-changelog-writer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-6.0.1.tgz", - "integrity": "sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==", - "dev": true, - "dependencies": { - "conventional-commits-filter": "^3.0.0", - "dateformat": "^3.0.3", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "meow": "^8.1.2", - "semver": "^7.0.0", - "split": "^1.0.1" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/conventional-changelog-writer/node_modules/conventional-commits-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-3.0.0.tgz", - "integrity": "sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==", - "dev": true, - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/env-ci": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-9.1.1.tgz", - "integrity": "sha512-Im2yEWeF4b2RAMAaWvGioXk6m0UNaIjD8hj28j2ij5ldnIFrDQT0+pzDvpbRkcjurhXhf/AsBKv8P2rtmGi9Aw==", - "dev": true, - "dependencies": { - "execa": "^7.0.0", - "java-properties": "^1.0.2" - }, - "engines": { - "node": "^16.14 || >=18" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/env-ci/node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/env-ci/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, "node_modules/@saithodev/semantic-release-backmerge/node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -705,38 +519,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@saithodev/semantic-release-backmerge/node_modules/human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", @@ -770,67 +552,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@saithodev/semantic-release-backmerge/node_modules/marked": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.2.tgz", - "integrity": "sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==", + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", + "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", "dev": true, "bin": { "marked": "bin/marked.js" @@ -839,246 +564,6 @@ "node": ">= 16" } }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/marked-terminal": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz", - "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^6.2.0", - "cardinal": "^2.1.1", - "chalk": "^5.2.0", - "cli-table3": "^0.6.3", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.3.0" - }, - "engines": { - "node": ">=14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@saithodev/semantic-release-backmerge/node_modules/mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", @@ -1091,172 +576,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm": { - "version": "9.9.2", - "resolved": "https://registry.npmjs.org/npm/-/npm-9.9.2.tgz", - "integrity": "sha512-D3tV+W0PzJOlwo8YmO6fNzaB1CrMVYd1V+2TURF6lbCbmZKqMsYgeQfPVvqiM3zbNSJPhFEnmlEXIogH2Vq7PQ==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/promise-spawn", - "@npmcli/run-script", - "abbrev", - "archy", - "cacache", - "chalk", - "ci-info", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "ms", - "node-gyp", - "nopt", - "normalize-package-data", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "semver", - "sigstore", - "spdx-expression-parse", - "ssri", - "supports-color", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dev": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^6.5.0", - "@npmcli/config": "^6.4.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/map-workspaces": "^3.0.4", - "@npmcli/package-json": "^4.0.1", - "@npmcli/promise-spawn": "^6.0.2", - "@npmcli/run-script": "^6.0.2", - "abbrev": "^2.0.0", - "archy": "~1.0.0", - "cacache": "^17.1.3", - "chalk": "^5.3.0", - "ci-info": "^3.8.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.3", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.2", - "glob": "^10.2.7", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^6.1.1", - "ini": "^4.1.1", - "init-package-json": "^5.0.0", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^3.0.0", - "libnpmaccess": "^7.0.2", - "libnpmdiff": "^5.0.20", - "libnpmexec": "^6.0.4", - "libnpmfund": "^4.2.1", - "libnpmhook": "^9.0.3", - "libnpmorg": "^5.0.4", - "libnpmpack": "^5.0.20", - "libnpmpublish": "^7.5.1", - "libnpmsearch": "^6.0.2", - "libnpmteam": "^5.0.3", - "libnpmversion": "^4.0.2", - "make-fetch-happen": "^11.1.1", - "minimatch": "^9.0.3", - "minipass": "^5.0.0", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^9.4.0", - "nopt": "^7.2.0", - "normalize-package-data": "^5.0.0", - "npm-audit-report": "^5.0.0", - "npm-install-checks": "^6.2.0", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.2", - "npm-profile": "^7.0.1", - "npm-registry-fetch": "^14.0.5", - "npm-user-validate": "^2.0.0", - "npmlog": "^7.0.1", - "p-map": "^4.0.0", - "pacote": "^15.2.0", - "parse-conflict-json": "^3.0.1", - "proc-log": "^3.0.0", - "qrcode-terminal": "^0.12.0", - "read": "^2.1.0", - "semver": "^7.5.4", - "sigstore": "^1.9.0", - "spdx-expression-parse": "^3.0.1", - "ssri": "^10.0.4", - "supports-color": "^9.4.0", - "tar": "^6.1.15", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.0", - "which": "^3.0.1", - "write-file-atomic": "^5.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm-run-path": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", @@ -1272,2997 +591,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/arborist": { - "version": "6.5.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^5.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^4.0.0", - "@npmcli/query": "^3.0.0", - "@npmcli/run-script": "^6.0.0", - "bin-links": "^4.0.1", - "cacache": "^17.0.4", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "json-stringify-nice": "^1.1.4", - "minimatch": "^9.0.0", - "nopt": "^7.0.0", - "npm-install-checks": "^6.2.0", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-registry-fetch": "^14.0.3", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.2", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.1", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/config": { - "version": "6.4.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", - "ci-info": "^3.8.0", - "ini": "^4.1.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/fs": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/git": { - "version": "4.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^17.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^15.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/package-json": { - "version": "4.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^4.1.0", - "glob": "^10.2.2", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "proc-log": "^3.0.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/query": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@npmcli/run-script": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@sigstore/bundle": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@sigstore/sign": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "make-fetch-happen": "^11.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@sigstore/tuf": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@tufjs/canonical-json": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/@tufjs/models": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/abbrev": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/abort-controller": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/agentkeepalive": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/are-we-there-yet": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/base64-js": { - "version": "1.5.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/bin-links": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/buffer": { - "version": "6.0.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/cacache": { - "version": "17.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ci-info": { - "version": "3.8.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^4.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/cli-table3": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/cmd-shim": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/cross-spawn": { - "version": "7.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/defaults": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/depd": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/diff": { - "version": "5.1.0", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/eastasianwidth": { - "version": "0.2.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/event-target-shim": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/events": { - "version": "3.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/exponential-backoff": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/foreground-child": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/fs-minipass": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/gauge": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^4.0.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/glob": { - "version": "10.2.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.11", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/has": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/hosted-git-info": { - "version": "6.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ieee754": { - "version": "1.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ini": { - "version": "4.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/init-package-json": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^10.0.0", - "promzard": "^1.0.0", - "read": "^2.0.0", - "read-package-json": "^6.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ip": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "^3.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/is-core-module": { - "version": "2.13.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/jackspeak": { - "version": "2.2.1", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/just-diff": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/just-diff-apply": { - "version": "5.5.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmaccess": { - "version": "7.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmdiff": { - "version": "5.0.20", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.5.0", - "@npmcli/disparity-colors": "^3.0.0", - "@npmcli/installed-package-contents": "^2.0.2", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^9.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8", - "tar": "^6.1.13" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmexec": { - "version": "6.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.5.0", - "@npmcli/run-script": "^6.0.0", - "ci-info": "^3.7.1", - "npm-package-arg": "^10.1.0", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "proc-log": "^3.0.0", - "read": "^2.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmfund": { - "version": "4.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.5.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmhook": { - "version": "9.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmorg": { - "version": "5.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmpack": { - "version": "5.0.20", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.5.0", - "@npmcli/run-script": "^6.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmpublish": { - "version": "7.5.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ci-info": "^3.6.1", - "normalize-package-data": "^5.0.0", - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3", - "proc-log": "^3.0.0", - "semver": "^7.3.7", - "sigstore": "^1.4.0", - "ssri": "^10.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmsearch": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmteam": { - "version": "5.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/libnpmversion": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^4.0.1", - "@npmcli/run-script": "^6.0.0", - "json-parse-even-better-errors": "^3.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/lru-cache": { - "version": "7.18.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/make-fetch-happen": { - "version": "11.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minimatch": { - "version": "9.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-fetch": { - "version": "3.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/mute-stream": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp": { - "version": "9.4.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/are-we-there-yet": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/gauge": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/nopt": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/nopt": { - "version": "7.2.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/normalize-package-data": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-audit-report": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-bundled": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-install-checks": { - "version": "6.2.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-package-arg": { - "version": "10.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-packlist": { - "version": "7.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^6.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-pick-manifest": { - "version": "8.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-profile": { - "version": "7.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-registry-fetch": { - "version": "14.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npm-user-validate": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/npmlog": { - "version": "7.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/once": { - "version": "1.4.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/pacote": { - "version": "15.2.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/parse-conflict-json": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/path-scurry": { - "version": "1.9.2", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.13", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/proc-log": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/process": { - "version": "0.11.10", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/promzard": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/read": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~1.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/read-cmd-shim": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/read-package-json": { - "version": "6.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/read-package-json-fast": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/readable-stream": { - "version": "4.4.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/signal-exit": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/sigstore": { - "version": "1.9.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "@sigstore/sign": "^1.0.0", - "@sigstore/tuf": "^1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/socks": { - "version": "2.7.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/spdx-correct": { - "version": "3.2.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.13", - "dev": true, - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/ssri": { - "version": "10.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/supports-color": { - "version": "9.4.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/tar": { - "version": "6.1.15", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/treeverse": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/tuf-js": { - "version": "1.1.7", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/unique-filename": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/unique-slug": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/validate-npm-package-name": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/walk-up-path": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/which": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wrap-ansi": { - "version": "8.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/write-file-atomic": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, "node_modules/@saithodev/semantic-release-backmerge/node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", @@ -4278,36 +606,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@saithodev/semantic-release-backmerge/node_modules/p-reduce": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", @@ -4320,55 +618,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/parse-json": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", - "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/parse-json/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/@saithodev/semantic-release-backmerge/node_modules/path-key": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", @@ -4381,94 +630,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/read-pkg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", - "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^6.0.0", - "parse-json": "^7.0.0", - "type-fest": "^4.2.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/read-pkg-up": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz", - "integrity": "sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^8.1.0", - "type-fest": "^4.2.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", - "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/read-pkg/node_modules/type-fest": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", - "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@saithodev/semantic-release-backmerge/node_modules/semantic-release": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-21.1.2.tgz", - "integrity": "sha512-kz76azHrT8+VEkQjoCBHE06JNQgTgsC4bT8XfCzb7DHcsk9vG3fqeMVik8h5rcWCYi2Fd+M3bwA7BG8Z8cRwtA==", + "version": "22.0.12", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-22.0.12.tgz", + "integrity": "sha512-0mhiCR/4sZb00RVFJIUlMuiBkW3NMpVIW2Gse7noqEMoFGkvfPPAImEQbkBV8xga4KOPP4FdTRYuLLy32R1fPw==", "dev": true, "dependencies": { - "@semantic-release/commit-analyzer": "^10.0.0", + "@semantic-release/commit-analyzer": "^11.0.0", "@semantic-release/error": "^4.0.0", "@semantic-release/github": "^9.0.0", - "@semantic-release/npm": "^10.0.2", - "@semantic-release/release-notes-generator": "^11.0.0", + "@semantic-release/npm": "^11.0.0", + "@semantic-release/release-notes-generator": "^12.0.0", "aggregate-error": "^5.0.0", "cosmiconfig": "^8.0.0", "debug": "^4.0.0", - "env-ci": "^9.0.0", + "env-ci": "^10.0.0", "execa": "^8.0.0", - "figures": "^5.0.0", + "figures": "^6.0.0", "find-versions": "^5.1.0", "get-stream": "^6.0.0", "git-log-parser": "^1.2.0", "hook-std": "^3.0.0", "hosted-git-info": "^7.0.0", + "import-from-esm": "^1.3.1", "lodash-es": "^4.17.21", - "marked": "^5.0.0", - "marked-terminal": "^5.1.1", + "marked": "^9.0.0", + "marked-terminal": "^6.0.0", "micromatch": "^4.0.2", "p-each-series": "^3.0.0", "p-reduce": "^3.0.0", - "read-pkg-up": "^10.0.0", + "read-pkg-up": "^11.0.0", "resolve-from": "^5.0.0", "semver": "^7.3.2", "semver-diff": "^4.0.0", @@ -4479,7 +670,7 @@ "semantic-release": "bin/semantic-release.js" }, "engines": { - "node": ">=18" + "node": "^18.17 || >=20.6.1" } }, "node_modules/@saithodev/semantic-release-backmerge/node_modules/semantic-release/node_modules/@semantic-release/error": { @@ -4542,7 +733,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/semantic-release/node_modules/signal-exit": { + "node_modules/@saithodev/semantic-release-backmerge/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", @@ -4566,40 +757,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/@semantic-release/changelog": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz", @@ -5049,12 +1206,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true - }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", @@ -5149,15 +1300,6 @@ "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/before-after-hook": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", @@ -5191,32 +1333,6 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cardinal": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", @@ -5393,15 +1509,15 @@ "dev": true }, "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "dependencies": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" @@ -5459,15 +1575,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -5485,40 +1592,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -5580,9 +1653,9 @@ "dev": true }, "node_modules/env-ci": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-10.0.0.tgz", - "integrity": "sha512-U4xcd/utDYFgMh0yWj07R1H6L5fwhVbmxBCpnL0DbVSDZVnsC82HONw0wxtxNkIAcua3KtbomQvIk5xFZGAQJw==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.0.0.tgz", + "integrity": "sha512-apikxMgkipkgTvMdRT9MNqWx5VLOci79F4VBd7Op/7OPjjoanjdAvn6fglMCCEf/1bAh8eOiuEVCUs4V3qP3nQ==", "dev": true, "dependencies": { "execa": "^8.0.0", @@ -5726,6 +1799,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -6008,9 +2090,9 @@ "dev": true }, "node_modules/gradle-semantic-release-plugin": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/gradle-semantic-release-plugin/-/gradle-semantic-release-plugin-1.9.0.tgz", - "integrity": "sha512-8schNX6kF/M9oHFW25d9lWt0U76rXfqyO5sYreROqpwR+TXt6vcHc8w99dSM8cv1rGe+MuKsKlq5zasK+7Cpug==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/gradle-semantic-release-plugin/-/gradle-semantic-release-plugin-1.9.1.tgz", + "integrity": "sha512-lCrw22itszP/FLSL3N61E40vH1+CU95/4LG9ZF+Fxr8tcx7EPthh2eqVPAq67udFlM8ZgO2LETnn8LSDRq1J2w==", "dev": true, "funding": [ { @@ -6026,7 +2108,7 @@ "node": ">=18" }, "peerDependencies": { - "semantic-release": "^22.0.5" + "semantic-release": "^23.0.0" } }, "node_modules/handlebars": { @@ -6050,15 +2132,6 @@ "uglify-js": "^3.1.4" } }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6173,18 +2246,6 @@ "node": ">=4" } }, - "node_modules/import-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", - "dev": true, - "engines": { - "node": ">=12.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/import-from-esm": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-1.3.3.tgz", @@ -6323,15 +2384,6 @@ "node": ">=8" } }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -6478,15 +2530,6 @@ "node": "*" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -6558,12 +2601,6 @@ "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", "dev": true }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -6583,36 +2620,24 @@ "dev": true }, "node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, "engines": { "node": "14 || >=16.14" } }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/marked": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", - "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-11.1.1.tgz", + "integrity": "sha512-EgxRjgK9axsQuUa/oKMx5DEY8oXpKJfk61rT5iY3aRlgU6QJtUcxU5OAymdhCvWvhYcd9FKmO5eQoX8m9VGJXg==", "dev": true, "bin": { "marked": "bin/marked.js" }, "engines": { - "node": ">= 16" + "node": ">= 18" } }, "node_modules/marked-terminal": { @@ -6699,15 +2724,6 @@ "node": ">=6" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -6717,29 +2733,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -6801,9 +2794,9 @@ } }, "node_modules/npm": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.2.5.tgz", - "integrity": "sha512-lXdZ7titEN8CH5YJk9C/aYRU9JeDxQ4d8rwIIDsvH3SMjLjHTukB2CFstMiB30zXs4vCrPN2WH6cDq1yHBeJAw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.4.0.tgz", + "integrity": "sha512-RS7Mx0OVfXlOcQLRePuDIYdFCVBPCNapWHplDK+mh7GDdP/Tvor4ocuybRRPSvfcRb2vjRJt1fHCqw3cr8qACQ==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -6867,7 +2860,6 @@ "semver", "spdx-expression-parse", "ssri", - "strip-ansi", "supports-color", "tar", "text-table", @@ -6885,12 +2877,12 @@ "@npmcli/fs": "^3.1.0", "@npmcli/map-workspaces": "^3.0.4", "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^7.0.2", - "@sigstore/tuf": "^2.2.0", + "@npmcli/promise-spawn": "^7.0.1", + "@npmcli/run-script": "^7.0.4", + "@sigstore/tuf": "^2.3.0", "abbrev": "^2.0.0", "archy": "~1.0.0", - "cacache": "^18.0.1", + "cacache": "^18.0.2", "chalk": "^5.3.0", "ci-info": "^4.0.0", "cli-columns": "^4.0.0", @@ -6933,7 +2925,7 @@ "npm-user-validate": "^2.0.0", "npmlog": "^7.0.1", "p-map": "^4.0.0", - "pacote": "^17.0.5", + "pacote": "^17.0.6", "parse-conflict-json": "^3.0.1", "proc-log": "^3.0.0", "qrcode-terminal": "^0.12.0", @@ -6941,7 +2933,6 @@ "semver": "^7.5.4", "spdx-expression-parse": "^3.0.1", "ssri": "^10.0.5", - "strip-ansi": "^7.1.0", "supports-color": "^9.4.0", "tar": "^6.2.0", "text-table": "~0.2.0", @@ -6998,6 +2989,18 @@ "node": ">=12" } }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", "dev": true, @@ -7021,6 +3024,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/npm/node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", "dev": true, @@ -7044,7 +3062,7 @@ } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "7.2.2", + "version": "7.3.1", "dev": true, "inBundle": true, "license": "ISC", @@ -7076,7 +3094,7 @@ "parse-conflict-json": "^3.0.0", "proc-log": "^3.0.0", "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.2", + "promise-call-limit": "^3.0.1", "read-package-json-fast": "^3.0.2", "semver": "^7.3.7", "ssri": "^10.0.5", @@ -7091,7 +3109,7 @@ } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "8.0.3", + "version": "8.1.0", "dev": true, "inBundle": true, "license": "ISC", @@ -7149,7 +3167,7 @@ } }, "node_modules/npm/node_modules/@npmcli/git": { - "version": "5.0.3", + "version": "5.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -7250,7 +3268,7 @@ } }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "7.0.0", + "version": "7.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -7274,15 +3292,15 @@ } }, "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "7.0.2", + "version": "7.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", "@npmcli/promise-spawn": "^7.0.0", "node-gyp": "^10.0.0", - "read-package-json-fast": "^3.0.0", "which": "^4.0.0" }, "engines": { @@ -7300,7 +3318,7 @@ } }, "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "2.1.0", + "version": "2.1.1", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -7311,6 +3329,15 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/npm/node_modules/@sigstore/core": { + "version": "0.2.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { "version": "0.2.1", "dev": true, @@ -7321,12 +3348,13 @@ } }, "node_modules/npm/node_modules/@sigstore/sign": { - "version": "2.2.0", + "version": "2.2.1", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.1.0", + "@sigstore/bundle": "^2.1.1", + "@sigstore/core": "^0.2.0", "@sigstore/protobuf-specs": "^0.2.1", "make-fetch-happen": "^13.0.0" }, @@ -7335,13 +3363,27 @@ } }, "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "2.2.0", + "version": "2.3.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.2.1", - "tuf-js": "^2.1.0" + "tuf-js": "^2.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/verify": { + "version": "0.1.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.1.1", + "@sigstore/core": "^0.2.0", + "@sigstore/protobuf-specs": "^0.2.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -7378,18 +3420,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/abort-controller": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/npm/node_modules/agent-base": { "version": "7.1.0", "dev": true, @@ -7416,15 +3446,12 @@ } }, "node_modules/npm/node_modules/ansi-regex": { - "version": "6.0.1", + "version": "5.0.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=8" } }, "node_modules/npm/node_modules/ansi-styles": { @@ -7452,14 +3479,10 @@ "license": "MIT" }, "node_modules/npm/node_modules/are-we-there-yet": { - "version": "4.0.1", + "version": "4.0.2", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -7470,26 +3493,6 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/base64-js": { - "version": "1.5.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/bin-links": { "version": "4.0.3", "dev": true, @@ -7523,30 +3526,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/npm/node_modules/buffer": { - "version": "6.0.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/npm/node_modules/builtins": { "version": "5.0.1", "dev": true, @@ -7557,7 +3536,7 @@ } }, "node_modules/npm/node_modules/cacache": { - "version": "18.0.1", + "version": "18.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -7649,27 +3628,6 @@ "node": ">= 10" } }, - "node_modules/npm/node_modules/cli-columns/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cli-columns/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/cli-table3": { "version": "0.6.3", "dev": true, @@ -7743,27 +3701,6 @@ "node": ">=8.0.0" } }, - "node_modules/npm/node_modules/columnify/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/columnify/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/common-ancestor-path": { "version": "1.0.1", "dev": true, @@ -7852,12 +3789,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/diff": { "version": "5.1.0", "dev": true, @@ -7904,24 +3835,6 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/event-target-shim": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/events": { - "version": "3.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/npm/node_modules/exponential-backoff": { "version": "3.1.1", "dev": true, @@ -7993,27 +3906,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/gauge/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/glob": { "version": "10.3.10", "dev": true, @@ -8117,26 +4009,6 @@ "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/ieee754": { - "version": "1.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, "node_modules/npm/node_modules/ignore-walk": { "version": "6.0.4", "dev": true, @@ -8328,7 +4200,7 @@ } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "6.0.4", + "version": "6.0.6", "dev": true, "inBundle": true, "license": "ISC", @@ -8348,7 +4220,7 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "7.0.5", + "version": "7.0.7", "dev": true, "inBundle": true, "license": "ISC", @@ -8370,7 +4242,7 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "5.0.2", + "version": "5.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -8408,7 +4280,7 @@ } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "6.0.4", + "version": "6.0.6", "dev": true, "inBundle": true, "license": "ISC", @@ -8423,7 +4295,7 @@ } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "9.0.3", + "version": "9.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -8434,7 +4306,7 @@ "npm-registry-fetch": "^16.0.0", "proc-log": "^3.0.0", "semver": "^7.3.7", - "sigstore": "^2.1.0", + "sigstore": "^2.2.0", "ssri": "^10.0.5" }, "engines": { @@ -8833,7 +4705,7 @@ } }, "node_modules/npm/node_modules/npm-packlist": { - "version": "8.0.1", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -8930,7 +4802,7 @@ } }, "node_modules/npm/node_modules/pacote": { - "version": "17.0.5", + "version": "17.0.6", "dev": true, "inBundle": true, "license": "ISC", @@ -8950,7 +4822,7 @@ "promise-retry": "^2.0.1", "read-package-json": "^7.0.0", "read-package-json-fast": "^3.0.0", - "sigstore": "^2.0.0", + "sigstore": "^2.2.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, @@ -9001,7 +4873,7 @@ } }, "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.13", + "version": "6.0.15", "dev": true, "inBundle": true, "license": "MIT", @@ -9022,15 +4894,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/process": { - "version": "0.11.10", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/npm/node_modules/promise-all-reject-late": { "version": "1.0.1", "dev": true, @@ -9041,7 +4904,7 @@ } }, "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.2", + "version": "3.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -9137,22 +5000,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/readable-stream": { - "version": "4.4.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/npm/node_modules/retry": { "version": "0.12.0", "dev": true, @@ -9162,26 +5009,6 @@ "node": ">= 4" } }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", "dev": true, @@ -9256,15 +5083,17 @@ } }, "node_modules/npm/node_modules/sigstore": { - "version": "2.1.0", + "version": "2.2.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.1.0", + "@sigstore/bundle": "^2.1.1", + "@sigstore/core": "^0.2.0", "@sigstore/protobuf-specs": "^0.2.1", - "@sigstore/sign": "^2.1.0", - "@sigstore/tuf": "^2.1.0" + "@sigstore/sign": "^2.2.1", + "@sigstore/tuf": "^2.3.0", + "@sigstore/verify": "^0.1.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -9352,15 +5181,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/npm/node_modules/string-width": { "version": "4.2.3", "dev": true, @@ -9390,61 +5210,16 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/strip-ansi": { - "version": "7.1.0", + "version": "6.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/npm/node_modules/strip-ansi-cjs": { @@ -9460,15 +5235,6 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/supports-color": { "version": "9.4.0", "dev": true, @@ -9553,7 +5319,7 @@ } }, "node_modules/npm/node_modules/tuf-js": { - "version": "2.1.0", + "version": "2.2.0", "dev": true, "inBundle": true, "license": "MIT", @@ -9701,15 +5467,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, @@ -9725,16 +5482,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.0.1", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { @@ -9760,6 +5517,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/npm/node_modules/write-file-atomic": { "version": "5.0.1", "dev": true, @@ -9947,12 +5719,6 @@ "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -10041,15 +5807,6 @@ } ] }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -10103,9 +5860,9 @@ } }, "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", - "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.10.1.tgz", + "integrity": "sha512-7ZnJYTp6uc04uYRISWtiX3DSKB/fxNQT0B5o1OUeCqiQiwF+JC9+rJiZIDrPrNCLLuTqyQmh4VdQqh/ZOkv9MQ==", "dev": true, "engines": { "node": ">=16" @@ -10132,9 +5889,9 @@ } }, "node_modules/read-pkg/node_modules/type-fest": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", - "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.10.1.tgz", + "integrity": "sha512-7ZnJYTp6uc04uYRISWtiX3DSKB/fxNQT0B5o1OUeCqiQiwF+JC9+rJiZIDrPrNCLLuTqyQmh4VdQqh/ZOkv9MQ==", "dev": true, "engines": { "node": ">=16" @@ -10158,19 +5915,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/redeyed": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", @@ -10201,23 +5945,6 @@ "node": ">=0.10.0" } }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -10267,9 +5994,9 @@ "dev": true }, "node_modules/semantic-release": { - "version": "22.0.12", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-22.0.12.tgz", - "integrity": "sha512-0mhiCR/4sZb00RVFJIUlMuiBkW3NMpVIW2Gse7noqEMoFGkvfPPAImEQbkBV8xga4KOPP4FdTRYuLLy32R1fPw==", + "version": "23.0.0", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-23.0.0.tgz", + "integrity": "sha512-Jz7jEWO2igTtske112gC4PPE2whCMVrsgxUPG3/SZI7VE357suIUZFlJd1Yu0g2I6RPc2HxNEfUg7KhmDTjwqg==", "dev": true, "dependencies": { "@semantic-release/commit-analyzer": "^11.0.0", @@ -10278,9 +6005,9 @@ "@semantic-release/npm": "^11.0.0", "@semantic-release/release-notes-generator": "^12.0.0", "aggregate-error": "^5.0.0", - "cosmiconfig": "^8.0.0", + "cosmiconfig": "^9.0.0", "debug": "^4.0.0", - "env-ci": "^10.0.0", + "env-ci": "^11.0.0", "execa": "^8.0.0", "figures": "^6.0.0", "find-versions": "^5.1.0", @@ -10290,7 +6017,7 @@ "hosted-git-info": "^7.0.0", "import-from-esm": "^1.3.1", "lodash-es": "^4.17.21", - "marked": "^9.0.0", + "marked": "^11.0.0", "marked-terminal": "^6.0.0", "micromatch": "^4.0.2", "p-each-series": "^3.0.0", @@ -10306,7 +6033,7 @@ "semantic-release": "bin/semantic-release.js" }, "engines": { - "node": "^18.17 || >=20.6.1" + "node": ">=20.8.1" } }, "node_modules/semantic-release/node_modules/@semantic-release/error": { @@ -10738,9 +6465,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz", + "integrity": "sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==", "dev": true }, "node_modules/spdx-expression-parse": { @@ -10759,18 +6486,6 @@ "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -10843,18 +6558,6 @@ "node": ">=6" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -10889,18 +6592,6 @@ "node": ">=14.18" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/temp-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", @@ -11004,15 +6695,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/type-fest": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", @@ -11208,18 +6890,6 @@ "engines": { "node": ">=12" } - }, - "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } } } } diff --git a/package.json b/package.json index 1e49342b..31010700 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "@saithodev/semantic-release-backmerge": "^4.0.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", - "gradle-semantic-release-plugin": "^1.9.0", - "semantic-release": "^22.0.12" + "gradle-semantic-release-plugin": "^1.9.1", + "semantic-release": "^23.0.0" } } From cb7ecb644391ffa1b420ba987eba4a9a00e75037 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 26 Jan 2024 22:52:37 +0100 Subject: [PATCH 38/44] ci: Use latest Node.js LTS version to fix builds --- .github/workflows/release.yml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f7e5ddce..4c4e7962 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,22 +24,21 @@ jobs: persist-credentials: false fetch-depth: 0 - - name: Cache Node modules - uses: actions/cache@v3 - with: - path: | - node_modules - key: npm-${{ hashFiles('package-lock.json') }} - - name: Cache Gradle uses: burrunan/gradle-cache-action@v1 - - name: Build with Gradle + - name: Build env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: ./gradlew generateMeta clean - - name: Setup semantic-release + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "lts/*" + cache: 'npm' + + - name: Install dependencies run: npm install - name: Release From 060ab8fbfeee212f9a93f52f4d24584f2c630047 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 27 Jan 2024 05:34:01 +0400 Subject: [PATCH 39/44] feat: Move strings to resources for localization (#2440) Co-authored-by: oSumAtrIX Co-authored-by: semantic-release-bot Co-authored-by: Aunali321 BREAKING CHANGE: Various APIs have been changed. --- api/revanced-patches.api | 498 ++++---- build.gradle.kts | 2 +- ...eGenerator.kt => IPatchesFileGenerator.kt} | 6 +- ...nerator.kt => JsonPatchesFileGenerator.kt} | 2 +- .../connectivity/wifi/spoof/SpoofWifiPatch.kt | 4 +- .../packagename/ChangePackageNamePatch.kt | 20 +- .../all/misc/resources/AddResourcesPatch.kt | 277 +++++ ...h.kt => BaseTransformInstructionsPatch.kt} | 2 +- .../RemoveCaptureRestrictionPatch.kt | 4 +- .../RemoveScreenshotRestrictionPatch.kt | 6 +- .../sim/spoof/SpoofSimCountryPatch.kt | 4 +- .../music/misc/gms/GmsCoreSupportPatch.kt | 12 +- .../misc/gms/GmsCoreSupportResourcePatch.kt | 6 +- .../misc/integrations/IntegrationsPatch.kt | 13 + .../ApplicationInitFingerprint.kt | 19 + ...ClientPatch.kt => BaseSpoofClientPatch.kt} | 4 +- .../baconreader/api/SpoofClientPatch.kt | 4 +- .../boostforreddit/api/SpoofClientPatch.kt | 4 +- .../infinityforreddit/api/SpoofClientPatch.kt | 4 +- .../joeyforreddit/api/SpoofClientPatch.kt | 4 +- .../redditisfun/api/SpoofClientPatch.kt | 4 +- ...gerprint.kt => BaseClientIdFingerprint.kt} | 2 +- .../BasicAuthorizationFingerprint.kt | 2 +- .../BuildAuthorizationStringFingerprint.kt | 2 +- .../relayforreddit/api/SpoofClientPatch.kt | 4 +- ...gerprint.kt => BaseClientIdFingerprint.kt} | 2 +- .../GetLoggedInBearerTokenFingerprint.kt | 2 +- .../GetLoggedOutBearerTokenFingerprint.kt | 2 +- .../GetRefreshTokenFingerprint.kt | 2 +- .../LoginActivityClientIdFingerprint.kt | 2 +- .../slide/api/SpoofClientPatch.kt | 4 +- .../syncforreddit/api/SpoofClientPatch.kt | 4 +- .../CastContextFetchFingerprint.kt | 2 +- .../fingerprints/HomeActivityFingerprint.kt | 9 - ...ortPatch.kt => BaseGmsCoreSupportPatch.kt} | 33 +- ....kt => BaseGmsCoreSupportResourcePatch.kt} | 9 +- .../fingerprints/GmsCoreSupportFingerprint.kt | 2 +- .../integrations/BaseIntegrationsPatch.kt} | 16 +- .../mapping}/ResourceMappingPatch.kt | 2 +- .../settings/BaseSettingsResourcePatch.kt | 63 + .../settings/preference/BasePreference.kt | 62 + .../preference/BasePreferenceScreen.kt | 93 ++ .../settings/preference}/InputType.kt | 2 +- .../settings/preference/IntentPreference.kt | 56 + .../settings/preference/ListPreference.kt | 72 ++ .../preference/NonInteractivePreference.kt | 26 + .../settings/preference/PreferenceCategory.kt | 28 + .../settings/preference/PreferenceScreen.kt | 30 + .../settings/preference/SummaryType.kt | 2 +- .../settings/preference/SwitchPreference.kt | 28 + .../settings/preference/TextPreference.kt | 28 + .../settings/AbstractSettingsResourcePatch.kt | 124 -- .../settings/preference/BasePreference.kt | 34 - .../preference/ComponentsExtensions.kt | 48 - .../settings/preference/impl/ArrayResource.kt | 29 - .../preference/impl/ListPreference.kt | 30 - .../impl/NonInteractivePreference.kt | 35 - .../settings/preference/impl/Preference.kt | 41 - .../preference/impl/PreferenceCategory.kt | 26 - .../preference/impl/PreferenceScreen.kt | 29 - .../preference/impl/StringResource.kt | 27 - .../preference/impl/SwitchPreference.kt | 34 - .../preference/impl/TextPreference.kt | 27 - .../settings/util/AbstractPreferenceScreen.kt | 98 -- .../navbar/PremiumNavbarTabResourcePatch.kt | 2 +- .../misc/integrations/IntegrationsPatch.kt | 4 +- .../fingerprints/InitFingerprint.kt | 2 +- .../patches/twitch/ad/audio/AudioAdsPatch.kt | 28 +- .../twitch/ad/embedded/EmbeddedAdsPatch.kt | 49 +- .../{AbstractAdPatch.kt => BaseAdPatch.kt} | 2 +- .../patches/twitch/ad/video/VideoAdsPatch.kt | 34 +- .../antidelete/ShowDeletedMessagesPatch.kt | 52 +- .../autoclaim/AutoClaimChannelPointsPatch.kt | 28 +- .../patches/twitch/debug/DebugModePatch.kt | 30 +- .../misc/integrations/IntegrationsPatch.kt | 4 +- .../fingerprints/InitFingerprint.kt | 2 +- .../twitch/misc/settings/SettingsPatch.kt | 69 +- .../misc/settings/SettingsResourcePatch.kt | 35 +- ...BaseHookPatchPatch.kt => BaseHookPatch.kt} | 2 +- .../{HideAdsPatch.kt => HideAdsHookPatch.kt} | 4 +- .../HideRecommendedUsersPatch.kt | 4 +- .../ad/general/HideAdsResourcePatch.kt | 74 +- .../ad/getpremium/HideGetPremiumPatch.kt | 28 +- .../patches/youtube/ad/video/VideoAdsPatch.kt | 18 +- .../copyvideourl/CopyVideoUrlResourcePatch.kt | 41 +- .../RemoveViewerDiscretionDialogPatch.kt | 30 +- .../ExternalDownloadsResourcePatch.kt | 42 +- .../DisablePreciseSeekingGesturePatch.kt | 17 +- .../seekbar/EnableSeekbarTappingPatch.kt | 19 +- .../seekbar/EnableSlideToSeekPatch.kt | 28 +- .../SwipeControlsResourcePatch.kt | 102 +- .../layout/autocaptions/AutoCaptionsPatch.kt | 19 +- .../layout/buttons/action/HideButtonsPatch.kt | 87 +- .../autoplay/HideAutoplayButtonPatch.kt | 24 +- .../captions/HideCaptionsButtonPatch.kt | 18 +- .../buttons/cast/HideCastButtonPatch.kt | 18 +- .../navigation/NavigationButtonsPatch.kt | 73 +- .../ResolvePivotBarFingerprintsPatch.kt | 2 +- .../player/hide/HidePlayerButtonsPatch.kt | 29 +- .../albumcards/AlbumCardsResourcePatch.kt | 20 +- .../breakingnews/BreakingNewsResourcePatch.kt | 20 +- .../layout/hide/comments/CommentsPatch.kt | 35 +- .../CrowdfundingBoxResourcePatch.kt | 20 +- .../HideEndscreenCardsResourcePatch.kt | 20 +- .../filterbar/HideFilterBarResourcePatch.kt | 76 +- ...deFloatingMicrophoneButtonResourcePatch.kt | 23 +- .../DisableFullscreenAmbientModePatch.kt | 26 +- .../hide/general/HideLayoutComponentsPatch.kt | 438 +------ .../infocards/HideInfocardsResourcePatch.kt | 20 +- .../HideLoadMoreButtonResourcePatch.kt | 20 +- .../HideEmailAddressPatch.kt | 58 - .../HideEmailAddressResourcePatch.kt | 30 - ...ntSwitcherAccessibilityLabelFingerprint.kt | 20 - .../HidePlayerFlyoutMenuPatch.kt | 87 +- .../DisableRollingNumberAnimationPatch.kt | 17 +- .../layout/hide/seekbar/HideSeekbarPatch.kt | 23 +- .../hide/shorts/HideShortsComponentsPatch.kt | 2 +- .../HideShortsComponentsResourcePatch.kt | 102 +- ...bleSuggestedVideoEndScreenResourcePatch.kt | 27 +- .../layout/hide/time/HideTimestampPatch.kt | 19 +- .../panels/popup/PlayerPopupPanelsPatch.kt | 19 +- ...CustomPlayerOverlayOpacityResourcePatch.kt | 25 +- .../ReturnYouTubeDislikeResourcePatch.kt | 27 +- .../layout/searchbar/WideSearchbarPatch.kt | 19 +- .../RestoreOldSeekbarThumbnailsPatch.kt | 28 +- .../seekbar/SeekbarColorResourcePatch.kt | 2 +- .../layout/seekbar/SeekbarPreferencesPatch.kt | 21 +- .../sponsorblock/SponsorBlockBytecodePatch.kt | 2 +- .../sponsorblock/SponsorBlockResourcePatch.kt | 76 +- .../spoofappversion/SpoofAppVersionPatch.kt | 54 +- .../layout/startpage/ChangeStartPagePatch.kt | 40 +- .../DisableResumingShortsOnStartupPatch.kt | 17 +- .../layout/tablet/EnableTabletLayoutPatch.kt | 20 +- .../tabletminiplayer/TabletMiniPlayerPatch.kt | 19 +- .../layout/theme/ThemeBytecodePatch.kt | 28 +- .../layout/theme/ThemeResourcePatch.kt | 38 +- .../thumbnails/AlternativeThumbnailsPatch.kt | 112 +- .../AlternativeThumbnailsResourcePatch.kt | 11 +- .../misc/announcements/AnnouncementsPatch.kt | 33 +- .../misc/autorepeat/AutoRepeatPatch.kt | 17 +- .../youtube/misc/debugging/DebuggingPatch.kt | 58 +- .../spoof/SpoofDeviceDimensionsPatch.kt | 23 +- .../misc/fix/playback/SpoofSignaturePatch.kt | 74 +- .../playback/SpoofSignatureResourcePatch.kt | 2 +- .../youtube/misc/gms/GmsCoreSupportPatch.kt | 26 +- .../misc/gms/GmsCoreSupportResourcePatch.kt | 29 +- .../misc/integrations/IntegrationsPatch.kt | 4 +- .../APIPlayerServiceFingerprint.kt | 2 +- .../ApplicationInitFingerprint.kt | 2 +- ...mbeddedPlayerControlsOverlayFingerprint.kt | 2 +- .../fingerprints/EmbeddedPlayerFingerprint.kt | 2 +- .../RemoteEmbedFragmentFingerprint.kt | 2 +- .../RemoteEmbeddedPlayerFingerprint.kt | 2 +- .../StandalonePlayerActivityFingerprint.kt | 2 +- .../misc/links/BypassURLRedirectsPatch.kt | 19 +- .../misc/links/OpenLinksExternallyPatch.kt | 20 +- .../MinimizedPlaybackPatch.kt | 25 +- .../BottomControlsResourcePatch.kt | 2 +- .../RemoveTrackingQueryParameterPatch.kt | 28 +- .../youtube/misc/settings/SettingsPatch.kt | 74 +- .../misc/settings/SettingsResourcePatch.kt | 132 +-- .../fingerprints/SetThemeFingerprint.kt | 2 +- .../misc/zoomhaptics/ZoomHapticsPatch.kt | 17 +- .../fingerprints/HomeActivityFingerprint.kt | 9 + .../video/hdrbrightness/HDRBrightnessPatch.kt | 17 +- .../quality/RememberVideoQualityPatch.kt | 84 +- .../speed/custom/CustomPlaybackSpeedPatch.kt | 28 +- .../CustomPlaybackSpeedResourcePatch.kt | 2 +- .../remember/RememberPlaybackSpeedPatch.kt | 61 +- ...RestoreOldVideoQualityMenuResourcePatch.kt | 17 +- .../kotlin/app/revanced/util/BytecodeUtils.kt | 2 +- .../kotlin/app/revanced/util/ResourceUtils.kt | 56 +- .../revanced/util/resource/ArrayResource.kt | 37 + .../resource}/BaseResource.kt | 18 +- .../revanced/util/resource/StringResource.kt | 41 + .../resources/addresources/values/arrays.xml | 100 ++ .../resources/addresources/values/strings.xml | 1019 +++++++++++++++++ .../host/values/strings.xml | 9 - .../youtube_controls_bottom_ui_container.xml | 4 +- .../copyvideourl/host/values/strings.xml | 5 - .../youtube_controls_bottom_ui_container.xml | 2 +- .../downloads/host/values/strings.xml | 4 - .../resources/gms/host/values/strings.xml | 5 - .../host/values/strings.xml | 60 - .../settings/host/values/strings.xml | 15 - ...c_sb_adjust.xml => revanced_sb_adjust.xml} | 0 ...sb_compare.xml => revanced_sb_compare.xml} | 0 .../{ic_sb_edit.xml => revanced_sb_edit.xml} | 0 .../{ic_sb_logo.xml => revanced_sb_logo.xml} | 0 ...sb_publish.xml => revanced_sb_publish.xml} | 0 ...c_sb_voting.xml => revanced_sb_voting.xml} | 0 .../host/layout/youtube_controls_layout.xml | 10 +- .../sponsorblock/host/values/strings.xml | 194 ---- ...=> revanced_sb_inline_sponsor_overlay.xml} | 10 +- ...egment.xml => revanced_sb_new_segment.xml} | 22 +- ...ml => revanced_sb_skip_sponsor_button.xml} | 8 +- ...xml => revanced_ic_sc_brightness_auto.xml} | 0 ...l => revanced_ic_sc_brightness_manual.xml} | 0 ...ute.xml => revanced_ic_sc_volume_mute.xml} | 0 ...l.xml => revanced_ic_sc_volume_normal.xml} | 0 .../twitch/settings/xml/revanced_prefs.xml | 4 - 201 files changed, 3411 insertions(+), 3784 deletions(-) rename src/main/kotlin/app/revanced/meta/{PatchesFileGenerator.kt => IPatchesFileGenerator.kt} (78%) rename src/main/kotlin/app/revanced/meta/{JsonGenerator.kt => JsonPatchesFileGenerator.kt} (95%) create mode 100644 src/main/kotlin/app/revanced/patches/all/misc/resources/AddResourcesPatch.kt rename src/main/kotlin/app/revanced/patches/all/misc/transformation/{AbstractTransformInstructionsPatch.kt => BaseTransformInstructionsPatch.kt} (96%) create mode 100644 src/main/kotlin/app/revanced/patches/music/misc/integrations/IntegrationsPatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/music/misc/integrations/fingerprints/ApplicationInitFingerprint.kt rename src/main/kotlin/app/revanced/patches/reddit/customclients/{AbstractSpoofClientPatch.kt => BaseSpoofClientPatch.kt} (98%) rename src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/fingerprints/{AbstractClientIdFingerprint.kt => BaseClientIdFingerprint.kt} (68%) rename src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/fingerprints/{AbstractClientIdFingerprint.kt => BaseClientIdFingerprint.kt} (68%) rename src/main/kotlin/app/revanced/patches/{youtube/misc/gms => shared}/fingerprints/CastContextFetchFingerprint.kt (75%) delete mode 100644 src/main/kotlin/app/revanced/patches/shared/fingerprints/HomeActivityFingerprint.kt rename src/main/kotlin/app/revanced/patches/shared/misc/gms/{AbstractGmsCoreSupportPatch.kt => BaseGmsCoreSupportPatch.kt} (88%) rename src/main/kotlin/app/revanced/patches/shared/misc/gms/{AbstractGmsCoreSupportResourcePatch.kt => BaseGmsCoreSupportResourcePatch.kt} (94%) rename src/main/kotlin/app/revanced/patches/shared/{integrations/AbstractIntegrationsPatch.kt => misc/integrations/BaseIntegrationsPatch.kt} (84%) rename src/main/kotlin/app/revanced/patches/shared/{mapping/misc => misc/mapping}/ResourceMappingPatch.kt (98%) create mode 100644 src/main/kotlin/app/revanced/patches/shared/misc/settings/BaseSettingsResourcePatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreference.kt create mode 100644 src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen.kt rename src/main/kotlin/app/revanced/patches/shared/{settings/preference/impl => misc/settings/preference}/InputType.kt (73%) create mode 100644 src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/IntentPreference.kt create mode 100644 src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/ListPreference.kt create mode 100644 src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference.kt create mode 100644 src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceCategory.kt create mode 100644 src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceScreen.kt rename src/main/kotlin/app/revanced/patches/shared/{ => misc}/settings/preference/SummaryType.kt (63%) create mode 100644 src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/SwitchPreference.kt create mode 100644 src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/TextPreference.kt delete mode 100644 src/main/kotlin/app/revanced/patches/shared/settings/AbstractSettingsResourcePatch.kt delete mode 100644 src/main/kotlin/app/revanced/patches/shared/settings/preference/BasePreference.kt delete mode 100644 src/main/kotlin/app/revanced/patches/shared/settings/preference/ComponentsExtensions.kt delete mode 100644 src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/ArrayResource.kt delete mode 100644 src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/ListPreference.kt delete mode 100644 src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/NonInteractivePreference.kt delete mode 100644 src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/Preference.kt delete mode 100644 src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/PreferenceCategory.kt delete mode 100644 src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/PreferenceScreen.kt delete mode 100644 src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/StringResource.kt delete mode 100644 src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/SwitchPreference.kt delete mode 100644 src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/TextPreference.kt delete mode 100644 src/main/kotlin/app/revanced/patches/shared/settings/util/AbstractPreferenceScreen.kt rename src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/{AbstractAdPatch.kt => BaseAdPatch.kt} (98%) rename src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/{BaseHookPatchPatch.kt => BaseHookPatch.kt} (78%) rename src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/ads/{HideAdsPatch.kt => HideAdsHookPatch.kt} (80%) delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressResourcePatch.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/shared/fingerprints/HomeActivityFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/util/resource/ArrayResource.kt rename src/main/kotlin/app/revanced/{patches/shared/settings/preference => util/resource}/BaseResource.kt (63%) create mode 100644 src/main/kotlin/app/revanced/util/resource/StringResource.kt create mode 100644 src/main/resources/addresources/values/arrays.xml create mode 100644 src/main/resources/addresources/values/strings.xml delete mode 100644 src/main/resources/alternativethumbnails/host/values/strings.xml delete mode 100644 src/main/resources/copyvideourl/host/values/strings.xml delete mode 100644 src/main/resources/downloads/host/values/strings.xml delete mode 100644 src/main/resources/gms/host/values/strings.xml delete mode 100644 src/main/resources/returnyoutubedislike/host/values/strings.xml delete mode 100644 src/main/resources/settings/host/values/strings.xml rename src/main/resources/sponsorblock/drawable/{ic_sb_adjust.xml => revanced_sb_adjust.xml} (100%) rename src/main/resources/sponsorblock/drawable/{ic_sb_compare.xml => revanced_sb_compare.xml} (100%) rename src/main/resources/sponsorblock/drawable/{ic_sb_edit.xml => revanced_sb_edit.xml} (100%) rename src/main/resources/sponsorblock/drawable/{ic_sb_logo.xml => revanced_sb_logo.xml} (100%) rename src/main/resources/sponsorblock/drawable/{ic_sb_publish.xml => revanced_sb_publish.xml} (100%) rename src/main/resources/sponsorblock/drawable/{ic_sb_voting.xml => revanced_sb_voting.xml} (100%) delete mode 100644 src/main/resources/sponsorblock/host/values/strings.xml rename src/main/resources/sponsorblock/layout/{inline_sponsor_overlay.xml => revanced_sb_inline_sponsor_overlay.xml} (79%) rename src/main/resources/sponsorblock/layout/{new_segment.xml => revanced_sb_new_segment.xml} (84%) rename src/main/resources/sponsorblock/layout/{skip_sponsor_button.xml => revanced_sb_skip_sponsor_button.xml} (82%) rename src/main/resources/swipecontrols/drawable/{ic_sc_brightness_auto.xml => revanced_ic_sc_brightness_auto.xml} (100%) rename src/main/resources/swipecontrols/drawable/{ic_sc_brightness_manual.xml => revanced_ic_sc_brightness_manual.xml} (100%) rename src/main/resources/swipecontrols/drawable/{ic_sc_volume_mute.xml => revanced_ic_sc_volume_mute.xml} (100%) rename src/main/resources/swipecontrols/drawable/{ic_sc_volume_normal.xml => revanced_ic_sc_volume_normal.xml} (100%) delete mode 100644 src/main/resources/twitch/settings/xml/revanced_prefs.xml diff --git a/api/revanced-patches.api b/api/revanced-patches.api index 08000ed3..1555a149 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -4,7 +4,7 @@ public final class app/revanced/patches/all/activity/exportall/ExportAllActiviti public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V } -public final class app/revanced/patches/all/connectivity/wifi/spoof/SpoofWifiPatch : app/revanced/patches/all/misc/transformation/AbstractTransformInstructionsPatch { +public final class app/revanced/patches/all/connectivity/wifi/spoof/SpoofWifiPatch : app/revanced/patches/all/misc/transformation/BaseTransformInstructionsPatch { public static final field INSTANCE Lapp/revanced/patches/all/connectivity/wifi/spoof/SpoofWifiPatch; public synthetic fun filterMap (Lcom/android/tools/smali/dexlib2/iface/ClassDef;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Ljava/lang/Object; public fun filterMap (Lcom/android/tools/smali/dexlib2/iface/ClassDef;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Lkotlin/Triple; @@ -38,7 +38,44 @@ public final class app/revanced/patches/all/misc/packagename/ChangePackageNamePa public final fun setOrGetFallbackPackageName (Ljava/lang/String;)Ljava/lang/String; } -public abstract class app/revanced/patches/all/misc/transformation/AbstractTransformInstructionsPatch : app/revanced/patcher/patch/BytecodePatch { +public final class app/revanced/patches/all/misc/resources/AddResourcesPatch : app/revanced/patcher/patch/ResourcePatch, java/io/Closeable, java/util/Map, kotlin/jvm/internal/markers/KMutableMap { + public static final field INSTANCE Lapp/revanced/patches/all/misc/resources/AddResourcesPatch; + public fun clear ()V + public fun close ()V + public final fun containsKey (Ljava/lang/Object;)Z + public fun containsKey (Ljava/lang/String;)Z + public final fun containsValue (Ljava/lang/Object;)Z + public fun containsValue (Ljava/util/Set;)Z + public final fun entrySet ()Ljava/util/Set; + public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V + public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V + public final synthetic fun get (Ljava/lang/Object;)Ljava/lang/Object; + public final fun get (Ljava/lang/Object;)Ljava/util/Set; + public fun get (Ljava/lang/String;)Ljava/util/Set; + public fun getEntries ()Ljava/util/Set; + public fun getKeys ()Ljava/util/Set; + public fun getSize ()I + public fun getValues ()Ljava/util/Collection; + public final fun invoke (Ljava/lang/String;Lapp/revanced/util/resource/BaseResource;)Z + public final fun invoke (Ljava/lang/String;Ljava/lang/Iterable;)Z + public final fun invoke (Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;)Z + public final fun invoke (Ljava/lang/String;Ljava/util/List;)Z + public final fun invoke (Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function1;)Z + public static synthetic fun invoke$default (Lapp/revanced/patches/all/misc/resources/AddResourcesPatch;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;ILjava/lang/Object;)Z + public static synthetic fun invoke$default (Lapp/revanced/patches/all/misc/resources/AddResourcesPatch;Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Z + public fun isEmpty ()Z + public final fun keySet ()Ljava/util/Set; + public synthetic fun put (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; + public fun put (Ljava/lang/String;Ljava/util/Set;)Ljava/util/Set; + public fun putAll (Ljava/util/Map;)V + public final synthetic fun remove (Ljava/lang/Object;)Ljava/lang/Object; + public final fun remove (Ljava/lang/Object;)Ljava/util/Set; + public fun remove (Ljava/lang/String;)Ljava/util/Set; + public final fun size ()I + public final fun values ()Ljava/util/Collection; +} + +public abstract class app/revanced/patches/all/misc/transformation/BaseTransformInstructionsPatch : app/revanced/patcher/patch/BytecodePatch { public fun ()V public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V @@ -59,7 +96,7 @@ public final class app/revanced/patches/all/misc/transformation/IMethodCall$Defa public static fun replaceInvokeVirtualWithIntegrations (Lapp/revanced/patches/all/misc/transformation/IMethodCall;Ljava/lang/String;Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Lcom/android/tools/smali/dexlib2/iface/instruction/formats/Instruction35c;I)V } -public final class app/revanced/patches/all/screencapture/removerestriction/RemoveCaptureRestrictionPatch : app/revanced/patches/all/misc/transformation/AbstractTransformInstructionsPatch { +public final class app/revanced/patches/all/screencapture/removerestriction/RemoveCaptureRestrictionPatch : app/revanced/patches/all/misc/transformation/BaseTransformInstructionsPatch { public static final field INSTANCE Lapp/revanced/patches/all/screencapture/removerestriction/RemoveCaptureRestrictionPatch; public synthetic fun filterMap (Lcom/android/tools/smali/dexlib2/iface/ClassDef;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Ljava/lang/Object; public fun filterMap (Lcom/android/tools/smali/dexlib2/iface/ClassDef;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Lkotlin/Triple; @@ -80,7 +117,7 @@ public final class app/revanced/patches/all/screencapture/removerestriction/Remo public static fun values ()[Lapp/revanced/patches/all/screencapture/removerestriction/RemoveCaptureRestrictionPatch$MethodCall; } -public final class app/revanced/patches/all/screenshot/removerestriction/RemoveScreenshotRestrictionPatch : app/revanced/patches/all/misc/transformation/AbstractTransformInstructionsPatch { +public final class app/revanced/patches/all/screenshot/removerestriction/RemoveScreenshotRestrictionPatch : app/revanced/patches/all/misc/transformation/BaseTransformInstructionsPatch { public static final field INSTANCE Lapp/revanced/patches/all/screenshot/removerestriction/RemoveScreenshotRestrictionPatch; public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V @@ -103,7 +140,7 @@ public final class app/revanced/patches/all/screenshot/removerestriction/RemoveS public static fun values ()[Lapp/revanced/patches/all/screenshot/removerestriction/RemoveScreenshotRestrictionPatch$MethodCall; } -public final class app/revanced/patches/all/telephony/sim/spoof/SpoofSimCountryPatch : app/revanced/patches/all/misc/transformation/AbstractTransformInstructionsPatch { +public final class app/revanced/patches/all/telephony/sim/spoof/SpoofSimCountryPatch : app/revanced/patches/all/misc/transformation/BaseTransformInstructionsPatch { public static final field INSTANCE Lapp/revanced/patches/all/telephony/sim/spoof/SpoofSimCountryPatch; public synthetic fun filterMap (Lcom/android/tools/smali/dexlib2/iface/ClassDef;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Ljava/lang/Object; public fun filterMap (Lcom/android/tools/smali/dexlib2/iface/ClassDef;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Lkotlin/Pair; @@ -313,14 +350,18 @@ public final class app/revanced/patches/music/misc/gms/Constants { public static final field INSTANCE Lapp/revanced/patches/music/misc/gms/Constants; } -public final class app/revanced/patches/music/misc/gms/GmsCoreSupportPatch : app/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportPatch { +public final class app/revanced/patches/music/misc/gms/GmsCoreSupportPatch : app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportPatch { public static final field INSTANCE Lapp/revanced/patches/music/misc/gms/GmsCoreSupportPatch; } -public final class app/revanced/patches/music/misc/gms/GmsCoreSupportResourcePatch : app/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportResourcePatch { +public final class app/revanced/patches/music/misc/gms/GmsCoreSupportResourcePatch : app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportResourcePatch { public static final field INSTANCE Lapp/revanced/patches/music/misc/gms/GmsCoreSupportResourcePatch; } +public final class app/revanced/patches/music/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch { + public static final field INSTANCE Lapp/revanced/patches/music/misc/integrations/IntegrationsPatch; +} + public final class app/revanced/patches/music/premium/backgroundplay/BackgroundPlayPatch : app/revanced/patcher/patch/BytecodePatch { public static final field INSTANCE Lapp/revanced/patches/music/premium/backgroundplay/BackgroundPlayPatch; public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V @@ -407,7 +448,7 @@ public final class app/revanced/patches/reddit/ad/general/HideAdsPatch : app/rev public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public abstract class app/revanced/patches/reddit/customclients/AbstractSpoofClientPatch : app/revanced/patcher/patch/BytecodePatch { +public abstract class app/revanced/patches/reddit/customclients/BaseSpoofClientPatch : app/revanced/patcher/patch/BytecodePatch { public fun (Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;)V public synthetic fun (Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V @@ -424,17 +465,17 @@ public final class app/revanced/patches/reddit/customclients/Constants { public static final field OAUTH_USER_AGENT Ljava/lang/String; } -public final class app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/AbstractSpoofClientPatch { +public final class app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/BaseSpoofClientPatch { public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch; public fun patchClientId (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V } -public final class app/revanced/patches/reddit/customclients/boostforreddit/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/AbstractSpoofClientPatch { +public final class app/revanced/patches/reddit/customclients/boostforreddit/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/BaseSpoofClientPatch { public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/boostforreddit/api/SpoofClientPatch; public fun patchClientId (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V } -public final class app/revanced/patches/reddit/customclients/infinityforreddit/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/AbstractSpoofClientPatch { +public final class app/revanced/patches/reddit/customclients/infinityforreddit/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/BaseSpoofClientPatch { public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/infinityforreddit/api/SpoofClientPatch; public fun patchClientId (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V } @@ -451,7 +492,7 @@ public final class app/revanced/patches/reddit/customclients/joeyforreddit/ads/D public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public final class app/revanced/patches/reddit/customclients/joeyforreddit/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/AbstractSpoofClientPatch { +public final class app/revanced/patches/reddit/customclients/joeyforreddit/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/BaseSpoofClientPatch { public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/joeyforreddit/api/SpoofClientPatch; public fun patchClientId (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V } @@ -462,19 +503,19 @@ public final class app/revanced/patches/reddit/customclients/joeyforreddit/detec public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public final class app/revanced/patches/reddit/customclients/redditisfun/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/AbstractSpoofClientPatch { +public final class app/revanced/patches/reddit/customclients/redditisfun/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/BaseSpoofClientPatch { public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/redditisfun/api/SpoofClientPatch; public fun patchClientId (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V public fun patchUserAgent (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V } -public final class app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/AbstractSpoofClientPatch { +public final class app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/BaseSpoofClientPatch { public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch; public fun patchClientId (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V public fun patchMiscellaneous (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V } -public final class app/revanced/patches/reddit/customclients/slide/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/AbstractSpoofClientPatch { +public final class app/revanced/patches/reddit/customclients/slide/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/BaseSpoofClientPatch { public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/slide/api/SpoofClientPatch; public fun patchClientId (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V } @@ -491,7 +532,7 @@ public final class app/revanced/patches/reddit/customclients/syncforreddit/annoy public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public final class app/revanced/patches/reddit/customclients/syncforreddit/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/AbstractSpoofClientPatch { +public final class app/revanced/patches/reddit/customclients/syncforreddit/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/BaseSpoofClientPatch { public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/syncforreddit/api/SpoofClientPatch; public fun patchClientId (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V public fun patchMiscellaneous (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V @@ -533,45 +574,62 @@ public final class app/revanced/patches/serviceportalbund/detection/root/RootDet public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public final class app/revanced/patches/shared/fingerprints/HomeActivityFingerprint : app/revanced/patches/shared/integrations/AbstractIntegrationsPatch$IntegrationsFingerprint { - public static final field INSTANCE Lapp/revanced/patches/shared/fingerprints/HomeActivityFingerprint; +public final class app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch : app/revanced/patcher/patch/BytecodePatch { + public static final field INSTANCE Lapp/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch; + public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V + public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public abstract class app/revanced/patches/shared/integrations/AbstractIntegrationsPatch : app/revanced/patcher/patch/BytecodePatch { +public abstract class app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportPatch : app/revanced/patcher/patch/BytecodePatch { + public fun (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/fingerprint/MethodFingerprint;Ljava/util/Set;Lapp/revanced/patcher/fingerprint/MethodFingerprint;Lkotlin/reflect/KClass;Lapp/revanced/patches/shared/misc/gms/BaseGmsCoreSupportResourcePatch;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/fingerprint/MethodFingerprint;Ljava/util/Set;Lapp/revanced/patcher/fingerprint/MethodFingerprint;Lkotlin/reflect/KClass;Lapp/revanced/patches/shared/misc/gms/BaseGmsCoreSupportResourcePatch;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V + public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V +} + +public abstract class app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportResourcePatch : app/revanced/patcher/patch/ResourcePatch { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V + public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V + protected final fun getGmsCoreVendor ()Ljava/lang/String; +} + +public abstract class app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch : app/revanced/patcher/patch/BytecodePatch { public fun (Ljava/lang/String;Ljava/util/Set;)V public fun (Ljava/util/Set;)V public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public abstract class app/revanced/patches/shared/integrations/AbstractIntegrationsPatch$IntegrationsFingerprint : app/revanced/patcher/fingerprint/MethodFingerprint { +public abstract class app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch$IntegrationsFingerprint : app/revanced/patcher/fingerprint/MethodFingerprint { public fun ()V public fun (Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Iterable;Ljava/lang/Iterable;Ljava/lang/Iterable;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)V public synthetic fun (Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Iterable;Ljava/lang/Iterable;Ljava/lang/Iterable;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun invoke (Ljava/lang/String;)V } -public abstract interface class app/revanced/patches/shared/integrations/AbstractIntegrationsPatch$IntegrationsFingerprint$RegisterResolver : kotlin/jvm/functions/Function1 { +public abstract interface class app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch$IntegrationsFingerprint$IRegisterResolver : kotlin/jvm/functions/Function1 { public abstract fun invoke (Lcom/android/tools/smali/dexlib2/iface/Method;)Ljava/lang/Integer; } -public final class app/revanced/patches/shared/integrations/AbstractIntegrationsPatch$IntegrationsFingerprint$RegisterResolver$DefaultImpls { - public static fun invoke (Lapp/revanced/patches/shared/integrations/AbstractIntegrationsPatch$IntegrationsFingerprint$RegisterResolver;Lcom/android/tools/smali/dexlib2/iface/Method;)Ljava/lang/Integer; +public final class app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch$IntegrationsFingerprint$IRegisterResolver$DefaultImpls { + public static fun invoke (Lapp/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch$IntegrationsFingerprint$IRegisterResolver;Lcom/android/tools/smali/dexlib2/iface/Method;)Ljava/lang/Integer; } -public final class app/revanced/patches/shared/mapping/misc/ResourceMappingPatch : app/revanced/patcher/patch/ResourcePatch { - public static final field INSTANCE Lapp/revanced/patches/shared/mapping/misc/ResourceMappingPatch; +public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatch : app/revanced/patcher/patch/ResourcePatch { + public static final field INSTANCE Lapp/revanced/patches/shared/misc/mapping/ResourceMappingPatch; public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V } -public final class app/revanced/patches/shared/mapping/misc/ResourceMappingPatch$ResourceElement { +public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatch$ResourceElement { public fun (Ljava/lang/String;Ljava/lang/String;J)V public final fun component1 ()Ljava/lang/String; public final fun component2 ()Ljava/lang/String; public final fun component3 ()J - public final fun copy (Ljava/lang/String;Ljava/lang/String;J)Lapp/revanced/patches/shared/mapping/misc/ResourceMappingPatch$ResourceElement; - public static synthetic fun copy$default (Lapp/revanced/patches/shared/mapping/misc/ResourceMappingPatch$ResourceElement;Ljava/lang/String;Ljava/lang/String;JILjava/lang/Object;)Lapp/revanced/patches/shared/mapping/misc/ResourceMappingPatch$ResourceElement; + public final fun copy (Ljava/lang/String;Ljava/lang/String;J)Lapp/revanced/patches/shared/misc/mapping/ResourceMappingPatch$ResourceElement; + public static synthetic fun copy$default (Lapp/revanced/patches/shared/misc/mapping/ResourceMappingPatch$ResourceElement;Ljava/lang/String;Ljava/lang/String;JILjava/lang/Object;)Lapp/revanced/patches/shared/misc/mapping/ResourceMappingPatch$ResourceElement; public fun equals (Ljava/lang/Object;)Z public final fun getId ()J public final fun getName ()Ljava/lang/String; @@ -580,181 +638,175 @@ public final class app/revanced/patches/shared/mapping/misc/ResourceMappingPatch public fun toString ()Ljava/lang/String; } -public final class app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch : app/revanced/patcher/patch/BytecodePatch { - public static final field INSTANCE Lapp/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch; - public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V - public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V -} - -public abstract class app/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportPatch : app/revanced/patcher/patch/BytecodePatch { - public fun (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/fingerprint/MethodFingerprint;Ljava/util/Set;Lapp/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportResourcePatch;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/fingerprint/MethodFingerprint;Ljava/util/Set;Lapp/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportResourcePatch;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V - public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V -} - -public abstract class app/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportResourcePatch : app/revanced/patcher/patch/ResourcePatch { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V - public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V - protected final fun getGmsCoreVendor ()Ljava/lang/String; -} - -public final class app/revanced/patches/shared/misc/gms/fingerprints/GmsCoreSupportFingerprint : app/revanced/patcher/fingerprint/MethodFingerprint { - public static final field GET_GMS_CORE_VENDOR_METHOD_NAME Ljava/lang/String; - public static final field INSTANCE Lapp/revanced/patches/shared/misc/gms/fingerprints/GmsCoreSupportFingerprint; -} - -public abstract class app/revanced/patches/shared/settings/AbstractSettingsResourcePatch : app/revanced/patcher/patch/ResourcePatch, java/io/Closeable { - public fun (Ljava/lang/String;Ljava/lang/String;)V +public abstract class app/revanced/patches/shared/misc/settings/BaseSettingsResourcePatch : app/revanced/patcher/patch/ResourcePatch, java/io/Closeable, java/util/Set, kotlin/jvm/internal/markers/KMutableSet { + public fun ()V + public fun (Lkotlin/Pair;Ljava/util/Set;)V + public synthetic fun (Lkotlin/Pair;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun add (Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;)Z + public synthetic fun add (Ljava/lang/Object;)Z + public fun addAll (Ljava/util/Collection;)Z + public fun clear ()V public fun close ()V + public fun contains (Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;)Z + public final fun contains (Ljava/lang/Object;)Z + public fun containsAll (Ljava/util/Collection;)Z public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V + public fun getSize ()I + public fun isEmpty ()Z + public fun iterator ()Ljava/util/Iterator; + public fun remove (Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;)Z + public final fun remove (Ljava/lang/Object;)Z + public fun removeAll (Ljava/util/Collection;)Z + public fun retainAll (Ljava/util/Collection;)Z + public final fun size ()I + public fun toArray ()[Ljava/lang/Object; + public fun toArray ([Ljava/lang/Object;)[Ljava/lang/Object; } -public abstract class app/revanced/patches/shared/settings/preference/BasePreference { - public fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +public abstract class app/revanced/patches/shared/misc/settings/preference/BasePreference { + public static final field Companion Lapp/revanced/patches/shared/misc/settings/preference/BasePreference$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun equals (Ljava/lang/Object;)Z public final fun getKey ()Ljava/lang/String; - public final fun getSummary ()Lapp/revanced/patches/shared/settings/preference/impl/StringResource; + public final fun getSummaryKey ()Ljava/lang/String; public final fun getTag ()Ljava/lang/String; - public final fun getTitle ()Lapp/revanced/patches/shared/settings/preference/impl/StringResource; + public final fun getTitleKey ()Ljava/lang/String; + public fun hashCode ()I public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } -public abstract class app/revanced/patches/shared/settings/preference/BaseResource { - public fun (Ljava/lang/String;Ljava/lang/String;)V - public final fun getName ()Ljava/lang/String; - public final fun getTag ()Ljava/lang/String; - public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; - public static synthetic fun serialize$default (Lapp/revanced/patches/shared/settings/preference/BaseResource;Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/w3c/dom/Element; +public final class app/revanced/patches/shared/misc/settings/preference/BasePreference$Companion { + public final fun addSummary (Lorg/w3c/dom/Element;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/SummaryType;)V + public static synthetic fun addSummary$default (Lapp/revanced/patches/shared/misc/settings/preference/BasePreference$Companion;Lorg/w3c/dom/Element;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/SummaryType;ILjava/lang/Object;)V } -public final class app/revanced/patches/shared/settings/preference/SummaryType : java/lang/Enum { - public static final field DEFAULT Lapp/revanced/patches/shared/settings/preference/SummaryType; - public static final field OFF Lapp/revanced/patches/shared/settings/preference/SummaryType; - public static final field ON Lapp/revanced/patches/shared/settings/preference/SummaryType; +public abstract class app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen : java/io/Closeable { + public fun ()V + public fun (Ljava/util/Set;)V + public synthetic fun (Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun close ()V + public abstract fun commit (Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreen;)V +} + +public abstract class app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$BasePreferenceCollection { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getKey ()Ljava/lang/String; + public final fun getPreferences ()Ljava/util/Set; + public final fun getTitleKey ()Ljava/lang/String; + public abstract fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreference; +} + +public class app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen : app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$BasePreferenceCollection { + public fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;)V + public synthetic fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;)V + public synthetic fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun addPreferences ([Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;)V + public final fun getCategories ()Ljava/util/Set; + public synthetic fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreference; + public fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreen; +} + +public class app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen$Category : app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$BasePreferenceCollection { + public fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V + public synthetic fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun addPreferences ([Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;)V + public synthetic fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreference; + public fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/PreferenceCategory; +} + +public final class app/revanced/patches/shared/misc/settings/preference/InputType : java/lang/Enum { + public static final field NUMBER Lapp/revanced/patches/shared/misc/settings/preference/InputType; + public static final field TEXT Lapp/revanced/patches/shared/misc/settings/preference/InputType; + public static final field TEXT_CAP_CHARACTERS Lapp/revanced/patches/shared/misc/settings/preference/InputType; + public static final field TEXT_MULTI_LINE Lapp/revanced/patches/shared/misc/settings/preference/InputType; public static fun getEntries ()Lkotlin/enums/EnumEntries; public final fun getType ()Ljava/lang/String; - public static fun valueOf (Ljava/lang/String;)Lapp/revanced/patches/shared/settings/preference/SummaryType; - public static fun values ()[Lapp/revanced/patches/shared/settings/preference/SummaryType; + public static fun valueOf (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/settings/preference/InputType; + public static fun values ()[Lapp/revanced/patches/shared/misc/settings/preference/InputType; } -public final class app/revanced/patches/shared/settings/preference/impl/ArrayResource : app/revanced/patches/shared/settings/preference/BaseResource { - public fun (Ljava/lang/String;Ljava/util/List;)V - public final fun getItems ()Ljava/util/List; +public final class app/revanced/patches/shared/misc/settings/preference/IntentPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun equals (Ljava/lang/Object;)Z + public final fun getIntent ()Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent; + public fun hashCode ()I public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } -public final class app/revanced/patches/shared/settings/preference/impl/InputType : java/lang/Enum { - public static final field NUMBER Lapp/revanced/patches/shared/settings/preference/impl/InputType; - public static final field TEXT Lapp/revanced/patches/shared/settings/preference/impl/InputType; - public static final field TEXT_CAP_CHARACTERS Lapp/revanced/patches/shared/settings/preference/impl/InputType; - public static final field TEXT_MULTI_LINE Lapp/revanced/patches/shared/settings/preference/impl/InputType; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public final fun getType ()Ljava/lang/String; - public static fun valueOf (Ljava/lang/String;)Lapp/revanced/patches/shared/settings/preference/impl/InputType; - public static fun values ()[Lapp/revanced/patches/shared/settings/preference/impl/InputType; +public final class app/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent { + public fun (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V + public final fun copy (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent; + public static synthetic fun copy$default (Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent; + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I + public fun toString ()Ljava/lang/String; } -public final class app/revanced/patches/shared/settings/preference/impl/ListPreference : app/revanced/patches/shared/settings/preference/BasePreference { - public fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/ArrayResource;Lapp/revanced/patches/shared/settings/preference/impl/ArrayResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;)V - public synthetic fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/ArrayResource;Lapp/revanced/patches/shared/settings/preference/impl/ArrayResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +public final class app/revanced/patches/shared/misc/settings/preference/ListPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getEntries ()Lapp/revanced/util/resource/ArrayResource; + public final fun getEntriesKey ()Ljava/lang/String; + public final fun getEntryValues ()Lapp/revanced/util/resource/ArrayResource; + public final fun getEntryValuesKey ()Ljava/lang/String; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } -public final class app/revanced/patches/shared/settings/preference/impl/NonInteractivePreference : app/revanced/patches/shared/settings/preference/BasePreference { - public fun (Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Ljava/lang/String;Z)V - public synthetic fun (Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V +public final class app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getSelectable ()Z public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } -public final class app/revanced/patches/shared/settings/preference/impl/Preference : app/revanced/patches/shared/settings/preference/BasePreference { - public fun (Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/Preference$Intent;)V - public fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/Preference$Intent;)V - public final fun getIntent ()Lapp/revanced/patches/shared/settings/preference/impl/Preference$Intent; +public class app/revanced/patches/shared/misc/settings/preference/PreferenceCategory : app/revanced/patches/shared/misc/settings/preference/BasePreference { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getPreferences ()Ljava/util/Set; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } -public final class app/revanced/patches/shared/settings/preference/impl/Preference$Intent { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V -} - -public class app/revanced/patches/shared/settings/preference/impl/PreferenceCategory : app/revanced/patches/shared/settings/preference/BasePreference { - public fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Ljava/util/List;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Ljava/util/List;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getPreferences ()Ljava/util/List; - public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; - public final fun setPreferences (Ljava/util/List;)V -} - -public class app/revanced/patches/shared/settings/preference/impl/PreferenceScreen : app/revanced/patches/shared/settings/preference/BasePreference { - public fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Ljava/util/List;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;)V - public synthetic fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Ljava/util/List;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getPreferences ()Ljava/util/List; - public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; - public final fun setPreferences (Ljava/util/List;)V -} - -public final class app/revanced/patches/shared/settings/preference/impl/StringResource : app/revanced/patches/shared/settings/preference/BaseResource { - public fun (Ljava/lang/String;Ljava/lang/String;Z)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getFormatted ()Z - public final fun getValue ()Ljava/lang/String; +public class app/revanced/patches/shared/misc/settings/preference/PreferenceScreen : app/revanced/patches/shared/misc/settings/preference/BasePreference { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getPreferences ()Ljava/util/Set; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } -public final class app/revanced/patches/shared/settings/preference/impl/SwitchPreference : app/revanced/patches/shared/settings/preference/BasePreference { - public fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;)V - public synthetic fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getSummaryOff ()Lapp/revanced/patches/shared/settings/preference/impl/StringResource; - public final fun getSummaryOn ()Lapp/revanced/patches/shared/settings/preference/impl/StringResource; - public final fun getUserDialogMessage ()Lapp/revanced/patches/shared/settings/preference/impl/StringResource; - public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; +public final class app/revanced/patches/shared/misc/settings/preference/SummaryType : java/lang/Enum { + public static final field DEFAULT Lapp/revanced/patches/shared/misc/settings/preference/SummaryType; + public static final field OFF Lapp/revanced/patches/shared/misc/settings/preference/SummaryType; + public static final field ON Lapp/revanced/patches/shared/misc/settings/preference/SummaryType; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getType ()Ljava/lang/String; + public static fun valueOf (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/settings/preference/SummaryType; + public static fun values ()[Lapp/revanced/patches/shared/misc/settings/preference/SummaryType; } -public final class app/revanced/patches/shared/settings/preference/impl/TextPreference : app/revanced/patches/shared/settings/preference/BasePreference { - public fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/InputType;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/StringResource;Lapp/revanced/patches/shared/settings/preference/impl/InputType;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getInputType ()Lapp/revanced/patches/shared/settings/preference/impl/InputType; - public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; -} - -public abstract class app/revanced/patches/shared/settings/util/AbstractPreferenceScreen : java/io/Closeable { +public final class app/revanced/patches/shared/misc/settings/preference/SwitchPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { public fun ()V - public fun (Ljava/util/List;)V - public synthetic fun (Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun close ()V - public abstract fun commit (Lapp/revanced/patches/shared/settings/preference/impl/PreferenceScreen;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getSummaryOffKey ()Ljava/lang/String; + public final fun getSummaryOnKey ()Ljava/lang/String; + public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } -public abstract class app/revanced/patches/shared/settings/util/AbstractPreferenceScreen$BasePreferenceCollection { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getKey ()Ljava/lang/String; - public final fun getPreferences ()Ljava/util/List; - public final fun getTitle ()Ljava/lang/String; - public abstract fun transform ()Lapp/revanced/patches/shared/settings/preference/BasePreference; -} - -public class app/revanced/patches/shared/settings/util/AbstractPreferenceScreen$Screen : app/revanced/patches/shared/settings/util/AbstractPreferenceScreen$BasePreferenceCollection { - public fun (Lapp/revanced/patches/shared/settings/util/AbstractPreferenceScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V - public synthetic fun (Lapp/revanced/patches/shared/settings/util/AbstractPreferenceScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun addPreferences ([Lapp/revanced/patches/shared/settings/preference/BasePreference;)V - public final fun getCategories ()Ljava/util/List; - public final fun getSummary ()Ljava/lang/String; - public synthetic fun transform ()Lapp/revanced/patches/shared/settings/preference/BasePreference; - public fun transform ()Lapp/revanced/patches/shared/settings/preference/impl/PreferenceScreen; -} - -public class app/revanced/patches/shared/settings/util/AbstractPreferenceScreen$Screen$Category : app/revanced/patches/shared/settings/util/AbstractPreferenceScreen$BasePreferenceCollection { - public fun (Lapp/revanced/patches/shared/settings/util/AbstractPreferenceScreen$Screen;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V - public synthetic fun (Lapp/revanced/patches/shared/settings/util/AbstractPreferenceScreen$Screen;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun addPreferences ([Lapp/revanced/patches/shared/settings/preference/BasePreference;)V - public synthetic fun transform ()Lapp/revanced/patches/shared/settings/preference/BasePreference; - public fun transform ()Lapp/revanced/patches/shared/settings/preference/impl/PreferenceCategory; +public final class app/revanced/patches/shared/misc/settings/preference/TextPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/InputType;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/InputType;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getInputType ()Lapp/revanced/patches/shared/misc/settings/preference/InputType; + public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } public final class app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch : app/revanced/patcher/patch/BytecodePatch { @@ -848,7 +900,7 @@ public final class app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPa public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public final class app/revanced/patches/tiktok/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/integrations/AbstractIntegrationsPatch { +public final class app/revanced/patches/tiktok/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch { public static final field INSTANCE Lapp/revanced/patches/tiktok/misc/integrations/IntegrationsPatch; } @@ -942,25 +994,25 @@ public final class app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch : ap public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public abstract class app/revanced/patches/twitch/ad/shared/util/AbstractAdPatch : app/revanced/patcher/patch/BytecodePatch { +public abstract class app/revanced/patches/twitch/ad/shared/util/BaseAdPatch : app/revanced/patcher/patch/BytecodePatch { public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - protected final fun blockMethods (Lapp/revanced/patcher/data/BytecodeContext;Ljava/lang/String;[Ljava/lang/String;Lapp/revanced/patches/twitch/ad/shared/util/AbstractAdPatch$ReturnMethod;)Z - public static synthetic fun blockMethods$default (Lapp/revanced/patches/twitch/ad/shared/util/AbstractAdPatch;Lapp/revanced/patcher/data/BytecodeContext;Ljava/lang/String;[Ljava/lang/String;Lapp/revanced/patches/twitch/ad/shared/util/AbstractAdPatch$ReturnMethod;ILjava/lang/Object;)Z + protected final fun blockMethods (Lapp/revanced/patcher/data/BytecodeContext;Ljava/lang/String;[Ljava/lang/String;Lapp/revanced/patches/twitch/ad/shared/util/BaseAdPatch$ReturnMethod;)Z + public static synthetic fun blockMethods$default (Lapp/revanced/patches/twitch/ad/shared/util/BaseAdPatch;Lapp/revanced/patcher/data/BytecodeContext;Ljava/lang/String;[Ljava/lang/String;Lapp/revanced/patches/twitch/ad/shared/util/BaseAdPatch$ReturnMethod;ILjava/lang/Object;)Z protected final fun createConditionInstructions (Ljava/lang/String;)Ljava/lang/String; - public static synthetic fun createConditionInstructions$default (Lapp/revanced/patches/twitch/ad/shared/util/AbstractAdPatch;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; + public static synthetic fun createConditionInstructions$default (Lapp/revanced/patches/twitch/ad/shared/util/BaseAdPatch;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; public final fun getConditionCall ()Ljava/lang/String; public final fun getSkipLabelName ()Ljava/lang/String; } -protected final class app/revanced/patches/twitch/ad/shared/util/AbstractAdPatch$ReturnMethod { +protected final class app/revanced/patches/twitch/ad/shared/util/BaseAdPatch$ReturnMethod { public fun ()V public fun (CLjava/lang/String;)V public synthetic fun (CLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()C public final fun component2 ()Ljava/lang/String; - public final fun copy (CLjava/lang/String;)Lapp/revanced/patches/twitch/ad/shared/util/AbstractAdPatch$ReturnMethod; - public static synthetic fun copy$default (Lapp/revanced/patches/twitch/ad/shared/util/AbstractAdPatch$ReturnMethod;CLjava/lang/String;ILjava/lang/Object;)Lapp/revanced/patches/twitch/ad/shared/util/AbstractAdPatch$ReturnMethod; + public final fun copy (CLjava/lang/String;)Lapp/revanced/patches/twitch/ad/shared/util/BaseAdPatch$ReturnMethod; + public static synthetic fun copy$default (Lapp/revanced/patches/twitch/ad/shared/util/BaseAdPatch$ReturnMethod;CLjava/lang/String;ILjava/lang/Object;)Lapp/revanced/patches/twitch/ad/shared/util/BaseAdPatch$ReturnMethod; public fun equals (Ljava/lang/Object;)Z public final fun getReturnType ()C public final fun getValue ()Ljava/lang/String; @@ -968,7 +1020,7 @@ protected final class app/revanced/patches/twitch/ad/shared/util/AbstractAdPatch public fun toString ()Ljava/lang/String; } -public final class app/revanced/patches/twitch/ad/video/VideoAdsPatch : app/revanced/patches/twitch/ad/shared/util/AbstractAdPatch { +public final class app/revanced/patches/twitch/ad/video/VideoAdsPatch : app/revanced/patches/twitch/ad/shared/util/BaseAdPatch { public static final field INSTANCE Lapp/revanced/patches/twitch/ad/video/VideoAdsPatch; public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V @@ -980,8 +1032,8 @@ public final class app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessag public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public final class app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointPatch : app/revanced/patcher/patch/BytecodePatch { - public static final field INSTANCE Lapp/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointPatch; +public final class app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch : app/revanced/patcher/patch/BytecodePatch { + public static final field INSTANCE Lapp/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch; public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } @@ -992,25 +1044,19 @@ public final class app/revanced/patches/twitch/debug/DebugModePatch : app/revanc public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public final class app/revanced/patches/twitch/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/integrations/AbstractIntegrationsPatch { +public final class app/revanced/patches/twitch/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch { public static final field INSTANCE Lapp/revanced/patches/twitch/misc/integrations/IntegrationsPatch; } public final class app/revanced/patches/twitch/misc/settings/SettingsPatch : app/revanced/patcher/patch/BytecodePatch, java/io/Closeable { public static final field INSTANCE Lapp/revanced/patches/twitch/misc/settings/SettingsPatch; - public final fun addPreferenceScreen (Lapp/revanced/patches/shared/settings/preference/impl/PreferenceScreen;)V - public final fun addString (Ljava/lang/String;Ljava/lang/String;Z)V - public static synthetic fun addString$default (Lapp/revanced/patches/twitch/misc/settings/SettingsPatch;Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)V public fun close ()V public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public final class app/revanced/patches/twitch/misc/settings/SettingsResourcePatch : app/revanced/patches/shared/settings/AbstractSettingsResourcePatch { +public final class app/revanced/patches/twitch/misc/settings/SettingsResourcePatch : app/revanced/patches/shared/misc/settings/BaseSettingsResourcePatch { public static final field INSTANCE Lapp/revanced/patches/twitch/misc/settings/SettingsResourcePatch; - public final fun addArray (Lapp/revanced/patches/shared/settings/preference/impl/ArrayResource;)V - public final fun addPreferenceScreen (Lapp/revanced/patches/shared/settings/preference/impl/PreferenceScreen;)V - public final fun addString (Ljava/lang/String;Ljava/lang/String;Z)V } public final class app/revanced/patches/twitter/misc/dynamiccolor/DynamicColorPatch : app/revanced/patcher/patch/ResourcePatch { @@ -1026,17 +1072,17 @@ public final class app/revanced/patches/twitter/misc/hook/json/JsonHookPatch : a public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public abstract class app/revanced/patches/twitter/misc/hook/patch/BaseHookPatchPatch : app/revanced/patcher/patch/BytecodePatch { +public abstract class app/revanced/patches/twitter/misc/hook/patch/BaseHookPatch : app/revanced/patcher/patch/BytecodePatch { public fun (Ljava/lang/String;)V public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public final class app/revanced/patches/twitter/misc/hook/patch/ads/HideAdsPatch : app/revanced/patches/twitter/misc/hook/patch/BaseHookPatchPatch { - public static final field INSTANCE Lapp/revanced/patches/twitter/misc/hook/patch/ads/HideAdsPatch; +public final class app/revanced/patches/twitter/misc/hook/patch/ads/HideAdsHookPatch : app/revanced/patches/twitter/misc/hook/patch/BaseHookPatch { + public static final field INSTANCE Lapp/revanced/patches/twitter/misc/hook/patch/ads/HideAdsHookPatch; } -public final class app/revanced/patches/twitter/misc/hook/patch/recommendation/HideRecommendedUsersPatch : app/revanced/patches/twitter/misc/hook/patch/BaseHookPatchPatch { +public final class app/revanced/patches/twitter/misc/hook/patch/recommendation/HideRecommendedUsersPatch : app/revanced/patches/twitter/misc/hook/patch/BaseHookPatch { public static final field INSTANCE Lapp/revanced/patches/twitter/misc/hook/patch/recommendation/HideRecommendedUsersPatch; } @@ -1262,12 +1308,6 @@ public final class app/revanced/patches/youtube/layout/hide/loadmorebutton/HideL public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public final class app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch : app/revanced/patcher/patch/BytecodePatch { - public static final field INSTANCE Lapp/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch; - public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V - public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V -} - public final class app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch : app/revanced/patcher/patch/ResourcePatch { public static final field INSTANCE Lapp/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch; public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V @@ -1441,19 +1481,17 @@ public final class app/revanced/patches/youtube/misc/fix/playback/SpoofSignature public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V } -public final class app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch : app/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportPatch { +public final class app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch : app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportPatch { public static final field INSTANCE Lapp/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch; - public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V - public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public final class app/revanced/patches/youtube/misc/gms/GmsCoreSupportResourcePatch : app/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportResourcePatch { +public final class app/revanced/patches/youtube/misc/gms/GmsCoreSupportResourcePatch : app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportResourcePatch { public static final field INSTANCE Lapp/revanced/patches/youtube/misc/gms/GmsCoreSupportResourcePatch; public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V } -public final class app/revanced/patches/youtube/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/integrations/AbstractIntegrationsPatch { +public final class app/revanced/patches/youtube/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch { public static final field INSTANCE Lapp/revanced/patches/youtube/misc/integrations/IntegrationsPatch; } @@ -1463,7 +1501,7 @@ public final class app/revanced/patches/youtube/misc/links/BypassURLRedirectsPat public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public final class app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch : app/revanced/patches/all/misc/transformation/AbstractTransformInstructionsPatch { +public final class app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch : app/revanced/patches/all/misc/transformation/BaseTransformInstructionsPatch { public static final field INSTANCE Lapp/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch; public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V @@ -1525,30 +1563,24 @@ public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQuery public final class app/revanced/patches/youtube/misc/settings/SettingsPatch : app/revanced/patcher/patch/BytecodePatch, java/io/Closeable { public static final field INSTANCE Lapp/revanced/patches/youtube/misc/settings/SettingsPatch; - public final fun addPreference (Lapp/revanced/patches/shared/settings/preference/impl/Preference;)V - public final fun addPreferenceScreen (Lapp/revanced/patches/shared/settings/preference/impl/PreferenceScreen;)V - public final fun addString (Ljava/lang/String;Ljava/lang/String;Z)V - public static synthetic fun addString$default (Lapp/revanced/patches/youtube/misc/settings/SettingsPatch;Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)V public fun close ()V - public final fun createReVancedSettingsIntent (Ljava/lang/String;)Lapp/revanced/patches/shared/settings/preference/impl/Preference$Intent; public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V - public final fun renameIntentsTargetPackage (Ljava/lang/String;)V + public final fun newIntent (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent; } -public final class app/revanced/patches/youtube/misc/settings/SettingsPatch$PreferenceScreen : app/revanced/patches/shared/settings/util/AbstractPreferenceScreen { +public final class app/revanced/patches/youtube/misc/settings/SettingsPatch$PreferenceScreen : app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen { public static final field INSTANCE Lapp/revanced/patches/youtube/misc/settings/SettingsPatch$PreferenceScreen; - public fun commit (Lapp/revanced/patches/shared/settings/preference/impl/PreferenceScreen;)V - public final fun getADS ()Lapp/revanced/patches/shared/settings/util/AbstractPreferenceScreen$Screen; - public final fun getINTERACTIONS ()Lapp/revanced/patches/shared/settings/util/AbstractPreferenceScreen$Screen; - public final fun getLAYOUT ()Lapp/revanced/patches/shared/settings/util/AbstractPreferenceScreen$Screen; - public final fun getMISC ()Lapp/revanced/patches/shared/settings/util/AbstractPreferenceScreen$Screen; - public final fun getVIDEO ()Lapp/revanced/patches/shared/settings/util/AbstractPreferenceScreen$Screen; + public fun commit (Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreen;)V + public final fun getADS ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; + public final fun getINTERACTIONS ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; + public final fun getLAYOUT ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; + public final fun getMISC ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; + public final fun getVIDEO ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; } -public final class app/revanced/patches/youtube/misc/settings/SettingsResourcePatch : app/revanced/patches/shared/settings/AbstractSettingsResourcePatch { +public final class app/revanced/patches/youtube/misc/settings/SettingsResourcePatch : app/revanced/patches/shared/misc/settings/BaseSettingsResourcePatch { public static final field INSTANCE Lapp/revanced/patches/youtube/misc/settings/SettingsResourcePatch; - public fun close ()V public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V } @@ -1673,11 +1705,13 @@ public final class app/revanced/util/ResourceGroup { } public final class app/revanced/util/ResourceUtilsKt { + public static final fun asSequence (Lorg/w3c/dom/NodeList;)Lkotlin/sequences/Sequence; + public static final fun childElementsSequence (Lorg/w3c/dom/Node;)Lkotlin/sequences/Sequence; public static final fun copyResources (Lapp/revanced/patcher/data/ResourceContext;Ljava/lang/String;[Lapp/revanced/util/ResourceGroup;)V public static final fun copyXmlNode (Ljava/lang/String;Lapp/revanced/patcher/util/DomFileEditor;Lapp/revanced/patcher/util/DomFileEditor;)Ljava/lang/AutoCloseable; public static final fun doRecursively (Lorg/w3c/dom/Node;Lkotlin/jvm/functions/Function1;)V + public static final fun forEachChildElement (Lorg/w3c/dom/Node;Lkotlin/jvm/functions/Function1;)V public static final fun iterateXmlNodeChildren (Lapp/revanced/patcher/data/ResourceContext;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V - public static final fun mergeStrings (Lapp/revanced/patcher/data/ResourceContext;Ljava/lang/String;)V } public abstract class app/revanced/util/patch/LiteralValueFingerprint : app/revanced/patcher/fingerprint/MethodFingerprint { @@ -1685,3 +1719,37 @@ public abstract class app/revanced/util/patch/LiteralValueFingerprint : app/reva public synthetic fun (Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Iterable;Ljava/lang/Iterable;Ljava/lang/Iterable;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/internal/DefaultConstructorMarker;)V } +public final class app/revanced/util/resource/ArrayResource : app/revanced/util/resource/BaseResource { + public static final field Companion Lapp/revanced/util/resource/ArrayResource$Companion; + public fun (Ljava/lang/String;Ljava/util/List;)V + public final fun getItems ()Ljava/util/List; + public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; +} + +public final class app/revanced/util/resource/ArrayResource$Companion { + public final fun fromNode (Lorg/w3c/dom/Node;)Lapp/revanced/util/resource/ArrayResource; +} + +public abstract class app/revanced/util/resource/BaseResource { + public fun (Ljava/lang/String;Ljava/lang/String;)V + public fun equals (Ljava/lang/Object;)Z + public final fun getName ()Ljava/lang/String; + public final fun getTag ()Ljava/lang/String; + public fun hashCode ()I + public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; + public static synthetic fun serialize$default (Lapp/revanced/util/resource/BaseResource;Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/w3c/dom/Element; +} + +public final class app/revanced/util/resource/StringResource : app/revanced/util/resource/BaseResource { + public static final field Companion Lapp/revanced/util/resource/StringResource$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Z)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFormatted ()Z + public final fun getValue ()Ljava/lang/String; + public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; +} + +public final class app/revanced/util/resource/StringResource$Companion { + public final fun fromNode (Lorg/w3c/dom/Node;)Lapp/revanced/util/resource/StringResource; +} + diff --git a/build.gradle.kts b/build.gradle.kts index a818fb54..9c0f5574 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -78,7 +78,7 @@ tasks { dependsOn(build) classpath = sourceSets["main"].runtimeClasspath - mainClass.set("app.revanced.meta.PatchesFileGenerator") + mainClass.set("app.revanced.meta.IPatchesFileGenerator") } // Required to run tasks because Gradle semantic-release plugin runs the publish task. diff --git a/src/main/kotlin/app/revanced/meta/PatchesFileGenerator.kt b/src/main/kotlin/app/revanced/meta/IPatchesFileGenerator.kt similarity index 78% rename from src/main/kotlin/app/revanced/meta/PatchesFileGenerator.kt rename to src/main/kotlin/app/revanced/meta/IPatchesFileGenerator.kt index 61d8e85d..49d46e51 100644 --- a/src/main/kotlin/app/revanced/meta/PatchesFileGenerator.kt +++ b/src/main/kotlin/app/revanced/meta/IPatchesFileGenerator.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.PatchBundleLoader import app.revanced.patcher.PatchSet import java.io.File -internal interface PatchesFileGenerator { +internal interface IPatchesFileGenerator { fun generate(patches: PatchSet) private companion object { @@ -14,7 +14,7 @@ internal interface PatchesFileGenerator { ).also { loader -> if (loader.isEmpty()) throw IllegalStateException("No patches found") }.let { bundle -> - arrayOf(JsonGenerator()).forEach { generator -> generator.generate(bundle) } + arrayOf(JsonPatchesFileGenerator()).forEach { generator -> generator.generate(bundle) } } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/app/revanced/meta/JsonGenerator.kt b/src/main/kotlin/app/revanced/meta/JsonPatchesFileGenerator.kt similarity index 95% rename from src/main/kotlin/app/revanced/meta/JsonGenerator.kt rename to src/main/kotlin/app/revanced/meta/JsonPatchesFileGenerator.kt index 651297e2..6755706c 100644 --- a/src/main/kotlin/app/revanced/meta/JsonGenerator.kt +++ b/src/main/kotlin/app/revanced/meta/JsonPatchesFileGenerator.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.patch.Patch import com.google.gson.GsonBuilder import java.io.File -internal class JsonGenerator : PatchesFileGenerator { +internal class JsonPatchesFileGenerator : IPatchesFileGenerator { override fun generate(patches: PatchSet) = patches.map { JsonPatch( it.name!!, diff --git a/src/main/kotlin/app/revanced/patches/all/connectivity/wifi/spoof/SpoofWifiPatch.kt b/src/main/kotlin/app/revanced/patches/all/connectivity/wifi/spoof/SpoofWifiPatch.kt index 5871749a..3f79c29e 100644 --- a/src/main/kotlin/app/revanced/patches/all/connectivity/wifi/spoof/SpoofWifiPatch.kt +++ b/src/main/kotlin/app/revanced/patches/all/connectivity/wifi/spoof/SpoofWifiPatch.kt @@ -2,7 +2,7 @@ package app.revanced.patches.all.connectivity.wifi.spoof import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.all.misc.transformation.AbstractTransformInstructionsPatch +import app.revanced.patches.all.misc.transformation.BaseTransformInstructionsPatch import app.revanced.patches.all.misc.transformation.IMethodCall import app.revanced.patches.all.misc.transformation.Instruction35cInfo import app.revanced.patches.all.misc.transformation.filterMapInstruction35c @@ -17,7 +17,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.Instruction requiresIntegrations = true ) @Suppress("unused") -object SpoofWifiPatch : AbstractTransformInstructionsPatch() { +object SpoofWifiPatch : BaseTransformInstructionsPatch() { private const val INTEGRATIONS_CLASS_DESCRIPTOR_PREFIX = "Lapp/revanced/integrations/all/connectivity/wifi/spoof/SpoofWifiPatch" private const val INTEGRATIONS_CLASS_DESCRIPTOR = "$INTEGRATIONS_CLASS_DESCRIPTOR_PREFIX;" diff --git a/src/main/kotlin/app/revanced/patches/all/misc/packagename/ChangePackageNamePatch.kt b/src/main/kotlin/app/revanced/patches/all/misc/packagename/ChangePackageNamePatch.kt index 0471427a..ea847c4d 100644 --- a/src/main/kotlin/app/revanced/patches/all/misc/packagename/ChangePackageNamePatch.kt +++ b/src/main/kotlin/app/revanced/patches/all/misc/packagename/ChangePackageNamePatch.kt @@ -41,22 +41,22 @@ object ChangePackageNamePatch : ResourcePatch(), Closeable { * @throws PatchOptionException.ValueValidationException If the package name is invalid. */ fun setOrGetFallbackPackageName(fallbackPackageName: String): String { - val packageName = this.packageNameOption.value!! + val packageName = packageNameOption.value!! - return if (packageName == this.packageNameOption.default) - fallbackPackageName.also { this.packageNameOption.value = it } + return if (packageName == packageNameOption.default) + fallbackPackageName.also { packageNameOption.value = it } else packageName } override fun close() = context.xmlEditor["AndroidManifest.xml"].use { editor -> + val replacementPackageName = packageNameOption.value + val manifest = editor.file.getElementsByTagName("manifest").item(0) as Element - val originalPackageName = manifest.getAttribute("package") - - var replacementPackageName = this.packageNameOption.value - if (replacementPackageName == this.packageNameOption.default) - replacementPackageName = "$originalPackageName.revanced" - - manifest.setAttribute("package", replacementPackageName) + manifest.setAttribute( + "package", + if (replacementPackageName != packageNameOption.default) replacementPackageName + else "${manifest.getAttribute("package")}.revanced" + ) } } diff --git a/src/main/kotlin/app/revanced/patches/all/misc/resources/AddResourcesPatch.kt b/src/main/kotlin/app/revanced/patches/all/misc/resources/AddResourcesPatch.kt new file mode 100644 index 00000000..bb72c077 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/all/misc/resources/AddResourcesPatch.kt @@ -0,0 +1,277 @@ +package app.revanced.patches.all.misc.resources + +import app.revanced.patcher.PatchClass +import app.revanced.patcher.data.ResourceContext +import app.revanced.patcher.patch.PatchException +import app.revanced.patcher.patch.ResourcePatch +import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.util.DomFileEditor +import app.revanced.patches.all.misc.resources.AddResourcesPatch.resources +import app.revanced.util.* +import app.revanced.util.resource.ArrayResource +import app.revanced.util.resource.BaseResource +import app.revanced.util.resource.StringResource +import org.w3c.dom.Node +import java.io.Closeable +import java.util.* + +/** + * An identifier of an app. For example, `youtube`. + */ +private typealias AppId = String +/** + * An identifier of a patch. For example, `ad.general.HideAdsPatch`. + */ +private typealias PatchId = String + +/** + * A set of resources of a patch. + */ +private typealias PatchResources = MutableSet +/** + * A map of resources belonging to a patch. + */ +private typealias AppResources = MutableMap +/** + * A map of resources belonging to an app. + */ +private typealias Resources = MutableMap + +/** + * The value of a resource. + * For example, `values` or `values-de`. + */ +private typealias Value = String + +@Patch(description = "Add resources such as strings or arrays to the app.") +object AddResourcesPatch : ResourcePatch(), MutableMap> by mutableMapOf(), Closeable { + private lateinit var context: ResourceContext + + /** + * A map of all resources associated by their value staged by [execute]. + */ + private lateinit var resources: Map + + /* + The strategy of this patch is to stage resources present in `/resources/addresources`. + These resources are organized by their respective value and patch. + + On AddResourcesPatch#execute, all resources are staged in a temporary map. + After that, other patches that depend on AddResourcesPatch can call + AddResourcesPatch#invoke(PatchClass) to stage resources belonging to that patch + from the temporary map to AddResourcesPatch. + + After all patches that depend on AddResourcesPatch have been executed, + AddResourcesPatch#close is finally called to add all staged resources to the app. + */ + override fun execute(context: ResourceContext) { + this.context = context + + resources = buildMap { + /** + * Puts resources under `/resources/addresources//.xml` into the map. + * + * @param value The value of the resource. For example, `values` or `values-de`. + * @param resourceKind The kind of the resource. For example, `strings` or `arrays`. + * @param transform A function that transforms the [Node]s from the XML files to a [BaseResource]. + */ + fun addResources( + value: Value, + resourceKind: String, + transform: (Node) -> BaseResource, + ) { + inputStreamFromBundledResource( + "addresources", + "$value/$resourceKind.xml" + )?.let { stream -> + // Add the resources associated with the given value to the map, + // instead of overwriting it. + // This covers the example case such as adding strings and arrays of the same value. + getOrPut(value, ::mutableMapOf).apply { + context.xmlEditor[stream].use { + it.file.getElementsByTagName("app").asSequence().forEach { app -> + val appId = app.attributes.getNamedItem("id").textContent + + getOrPut(appId, ::mutableMapOf).apply { + app.forEachChildElement { patch -> + val patchId = patch.attributes.getNamedItem("id").textContent + + getOrPut(patchId, ::mutableSetOf).apply { + patch.forEachChildElement { resourceNode -> + val resource = transform(resourceNode) + + add(resource) + } + } + } + } + } + } + } + } + } + + // Stage all resources to a temporary map. + // Staged resources consumed by AddResourcesPatch#invoke(PatchClass) + // are later used in AddResourcesPatch#close. + try { + val addStringResources = { value: Value -> + addResources(value, "strings", StringResource::fromNode) + } + Locale.getISOLanguages().asSequence().map { "values-$it" }.forEach { addStringResources(it) } + addStringResources("values") + + addResources("values", "arrays", ArrayResource::fromNode) + } catch (e: Exception) { + throw PatchException("Failed to read resources", e) + } + } + } + + /** + * Adds a [BaseResource] to the map using [MutableMap.getOrPut]. + * + * @param value The value of the resource. For example, `values` or `values-de`. + * @param resource The resource to add. + * + * @return True if the resource was added, false if it already existed. + */ + operator fun invoke(value: Value, resource: BaseResource) = + getOrPut(value, ::mutableSetOf).add(resource) + + /** + * Adds a list of [BaseResource]s to the map using [MutableMap.getOrPut]. + * + * @param value The value of the resource. For example, `values` or `values-de`. + * @param resources The resources to add. + * + * @return True if the resources were added, false if they already existed. + */ + operator fun invoke(value: Value, resources: Iterable) = + getOrPut(value, ::mutableSetOf).addAll(resources) + + /** + * Adds a [StringResource]. + * + * @param name The name of the string resource. + * @param value The value of the string resource. + * @param formatted Whether the string resource is formatted. Defaults to `true`. + * @param resourceValue The value of the resource. For example, `values` or `values-de`. + * + * @return True if the resource was added, false if it already existed. + */ + operator fun invoke( + name: String, + value: String, + formatted: Boolean = true, + resourceValue: Value = "values", + ) = invoke(resourceValue, StringResource(name, value, formatted)) + + /** + * Adds an [ArrayResource]. + * + * @param name The name of the array resource. + * @param items The items of the array resource. + * + * @return True if the resource was added, false if it already existed. + */ + operator fun invoke( + name: String, + items: List + ) = invoke("values", ArrayResource(name, items)) + + + /** + * Puts all resources of any [Value] staged in [resources] for the given [PatchClass] to [AddResourcesPatch]. + * + * @param patch The class of the patch to add resources for. + * @param parseIds A function that parses the [AppId] and [PatchId] from the given [PatchClass]. + * This is used to access the resources in [resources] to stage them in [AddResourcesPatch]. + * The default implementation assumes that the [PatchClass] qualified name has the following format: + * `....`. + * + * @return True if any resources were added, false if none were added. + * + * @see AddResourcesPatch.close + */ + operator fun invoke( + patch: PatchClass, + parseIds: PatchClass.() -> Pair = { + val qualifiedName = qualifiedName ?: throw PatchException("Patch qualified name is null") + + // This requires qualifiedName to have the following format: + // `....` + with(qualifiedName.split(".")) { + if (size < 5) throw PatchException("Patch qualified name has invalid format") + + val appId = this[3] + val patchId = subList(4, size).joinToString(".") + + appId to patchId + } + } + ): Boolean { + val (appId, patchId) = patch.parseIds() + + var result = false + + // Stage resources for the given patch to AddResourcesPatch associated with their value. + resources.forEach { (value, resources) -> + resources[appId]?.get(patchId)?.let { patchResources -> + if (invoke(value, patchResources)) result = true + } + } + + return result + } + + /** + * Adds all resources staged in [AddResourcesPatch] to the app. + * This is called after all patches that depend on [AddResourcesPatch] have been executed. + */ + override fun close() { + operator fun MutableMap>.invoke( + value: Value, + resource: BaseResource + ) { + // TODO: Fix open-closed principle violation by modifying BaseResource#serialize so that it accepts + // a Value and the map of editors. It will then get or put the editor suitable for its resource type + // to serialize itself to it. + val resourceFileName = when (resource) { + is StringResource -> "strings" + is ArrayResource -> "arrays" + else -> throw NotImplementedError("Unsupported resource type") + } + + getOrPut(resourceFileName) { + val targetFile = context["res/$value/$resourceFileName.xml"].also { + it.parentFile?.mkdirs() + it.createNewFile() + } + + context.xmlEditor[targetFile.path].let { editor -> + // Save the target node here as well + // in order to avoid having to call editor.getNode("resources") + // every time addUsingEditors is called but also save the editor so that it can be closed later. + editor to editor.getNode("resources") + } + }.let { (_, targetNode) -> + targetNode.addResource(resource) { invoke(value, it) } + } + } + + forEach { (value, resources) -> + // A map of editors associated by their kind (e.g. strings, arrays). + // Each editor is accompanied by the target node to which resources are added. + // A map is used because Map#getOrPut allows opening a new editor for the duration of a resource value. + // This is done to prevent having to open the files for every resource that is added. + // Instead, it is cached once and reused for resources of the same value. + // This map is later accessed to close all editors for the current resource value. + val resourceFileEditors = mutableMapOf>() + + resources.forEach { resource -> resourceFileEditors(value, resource) } + + resourceFileEditors.values.forEach { (editor, _) -> editor.close() } + } + } +} diff --git a/src/main/kotlin/app/revanced/patches/all/misc/transformation/AbstractTransformInstructionsPatch.kt b/src/main/kotlin/app/revanced/patches/all/misc/transformation/BaseTransformInstructionsPatch.kt similarity index 96% rename from src/main/kotlin/app/revanced/patches/all/misc/transformation/AbstractTransformInstructionsPatch.kt rename to src/main/kotlin/app/revanced/patches/all/misc/transformation/BaseTransformInstructionsPatch.kt index a4c447e9..68e8a68b 100644 --- a/src/main/kotlin/app/revanced/patches/all/misc/transformation/AbstractTransformInstructionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/all/misc/transformation/BaseTransformInstructionsPatch.kt @@ -9,7 +9,7 @@ import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.Instruction @Suppress("MemberVisibilityCanBePrivate") -abstract class AbstractTransformInstructionsPatch : BytecodePatch() { +abstract class BaseTransformInstructionsPatch : BytecodePatch() { abstract fun filterMap( classDef: ClassDef, method: Method, diff --git a/src/main/kotlin/app/revanced/patches/all/screencapture/removerestriction/RemoveCaptureRestrictionPatch.kt b/src/main/kotlin/app/revanced/patches/all/screencapture/removerestriction/RemoveCaptureRestrictionPatch.kt index 3bc82166..b3afc3d6 100644 --- a/src/main/kotlin/app/revanced/patches/all/screencapture/removerestriction/RemoveCaptureRestrictionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/all/screencapture/removerestriction/RemoveCaptureRestrictionPatch.kt @@ -2,7 +2,7 @@ package app.revanced.patches.all.screencapture.removerestriction import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.all.misc.transformation.AbstractTransformInstructionsPatch +import app.revanced.patches.all.misc.transformation.BaseTransformInstructionsPatch import app.revanced.patches.all.misc.transformation.IMethodCall import app.revanced.patches.all.misc.transformation.Instruction35cInfo import app.revanced.patches.all.misc.transformation.filterMapInstruction35c @@ -18,7 +18,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.Instruction requiresIntegrations = true ) @Suppress("unused") -object RemoveCaptureRestrictionPatch : AbstractTransformInstructionsPatch() { +object RemoveCaptureRestrictionPatch : BaseTransformInstructionsPatch() { private const val INTEGRATIONS_CLASS_DESCRIPTOR_PREFIX = "Lapp/revanced/integrations/all/screencapture/removerestriction/RemoveScreencaptureRestrictionPatch" private const val INTEGRATIONS_CLASS_DESCRIPTOR = "$INTEGRATIONS_CLASS_DESCRIPTOR_PREFIX;" diff --git a/src/main/kotlin/app/revanced/patches/all/screenshot/removerestriction/RemoveScreenshotRestrictionPatch.kt b/src/main/kotlin/app/revanced/patches/all/screenshot/removerestriction/RemoveScreenshotRestrictionPatch.kt index 12006f65..0667ed0f 100644 --- a/src/main/kotlin/app/revanced/patches/all/screenshot/removerestriction/RemoveScreenshotRestrictionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/all/screenshot/removerestriction/RemoveScreenshotRestrictionPatch.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.all.misc.transformation.AbstractTransformInstructionsPatch +import app.revanced.patches.all.misc.transformation.BaseTransformInstructionsPatch import app.revanced.patches.all.misc.transformation.IMethodCall import app.revanced.patches.all.misc.transformation.Instruction35cInfo import app.revanced.patches.all.misc.transformation.filterMapInstruction35c @@ -22,7 +22,7 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference requiresIntegrations = true, ) @Suppress("unused") -object RemoveScreenshotRestrictionPatch : AbstractTransformInstructionsPatch() { +object RemoveScreenshotRestrictionPatch : BaseTransformInstructionsPatch() { private const val INTEGRATIONS_CLASS_DESCRIPTOR_PREFIX = "Lapp/revanced/integrations/all/screenshot/removerestriction/RemoveScreenshotRestrictionPatch" private const val INTEGRATIONS_CLASS_DESCRIPTOR = "$INTEGRATIONS_CLASS_DESCRIPTOR_PREFIX;" @@ -71,7 +71,7 @@ object RemoveScreenshotRestrictionPatch : AbstractTransformInstructionsPatch>() { +private class ModifyLayoutParamsFlags : BaseTransformInstructionsPatch>() { override fun filterMap( classDef: ClassDef, method: Method, diff --git a/src/main/kotlin/app/revanced/patches/all/telephony/sim/spoof/SpoofSimCountryPatch.kt b/src/main/kotlin/app/revanced/patches/all/telephony/sim/spoof/SpoofSimCountryPatch.kt index 068861b0..63afac86 100644 --- a/src/main/kotlin/app/revanced/patches/all/telephony/sim/spoof/SpoofSimCountryPatch.kt +++ b/src/main/kotlin/app/revanced/patches/all/telephony/sim/spoof/SpoofSimCountryPatch.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.all.misc.transformation.AbstractTransformInstructionsPatch +import app.revanced.patches.all.misc.transformation.BaseTransformInstructionsPatch import com.android.tools.smali.dexlib2.iface.ClassDef import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.Instruction @@ -23,7 +23,7 @@ import java.util.* use = false, ) @Suppress("unused") -object SpoofSimCountryPatch : AbstractTransformInstructionsPatch>() { +object SpoofSimCountryPatch : BaseTransformInstructionsPatch>() { private val countries = Locale.getISOCountries().associateBy { Locale("", it).displayCountry } private val networkCountryIso by isoCountryPatchOption( diff --git a/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt index 9b2dcec9..5bb8e2a4 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt @@ -4,11 +4,13 @@ import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME import app.revanced.patches.music.misc.gms.Constants.REVANCED_MUSIC_PACKAGE_NAME import app.revanced.patches.music.misc.gms.GmsCoreSupportResourcePatch.gmsCoreVendorOption import app.revanced.patches.music.misc.gms.fingerprints.* -import app.revanced.patches.shared.misc.gms.AbstractGmsCoreSupportPatch -import app.revanced.patches.youtube.misc.gms.fingerprints.CastContextFetchFingerprint +import app.revanced.patches.music.misc.integrations.fingerprints.ApplicationInitFingerprint +import app.revanced.patches.music.misc.integrations.IntegrationsPatch +import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch +import app.revanced.patches.shared.fingerprints.CastContextFetchFingerprint @Suppress("unused") -object GmsCoreSupportPatch : AbstractGmsCoreSupportPatch( +object GmsCoreSupportPatch : BaseGmsCoreSupportPatch( fromPackageName = MUSIC_PACKAGE_NAME, toPackageName = REVANCED_MUSIC_PACKAGE_NAME, primeMethodFingerprint = PrimeMethodFingerprint, @@ -19,7 +21,9 @@ object GmsCoreSupportPatch : AbstractGmsCoreSupportPatch( CastDynamiteModuleV2Fingerprint, CastContextFetchFingerprint, ), - abstractGmsCoreSupportResourcePatch = GmsCoreSupportResourcePatch, + mainActivityOnCreateFingerprint = ApplicationInitFingerprint, + integrationsPatchDependency = IntegrationsPatch::class, + gmsCoreSupportResourcePatch = GmsCoreSupportResourcePatch, compatiblePackages = setOf(CompatiblePackage("com.google.android.apps.youtube.music")), fingerprints = setOf( ServiceCheckFingerprint, diff --git a/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportResourcePatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportResourcePatch.kt index 06c36bde..5daa421c 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportResourcePatch.kt @@ -2,10 +2,10 @@ package app.revanced.patches.music.misc.gms import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME import app.revanced.patches.music.misc.gms.Constants.REVANCED_MUSIC_PACKAGE_NAME -import app.revanced.patches.shared.misc.gms.AbstractGmsCoreSupportResourcePatch +import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportResourcePatch -object GmsCoreSupportResourcePatch : AbstractGmsCoreSupportResourcePatch( +object GmsCoreSupportResourcePatch : BaseGmsCoreSupportResourcePatch( fromPackageName = MUSIC_PACKAGE_NAME, toPackageName = REVANCED_MUSIC_PACKAGE_NAME, spoofedPackageSignature = "afb0fed5eeaebdd86f56a97742f4b6b33ef59875" -) \ No newline at end of file +) diff --git a/src/main/kotlin/app/revanced/patches/music/misc/integrations/IntegrationsPatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/integrations/IntegrationsPatch.kt new file mode 100644 index 00000000..06f45d7e --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/misc/integrations/IntegrationsPatch.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.music.misc.integrations + +import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.music.misc.integrations.fingerprints.ApplicationInitFingerprint +import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch + +@Patch(requiresIntegrations = true) +object IntegrationsPatch : BaseIntegrationsPatch( + "Lapp/revanced/integrations/utils/ReVancedUtils;", + setOf( + ApplicationInitFingerprint, + ), +) diff --git a/src/main/kotlin/app/revanced/patches/music/misc/integrations/fingerprints/ApplicationInitFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/integrations/fingerprints/ApplicationInitFingerprint.kt new file mode 100644 index 00000000..d825b4e8 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/misc/integrations/fingerprints/ApplicationInitFingerprint.kt @@ -0,0 +1,19 @@ +package app.revanced.patches.music.misc.integrations.fingerprints + +import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint +import com.android.tools.smali.dexlib2.Opcode + +internal object ApplicationInitFingerprint : IntegrationsFingerprint( + returnType = "V", + parameters = emptyList(), + opcodes = listOf( + Opcode.NEW_INSTANCE, + Opcode.INVOKE_DIRECT, + Opcode.INVOKE_STATIC, + Opcode.NEW_INSTANCE, + Opcode.INVOKE_DIRECT, + Opcode.INVOKE_VIRTUAL + ), + strings = listOf("activity"), + customFingerprint = { methodDef, _ -> methodDef.name == "onCreate" }, +) diff --git a/src/main/kotlin/app/revanced/patches/reddit/customclients/AbstractSpoofClientPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/customclients/BaseSpoofClientPatch.kt similarity index 98% rename from src/main/kotlin/app/revanced/patches/reddit/customclients/AbstractSpoofClientPatch.kt rename to src/main/kotlin/app/revanced/patches/reddit/customclients/BaseSpoofClientPatch.kt index 228703d3..0a7c3e75 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/customclients/AbstractSpoofClientPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/customclients/BaseSpoofClientPatch.kt @@ -1,14 +1,14 @@ package app.revanced.patches.reddit.customclients -import app.revanced.util.exception import app.revanced.patcher.PatchClass import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patcher.fingerprint.MethodFingerprintResult import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption +import app.revanced.util.exception -abstract class AbstractSpoofClientPatch( +abstract class BaseSpoofClientPatch( redirectUri: String, private val miscellaneousFingerprints: Set = emptySet(), private val clientIdFingerprints: Set = emptySet(), diff --git a/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch.kt index 0d7b8c91..befc582b 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch.kt @@ -4,14 +4,14 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.fingerprint.MethodFingerprintResult -import app.revanced.patches.reddit.customclients.AbstractSpoofClientPatch +import app.revanced.patches.reddit.customclients.BaseSpoofClientPatch import app.revanced.patches.reddit.customclients.baconreader.api.fingerprints.GetAuthorizationUrlFingerprint import app.revanced.patches.reddit.customclients.baconreader.api.fingerprints.RequestTokenFingerprint import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Suppress("unused") -object SpoofClientPatch : AbstractSpoofClientPatch( +object SpoofClientPatch : BaseSpoofClientPatch( redirectUri = "http://baconreader.com/auth", clientIdFingerprints = setOf(GetAuthorizationUrlFingerprint, RequestTokenFingerprint), compatiblePackages = setOf( diff --git a/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/SpoofClientPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/SpoofClientPatch.kt index 8b48c0f4..e7a76441 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/SpoofClientPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/SpoofClientPatch.kt @@ -3,13 +3,13 @@ package app.revanced.patches.reddit.customclients.boostforreddit.api import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.fingerprint.MethodFingerprintResult -import app.revanced.patches.reddit.customclients.AbstractSpoofClientPatch +import app.revanced.patches.reddit.customclients.BaseSpoofClientPatch import app.revanced.patches.reddit.customclients.boostforreddit.api.fingerprints.GetClientIdFingerprint import app.revanced.patches.reddit.customclients.boostforreddit.api.fingerprints.LoginActivityOnCreateFingerprint @Suppress("unused") -object SpoofClientPatch : AbstractSpoofClientPatch( +object SpoofClientPatch : BaseSpoofClientPatch( redirectUri = "http://rubenmayayo.com", clientIdFingerprints = setOf(GetClientIdFingerprint), userAgentFingerprints = setOf(LoginActivityOnCreateFingerprint), diff --git a/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/SpoofClientPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/SpoofClientPatch.kt index 59cc195a..0565bfef 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/SpoofClientPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/SpoofClientPatch.kt @@ -5,14 +5,14 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprintResult import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patcher.util.smali.toInstructions -import app.revanced.patches.reddit.customclients.AbstractSpoofClientPatch +import app.revanced.patches.reddit.customclients.BaseSpoofClientPatch import app.revanced.patches.reddit.customclients.infinityforreddit.api.fingerprints.APIUtilsFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodImplementation @Suppress("unused") -object SpoofClientPatch : AbstractSpoofClientPatch( +object SpoofClientPatch : BaseSpoofClientPatch( redirectUri = "infinity://localhost", clientIdFingerprints = setOf(APIUtilsFingerprint), compatiblePackages = setOf(CompatiblePackage("ml.docilealligator.infinityforreddit")) diff --git a/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/SpoofClientPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/SpoofClientPatch.kt index 3dd1b7e9..78269569 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/SpoofClientPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/SpoofClientPatch.kt @@ -3,13 +3,13 @@ package app.revanced.patches.reddit.customclients.joeyforreddit.api import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.fingerprint.MethodFingerprintResult -import app.revanced.patches.reddit.customclients.AbstractSpoofClientPatch +import app.revanced.patches.reddit.customclients.BaseSpoofClientPatch import app.revanced.patches.reddit.customclients.joeyforreddit.api.fingerprints.GetClientIdFingerprint import app.revanced.patches.reddit.customclients.joeyforreddit.detection.piracy.DisablePiracyDetectionPatch @Suppress("unused") -object SpoofClientPatch : AbstractSpoofClientPatch( +object SpoofClientPatch : BaseSpoofClientPatch( redirectUri = "https://127.0.0.1:65023/authorize_callback", clientIdFingerprints = setOf(GetClientIdFingerprint), compatiblePackages = setOf( diff --git a/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/SpoofClientPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/SpoofClientPatch.kt index 251efcf9..ab110821 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/SpoofClientPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/SpoofClientPatch.kt @@ -6,7 +6,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.fingerprint.MethodFingerprintResult import app.revanced.patcher.fingerprint.MethodFingerprintResult.MethodFingerprintScanResult.StringsScanResult.StringMatch -import app.revanced.patches.reddit.customclients.AbstractSpoofClientPatch +import app.revanced.patches.reddit.customclients.BaseSpoofClientPatch import app.revanced.patches.reddit.customclients.redditisfun.api.fingerprints.BasicAuthorizationFingerprint import app.revanced.patches.reddit.customclients.redditisfun.api.fingerprints.BuildAuthorizationStringFingerprint import app.revanced.patches.reddit.customclients.redditisfun.api.fingerprints.GetUserAgentFingerprint @@ -14,7 +14,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Suppress("unused") -object SpoofClientPatch : AbstractSpoofClientPatch( +object SpoofClientPatch : BaseSpoofClientPatch( redirectUri = "redditisfun://auth", clientIdFingerprints = setOf(BuildAuthorizationStringFingerprint, BasicAuthorizationFingerprint), userAgentFingerprints = setOf(GetUserAgentFingerprint), diff --git a/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/fingerprints/AbstractClientIdFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/fingerprints/BaseClientIdFingerprint.kt similarity index 68% rename from src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/fingerprints/AbstractClientIdFingerprint.kt rename to src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/fingerprints/BaseClientIdFingerprint.kt index 761987ba..108b4f97 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/fingerprints/AbstractClientIdFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/fingerprints/BaseClientIdFingerprint.kt @@ -2,6 +2,6 @@ package app.revanced.patches.reddit.customclients.redditisfun.api.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -internal abstract class AbstractClientIdFingerprint(string: String) : MethodFingerprint( +internal abstract class BaseClientIdFingerprint(string: String) : MethodFingerprint( strings = listOfNotNull("yyOCBp.RHJhDKd", string), ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/fingerprints/BasicAuthorizationFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/fingerprints/BasicAuthorizationFingerprint.kt index d524097f..30aacd6f 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/fingerprints/BasicAuthorizationFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/fingerprints/BasicAuthorizationFingerprint.kt @@ -1,5 +1,5 @@ package app.revanced.patches.reddit.customclients.redditisfun.api.fingerprints -internal object BasicAuthorizationFingerprint : AbstractClientIdFingerprint( +internal object BasicAuthorizationFingerprint : BaseClientIdFingerprint( string = "fJOxVwBUyo*=f: - methodDef.name == "onCreate" && classDef.type.endsWith("Shell_HomeActivity;") - }, -) diff --git a/src/main/kotlin/app/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportPatch.kt b/src/main/kotlin/app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportPatch.kt similarity index 88% rename from src/main/kotlin/app/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportPatch.kt rename to src/main/kotlin/app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportPatch.kt index 4214c797..5c118db6 100644 --- a/src/main/kotlin/app/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportPatch.kt @@ -2,14 +2,15 @@ package app.revanced.patches.shared.misc.gms import app.revanced.patcher.PatchClass import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstructions import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patcher.patch.BytecodePatch import app.revanced.patches.all.misc.packagename.ChangePackageNamePatch -import app.revanced.patches.shared.misc.gms.AbstractGmsCoreSupportPatch.Constants.ACTIONS -import app.revanced.patches.shared.misc.gms.AbstractGmsCoreSupportPatch.Constants.AUTHORITIES -import app.revanced.patches.shared.misc.gms.AbstractGmsCoreSupportPatch.Constants.PERMISSIONS +import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch.Constants.ACTIONS +import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch.Constants.AUTHORITIES +import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch.Constants.PERMISSIONS import app.revanced.patches.shared.misc.gms.fingerprints.GmsCoreSupportFingerprint import app.revanced.patches.shared.misc.gms.fingerprints.GmsCoreSupportFingerprint.GET_GMS_CORE_VENDOR_METHOD_NAME import app.revanced.util.exception @@ -31,17 +32,21 @@ import com.android.tools.smali.dexlib2.util.MethodUtil * @param toPackageName The package name to fall back to if no custom package name is specified in patch options. * @param primeMethodFingerprint The fingerprint of the "prime" method that needs to be patched. * @param earlyReturnFingerprints The fingerprints of methods that need to be returned early. - * @param abstractGmsCoreSupportResourcePatch The corresponding resource patch that is used to patch the resources. + * @param mainActivityOnCreateFingerprint The fingerprint of the main activity's onCreate method. + * @param integrationsPatchDependency The patch responsible for the integrations. + * @param gmsCoreSupportResourcePatch The corresponding resource patch that is used to patch the resources. * @param dependencies Additional dependencies of this patch. * @param compatiblePackages The compatible packages of this patch. * @param fingerprints The fingerprints of this patch. */ -abstract class AbstractGmsCoreSupportPatch( +abstract class BaseGmsCoreSupportPatch( private val fromPackageName: String, private val toPackageName: String, private val primeMethodFingerprint: MethodFingerprint, private val earlyReturnFingerprints: Set, - abstractGmsCoreSupportResourcePatch: AbstractGmsCoreSupportResourcePatch, + private val mainActivityOnCreateFingerprint: MethodFingerprint, + private val integrationsPatchDependency: PatchClass, + gmsCoreSupportResourcePatch: BaseGmsCoreSupportResourcePatch, dependencies: Set = setOf(), compatiblePackages: Set? = null, fingerprints: Set = emptySet(), @@ -49,14 +54,18 @@ abstract class AbstractGmsCoreSupportPatch( name = "GmsCore support", description = "Allows patched Google apps to run without root and under a different package name " + "by using GmsCore instead of Google Play Services.", - dependencies = setOf(ChangePackageNamePatch::class, abstractGmsCoreSupportResourcePatch::class) + dependencies, + dependencies = setOf( + ChangePackageNamePatch::class, + gmsCoreSupportResourcePatch::class, + integrationsPatchDependency + ) + dependencies, compatiblePackages = compatiblePackages, - fingerprints = setOf(GmsCoreSupportFingerprint) + fingerprints, + fingerprints = setOf(GmsCoreSupportFingerprint, mainActivityOnCreateFingerprint) + fingerprints, requiresIntegrations = true ) { init { // Manually register all options of the resource patch so that they are visible in the patch API. - abstractGmsCoreSupportResourcePatch.options.values.forEach(options::register) + gmsCoreSupportResourcePatch.options.values.forEach(options::register) } internal abstract val gmsCoreVendor: String? @@ -84,6 +93,12 @@ abstract class AbstractGmsCoreSupportPatch( // Return these methods early to prevent the app from crashing. earlyReturnFingerprints.toList().returnEarly() + // Check the availability of GmsCore. + mainActivityOnCreateFingerprint.result?.mutableMethod?.addInstruction( + 1, // Hack to not disturb other patches (such as the integrations patch). + "invoke-static {}, Lapp/revanced/integrations/youtube/patches/GmsCoreSupport;->checkAvailability()V" + ) ?: throw mainActivityOnCreateFingerprint.exception + // Change the vendor of GmsCore in ReVanced Integrations. GmsCoreSupportFingerprint.result?.mutableClass?.methods ?.single { it.name == GET_GMS_CORE_VENDOR_METHOD_NAME } diff --git a/src/main/kotlin/app/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportResourcePatch.kt b/src/main/kotlin/app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportResourcePatch.kt similarity index 94% rename from src/main/kotlin/app/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportResourcePatch.kt rename to src/main/kotlin/app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportResourcePatch.kt index 72ced135..cfd80488 100644 --- a/src/main/kotlin/app/revanced/patches/shared/misc/gms/AbstractGmsCoreSupportResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportResourcePatch.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption import app.revanced.patches.all.misc.packagename.ChangePackageNamePatch -import app.revanced.util.mergeStrings +import app.revanced.patches.all.misc.resources.AddResourcesPatch import org.w3c.dom.Element import org.w3c.dom.Node @@ -18,12 +18,12 @@ import org.w3c.dom.Node * @param spoofedPackageSignature The signature of the package to spoof to. * @param dependencies Additional dependencies of this patch. */ -abstract class AbstractGmsCoreSupportResourcePatch( +abstract class BaseGmsCoreSupportResourcePatch( private val fromPackageName: String, private val toPackageName: String, private val spoofedPackageSignature: String, dependencies: Set = setOf() -) : ResourcePatch(dependencies = setOf(ChangePackageNamePatch::class) + dependencies) { +) : ResourcePatch(dependencies = setOf(ChangePackageNamePatch::class, AddResourcesPatch::class) + dependencies) { internal val gmsCoreVendorOption = stringPatchOption( key = "gmsCoreVendor", default = "com.mgoogle", @@ -39,7 +39,8 @@ abstract class AbstractGmsCoreSupportResourcePatch( protected val gmsCoreVendor by gmsCoreVendorOption override fun execute(context: ResourceContext) { - context.mergeStrings("gms/host/values/strings.xml") + AddResourcesPatch(BaseGmsCoreSupportResourcePatch::class) + context.patchManifest() context.addSpoofingMetadata() } diff --git a/src/main/kotlin/app/revanced/patches/shared/misc/gms/fingerprints/GmsCoreSupportFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/misc/gms/fingerprints/GmsCoreSupportFingerprint.kt index 5ecfa53c..79be107f 100644 --- a/src/main/kotlin/app/revanced/patches/shared/misc/gms/fingerprints/GmsCoreSupportFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/misc/gms/fingerprints/GmsCoreSupportFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.shared.misc.gms.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object GmsCoreSupportFingerprint : MethodFingerprint( +internal object GmsCoreSupportFingerprint : MethodFingerprint( customFingerprint = { _, classDef -> classDef.type.endsWith("GmsCoreSupport;") } diff --git a/src/main/kotlin/app/revanced/patches/shared/integrations/AbstractIntegrationsPatch.kt b/src/main/kotlin/app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch.kt similarity index 84% rename from src/main/kotlin/app/revanced/patches/shared/integrations/AbstractIntegrationsPatch.kt rename to src/main/kotlin/app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch.kt index 9b75a18a..9cf84495 100644 --- a/src/main/kotlin/app/revanced/patches/shared/integrations/AbstractIntegrationsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch.kt @@ -1,16 +1,16 @@ -package app.revanced.patches.shared.integrations +package app.revanced.patches.shared.misc.integrations import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException -import app.revanced.patches.shared.integrations.AbstractIntegrationsPatch.IntegrationsFingerprint.RegisterResolver +import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint.IRegisterResolver import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.ClassDef import com.android.tools.smali.dexlib2.iface.Method -abstract class AbstractIntegrationsPatch( +abstract class BaseIntegrationsPatch( private val hooks: Set ) : BytecodePatch(hooks) { @@ -29,13 +29,15 @@ abstract class AbstractIntegrationsPatch( "Integrations have not been merged yet. This patch can not succeed without merging the integrations." ) - for (hook in hooks) hook.invoke(INTEGRATIONS_CLASS_DESCRIPTOR) + hooks.forEach { hook -> + hook.invoke(INTEGRATIONS_CLASS_DESCRIPTOR) + } } /** * [MethodFingerprint] for integrations. * - * @param contextRegisterResolver A [RegisterResolver] to get the register. + * @param contextRegisterResolver A [IRegisterResolver] to get the register. * @see MethodFingerprint */ abstract class IntegrationsFingerprint( @@ -45,7 +47,7 @@ abstract class AbstractIntegrationsPatch( opcodes: Iterable? = null, strings: Iterable? = null, customFingerprint: ((methodDef: Method, classDef: ClassDef) -> Boolean)? = null, - private val contextRegisterResolver: (Method) -> Int = object : RegisterResolver {} + private val contextRegisterResolver: (Method) -> Int = object : IRegisterResolver {} ) : MethodFingerprint( returnType, accessFlags, @@ -66,7 +68,7 @@ abstract class AbstractIntegrationsPatch( } ?: throw PatchException("Could not find hook target fingerprint.") } - interface RegisterResolver : (Method) -> Int { + interface IRegisterResolver : (Method) -> Int { override operator fun invoke(method: Method) = method.implementation!!.registerCount - 1 } } diff --git a/src/main/kotlin/app/revanced/patches/shared/mapping/misc/ResourceMappingPatch.kt b/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt similarity index 98% rename from src/main/kotlin/app/revanced/patches/shared/mapping/misc/ResourceMappingPatch.kt rename to src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index c80a6b0c..c3b1ef20 100644 --- a/src/main/kotlin/app/revanced/patches/shared/mapping/misc/ResourceMappingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.shared.mapping.misc +package app.revanced.patches.shared.misc.mapping import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch diff --git a/src/main/kotlin/app/revanced/patches/shared/misc/settings/BaseSettingsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/shared/misc/settings/BaseSettingsResourcePatch.kt new file mode 100644 index 00000000..d54601da --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/shared/misc/settings/BaseSettingsResourcePatch.kt @@ -0,0 +1,63 @@ +package app.revanced.patches.shared.misc.settings + +import app.revanced.patcher.PatchClass +import app.revanced.patcher.data.ResourceContext +import app.revanced.patcher.patch.ResourcePatch +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.BasePreference +import app.revanced.patches.shared.misc.settings.preference.IntentPreference +import app.revanced.util.ResourceGroup +import app.revanced.util.copyResources +import app.revanced.util.getNode +import org.w3c.dom.Node +import java.io.Closeable + +/** + * A resource patch that adds settings to a settings fragment. + * + * @param rootPreference A pair of an intent preference and the name of the fragment file to add it to. + * If null, no preference will be added. + * @param dependencies Additional dependencies of this patch. + */ +abstract class BaseSettingsResourcePatch( + private val rootPreference: Pair? = null, + dependencies: Set = emptySet() +) : ResourcePatch( + dependencies = setOf(AddResourcesPatch::class) + dependencies +), MutableSet by mutableSetOf(), Closeable { + private lateinit var context: ResourceContext + + override fun execute(context: ResourceContext) { + context.copyResources( + "settings", + ResourceGroup("xml", "revanced_prefs.xml") + ) + + this.context = context + + AddResourcesPatch(BaseSettingsResourcePatch::class) + } + + override fun close() { + fun Node.addPreference(preference: BasePreference) { + preference.serialize(ownerDocument) { resource -> + // TODO: Currently, resources can only be added to "values", which may not be the correct place. + // It may be necessary to ask for the desired resourceValue in the future. + AddResourcesPatch("values", resource) + }.let(this::appendChild) + } + + // Add the root preference to an existing fragment if needed. + rootPreference?.let { (intentPreference, fragment) -> + context.xmlEditor["res/xml/$fragment.xml"].use { + it.getNode("PreferenceScreen").addPreference(intentPreference) + } + } + + // Add all preferences to the ReVanced fragment. + context.xmlEditor["res/xml/revanced_prefs.xml"].use { editor -> + val revancedPreferenceScreenNode = editor.getNode("PreferenceScreen") + forEach { revancedPreferenceScreenNode.addPreference(it) } + } + } +} diff --git a/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreference.kt b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreference.kt new file mode 100644 index 00000000..bad3d49b --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreference.kt @@ -0,0 +1,62 @@ +package app.revanced.patches.shared.misc.settings.preference + +import app.revanced.util.resource.BaseResource +import org.w3c.dom.Document +import org.w3c.dom.Element + +/** + * Base preference class for all preferences. + * + * @param key The key of the preference. If null, other parameters must be specified. + * @param titleKey The key of the preference title. + * @param summaryKey The key of the preference summary. + * @param tag The tag or full class name of the preference. + */ +@Suppress("MemberVisibilityCanBePrivate") +abstract class BasePreference( + val key: String? = null, + val titleKey: String = "${key}_title", + val summaryKey: String? = "${key}_summary", + val tag: String +) { + /** + * Serialize preference element to XML. + * Overriding methods should invoke super and operate on its return value. + * + * @param resourceCallback A callback for additional resources. + * @param ownerDocument Target document to create elements from. + * + * @return The serialized element. + */ + open fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit): Element = + ownerDocument.createElement(tag).apply { + setAttribute("android:key", key) + setAttribute("android:title", "@string/${titleKey}") + summaryKey?.let { addSummary(it) } + } + + override fun hashCode(): Int { + var result = key?.hashCode() ?: 0 + result = 31 * result + titleKey.hashCode() + result = 31 * result + tag.hashCode() + return result + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as BasePreference + + if (key != other.key) return false + if (titleKey != other.titleKey) return false + if (tag != other.tag) return false + + return true + } + + companion object { + fun Element.addSummary(summaryKey: String, summaryType: SummaryType = SummaryType.DEFAULT) = + setAttribute("android:${summaryType.type}", "@string/$summaryKey") + } +} diff --git a/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen.kt b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen.kt new file mode 100644 index 00000000..29bf976a --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen.kt @@ -0,0 +1,93 @@ +package app.revanced.patches.shared.misc.settings.preference + +import java.io.Closeable + +abstract class BasePreferenceScreen( + private val root: MutableSet = mutableSetOf() +) : Closeable { + + override fun close() { + if (root.isEmpty()) return + + root.forEach { preference -> + commit(preference.transform()) + } + } + + /** + * Finalize and insert root preference into resource patch + */ + abstract fun commit(screen: PreferenceScreen) + + open inner class Screen( + key: String? = null, + titleKey: String = "${key}_title", + private val summaryKey: String? = "${key}_summary", + preferences: MutableSet = mutableSetOf(), + val categories: MutableSet = mutableSetOf() + ) : BasePreferenceCollection(key, titleKey, preferences) { + + /** + * Initialize using title and summary keys with suffix "_title" and "_summary". + */ + constructor( + key: String? = null, + preferences: MutableSet = mutableSetOf(), + categories: MutableSet = mutableSetOf() + ) : this(key, key + "_title", key + "_summary", preferences, categories) + + override fun transform(): PreferenceScreen { + return PreferenceScreen( + key, + titleKey, + summaryKey, + // Screens and preferences are sorted at runtime by integrations code, + // so they appear in alphabetical order for the localized language in use. + preferences = preferences + categories.map { it.transform() } + ) + } + + private fun ensureScreenInserted() { + // Add to screens if not yet done + if (!root.contains(this)) + root.add(this) + } + + fun addPreferences(vararg preferences: BasePreference) { + ensureScreenInserted() + this.preferences.addAll(preferences) + } + + open inner class Category( + key: String? = null, + titleKey: String = "${key}_title", + preferences: MutableSet = mutableSetOf() + ) : BasePreferenceCollection(key, titleKey, preferences) { + override fun transform(): PreferenceCategory { + return PreferenceCategory( + key, + titleKey, + preferences = preferences + ) + } + + fun addPreferences(vararg preferences: BasePreference) { + ensureScreenInserted() + + // Add to the categories if not done yet. + if (!categories.contains(this)) + categories.add(this) + + this.preferences.addAll(preferences) + } + } + } + + abstract class BasePreferenceCollection( + val key: String? = null, + val titleKey: String = "${key}_title", + val preferences: MutableSet = mutableSetOf() + ) { + abstract fun transform(): BasePreference + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/InputType.kt b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/InputType.kt similarity index 73% rename from src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/InputType.kt rename to src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/InputType.kt index 7d3ec982..e5142d92 100644 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/InputType.kt +++ b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/InputType.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.shared.settings.preference.impl +package app.revanced.patches.shared.misc.settings.preference enum class InputType(val type: String) { TEXT("text"), diff --git a/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/IntentPreference.kt b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/IntentPreference.kt new file mode 100644 index 00000000..3c933a72 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/IntentPreference.kt @@ -0,0 +1,56 @@ +package app.revanced.patches.shared.misc.settings.preference + +import app.revanced.patches.shared.misc.settings.preference.IntentPreference.Intent +import app.revanced.util.resource.BaseResource +import org.w3c.dom.Document + +/** + * A preference that opens an intent. + * + * @param key The preference key. If null, other parameters must be specified. + * @param titleKey The preference title key. + * @param summaryKey The preference summary key. + * @param tag The preference tag. + * @param intent The intent to open. + * + * @see Intent + */ +class IntentPreference( + key: String? = null, + titleKey: String = "${key}_title", + summaryKey: String? = "${key}_summary", + tag: String = "Preference", + val intent: Intent, +) : BasePreference(null, titleKey, summaryKey, tag) { + + override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = + super.serialize(ownerDocument, resourceCallback).apply { + appendChild(ownerDocument.createElement("intent").also { intentNode -> + intentNode.setAttribute("android:data", intent.data) + intentNode.setAttribute("android:targetClass", intent.targetClass) + intentNode.setAttribute("android:targetPackage", intent.targetPackageSupplier()) + }) + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + if (!super.equals(other)) return false + + other as IntentPreference + + return intent == other.intent + } + + override fun hashCode(): Int { + var result = super.hashCode() + result = 31 * result + intent.hashCode() + return result + } + + data class Intent( + internal val data: String, + internal val targetClass: String, + internal val targetPackageSupplier: () -> String, + ) +} diff --git a/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/ListPreference.kt b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/ListPreference.kt new file mode 100644 index 00000000..e0338d29 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/ListPreference.kt @@ -0,0 +1,72 @@ +package app.revanced.patches.shared.misc.settings.preference + +import app.revanced.util.resource.ArrayResource +import app.revanced.util.resource.BaseResource +import org.w3c.dom.Document + +/** + * List preference. + * + * @param key The preference key. If null, other parameters must be specified. + * @param titleKey The preference title key. + * @param summaryKey The preference summary key. + * @param tag The preference tag. + * @param entriesKey The entries array key. + * @param entryValuesKey The entry values array key. + */ +@Suppress("MemberVisibilityCanBePrivate") +class ListPreference( + key: String? = null, + titleKey: String = "${key}_title", + summaryKey: String? = "${key}_summary", + tag: String = "ListPreference", + val entriesKey: String? = "${key}_entries", + val entryValuesKey: String? = "${key}_entry_values" +) : BasePreference(key, titleKey, summaryKey, tag) { + var entries: ArrayResource? = null + private set + var entryValues: ArrayResource? = null + private set + + /** + * List preference. + * + * @param key The preference key. If null, other parameters must be specified. + * @param titleKey The preference title key. + * @param summaryKey The preference summary key. + * @param tag The preference tag. + * @param entries The entries array. + * @param entryValues The entry values array. + */ + constructor( + key: String? = null, + titleKey: String = "${key}_title", + summaryKey: String? = "${key}_summary", + tag: String = "ListPreference", + entries: ArrayResource, + entryValues: ArrayResource + ) : this(key, titleKey, summaryKey, tag, entries.name, entryValues.name) { + this.entries = entries + this.entryValues = entryValues + } + + override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = + super.serialize(ownerDocument, resourceCallback).apply { + val entriesArrayName = entries?.also { resourceCallback.invoke(it) }?.name ?: entriesKey + val entryValuesArrayName = entryValues?.also { resourceCallback.invoke(it) }?.name ?: entryValuesKey + + entriesArrayName?.let { + setAttribute( + "android:entries", + "@array/$it" + ) + } + + entryValuesArrayName?.let { + setAttribute( + "android:entryValues", + "@array/$it" + ) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference.kt b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference.kt new file mode 100644 index 00000000..b4b9155a --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference.kt @@ -0,0 +1,26 @@ +package app.revanced.patches.shared.misc.settings.preference + +import app.revanced.util.resource.BaseResource +import org.w3c.dom.Document + +/** + * A non-interactive preference. + * + * @param key The preference key. + * @param summaryKey The preference summary key. + * @param tag The preference tag. + * @param selectable Whether the preference is selectable. + */ +@Suppress("MemberVisibilityCanBePrivate") +class NonInteractivePreference( + key: String, + summaryKey: String? = "${key}_summary", + tag: String = "Preference", + val selectable: Boolean = false +) : BasePreference(null, "${key}_title", summaryKey, tag) { + + override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = + super.serialize(ownerDocument, resourceCallback).apply { + setAttribute("android:selectable", selectable.toString()) + } +} diff --git a/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceCategory.kt b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceCategory.kt new file mode 100644 index 00000000..67e82208 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceCategory.kt @@ -0,0 +1,28 @@ +package app.revanced.patches.shared.misc.settings.preference + +import app.revanced.util.resource.BaseResource +import org.w3c.dom.Document + +/** + * A preference category. + * + * @param key The key of the preference. If null, other parameters must be specified. + * @param titleKey The key of the preference title. + * @param tag The tag or full class name of the preference. + * @param preferences The preferences in this category. + */ +@Suppress("MemberVisibilityCanBePrivate") +open class PreferenceCategory( + key: String? = null, + titleKey: String = "${key}_title", + tag: String = "PreferenceCategory", + val preferences: Set +) : BasePreference(key, titleKey, null, tag) { + + override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = + super.serialize(ownerDocument, resourceCallback).apply { + preferences.forEach { + appendChild(it.serialize(ownerDocument, resourceCallback)) + } + } +} diff --git a/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceScreen.kt b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceScreen.kt new file mode 100644 index 00000000..f03dd23a --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceScreen.kt @@ -0,0 +1,30 @@ +package app.revanced.patches.shared.misc.settings.preference + +import app.revanced.util.resource.BaseResource +import org.w3c.dom.Document + +/** + * A preference screen. + * + * @param key The key of the preference. If null, other parameters must be specified. + * @param titleKey The key of the preference title. + * @param summaryKey The key of the preference summary. + * @param tag The tag or full class name of the preference. + * @param preferences The preferences in this screen. + */ +@Suppress("MemberVisibilityCanBePrivate") +open class PreferenceScreen( + key: String? = null, + titleKey: String = "${key}_title", + summaryKey: String? = "${key}_summary", + tag: String = "PreferenceScreen", + val preferences: Set +) : BasePreference(key, titleKey, summaryKey, tag) { + + override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = + super.serialize(ownerDocument, resourceCallback).apply { + preferences.forEach { + appendChild(it.serialize(ownerDocument, resourceCallback)) + } + } +} diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/SummaryType.kt b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/SummaryType.kt similarity index 63% rename from src/main/kotlin/app/revanced/patches/shared/settings/preference/SummaryType.kt rename to src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/SummaryType.kt index 006f6986..ccf547b2 100644 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/SummaryType.kt +++ b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/SummaryType.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.shared.settings.preference +package app.revanced.patches.shared.misc.settings.preference enum class SummaryType(val type: String) { DEFAULT("summary"), ON("summaryOn"), OFF("summaryOff") diff --git a/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/SwitchPreference.kt b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/SwitchPreference.kt new file mode 100644 index 00000000..e09d813a --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/SwitchPreference.kt @@ -0,0 +1,28 @@ +package app.revanced.patches.shared.misc.settings.preference + +import app.revanced.util.resource.BaseResource +import org.w3c.dom.Document + +/** + * A switch preference. + * + * @param key The preference key. If null, other parameters must be specified. + * @param titleKey The preference title key. + * @param tag The preference tag. + * @param summaryOnKey The preference summary-on key. + * @param summaryOffKey The preference summary-off key. + */ +@Suppress("MemberVisibilityCanBePrivate") +class SwitchPreference( + key: String? = null, + titleKey: String = "${key}_title", + tag: String = "SwitchPreference", + val summaryOnKey: String = "${key}_summary_on", + val summaryOffKey: String = "${key}_summary_off" +) : BasePreference(key, titleKey, null, tag) { + override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = + super.serialize(ownerDocument, resourceCallback).apply { + addSummary(summaryOnKey, SummaryType.ON) + addSummary(summaryOffKey, SummaryType.OFF) + } +} diff --git a/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/TextPreference.kt b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/TextPreference.kt new file mode 100644 index 00000000..d329a917 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/TextPreference.kt @@ -0,0 +1,28 @@ +package app.revanced.patches.shared.misc.settings.preference + +import app.revanced.util.resource.BaseResource +import org.w3c.dom.Document + +/** + * A text preference. + * + * @param key The preference key. If null, other parameters must be specified. + * @param titleKey The preference title key. + * @param summaryKey The preference summary key. + * @param tag The preference tag. + * @param inputType The preference input type. + */ +@Suppress("MemberVisibilityCanBePrivate") +class TextPreference( + key: String? = null, + titleKey: String = "${key}_title", + summaryKey: String? = "${key}_summary", + tag: String = "app.revanced.integrations.shared.settings.preference.ResettableEditTextPreference", + val inputType: InputType = InputType.TEXT +) : BasePreference(key, titleKey, summaryKey, tag) { + + override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = + super.serialize(ownerDocument, resourceCallback).apply { + setAttribute("android:inputType", inputType.type) + } +} diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/AbstractSettingsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/shared/settings/AbstractSettingsResourcePatch.kt deleted file mode 100644 index c5fb9a23..00000000 --- a/src/main/kotlin/app/revanced/patches/shared/settings/AbstractSettingsResourcePatch.kt +++ /dev/null @@ -1,124 +0,0 @@ -package app.revanced.patches.shared.settings - -import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.util.DomFileEditor -import app.revanced.patches.shared.settings.preference.BasePreference -import app.revanced.patches.shared.settings.preference.BaseResource -import app.revanced.patches.shared.settings.preference.addPreference -import app.revanced.patches.shared.settings.preference.addResource -import app.revanced.patches.shared.settings.preference.impl.ArrayResource -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.util.ResourceGroup -import app.revanced.util.copyResources -import app.revanced.util.mergeStrings -import org.w3c.dom.Node -import java.io.Closeable - -/** - * Abstract settings resource patch - * - * @param preferenceFileName Name of the settings preference xml file - * @param sourceDirectory Source directory to copy the preference template from - */ -abstract class AbstractSettingsResourcePatch( - private val preferenceFileName: String, - private val sourceDirectory: String, -) : ResourcePatch(), Closeable { - override fun execute(context: ResourceContext) { - /* copy preference template from source dir */ - context.copyResources( - sourceDirectory, - ResourceGroup( - "xml", "$preferenceFileName.xml" - ) - ) - - /* prepare xml editors */ - stringsEditor = context.xmlEditor["res/values/strings.xml"] - arraysEditor = context.xmlEditor["res/values/arrays.xml"] - revancedPreferencesEditor = context.xmlEditor["res/xml/$preferenceFileName.xml"] - - context.mergeStrings("settings/host/values/strings.xml") - } - - internal companion object { - private var revancedPreferenceNode: Node? = null - private var stringsNode: Node? = null - private var arraysNode: Node? = null - - private var strings = mutableListOf() - - private var revancedPreferencesEditor: DomFileEditor? = null - set(value) { - field = value - revancedPreferenceNode = value.getNode("PreferenceScreen") - } - private var stringsEditor: DomFileEditor? = null - set(value) { - field = value - stringsNode = value.getNode("resources") - } - private var arraysEditor: DomFileEditor? = null - set(value) { - field = value - arraysNode = value.getNode("resources") - } - - /** - * Add a new string to the resources. - * - * @param identifier The key of the string. - * @param value The value of the string. - * @throws IllegalArgumentException if the string already exists. - */ - fun addString(identifier: String, value: String, formatted: Boolean) = - StringResource(identifier, value, formatted).include() - - /** - * Add an array to the resources. - * - * @param arrayResource The array resource to add. - */ - fun addArray(arrayResource: ArrayResource) = - arraysNode!!.addResource(arrayResource) { it.include() } - - /** - * Add a preference to the settings. - * - * @param preference The preference to add. - */ - fun addPreference(preference: BasePreference) = - revancedPreferenceNode!!.addPreference(preference) { it.include() } - - /** - * Add a new resource to the resources. - * - * @throws IllegalArgumentException if the resource already exists. - */ - internal fun BaseResource.include() { - when (this) { - is StringResource -> { - if (strings.any { it.name == name }) return - strings.add(this) - } - - is ArrayResource -> addArray(this) - else -> throw NotImplementedError("Unsupported resource type") - } - } - - internal fun DomFileEditor?.getNode(tagName: String) = this!!.file.getElementsByTagName(tagName).item(0) - } - - override fun close() { - // merge all strings, skip duplicates - strings.forEach { - stringsNode!!.addResource(it) - } - - revancedPreferencesEditor?.close() - stringsEditor?.close() - arraysEditor?.close() - } -} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/BasePreference.kt b/src/main/kotlin/app/revanced/patches/shared/settings/preference/BasePreference.kt deleted file mode 100644 index a150aa6f..00000000 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/BasePreference.kt +++ /dev/null @@ -1,34 +0,0 @@ -package app.revanced.patches.shared.settings.preference - -import app.revanced.patches.shared.settings.preference.impl.StringResource -import org.w3c.dom.Document -import org.w3c.dom.Element - -/** - * Base preference class for all preferences. - * - * @param key The key of the preference. - * @param title The title of the preference. - * @param tag The full class name for the preference. - * @param summary The summary of the preference. - */ -abstract class BasePreference( - val key: String?, - val title: StringResource, - val summary: StringResource? = null, - val tag: String -) { - /** - * Serialize preference element to XML. - * Overriding methods should invoke super and operate on its return value. - * @param ownerDocument Target document to create elements from. - * @param resourceCallback Called when a resource has been processed. - * @return The serialized element. - */ - open fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit): Element = - ownerDocument.createElement(tag).apply { - if (key != null) setAttribute("android:key", key) - setAttribute("android:title", "@string/${title.also { resourceCallback.invoke(it) }.name}") - addSummary(summary?.also { resourceCallback.invoke(it) }) - } -} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/ComponentsExtensions.kt b/src/main/kotlin/app/revanced/patches/shared/settings/preference/ComponentsExtensions.kt deleted file mode 100644 index 7e13127f..00000000 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/ComponentsExtensions.kt +++ /dev/null @@ -1,48 +0,0 @@ -package app.revanced.patches.shared.settings.preference - -import app.revanced.patches.shared.settings.preference.impl.StringResource -import org.w3c.dom.Element -import org.w3c.dom.Node - -/** - * Add a resource node child - * - * @param resource The resource to add. - * @param resourceCallback Called when a resource has been processed. - */ -internal fun Node.addResource(resource: BaseResource, resourceCallback: (BaseResource) -> Unit = { }) { - appendChild(resource.serialize(ownerDocument, resourceCallback)) -} - -/** - * Add a preference node child to the settings. - * - * @param preference The preference to add. - * @param resourceCallback Called when a resource has been processed. - */ -internal fun Node.addPreference(preference: BasePreference, resourceCallback: ((BaseResource) -> Unit) = { }) { - appendChild(preference.serialize(ownerDocument, resourceCallback)) -} - -internal fun Element.addSummary(summaryResource: StringResource?, summaryType: SummaryType = SummaryType.DEFAULT) = - summaryResource?.let { summary -> - setAttribute("android:${summaryType.type}", "@string/${summary.name}") - } - -internal fun Element.addDefault(default: T) { - if (default is Boolean && !(default as Boolean)) return // No need to include the default, as no value already means 'false' - default?.let { - setAttribute( - "android:defaultValue", when (it) { - is Boolean -> it.toString() - is String -> it - else -> throw IllegalArgumentException("Unsupported default value type: ${it::class.java.name}") - } - ) - } -} - -internal fun CharSequence.removePunctuation(): String { - val punctuation = "\\p{P}+".toRegex() - return this.replace(punctuation, "") -} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/ArrayResource.kt b/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/ArrayResource.kt deleted file mode 100644 index fa5e12f3..00000000 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/ArrayResource.kt +++ /dev/null @@ -1,29 +0,0 @@ -package app.revanced.patches.shared.settings.preference.impl - -import app.revanced.patches.shared.settings.preference.BaseResource -import org.w3c.dom.Document - -// TODO: allow specifying an array resource file instead of using a list of StringResources -/** - * An array resource. - * - * @param name The name of the array resource. - * @param items The items of the array resource. - */ -class ArrayResource( - name: String, - val items: List -) : BaseResource(name, "string-array") { - override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = - super.serialize(ownerDocument, resourceCallback).apply { - setAttribute("name", name) - - items.forEach { item -> - resourceCallback.invoke(item) - - this.appendChild(ownerDocument.createElement("item").also { itemNode -> - itemNode.textContent = "@string/${item.name}" - }) - } - } -} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/ListPreference.kt b/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/ListPreference.kt deleted file mode 100644 index 7d849d72..00000000 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/ListPreference.kt +++ /dev/null @@ -1,30 +0,0 @@ -package app.revanced.patches.shared.settings.preference.impl - -import app.revanced.patches.shared.settings.preference.BasePreference -import app.revanced.patches.shared.settings.preference.BaseResource -import app.revanced.patches.shared.settings.preference.addSummary -import org.w3c.dom.Document - -/** - * List preference. - * - * @param key The key of the list preference. - * @param title The title of the list preference. - * @param entries The human-readable entries of the list preference. - * @param entryValues The entry values of the list preference. - * @param summary The summary of the list preference. - */ -class ListPreference( - key: String, - title: StringResource, - private val entries: ArrayResource, - private val entryValues: ArrayResource, - summary: StringResource? = null -) : BasePreference(key, title, summary, "ListPreference") { - override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = - super.serialize(ownerDocument, resourceCallback).apply { - setAttribute("android:entries", "@array/${entries.also { resourceCallback.invoke(it) }.name}") - setAttribute("android:entryValues", "@array/${entryValues.also { resourceCallback.invoke(it) }.name}") - addSummary(summary) - } -} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/NonInteractivePreference.kt b/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/NonInteractivePreference.kt deleted file mode 100644 index ef08bc3e..00000000 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/NonInteractivePreference.kt +++ /dev/null @@ -1,35 +0,0 @@ -package app.revanced.patches.shared.settings.preference.impl - -import app.revanced.patches.shared.settings.preference.BasePreference -import app.revanced.patches.shared.settings.preference.BaseResource -import app.revanced.patches.shared.settings.preference.addSummary -import org.w3c.dom.Document -import org.w3c.dom.Element - -/** - * A non interactive preference. - * - * Not backed by any preference key/value, - * and cannot be changed by or interacted with by the user. - * - * @param title The title of the preference. - * @param summary The summary of the text preference. - * @param selectable If this preference responds to tapping. - * Setting to 'true' restores the horizontal dividers on the top and bottom, - * but tapping will still do nothing since this Preference has no key. - */ -class NonInteractivePreference( - title: StringResource, - summary: StringResource?, - tag: String = "Preference", - // If androidx.preference is later used, this can be changed to the show top/bottom dividers feature. - val selectable: Boolean = false -) : BasePreference(null, title, summary, tag) { - override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit): Element { - return super.serialize(ownerDocument, resourceCallback).apply { - addSummary(summary?.also { resourceCallback.invoke(it) - setAttribute("android:selectable", selectable.toString()) - }) - } - } -} diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/Preference.kt b/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/Preference.kt deleted file mode 100644 index 463a1fce..00000000 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/Preference.kt +++ /dev/null @@ -1,41 +0,0 @@ -package app.revanced.patches.shared.settings.preference.impl - -import app.revanced.patches.shared.settings.preference.BasePreference -import app.revanced.patches.shared.settings.preference.BaseResource -import org.w3c.dom.Document - -/** - * A preference object. - * - * @param key The key of the preference. - * @param title The title of the preference. - * @param summary The summary of the text preference. - * @param intent The intent of the preference. - */ -class Preference( - key: String, - title: StringResource, - summary: StringResource, - val intent: Intent -) : BasePreference(key, title, summary, "Preference") { - constructor( - title: StringResource, - summary: StringResource, - intent: Intent - ) : this("", title, summary, intent) - - override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = - super.serialize(ownerDocument, resourceCallback).apply { - this.appendChild(ownerDocument.createElement("intent").also { intentNode -> - intentNode.setAttribute("android:targetPackage", intent.targetPackage) - intentNode.setAttribute("android:data", intent.data) - intentNode.setAttribute("android:targetClass", intent.targetClass) - }) - } - - class Intent( - internal val targetPackage: String, - internal val data: String, - internal val targetClass: String - ) -} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/PreferenceCategory.kt b/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/PreferenceCategory.kt deleted file mode 100644 index 633e8d78..00000000 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/PreferenceCategory.kt +++ /dev/null @@ -1,26 +0,0 @@ -package app.revanced.patches.shared.settings.preference.impl - -import app.revanced.patches.shared.settings.preference.BasePreference -import app.revanced.patches.shared.settings.preference.BaseResource -import org.w3c.dom.Document - -/** - * A preference category. - * - * @param key The key of the preference. - * @param title The title of the preference. - * @param preferences Child preferences of this category. - */ -open class PreferenceCategory( - key: String, - title: StringResource, - var preferences: List, - tag: String = "PreferenceCategory" -) : BasePreference(key, title, null, tag) { - override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = - super.serialize(ownerDocument, resourceCallback).apply { - for (childPreference in preferences) { - this.appendChild(childPreference.serialize(ownerDocument, resourceCallback)) - } - } -} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/PreferenceScreen.kt b/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/PreferenceScreen.kt deleted file mode 100644 index e0e435b2..00000000 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/PreferenceScreen.kt +++ /dev/null @@ -1,29 +0,0 @@ -package app.revanced.patches.shared.settings.preference.impl - -import app.revanced.patches.shared.settings.preference.BasePreference -import app.revanced.patches.shared.settings.preference.BaseResource -import app.revanced.patches.shared.settings.preference.addSummary -import org.w3c.dom.Document - -/** - * A preference screen. - * - * @param key The key of the preference. - * @param title The title of the preference. - * @param preferences Child preferences of this screen. - * @param summary The summary of the text preference. - */ -open class PreferenceScreen( - key: String, - title: StringResource, - var preferences: List, - summary: StringResource? = null -) : BasePreference(key, title, summary, "PreferenceScreen") { - override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = - super.serialize(ownerDocument, resourceCallback).apply { - addSummary(summary?.also { resourceCallback.invoke(it) }) - - for (childPreference in preferences) - this.appendChild(childPreference.serialize(ownerDocument, resourceCallback)) - } -} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/StringResource.kt b/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/StringResource.kt deleted file mode 100644 index b3cd8397..00000000 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/StringResource.kt +++ /dev/null @@ -1,27 +0,0 @@ -package app.revanced.patches.shared.settings.preference.impl - -import app.revanced.patches.shared.settings.preference.BaseResource -import org.w3c.dom.Document - -/** - * A string value. - * Represets a string in the strings.xml file. - * - * @param name The name of the string. - * @param value The value of the string. - * @param formatted If the string is formatted. If false, the attribute will be set. - */ -class StringResource( - name: String, - val value: String, - val formatted: Boolean = true -) : BaseResource(name, "string") { - - override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = - super.serialize(ownerDocument, resourceCallback).apply { - // if the string is un-formatted, explicitly add the formatted attribute - if (!formatted) setAttribute("formatted", "false") - - textContent = value - } -} diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/SwitchPreference.kt b/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/SwitchPreference.kt deleted file mode 100644 index b8e30c3e..00000000 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/SwitchPreference.kt +++ /dev/null @@ -1,34 +0,0 @@ -package app.revanced.patches.shared.settings.preference.impl - -import app.revanced.patches.shared.settings.AbstractSettingsResourcePatch.Companion.include -import app.revanced.patches.shared.settings.preference.BasePreference -import app.revanced.patches.shared.settings.preference.BaseResource -import app.revanced.patches.shared.settings.preference.SummaryType -import app.revanced.patches.shared.settings.preference.addSummary -import org.w3c.dom.Document -import org.w3c.dom.Element - -/** - * A switch preference. - * - * @param key The key of the switch. - * @param title The title of the switch. - * @param summaryOn The summary to show when the preference is enabled. - * @param summaryOff The summary to show when the preference is disabled. - * @param userDialogMessage The message to show in a dialog when the user toggles the preference. - */ -class SwitchPreference( - key: String, title: StringResource, - val summaryOn: StringResource, - val summaryOff: StringResource, - val userDialogMessage: StringResource? = null, -) : BasePreference(key, title, null, "SwitchPreference") { - override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit): Element { - userDialogMessage?.include() - - return super.serialize(ownerDocument, resourceCallback).apply { - addSummary(summaryOn.also { resourceCallback.invoke(it) }, SummaryType.ON) - addSummary(summaryOff.also { resourceCallback.invoke(it) }, SummaryType.OFF) - } - } -} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/TextPreference.kt b/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/TextPreference.kt deleted file mode 100644 index 1eea68db..00000000 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/impl/TextPreference.kt +++ /dev/null @@ -1,27 +0,0 @@ -package app.revanced.patches.shared.settings.preference.impl - -import app.revanced.patches.shared.settings.preference.BasePreference -import app.revanced.patches.shared.settings.preference.BaseResource -import org.w3c.dom.Document - -/** - * A text preference. - * - * @param key The key of the text preference. - * @param title The title of the text preference. - * @param inputType The input type of the text preference. - * @param summary The summary of the text preference. - */ -class TextPreference( - key: String?, - title: StringResource, - summary: StringResource?, - val inputType: InputType = InputType.TEXT, - tag: String = "app.revanced.integrations.shared.settings.preference.ResettableEditTextPreference" -) : BasePreference(key, title, summary, tag) { - - override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = - super.serialize(ownerDocument, resourceCallback).apply { - setAttribute("android:inputType", inputType.type) - } -} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/util/AbstractPreferenceScreen.kt b/src/main/kotlin/app/revanced/patches/shared/settings/util/AbstractPreferenceScreen.kt deleted file mode 100644 index c1148841..00000000 --- a/src/main/kotlin/app/revanced/patches/shared/settings/util/AbstractPreferenceScreen.kt +++ /dev/null @@ -1,98 +0,0 @@ -package app.revanced.patches.shared.settings.util - -import app.revanced.patches.shared.settings.preference.BasePreference -import app.revanced.patches.shared.settings.preference.impl.PreferenceCategory -import app.revanced.patches.shared.settings.preference.impl.PreferenceScreen -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.removePunctuation -import java.io.Closeable - -abstract class AbstractPreferenceScreen( - private val root: MutableList = mutableListOf() -) : Closeable { - - override fun close() { - if (root.isEmpty()) - return - - for (preference in root.sortedBy { it.title }) { - commit(preference.transform()) - } - } - - /** - * Finalize and insert root preference into resource patch - */ - abstract fun commit(screen: PreferenceScreen) - - open inner class Screen( - key: String, - title: String, - val summary: String? = null, - preferences: MutableList = mutableListOf(), - val categories: MutableList = mutableListOf() - ) : BasePreferenceCollection(key, title, preferences) { - override fun transform() = PreferenceScreen( - key, - StringResource( - "${key}_title", title - ), - preferences.sortedWith( - compareBy( - { it is PreferenceScreen }, - { it.title.value.removePunctuation().lowercase() } - ) - ) + categories.sortedBy { - it.title.removePunctuation().lowercase() - }.map { - it.transform() - }, - summary?.let { summary -> - StringResource("${key}_summary", summary) - } - ) - - private fun ensureScreenInserted() { - // Add to screens if not yet done - if (!this@AbstractPreferenceScreen.root.contains(this)) - this@AbstractPreferenceScreen.root.add(this) - } - - fun addPreferences(vararg preferences: BasePreference) { - ensureScreenInserted() - this.preferences.addAll(preferences) - } - - open inner class Category( - key: String, - title: String, - preferences: MutableList = mutableListOf() - ) : BasePreferenceCollection(key, title, preferences) { - override fun transform(): PreferenceCategory { - return PreferenceCategory( - key, - StringResource("${key}_title", title), - preferences.sortedBy { it.title.value.removePunctuation().lowercase() } - ) - } - - fun addPreferences(vararg preferences: BasePreference) { - ensureScreenInserted() - - // Add to categories if not yet done - if (!this@Screen.categories.contains(this)) - this@Screen.categories.add(this) - - this.preferences.addAll(preferences) - } - } - } - - abstract class BasePreferenceCollection( - val key: String, - val title: String, - val preferences: MutableList = mutableListOf() - ) { - abstract fun transform(): BasePreference - } -} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabResourcePatch.kt b/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabResourcePatch.kt index d1093325..5f2ac4b2 100644 --- a/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabResourcePatch.kt @@ -3,7 +3,7 @@ package app.revanced.patches.spotify.navbar import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch @Patch(dependencies = [ResourceMappingPatch::class]) object PremiumNavbarTabResourcePatch : ResourcePatch() { diff --git a/src/main/kotlin/app/revanced/patches/tiktok/misc/integrations/IntegrationsPatch.kt b/src/main/kotlin/app/revanced/patches/tiktok/misc/integrations/IntegrationsPatch.kt index 824e5df8..775a6747 100644 --- a/src/main/kotlin/app/revanced/patches/tiktok/misc/integrations/IntegrationsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/tiktok/misc/integrations/IntegrationsPatch.kt @@ -1,10 +1,10 @@ package app.revanced.patches.tiktok.misc.integrations import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.integrations.AbstractIntegrationsPatch +import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch import app.revanced.patches.tiktok.misc.integrations.fingerprints.InitFingerprint @Patch(requiresIntegrations = true) -object IntegrationsPatch : AbstractIntegrationsPatch( +object IntegrationsPatch : BaseIntegrationsPatch( setOf(InitFingerprint) ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/tiktok/misc/integrations/fingerprints/InitFingerprint.kt b/src/main/kotlin/app/revanced/patches/tiktok/misc/integrations/fingerprints/InitFingerprint.kt index 03b12c21..f61e36bc 100644 --- a/src/main/kotlin/app/revanced/patches/tiktok/misc/integrations/fingerprints/InitFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/tiktok/misc/integrations/fingerprints/InitFingerprint.kt @@ -1,6 +1,6 @@ package app.revanced.patches.tiktok.misc.integrations.fingerprints -import app.revanced.patches.shared.integrations.AbstractIntegrationsPatch.IntegrationsFingerprint +import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint internal object InitFingerprint : IntegrationsFingerprint( customFingerprint = { methodDef, _ -> diff --git a/src/main/kotlin/app/revanced/patches/twitch/ad/audio/AudioAdsPatch.kt b/src/main/kotlin/app/revanced/patches/twitch/ad/audio/AudioAdsPatch.kt index 44f0215a..75f9df43 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/ad/audio/AudioAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/ad/audio/AudioAdsPatch.kt @@ -7,8 +7,8 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.twitch.ad.audio.fingerprints.AudioAdsPresenterPlayFingerprint import app.revanced.patches.twitch.misc.integrations.IntegrationsPatch import app.revanced.patches.twitch.misc.settings.SettingsPatch @@ -16,7 +16,7 @@ import app.revanced.patches.twitch.misc.settings.SettingsPatch @Patch( name = "Block audio ads", description = "Blocks audio ads in streams and VODs.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [CompatiblePackage("tv.twitch.android.app", ["15.4.1", "16.1.0", "16.9.1"])], ) @Suppress("unused") @@ -24,6 +24,10 @@ object AudioAdsPatch : BytecodePatch( setOf(AudioAdsPresenterPlayFingerprint) ) { override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.ADS.CLIENT_SIDE.addPreferences(SwitchPreference("revanced_block_audio_ads")) + // Block playAds call with(AudioAdsPresenterPlayFingerprint.result!!) { mutableMethod.addInstructionsWithLabels( @@ -37,23 +41,5 @@ object AudioAdsPatch : BytecodePatch( ExternalLabel("show_audio_ads", mutableMethod.getInstruction(0)) ) } - - SettingsPatch.PreferenceScreen.ADS.CLIENT_SIDE.addPreferences( - SwitchPreference( - "revanced_block_audio_ads", - StringResource( - "revanced_block_audio_ads", - "Block audio ads" - ), - StringResource( - "revanced_block_audio_ads_on", - "Audio ads are blocked" - ), - StringResource( - "revanced_block_audio_ads_off", - "Audio ads are unblocked" - ) - ) - ) } } diff --git a/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch.kt b/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch.kt index c1ee8f1e..afc2e367 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch.kt @@ -1,23 +1,27 @@ package app.revanced.patches.twitch.ad.embedded -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.ArrayResource -import app.revanced.patches.shared.settings.preference.impl.ListPreference -import app.revanced.patches.shared.settings.preference.impl.StringResource +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.twitch.ad.embedded.fingerprints.CreateUsherClientFingerprint import app.revanced.patches.twitch.ad.video.VideoAdsPatch import app.revanced.patches.twitch.misc.integrations.IntegrationsPatch import app.revanced.patches.twitch.misc.settings.SettingsPatch +import app.revanced.util.exception @Patch( name = "Block embedded ads", description = "Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.", - dependencies = [VideoAdsPatch::class, IntegrationsPatch::class, SettingsPatch::class], + dependencies = [ + VideoAdsPatch::class, + IntegrationsPatch::class, + SettingsPatch::class, + AddResourcesPatch::class + ], compatiblePackages = [CompatiblePackage("tv.twitch.android.app", ["15.4.1", "16.1.0", "16.9.1"])] ) @Suppress("unused") @@ -25,6 +29,12 @@ object EmbeddedAdsPatch : BytecodePatch( setOf(CreateUsherClientFingerprint) ) { override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.ADS.SURESTREAM.addPreferences( + ListPreference("revanced_block_embedded_ads") + ) + val result = CreateUsherClientFingerprint.result ?: throw CreateUsherClientFingerprint.exception // Inject OkHttp3 application interceptor @@ -36,34 +46,5 @@ object EmbeddedAdsPatch : BytecodePatch( invoke-virtual {v0, v2}, Lokhttp3/OkHttpClient${"$"}Builder;->addInterceptor(Lokhttp3/Interceptor;)Lokhttp3/OkHttpClient${"$"}Builder; """ ) - - SettingsPatch.PreferenceScreen.ADS.SURESTREAM.addPreferences( - ListPreference( - "revanced_block_embedded_ads", - StringResource( - "revanced_block_embedded_ads", - "Block embedded video ads" - ), - ArrayResource( - "revanced_hls_proxies", - listOf( - StringResource("revanced_proxy_disabled", "Disabled"), - StringResource("revanced_proxy_luminous", "Luminous proxy"), - StringResource("revanced_proxy_purpleadblock", "PurpleAdBlock proxy"), - ) - ), - ArrayResource( - "revanced_hls_proxies_values", - listOf( - StringResource("key_revanced_proxy_disabled", "disabled"), - StringResource("key_revanced_proxy_luminous", "luminous"), - StringResource("key_revanced_proxy_purpleadblock", "purpleadblock") - ) - ) - ) - ) - - SettingsPatch.addString("revanced_embedded_ads_service_unavailable", "%s is unavailable. Ads may show. Try switching to another ad block service in settings.") - SettingsPatch.addString("revanced_embedded_ads_service_failed", "%s server returned an error. Ads may show. Try switching to another ad block service in settings.") } } diff --git a/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AbstractAdPatch.kt b/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/BaseAdPatch.kt similarity index 98% rename from src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AbstractAdPatch.kt rename to src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/BaseAdPatch.kt index 7f92651b..776b338f 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AbstractAdPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/BaseAdPatch.kt @@ -7,7 +7,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.util.smali.ExternalLabel -abstract class AbstractAdPatch( +abstract class BaseAdPatch( val conditionCall: String, val skipLabelName: String, internal val fingerprints: Set = emptySet(), diff --git a/src/main/kotlin/app/revanced/patches/twitch/ad/video/VideoAdsPatch.kt b/src/main/kotlin/app/revanced/patches/twitch/ad/video/VideoAdsPatch.kt index 562ad6a9..ab00fe79 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/ad/video/VideoAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/ad/video/VideoAdsPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.twitch.ad.video -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels @@ -8,22 +7,23 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference -import app.revanced.patches.twitch.ad.shared.util.AbstractAdPatch +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.twitch.ad.shared.util.BaseAdPatch import app.revanced.patches.twitch.ad.video.fingerprints.CheckAdEligibilityLambdaFingerprint import app.revanced.patches.twitch.ad.video.fingerprints.ContentConfigShowAdsFingerprint import app.revanced.patches.twitch.ad.video.fingerprints.GetReadyToShowAdFingerprint import app.revanced.patches.twitch.misc.integrations.IntegrationsPatch import app.revanced.patches.twitch.misc.settings.SettingsPatch +import app.revanced.util.exception @Patch( name = "Block video ads", description = "Blocks video ads in streams and VODs.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [CompatiblePackage("tv.twitch.android.app", ["15.4.1", "16.1.0", "16.9.1"])] ) -object VideoAdsPatch : AbstractAdPatch( +object VideoAdsPatch : BaseAdPatch( "Lapp/revanced/integrations/twitch/patches/VideoAdsPatch;->shouldBlockVideoAds()Z", "show_video_ads", setOf( @@ -33,6 +33,10 @@ object VideoAdsPatch : AbstractAdPatch( ) ) { override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.ADS.CLIENT_SIDE.addPreferences(SwitchPreference("revanced_block_video_ads")) + /* Amazon ads SDK */ context.blockMethods( "Lcom/amazon/ads/video/player/AdsManagerImpl;", @@ -120,23 +124,5 @@ object VideoAdsPatch : AbstractAdPatch( """ ) } ?: throw ContentConfigShowAdsFingerprint.exception - - SettingsPatch.PreferenceScreen.ADS.CLIENT_SIDE.addPreferences( - SwitchPreference( - "revanced_block_video_ads", - StringResource( - "revanced_block_video_ads", - "Block video ads" - ), - StringResource( - "revanced_block_video_ads_on", - "Video ads are blocked" - ), - StringResource( - "revanced_block_video_ads_off", - "Video ads are unblocked" - ) - ) - ) } } diff --git a/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatch.kt b/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatch.kt index 5e316a4c..7cf83924 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.twitch.chat.antidelete -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels @@ -9,19 +8,23 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.settings.preference.impl.ArrayResource -import app.revanced.patches.shared.settings.preference.impl.ListPreference -import app.revanced.patches.shared.settings.preference.impl.StringResource +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.twitch.chat.antidelete.fingerprints.ChatUtilCreateDeletedSpanFingerprint import app.revanced.patches.twitch.chat.antidelete.fingerprints.DeletedMessageClickableSpanCtorFingerprint import app.revanced.patches.twitch.chat.antidelete.fingerprints.SetHasModAccessFingerprint import app.revanced.patches.twitch.misc.integrations.IntegrationsPatch import app.revanced.patches.twitch.misc.settings.SettingsPatch +import app.revanced.util.exception @Patch( name = "Show deleted messages", description = "Shows deleted chat messages behind a clickable spoiler.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [ + IntegrationsPatch::class, + SettingsPatch::class, + AddResourcesPatch::class, + ], compatiblePackages = [CompatiblePackage("tv.twitch.android.app", ["15.4.1", "16.1.0", "16.9.1"])] ) @Suppress("unused") @@ -39,6 +42,15 @@ object ShowDeletedMessagesPatch : BytecodePatch( """ override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.CHAT.GENERAL.addPreferences( + ListPreference( + key = "revanced_show_deleted_messages", + summaryKey = null, + ) + ) + // Spoiler mode: Force set hasModAccess member to true in constructor DeletedMessageClickableSpanCtorFingerprint.result?.mutableMethod?.apply { addInstructionsWithLabels( @@ -68,34 +80,6 @@ object ShowDeletedMessagesPatch : BytecodePatch( """, ExternalLabel("no_reformat", getInstruction(0)) ) - } ?: throw ChatUtilCreateDeletedSpanFingerprint.exception - - SettingsPatch.PreferenceScreen.CHAT.GENERAL.addPreferences( - ListPreference( - "revanced_show_deleted_messages", - StringResource( - "revanced_show_deleted_messages_title", - "Show deleted messages" - ), - ArrayResource( - "revanced_deleted_messages", - listOf( - StringResource("revanced_deleted_messages_hide", "Do not show deleted messages"), - StringResource("revanced_deleted_messages_spoiler", "Hide deleted messages behind a spoiler"), - StringResource("revanced_deleted_messages_cross_out", "Show deleted messages as crossed-out text") - ) - ), - ArrayResource( - "revanced_deleted_messages_values", - listOf( - StringResource("key_revanced_deleted_messages_hide", "hide"), - StringResource("key_revanced_deleted_messages_spoiler", "spoiler"), - StringResource("key_revanced_deleted_messages_cross_out", "cross-out") - ) - ) - ) - ) - - SettingsPatch.addString("revanced_deleted_msg", "message deleted") + } ?: throw ChatUtilCreateDeletedSpanFingerprint.exception } } diff --git a/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt b/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt index 3883265e..740f8ced 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.twitch.chat.autoclaim -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction @@ -8,38 +7,27 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.twitch.chat.autoclaim.fingerprints.CommunityPointsButtonViewDelegateFingerprint import app.revanced.patches.twitch.misc.settings.SettingsPatch +import app.revanced.util.exception @Patch( name = "Auto claim channel points", description = "Automatically claim Channel Points.", - dependencies = [SettingsPatch::class], + dependencies = [SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [CompatiblePackage("tv.twitch.android.app", ["15.4.1", "16.1.0", "16.9.1"])] ) @Suppress("unused") -object AutoClaimChannelPointPatch : BytecodePatch( +object AutoClaimChannelPointsPatch : BytecodePatch( setOf(CommunityPointsButtonViewDelegateFingerprint) ) { override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.CHAT.GENERAL.addPreferences( - SwitchPreference( - "revanced_auto_claim_channel_points", - StringResource( - "revanced_auto_claim_channel_points", - "Automatically claim Channel Points" - ), - StringResource( - "revanced_auto_claim_channel_points_on", - "Channel Points are claimed automatically" - ), - StringResource( - "revanced_auto_claim_channel_points_off", - "Channel Points are not claimed automatically" - ) - ) + SwitchPreference("revanced_auto_claim_channel_points") ) CommunityPointsButtonViewDelegateFingerprint.result?.mutableMethod?.apply { diff --git a/src/main/kotlin/app/revanced/patches/twitch/debug/DebugModePatch.kt b/src/main/kotlin/app/revanced/patches/twitch/debug/DebugModePatch.kt index a81fc17f..644b614c 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/debug/DebugModePatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/debug/DebugModePatch.kt @@ -1,23 +1,23 @@ package app.revanced.patches.twitch.debug -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.twitch.debug.fingerprints.IsDebugConfigEnabledFingerprint import app.revanced.patches.twitch.debug.fingerprints.IsOmVerificationEnabledFingerprint import app.revanced.patches.twitch.debug.fingerprints.ShouldShowDebugOptionsFingerprint import app.revanced.patches.twitch.misc.integrations.IntegrationsPatch import app.revanced.patches.twitch.misc.settings.SettingsPatch +import app.revanced.util.exception @Patch( name = "Debug mode", description = "Enables Twitch's internal debugging mode.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [CompatiblePackage("tv.twitch.android.app")], use = false ) @@ -30,6 +30,10 @@ object DebugModePatch : BytecodePatch( ) ) { override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.MISC.OTHER.addPreferences(SwitchPreference("revanced_twitch_debug_mode")) + listOf( IsDebugConfigEnabledFingerprint, IsOmVerificationEnabledFingerprint, @@ -46,23 +50,5 @@ object DebugModePatch : BytecodePatch( ) } ?: throw it.exception } - - SettingsPatch.PreferenceScreen.MISC.OTHER.addPreferences( - SwitchPreference( - "revanced_twitch_debug_mode", - StringResource( - "revanced_twitch_debug_mode_title", - "Enable Twitch debug mode" - ), - StringResource( - "revanced_twitch_debug_mode_summary_on", - "Twitch debug mode is enabled (not recommended)" - ), - StringResource( - "revanced_twitch_debug_mode_summary_off", - "Twitch debug mode is disabled" - ) - ) - ) } } diff --git a/src/main/kotlin/app/revanced/patches/twitch/misc/integrations/IntegrationsPatch.kt b/src/main/kotlin/app/revanced/patches/twitch/misc/integrations/IntegrationsPatch.kt index 6e0dd245..0158adc6 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/misc/integrations/IntegrationsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/misc/integrations/IntegrationsPatch.kt @@ -1,10 +1,10 @@ package app.revanced.patches.twitch.misc.integrations import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.integrations.AbstractIntegrationsPatch +import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch import app.revanced.patches.twitch.misc.integrations.fingerprints.InitFingerprint @Patch(requiresIntegrations = true) -object IntegrationsPatch : AbstractIntegrationsPatch( +object IntegrationsPatch : BaseIntegrationsPatch( setOf(InitFingerprint) ) diff --git a/src/main/kotlin/app/revanced/patches/twitch/misc/integrations/fingerprints/InitFingerprint.kt b/src/main/kotlin/app/revanced/patches/twitch/misc/integrations/fingerprints/InitFingerprint.kt index 6ae7150d..10ca2039 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/misc/integrations/fingerprints/InitFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/misc/integrations/fingerprints/InitFingerprint.kt @@ -1,6 +1,6 @@ package app.revanced.patches.twitch.misc.integrations.fingerprints -import app.revanced.patches.shared.integrations.AbstractIntegrationsPatch.IntegrationsFingerprint +import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint internal object InitFingerprint : IntegrationsFingerprint( customFingerprint = { methodDef, _ -> diff --git a/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt b/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt index f1e59c6f..e8ec635c 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt @@ -11,10 +11,10 @@ import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.settings.preference.impl.PreferenceCategory -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference -import app.revanced.patches.shared.settings.util.AbstractPreferenceScreen +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen import app.revanced.patches.twitch.misc.integrations.IntegrationsPatch import app.revanced.patches.twitch.misc.settings.fingerprints.MenuGroupsOnClickFingerprint import app.revanced.patches.twitch.misc.settings.fingerprints.MenuGroupsUpdatedFingerprint @@ -29,7 +29,11 @@ import java.io.Closeable @Patch( name = "Settings", description = "Adds settings menu to Twitch.", - dependencies = [IntegrationsPatch::class, SettingsResourcePatch::class], + dependencies = [ + IntegrationsPatch::class, + SettingsResourcePatch::class, + AddResourcesPatch::class + ], compatiblePackages = [ CompatiblePackage("tv.twitch.android.app", ["15.4.1", "16.1.0", "16.9.1"]) ] @@ -48,13 +52,18 @@ object SettingsPatch : BytecodePatch( private const val REVANCED_SETTINGS_MENU_ITEM_ICON_RES = "ic_settings" private const val MENU_ITEM_ENUM_CLASS_DESCRIPTOR = "Ltv/twitch/android/feature/settings/menu/SettingsMenuItem;" - private const val MENU_DISMISS_EVENT_CLASS_DESCRIPTOR = "Ltv/twitch/android/feature/settings/menu/SettingsMenuViewDelegate\$Event\$OnDismissClicked;" + private const val MENU_DISMISS_EVENT_CLASS_DESCRIPTOR = + "Ltv/twitch/android/feature/settings/menu/SettingsMenuViewDelegate\$Event\$OnDismissClicked;" private const val INTEGRATIONS_PACKAGE = "app/revanced/integrations/twitch" private const val ACTIVITY_HOOKS_CLASS_DESCRIPTOR = "L$INTEGRATIONS_PACKAGE/settings/AppCompatActivityHook;" private const val UTILS_CLASS_DESCRIPTOR = "L$INTEGRATIONS_PACKAGE/Utils;" override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + + PreferenceScreen.MISC.OTHER.addPreferences(SwitchPreference("revanced_debug")) + // Hook onCreate to handle fragment creation SettingsActivityOnCreateFingerprint.result?.apply { val insertIndex = mutableMethod.implementation!!.instructions.size - 2 @@ -107,26 +116,9 @@ object SettingsPatch : BytecodePatch( """, ExternalLabel("no_rv_settings_onclick", mutableMethod.getInstruction(insertIndex)) ) - } ?: throw MenuGroupsOnClickFingerprint.exception - - addString("revanced_settings", "ReVanced Settings", false) - - PreferenceScreen.MISC.OTHER.addPreferences( - SwitchPreference( - "revanced_debug", - StringResource("revanced_debug_title", "Debug logging"), - StringResource("revanced_debug_summary_on", "Debug logs are enabled"), - StringResource("revanced_debug_summary_off", "Debug logs are disabled") - ), - ) + } ?: throw MenuGroupsOnClickFingerprint.exception } - fun addString(identifier: String, value: String, formatted: Boolean = true) = - SettingsResourcePatch.addString(identifier, value, formatted) - - fun addPreferenceScreen(preferenceScreen: app.revanced.patches.shared.settings.preference.impl.PreferenceScreen) = - SettingsResourcePatch.addPreferenceScreen(preferenceScreen) - private fun MethodFingerprintResult.injectMenuItem( name: String, value: Int, @@ -168,33 +160,32 @@ object SettingsPatch : BytecodePatch( /** * Preference screens patches should add their settings to. */ - internal object PreferenceScreen : AbstractPreferenceScreen() { - val ADS = CustomScreen("ads", "Ads", "Ad blocking settings") - val CHAT = CustomScreen("chat", "Chat", "Chat settings") - val MISC = CustomScreen("misc", "Misc", "Miscellaneous patches") + internal object PreferenceScreen : BasePreferenceScreen() { + val ADS = CustomScreen("revanced_ads_screen") + val CHAT = CustomScreen("revanced_chat_screen") + val MISC = CustomScreen("revanced_misc_screen") - internal class CustomScreen(key: String, title: String, summary: String) : Screen(key, title, summary) { + internal class CustomScreen(key: String) : Screen(key) { /* Categories */ - val GENERAL = CustomCategory("general", "General settings") - val OTHER = CustomCategory("other", "Other settings") - val CLIENT_SIDE = CustomCategory("client_ads", "Client-side ads") - val SURESTREAM = CustomCategory("surestream_ads", "Server-side surestream ads") + val GENERAL = CustomCategory("revanced_general_category") + val OTHER = CustomCategory("revanced_other_category") + val CLIENT_SIDE = CustomCategory("revanced_client_ads_category") + val SURESTREAM = CustomCategory("revanced_surestream_ads_category") - internal inner class CustomCategory(key: String, title: String) : Screen.Category(key, title) { + internal inner class CustomCategory(key: String) : Screen.Category(key) { /* For Twitch, we need to load our CustomPreferenceCategory class instead of the default one. */ override fun transform(): PreferenceCategory { return PreferenceCategory( key, - StringResource("${key}_title", title), - preferences.sortedBy { it.title.value }, - "app.revanced.integrations.twitch.settings.preference.CustomPreferenceCategory" + preferences = preferences, + tag = "app.revanced.integrations.twitch.settings.preference.CustomPreferenceCategory" ) } } } - override fun commit(screen: app.revanced.patches.shared.settings.preference.impl.PreferenceScreen) { - addPreferenceScreen(screen) + override fun commit(screen: app.revanced.patches.shared.misc.settings.preference.PreferenceScreen) { + SettingsResourcePatch += screen } } diff --git a/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsResourcePatch.kt index f6178461..f547f4b7 100644 --- a/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsResourcePatch.kt @@ -1,36 +1,5 @@ package app.revanced.patches.twitch.misc.settings -import app.revanced.patches.shared.settings.AbstractSettingsResourcePatch -import app.revanced.patches.shared.settings.preference.impl.ArrayResource -import app.revanced.patches.shared.settings.preference.impl.PreferenceScreen +import app.revanced.patches.shared.misc.settings.BaseSettingsResourcePatch -object SettingsResourcePatch : AbstractSettingsResourcePatch( -"revanced_prefs", -"twitch/settings" -) { - /* Companion delegates */ - - /** - * Add a new string to the resources. - * - * @param identifier The key of the string. - * @param value The value of the string. - * @throws IllegalArgumentException if the string already exists. - */ - fun addString(identifier: String, value: String, formatted: Boolean) = - AbstractSettingsResourcePatch.addString(identifier, value, formatted) - - /** - * Add an array to the resources. - * - * @param arrayResource The array resource to add. - */ - fun addArray(arrayResource: ArrayResource) = AbstractSettingsResourcePatch.addArray(arrayResource) - - /** - * Add a preference to the settings. - * - * @param preferenceScreen The name of the preference screen. - */ - fun addPreferenceScreen(preferenceScreen: PreferenceScreen) = AbstractSettingsResourcePatch.addPreference(preferenceScreen) -} \ No newline at end of file +object SettingsResourcePatch : BaseSettingsResourcePatch() \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/BaseHookPatchPatch.kt b/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/BaseHookPatch.kt similarity index 78% rename from src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/BaseHookPatchPatch.kt rename to src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/BaseHookPatch.kt index 39d5c296..74c83fb1 100644 --- a/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/BaseHookPatchPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/BaseHookPatch.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.patch.BytecodePatch import app.revanced.patches.twitter.misc.hook.json.JsonHookPatch -abstract class BaseHookPatchPatch(private val hookClassDescriptor: String) : BytecodePatch() { +abstract class BaseHookPatch(private val hookClassDescriptor: String) : BytecodePatch() { override fun execute(context: BytecodeContext) = JsonHookPatch.hooks.addHook(JsonHookPatch.Hook(context, hookClassDescriptor)) } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/ads/HideAdsPatch.kt b/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/ads/HideAdsHookPatch.kt similarity index 80% rename from src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/ads/HideAdsPatch.kt rename to src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/ads/HideAdsHookPatch.kt index 15a8f3b2..8b12b64c 100644 --- a/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/ads/HideAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/ads/HideAdsHookPatch.kt @@ -3,7 +3,7 @@ package app.revanced.patches.twitter.misc.hook.patch.ads import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.twitter.misc.hook.json.JsonHookPatch -import app.revanced.patches.twitter.misc.hook.patch.BaseHookPatchPatch +import app.revanced.patches.twitter.misc.hook.patch.BaseHookPatch @Patch( name = "Hide ads", @@ -12,4 +12,4 @@ import app.revanced.patches.twitter.misc.hook.patch.BaseHookPatchPatch compatiblePackages = [CompatiblePackage("com.twitter.android")] ) @Suppress("unused") -object HideAdsPatch : BaseHookPatchPatch("Lapp/revanced/integrations/twitter/patches/hook/patch/ads/AdsHook;") \ No newline at end of file +object HideAdsHookPatch : BaseHookPatch("Lapp/revanced/integrations/twitter/patches/hook/patch/ads/AdsHook;") \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/recommendation/HideRecommendedUsersPatch.kt b/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/recommendation/HideRecommendedUsersPatch.kt index 211e0f7c..1897ce0f 100644 --- a/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/recommendation/HideRecommendedUsersPatch.kt +++ b/src/main/kotlin/app/revanced/patches/twitter/misc/hook/patch/recommendation/HideRecommendedUsersPatch.kt @@ -3,7 +3,7 @@ package app.revanced.patches.twitter.misc.hook.patch.recommendation import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.twitter.misc.hook.json.JsonHookPatch -import app.revanced.patches.twitter.misc.hook.patch.BaseHookPatchPatch +import app.revanced.patches.twitter.misc.hook.patch.BaseHookPatch @Patch( name = "Hide recommended users", @@ -11,6 +11,6 @@ import app.revanced.patches.twitter.misc.hook.patch.BaseHookPatchPatch compatiblePackages = [CompatiblePackage("com.twitter.android")] ) @Suppress("unused") -object HideRecommendedUsersPatch : BaseHookPatchPatch( +object HideRecommendedUsersPatch : BaseHookPatch( "Lapp/revanced/integrations/twitter/patches/hook/patch/recommendation/RecommendedUsersHook;" ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsResourcePatch.kt index 94c53bc9..d7c3a359 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsResourcePatch.kt @@ -3,9 +3,9 @@ package app.revanced.patches.youtube.ad.general import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.litho.filter.LithoFilterPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch.PreferenceScreen @@ -14,7 +14,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch.PreferenceScreen dependencies = [ LithoFilterPatch::class, SettingsPatch::class, - ResourceMappingPatch::class + ResourceMappingPatch::class, + AddResourcesPatch::class ] ) object HideAdsResourcePatch : ResourcePatch() { @@ -24,61 +25,18 @@ object HideAdsResourcePatch : ResourcePatch() { internal var adAttributionId: Long = -1 override fun execute(context: ResourceContext) { + AddResourcesPatch(this::class) + PreferenceScreen.ADS.addPreferences( - SwitchPreference( - "revanced_hide_general_ads", - StringResource("revanced_hide_general_ads_title", "Hide general ads"), - StringResource("revanced_hide_general_ads_summary_on", "General ads are hidden"), - StringResource("revanced_hide_general_ads_summary_off", "General ads are shown") - ), - SwitchPreference( - "revanced_hide_fullscreen_ads", - StringResource("revanced_hide_fullscreen_ads_title", "Hide fullscreen ads"), - StringResource("revanced_hide_fullscreen_ads_summary_on", "Fullscreen ads are hidden"), - StringResource("revanced_hide_fullscreen_ads_summary_off", "Fullscreen ads are shown") - ), - SwitchPreference( - "revanced_hide_buttoned_ads", - StringResource("revanced_hide_buttoned_ads_title", "Hide buttoned ad"), - StringResource("revanced_hide_buttoned_ads_summary_on", "Buttoned ads are hidden"), - StringResource("revanced_hide_buttoned_ads_summary_off", "Buttoned ads are shown") - ), - SwitchPreference( - "revanced_hide_paid_content_ads", - StringResource("revanced_hide_paid_content_ads_title", "Hide paid content"), - StringResource("revanced_hide_paid_content_ads_summary_on", "Paid content is hidden"), - StringResource("revanced_hide_paid_content_ads_summary_off", "Paid content is shown") - ), - SwitchPreference( - "revanced_hide_self_sponsor_ads", - StringResource("revanced_hide_self_sponsor_ads_title", "Hide self sponsored cards"), - StringResource("revanced_hide_self_sponsor_ads_summary_on", "Self sponsored cards are hidden"), - StringResource("revanced_hide_self_sponsor_ads_summary_off", "Self sponsored cards are shown") - ), - SwitchPreference( - "revanced_hide_products_banner", - StringResource("revanced_hide_products_banner_title", "Hide banner to view products"), - StringResource("revanced_hide_products_banner_summary_on", "Banner is hidden"), - StringResource("revanced_hide_products_banner_summary_off", "Banner is shown") - ), - SwitchPreference( - "revanced_hide_shopping_links", - StringResource("revanced_hide_shopping_links_title", "Hide shopping links in video description"), - StringResource("revanced_hide_shopping_links_summary_on", "Shopping links are hidden"), - StringResource("revanced_hide_shopping_links_summary_off", "Shopping links are shown") - ), - SwitchPreference( - "revanced_hide_web_search_results", - StringResource("revanced_hide_web_search_results_title", "Hide web search results"), - StringResource("revanced_hide_web_search_results_summary_on", "Web search results are hidden"), - StringResource("revanced_hide_web_search_results_summary_off", "Web search results are shown") - ), - SwitchPreference( - "revanced_hide_merchandise_banners", - StringResource("revanced_hide_merchandise_banners_title", "Hide merchandise banners"), - StringResource("revanced_hide_merchandise_banners_summary_on", "Merchandise banners are hidden"), - StringResource("revanced_hide_merchandise_banners_summary_off", "Merchandise banners are shown") - ) + SwitchPreference("revanced_hide_general_ads"), + SwitchPreference("revanced_hide_fullscreen_ads"), + SwitchPreference("revanced_hide_buttoned_ads"), + SwitchPreference("revanced_hide_paid_content_ads"), + SwitchPreference("revanced_hide_self_sponsor_ads"), + SwitchPreference("revanced_hide_products_banner"), + SwitchPreference("revanced_hide_shopping_links"), + SwitchPreference("revanced_hide_web_search_results"), + SwitchPreference("revanced_hide_merchandise_banners") ) LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt index 741dcfa2..3f59ad17 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt @@ -1,22 +1,22 @@ package app.revanced.patches.youtube.ad.getpremium -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.ad.getpremium.fingerprints.GetPremiumViewFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @Patch( description = "Hides YouTube Premium signup promotions under the video player.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ @@ -40,23 +40,9 @@ object HideGetPremiumPatch : BytecodePatch(setOf(GetPremiumViewFingerprint)) { "Lapp/revanced/integrations/youtube/patches/HideGetPremiumPatch;" override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.ADS.addPreferences( - SwitchPreference( - "revanced_hide_get_premium", - StringResource( - "revanced_hide_get_premium_title", - "Hide YouTube Premium promotions" - ), - StringResource( - "revanced_hide_get_premium_summary_on", - "YouTube Premium promotions under video player are hidden" - ), - StringResource( - "revanced_hide_get_premium_summary_off", - "YouTube Premium promotions under video player are shown" - ) - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.ADS.addPreferences(SwitchPreference("revanced_hide_get_premium")) GetPremiumViewFingerprint.result?.let { it.mutableMethod.apply { diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt index 4762d1be..81215d61 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt @@ -7,8 +7,8 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.ad.video.fingerprints.LoadVideoAdsFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch @@ -18,7 +18,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch description = "Adds an option to remove ads in the video player.", dependencies = [ IntegrationsPatch::class, - SettingsPatch::class + SettingsPatch::class, + AddResourcesPatch::class ], compatiblePackages = [ CompatiblePackage( @@ -44,14 +45,9 @@ object VideoAdsPatch : BytecodePatch( setOf(LoadVideoAdsFingerprint) ) { override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.ADS.addPreferences( - SwitchPreference( - "revanced_hide_video_ads", - StringResource("revanced_hide_video_ads_title", "Hide video ads"), - StringResource("revanced_hide_video_ads_summary_on", "Video ads are hidden"), - StringResource("revanced_hide_video_ads_summary_off", "Video ads are shown") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.ADS.addPreferences(SwitchPreference("revanced_hide_video_ads")) val loadVideoAdsFingerprintMethod = LoadVideoAdsFingerprint.result!!.mutableMethod diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlResourcePatch.kt index cb03d0f8..83a44568 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlResourcePatch.kt @@ -3,50 +3,31 @@ package app.revanced.patches.youtube.interaction.copyvideourl import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.PreferenceScreen -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.playercontrols.BottomControlsResourcePatch import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.util.ResourceGroup import app.revanced.util.copyResources -import app.revanced.util.mergeStrings @Patch( dependencies = [ SettingsPatch::class, - BottomControlsResourcePatch::class + BottomControlsResourcePatch::class, + AddResourcesPatch::class ] ) internal object CopyVideoUrlResourcePatch : ResourcePatch() { override fun execute(context: ResourceContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences( PreferenceScreen( "revanced_copy_video_url_preference_screen", - StringResource("revanced_copy_video_url_preference_screen_title", "Copy video URL settings"), - listOf( - SwitchPreference( - "revanced_copy_video_url", - StringResource("revanced_copy_video_url_title", "Show copy video URL button"), - StringResource( - "revanced_copy_video_url_summary_on", - "Button is shown. Tap to copy video URL. Tap and hold to copy video URL with timestamp" - ), - StringResource("revanced_copy_video_url_summary_off", "Button is not shown") - ), - SwitchPreference( - "revanced_copy_video_url_timestamp", - StringResource("revanced_copy_video_url_timestamp_title", "Show copy timestamp URL button"), - StringResource( - "revanced_copy_video_url_timestamp_summary_on", - "Button is shown. Tap to copy video URL with timestamp. Tap and hold to copy video without timestamp" - ), - StringResource("revanced_copy_video_url_timestamp_summary_off", "Button is not shown") - ) - ), - StringResource( - "revanced_copy_video_url_preference_screen_summary", - "Settings related to copy URL buttons in video player" + preferences = setOf( + SwitchPreference("revanced_copy_video_url"), + SwitchPreference("revanced_copy_video_url_timestamp") ) ) ) @@ -59,7 +40,7 @@ internal object CopyVideoUrlResourcePatch : ResourcePatch() { ) ) - context.mergeStrings("copyvideourl/host/values/strings.xml") + AddResourcesPatch(this::class) BottomControlsResourcePatch.addControls("copyvideourl") } diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt index a802538c..df6d45a4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt @@ -6,8 +6,8 @@ import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.interaction.dialog.fingerprints.CreateDialogFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch @@ -18,7 +18,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction name = "Remove viewer discretion dialog", description = "Adds an option to remove the dialog that appears when opening a video that has been age-restricted " + "by accepting it automatically. This does not bypass the age restriction.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ @@ -46,27 +46,9 @@ object RemoveViewerDiscretionDialogPatch : BytecodePatch( "confirmDialog(Landroid/app/AlertDialog;)V" override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences( - SwitchPreference( - "revanced_remove_viewer_discretion_dialog", - StringResource( - "revanced_remove_viewer_discretion_dialog_title", - "Remove viewer discretion dialog" - ), - StringResource( - "revanced_remove_viewer_discretion_dialog_summary_on", - "Dialog will be removed" - ), - StringResource( - "revanced_remove_viewer_discretion_dialog_summary_off", - "Dialog will be shown" - ), - StringResource( - "revanced_remove_viewer_discretion_dialog_user_dialog_message", - "This does not bypass the age restriction. It just accepts it automatically." - ) - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences(SwitchPreference("revanced_remove_viewer_discretion_dialog")) CreateDialogFingerprint.result?.mutableMethod?.apply { val showDialogIndex = implementation!!.instructions.lastIndex - 2 diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsResourcePatch.kt index 3873a909..656eb13d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/ExternalDownloadsResourcePatch.kt @@ -3,55 +3,37 @@ package app.revanced.patches.youtube.interaction.downloads import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.* +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.InputType +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.misc.playercontrols.BottomControlsResourcePatch import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.util.ResourceGroup import app.revanced.util.copyResources -import app.revanced.util.mergeStrings @Patch( dependencies = [ BottomControlsResourcePatch::class, - SettingsPatch::class + SettingsPatch::class, + AddResourcesPatch::class, ] ) internal object ExternalDownloadsResourcePatch : ResourcePatch() { - override fun execute(context: ResourceContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences( PreferenceScreen( "revanced_external_downloader_preference_screen", - StringResource("revanced_external_downloader_preference_screen_title", "External download settings"), - listOf( - SwitchPreference( - "revanced_external_downloader", - StringResource("revanced_external_downloader_title", "Show external download button"), - StringResource("revanced_external_downloader_summary_on", "Download button shown in player"), - StringResource( - "revanced_external_downloader_summary_off", - "Download button not shown in player" - ) - ), - TextPreference( - "revanced_external_downloader_name", - StringResource("revanced_external_downloader_name_title", "Downloader package name"), - StringResource( - "revanced_external_downloader_name_summary", - "Package name of your installed external downloader app, such as NewPipe or Seal" - ), - InputType.TEXT - ) + preferences = setOf( + SwitchPreference("revanced_external_downloader"), + TextPreference("revanced_external_downloader_name", inputType = InputType.TEXT) ), - StringResource( - "revanced_external_downloader_preference_screen_summary", - "Settings for using an external downloader" - ) ) ) - context.mergeStrings("downloads/host/values/strings.xml") - context.copyResources( "downloads", ResourceGroup("drawable", "revanced_yt_download_button.xml") diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt index 0bf4fa32..b7b43d86 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt @@ -1,23 +1,23 @@ package app.revanced.patches.youtube.interaction.seekbar -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.interaction.seekbar.fingerprints.IsSwipingUpFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @Patch( name = "Disable precise seeking gesture", description = "Adds an option to disable precise seeking when swiping up on the seekbar.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", @@ -46,13 +46,10 @@ object DisablePreciseSeekingGesturePatch : BytecodePatch( "disableGesture(Landroid/view/VelocityTracker;Landroid/view/MotionEvent;)V" override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences( - SwitchPreference( - "revanced_disable_precise_seeking_gesture", - StringResource("revanced_disable_precise_seeking_gesture_title", "Disable precise seeking gesture"), - StringResource("revanced_disable_precise_seeking_gesture_summary_on", "Gesture is disabled"), - StringResource("revanced_disable_precise_seeking_gesture_summary_off", "Gesture is enabled"), - ) + SwitchPreference("revanced_disable_precise_seeking_gesture") ) IsSwipingUpFingerprint.result?.let { diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt index 28691355..86bc1967 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.interaction.seekbar -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction @@ -8,12 +7,13 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.interaction.seekbar.fingerprints.OnTouchEventHandlerFingerprint import app.revanced.patches.youtube.interaction.seekbar.fingerprints.SeekbarTappingFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c import com.android.tools.smali.dexlib2.iface.reference.MethodReference @@ -22,7 +22,7 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference name = "Seekbar tapping", description = "Adds an option to enable tap-to-seek on the seekbar of the video player.", dependencies = [ - IntegrationsPatch::class, SettingsPatch::class], + IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", @@ -47,14 +47,9 @@ object EnableSeekbarTappingPatch : BytecodePatch( ) ) { override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences( - SwitchPreference( - "revanced_seekbar_tapping", - StringResource("revanced_seekbar_tapping_title", "Enable seekbar tapping"), - StringResource("revanced_seekbar_tapping_summary_on", "Seekbar tapping is enabled"), - StringResource("revanced_seekbar_tapping_summary_off", "Seekbar tapping is disabled") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences(SwitchPreference("revanced_seekbar_tapping")) // Find the required methods to tap the seekbar. val seekbarTappingMethods = OnTouchEventHandlerFingerprint.result?.let { diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt index 2be99ce9..cc95388a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt @@ -1,24 +1,24 @@ package app.revanced.patches.youtube.interaction.seekbar -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.interaction.seekbar.fingerprints.DoubleSpeedSeekNoticeFingerprint import app.revanced.patches.youtube.interaction.seekbar.fingerprints.SlideToSeekFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( name = "Enable slide to seek", description = "Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player. Including this patch may cause issues with tapping or double tapping the video player overlay.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", @@ -46,23 +46,9 @@ object EnableSlideToSeekPatch : BytecodePatch( private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/SlideToSeekPatch;" override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences( - SwitchPreference( - "revanced_slide_to_seek", - StringResource( - "revanced_slide_to_seek_title", - "Enable slide to seek" - ), - StringResource( - "revanced_slide_to_seek_summary_on", - "Slide to seek is enabled" - ), - StringResource( - "revanced_slide_to_seek_summary_off", - "Slide to seek is not enabled" - ), - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences(SwitchPreference("revanced_slide_to_seek")) arrayOf( // Restore the behaviour to slide to seek. diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsResourcePatch.kt index 58c6a214..de615456 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsResourcePatch.kt @@ -3,92 +3,36 @@ package app.revanced.patches.youtube.interaction.swipecontrols import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.* +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.InputType +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.util.ResourceGroup import app.revanced.util.copyResources @Patch( - dependencies = [SettingsPatch::class] + dependencies = [SettingsPatch::class, AddResourcesPatch::class] ) internal object SwipeControlsResourcePatch : ResourcePatch() { override fun execute(context: ResourceContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences( PreferenceScreen( - "revanced_swipe_controls_preference_screen", - StringResource("revanced_swipe_controls_preference_screen_title", "Swipe controls"), - listOf( - SwitchPreference( - "revanced_swipe_brightness", - StringResource("revanced_swipe_brightness_title", "Enable brightness gesture"), - StringResource("revanced_swipe_brightness_summary_on", "Brightness swipe is enabled"), - StringResource("revanced_swipe_brightness_summary_off", "Brightness swipe is disabled") - ), - SwitchPreference( - "revanced_swipe_volume", - StringResource("revanced_swipe_volume_title", "Enable volume gesture"), - StringResource("revanced_swipe_volume_summary_on", "Volume swipe is enabled"), - StringResource("revanced_swipe_volume_summary_off", "Volume swipe is disabled") - ), - SwitchPreference( - "revanced_swipe_press_to_engage", - StringResource("revanced_swipe_press_to_engage_title", "Enable press-to-swipe gesture"), - StringResource("revanced_swipe_press_to_engage_summary_on", "Press-to-swipe is enabled"), - StringResource("revanced_swipe_press_to_engage_summary_off", "Press-to-swipe is disabled") - ), - SwitchPreference( - "revanced_swipe_haptic_feedback", - StringResource("revanced_swipe_haptic_feedback_title", "Enable haptic feedback"), - StringResource("revanced_swipe_haptic_feedback_summary_on", "Haptic feedback is enabled"), - StringResource("revanced_swipe_haptic_feedback_summary_off", "Haptic feedback is disabled") - ), - SwitchPreference( - "revanced_swipe_save_and_restore_brightness", - StringResource("revanced_swipe_save_and_restore_brightness_title", "Save and restore brightness"), - StringResource( - "revanced_swipe_save_and_restore_brightness_summary_on", - "Save and restore brightness when exiting or entering fullscreen" - ), - StringResource( - "revanced_swipe_save_and_restore_brightness_summary_off", - "Do not save and restore brightness when exiting or entering fullscreen" - ) - ), - TextPreference( - "revanced_swipe_overlay_timeout", - StringResource("revanced_swipe_overlay_timeout_title", "Swipe overlay timeout"), - StringResource( - "revanced_swipe_overlay_timeout_summary", - "The amount of milliseconds the overlay is visible" - ), - InputType.NUMBER - ), - TextPreference( - "revanced_swipe_text_overlay_size", - StringResource("revanced_swipe_text_overlay_size_title", "Swipe overlay text size"), - StringResource("revanced_swipe_text_overlay_size_summary", "The text size for swipe overlay"), - InputType.NUMBER - ), - TextPreference( - "revanced_swipe_overlay_background_alpha", - StringResource("revanced_swipe_overlay_background_alpha_title", "Swipe background visibility"), - StringResource( - "revanced_swipe_overlay_background_alpha_summary", - "The visibility of swipe overlay background" - ), - InputType.NUMBER - ), - TextPreference( - "revanced_swipe_threshold", - StringResource("revanced_swipe_threshold_title", "Swipe magnitude threshold"), - StringResource( - "revanced_swipe_threshold_summary", - "The amount of threshold for swipe to occur" - ), - InputType.NUMBER - ) + key = "revanced_swipe_controls_preference_screen", + preferences = setOf( + SwitchPreference("revanced_swipe_brightness"), + SwitchPreference("revanced_swipe_volume"), + SwitchPreference("revanced_swipe_press_to_engage"), + SwitchPreference("revanced_swipe_haptic_feedback"), + SwitchPreference("revanced_swipe_save_and_restore_brightness"), + TextPreference("revanced_swipe_overlay_timeout", inputType = InputType.NUMBER), + TextPreference("revanced_swipe_text_overlay_size", inputType = InputType.NUMBER), + TextPreference("revanced_swipe_overlay_background_alpha", inputType = InputType.NUMBER), + TextPreference("revanced_swipe_threshold", inputType = InputType.NUMBER) ), - StringResource("revanced_swipe_controls_preference_screen_summary","Control volume and brightness") ) ) @@ -96,10 +40,10 @@ internal object SwipeControlsResourcePatch : ResourcePatch() { "swipecontrols", ResourceGroup( "drawable", - "ic_sc_brightness_auto.xml", - "ic_sc_brightness_manual.xml", - "ic_sc_volume_mute.xml", - "ic_sc_volume_normal.xml" + "revanced_ic_sc_brightness_auto.xml", + "revanced_ic_sc_brightness_manual.xml", + "revanced_ic_sc_volume_mute.xml", + "revanced_ic_sc_volume_normal.xml" ) ) } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt index 002f52d8..d5a77124 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt @@ -1,25 +1,25 @@ package app.revanced.patches.youtube.layout.autocaptions -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.autocaptions.fingerprints.StartVideoInformerFingerprint import app.revanced.patches.youtube.layout.autocaptions.fingerprints.SubtitleButtonControllerFingerprint import app.revanced.patches.youtube.layout.autocaptions.fingerprints.SubtitleTrackFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception @Patch( name = "Disable auto captions", description = "Adds an option to disable captions from being automatically enabled.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", @@ -44,14 +44,9 @@ object AutoCaptionsPatch : BytecodePatch( setOf(StartVideoInformerFingerprint, SubtitleButtonControllerFingerprint, SubtitleTrackFingerprint) ) { override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_auto_captions", - StringResource("revanced_auto_captions_title", "Disable auto captions"), - StringResource("revanced_auto_captions_summary_on", "Auto captions are disabled"), - StringResource("revanced_auto_captions_summary_off", "Auto captions are enabled") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_auto_captions")) mapOf( StartVideoInformerFingerprint to 0, diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt index 2101cac8..928f3d7a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt @@ -4,10 +4,10 @@ import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.PreferenceScreen -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.litho.filter.LithoFilterPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch @@ -16,7 +16,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch description = "Adds options to hide action buttons (such as the Download button) under videos.", dependencies = [ ResourceMappingPatch::class, - LithoFilterPatch::class + LithoFilterPatch::class, + AddResourcesPatch::class ], compatiblePackages = [ CompatiblePackage( @@ -43,73 +44,23 @@ object HideButtonsPatch : ResourcePatch() { "Lapp/revanced/integrations/youtube/patches/components/ButtonsFilter;" override fun execute(context: ResourceContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( PreferenceScreen( "revanced_hide_buttons_preference_screen", - StringResource("revanced_hide_buttons_preference_screen_title", "Hide action buttons"), - listOf( - SwitchPreference( - "revanced_hide_like_dislike_button", - StringResource("revanced_hide_like_dislike_button_title", "Hide like and dislike buttons"), - StringResource("revanced_hide_like_dislike_button_summary_on", "Like and dislike buttons are hidden"), - StringResource("revanced_hide_like_dislike_button_summary_off", "Like and dislike buttons are shown") - ), - SwitchPreference( - "revanced_hide_live_chat_button", - StringResource("revanced_hide_live_chat_button_title", "Hide live chat button"), - StringResource("revanced_hide_live_chat_button_summary_on", "Live chat button is hidden"), - StringResource("revanced_hide_live_chat_button_summary_off", "Live chat button is shown") - ), - SwitchPreference( - "revanced_hide_share_button", - StringResource("revanced_hide_share_button_title", "Hide share button"), - StringResource("revanced_hide_share_button_summary_on", "Share button is hidden"), - StringResource("revanced_hide_share_button_summary_off", "Share button is shown") - ), - SwitchPreference( - "revanced_hide_report_button", - StringResource("revanced_hide_report_button_title", "Hide report button"), - StringResource("revanced_hide_report_button_summary_on", "Report button is hidden"), - StringResource("revanced_hide_report_button_summary_off", "Report button is shown") - ), - SwitchPreference( - "revanced_hide_remix_button", - StringResource("revanced_hide_remix_button_title", "Hide remix button"), - StringResource("revanced_hide_remix_button_summary_on", "Remix button is hidden"), - StringResource("revanced_hide_remix_button_summary_off", "Remix button is shown") - ), - SwitchPreference( - "revanced_hide_download_button", - StringResource("revanced_hide_download_button_title", "Hide download button"), - StringResource("revanced_hide_download_button_summary_on", "Download button is hidden"), - StringResource("revanced_hide_download_button_summary_off", "Download button is shown") - ), - SwitchPreference( - "revanced_hide_thanks_button", - StringResource("revanced_hide_thanks_button_title", "Hide thanks button"), - StringResource("revanced_hide_thanks_button_summary_on", "Thanks button is hidden"), - StringResource("revanced_hide_thanks_button_summary_off", "Thanks button is shown") - ), - SwitchPreference( - "revanced_hide_clip_button", - StringResource("revanced_hide_clip_button_title", "Hide clip button"), - StringResource("revanced_hide_clip_button_summary_on", "Clip button is hidden"), - StringResource("revanced_hide_clip_button_summary_off", "Clip button is shown"), - ), - SwitchPreference( - "revanced_hide_playlist_button", - StringResource("revanced_hide_playlist_button_title", "Hide save to playlist button"), - StringResource("revanced_hide_playlist_button_summary_on", "Save button is hidden"), - StringResource("revanced_hide_playlist_button_summary_off", "Save button is shown") - ), - SwitchPreference( - "revanced_hide_shop_button", - StringResource("revanced_hide_shop_button_title", "Hide shop button"), - StringResource("revanced_hide_shop_button_summary_on", "Shop button is hidden"), - StringResource("revanced_hide_shop_button_summary_off", "Shop button is shown") - ) + preferences = setOf( + SwitchPreference("revanced_hide_like_dislike_button"), + SwitchPreference("revanced_hide_live_chat_button"), + SwitchPreference("revanced_hide_share_button"), + SwitchPreference("revanced_hide_report_button"), + SwitchPreference("revanced_hide_remix_button"), + SwitchPreference("revanced_hide_download_button"), + SwitchPreference("revanced_hide_thanks_button"), + SwitchPreference("revanced_hide_clip_button"), + SwitchPreference("revanced_hide_playlist_button"), + SwitchPreference("revanced_hide_shop_button") ), - StringResource("revanced_hide_buttons_preference_screen_summary", "Hide or show buttons under videos") ) ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt index e3df1bd6..676eb536 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/autoplay/HideAutoplayButtonPatch.kt @@ -1,7 +1,5 @@ package app.revanced.patches.youtube.layout.buttons.autoplay -import app.revanced.util.exception -import app.revanced.util.findIndexForIdResource import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction @@ -9,12 +7,14 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.patches.youtube.shared.fingerprints.LayoutConstructorFingerprint +import app.revanced.util.exception +import app.revanced.util.findIndexForIdResource import com.android.tools.smali.dexlib2.iface.instruction.Instruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction @@ -26,7 +26,8 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference dependencies = [ IntegrationsPatch::class, SettingsPatch::class, - ResourceMappingPatch::class + ResourceMappingPatch::class, + AddResourcesPatch::class ], compatiblePackages = [ CompatiblePackage( @@ -52,14 +53,9 @@ object HideAutoplayButtonPatch : BytecodePatch( setOf(LayoutConstructorFingerprint) ) { override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_autoplay_button", - StringResource("revanced_hide_autoplay_button_title", "Hide autoplay button"), - StringResource("revanced_hide_autoplay_button_summary_on", "Autoplay button is hidden"), - StringResource("revanced_hide_autoplay_button_summary_off", "Autoplay button is shown") - ), - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_hide_autoplay_button")) LayoutConstructorFingerprint.result?.mutableMethod?.apply { val layoutGenMethodInstructions = implementation!!.instructions diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt index 5d367b36..60e4d51b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/captions/HideCaptionsButtonPatch.kt @@ -5,8 +5,8 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.autocaptions.fingerprints.SubtitleButtonControllerFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch @@ -17,7 +17,8 @@ import com.android.tools.smali.dexlib2.Opcode description = "Adds an option to hide the captions button in the video player.", dependencies = [ IntegrationsPatch::class, - SettingsPatch::class + SettingsPatch::class, + AddResourcesPatch::class ], compatiblePackages = [ CompatiblePackage( @@ -43,14 +44,9 @@ object HideCaptionsButtonPatch : BytecodePatch( setOf(SubtitleButtonControllerFingerprint) ) { override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_captions_button", - StringResource("revanced_hide_captions_button_title", "Hide captions button"), - StringResource("revanced_hide_captions_button_summary_on", "Captions button is hidden"), - StringResource("revanced_hide_captions_button_summary_off", "Captions button is shown") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_hide_captions_button")) val subtitleButtonControllerMethod = SubtitleButtonControllerFingerprint.result!!.mutableMethod diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/cast/HideCastButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/cast/HideCastButtonPatch.kt index 89cb368f..ee1f6943 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/cast/HideCastButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/cast/HideCastButtonPatch.kt @@ -6,8 +6,8 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch @@ -16,7 +16,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch description = "Adds an option to hide the cast button in the video player.", dependencies = [ IntegrationsPatch::class, - SettingsPatch::class + SettingsPatch::class, + AddResourcesPatch::class ], compatiblePackages = [ CompatiblePackage("com.google.android.youtube") @@ -24,14 +25,9 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch ) object HideCastButtonPatch : BytecodePatch() { override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_cast_button", - StringResource("revanced_hide_cast_button_title", "Hide cast button"), - StringResource("revanced_hide_cast_button_summary_on", "Cast button is hidden"), - StringResource("revanced_hide_cast_button_summary_off", "Cast button is shown") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_hide_cast_button")) val buttonClass = context.findClass("MediaRouteButton") ?: throw PatchException("MediaRouteButton class not found.") diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt index 6ad07a0e..de630479 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt @@ -1,20 +1,20 @@ package app.revanced.patches.youtube.layout.buttons.navigation -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.PreferenceScreen -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.buttons.navigation.fingerprints.* import app.revanced.patches.youtube.layout.buttons.navigation.utils.InjectionUtils.REGISTER_TEMPLATE_REPLACEMENT import app.revanced.patches.youtube.layout.buttons.navigation.utils.InjectionUtils.injectHook import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( @@ -23,7 +23,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction dependencies = [ IntegrationsPatch::class, SettingsPatch::class, - ResolvePivotBarFingerprintsPatch::class + ResolvePivotBarFingerprintsPatch::class, + AddResourcesPatch::class ], compatiblePackages = [ CompatiblePackage( @@ -52,58 +53,18 @@ object NavigationButtonsPatch : BytecodePatch( "Lapp/revanced/integrations/youtube/patches/NavigationButtonsPatch;" override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( PreferenceScreen( - "revanced_navigation_buttons_preference_screen", - StringResource("revanced_navigation_buttons_preference_screen_title", "Navigation buttons"), - listOf( - SwitchPreference( - "revanced_hide_home_button", - StringResource("revanced_hide_home_button_title", "Hide home button"), - StringResource("revanced_hide_home_button_summary_on", "Home button is hidden"), - StringResource("revanced_hide_home_button_summary_off", "Home button is shown") - ), - SwitchPreference( - "revanced_hide_shorts_button", - StringResource("revanced_hide_shorts_button_title", "Hide Shorts button"), - StringResource("revanced_hide_shorts_button_summary_on", "Shorts button is hidden"), - StringResource("revanced_hide_shorts_button_summary_off", "Shorts button is shown") - ), - SwitchPreference( - "revanced_hide_subscriptions_button", - StringResource("revanced_hide_subscriptions_button_title", "Hide subscriptions button"), - StringResource( - "revanced_hide_subscriptions_button_summary_on", - "Home subscriptions is hidden" - ), - StringResource("revanced_hide_subscriptions_button_summary_off", "Home subscriptions is shown") - ), - SwitchPreference( - "revanced_hide_create_button", - StringResource("revanced_hide_create_button_title", "Hide create button"), - StringResource("revanced_hide_create_button_summary_on", "Create button is hidden"), - StringResource("revanced_hide_create_button_summary_off", "Create button is shown") - ), - SwitchPreference( - "revanced_switch_create_with_notifications_button", - StringResource( - "revanced_switch_create_with_notifications_button_title", - "Switch create with notifications button" - ), - StringResource( - "revanced_switch_create_with_notifications_button_summary_on", - "Create button is switched with notifications" - ), - StringResource( - "revanced_switch_create_with_notifications_button_summary_off", - "Create button is not switched with notifications" - ), - ), + key = "revanced_navigation_buttons_preference_screen", + preferences = setOf( + SwitchPreference("revanced_hide_home_button"), + SwitchPreference("revanced_hide_shorts_button"), + SwitchPreference("revanced_hide_subscriptions_button"), + SwitchPreference("revanced_hide_create_button"), + SwitchPreference("revanced_switch_create_with_notifications_button"), ), - StringResource( - "revanced_navigation_buttons_preference_screen_summary", - "Hide or change buttons in the navigation bar" - ) ) ) @@ -156,8 +117,8 @@ object NavigationButtonsPatch : BytecodePatch( AddCreateButtonViewFingerprint.result?.let { it.mutableMethod.apply { - val stringIndex = it.scanResult.stringsScanResult!!.matches.find { - match -> match.string == ANDROID_AUTOMOTIVE_STRING + val stringIndex = it.scanResult.stringsScanResult!!.matches.find { match -> + match.string == ANDROID_AUTOMOTIVE_STRING }!!.index val conditionalCheckIndex = stringIndex - 1 diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/ResolvePivotBarFingerprintsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/ResolvePivotBarFingerprintsPatch.kt index 393f65a8..eacab72b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/ResolvePivotBarFingerprintsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/ResolvePivotBarFingerprintsPatch.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch import app.revanced.patches.youtube.layout.buttons.navigation.fingerprints.InitializeButtonsFingerprint import app.revanced.patches.youtube.layout.buttons.navigation.fingerprints.PivotBarConstructorFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt index fe4613b4..70b040a4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/player/hide/HidePlayerButtonsPatch.kt @@ -1,19 +1,19 @@ package app.revanced.patches.youtube.layout.buttons.player.hide -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.buttons.player.hide.HidePlayerButtonsPatch.ParameterOffsets.HAS_NEXT import app.revanced.patches.youtube.layout.buttons.player.hide.HidePlayerButtonsPatch.ParameterOffsets.HAS_PREVIOUS import app.revanced.patches.youtube.layout.buttons.player.hide.fingerprints.PlayerControlsVisibilityModelFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction3rc @Patch( @@ -21,7 +21,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction3rc description = "Adds an option to hide the previous and next buttons in the video player.", dependencies = [ IntegrationsPatch::class, - SettingsPatch::class + SettingsPatch::class, + AddResourcesPatch::class ], compatiblePackages = [ CompatiblePackage( @@ -47,23 +48,9 @@ object HidePlayerButtonsPatch : BytecodePatch( setOf(PlayerControlsVisibilityModelFingerprint) ) { override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_player_buttons", - StringResource( - "revanced_hide_player_buttons_title", - "Hide previous & next video buttons" - ), - StringResource( - "revanced_hide_player_buttons_summary_on", - "Buttons are hidden" - ), - StringResource( - "revanced_hide_player_buttons_summary_off", - "Buttons are shown" - ) - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_hide_player_buttons")) PlayerControlsVisibilityModelFingerprint.result?.apply { val callIndex = scanResult.patternScanResult!!.endIndex diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsResourcePatch.kt index 2501d479..e05b3e8b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/albumcards/AlbumCardsResourcePatch.kt @@ -3,29 +3,25 @@ package app.revanced.patches.youtube.layout.hide.albumcards import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( dependencies = [ SettingsPatch::class, - ResourceMappingPatch::class + ResourceMappingPatch::class, + AddResourcesPatch::class ], ) internal object AlbumCardsResourcePatch : ResourcePatch() { internal var albumCardId: Long = -1 override fun execute(context: ResourceContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_album_cards", - StringResource("revanced_hide_album_cards_title", "Hide album cards"), - StringResource("revanced_hide_album_cards_summary_on", "Album cards are hidden"), - StringResource("revanced_hide_album_cards_summary_off", "Album cards are shown") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_hide_album_cards")) albumCardId = ResourceMappingPatch.resourceMappings.single { it.type == "layout" && it.name == "album_card" diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsResourcePatch.kt index 9de7b83d..31fb0b4a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/breakingnews/BreakingNewsResourcePatch.kt @@ -3,29 +3,25 @@ package app.revanced.patches.youtube.layout.hide.breakingnews import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( dependencies = [ SettingsPatch::class, - ResourceMappingPatch::class + ResourceMappingPatch::class, + AddResourcesPatch::class ], ) internal object BreakingNewsResourcePatch : ResourcePatch() { internal var horizontalCardListId: Long = -1 override fun execute(context: ResourceContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_breaking_news", - StringResource("revanced_hide_breaking_news_title", "Hide breaking news"), - StringResource("revanced_hide_breaking_news_summary_on", "Breaking news are hidden"), - StringResource("revanced_hide_breaking_news_summary_off", "Breaking news are shown") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_hide_breaking_news")) horizontalCardListId = ResourceMappingPatch.resourceMappings.single { it.type == "layout" && it.name == "horizontal_card_list" diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt index e102b809..8e4c891c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/comments/CommentsPatch.kt @@ -4,9 +4,9 @@ import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.PreferenceScreen -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.litho.filter.LithoFilterPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch @@ -15,7 +15,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch description = "Adds options to hide components related to comments.", dependencies = [ SettingsPatch::class, - LithoFilterPatch::class + LithoFilterPatch::class, + AddResourcesPatch::class ], compatiblePackages = [ CompatiblePackage( @@ -42,28 +43,18 @@ object CommentsPatch : ResourcePatch() { "Lapp/revanced/integrations/youtube/patches/components/CommentsFilter;" override fun execute(context: ResourceContext) { - LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) - + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( PreferenceScreen( "revanced_comments_preference_screen", - StringResource("revanced_comments_preference_screen_title", "Comments"), - listOf( - SwitchPreference( - "revanced_hide_comments_section", - StringResource("revanced_hide_comments_section_title", "Hide comments section"), - StringResource("revanced_hide_comments_section_summary_on", "Comment section is hidden"), - StringResource("revanced_hide_comments_section_summary_off", "Comment section is shown") - ), - SwitchPreference( - "revanced_hide_preview_comment", - StringResource("revanced_hide_preview_comment_title", "Hide preview comment"), - StringResource("revanced_hide_preview_comment_on", "Preview comment is hidden"), - StringResource("revanced_hide_preview_comment_off", "Preview comment is shown") - ) - ), - StringResource("revanced_comments_preference_screen_summary", "Manage the visibility of comments section components") + preferences = setOf( + SwitchPreference("revanced_hide_comments_section"), + SwitchPreference("revanced_hide_preview_comment") + ) ) ) + + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxResourcePatch.kt index 4df6484a..0ce74f7f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/crowdfundingbox/CrowdfundingBoxResourcePatch.kt @@ -3,29 +3,25 @@ package app.revanced.patches.youtube.layout.hide.crowdfundingbox import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( dependencies = [ SettingsPatch::class, - ResourceMappingPatch::class + ResourceMappingPatch::class, + AddResourcesPatch::class ], ) internal object CrowdfundingBoxResourcePatch : ResourcePatch() { internal var crowdfundingBoxId: Long = -1 override fun execute(context: ResourceContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_crowdfunding_box", - StringResource("revanced_hide_crowdfunding_box_title", "Hide crowdfunding box"), - StringResource("revanced_hide_crowdfunding_box_summary_on", "Crowdfunding box is hidden"), - StringResource("revanced_hide_crowdfunding_box_summary_off", "Crowdfunding box is shown") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_hide_crowdfunding_box")) crowdfundingBoxId = ResourceMappingPatch.resourceMappings.single { it.type == "layout" && it.name == "donation_companion" diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsResourcePatch.kt index 87e65d63..6f601391 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsResourcePatch.kt @@ -3,15 +3,16 @@ package app.revanced.patches.youtube.layout.hide.endscreencards import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( dependencies = [ SettingsPatch::class, - ResourceMappingPatch::class + ResourceMappingPatch::class, + AddResourcesPatch::class ], ) internal object HideEndscreenCardsResourcePatch : ResourcePatch() { @@ -20,14 +21,9 @@ internal object HideEndscreenCardsResourcePatch : ResourcePatch() { internal var layoutVideo: Long = -1 override fun execute(context: ResourceContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_endscreen_cards", - StringResource("revanced_hide_endscreen_cards_title", "Hide end screen cards"), - StringResource("revanced_hide_endscreen_cards_summary_on", "End screen cards are hidden"), - StringResource("revanced_hide_endscreen_cards_summary_off", "End screen cards are shown") - ), - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_hide_endscreen_cards")) fun findEndscreenResourceId(name: String) = ResourceMappingPatch.resourceMappings.single { it.type == "layout" && it.name == "endscreen_element_layout_$name" diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarResourcePatch.kt index dedc1142..70ef188f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/filterbar/HideFilterBarResourcePatch.kt @@ -3,76 +3,28 @@ package app.revanced.patches.youtube.layout.hide.filterbar import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.PreferenceScreen -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch -@Patch(dependencies = [SettingsPatch::class, ResourceMappingPatch::class]) +@Patch(dependencies = [SettingsPatch::class, ResourceMappingPatch::class, AddResourcesPatch::class]) internal object HideFilterBarResourcePatch : ResourcePatch() { internal var filterBarHeightId = -1L internal var relatedChipCloudMarginId = -1L internal var barContainerHeightId = -1L override fun execute(context: ResourceContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( PreferenceScreen( - "revanced_hide_filter_bar_preference", - StringResource( - "revanced_hide_filter_bar_preference_title", - "Hide filter bar" - ), - listOf( - SwitchPreference( - "revanced_hide_filter_bar_feed_in_feed", - StringResource( - "revanced_hide_filter_bar_feed_in_feed_title", - "Hide in feed" - ), - StringResource( - "revanced_hide_filter_bar_feed_in_feed_summary_on", - "Hidden in feed" - ), - StringResource( - "revanced_hide_filter_bar_feed_in_feed_summary_off", - "Shown in feed" - ) - ), - SwitchPreference( - "revanced_hide_filter_bar_feed_in_search", - StringResource( - "revanced_hide_filter_bar_feed_in_search_title", - "Hide in search" - ), - StringResource( - "revanced_hide_filter_bar_feed_in_search_summary_on", - "Hidden in search" - ), - StringResource( - "revanced_hide_filter_bar_feed_in_search_summary_off", - "Shown in search" - ) - ), - SwitchPreference( - "revanced_hide_filter_bar_feed_in_related_videos", - StringResource( - "revanced_hide_filter_bar_feed_in_related_videos_title", - "Hide in related videos" - ), - StringResource( - "revanced_hide_filter_bar_feed_in_related_videos_summary_on", - "Hidden in related videos" - ), - StringResource( - "revanced_hide_filter_bar_feed_in_related_videos_summary_off", - "Shown in related videos" - ) - ), - ), - StringResource( - "revanced_hide_filter_bar_preference_summary", - "Manage the visibility of the filter bar in the feed, search and related videos" + key = "revanced_hide_filter_bar_preference", + preferences = setOf( + SwitchPreference("revanced_hide_filter_bar_feed_in_feed"), + SwitchPreference("revanced_hide_filter_bar_feed_in_search"), + SwitchPreference("revanced_hide_filter_bar_feed_in_related_videos"), ) ) ) @@ -82,6 +34,6 @@ internal object HideFilterBarResourcePatch : ResourcePatch() { barContainerHeightId = "bar_container_height".layoutResourceId() } - private fun String.layoutResourceId(type: String = "dimen") = - ResourceMappingPatch.resourceMappings.single { it.type == type && it.name == this }.id + private fun String.layoutResourceId(type: String = "dimen") = + ResourceMappingPatch.resourceMappings.single { it.type == type && it.name == this }.id } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonResourcePatch.kt index 86546261..92f8f423 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/floatingmicrophone/HideFloatingMicrophoneButtonResourcePatch.kt @@ -4,32 +4,25 @@ import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( dependencies = [ SettingsPatch::class, - ResourceMappingPatch::class + ResourceMappingPatch::class, + AddResourcesPatch::class ] ) internal object HideFloatingMicrophoneButtonResourcePatch : ResourcePatch() { internal var fabButtonId: Long = -1 override fun execute(context: ResourceContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_floating_microphone_button", - StringResource( - "revanced_hide_floating_microphone_button_enabled_title", - "Hide floating microphone button" - ), - StringResource("revanced_hide_floating_microphone_button_summary_on", "Microphone button hidden"), - StringResource("revanced_hide_floating_microphone_button_summary_off", "Microphone button shown") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_hide_floating_microphone_button")) fabButtonId = ResourceMappingPatch.resourceMappings.find { it.type == "id" && it.name == "fab" }?.id ?: throw PatchException("Can not find required fab button resource id") diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt index 92a3c3fd..421b1234 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt @@ -1,21 +1,21 @@ package app.revanced.patches.youtube.layout.hide.fullscreenambientmode -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.hide.fullscreenambientmode.fingerprints.InitializeAmbientModeFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception @Patch( name = "Disable fullscreen ambient mode", description = "Adds an option to disable the ambient mode when in fullscreen.", - dependencies = [SettingsPatch::class, IntegrationsPatch::class], + dependencies = [SettingsPatch::class, IntegrationsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ @@ -41,22 +41,10 @@ object DisableFullscreenAmbientModePatch : BytecodePatch( "Lapp/revanced/integrations/youtube/patches/DisableFullscreenAmbientModePatch;" override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_disable_fullscreen_ambient_mode", - StringResource( - "revanced_disable_fullscreen_ambient_mode_title", - "Disable ambient mode in fullscreen" - ), - StringResource( - "revanced_disable_fullscreen_ambient_mode_summary_on", - "Ambient mode disabled" - ), - StringResource( - "revanced_disable_fullscreen_ambient_mode_summary_off", - "Ambient mode enabled" - ), - ) + SwitchPreference("revanced_disable_fullscreen_ambient_mode") ) InitializeAmbientModeFingerprint.result?.let { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index b39d75fd..5d8c261a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -10,7 +10,10 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.settings.preference.impl.* +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.InputType +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.layout.hide.general.fingerprints.ParseElementFromBufferFingerprint import app.revanced.patches.youtube.layout.hide.general.fingerprints.PlayerOverlayFingerprint import app.revanced.patches.youtube.layout.hide.general.fingerprints.ShowWatermarkFingerprint @@ -27,7 +30,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction description = "Adds options to hide general layout components.", dependencies = [ LithoFilterPatch::class, - SettingsPatch::class + SettingsPatch::class, + AddResourcesPatch::class ], compatiblePackages = [ CompatiblePackage( @@ -57,383 +61,55 @@ object HideLayoutComponentsPatch : BytecodePatch( "Lapp/revanced/integrations/youtube/patches/components/DescriptionComponentsFilter;" override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_gray_separator", - StringResource("revanced_hide_gray_separator_title", "Hide gray separator"), - StringResource("revanced_hide_gray_separator_summary_on", "Gray separators are hidden"), - StringResource("revanced_hide_gray_separator_summary_off", "Gray separators are shown") - ), - SwitchPreference( - "revanced_hide_join_membership_button", - StringResource("revanced_hide_join_membership_button_title", "Hide \\\'Join\\\' button"), - StringResource("revanced_hide_join_membership_button_summary_on", "Button is hidden"), - StringResource("revanced_hide_join_membership_button_summary_off", "Button is shown") - ), - SwitchPreference( - "revanced_hide_channel_watermark_title", - StringResource( - "revanced_hide_channel_watermark_title", - "Hide channel watermark in video player" - ), - StringResource("revanced_hide_channel_watermark_title_summary_on", "Watermark is hidden"), - StringResource("revanced_hide_channel_watermark_title_summary_off", "Watermark is shown") - ), - SwitchPreference( - "revanced_hide_for_you_shelf", - StringResource("revanced_hide_for_you_shelf_title", "Hide \\\'For you\\\' shelf in channel page"), - StringResource("revanced_hide_for_you_shelf_summary_on", "Shelf is hidden"), - StringResource("revanced_hide_for_you_shelf_summary_off", "Shelf is shown") - ), - SwitchPreference( - "revanced_hide_notify_me_button", - StringResource("revanced_hide_notify_me_button_title", "Hide \\\'Notify me\\\' button"), - StringResource("revanced_hide_notify_me_button_summary_on", "Button is hidden"), - StringResource("revanced_hide_notify_me_button_summary_off", "Button is shown") - ), - SwitchPreference( - "revanced_hide_timed_reactions", - StringResource("revanced_hide_timed_reactions_title", "Hide timed reactions"), - StringResource("revanced_hide_timed_reactions_summary_on", "Timed reactions are hidden"), - StringResource("revanced_hide_timed_reactions_summary_off", "Timed reactions are shown") - ), - SwitchPreference( - "revanced_hide_search_result_recommendations", - StringResource( - "revanced_hide_search_result_recommendations_title", - "Hide \\\'People also watched\\\' recommendations" - ), - StringResource( - "revanced_hide_search_result_recommendations_summary_on", - "Recommendations are hidden" - ), - StringResource( - "revanced_hide_search_result_recommendations_summary_off", - "Recommendations are shown" - ) - ), - SwitchPreference( - "revanced_hide_search_result_shelf_header", - StringResource( - "revanced_hide_search_result_shelf_header_title", - "Hide search result shelf header" - ), - StringResource( - "revanced_hide_search_result_shelf_header_summary_on", - "Shelf header is hidden" - ), - StringResource( - "revanced_hide_search_result_shelf_header_summary_off", - "Shelf header is shown" - ) - ), - SwitchPreference( - "revanced_hide_channel_guidelines", - StringResource("revanced_hide_channel_guidelines_title", "Hide channel guidelines"), - StringResource( - "revanced_hide_channel_guidelines_summary_on", - "Channel guidelines are hidden" - ), - StringResource( - "revanced_hide_channel_guidelines_summary_off", - "Channel guidelines are shown" - ) - ), - SwitchPreference( - "revanced_hide_expandable_chip", - StringResource( - "revanced_hide_expandable_chip_title", - "Hide expandable chip under videos" - ), - StringResource( - "revanced_hide_expandable_chip_summary_on", - "Expandable chips are hidden" - ), - StringResource( - "revanced_hide_expandable_chip_summary_off", - "Expandable chips are shown" - ) - ), - SwitchPreference( - "revanced_hide_video_quality_menu_footer", - StringResource( - "revanced_hide_video_quality_menu_footer_title", - "Hide video quality menu footer" - ), - StringResource( - "revanced_hide_video_quality_menu_footer_summary_on", - "Video quality menu footer is hidden" - ), - StringResource( - "revanced_hide_video_quality_menu_footer_summary_off", - "Video quality menu footer is shown" - ) - ), - SwitchPreference( - "revanced_hide_chapters", - StringResource( - "revanced_hide_chapters_title", - "Hide chapters in the video description" - ), - StringResource( - "revanced_hide_chapters_summary_on", - "Chapters are hidden" - ), - StringResource( - "revanced_hide_chapters_summary_off", - "Chapters are shown" - ) - ), - SwitchPreference( - "revanced_hide_community_posts", - StringResource("revanced_hide_community_posts_title", "Hide community posts"), - StringResource("revanced_hide_community_posts_summary_on", "Community posts are hidden"), - StringResource("revanced_hide_community_posts_summary_off", "Community posts are shown") - ), - SwitchPreference( - "revanced_hide_compact_banner", - StringResource("revanced_hide_compact_banner_title", "Hide compact banners"), - StringResource("revanced_hide_compact_banner_summary_on", "Compact banners are hidden"), - StringResource("revanced_hide_compact_banner_summary_off", "Compact banners are shown") - ), - SwitchPreference( - "revanced_hide_movies_section", - StringResource("revanced_hide_movies_section_title", "Hide movies section"), - StringResource("revanced_hide_movies_section_summary_on", "Movies section is hidden"), - StringResource("revanced_hide_movies_section_summary_off", "Movies section is shown") - ), - SwitchPreference( - "revanced_hide_feed_survey", - StringResource("revanced_hide_feed_survey_title", "Hide feed surveys"), - StringResource("revanced_hide_feed_survey_summary_on", "Feed surveys are hidden"), - StringResource("revanced_hide_feed_survey_summary_off", "Feed surveys are shown") - ), - SwitchPreference( - "revanced_hide_community_guidelines", - StringResource("revanced_hide_community_guidelines_title", "Hide community guidelines"), - StringResource( - "revanced_hide_community_guidelines_summary_on", - "Community guidelines are hidden" - ), - StringResource( - "revanced_hide_community_guidelines_summary_off", - "Community guidelines are shown" - ) - ), - SwitchPreference( - "revanced_hide_subscribers_community_guidelines", - StringResource( - "revanced_hide_subscribers_community_guidelines_title", - "Hide subscribers community guidelines" - ), - StringResource( - "revanced_hide_subscribers_community_guidelines_summary_on", - "Subscribers community guidelines are hidden" - ), - StringResource( - "revanced_hide_subscribers_community_guidelines_summary_off", - "Subscribers community guidelines are shown" - ) - ), - SwitchPreference( - "revanced_hide_channel_member_shelf", - StringResource("revanced_hide_channel_member_shelf_title", "Hide channel member shelf"), - StringResource( - "revanced_hide_channel_member_shelf_summary_on", - "Channel member shelf is hidden" - ), - StringResource( - "revanced_hide_channel_member_shelf_summary_off", - "Channel member shelf is shown" - ) - ), - SwitchPreference( - "revanced_hide_emergency_box", - StringResource("revanced_hide_emergency_box_title", "Hide emergency boxes"), - StringResource("revanced_hide_emergency_box_summary_on", "Emergency boxes are hidden"), - StringResource("revanced_hide_emergency_box_summary_off", "Emergency boxes are shown") - ), - SwitchPreference( - "revanced_hide_info_panels", - StringResource("revanced_hide_info_panels_title", "Hide info panels"), - StringResource("revanced_hide_info_panels_summary_on", "Info panels are hidden"), - StringResource("revanced_hide_info_panels_summary_off", "Info panels are shown") - ), - SwitchPreference( - "revanced_hide_medical_panels", - StringResource("revanced_hide_medical_panels_title", "Hide medical panels"), - StringResource("revanced_hide_medical_panels_summary_on", "Medical panels are hidden"), - StringResource("revanced_hide_medical_panels_summary_off", "Medical panels are shown") - ), - SwitchPreference( - "revanced_hide_channel_bar", - StringResource("revanced_hide_channel_bar_title", "Hide channel bar"), - StringResource("revanced_hide_channel_bar_summary_on", "Channel bar is hidden"), - StringResource("revanced_hide_channel_bar_summary_off", "Channel bar is shown") - ), - SwitchPreference( - "revanced_hide_quick_actions", - StringResource("revanced_hide_quick_actions_title", "Hide quick actions in fullscreen"), - StringResource("revanced_hide_quick_actions_summary_on", "Quick actions are hidden"), - StringResource("revanced_hide_quick_actions_summary_off", "Quick actions are shown") - ), - SwitchPreference( - "revanced_hide_related_videos", - StringResource("revanced_hide_related_videos_title", "Hide related videos in quick actions"), - StringResource("revanced_hide_related_videos_summary_on", "Related videos are hidden"), - StringResource("revanced_hide_related_videos_summary_off", "Related videos are shown") - ), - SwitchPreference( - "revanced_hide_image_shelf", - StringResource("revanced_hide_image_shelf", "Hide image shelf in search results"), - StringResource("revanced_hide_image_shelf_summary_on", "Image shelf is hidden"), - StringResource("revanced_hide_image_shelf_summary_off", "Image shelf is shown") - ), - SwitchPreference( - "revanced_hide_latest_posts_ads", - StringResource("revanced_hide_latest_posts_ads_title", "Hide latest posts"), - StringResource("revanced_hide_latest_posts_ads_summary_on", "Latest posts are hidden"), - StringResource("revanced_hide_latest_posts_ads_summary_off", "Latest posts are shown") - ), - SwitchPreference( - "revanced_hide_mix_playlists", - StringResource("revanced_hide_mix_playlists_title", "Hide mix playlists"), - StringResource("revanced_hide_mix_playlists_summary_on", "Mix playlists are hidden"), - StringResource("revanced_hide_mix_playlists_summary_off", "Mix playlists are shown") - ), - SwitchPreference( - "revanced_hide_artist_cards", - StringResource("revanced_hide_artist_cards_title", "Hide artist cards"), - StringResource("revanced_hide_artist_cards_on", "Artist cards are hidden"), - StringResource("revanced_hide_artist_cards_off", "Artist cards are shown") - ), - SwitchPreference( - "revanced_hide_chips_shelf", - StringResource("revanced_hide_chips_shelf_title", "Hide chips shelf"), - StringResource("revanced_hide_chips_shelf_on", "Chips shelf is hidden"), - StringResource("revanced_hide_chips_shelf_off", "Chips shelf is shown") - ), - PreferenceScreen( + SwitchPreference("revanced_hide_gray_separator"), + SwitchPreference("revanced_hide_join_membership_button"), + SwitchPreference("revanced_hide_channel_watermark"), + SwitchPreference("revanced_hide_for_you_shelf"), + SwitchPreference("revanced_hide_notify_me_button"), + SwitchPreference("revanced_hide_timed_reactions"), + SwitchPreference("revanced_hide_search_result_recommendations"), + SwitchPreference("revanced_hide_search_result_shelf_header"), + SwitchPreference("revanced_hide_channel_guidelines"), + SwitchPreference("revanced_hide_expandable_chip"), + SwitchPreference("revanced_hide_video_quality_menu_footer"), + SwitchPreference("revanced_hide_chapters"), + SwitchPreference("revanced_hide_community_posts"), + SwitchPreference("revanced_hide_compact_banner"), + SwitchPreference("revanced_hide_movies_section"), + SwitchPreference("revanced_hide_feed_survey"), + SwitchPreference("revanced_hide_community_guidelines"), + SwitchPreference("revanced_hide_subscribers_community_guidelines"), + SwitchPreference("revanced_hide_channel_member_shelf"), + SwitchPreference("revanced_hide_emergency_box"), + SwitchPreference("revanced_hide_info_panels"), + SwitchPreference("revanced_hide_medical_panels"), + SwitchPreference("revanced_hide_channel_bar"), + SwitchPreference("revanced_hide_quick_actions"), + SwitchPreference("revanced_hide_related_videos"), + SwitchPreference("revanced_hide_image_shelf"), + SwitchPreference("revanced_hide_latest_posts_ads"), + SwitchPreference("revanced_hide_mix_playlists"), + SwitchPreference("revanced_hide_artist_cards"), + SwitchPreference("revanced_hide_chips_shelf"), + app.revanced.patches.shared.misc.settings.preference.PreferenceScreen( "revanced_hide_description_components_preference_screen", - StringResource( - "revanced_hide_description_components_preference_screen_title", - "Hide components in the video description" - ), - listOf( - SwitchPreference( - "revanced_hide_info_cards_section", - StringResource( - "revanced_hide_info_cards_section_title", - "Hide info cards section" - ), - StringResource( - "revanced_hide_info_cards_section_summary_on", - "Info cards section is hidden" - ), - StringResource( - "revanced_hide_info_cards_section_summary_off", - "Info cards section is shown" - ) - ), - SwitchPreference( - "revanced_hide_game_section", - StringResource( - "revanced_hide_game_section_title", - "Hide game section" - ), - StringResource( - "revanced_hide_game_section_summary_on", - "Game section is hidden" - ), - StringResource( - "revanced_hide_game_section_summary_off", - "Game section is shown" - ) - ), - SwitchPreference( - "revanced_hide_music_section", - StringResource( - "revanced_hide_music_section_title", - "Hide music section" - ), - StringResource( - "revanced_hide_music_section_summary_on", - "Music section is hidden" - ), - StringResource( - "revanced_hide_music_section_summary_off", - "Music section is shown" - ) - ), - SwitchPreference( - "revanced_hide_podcast_section", - StringResource( - "revanced_hide_podcast_section_title", - "Hide podcast section" - ), - StringResource( - "revanced_hide_podcast_section_summary_on", - "Podcast section is hidden" - ), - StringResource( - "revanced_hide_podcast_section_summary_off", - "Podcast section is shown" - ) - ), - SwitchPreference( - "revanced_hide_transcript_section", - StringResource( - "revanced_hide_transcript_section_title", - "Hide transcript section" - ), - StringResource( - "revanced_hide_transcript_section_summary_on", - "Transcript section is hidden" - ), - StringResource( - "revanced_hide_transcript_section_summary_off", - "Transcript section is shown" - ) - ), - ), - StringResource( - "revanced_hide_description_components_preference_screen_summary", - "Hide components under the video description" + preferences = setOf( + SwitchPreference("revanced_hide_info_cards_section"), + SwitchPreference("revanced_hide_game_section"), + SwitchPreference("revanced_hide_music_section"), + SwitchPreference("revanced_hide_podcast_section"), + SwitchPreference("revanced_hide_transcript_section"), ) ), - PreferenceScreen( + app.revanced.patches.shared.misc.settings.preference.PreferenceScreen( "revanced_custom_filter_preference_screen", - StringResource("revanced_custom_filter_preference_screen_title", "Custom filter"), - listOf( - SwitchPreference( - "revanced_custom_filter", - StringResource( - "revanced_custom_filter_title", - "Enable custom filter" - ), - StringResource( - "revanced_custom_filter_summary_on", - "Custom filter is enabled" - ), - StringResource( - "revanced_custom_filter_summary_off", - "Custom filter is disabled" - ) - ), + preferences = setOf( + SwitchPreference("revanced_custom_filter"), // TODO: This should be a dynamic ListPreference, which does not exist yet - TextPreference( - "revanced_custom_filter_strings", - StringResource("revanced_custom_filter_strings_title", "Custom filter"), - StringResource( - "revanced_custom_filter_strings_summary", - "List of component path builder strings to filter separated by new line" - ), - inputType = InputType.TEXT_MULTI_LINE - ) - ), - StringResource( - "revanced_custom_filter_preference_screen_summary", - "Hide components using custom filters" + TextPreference("revanced_custom_filter_strings", inputType = InputType.TEXT_MULTI_LINE) ) ) ) @@ -444,24 +120,21 @@ object HideLayoutComponentsPatch : BytecodePatch( // region Mix playlists ParseElementFromBufferFingerprint.result?.let { result -> - val returnEmptyComponentInstruction = result.mutableMethod.getInstructions() - .last { it.opcode == Opcode.INVOKE_STATIC } + val returnEmptyComponentInstruction = + result.mutableMethod.getInstructions().last { it.opcode == Opcode.INVOKE_STATIC } result.mutableMethod.apply { val consumeByteBufferIndex = result.scanResult.patternScanResult!!.startIndex val conversionContextRegister = getInstruction(consumeByteBufferIndex - 2).registerA - val byteBufferRegister = - getInstruction(consumeByteBufferIndex).registerD + val byteBufferRegister = getInstruction(consumeByteBufferIndex).registerD addInstructionsWithLabels( - consumeByteBufferIndex, - """ + consumeByteBufferIndex, """ invoke-static {v$conversionContextRegister, v$byteBufferRegister}, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->filterMixPlaylists(Ljava/lang/Object;[B)Z move-result v0 # Conveniently same register happens to be free. if-nez v0, :return_empty_component - """, - ExternalLabel("return_empty_component", returnEmptyComponentInstruction) + """, ExternalLabel("return_empty_component", returnEmptyComponentInstruction) ) } @@ -478,8 +151,7 @@ object HideLayoutComponentsPatch : BytecodePatch( removeInstruction(index) addInstructions( - index, - """ + index, """ invoke-static {}, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->showWatermark()Z move-result p2 """ diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfocardsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfocardsResourcePatch.kt index fe3220fa..cde96076 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfocardsResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfocardsResourcePatch.kt @@ -3,29 +3,25 @@ package app.revanced.patches.youtube.layout.hide.infocards import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( dependencies = [ SettingsPatch::class, - ResourceMappingPatch::class + ResourceMappingPatch::class, + AddResourcesPatch::class ], ) object HideInfocardsResourcePatch : ResourcePatch() { internal var drawerResourceId: Long = -1 override fun execute(context: ResourceContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_info_cards", - StringResource("revanced_hide_info_cards_title", "Hide info cards"), - StringResource("revanced_hide_info_cards_summary_on", "Info cards are hidden"), - StringResource("revanced_hide_info_cards_summary_off", "Info cards are shown") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_hide_info_cards")) drawerResourceId = ResourceMappingPatch.resourceMappings.single { it.type == "id" && it.name == "info_cards_drawer_header" diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonResourcePatch.kt index 1d07c570..4ab73f3a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/loadmorebutton/HideLoadMoreButtonResourcePatch.kt @@ -3,29 +3,25 @@ package app.revanced.patches.youtube.layout.hide.loadmorebutton import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( dependencies = [ SettingsPatch::class, - ResourceMappingPatch::class + ResourceMappingPatch::class, + AddResourcesPatch::class ] ) internal object HideLoadMoreButtonResourcePatch : ResourcePatch() { internal var expandButtonDownId: Long = -1 override fun execute(context: ResourceContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_load_more_button", - StringResource("revanced_hide_load_more_button_title", "Hide \\\'Load More\\\' button"), - StringResource("revanced_hide_load_more_button_summary_on", "Button is hidden"), - StringResource("revanced_hide_load_more_button_summary_off", "Button is shown") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_hide_load_more_button")) expandButtonDownId = ResourceMappingPatch.resourceMappings.single { it.type == "layout" && it.name == "expand_button_down" diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt index 32af2363..e69de29b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressPatch.kt @@ -1,58 +0,0 @@ -package app.revanced.patches.youtube.layout.hide.personalinformation - -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.youtube.layout.hide.personalinformation.fingerprints.AccountSwitcherAccessibilityLabelFingerprint -import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch -import app.revanced.util.exception -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction - -@Deprecated("This patch is no longer working and will be removed in a future release.") -@Patch( - description = "Hides the email address in the account switcher.", - dependencies = [IntegrationsPatch::class, HideEmailAddressResourcePatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", [ - "18.32.39", - "18.37.36", - "18.38.44", - "18.43.45", - "18.44.41", - "18.45.43", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39", - "19.03.35" - ] - ) - ] -) -@Suppress("unused") -object HideEmailAddressPatch : BytecodePatch( - setOf(AccountSwitcherAccessibilityLabelFingerprint) -) { - override fun execute(context: BytecodeContext) { - AccountSwitcherAccessibilityLabelFingerprint.result?.let { - it.mutableMethod.apply { - val setVisibilityConstIndex = it.scanResult.patternScanResult!!.endIndex - - val setVisibilityConstRegister = - getInstruction(setVisibilityConstIndex - 2).registerA - - addInstructions( - setVisibilityConstIndex, - """ - invoke-static {v$setVisibilityConstRegister}, Lapp/revanced/integrations/youtube/patches/HideEmailAddressPatch;->hideEmailAddress(I)I - move-result v$setVisibilityConstRegister - """ - ) - } - } ?: throw AccountSwitcherAccessibilityLabelFingerprint.exception - } -} diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressResourcePatch.kt deleted file mode 100644 index 3838d0dc..00000000 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/HideEmailAddressResourcePatch.kt +++ /dev/null @@ -1,30 +0,0 @@ -package app.revanced.patches.youtube.layout.hide.personalinformation - -import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference -import app.revanced.patches.youtube.misc.settings.SettingsPatch - -@Patch(dependencies = [SettingsPatch::class, ResourceMappingPatch::class]) -@Suppress("unused") -internal object HideEmailAddressResourcePatch : ResourcePatch() { - internal var accountSwitcherAccessibilityLabelId: Long = -1 - - override fun execute(context: ResourceContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_email_address", - StringResource("revanced_hide_email_address_title", "Hide email in account switcher"), - StringResource("revanced_hide_email_address_summary_on", "Email address is hidden"), - StringResource("revanced_hide_email_address_summary_off", "Email address is shown") - ) - ) - - accountSwitcherAccessibilityLabelId = ResourceMappingPatch.resourceMappings.single { - it.type == "string" && it.name == "account_switcher_accessibility_label" - }.id - } -} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt deleted file mode 100644 index 6ea89a8d..00000000 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/personalinformation/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt +++ /dev/null @@ -1,20 +0,0 @@ -package app.revanced.patches.youtube.layout.hide.personalinformation.fingerprints - -import app.revanced.patches.youtube.layout.hide.personalinformation.HideEmailAddressResourcePatch -import app.revanced.util.patch.LiteralValueFingerprint -import com.android.tools.smali.dexlib2.Opcode - -internal object AccountSwitcherAccessibilityLabelFingerprint : LiteralValueFingerprint( - returnType = "V", - parameters = listOf("L", "Ljava/lang/Object;"), - opcodes = listOf( - Opcode.INVOKE_VIRTUAL, - Opcode.IGET_OBJECT, - Opcode.IGET_OBJECT, - Opcode.NEW_ARRAY, - Opcode.CONST_4, - Opcode.APUT_OBJECT, - Opcode.CONST, - ), - literalSupplier = { HideEmailAddressResourcePatch.accountSwitcherAccessibilityLabelId } -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt index aa7d7bdf..4449fed8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt @@ -4,9 +4,9 @@ import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.PreferenceScreen -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.litho.filter.LithoFilterPatch import app.revanced.patches.youtube.misc.playertype.PlayerTypeHookPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch @@ -17,7 +17,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch dependencies = [ LithoFilterPatch::class, PlayerTypeHookPatch::class, - SettingsPatch::class + SettingsPatch::class, + AddResourcesPatch::class ], compatiblePackages = [ CompatiblePackage( @@ -45,73 +46,23 @@ object HidePlayerFlyoutMenuPatch : ResourcePatch() { "Lapp/revanced/integrations/youtube/patches/components/PlayerFlyoutMenuItemsFilter;" override fun execute(context: ResourceContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( PreferenceScreen( - KEY, - StringResource("${KEY}_title", "Player flyout menu items"), - listOf( - SwitchPreference( - "${KEY}_captions", - StringResource("${KEY}_captions_title", "Hide Captions menu"), - StringResource("${KEY}_captions_on", "Captions menu item is hidden"), - StringResource("${KEY}_captions_off", "Captions menu item is shown") - ), - SwitchPreference( - "${KEY}_additional_settings", - StringResource("${KEY}_additional_settings_title", "Hide Additional settings menu"), - StringResource("${KEY}_additional_settings_on", "Additional settings menu item is hidden"), - StringResource("${KEY}_additional_settings_off", "Additional settings menu item is shown") - ), - SwitchPreference( - "${KEY}_loop_video", - StringResource("${KEY}_loop_video_title", "Hide Loop video menu"), - StringResource("${KEY}_loop_video_on", "Loop video menu item is hidden"), - StringResource("${KEY}_loop_video_off", "Loop video menu item is shown") - ), - SwitchPreference( - "${KEY}_ambient_mode", - StringResource("${KEY}_ambient_mode_title", "Hide Ambient mode menu"), - StringResource("${KEY}_ambient_mode_on", "Ambient mode menu item is hidden"), - StringResource("${KEY}_ambient_mode_off", "Ambient mode menu item is shown") - ), - SwitchPreference( - "${KEY}_report", - StringResource("${KEY}_report_title", "Hide Report menu"), - StringResource("${KEY}_report_on", "Report menu item is hidden"), - StringResource("${KEY}_report_off", "Report menu item is shown") - ), - SwitchPreference( - "${KEY}_help", - StringResource("${KEY}_help_title", "Hide Help menu"), - StringResource("${KEY}_help_on", "Help menu item is hidden"), - StringResource("${KEY}_help_off", "Help menu item is shown") - ), - SwitchPreference( - "${KEY}_speed", - StringResource("${KEY}_speed_title", "Hide Speed menu"), - StringResource("${KEY}_speed_on", "Speed menu item is hidden"), - StringResource("${KEY}_speed_off", "Speed menu item is shown") - ), - SwitchPreference( - "${KEY}_more_info", - StringResource("${KEY}_more_info_title", "Hide More info menu"), - StringResource("${KEY}_more_info_on", "More info menu item is hidden"), - StringResource("${KEY}_more_info_off", "More info menu item is shown") - ), - SwitchPreference( - "${KEY}_audio_track", - StringResource("${KEY}_audio_track_title", "Hide Audio track menu"), - StringResource("${KEY}_audio_track_on", "Audio track menu item is hidden"), - StringResource("${KEY}_audio_track_off", "Audio track menu item is shown") - ), - SwitchPreference( - "${KEY}_watch_in_vr", - StringResource("${KEY}_watch_in_vr_title", "Hide Watch in VR menu"), - StringResource("${KEY}_watch_in_vr_on", "Watch in VR menu item is hidden"), - StringResource("${KEY}_watch_in_vr_off", "Watch in VR menu item is shown") - ), + key = KEY, + preferences = setOf( + SwitchPreference("${KEY}_captions"), + SwitchPreference("${KEY}_additional_settings"), + SwitchPreference("${KEY}_loop_video"), + SwitchPreference("${KEY}_ambient_mode"), + SwitchPreference("${KEY}_report"), + SwitchPreference("${KEY}_help"), + SwitchPreference("${KEY}_speed"), + SwitchPreference("${KEY}_more_info"), + SwitchPreference("${KEY}_audio_track"), + SwitchPreference("${KEY}_watch_in_vr"), ), - StringResource("${KEY}_summary", "Manage the visibility of player flyout menu items") ) ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt index 396ff5e0..d9cb1c2c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.layout.hide.rollingnumber -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels @@ -9,17 +8,18 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.patches.youtube.shared.fingerprints.RollingNumberTextViewAnimationUpdateFingerprint +import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( name = "Disable rolling number animations", description = "Adds an option to disable rolling number animations of video view count, user likes, and upload time.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ @@ -45,13 +45,10 @@ object DisableRollingNumberAnimationPatch : BytecodePatch( "Lapp/revanced/integrations/youtube/patches/DisableRollingNumberAnimationsPatch;" override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_disable_rolling_number_animations", - StringResource("revanced_disable_rolling_number_animations_title", "Disable rolling number animations"), - StringResource("revanced_disable_rolling_number_animations_summary_on", "Rolling numbers are not animated"), - StringResource("revanced_disable_rolling_number_animations_summary_off", "Rolling numbers are animated") - ) + SwitchPreference("revanced_disable_rolling_number_animations") ) // Animations are disabled by preventing an Image from being applied to the text span, diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt index d1b551ba..92079f30 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt @@ -5,8 +5,8 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWith import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.seekbar.SeekbarColorBytecodePatch import app.revanced.patches.youtube.layout.seekbar.SeekbarPreferencesPatch import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch @@ -21,7 +21,8 @@ import app.revanced.patches.youtube.shared.fingerprints.SeekbarOnDrawFingerprint IntegrationsPatch::class, SettingsPatch::class, SeekbarColorBytecodePatch::class, - SeekbarPreferencesPatch::class + SeekbarPreferencesPatch::class, + AddResourcesPatch::class ], compatiblePackages = [ CompatiblePackage( @@ -46,19 +47,11 @@ object HideSeekbarPatch : BytecodePatch( setOf(SeekbarFingerprint) ) { override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + SeekbarPreferencesPatch.addPreferences( - SwitchPreference( - "revanced_hide_seekbar", - StringResource("revanced_hide_seekbar_title", "Hide seekbar in video player"), - StringResource("revanced_hide_seekbar_summary_on", "Video player seekbar is hidden"), - StringResource("revanced_hide_seekbar_summary_off", "Video player seekbar is shown") - ), - SwitchPreference( - "revanced_hide_seekbar_thumbnail", - StringResource("revanced_hide_seekbar_thumbnail_title", "Hide seekbar in video thumbnails"), - StringResource("revanced_hide_seekbar_thumbnail_summary_on", "Thumbnail seekbar is hidden"), - StringResource("revanced_hide_seekbar_thumbnail_summary_off", "Thumbnail seekbar is shown") - ) + SwitchPreference("revanced_hide_seekbar"), + SwitchPreference("revanced_hide_seekbar_thumbnail") ) SeekbarFingerprint.result!!.let { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index 87c371d8..46a3d232 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -10,7 +10,7 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch import app.revanced.patches.youtube.layout.hide.shorts.fingerprints.* import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.litho.filter.LithoFilterPatch diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsResourcePatch.kt index d5ba0378..b9f411fe 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsResourcePatch.kt @@ -3,97 +3,37 @@ package app.revanced.patches.youtube.layout.hide.shorts import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.PreferenceScreen -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch -@Patch(dependencies = [SettingsPatch::class, ResourceMappingPatch::class]) +@Patch(dependencies = [SettingsPatch::class, ResourceMappingPatch::class, AddResourcesPatch::class]) object HideShortsComponentsResourcePatch : ResourcePatch() { internal var reelMultipleItemShelfId = -1L internal var reelPlayerRightCellButtonHeight = -1L override fun execute(context: ResourceContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( PreferenceScreen( "revanced_shorts_preference_screen", - StringResource("revanced_shorts_preference_screen_title", "Shorts components"), - listOf( - SwitchPreference( - "revanced_hide_shorts", - StringResource("revanced_hide_shorts_title", "Hide Shorts in feed"), - StringResource("revanced_hide_shorts_on", "Shorts are hidden"), - StringResource("revanced_hide_shorts_off", "Shorts are shown") - ), - SwitchPreference( - "revanced_hide_shorts_join_button", - StringResource("revanced_hide_shorts_join_button_title", "Hide join button"), - StringResource("revanced_hide_shorts_join_button_on", "Join button is hidden"), - StringResource("revanced_hide_shorts_join_button_off", "Join button is shown") - ), - SwitchPreference( - "revanced_hide_shorts_subscribe_button", - StringResource("revanced_hide_shorts_subscribe_button_title", "Hide subscribe button"), - StringResource("revanced_hide_shorts_subscribe_button_on", "Subscribe button is hidden"), - StringResource("revanced_hide_shorts_subscribe_button_off", "Subscribe button is shown") - ), - SwitchPreference( - "revanced_hide_shorts_subscribe_button_paused", - StringResource("revanced_hide_shorts_subscribe_button_paused_title", "Hide subscribe button when paused"), - StringResource("revanced_hide_shorts_subscribe_button_paused_on", "Subscribe button is hidden"), - StringResource("revanced_hide_shorts_subscribe_button_paused_off", "Subscribe button is shown") - ), - SwitchPreference( - "revanced_hide_shorts_thanks_button", - StringResource("revanced_hide_shorts_thanks_button_title", "Hide thanks button"), - StringResource("revanced_hide_shorts_thanks_button_on", "Thanks button is hidden"), - StringResource("revanced_hide_shorts_thanks_button_off", "Thanks button is shown") - ), - SwitchPreference( - "revanced_hide_shorts_comments_button", - StringResource("revanced_hide_shorts_comments_button_title", "Hide comments button"), - StringResource("revanced_hide_shorts_comments_button_on", "Comments button is hidden"), - StringResource("revanced_hide_shorts_comments_button_off", "Comments button is shown") - ), - SwitchPreference( - "revanced_hide_shorts_remix_button", - StringResource("revanced_hide_shorts_remix_button_title", "Hide remix button"), - StringResource("revanced_hide_shorts_remix_button_on", "Remix button is hidden"), - StringResource("revanced_hide_shorts_remix_button_off", "Remix button is shown") - ), - SwitchPreference( - "revanced_hide_shorts_share_button", - StringResource("revanced_hide_shorts_share_button_title", "Hide share button"), - StringResource("revanced_hide_shorts_share_button_on", "Share button is hidden"), - StringResource("revanced_hide_shorts_share_button_off", "Share button is shown") - ), - SwitchPreference( - "revanced_hide_shorts_info_panel", - StringResource("revanced_hide_shorts_info_panel_title", "Hide info panel"), - StringResource("revanced_hide_shorts_info_panel_on", "Info panel is hidden"), - StringResource("revanced_hide_shorts_info_panel_off", "Info panel is shown") - ), - SwitchPreference( - "revanced_hide_shorts_channel_bar", - StringResource("revanced_hide_shorts_channel_bar_title", "Hide channel bar"), - StringResource("revanced_hide_shorts_channel_bar_on", "Channel bar is hidden"), - StringResource("revanced_hide_shorts_channel_bar_off", "Channel bar is shown") - ), - SwitchPreference( - "revanced_hide_shorts_sound_button", - StringResource("revanced_hide_shorts_sound_button_title", "Hide sound button"), - StringResource("revanced_hide_shorts_sound_button_on", "Sound button is hidden"), - StringResource("revanced_hide_shorts_sound_button_off", "Sound button is shown") - ), - SwitchPreference( - "revanced_hide_shorts_navigation_bar", - StringResource("revanced_hide_shorts_navigation_bar_title", "Hide navigation bar"), - StringResource("revanced_hide_shorts_navigation_bar_on", "Navigation bar is hidden"), - StringResource("revanced_hide_shorts_navigation_bar_off", "Navigation bar is shown") - ) - ), - StringResource("revanced_shorts_preference_screen_summary", "Manage the visibility of Shorts components") + preferences = setOf( + SwitchPreference("revanced_hide_shorts"), + SwitchPreference("revanced_hide_shorts_join_button"), + SwitchPreference("revanced_hide_shorts_subscribe_button"), + SwitchPreference("revanced_hide_shorts_subscribe_button_paused"), + SwitchPreference("revanced_hide_shorts_thanks_button"), + SwitchPreference("revanced_hide_shorts_comments_button"), + SwitchPreference("revanced_hide_shorts_remix_button"), + SwitchPreference("revanced_hide_shorts_share_button"), + SwitchPreference("revanced_hide_shorts_info_panel"), + SwitchPreference("revanced_hide_shorts_channel_bar"), + SwitchPreference("revanced_hide_shorts_sound_button"), + SwitchPreference("revanced_hide_shorts_navigation_bar") + ) ) ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenResourcePatch.kt index f43faaee..b190b321 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenResourcePatch.kt @@ -3,37 +3,26 @@ package app.revanced.patches.youtube.layout.hide.suggestedvideoendscreen import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( dependencies = [ SettingsPatch::class, - ResourceMappingPatch::class + ResourceMappingPatch::class, + AddResourcesPatch::class ], ) internal object DisableSuggestedVideoEndScreenResourcePatch : ResourcePatch() { internal var sizeAdjustableLiteAutoNavOverlay: Long = -1 override fun execute(context: ResourceContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_disable_suggested_video_end_screen", - StringResource( - "revanced_disable_suggested_video_end_screen_title", - "Disable suggested video end screen" - ), - StringResource( - "revanced_disable_suggested_video_end_screen_summary_on", - "Suggested videos will be disabled" - ), - StringResource( - "revanced_disable_suggested_video_end_screen_summary_off", - "Suggested videos will be shown" - ), - ) + SwitchPreference("revanced_disable_suggested_video_end_screen") ) sizeAdjustableLiteAutoNavOverlay = ResourceMappingPatch.resourceMappings.single { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt index 3f253272..665f5f67 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt @@ -1,21 +1,21 @@ package app.revanced.patches.youtube.layout.hide.time -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.hide.time.fingerprints.TimeCounterFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception @Patch( name = "Hide timestamp", description = "Adds an option to hide the timestamp in the bottom left of the video player.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ @@ -38,14 +38,9 @@ object HideTimestampPatch : BytecodePatch( setOf(TimeCounterFingerprint) ) { override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_timestamp", - StringResource("revanced_hide_timestamp_title", "Hide video timestamp"), - StringResource("revanced_hide_timestamp_summary_on", "Timestamp is hidden"), - StringResource("revanced_hide_timestamp_summary_off", "Timestamp is shown") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_hide_timestamp")) TimeCounterFingerprint.result?.apply { mutableMethod.addInstructionsWithLabels( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt index fa537124..f4d1acf0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt @@ -1,21 +1,21 @@ package app.revanced.patches.youtube.layout.panels.popup -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.panels.popup.fingerprints.EngagementPanelControllerFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception @Patch( name = "Disable player popup panels", description = "Adds an option to disable panels (such as live chat) from opening automatically.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ @@ -39,14 +39,9 @@ object PlayerPopupPanelsPatch : BytecodePatch( setOf(EngagementPanelControllerFingerprint) ) { override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_player_popup_panels", - StringResource("revanced_hide_player_popup_panels_title", "Hide player popup panels"), - StringResource("revanced_hide_player_popup_panels_summary_on", "Player popup panels are hidden"), - StringResource("revanced_hide_player_popup_panels_summary_off", "Player popup panels are shown") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_hide_player_popup_panels")) val engagementPanelControllerMethod = EngagementPanelControllerFingerprint .result?.mutableMethod ?: throw EngagementPanelControllerFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityResourcePatch.kt index 78649a6a..a409030c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityResourcePatch.kt @@ -3,32 +3,23 @@ package app.revanced.patches.youtube.layout.player.overlay import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.InputType -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.TextPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.InputType +import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( - dependencies = [SettingsPatch::class, ResourceMappingPatch::class] + dependencies = [SettingsPatch::class, ResourceMappingPatch::class, AddResourcesPatch::class] ) internal object CustomPlayerOverlayOpacityResourcePatch : ResourcePatch() { internal var scrimOverlayId = -1L override fun execute(context: ResourceContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - TextPreference( - "revanced_player_overlay_opacity", - StringResource( - "revanced_player_overlay_opacity_title", - "Player overlay opacity" - ), - StringResource( - "revanced_player_overlay_opacity_summary", - "Opacity value between 0-100, where 0 is transparent" - ), - InputType.NUMBER - ) + TextPreference("revanced_player_overlay_opacity", inputType = InputType.NUMBER) ) scrimOverlayId = ResourceMappingPatch.resourceMappings.single { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikeResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikeResourcePatch.kt index de38d671..848b86af 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikeResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikeResourcePatch.kt @@ -3,28 +3,31 @@ package app.revanced.patches.youtube.layout.returnyoutubedislike import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.Preference -import app.revanced.patches.shared.settings.preference.impl.StringResource +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.IntentPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch -import app.revanced.util.mergeStrings @Patch( - dependencies = [SettingsPatch::class] + dependencies = [ + SettingsPatch::class, + AddResourcesPatch::class + ] ) internal object ReturnYouTubeDislikeResourcePatch : ResourcePatch() { internal var oldUIDislikeId: Long = -1 override fun execute(context: ResourceContext) { - SettingsPatch.addPreference( - Preference( - StringResource("revanced_ryd_settings_title", "Return YouTube Dislike"), - StringResource("revanced_ryd_settings_summary", "Settings for Return YouTube Dislike"), - SettingsPatch.createReVancedSettingsIntent("ryd_settings") + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( + IntentPreference( + "revanced_ryd_settings", + intent = SettingsPatch.newIntent("revanced_ryd_settings_intent") ) ) - // merge strings - context.mergeStrings("returnyoutubedislike/host/values/strings.xml") + + AddResourcesPatch(this::class) oldUIDislikeId = ResourceMappingPatch.resourceMappings.single { it.type == "id" && it.name == "dislike_button" diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt index f4ecefbb..30b979b5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.layout.searchbar -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.fingerprint.MethodFingerprint @@ -8,17 +7,18 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.searchbar.fingerprints.CreateSearchSuggestionsFingerprint import app.revanced.patches.youtube.layout.searchbar.fingerprints.SetWordmarkHeaderFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception @Patch( name = "Wide searchbar", description = "Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ @@ -44,14 +44,9 @@ object WideSearchbarPatch : BytecodePatch( ) ) { override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_wide_searchbar", - StringResource("revanced_wide_searchbar_enabled_title", "Enable wide search bar"), - StringResource("revanced_wide_searchbar_summary_on", "Wide search bar is enabled"), - StringResource("revanced_wide_searchbar_summary_off", "Wide search bar is disabled") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_wide_searchbar")) val result = CreateSearchSuggestionsFingerprint.result ?: throw CreateSearchSuggestionsFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt index 5325960e..a8f5932d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt @@ -1,21 +1,21 @@ package app.revanced.patches.youtube.layout.seekbar -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstructions import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.seekbar.fingerprints.FullscreenSeekbarThumbnailsFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch +import app.revanced.util.exception @Patch( name = "Restore old seekbar thumbnails", description = "Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.", - dependencies = [IntegrationsPatch::class, SeekbarPreferencesPatch::class], + dependencies = [IntegrationsPatch::class, SeekbarPreferencesPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ @@ -41,23 +41,9 @@ object RestoreOldSeekbarThumbnailsPatch : BytecodePatch( "Lapp/revanced/integrations/youtube/patches/RestoreOldSeekbarThumbnailsPatch;" override fun execute(context: BytecodeContext) { - SeekbarPreferencesPatch.addPreferences( - SwitchPreference( - "revanced_restore_old_seekbar_thumbnails", - StringResource( - "revanced_restore_old_seekbar_thumbnails_title", - "Restore old seekbar thumbnails" - ), - StringResource( - "revanced_restore_old_seekbar_thumbnails_summary_on", - "Seekbar thumbnails will appear above the seekbar" - ), - StringResource( - "revanced_restore_old_seekbar_thumbnails_summary_off", - "Seekbar thumbnails will appear in fullscreen" - ), - ) - ) + AddResourcesPatch(this::class) + + SeekbarPreferencesPatch.addPreferences(SwitchPreference("revanced_restore_old_seekbar_thumbnails")) FullscreenSeekbarThumbnailsFingerprint.result?.mutableMethod?.apply { val moveResultIndex = getInstructions().lastIndex - 1 diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorResourcePatch.kt index 9f774a60..5c7d6272 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorResourcePatch.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch import org.w3c.dom.Element diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarPreferencesPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarPreferencesPatch.kt index dcdf6f67..0a9f7e27 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarPreferencesPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarPreferencesPatch.kt @@ -3,31 +3,28 @@ package app.revanced.patches.youtube.layout.seekbar import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.BasePreference -import app.revanced.patches.shared.settings.preference.impl.PreferenceScreen -import app.revanced.patches.shared.settings.preference.impl.StringResource +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.BasePreference +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen import app.revanced.patches.youtube.misc.settings.SettingsPatch import java.io.Closeable -@Patch(dependencies = [SettingsPatch::class, ResourceMappingPatch::class]) +@Patch(dependencies = [SettingsPatch::class, ResourceMappingPatch::class, AddResourcesPatch::class]) internal object SeekbarPreferencesPatch : ResourcePatch(), Closeable { - private val seekbarPreferences = mutableListOf() + private val seekbarPreferences = mutableSetOf() override fun execute(context: ResourceContext) { // Nothing to do here. All work is done in close method. } override fun close() { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( PreferenceScreen( "revanced_seekbar_preference_screen", - StringResource("revanced_seekbar_preference_screen_title", "Seekbar"), - seekbarPreferences, - StringResource( - "revanced_seekbar_preference_screen_summary", - "Settings for the seekbar" - ) + preferences = seekbarPreferences, ) ) } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt index 382512f3..e8ce6f19 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockBytecodePatch.kt @@ -11,7 +11,7 @@ import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch import app.revanced.patches.youtube.layout.sponsorblock.fingerprints.AppendTimeFingerprint import app.revanced.patches.youtube.layout.sponsorblock.fingerprints.ControlsOverlayFingerprint import app.revanced.patches.youtube.layout.sponsorblock.fingerprints.RectangleFieldInvalidatorFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockResourcePatch.kt index c3cb068e..a8c347b2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockResourcePatch.kt @@ -1,55 +1,52 @@ package app.revanced.patches.youtube.layout.sponsorblock import app.revanced.patcher.data.ResourceContext +import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.Preference -import app.revanced.patches.shared.settings.preference.impl.StringResource +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.IntentPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.util.ResourceGroup import app.revanced.util.copyResources import app.revanced.util.copyXmlNode -import app.revanced.util.mergeStrings +import app.revanced.util.inputStreamFromBundledResource -@Patch(dependencies = [SettingsPatch::class, ResourceMappingPatch::class]) +@Patch( + dependencies = [ + SettingsPatch::class, + ResourceMappingPatch::class, + AddResourcesPatch::class + ] +) internal object SponsorBlockResourcePatch : ResourcePatch() { override fun execute(context: ResourceContext) { - SettingsPatch.addPreference( - Preference( - StringResource("revanced_sponsorblock_settings_title", "SponsorBlock"), - StringResource("revanced_sponsorblock_settings_summary", "SponsorBlock related settings"), - SettingsPatch.createReVancedSettingsIntent("sponsorblock_settings") + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( + IntentPreference( + "revanced_sb_settings", + intent = SettingsPatch.newIntent("revanced_sb_settings_intent") ) ) - val classLoader = this.javaClass.classLoader - - /* - merge SponsorBlock strings to main strings - */ - context.mergeStrings("sponsorblock/host/values/strings.xml") - - /* - merge SponsorBlock drawables to main drawables - */ - arrayOf( ResourceGroup( "layout", - "inline_sponsor_overlay.xml", - "new_segment.xml", - "skip_sponsor_button.xml" + "revanced_sb_inline_sponsor_overlay.xml", + "revanced_sb_new_segment.xml", + "revanced_sb_skip_sponsor_button.xml" ), ResourceGroup( // required resource for back button, because when the base APK is used, this resource will not exist "drawable", - "ic_sb_adjust.xml", - "ic_sb_compare.xml", - "ic_sb_edit.xml", - "ic_sb_logo.xml", - "ic_sb_publish.xml", - "ic_sb_voting.xml" + "revanced_sb_adjust.xml", + "revanced_sb_compare.xml", + "revanced_sb_edit.xml", + "revanced_sb_logo.xml", + "revanced_sb_publish.xml", + "revanced_sb_voting.xml" ), ResourceGroup( // required resource for back button, because when the base APK is used, this resource will not exist @@ -59,14 +56,14 @@ internal object SponsorBlockResourcePatch : ResourcePatch() { context.copyResources("sponsorblock", resourceGroup) } - /* - merge xml nodes from the host to their real xml files - */ - // copy nodes from host resources to their real xml files - val hostingResourceStream = - classLoader.getResourceAsStream("sponsorblock/host/layout/youtube_controls_layout.xml")!! + val hostingResourceStream = inputStreamFromBundledResource( + "sponsorblock", + "host/layout/youtube_controls_layout.xml" + )!! + + var modifiedControlsLayout = false val targetXmlEditor = context.xmlEditor["res/layout/youtube_controls_layout.xml"] "RelativeLayout".copyXmlNode( context.xmlEditor[hostingResourceStream], @@ -82,12 +79,15 @@ internal object SponsorBlockResourcePatch : ResourcePatch() { if (!(view.hasAttributes() && view.attributes.getNamedItem("android:id").nodeValue.endsWith("live_chat_overlay_button"))) continue // voting button id from the voting button view from the youtube_controls_layout.xml host file - val votingButtonId = "@+id/sb_voting_button" + val votingButtonId = "@+id/revanced_sb_voting_button" view.attributes.getNamedItem("android:layout_toStartOf").nodeValue = votingButtonId + modifiedControlsLayout = true break } - }.close() // close afterwards + }.close() + + if (!modifiedControlsLayout) throw PatchException("Could not modify controls layout") } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index 1f312970..efa71607 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -1,25 +1,24 @@ package app.revanced.patches.youtube.layout.spoofappversion -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.ArrayResource -import app.revanced.patches.shared.settings.preference.impl.ListPreference -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.ListPreference +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.spoofappversion.fingerprints.SpoofAppVersionFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( name = "Spoof app version", description = "Adds an option to trick YouTube into thinking you are running an older version of the app. " + "This can be used to restore old UI elements and features.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ @@ -42,46 +41,17 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction object SpoofAppVersionPatch : BytecodePatch( setOf(SpoofAppVersionFingerprint) ) { - private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/spoof/SpoofAppVersionPatch;" + private const val INTEGRATIONS_CLASS_DESCRIPTOR = + "Lapp/revanced/integrations/youtube/patches/spoof/SpoofAppVersionPatch;" override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_spoof_app_version", - StringResource("revanced_spoof_app_version_title", "Spoof app version"), - StringResource("revanced_spoof_app_version_summary_on", "Version spoofed"), - StringResource("revanced_spoof_app_version_summary_off", "Version not spoofed"), - StringResource("revanced_spoof_app_version_user_dialog_message", - "App version will be spoofed to an older version of YouTube." - + "\\n\\nThis will change the appearance and features of the app, but unknown side effects may occur." - + "\\n\\nIf later turned off, it is recommended to clear the app data to prevent UI bugs.") - ), + SwitchPreference("revanced_spoof_app_version"), ListPreference( - "revanced_spoof_app_version_target", - StringResource( - "revanced_spoof_app_version_target_title", - "Spoof app version target" - ), - ArrayResource( - "revanced_spoof_app_version_target_entries", - listOf( - StringResource("revanced_spoof_app_version_target_entry_1", "18.33.40 - Restore RYD Shorts incognito mode"), - StringResource("revanced_spoof_app_version_target_entry_2", "18.20.39 - Restore wide video speed & quality menu"), - StringResource("revanced_spoof_app_version_target_entry_3", "17.08.35 - Restore old UI layout"), - StringResource("revanced_spoof_app_version_target_entry_4", "16.08.35 - Restore explore tab"), - StringResource("revanced_spoof_app_version_target_entry_5", "16.01.35 - Restore fewer video player action buttons"), - ) - ), - ArrayResource( - "revanced_spoof_app_version_target_entry_values", - listOf( - StringResource("revanced_spoof_app_version_target_entry_value_1", "18.33.40"), - StringResource("revanced_spoof_app_version_target_entry_value_2", "18.20.39"), - StringResource("revanced_spoof_app_version_target_entry_value_3", "17.08.35"), - StringResource("revanced_spoof_app_version_target_entry_value_4", "16.08.35"), - StringResource("revanced_spoof_app_version_target_entry_value_5", "16.01.35"), - ) - ) + key = "revanced_spoof_app_version_target", + summaryKey = null, ) ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt index 64047aaa..9016385a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt @@ -5,19 +5,18 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.fingerprints.HomeActivityFingerprint -import app.revanced.patches.shared.settings.preference.impl.ArrayResource -import app.revanced.patches.shared.settings.preference.impl.ListPreference -import app.revanced.patches.shared.settings.preference.impl.StringResource +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.youtube.layout.startpage.fingerprints.StartActivityFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.patches.youtube.shared.fingerprints.HomeActivityFingerprint import app.revanced.util.exception @Patch( name = "Change start page", description = "Adds an option to set which page the app opens in instead of the homepage.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube" @@ -32,35 +31,12 @@ object ChangeStartPagePatch : BytecodePatch( "Lapp/revanced/integrations/youtube/patches/ChangeStartPagePatch;" override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( ListPreference( - "revanced_start_page", - StringResource( - "revanced_start_page_title", - "Set start page" - ), - ArrayResource( - "revanced_start_page_entries", - listOf( - StringResource("revanced_start_page_home_entry_0", "Default"), - StringResource("revanced_start_page_home_entry_1", "Home"), - StringResource("revanced_start_page_search_entry_2", "Search"), - StringResource("revanced_start_page_subscriptions_entry_3", "Subscriptions"), - StringResource("revanced_start_page_explore_entry_4", "Explore"), - StringResource("revanced_start_page_shorts_entry_5", "Shorts"), - ) - ), - ArrayResource( - "revanced_start_page_values", - listOf( - StringResource("revanced_start_page_home_value_0", ""), - StringResource("revanced_start_page_home_value_1", "MAIN"), - StringResource("revanced_start_page_search_value_2", "open.search"), - StringResource("revanced_start_page_subscriptions_value_3", "open.subscriptions"), - StringResource("revanced_start_page_explore_value_4", "open.explore"), - StringResource("revanced_start_page_shorts_value_5", "open.shorts"), - ) - ) + key = "revanced_start_page", + summaryKey = null, ) ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt index 8764fd2d..caef4295 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt @@ -1,21 +1,21 @@ package app.revanced.patches.youtube.layout.startupshortsreset -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.startupshortsreset.fingerprints.UserWasInShortsFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception @Patch( name = "Disable resuming Shorts on startup", description = "Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ @@ -43,13 +43,10 @@ object DisableResumingShortsOnStartupPatch : BytecodePatch( "Lapp/revanced/integrations/youtube/patches/DisableResumingStartupShortsPlayerPatch;" override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_disable_resuming_shorts_player", - StringResource("revanced_disable_resuming_shorts_player_title", "Disable resuming Shorts player"), - StringResource("revanced_disable_resuming_shorts_player_summary_on", "Shorts player will not resume on app startup"), - StringResource("revanced_disable_resuming_shorts_player_summary_off", "Shorts player will resume on app startup") - ) + SwitchPreference("revanced_disable_resuming_shorts_player") ) UserWasInShortsFingerprint.result?.apply { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt index 60521497..10dadae3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.layout.tablet -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction @@ -9,16 +8,17 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.tablet.fingerprints.GetFormFactorFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception @Patch( name = "Enable tablet layout", description = "Adds an option to spoof the device form factor to a tablet which enables the tablet layout.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [CompatiblePackage("com.google.android.youtube")] ) @Suppress("unused") @@ -26,15 +26,9 @@ object EnableTabletLayoutPatch : BytecodePatch( setOf(GetFormFactorFingerprint) ) { override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_tablet_layout", - StringResource("revanced_tablet_layout_enabled_title", "Enable tablet layout"), - StringResource("revanced_tablet_layout_summary_on", "Tablet layout is enabled"), - StringResource("revanced_tablet_layout_summary_off", "Tablet layout is disabled"), - StringResource("revanced_tablet_layout_user_dialog_message", "Community posts do not show up on tablet layouts") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_tablet_layout")) GetFormFactorFingerprint.result?.let { it.mutableMethod.apply { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt index 4ec86e57..bb96c3a6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.layout.tabletminiplayer -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.fingerprint.MethodFingerprint @@ -9,21 +8,22 @@ import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.MiniPlayerDimensionsCalculatorParentFingerprint import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.MiniPlayerOverrideFingerprint import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.MiniPlayerOverrideNoContextFingerprint import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.MiniPlayerResponseModelSizeCheckFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( name = "Tablet mini player", description = "Adds an option to enable the tablet mini player layout.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", arrayOf( @@ -51,14 +51,9 @@ object TabletMiniPlayerPatch : BytecodePatch( ) ) { override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_tablet_miniplayer", - StringResource("revanced_tablet_miniplayer_title", "Enable tablet mini player"), - StringResource("revanced_tablet_miniplayer_summary_on", "Mini player is enabled"), - StringResource("revanced_tablet_miniplayer_summary_off", "Mini player is disabled") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_tablet_miniplayer")) // First resolve the fingerprints via the parent fingerprint. MiniPlayerDimensionsCalculatorParentFingerprint.result diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt index a6e4a9b8..633efd8b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt @@ -1,7 +1,5 @@ package app.revanced.patches.youtube.layout.theme -import app.revanced.util.exception -import app.revanced.util.indexOfFirstWideLiteralInstructionValue import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction @@ -9,12 +7,14 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.seekbar.SeekbarColorBytecodePatch import app.revanced.patches.youtube.layout.theme.fingerprints.UseGradientLoadingScreenFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception +import app.revanced.util.indexOfFirstWideLiteralInstructionValue import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( @@ -25,7 +25,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction SeekbarColorBytecodePatch::class, ThemeResourcePatch::class, IntegrationsPatch::class, - SettingsPatch::class + SettingsPatch::class, + AddResourcesPatch::class ], compatiblePackages = [ CompatiblePackage( @@ -95,20 +96,9 @@ object ThemeBytecodePatch : BytecodePatch( ) override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_gradient_loading_screen", - StringResource("revanced_gradient_loading_screen_title", "Enable gradient loading screen"), - StringResource( - "revanced_gradient_loading_screen_summary_on", - "Loading screen will have a gradient background" - ), - StringResource( - "revanced_gradient_loading_screen_summary_off", - "Loading screen will have a solid background" - ), - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(SwitchPreference("revanced_gradient_loading_screen")) UseGradientLoadingScreenFingerprint.result?.mutableMethod?.apply { val isEnabledIndex = indexOfFirstWideLiteralInstructionValue(GRADIENT_LOADING_SCREEN_AB_CONSTANT) + 3 diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeResourcePatch.kt index f6fc6433..d379514e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeResourcePatch.kt @@ -4,11 +4,11 @@ import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.InputType -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference -import app.revanced.patches.shared.settings.preference.impl.TextPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.InputType +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.layout.seekbar.SeekbarPreferencesPatch import app.revanced.patches.youtube.layout.theme.ThemeBytecodePatch.darkThemeBackgroundColor import app.revanced.patches.youtube.layout.theme.ThemeBytecodePatch.lightThemeBackgroundColor @@ -16,25 +16,22 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch import org.w3c.dom.Element @Patch( - dependencies = [SettingsPatch::class, ResourceMappingPatch::class, SeekbarPreferencesPatch::class] + dependencies = [ + SettingsPatch::class, + ResourceMappingPatch::class, + SeekbarPreferencesPatch::class, + AddResourcesPatch::class + ] ) internal object ThemeResourcePatch : ResourcePatch() { private const val SPLASH_BACKGROUND_COLOR = "revanced_splash_background_color" override fun execute(context: ResourceContext) { + AddResourcesPatch(this::class) + SeekbarPreferencesPatch.addPreferences( - SwitchPreference( - "revanced_seekbar_custom_color", - StringResource("revanced_seekbar_custom_color_title", "Enable custom seekbar color"), - StringResource("revanced_seekbar_custom_color_summary_on", "Custom seekbar color is shown"), - StringResource("revanced_seekbar_custom_color_summary_off", "Original seekbar color is shown") - ), - TextPreference( - "revanced_seekbar_custom_color_value", - StringResource("revanced_seekbar_custom_color_value_title", "Custom seekbar color"), - StringResource("revanced_seekbar_custom_color_value_summary", "The color of the seekbar"), - InputType.TEXT_CAP_CHARACTERS - ) + SwitchPreference("revanced_seekbar_custom_color"), + TextPreference("revanced_seekbar_custom_color_value", inputType = InputType.TEXT_CAP_CHARACTERS) ) // Edit theme colors via resources. @@ -73,9 +70,10 @@ internal object ThemeResourcePatch : ResourcePatch() { if (darkThemeBackgroundColor != null && lightThemeBackgroundColor != null) { val splashScreenResourceFiles = listOf( "res/drawable/quantum_launchscreen_youtube.xml", - "res/drawable-sw600dp/quantum_launchscreen_youtube.xml") + "res/drawable-sw600dp/quantum_launchscreen_youtube.xml" + ) - splashScreenResourceFiles.forEach editSplashScreen@ { resourceFile -> + splashScreenResourceFiles.forEach editSplashScreen@{ resourceFile -> context.xmlEditor[resourceFile].use { val layerList = it.file.getElementsByTagName("layer-list").item(0) as Element diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt index 2a5b8d8a..075eaa0e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt @@ -10,7 +10,8 @@ import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable -import app.revanced.patches.shared.settings.preference.impl.* +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.* import app.revanced.patches.youtube.layout.thumbnails.fingerprints.MessageDigestImageUrlFingerprint import app.revanced.patches.youtube.layout.thumbnails.fingerprints.MessageDigestImageUrlParentFingerprint import app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.RequestFingerprint @@ -30,7 +31,12 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod @Patch( name = "Alternative thumbnails", description = "Adds options to replace video thumbnails using the DeArrow API or image captures from the video.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class, AlternativeThumbnailsResourcePatch::class], + dependencies = [ + IntegrationsPatch::class, + SettingsPatch::class, + AlternativeThumbnailsResourcePatch::class, + AddResourcesPatch::class + ], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", @@ -111,114 +117,38 @@ object AlternativeThumbnailsPatch : BytecodePatch( } override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( PreferenceScreen( "revanced_alt_thumbnail_preference_screen", - StringResource("revanced_alt_thumbnail_preference_screen_title", "Alternative thumbnails"), - listOf( + preferences = setOf( NonInteractivePreference( - StringResource("revanced_alt_thumbnail_about_title", "Thumbnails in use"), + "revanced_alt_thumbnail_about", null, // Summary is dynamically updated based on the current settings. tag = "app.revanced.integrations.youtube.settings.preference.AlternativeThumbnailsStatusPreference" ), - SwitchPreference( - "revanced_alt_thumbnail_dearrow", - StringResource("revanced_alt_thumbnail_dearrow_title", "Enable DeArrow thumbnails"), - StringResource("revanced_alt_thumbnail_dearrow_summary_on", "Using DeArrow thumbnails"), - StringResource("revanced_alt_thumbnail_dearrow_summary_off", "Not using DeArrow thumbnails") - ), - SwitchPreference( - "revanced_alt_thumbnail_dearrow_connection_toast", - StringResource("revanced_alt_thumbnail_dearrow_connection_toast_title", "Show a toast if API is not available"), - StringResource("revanced_alt_thumbnail_dearrow_connection_toast_summary_on", "Toast is shown if DeArrow is not available"), - StringResource("revanced_alt_thumbnail_dearrow_connection_toast_summary_off", "Toast is not shown if DeArrow is not available") - ), - TextPreference( - "revanced_alt_thumbnail_dearrow_api_url", - StringResource( - "revanced_alt_thumbnail_dearrow_api_url_title", - "DeArrow API endpoint" - ), - StringResource( - "revanced_alt_thumbnail_dearrow_api_url_summary", - "The URL of the DeArrow thumbnail cache endpoint. " + - "Do not change this unless you know what you\\\'re doing" - ), - ), + SwitchPreference("revanced_alt_thumbnail_dearrow"), + SwitchPreference("revanced_alt_thumbnail_dearrow_connection_toast"), + TextPreference("revanced_alt_thumbnail_dearrow_api_url"), NonInteractivePreference( - StringResource( - "revanced_alt_thumbnail_dearrow_about_title", - "About DeArrow" - ), - StringResource( - "revanced_alt_thumbnail_dearrow_about_summary", - "DeArrow provides crowd-sourced thumbnails for YouTube videos. " + - "These thumbnails are often more relevant than those provided by YouTube. " + - "If enabled, video URLs will be sent to the API server and no other data is sent" - + "\\n\\nTap here to learn more about DeArrow" - ), + "revanced_alt_thumbnail_dearrow_about", // Custom about preference with link to the DeArrow website. tag = "app.revanced.integrations.youtube.settings.preference.AlternativeThumbnailsAboutDeArrowPreference", selectable = true ), - SwitchPreference( - "revanced_alt_thumbnail_stills", - StringResource("revanced_alt_thumbnail_stills_title", "Enable still video captures"), - StringResource("revanced_alt_thumbnail_stills_summary_on", "Using YouTube still video captures"), - StringResource("revanced_alt_thumbnail_stills_summary_off", "Not using YouTube still video captures") - ), + SwitchPreference("revanced_alt_thumbnail_stills"), ListPreference( "revanced_alt_thumbnail_stills_time", - StringResource("revanced_alt_thumbnail_stills_time_title", "Video time to take the still from"), - ArrayResource( - "revanced_alt_thumbnail_type_entries", - listOf( - StringResource("revanced_alt_thumbnail_stills_time_entry_1", "Beginning of video"), - StringResource("revanced_alt_thumbnail_stills_time_entry_2", "Middle of video"), - StringResource("revanced_alt_thumbnail_stills_time_entry_3", "End of video"), - ) - ), - ArrayResource( - "revanced_alt_thumbnail_stills_time_entry_values", - listOf( - StringResource("revanced_alt_thumbnail_stills_time_entry_value_1", "1"), - StringResource("revanced_alt_thumbnail_stills_time_entry_value_2", "2"), - StringResource("revanced_alt_thumbnail_stills_time_entry_value_3", "3"), - ) - ) - ), - SwitchPreference( - "revanced_alt_thumbnail_stills_fast", - StringResource( - "revanced_alt_thumbnail_stills_fast_title", - "Use fast still captures" - ), - StringResource( - "revanced_alt_thumbnail_stills_fast_summary_on", - "Using medium quality still captures. " + - "Thumbnails will load faster, but live streams, unreleased, " + - "or very old videos may show blank thumbnails" - ), - StringResource( - "revanced_alt_thumbnail_stills_fast_summary_off", - "Using high quality still captures" - ) + summaryKey = null, ), + SwitchPreference("revanced_alt_thumbnail_stills_fast"), NonInteractivePreference( - StringResource( - "revanced_alt_thumbnail_stills_about_title", - "About still video captures" - ), - StringResource( - "revanced_alt_thumbnail_stills_about_summary", - "Still captures are taken from the beginning/middle/end of each video. " + - "These images are built into YouTube and no external API is used" - ), + "revanced_alt_thumbnail_stills_about", // Restore the preference dividers to keep it from looking weird. selectable = true ) - ), - StringResource("revanced_alt_thumbnail_preference_screen_summary", "Video thumbnail settings") + ) ) ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsResourcePatch.kt index 080b2bec..d926b4a4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsResourcePatch.kt @@ -3,14 +3,17 @@ package app.revanced.patches.youtube.layout.thumbnails import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.all.misc.resources.AddResourcesPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch -import app.revanced.util.mergeStrings @Patch( - dependencies = [SettingsPatch::class] + dependencies = [ + SettingsPatch::class, + AddResourcesPatch::class + ] ) internal object AlternativeThumbnailsResourcePatch : ResourcePatch() { override fun execute(context: ResourceContext) { - context.mergeStrings("alternativethumbnails/host/values/strings.xml") + AddResourcesPatch(this::class) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt index 703aa79e..66b01d8e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt @@ -1,23 +1,23 @@ package app.revanced.patches.youtube.misc.announcements -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstructions import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.patches.youtube.shared.fingerprints.MainActivityFingerprint +import app.revanced.util.exception import com.android.tools.smali.dexlib2.Opcode @Patch( name = "Announcements", description = "Adds an option to show announcements from ReVanced on app startup.", compatiblePackages = [CompatiblePackage("com.google.android.youtube")], - dependencies = [SettingsPatch::class] + dependencies = [SettingsPatch::class,AddResourcesPatch::class] ) @Suppress("unused") object AnnouncementsPatch : BytecodePatch( @@ -27,6 +27,10 @@ object AnnouncementsPatch : BytecodePatch( "Lapp/revanced/integrations/youtube/patches/announcements/AnnouncementsPatch;" override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.MISC.addPreferences(SwitchPreference("revanced_announcements")) + val onCreateMethod = MainActivityFingerprint.result?.let { it.mutableClass.methods.find { method -> method.name == "onCreate" } } ?: throw MainActivityFingerprint.exception @@ -38,26 +42,5 @@ object AnnouncementsPatch : BytecodePatch( "invoke-static { v1 }, $INTEGRATIONS_CLASS_DESCRIPTOR->showAnnouncement(Landroid/app/Activity;)V" ) - SettingsPatch.PreferenceScreen.MISC.addPreferences( - SwitchPreference( - "revanced_announcements", - StringResource( - "revanced_announcements_title", - "Show ReVanced announcements" - ), - StringResource( - "revanced_announcements_summary_on", - "Announcements are shown on startup" - ), - StringResource( - "revanced_announcements_summary_off", - "Announcements are not shown on startup" - ), - StringResource( - "revanced_announcements_enabled_summary", - "Show announcements on startup" - ), - ) - ) } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt index f5cefd48..472fa4db 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt @@ -7,8 +7,8 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.autorepeat.fingerprints.AutoRepeatFingerprint import app.revanced.patches.youtube.misc.autorepeat.fingerprints.AutoRepeatParentFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch @@ -18,7 +18,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Always repeat", description = "Adds an option to always repeat videos when they end.", - dependencies = [IntegrationsPatch::class], + dependencies = [IntegrationsPatch::class,AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", @@ -43,14 +43,9 @@ object AutoRepeatPatch : BytecodePatch( setOf(AutoRepeatParentFingerprint) ) { override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.MISC.addPreferences( - SwitchPreference( - "revanced_auto_repeat", - StringResource("revanced_auto_repeat_title", "Enable auto-repeat"), - StringResource("revanced_auto_repeat_summary_on", "Auto-repeat is enabled"), - StringResource("revanced_auto_repeat_summary_off", "Auto-repeat is disabled") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.MISC.addPreferences(SwitchPreference("revanced_auto_repeat")) //Get Result from the ParentFingerprint which is the playMethod we need to get. val parentResult = AutoRepeatParentFingerprint.result diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/DebuggingPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/DebuggingPatch.kt index a2ad3a6a..01576ee2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/DebuggingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/DebuggingPatch.kt @@ -4,64 +4,32 @@ import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( name = "Enable debugging", description = "Adds options for debugging.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [CompatiblePackage("com.google.android.youtube")] ) @Suppress("unused") object DebuggingPatch : ResourcePatch() { override fun execute(context: ResourceContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.MISC.addPreferences( - app.revanced.patches.shared.settings.preference.impl.PreferenceScreen( + PreferenceScreen( "revanced_debug_preference_screen", - StringResource("revanced_debug_preference_screen_title", "Debugging"), - listOf( - SwitchPreference( - "revanced_debug", - StringResource("revanced_debug_title", "Debug logging"), - StringResource("revanced_debug_summary_on", "Debug logs are enabled"), - StringResource("revanced_debug_summary_off", "Debug logs are disabled") - ), - SwitchPreference( - "revanced_debug_protobuffer", - StringResource( - "revanced_debug_protobuffer_title", - "Log protocol buffer" - ), - StringResource("revanced_debug_protobuffer_summary_on", "Debug logs include proto buffer"), - StringResource("revanced_debug_protobuffer_summary_off", "Debug logs do not include proto buffer") - ), - SwitchPreference( - "revanced_debug_stacktrace", - StringResource( - "revanced_debug_stacktrace_title", - "Log stack traces" - ), - StringResource("revanced_debug_stacktrace_summary_on", "Debug logs include stack trace"), - StringResource("revanced_debug_stacktrace_summary_off", "Debug logs do not include stack trace") - ), - SwitchPreference( - "revanced_debug_toast_on_error", - StringResource( - "revanced_debug_toast_on_error_title", - "Show toast on ReVanced error" - ), - StringResource("revanced_debug_toast_on_error_summary_on", "Toast shown if error occurs"), - StringResource("revanced_debug_toast_on_error_summary_off", "Toast not shown if error occurs"), - StringResource("revanced_debug_toast_on_error_user_dialog_message", - "Turning off error toasts hides all ReVanced error notifications." - + "\\n\\nYou will not be notified of any unexpected events." - ) - ), - ), - StringResource("revanced_debug_preference_screen_summary", "Enable or disable debugging options") + preferences = setOf( + SwitchPreference("revanced_debug"), + SwitchPreference("revanced_debug_protobuffer"), + SwitchPreference("revanced_debug_stacktrace"), + SwitchPreference("revanced_debug_toast_on_error") + ) ) ) } diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt index 444321c9..4374787d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt @@ -1,21 +1,21 @@ package app.revanced.patches.youtube.misc.dimensions.spoof -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.dimensions.spoof.fingerprints.DeviceDimensionsModelToStringFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception @Patch( name = "Spoof device dimensions", description = "Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren't available on the device.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", @@ -41,18 +41,9 @@ object SpoofDeviceDimensionsPatch : BytecodePatch( "Lapp/revanced/integrations/youtube/patches/spoof/SpoofDeviceDimensionsPatch;" override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.MISC.addPreferences( - SwitchPreference( - "revanced_spoof_device_dimensions", - StringResource("revanced_spoof_device_dimensions_title", "Spoof device dimensions"), - StringResource("revanced_spoof_device_dimensions_summary_on", "Device dimensions spoofed"), - StringResource( - "revanced_spoof_device_dimensions_summary_off", - "Device dimensions not spoofed\\n\\n" - + "Spoofing the device dimensions can unlock higher video qualities but unknown side effects may occur" - ), - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.MISC.addPreferences(SwitchPreference("revanced_spoof_device_dimensions",)) DeviceDimensionsModelToStringFingerprint.result ?.mutableClass?.methods?.find { method -> method.name == "" } diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofSignaturePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofSignaturePatch.kt index 7b9512d4..0bcfcf27 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofSignaturePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofSignaturePatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.misc.fix.playback -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels @@ -9,14 +8,15 @@ import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.settings.preference.impl.PreferenceScreen -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.fix.playback.fingerprints.* import app.revanced.patches.youtube.misc.playertype.PlayerTypeHookPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.patches.youtube.video.information.VideoInformationPatch import app.revanced.patches.youtube.video.playerresponse.PlayerResponseMethodHookPatch +import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction @@ -27,7 +27,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction PlayerTypeHookPatch::class, PlayerResponseMethodHookPatch::class, VideoInformationPatch::class, - SpoofSignatureResourcePatch::class + SpoofSignatureResourcePatch::class, + AddResourcesPatch::class ] ) object SpoofSignaturePatch : BytecodePatch( @@ -46,67 +47,16 @@ object SpoofSignaturePatch : BytecodePatch( "Lapp/revanced/integrations/youtube/patches/spoof/SpoofSignaturePatch;" override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.MISC.addPreferences( PreferenceScreen( "revanced_spoof_signature_verification", - StringResource( - "revanced_spoof_signature_verification_title", - "Spoof app signature" + preferences = setOf( + SwitchPreference("revanced_spoof_signature_verification_enabled"), + SwitchPreference("revanced_spoof_signature_in_feed_enabled"), + SwitchPreference("revanced_spoof_storyboard") ), - listOf( - SwitchPreference( - "revanced_spoof_signature_verification_enabled", - StringResource("revanced_spoof_signature_verification_enabled_title", "Spoof app signature"), - StringResource( - "revanced_spoof_signature_verification_enabled_summary_on", - "App signature spoofed\\n\\n" - + "Side effects include:\\n" - + "• Enhanced bitrate is not available\\n" - + "• Videos cannot be downloaded\\n" - + "• No seekbar thumbnails for paid videos" - ), - StringResource( - "revanced_spoof_signature_verification_enabled_summary_off", - "App signature not spoofed\\n\\nVideo playback may not work" - ), - StringResource( - "revanced_spoof_signature_verification_enabled_user_dialog_message", - "Turning off this setting will cause video playback issues." - ) - ), - SwitchPreference( - "revanced_spoof_signature_in_feed_enabled", - StringResource("revanced_spoof_signature_in_feed_enabled_title", "Spoof app signature in feed"), - StringResource( - "revanced_spoof_signature_in_feed_enabled_summary_on", - "App signature spoofed\\n\\n" - + "Side effects include:\\n" - + "• Feed videos are missing subtitles\\n" - + "• Automatically played feed videos will show up in your watch history" - ), - StringResource( - "revanced_spoof_signature_in_feed_enabled_summary_off", - "App signature not spoofed for feed videos\\n\\n" - + "Feed videos will play for less than 1 minute before encountering playback issues" - ) - ), - SwitchPreference( - "revanced_spoof_storyboard", - StringResource("revanced_spoof_storyboard_title", "Spoof storyboard"), - StringResource("revanced_spoof_storyboard_summary_on", "Storyboard spoofed"), - StringResource( - "revanced_spoof_storyboard_summary_off", - "Storyboard not spoofed\\n\\n" - + "Side effects include:\\n" - + "• No ambient mode\\n" - + "• Seekbar thumbnails are hidden" - ) - ) - ), - StringResource( - "revanced_spoof_signature_verification_summary", - "Spoof the app signature to prevent playback issues" - ) ) ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofSignatureResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofSignatureResourcePatch.kt index 884d1237..54bfa754 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofSignatureResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofSignatureResourcePatch.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.misc.fix.playback import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch(dependencies = [SettingsPatch::class, ResourceMappingPatch::class]) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt index fb952775..ff73df5a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt @@ -1,20 +1,19 @@ package app.revanced.patches.youtube.misc.gms -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patches.shared.fingerprints.HomeActivityFingerprint -import app.revanced.patches.shared.misc.gms.AbstractGmsCoreSupportPatch +import app.revanced.patches.shared.fingerprints.CastContextFetchFingerprint +import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch import app.revanced.patches.youtube.layout.buttons.cast.HideCastButtonPatch import app.revanced.patches.youtube.misc.fix.playback.ClientSpoofPatch import app.revanced.patches.youtube.misc.gms.Constants.REVANCED_YOUTUBE_PACKAGE_NAME import app.revanced.patches.youtube.misc.gms.Constants.YOUTUBE_PACKAGE_NAME import app.revanced.patches.youtube.misc.gms.GmsCoreSupportResourcePatch.gmsCoreVendorOption import app.revanced.patches.youtube.misc.gms.fingerprints.* -import app.revanced.util.exception +import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch +import app.revanced.patches.youtube.shared.fingerprints.HomeActivityFingerprint @Suppress("unused") -object GmsCoreSupportPatch : AbstractGmsCoreSupportPatch( +object GmsCoreSupportPatch : BaseGmsCoreSupportPatch( fromPackageName = YOUTUBE_PACKAGE_NAME, toPackageName = REVANCED_YOUTUBE_PACKAGE_NAME, primeMethodFingerprint = PrimeMethodFingerprint, @@ -25,11 +24,13 @@ object GmsCoreSupportPatch : AbstractGmsCoreSupportPatch( CastDynamiteModuleV2Fingerprint, CastContextFetchFingerprint ), + mainActivityOnCreateFingerprint = HomeActivityFingerprint, + integrationsPatchDependency = IntegrationsPatch::class, dependencies = setOf( HideCastButtonPatch::class, ClientSpoofPatch::class ), - abstractGmsCoreSupportResourcePatch = GmsCoreSupportResourcePatch, + gmsCoreSupportResourcePatch = GmsCoreSupportResourcePatch, compatiblePackages = setOf( CompatiblePackage( "com.google.android.youtube", setOf( @@ -48,18 +49,7 @@ object GmsCoreSupportPatch : AbstractGmsCoreSupportPatch( CastDynamiteModuleV2Fingerprint, CastContextFetchFingerprint, PrimeMethodFingerprint, - HomeActivityFingerprint, ) ) { override val gmsCoreVendor by gmsCoreVendorOption - - override fun execute(context: BytecodeContext) { - // Check the availability of GmsCore. - HomeActivityFingerprint.result?.mutableMethod?.addInstruction( - 0, - "invoke-static {}, Lapp/revanced/integrations/youtube/patches/GmsCoreSupport;->checkAvailability()V" - ) ?: throw HomeActivityFingerprint.exception - - super.execute(context) - } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportResourcePatch.kt index 8482704d..151e1b6c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportResourcePatch.kt @@ -1,33 +1,32 @@ package app.revanced.patches.youtube.misc.gms import app.revanced.patcher.data.ResourceContext -import app.revanced.patches.all.misc.packagename.ChangePackageNamePatch -import app.revanced.patches.shared.misc.gms.AbstractGmsCoreSupportResourcePatch -import app.revanced.patches.shared.settings.preference.impl.Preference -import app.revanced.patches.shared.settings.preference.impl.StringResource +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportResourcePatch +import app.revanced.patches.shared.misc.settings.preference.IntentPreference import app.revanced.patches.youtube.misc.gms.Constants.REVANCED_YOUTUBE_PACKAGE_NAME import app.revanced.patches.youtube.misc.gms.Constants.YOUTUBE_PACKAGE_NAME import app.revanced.patches.youtube.misc.settings.SettingsPatch -object GmsCoreSupportResourcePatch : AbstractGmsCoreSupportResourcePatch( +object GmsCoreSupportResourcePatch : BaseGmsCoreSupportResourcePatch( fromPackageName = YOUTUBE_PACKAGE_NAME, toPackageName = REVANCED_YOUTUBE_PACKAGE_NAME, spoofedPackageSignature = "24bb24c05e47e0aefa68a58a766179d9b613a600", - dependencies = setOf(SettingsPatch::class) + dependencies = setOf(SettingsPatch::class, AddResourcesPatch::class) ) { override fun execute(context: ResourceContext) { - SettingsPatch.addPreference( - Preference( - StringResource("microg_settings", "GmsCore Settings"), - StringResource("microg_settings_summary", "Settings for GmsCore"), - Preference.Intent("$gmsCoreVendor.android.gms", "", "org.microg.gms.ui.SettingsActivity") + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.MISC.addPreferences( + IntentPreference( + "microg_settings", + intent = IntentPreference.Intent("", "org.microg.gms.ui.SettingsActivity") { + "$gmsCoreVendor.android.gms" + } ) ) - val packageName = ChangePackageNamePatch.setOrGetFallbackPackageName(REVANCED_YOUTUBE_PACKAGE_NAME) - SettingsPatch.renameIntentsTargetPackage(packageName) - super.execute(context) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/IntegrationsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/IntegrationsPatch.kt index 7a1d842d..ed161b25 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/IntegrationsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/IntegrationsPatch.kt @@ -1,11 +1,11 @@ package app.revanced.patches.youtube.misc.integrations import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.integrations.AbstractIntegrationsPatch +import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch import app.revanced.patches.youtube.misc.integrations.fingerprints.* @Patch(requiresIntegrations = true) -object IntegrationsPatch : AbstractIntegrationsPatch( +object IntegrationsPatch : BaseIntegrationsPatch( setOf( ApplicationInitFingerprint, StandalonePlayerActivityFingerprint, diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/APIPlayerServiceFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/APIPlayerServiceFingerprint.kt index 52495091..ca4ad846 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/APIPlayerServiceFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/APIPlayerServiceFingerprint.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.misc.integrations.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.shared.integrations.AbstractIntegrationsPatch.IntegrationsFingerprint +import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint import com.android.tools.smali.dexlib2.AccessFlags /** diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/ApplicationInitFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/ApplicationInitFingerprint.kt index 346fb916..0cc958cb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/ApplicationInitFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/ApplicationInitFingerprint.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.misc.integrations.fingerprints -import app.revanced.patches.shared.integrations.AbstractIntegrationsPatch.IntegrationsFingerprint +import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint /** * Hooks the context when the app is launched as a regular application (and is not an embedded video playback). diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/EmbeddedPlayerControlsOverlayFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/EmbeddedPlayerControlsOverlayFingerprint.kt index 65b7d089..1b575406 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/EmbeddedPlayerControlsOverlayFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/EmbeddedPlayerControlsOverlayFingerprint.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.misc.integrations.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.shared.integrations.AbstractIntegrationsPatch.IntegrationsFingerprint +import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint import com.android.tools.smali.dexlib2.AccessFlags /** diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/EmbeddedPlayerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/EmbeddedPlayerFingerprint.kt index 0e6ddaf6..fbc2ab0d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/EmbeddedPlayerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/EmbeddedPlayerFingerprint.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.misc.integrations.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.shared.integrations.AbstractIntegrationsPatch.IntegrationsFingerprint +import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint import com.android.tools.smali.dexlib2.AccessFlags /** diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/RemoteEmbedFragmentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/RemoteEmbedFragmentFingerprint.kt index 4079d7e3..77eeec32 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/RemoteEmbedFragmentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/RemoteEmbedFragmentFingerprint.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.misc.integrations.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.shared.integrations.AbstractIntegrationsPatch.IntegrationsFingerprint +import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint import com.android.tools.smali.dexlib2.AccessFlags /** diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/RemoteEmbeddedPlayerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/RemoteEmbeddedPlayerFingerprint.kt index 6b3961d5..196994f4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/RemoteEmbeddedPlayerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/RemoteEmbeddedPlayerFingerprint.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.misc.integrations.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.shared.integrations.AbstractIntegrationsPatch.IntegrationsFingerprint +import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint import com.android.tools.smali.dexlib2.AccessFlags /** diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/StandalonePlayerActivityFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/StandalonePlayerActivityFingerprint.kt index dbe1d9bc..9148f5fd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/StandalonePlayerActivityFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/StandalonePlayerActivityFingerprint.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.misc.integrations.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.shared.integrations.AbstractIntegrationsPatch.IntegrationsFingerprint +import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint import com.android.tools.smali.dexlib2.AccessFlags /** diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt index a07ed78c..663c72fd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt @@ -1,24 +1,24 @@ package app.revanced.patches.youtube.misc.links -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.links.fingerprints.ABUriParserFingerprint import app.revanced.patches.youtube.misc.links.fingerprints.HTTPUriParserFingerprint import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @Patch( name = "Bypass URL redirects", description = "Adds an option to bypass URL redirects and open the original URL directly.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", @@ -40,14 +40,9 @@ object BypassURLRedirectsPatch : BytecodePatch( setOf(ABUriParserFingerprint, HTTPUriParserFingerprint) ) { override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.MISC.addPreferences( - SwitchPreference( - "revanced_bypass_url_redirects", - StringResource("revanced_bypass_url_redirects_title", "Bypass URL redirects"), - StringResource("revanced_bypass_url_redirects_summary_on", "URL redirects are bypassed"), - StringResource("revanced_bypass_url_redirects_summary_off", "URL redirects are not bypassed"), - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.MISC.addPreferences(SwitchPreference("revanced_bypass_url_redirects" )) mapOf( ABUriParserFingerprint to 7, // Offset to Uri.parse. diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt index c29c71b8..2fa9f823 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt @@ -5,10 +5,10 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.all.misc.transformation.BaseTransformInstructionsPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch -import app.revanced.patches.all.misc.transformation.AbstractTransformInstructionsPatch import com.android.tools.smali.dexlib2.iface.ClassDef import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.Instruction @@ -19,6 +19,7 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference @Patch( name = "Open links externally", description = "Adds an option to always open links in your browser instead of in the in-app-browser.", + dependencies = [SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", @@ -39,7 +40,7 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference ] ) @Suppress("unused") -object OpenLinksExternallyPatch : AbstractTransformInstructionsPatch>( +object OpenLinksExternallyPatch : BaseTransformInstructionsPatch>( ) { override fun filterMap( classDef: ClassDef, method: Method, instruction: Instruction, instructionIndex: Int @@ -66,14 +67,9 @@ object OpenLinksExternallyPatch : AbstractTransformInstructionsPatch Background" - ) + "revanced_minimized_playback_enabled", + "revanced_minimized_playback_summary_on", + // Use horizontal dividers to keep the settings from looking weird. + // If PreferenceCategories are added, then this should be removed. + selectable = true ) ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/BottomControlsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/BottomControlsResourcePatch.kt index 23afdbb0..6dcc92c7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/BottomControlsResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/BottomControlsResourcePatch.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.DomFileEditor -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch import java.io.Closeable @Patch(dependencies = [ResourceMappingPatch::class]) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt index 9048e71c..811836d4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.misc.privacy -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction @@ -10,20 +9,21 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.privacy.fingerprints.CopyTextFingerprint import app.revanced.patches.youtube.misc.privacy.fingerprints.SystemShareSheetFingerprint import app.revanced.patches.youtube.misc.privacy.fingerprints.YouTubeShareSheetFingerprint import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @Patch( name = "Remove tracking query parameter", description = "Adds an option to remove the tracking info from links you share.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", @@ -47,23 +47,9 @@ object RemoveTrackingQueryParameterPatch : BytecodePatch( private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/RemoveTrackingQueryParameterPatch;" override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.MISC.addPreferences( - SwitchPreference( - "revanced_remove_tracking_query_parameter", - StringResource( - "revanced_remove_tracking_query_parameter_title", - "Remove tracking query parameter" - ), - StringResource( - "revanced_remove_tracking_query_parameter_summary_on", - "Tracking query parameter is removed from links" - ), - StringResource( - "revanced_remove_tracking_query_parameter_summary_off", - "Tracking query parameter is not removed from links" - ), - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.MISC.addPreferences(SwitchPreference("revanced_remove_tracking_query_parameter")) fun MethodFingerprint.hook( getInsertIndex: PatternScanResult.() -> Int, diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt index d3eb504b..d2360b8f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt @@ -7,8 +7,12 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.Preference -import app.revanced.patches.shared.settings.util.AbstractPreferenceScreen +import app.revanced.patches.all.misc.packagename.ChangePackageNamePatch +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.InputType +import app.revanced.patches.shared.misc.settings.preference.IntentPreference +import app.revanced.patches.shared.misc.settings.preference.TextPreference +import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.fingerprints.LicenseActivityOnCreateFingerprint import app.revanced.patches.youtube.misc.settings.fingerprints.SetThemeFingerprint @@ -20,7 +24,12 @@ import java.io.Closeable @Patch( description = "Adds settings for ReVanced to YouTube.", - dependencies = [IntegrationsPatch::class, SettingsResourcePatch::class] + dependencies = [ + ChangePackageNamePatch::class, + IntegrationsPatch::class, + SettingsResourcePatch::class, + AddResourcesPatch::class + ] ) object SettingsPatch : BytecodePatch( setOf(LicenseActivityOnCreateFingerprint, SetThemeFingerprint) @@ -32,6 +41,18 @@ object SettingsPatch : BytecodePatch( private const val SET_THEME_METHOD_NAME: String = "setTheme" override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + + PreferenceScreen.MISC.addPreferences( + TextPreference( + key = null, + titleKey = "revanced_pref_import_export_title", + summaryKey = "revanced_pref_import_export_summary", + inputType = InputType.TEXT_MULTI_LINE, + tag = "app.revanced.integrations.shared.settings.preference.ImportExportPreference" + ) + ) + SetThemeFingerprint.result?.mutableMethod?.let { setThemeMethod -> setThemeMethod.implementation!!.instructions.mapIndexedNotNull { i, instruction -> if (instruction.opcode == Opcode.RETURN_OBJECT) i else null @@ -72,39 +93,26 @@ object SettingsPatch : BytecodePatch( } ?: throw LicenseActivityOnCreateFingerprint.exception } - fun addString(identifier: String, value: String, formatted: Boolean = true) = - SettingsResourcePatch.addString(identifier, value, formatted) - - fun addPreferenceScreen(preferenceScreen: app.revanced.patches.shared.settings.preference.impl.PreferenceScreen) = - SettingsResourcePatch.addPreferenceScreen(preferenceScreen) - - fun addPreference(preference: Preference) = SettingsResourcePatch.addPreference(preference) - - fun renameIntentsTargetPackage(newPackage: String) { - SettingsResourcePatch.overrideIntentsTargetPackage = newPackage + /** + * Creates an intent to open ReVanced settings. + */ + fun newIntent(settingsName: String) = IntentPreference.Intent( + data = settingsName, + targetClass = "com.google.android.libraries.social.licenses.LicenseActivity" + ) { + // The package name change has to be reflected in the intent. + ChangePackageNamePatch.setOrGetFallbackPackageName("com.google.android.apps.youtube") } - /** - * Creates an intent to open ReVanced settings of the given name - */ - fun createReVancedSettingsIntent(settingsName: String) = Preference.Intent( - "com.google.android.youtube", - settingsName, - "com.google.android.libraries.social.licenses.LicenseActivity" - ) + object PreferenceScreen : BasePreferenceScreen() { + val ADS = Screen("revanced_ads_screen") + val INTERACTIONS = Screen("revanced_interactions_screen") + val LAYOUT = Screen("revanced_layout_screen") + val VIDEO = Screen("revanced_video_screen") + val MISC = Screen("revanced_misc_screen") - /** - * Preference screens patches should add their settings to. - */ - object PreferenceScreen : AbstractPreferenceScreen() { - val ADS = Screen("ads", "Ads", "Ad related settings") - val INTERACTIONS = Screen("interactions", "Interaction", "Settings related to interactions") - val LAYOUT = Screen("layout", "Layout", "Settings related to the layout") - val VIDEO = Screen("video", "Video", "Settings related to the video player") - val MISC = Screen("misc", "Misc", "Miscellaneous patches") - - override fun commit(screen: app.revanced.patches.shared.settings.preference.impl.PreferenceScreen) { - addPreferenceScreen(screen) + override fun commit(screen: app.revanced.patches.shared.misc.settings.preference.PreferenceScreen) { + SettingsResourcePatch += screen } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsResourcePatch.kt index a4a5243c..b4b50461 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsResourcePatch.kt @@ -1,63 +1,48 @@ package app.revanced.patches.youtube.misc.settings import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.DomFileEditor -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.AbstractSettingsResourcePatch -import app.revanced.patches.shared.settings.preference.addPreference -import app.revanced.patches.shared.settings.preference.impl.* +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.BaseSettingsResourcePatch +import app.revanced.patches.shared.misc.settings.preference.IntentPreference import app.revanced.util.ResourceGroup import app.revanced.util.copyResources -import app.revanced.util.mergeStrings import org.w3c.dom.Element -import org.w3c.dom.Node -@Patch( - dependencies = [ResourceMappingPatch::class] -) -object SettingsResourcePatch : AbstractSettingsResourcePatch( - "revanced_prefs", - "settings" +object SettingsResourcePatch : BaseSettingsResourcePatch( + IntentPreference( + "revanced_settings", + intent = SettingsPatch.newIntent("revanced_settings_intent") + ) to "settings_fragment", + dependencies = setOf( + ResourceMappingPatch::class, + AddResourcesPatch::class, + ) ) { // Used for a fingerprint from SettingsPatch. internal var appearanceStringId = -1L - // if this is not null, all intents will be renamed to this - internal var overrideIntentsTargetPackage: String? = null - - private var preferencesNode: Node? = null - - private var preferencesEditor: DomFileEditor? = null - set(value) { - field = value - preferencesNode = value.getNode("PreferenceScreen") - } - override fun execute(context: ResourceContext) { super.execute(context) + AddResourcesPatch(this::class) + // Used for a fingerprint from SettingsPatch. appearanceStringId = ResourceMappingPatch.resourceMappings.find { it.type == "string" && it.name == "app_theme_appearance_dark" }!!.id - /* - * copy layout resources - */ arrayOf( ResourceGroup("layout", "revanced_settings_with_toolbar.xml") ).forEach { resourceGroup -> context.copyResources("settings", resourceGroup) } - preferencesEditor = context.xmlEditor["res/xml/settings_fragment.xml"] - - // Modify the manifest and add an data intent filter to the LicenseActivity. + // Modify the manifest and add a data intent filter to the LicenseActivity. // Some devices freak out if undeclared data is passed to an intent, // and this change appears to fix the issue. context.xmlEditor["AndroidManifest.xml"].use { editor -> - // An xml regular expression would probably work better than this manual searching. + // A xml regular-expression would probably work better than this manual searching. val manifestNodes = editor.file.getElementsByTagName("manifest").item(0).childNodes for (i in 0..manifestNodes.length) { val node = manifestNodes.item(i) @@ -79,88 +64,5 @@ object SettingsResourcePatch : AbstractSettingsResourcePatch( } } } - - - // Add the ReVanced settings to the YouTube settings - SettingsPatch.addPreference( - Preference( - StringResource("revanced_settings", "ReVanced"), - StringResource("revanced_settings_summary", "ReVanced specific settings"), - SettingsPatch.createReVancedSettingsIntent("revanced_settings") - ) - ) - - SettingsPatch.PreferenceScreen.MISC.addPreferences( - TextPreference( - key = null, - title = StringResource("revanced_pref_import_export_title", "Import / Export"), - summary = StringResource("revanced_pref_import_export_summary", "Import / Export ReVanced settings"), - inputType = InputType.TEXT_MULTI_LINE, - tag = "app.revanced.integrations.shared.settings.preference.ImportExportPreference" - ) - ) } - - override fun close() { - super.close() - - // rename the intent package names if it was set - overrideIntentsTargetPackage?.let { packageName -> - val preferences = preferencesEditor!!.getNode("PreferenceScreen").childNodes - for (i in 1 until preferences.length) { - val preferenceNode = preferences.item(i) - // preferences have a child node with the intent tag, skip over every other node - if (preferenceNode.childNodes.length == 0) continue - - val intentNode = preferenceNode.firstChild - - // if the node doesn't have a target package attribute, skip it - val targetPackageAttribute = intentNode.attributes.getNamedItem("android:targetPackage") ?: continue - - // do not replace intent target package if the package name is not from YouTube - val youtubePackage = "com.google.android.youtube" - if (targetPackageAttribute.nodeValue != youtubePackage) continue - - // replace the target package name - intentNode.attributes.setNamedItem(preferenceNode.ownerDocument.createAttribute("android:targetPackage") - .also { attribute -> - attribute.value = packageName - }) - } - } - - preferencesEditor?.close() - } - - /** - * Add a preference fragment to the main preferences. - * - * @param preference The preference to add. - */ - internal fun addPreference(preference: Preference) = - preferencesNode!!.addPreference(preference) { it.include() } - - /** - * Add a new string to the resources. - * - * @param identifier The key of the string. - * @param value The value of the string. - * @throws IllegalArgumentException if the string already exists. - */ - internal fun addString(identifier: String, value: String, formatted: Boolean) = - AbstractSettingsResourcePatch.addString(identifier, value, formatted) - - /** - * Add an array to the resources. - * - * @param arrayResource The array resource to add. - */ - internal fun addArray(arrayResource: ArrayResource) = AbstractSettingsResourcePatch.addArray(arrayResource) - - /** - * Add a preference to the settings. - * - * @param preferenceScreen The name of the preference screen. - */ - internal fun addPreferenceScreen(preferenceScreen: PreferenceScreen) = addPreference(preferenceScreen) } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/settings/fingerprints/SetThemeFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/settings/fingerprints/SetThemeFingerprint.kt index 28d9d411..caf19d42 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/settings/fingerprints/SetThemeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/settings/fingerprints/SetThemeFingerprint.kt @@ -12,4 +12,4 @@ internal object SetThemeFingerprint : LiteralValueFingerprint( parameters = listOf(), opcodes = listOf(Opcode.RETURN_OBJECT), literalSupplier = { SettingsResourcePatch.appearanceStringId } -) \ No newline at end of file +) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt index 458b6f25..aadee4ab 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt @@ -7,15 +7,15 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.patches.youtube.misc.zoomhaptics.fingerprints.ZoomHapticsFingerprint @Patch( name = "Disable zoom haptics", description = "Adds an option to disable haptics when zooming.", - dependencies = [SettingsPatch::class], + dependencies = [SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [CompatiblePackage("com.google.android.youtube")] ) @Suppress("unused") @@ -23,14 +23,9 @@ object ZoomHapticsPatch : BytecodePatch( setOf(ZoomHapticsFingerprint) ) { override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.MISC.addPreferences( - SwitchPreference( - "revanced_disable_zoom_haptics", - StringResource("revanced_disable_zoom_haptics_title", "Disable zoom haptics"), - StringResource("revanced_disable_zoom_haptics_summary_on", "Haptics are disabled"), - StringResource("revanced_disable_zoom_haptics_summary_off", "Haptics are enabled") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.MISC.addPreferences(SwitchPreference("revanced_disable_zoom_haptics")) val zoomHapticsFingerprintMethod = ZoomHapticsFingerprint.result!!.mutableMethod diff --git a/src/main/kotlin/app/revanced/patches/youtube/shared/fingerprints/HomeActivityFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shared/fingerprints/HomeActivityFingerprint.kt new file mode 100644 index 00000000..f54b9ee7 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/shared/fingerprints/HomeActivityFingerprint.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.youtube.shared.fingerprints + +import app.revanced.patcher.fingerprint.MethodFingerprint + +internal object HomeActivityFingerprint : MethodFingerprint( + customFingerprint = { methodDef, classDef -> + methodDef.name == "onCreate" && classDef.type.endsWith("Shell_HomeActivity;") + }, +) diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt index 0fedb6b2..f777c10a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/hdrbrightness/HDRBrightnessPatch.kt @@ -5,8 +5,8 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.patches.youtube.video.hdrbrightness.fingerprints.HDRBrightnessFingerprint @@ -17,7 +17,7 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference @Patch( name = "HDR auto brightness", description = "Adds an option to make the brightness of HDR videos follow the system default.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class], + dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ @@ -41,14 +41,9 @@ object HDRBrightnessPatch : BytecodePatch( setOf(HDRBrightnessFingerprint) ) { override fun execute(context: BytecodeContext) { - SettingsPatch.PreferenceScreen.VIDEO.addPreferences( - SwitchPreference( - "revanced_hdr_auto_brightness", - StringResource("revanced_hdr_auto_brightness_title", "Enable auto HDR brightness"), - StringResource("revanced_hdr_auto_brightness_summary_on", "Auto HDR brightness is enabled"), - StringResource("revanced_hdr_auto_brightness_summary_off", "Auto HDR brightness is disabled") - ) - ) + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.VIDEO.addPreferences(SwitchPreference("revanced_hdr_auto_brightness")) val method = HDRBrightnessFingerprint.result!!.mutableMethod diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt index 9cccd7e8..8be8537e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.video.quality -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions @@ -9,10 +8,9 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.settings.preference.impl.ArrayResource -import app.revanced.patches.shared.settings.preference.impl.ListPreference -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.ListPreference +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.patches.youtube.video.information.VideoInformationPatch @@ -20,6 +18,7 @@ import app.revanced.patches.youtube.video.quality.fingerprints.NewVideoQualityCh import app.revanced.patches.youtube.video.quality.fingerprints.SetQualityByIndexMethodClassFieldReferenceFingerprint import app.revanced.patches.youtube.video.quality.fingerprints.VideoQualityItemOnClickParentFingerprint import app.revanced.patches.youtube.video.quality.fingerprints.VideoQualitySetterFingerprint +import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference @@ -27,7 +26,12 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference @Patch( name = "Remember video quality", description = "Adds an option to remember the last video quality selected.", - dependencies = [IntegrationsPatch::class, VideoInformationPatch::class, SettingsPatch::class], + dependencies = [ + IntegrationsPatch::class, + VideoInformationPatch::class, + SettingsPatch::class, + AddResourcesPatch::class + ], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ @@ -49,68 +53,24 @@ object RememberVideoQualityPatch : BytecodePatch( ) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/youtube/patches/playback/quality/RememberVideoQualityPatch;" + "Lapp/revanced/integrations/youtube/patches/playback/quality/RememberVideoQualityPatch;" override fun execute(context: BytecodeContext) { - // This is bloated as each value has it's own String key/value - // ideally the entries would be raw values (and not a key to a String resource) - val entries = listOf( - StringResource("revanced_video_quality_default_entry_1", "Automatic quality"), - StringResource("revanced_video_quality_default_entry_2", "2160p"), - StringResource("revanced_video_quality_default_entry_3", "1440p"), - StringResource("revanced_video_quality_default_entry_4", "1080p"), - StringResource("revanced_video_quality_default_entry_5", "720p"), - StringResource("revanced_video_quality_default_entry_6", "480p"), - StringResource("revanced_video_quality_default_entry_7", "360p"), - StringResource("revanced_video_quality_default_entry_8", "240p"), - StringResource("revanced_video_quality_default_entry_9", "144p"), - ) - val entryValues = listOf( - StringResource("revanced_video_quality_default_entry_value_1", "-2"), - StringResource("revanced_video_quality_default_entry_value_2", "2160"), - StringResource("revanced_video_quality_default_entry_value_3", "1440"), - StringResource("revanced_video_quality_default_entry_value_4", "1080"), - StringResource("revanced_video_quality_default_entry_value_5", "720"), - StringResource("revanced_video_quality_default_entry_value_6", "480"), - StringResource("revanced_video_quality_default_entry_value_7", "360"), - StringResource("revanced_video_quality_default_entry_value_8", "240"), - StringResource("revanced_video_quality_default_entry_value_9", "144"), - ) + AddResourcesPatch(this::class) SettingsPatch.PreferenceScreen.VIDEO.addPreferences( - SwitchPreference( - "revanced_remember_video_quality_last_selected", - StringResource( - "revanced_remember_video_quality_last_selected_title", - "Remember video quality changes" - ), - StringResource( - "revanced_remember_video_quality_last_selected_summary_on", - "Quality changes apply to all videos" - ), - StringResource( - "revanced_remember_video_quality_last_selected_summary_off", - "Quality changes only apply to the current video" - ) + SwitchPreference("revanced_remember_video_quality_last_selected"), + ListPreference( + key = "revanced_video_quality_default_wifi", + summaryKey = null, + entriesKey = "revanced_video_quality_default_entries", + entryValuesKey = "revanced_video_quality_default_entry_values" ), ListPreference( - "revanced_video_quality_default_wifi", - StringResource( - "revanced_video_quality_default_wifi_title", - "Default video quality on Wi-Fi network" - ), - ArrayResource("revanced_video_quality_default_wifi_entry", entries), - ArrayResource("revanced_video_quality_default_wifi_entry_values", entryValues) - // default value and summary are set by integrations after loading - ), - ListPreference( - "revanced_video_quality_default_mobile", - StringResource( - "revanced_video_quality_default_mobile_title", - "Default video quality on mobile network" - ), - ArrayResource("revanced_video_quality_default_mobile_entries", entries), - ArrayResource("revanced_video_quality_default_mobile_values", entryValues) + key = "revanced_video_quality_default_mobile", + summaryKey = null, + entriesKey = "revanced_video_quality_default_entries", + entryValuesKey = "revanced_video_quality_default_entry_values" ) ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt index a7ba8df2..061207c0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.video.speed.custom -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions @@ -11,14 +10,15 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable -import app.revanced.patches.shared.settings.preference.impl.InputType -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.TextPreference -import app.revanced.patches.youtube.misc.recyclerviewtree.hook.RecyclerViewTreeHookPatch +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.InputType +import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.litho.filter.LithoFilterPatch +import app.revanced.patches.youtube.misc.recyclerviewtree.hook.RecyclerViewTreeHookPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.patches.youtube.video.speed.custom.fingerprints.* +import app.revanced.util.exception import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -34,7 +34,8 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableField LithoFilterPatch::class, SettingsPatch::class, RecyclerViewTreeHookPatch::class, - CustomPlaybackSpeedResourcePatch::class + CustomPlaybackSpeedResourcePatch::class, + AddResourcesPatch::class ] ) object CustomPlaybackSpeedPatch : BytecodePatch( @@ -52,19 +53,10 @@ object CustomPlaybackSpeedPatch : BytecodePatch( "Lapp/revanced/integrations/youtube/patches/playback/speed/CustomPlaybackSpeedPatch;" override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.VIDEO.addPreferences( - TextPreference( - key = "revanced_custom_playback_speeds", - title = StringResource( - "revanced_custom_playback_speeds_title", - "Custom playback speeds" - ), - inputType = InputType.TEXT_MULTI_LINE, - summary = StringResource( - "revanced_custom_playback_speeds_summary", - "Add or change the available playback speeds" - ) - ) + TextPreference("revanced_custom_playback_speeds", inputType = InputType.TEXT_MULTI_LINE) ) val arrayGenMethod = SpeedArrayGeneratorFingerprint.result?.mutableMethod!! diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedResourcePatch.kt index 93aaf552..2fc51faa 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedResourcePatch.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.video.speed.custom import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch internal object CustomPlaybackSpeedResourcePatch : ResourcePatch() { var speedUnavailableId: Long = -1 diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt index f53105fc..cc30d0de 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt @@ -1,72 +1,55 @@ package app.revanced.patches.youtube.video.speed.remember -import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.settings.preference.impl.ArrayResource -import app.revanced.patches.shared.settings.preference.impl.ListPreference -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.ListPreference +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.patches.youtube.video.information.VideoInformationPatch import app.revanced.patches.youtube.video.speed.custom.CustomPlaybackSpeedPatch import app.revanced.patches.youtube.video.speed.remember.fingerprint.InitializePlaybackSpeedValuesFingerprint +import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction @Patch( - dependencies = [IntegrationsPatch::class, SettingsPatch::class, VideoInformationPatch::class, CustomPlaybackSpeedPatch::class] + dependencies = [ + IntegrationsPatch::class, + SettingsPatch::class, + VideoInformationPatch::class, + CustomPlaybackSpeedPatch::class, + AddResourcesPatch::class + ] ) object RememberPlaybackSpeedPatch : BytecodePatch( setOf(InitializePlaybackSpeedValuesFingerprint) -){ +) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/playback/speed/RememberPlaybackSpeedPatch;" override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.VIDEO.addPreferences( - SwitchPreference( - "revanced_remember_playback_speed_last_selected", - StringResource( - "revanced_remember_playback_speed_last_selected_title", - "Remember playback speed changes" - ), - StringResource( - "revanced_remember_playback_speed_last_selected_summary_on", - "Playback speed changes apply to all videos" - ), - StringResource( - "revanced_remember_playback_speed_last_selected_summary_off", - "Playback speed changes only apply to the current video" - ) - ), + SwitchPreference("revanced_remember_playback_speed_last_selected"), ListPreference( - "revanced_playback_speed_default", - StringResource( - "revanced_playback_speed_default_title", - "Default playback speed" - ), - // Dummy data: - // Entries and values are set by Integrations code based on the actual speeds available, - // and the values set here are ignored and do nothing. - ArrayResource( - "revanced_playback_speed_default_entries", - listOf(StringResource("revanced_playback_speed_default_entries", "1.0x")) - ), - ArrayResource( - "revanced_playback_speed_default_entry_values", - listOf(StringResource("revanced_playback_speed_default_entry_value", "1.0")) - ) + key = "revanced_playback_speed_default", + summaryKey = null, + // Entries and values are set by Integrations code based on the actual speeds available. + entriesKey = null, + entryValuesKey = null ) ) VideoInformationPatch.onCreateHook(INTEGRATIONS_CLASS_DESCRIPTOR, "newVideoStarted") VideoInformationPatch.userSelectedPlaybackSpeedHook( - INTEGRATIONS_CLASS_DESCRIPTOR, "userSelectedPlaybackSpeed") + INTEGRATIONS_CLASS_DESCRIPTOR, "userSelectedPlaybackSpeed" + ) /* * Hook the code that is called when the playback speeds are initialized, and sets the playback speed diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuResourcePatch.kt index b16e1066..7221e80b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuResourcePatch.kt @@ -4,25 +4,22 @@ import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch( - dependencies = [SettingsPatch::class, ResourceMappingPatch::class] + dependencies = [SettingsPatch::class, ResourceMappingPatch::class, AddResourcesPatch::class] ) object RestoreOldVideoQualityMenuResourcePatch : ResourcePatch() { internal var videoQualityBottomSheetListFragmentTitle = -1L override fun execute(context: ResourceContext) { + AddResourcesPatch(this::class) + SettingsPatch.PreferenceScreen.VIDEO.addPreferences( - SwitchPreference( - "revanced_restore_old_video_quality_menu", - StringResource("revanced_restore_old_video_quality_menu_title", "Restore old video quality menu"), - StringResource("revanced_restore_old_video_quality_menu_summary_on", "Old video quality menu is shown"), - StringResource("revanced_restore_old_video_quality_menu_summary_off", "Old video quality menu is not shown") - ) + SwitchPreference("revanced_restore_old_video_quality_menu") ) fun findResource(name: String) = ResourceMappingPatch.resourceMappings.find { it.name == name }?.id diff --git a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index ea7e88d1..f47ae90d 100644 --- a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -7,7 +7,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patcher.patch.PatchException import app.revanced.patcher.util.proxy.mutableTypes.MutableClass import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.Instruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction diff --git a/src/main/kotlin/app/revanced/util/ResourceUtils.kt b/src/main/kotlin/app/revanced/util/ResourceUtils.kt index 02425150..c5b502cb 100644 --- a/src/main/kotlin/app/revanced/util/ResourceUtils.kt +++ b/src/main/kotlin/app/revanced/util/ResourceUtils.kt @@ -2,15 +2,33 @@ package app.revanced.util import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.util.DomFileEditor -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.util.resource.BaseResource import org.w3c.dom.Node +import org.w3c.dom.NodeList import java.io.InputStream import java.nio.file.Files import java.nio.file.StandardCopyOption private val classLoader = object {}.javaClass.classLoader +/** + * Returns a sequence for all child nodes. + */ +fun NodeList.asSequence() = (0 until this.length).asSequence().map { this.item(it) } + +/** + * Returns a sequence for all child nodes. + */ +fun Node.childElementsSequence() = this.childNodes.asSequence().filter { it.nodeType == Node.ELEMENT_NODE } + +/** + * Performs the given [action] on each child element. + */ +fun Node.forEachChildElement(action: (Node) -> Unit) = childElementsSequence().forEach { + action(it) +} + /** * Recursively traverse the DOM tree starting from the given root node. * @@ -21,26 +39,6 @@ fun Node.doRecursively(action: (Node) -> Unit) { for (i in 0 until this.childNodes.length) this.childNodes.item(i).doRecursively(action) } -/** - * Merge strings. This manages [StringResource]s automatically. - * - * @param host The hosting xml resource. Needs to be a valid strings.xml resource. - */ -fun ResourceContext.mergeStrings(host: String) { - this.iterateXmlNodeChildren(host, "resources") { - // TODO: figure out why this is needed - if (!it.hasAttributes()) return@iterateXmlNodeChildren - - val attributes = it.attributes - val key = attributes.getNamedItem("name")!!.nodeValue!! - val value = it.textContent!! - - val formatted = attributes.getNamedItem("formatted") == null - - SettingsPatch.addString(key, value, formatted) - } -} - /** * Copy resources from the current class loader to the resource directory. * @@ -112,4 +110,16 @@ fun String.copyXmlNode(source: DomFileEditor, target: DomFileEditor): AutoClosea source.close() target.close() } -} \ No newline at end of file +} + +/** + * Add a resource node child. + * + * @param resource The resource to add. + * @param resourceCallback Called when a resource has been processed. + */ +internal fun Node.addResource(resource: BaseResource, resourceCallback: (BaseResource) -> Unit = { }) { + appendChild(resource.serialize(ownerDocument, resourceCallback)) +} + +internal fun DomFileEditor?.getNode(tagName: String) = this!!.file.getElementsByTagName(tagName).item(0) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/util/resource/ArrayResource.kt b/src/main/kotlin/app/revanced/util/resource/ArrayResource.kt new file mode 100644 index 00000000..190085bd --- /dev/null +++ b/src/main/kotlin/app/revanced/util/resource/ArrayResource.kt @@ -0,0 +1,37 @@ +package app.revanced.util.resource + +import app.revanced.util.childElementsSequence +import org.w3c.dom.Document +import org.w3c.dom.Node + +/** + * An array resource. + * + * @param name The name of the array resource. + * @param items The items of the array resource. + */ +@Suppress("MemberVisibilityCanBePrivate") +class ArrayResource( + name: String, + val items: List, +) : BaseResource(name, "string-array") { + override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = + super.serialize(ownerDocument, resourceCallback).apply { + setAttribute("name", name) + + items.forEach { item -> + appendChild(ownerDocument.createElement("item").also { itemNode -> + itemNode.textContent = item + }) + } + } + + companion object { + fun fromNode(node: Node): ArrayResource { + val key = node.attributes.getNamedItem("name").textContent + val items = node.childElementsSequence().map { it.textContent }.toList() + + return ArrayResource(key, items) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/preference/BaseResource.kt b/src/main/kotlin/app/revanced/util/resource/BaseResource.kt similarity index 63% rename from src/main/kotlin/app/revanced/patches/shared/settings/preference/BaseResource.kt rename to src/main/kotlin/app/revanced/util/resource/BaseResource.kt index 682ccb33..7093bffa 100644 --- a/src/main/kotlin/app/revanced/patches/shared/settings/preference/BaseResource.kt +++ b/src/main/kotlin/app/revanced/util/resource/BaseResource.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.shared.settings.preference +package app.revanced.util.resource import org.w3c.dom.Document import org.w3c.dom.Element @@ -9,6 +9,7 @@ import org.w3c.dom.Element * @param name The name of the resource. * @param tag The tag of the resource. */ +@Suppress("MemberVisibilityCanBePrivate") abstract class BaseResource( val name: String, val tag: String @@ -24,4 +25,19 @@ abstract class BaseResource( setAttribute("name", name) } } + + override fun hashCode(): Int { + var result = name.hashCode() + result = 31 * result + tag.hashCode() + return result + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as BaseResource + + return name == other.name + } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/util/resource/StringResource.kt b/src/main/kotlin/app/revanced/util/resource/StringResource.kt new file mode 100644 index 00000000..c825d675 --- /dev/null +++ b/src/main/kotlin/app/revanced/util/resource/StringResource.kt @@ -0,0 +1,41 @@ +package app.revanced.util.resource + +import app.revanced.patcher.patch.PatchException +import org.w3c.dom.Document +import org.w3c.dom.Node + +/** + * A string value. + * Represents a string in the strings.xml file. + * + * @param name The name of the string. + * @param value The value of the string. + * @param formatted If the string is formatted. Defaults to `true`. + */ +class StringResource( + name: String, + val value: String, + val formatted: Boolean = true, +) : BaseResource(name, "string") { + override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = + super.serialize(ownerDocument, resourceCallback).apply { + // if the string is un-formatted, explicitly add the formatted attribute + if (!formatted) setAttribute("formatted", "false") + + if (value.contains(Regex("(? + + + + @string/revanced_spoof_app_version_target_entry_1 + @string/revanced_spoof_app_version_target_entry_2 + @string/revanced_spoof_app_version_target_entry_3 + @string/revanced_spoof_app_version_target_entry_4 + @string/revanced_spoof_app_version_target_entry_5 + + + 18.33.40 + 18.20.39 + 17.08.35 + 16.08.35 + 16.01.35 + + + + + @string/revanced_start_page_home_entry_0 + @string/revanced_start_page_home_entry_1 + @string/revanced_start_page_search_entry_2 + @string/revanced_start_page_subscriptions_entry_3 + @string/revanced_start_page_explore_entry_4 + @string/revanced_start_page_shorts_entry_5 + + + + MAIN + open.search + open.subscriptions + open.explore + open.shorts + + + + + @string/revanced_alt_thumbnail_stills_time_entry_1 + @string/revanced_alt_thumbnail_stills_time_entry_2 + @string/revanced_alt_thumbnail_stills_time_entry_3 + + + 1 + 2 + 3 + + + + + @string/revanced_video_quality_default_entry_1 + @string/revanced_video_quality_default_entry_2 + @string/revanced_video_quality_default_entry_3 + @string/revanced_video_quality_default_entry_4 + @string/revanced_video_quality_default_entry_5 + @string/revanced_video_quality_default_entry_6 + @string/revanced_video_quality_default_entry_7 + @string/revanced_video_quality_default_entry_8 + @string/revanced_video_quality_default_entry_9 + + + -2 + 2160 + 1440 + 1080 + 720 + 480 + 360 + 240 + 144 + + + + + + + @string/revanced_deleted_messages_entry_1 + @string/revanced_deleted_messages_entry_2 + @string/revanced_deleted_messages_entry_3 + + + hide + spoiler + cross-out + + + + + @string/revanced_hls_proxies_entry_1 + @string/revanced_hls_proxies_entry_2 + @string/revanced_hls_proxies_entry_3 + + + disabled + luminous + purpleadblock + + + + \ No newline at end of file diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml new file mode 100644 index 00000000..354fd710 --- /dev/null +++ b/src/main/resources/addresources/values/strings.xml @@ -0,0 +1,1019 @@ + + + + ReVanced + Do you wish to proceed? + Reset + Refresh and restart + Restart + Import + Copy + ReVanced settings reset to default + Imported %d settings + Import failed: %s + + + GmsCore is not installed. Please install. + GmsCore is failing to run. Please follow the \"Don\'t kill my app\" guide for GmsCore. + + + + + Showing original YouTube thumbnails + Showing still video captures + Showing DeArrow thumbnails. If a video has no DeArrow thumbnails then the original YouTube thumbnails are shown + Showing DeArrow thumbnails. If a video has no DeArrow thumbnails then still video captures are shown + DeArrow temporarily not available (status code: %s) + DeArrow temporarily not available + + + ReVanced + ReVanced specific settings + Import / Export + Import / Export ReVanced settings + + + Ads + Ad related settings + Interactions + Settings related to interactions + Layout + Settings related to the layout + Video + Settings related to the video player + Misc + Miscellaneous patches + + + Debug logging + Debug logs are enabled + Debug logs are disabled + Debugging + Log protocol buffer + Debug logs include proto buffer + Debug logs do not include proto buffer + Log stack traces + Debug logs include stack trace + Debug logs do not include stack trace + Show toast on ReVanced error + Toast shown if error occurs + Toast not shown if error occurs + Turning off error toasts hides all ReVanced error notifications.\n\nYou will not be notified of any unexpected events. + Enable or disable debugging options + + + Ads + Ad related settings + Hide gray separator + Gray separators are hidden + Gray separators are shown + Hide \'Join\' button + Button is hidden + Button is shown + Hide channel watermark in video player + Watermark is hidden + Watermark is shown + Hide \'For you\' shelf in channel page + Shelf is hidden + Shelf is shown + Hide \'Notify me\' button + Button is hidden + Button is shown + Hide timed reactions + Timed reactions are hidden + Timed reactions are shown + Hide \'People also watched\' recommendations + Recommendations are hidden + Recommendations are shown + Hide search result shelf header + Shelf header is hidden + Shelf header is shown + Hide channel guidelines + Channel guidelines are hidden + Channel guidelines are shown + Hide expandable chip under videos + Expandable chips are hidden + Expandable chips are shown + Hide video quality menu footer + Video quality menu footer is hidden + Video quality menu footer is shown + Hide chapters in the video description + Chapters are hidden + Chapters are shown + Hide community posts + Community posts are hidden + Community posts are shown + Hide compact banners + Compact banners are hidden + Compact banners are shown + Hide movies section + Movies section is hidden + Movies section is shown + Hide feed surveys + Feed surveys are hidden + Feed surveys are shown + Hide community guidelines + Community guidelines are hidden + Community guidelines are shown + Hide subscribers community guidelines + Subscribers community guidelines are hidden + Subscribers community guidelines are shown + Hide channel member shelf + Channel member shelf is hidden + Channel member shelf is shown + Hide emergency boxes + Emergency boxes are hidden + Emergency boxes are shown + Hide info panels + Info panels are hidden + Info panels are shown + Hide medical panels + Medical panels are hidden + Medical panels are shown + Hide channel bar + Channel bar is hidden + Channel bar is shown + Hide quick actions in fullscreen + Quick actions are hidden + Quick actions are shown + Hide related videos in quick actions + Related videos are hidden + Related videos are shown + Hide image shelf in search results + Image shelf is hidden + Image shelf is shown + Hide latest posts + Latest posts are hidden + Latest posts are shown + Hide mix playlists + Mix playlists are hidden + Mix playlists are shown + Hide artist cards + Artist cards are hidden + Artist cards are shown + Hide chips shelf + Chips shelf is hidden + Chips shelf is shown + Hide components in the video description + Hide info cards section + Info cards section is hidden + Info cards section is shown + Hide game section + Game section is hidden + Game section is shown + Hide music section + Music section is hidden + Music section is shown + Hide podcast section + Podcast section is hidden + Podcast section is shown + Hide transcript section + Transcript section is hidden + Transcript section is shown + Hide components under the video description + Custom filter + Enable custom filter + Custom filter is enabled + Custom filter is disabled + Custom filter + List of component path builder strings to filter separated by new line + Hide components using custom filters + + + Hide general ads + General ads are hidden + General ads are shown + Hide fullscreen ads + Fullscreen ads are hidden + Fullscreen ads are shown + Hide buttoned ad + Buttoned ads are hidden + Buttoned ads are shown + Hide paid content + Paid content is hidden + Paid content is shown + Hide self sponsored cards + Self sponsored cards are hidden + Self sponsored cards are shown + Hide banner to view products + Banner is hidden + Banner is shown + Hide shopping links in video description + Shopping links are hidden + Shopping links are shown + Hide web search results + Web search results are hidden + Web search results are shown + Hide merchandise banners + Merchandise banners are hidden + Merchandise banners are shown + + + Hide YouTube Premium promotions + YouTube Premium promotions under video player are hidden + YouTube Premium promotions under video player are shown + + + Hide video ads + Video ads are hidden + Video ads are shown + + + URL copied to clipboard + URL with timestamp copied + Copy video URL settings + Show copy video URL button + Button is shown. Tap to copy video URL. Tap and hold to copy video URL with timestamp + Button is not shown + Show copy timestamp URL button + Button is shown. Tap to copy video URL with timestamp. Tap and hold to copy video without timestamp + Button is not shown + Settings related to copy URL buttons in video player + + + Remove viewer discretion dialog + Dialog will be removed + Dialog will be shown + This does not bypass the age restriction. It just accepts it automatically. + + + %s is not installed. Please install it. + External download settings + Show external download button + Download button shown in player + Download button not shown in player + Downloader package name + Package name of your installed external downloader app, such as NewPipe or Seal + Settings for using an external downloader + + + Disable precise seeking gesture + Gesture is disabled + Gesture is enabled + + + Enable seekbar tapping + Seekbar tapping is enabled + Seekbar tapping is disabled + + + Swipe controls + Enable brightness gesture + Brightness swipe is enabled + Brightness swipe is disabled + Enable volume gesture + Volume swipe is enabled + Volume swipe is disabled + Enable press-to-swipe gesture + Press-to-swipe is enabled + Press-to-swipe is disabled + Enable haptic feedback + Haptic feedback is enabled + Haptic feedback is disabled + Save and restore brightness + Save and restore brightness when exiting or entering fullscreen + Do not save and restore brightness when exiting or entering fullscreen + Swipe overlay timeout + The amount of milliseconds the overlay is visible + Swipe overlay text size + The text size for swipe overlay + Swipe background visibility + The visibility of swipe overlay background + Swipe magnitude threshold + The amount of threshold for swipe to occur + Control volume and brightness + + + Disable auto captions + Auto captions are disabled + Auto captions are enabled + + + Hide action buttons + Hide like and dislike buttons + Like and dislike buttons are hidden + Like and dislike buttons are shown + Hide live chat button + Live chat button is hidden + Live chat button is shown + Hide share button + Share button is hidden + Share button is shown + Hide report button + Report button is hidden + Report button is shown + Hide remix button + Remix button is hidden + Remix button is shown + Hide download button + Download button is hidden + Download button is shown + Hide thanks button + Thanks button is hidden + Thanks button is shown + Hide clip button + Clip button is hidden + Clip button is shown + Hide save to playlist button + Save button is hidden + Save button is shown + Hide shop button + Shop button is hidden + Shop button is shown + Hide or show buttons under videos + + + Hide autoplay button + Autoplay button is hidden + Autoplay button is shown + + + Hide captions button + Captions button is hidden + Captions button is shown + + + Hide cast button + Cast button is hidden + Cast button is shown + + + Navigation buttons + Hide home button + Home button is hidden + Home button is shown + Hide Shorts button + Shorts button is hidden + Shorts button is shown + Hide subscriptions button + Home subscriptions is hidden + Home subscriptions is shown + Hide create button + Create button is hidden + Create button is shown + Switch create with notifications button + Create button is switched with notifications + Create button is not switched with notifications + Hide or change buttons in the navigation bar + + + Player flyout menu items + Manage the visibility of player flyout menu items + Hide Captions menu + Captions menu item is hidden + Captions menu item is shown + Hide Additional settings menu + Additional settings menu item is hidden + Additional settings menu item is shown + Hide Loop video menu + Loop video menu item is hidden + Loop video menu item is shown + Hide Ambient mode menu + Ambient mode menu item is hidden + Ambient mode menu item is shown + Hide Report menu + Report menu item is hidden + Report menu item is shown + Hide Help menu + Help menu item is hidden + Help menu item is shown + Hide Speed menu + Speed menu item is hidden + Speed menu item is shown + Hide More info menu + More info menu item is hidden + More info menu item is shown + Hide Audio track menu + Audio track menu item is hidden + Audio track menu item is shown + Hide Watch in VR menu + Watch in VR menu item is hidden + Watch in VR menu item is shown + + + Hide previous & next video buttons + Buttons are hidden + Buttons are shown + + + Hide album cards + Album cards are hidden + Album cards are shown + + + Hide breaking news + Breaking news are hidden + Breaking news are shown + + + Comments + Hide comments section + Comment section is hidden + Comment section is shown + Hide preview comment + Preview comment is hidden + Preview comment is shown + Manage the visibility of comments section components + + + Hide crowdfunding box + Crowdfunding box is hidden + Crowdfunding box is shown + + + Hide end screen cards + End screen cards are hidden + End screen cards are shown + + + Hide filter bar + Hide in feed + Hidden in feed + Shown in feed + Hide in search + Hidden in search + Shown in search + Hide in related videos + Hidden in related videos + Shown in related videos + Manage the visibility of the filter bar in the feed, search and related videos + + + Hide floating microphone button + Microphone button hidden + Microphone button shown + + + Disable ambient mode in fullscreen + Ambient mode disabled + Ambient mode enabled + + + Hide info cards + Info cards are hidden + Info cards are shown + + + Hide \'Load More\' button + Button is hidden + Button is shown + + + Video + + + Disable rolling number animations + Rolling numbers are not animated + Rolling numbers are animated + + + Hide seekbar in video player + Video player seekbar is hidden + Video player seekbar is shown + Hide seekbar in video thumbnails + Thumbnail seekbar is hidden + Thumbnail seekbar is shown + + + Shorts components + Hide Shorts in feed + Shorts are hidden + Shorts are shown + Hide join button + Join button is hidden + Join button is shown + Hide subscribe button + Subscribe button is hidden + Subscribe button is shown + Hide subscribe button when paused + Subscribe button is hidden + Subscribe button is shown + Hide thanks button + Thanks button is hidden + Thanks button is shown + Hide comments button + Comments button is hidden + Comments button is shown + Hide remix button + Remix button is hidden + Remix button is shown + Hide share button + Share button is hidden + Share button is shown + Hide info panel + Info panel is hidden + Info panel is shown + Hide channel bar + Channel bar is hidden + Channel bar is shown + Hide sound button + Sound button is hidden + Sound button is shown + Hide navigation bar + Navigation bar is hidden + Navigation bar is shown + Manage the visibility of Shorts components + + + Disable suggested video end screen + Suggested videos will be disabled + Suggested videos will be shown + + + Hide video timestamp + Timestamp is hidden + Timestamp is shown + + + Hide player popup panels + Player popup panels are hidden + Player popup panels are shown + + + Player overlay opacity + Opacity value between 0-100, where 0 is transparent + + + Return YouTube Dislike + Settings for Return YouTube Dislike + Hidden + Dislikes temporarily not available (API timed out) + Dislikes not available (status %d) + Dislikes not available (client API limit reached) + Dislikes not available (%s) + + Reload video to vote using ReturnYouTubeDislike + Return YouTube Dislike + Dislikes are shown + Dislikes are not shown + Show dislikes on Shorts + Dislikes shown on Shorts %s + Dislikes hidden on Shorts + Limitation: Dislikes may not appear in incognito mode + Dislikes as percentage + Dislikes shown as percentage + Dislikes shown as number + Compact like button + Like button styled for minimum width + Like button styled for best appearance + Show a toast if API is not available + Toast is shown if Return YouTube Dislike is not available + Toast is not shown if Return YouTube Dislike is not available + About + ReturnYouTubeDislike.com + Data is provided by the Return YouTube Dislike API. Tap here to learn more + ReturnYouTubeDislike API statistics of this device + API response time, average + API response time, minimum + API response time, maximum + API response time, last video + Dislikes temporarily not available - Client API rate limit in effect + API fetch votes, number of calls + No network calls made + %d network calls made + API fetch votes, number of timeouts + No + network calls timed out + %d network calls timed out + API client rate limits + No client rate limits encountered + Client rate limit encountered %d times + %d milliseconds + + + Enable wide search bar + Wide search bar is enabled + Wide search bar is disabled + + + Restore old seekbar thumbnails + Seekbar thumbnails will appear above the seekbar + Seekbar thumbnails will appear in fullscreen + + + Seekbar + Settings for the seekbar + + + SponsorBlock + SponsorBlock related settings + Enable SponsorBlock + SponsorBlock is a crowd-sourced system for skipping annoying parts of YouTube videos + Appearance + Show voting button + Segment voting button is shown + Segment voting button is not shown + Use compact skip button + Skip button styled for minimum width + Skip button styled for best appearance + Automatically hide skip button + Skip button hides after a few seconds + Skip button displayed for entire segment + Show a toast when skipping automatically + Toast is shown when a segment is automatically skipped. Tap here to see an example + Toast is not shown. Tap here to see an example + Show video length without segments + Video length minus all segments, shown in parentheses next to the full video length + Full video length shown + Creating new segments + Show create new segment button + Create new segment button is shown + Create new segment button is not shown + Adjust new segment step + Number of milliseconds the time adjustment buttons move when creating new segments + Value must be a positive number + View guidelines + Guidelines contain rules and tips for creating new segments + Follow the guidelines + Read the SponsorBlock guidelines before creating new segments + Already read + Show me + General + Show a toast if API is not available + Toast is shown if SponsorBlock is not available + Toast is not shown if SponsorBlock is not available + Enable skip count tracking + Lets the SponsorBlock leaderboard know how much time is saved. A message is sent to the leaderboard each time a segment is skipped + Skip count tracking is not enabled + Minimum segment duration + Segments shorter than this value (in seconds) will not be shown or skipped + Your private user id + This should be kept private. This is like a password and should not be shared with anyone. If someone has this, they can impersonate you + Private user id must be at least 30 characters long + Change API URL + The address SponsorBlock uses to make calls to the server. Do not change this unless you know what you\'re doing + API URL reset + API URL is invalid + API URL changed + Import/Export settings + Copy + Your SponsorBlock JSON configuration that can be imported/exported to ReVanced and other SponsorBlock platforms %s + This includes your private user id. Be sure to share this wisely + Settings imported successfully + Failed to import: %s + Failed to export: %s + Your settings contain a private SponsorBlock userid.\n\nYour user id is like a password and it should never be shared.\n + Do not show again + Change segment behavior + Sponsor + Paid promotion, paid referrals and direct advertisements. Not for self-promotion or free shout-outs to causes/creators/websites/products they like + Unpaid/Self Promotion + Similar to \'Sponsor\' except for unpaid or self promotion. Includes sections about merchandise, donations, or information about who they collaborated with + Interaction Reminder (Subscribe) + A short reminder to like, subscribe or follow them in the middle of content. If it is long or about something specific, it should instead be under self promotion + Highlight + The part of the video that most people are looking for + Intermission/Intro Animation + An interval without actual content. Could be a pause, static frame, or repeating animation. Does not include transitions containing information + Endcards/Credits + Credits or when the YouTube endcards appear. Not for conclusions with information + Preview/Recap/Hook + Collection of clips that show what is coming up or what happened in the video or in other videos of a series, where all information is repeated elsewhere + Filler Tangent/Jokes + Tangential scenes added only for filler or humor that are not required to understand the main content of the video. Does not include segments providing context or background details + Music: Non-Music Section + Only for use in music videos. Sections of music videos without music, that aren\'t already covered by another category + Skip + Highlight + Skip sponsor + Skip promo + Skip interact + Skip to highlight + Skip intro + Skip intermission + Skip intermission + Skip outro + Skip preview + Skip preview + Skip recap + Skip filler + Skip non-music + Skip segment + Skipped sponsor + Skipped self promotion + Skipped annoying reminder + Skipped to highlight + Skipped intro + Skipped intermission + Skipped intermission + Skipped outro + Skipped preview + Skipped preview + Skipped recap + Skipped filler + Skipped a non-music section + Skipped unsubmitted segment + Skipped multiple segments + Skip automatically + Skip automatically once + Show a skip button + Show in seek bar + Disable + Unable to submit segment: %s + SponsorBlock is temporarily down + Unable to submit segment (status: %d %s) + Unable to submit segment.\nRate Limited (too many from the same user or IP) + Can\'t submit the segment: %s + Can\'t submit the segment.\nAlready exists + Segment submitted successfully + SponsorBlock temporarily not available + SponsorBlock temporarily not available (status %d) + SponsorBlock temporarily not available (API timed out) + Unable to vote for segment (API timed out) + Unable to vote for segment (status: %d %s) + Unable to vote for segment: %s + Upvote + Downvote + Change category + There are no segments to vote for + Choose the segment category + Category is disabled in settings. Enable category to submit. + New SponsorBlock segment + Set %02d:%02d:%03d as the start or end of a new segment? + start + end + now + Time the segment begins at + Time the segment ends at + Are the times correct? + The segment lasts from %02d:%02d to %02d:%02d (%d minutes %02d seconds)\nIs it ready to submit? + Start must be before the end + Mark two locations on the time bar first + Preview the segment, and ensure it skips smoothly + Edit timing of segment manually + Do you want to edit the timing for the start or end of the segment? + Invalid time given + Stats + Stats temporarily not available (API is down) + Loading... + SponsorBlock is disabled + Your username: <b>%s</b> + Tap here to change your username + Unable to change username: Status: %d %s + Username successfully changed + Your reputation is <b>%.2f</b> + You\'ve created <b>%s</b> segments + SponsorBlock leaderboard + You\'ve saved people from <b>%s</b> segments + Tap here to see the global stats and top contributors + That\'s <b>%s</b> of their lives.<br>Tap here to see the leaderboard + You\'ve skipped <b>%s</b> segments + That\'s <b>%s</b> + Reset skipped segments counter? + %s hours %s minutes + %s minutes %s seconds + %s seconds + Color: + Color changed + Color reset + Invalid color code + Reset color + Reset + About + sponsor.ajay.app + Data is provided by the SponsorBlock API. Tap here to learn more and see downloads for other platforms + + + Spoof app version + Version spoofed + Version not spoofed + App version will be spoofed to an older version of YouTube.\n\nThis will change the appearance and features of the app, but unknown side effects may occur.\n\nIf later turned off, it is recommended to clear the app data to prevent UI bugs. + Spoof app version target + 18.33.40 - Restore RYD Shorts incognito mode + 18.20.39 - Restore wide video speed & quality menu + 17.08.35 - Restore old UI layout + 16.08.35 - Restore explore tab + 16.01.35 - Restore fewer video player action buttons + + + Set start page + Default + Home + Search + Subscriptions + Explore + Shorts + + + Disable resuming Shorts player + Shorts player will not resume on app startup + Shorts player will resume on app startup + + + Enable tablet layout + Settings related to the layout + Tablet layout is enabled + Tablet layout is disabled + Community posts do not show up on tablet layouts + + + Enable tablet mini player + Mini player is enabled + Mini player is disabled + + + Enable gradient loading screen + Loading screen will have a gradient background + Loading screen will have a solid background + + + Enable custom seekbar color + Custom seekbar color is shown + Original seekbar color is shown + Custom seekbar color + The color of the seekbar + Invalid seekbar color value. Using default value. + + + Alternative thumbnails + Thumbnails in use + Enable DeArrow thumbnails + Using DeArrow thumbnails + Not using DeArrow thumbnails + Show a toast if API is not available + Toast is shown if DeArrow is not available + Toast is not shown if DeArrow is not available + DeArrow API endpoint + The URL of the DeArrow thumbnail cache endpoint. Do not change this unless you know what you\'re doing + About DeArrow + DeArrow provides crowd-sourced thumbnails for YouTube videos. These thumbnails are often more relevant than those provided by YouTube. If enabled, video URLs will be sent to the API server and no other data is sent\n\nTap here to learn more about DeArrow + Enable still video captures + Using YouTube still video captures + Not using YouTube still video captures + Video time to take the still from + Beginning of video + Middle of video + End of video + Use fast still captures + Using medium quality still captures. Thumbnails will load faster, but live streams, unreleased, or very old videos may show blank thumbnails + Using high quality still captures + About still video captures + Still captures are taken from the beginning/middle/end of each video. These images are built into YouTube and no external API is used + Video thumbnail settings + + + Show ReVanced announcements + Announcements are shown on startup + Announcements are not shown on startup + Show announcements on startup + Failed connecting to announcements provider + + + Enable auto-repeat + Auto-repeat is enabled + Auto-repeat is disabled + + + Spoof device dimensions + Device dimensions spoofed + Device dimensions not spoofed\n\nSpoofing the device dimensions can unlock higher video qualities but unknown side effects may occur + + + Spoof app signature + Spoof app signature + App signature spoofed\n\nSide effects include:\n• Enhanced bitrate is not available\n• Videos cannot be downloaded\n• No seekbar thumbnails for paid videos + App signature not spoofed\n\nVideo playback may not work + Turning off this setting will cause video playback issues. + Spoof app signature in feed + App signature spoofed\n\nSide effects include:\n• Feed videos are missing subtitles\n• Automatically played feed videos will show up in your watch history + App signature not spoofed for feed videos\n\nFeed videos will play for less than 1 minute beforeencountering playback issues + Spoof storyboard + Storyboard spoofed + Storyboard not spoofed\n\nSide effects include:\n• No ambient mode\n• Seekbar thumbnails are hidden + Spoof the app signature to prevent playback issues + Spoof storyboard temporarily not available (API timed out) + Spoof storyboard temporarily not available: %s + + + GmsCore Settings + Settings for GmsCore + + + Bypass URL redirects + URL redirects are bypassed + URL redirects are not bypassed + + + Open links in browser + Opening links externally + Opening links in app + + + Minimized playback + This setting can be found in Settings -> Background + + + Remove tracking query parameter + Tracking query parameter is removed from links + Tracking query parameter is not removed from links + + + Disable zoom haptics + Haptics are disabled + Haptics are enabled + + + Enable auto HDR brightness + Auto HDR brightness is enabled + Auto HDR brightness is disabled + + + Automatic quality + 2160p + 1440p + 1080p + 720p + 480p + 360p + 240p + 144p + Remember video quality changes + Quality changes apply to all videos + Quality changes only apply to the current video + Default video quality on Wi-Fi network + Default video quality on mobile network + mobile + wifi + Changed default %s quality to: %s + + + Custom playback speeds + Add or change the available playback speeds + Custom speeds must be less than %s Using default values. + Invalid custom playback speeds. Using default values. + + + Remember playback speed changes + Playback speed changes apply to all videos + Playback speed changes only apply to the current video + Default playback speed + Changed default speed to: %s + + + Restore old video quality menu + Old video quality menu is shown + Old video quality menu is not shown + + + Enable slide to seek + Slide to seek is enabled + Slide to seek is not enabled + + + + + Block audio ads + Audio ads are blocked + Audio ads are unblocked + + + %s is unavailable. Ads may show. Try switching to another ad block service in settings. + %s server returned an error. Ads may show. Try switching to another ad block service in settings. + Block embedded video ads + Embedded video ads are blocked + Embedded video ads are unblocked + Disabled + Luminous proxy + PurpleAdBlock proxy + + + Block video ads + Video ads are blocked + Video ads are unblocked + + + message deleted + Show deleted messages + Do not show deleted messages + Hide deleted messages behind a spoiler + Show deleted messages as crossed-out text + + + Automatically claim Channel Points + Channel Points are claimed automatically + Channel Points are not claimed automatically + + + Enable Twitch debug mode + Twitch debug mode is enabled (not recommended) + Twitch debug mode is disabled + + + ReVanced Settings + Debug logging + Debug logs are enabled + Debug logs are disabled + Ads + Ad blocking settings + Chat + Chat settings + Misc + Miscellaneous settings + General settings + Other settings + Client-side ads + Server-side surestream ads + + + \ No newline at end of file diff --git a/src/main/resources/alternativethumbnails/host/values/strings.xml b/src/main/resources/alternativethumbnails/host/values/strings.xml deleted file mode 100644 index 272bbc2f..00000000 --- a/src/main/resources/alternativethumbnails/host/values/strings.xml +++ /dev/null @@ -1,9 +0,0 @@ - - Showing original YouTube thumbnails - Showing still video captures - Showing DeArrow thumbnails. If a video has no DeArrow thumbnails then the original YouTube thumbnails are shown - Showing DeArrow thumbnails. If a video has no DeArrow thumbnails then still video captures are shown - - DeArrow temporarily not available (status code: %s) - DeArrow temporarily not available - \ No newline at end of file diff --git a/src/main/resources/copyvideourl/host/layout/youtube_controls_bottom_ui_container.xml b/src/main/resources/copyvideourl/host/layout/youtube_controls_bottom_ui_container.xml index 97ec1740..3a7cdd3e 100644 --- a/src/main/resources/copyvideourl/host/layout/youtube_controls_bottom_ui_container.xml +++ b/src/main/resources/copyvideourl/host/layout/youtube_controls_bottom_ui_container.xml @@ -1,5 +1,5 @@ - - + + diff --git a/src/main/resources/copyvideourl/host/values/strings.xml b/src/main/resources/copyvideourl/host/values/strings.xml deleted file mode 100644 index 8452816c..00000000 --- a/src/main/resources/copyvideourl/host/values/strings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - URL copied to clipboard - URL with timestamp copied - diff --git a/src/main/resources/downloads/host/layout/youtube_controls_bottom_ui_container.xml b/src/main/resources/downloads/host/layout/youtube_controls_bottom_ui_container.xml index 419845aa..b38a30b9 100644 --- a/src/main/resources/downloads/host/layout/youtube_controls_bottom_ui_container.xml +++ b/src/main/resources/downloads/host/layout/youtube_controls_bottom_ui_container.xml @@ -1,4 +1,4 @@ - + diff --git a/src/main/resources/downloads/host/values/strings.xml b/src/main/resources/downloads/host/values/strings.xml deleted file mode 100644 index dcdfd275..00000000 --- a/src/main/resources/downloads/host/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - is not installed. Please install it. - diff --git a/src/main/resources/gms/host/values/strings.xml b/src/main/resources/gms/host/values/strings.xml deleted file mode 100644 index 4697165e..00000000 --- a/src/main/resources/gms/host/values/strings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - GmsCore is not installed. Please install it. - GmsCore is failing to run. Please follow the "Don't kill my app" guide for GmsCore. - diff --git a/src/main/resources/returnyoutubedislike/host/values/strings.xml b/src/main/resources/returnyoutubedislike/host/values/strings.xml deleted file mode 100644 index b88a5795..00000000 --- a/src/main/resources/returnyoutubedislike/host/values/strings.xml +++ /dev/null @@ -1,60 +0,0 @@ - - Hidden - - Dislikes temporarily not available (API timed out) - Dislikes not available (status %d) - Dislikes not available (client API limit reached) - Dislikes not available (%s) - - - Reload video to vote using ReturnYouTubeDislike - - Return YouTube Dislike - Dislikes are shown - Dislikes are not shown - - Show dislikes on Shorts - Dislikes shown on Shorts %s - Dislikes hidden on Shorts - Limitation: Dislikes may not appear in incognito mode - - Dislikes as percentage - Dislikes shown as percentage - Dislikes shown as number - - Compact like button - Like button styled for minimum width - Like button styled for best appearance - - Show a toast if API is not available - Toast is shown if Return YouTube Dislike is not available - Toast is not shown if Return YouTube Dislike is not available - - About - ReturnYouTubeDislike.com - Data is provided by the Return YouTube Dislike API. Tap here to learn more - - - ReturnYouTubeDislike API statistics of this device - - API response time, average - API response time, minimum - API response time, maximum - - API response time, last video - Dislikes temporarily not available - Client API rate limit in effect - - API fetch votes, number of calls - No network calls made - %d network calls made - - API fetch votes, number of timeouts - No network calls timed out - %d network calls timed out - - API client rate limits - No client rate limits encountered - Client rate limit encountered %d times - - %d milliseconds - diff --git a/src/main/resources/settings/host/values/strings.xml b/src/main/resources/settings/host/values/strings.xml deleted file mode 100644 index a897f37a..00000000 --- a/src/main/resources/settings/host/values/strings.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - ReVanced - Do you wish to proceed? - Reset - - Refresh and restart - Restart - - Import - Copy - ReVanced settings reset to default - Imported %d settings - Import failed: %s - diff --git a/src/main/resources/sponsorblock/drawable/ic_sb_adjust.xml b/src/main/resources/sponsorblock/drawable/revanced_sb_adjust.xml similarity index 100% rename from src/main/resources/sponsorblock/drawable/ic_sb_adjust.xml rename to src/main/resources/sponsorblock/drawable/revanced_sb_adjust.xml diff --git a/src/main/resources/sponsorblock/drawable/ic_sb_compare.xml b/src/main/resources/sponsorblock/drawable/revanced_sb_compare.xml similarity index 100% rename from src/main/resources/sponsorblock/drawable/ic_sb_compare.xml rename to src/main/resources/sponsorblock/drawable/revanced_sb_compare.xml diff --git a/src/main/resources/sponsorblock/drawable/ic_sb_edit.xml b/src/main/resources/sponsorblock/drawable/revanced_sb_edit.xml similarity index 100% rename from src/main/resources/sponsorblock/drawable/ic_sb_edit.xml rename to src/main/resources/sponsorblock/drawable/revanced_sb_edit.xml diff --git a/src/main/resources/sponsorblock/drawable/ic_sb_logo.xml b/src/main/resources/sponsorblock/drawable/revanced_sb_logo.xml similarity index 100% rename from src/main/resources/sponsorblock/drawable/ic_sb_logo.xml rename to src/main/resources/sponsorblock/drawable/revanced_sb_logo.xml diff --git a/src/main/resources/sponsorblock/drawable/ic_sb_publish.xml b/src/main/resources/sponsorblock/drawable/revanced_sb_publish.xml similarity index 100% rename from src/main/resources/sponsorblock/drawable/ic_sb_publish.xml rename to src/main/resources/sponsorblock/drawable/revanced_sb_publish.xml diff --git a/src/main/resources/sponsorblock/drawable/ic_sb_voting.xml b/src/main/resources/sponsorblock/drawable/revanced_sb_voting.xml similarity index 100% rename from src/main/resources/sponsorblock/drawable/ic_sb_voting.xml rename to src/main/resources/sponsorblock/drawable/revanced_sb_voting.xml diff --git a/src/main/resources/sponsorblock/host/layout/youtube_controls_layout.xml b/src/main/resources/sponsorblock/host/layout/youtube_controls_layout.xml index 33a11b83..7c2d5391 100644 --- a/src/main/resources/sponsorblock/host/layout/youtube_controls_layout.xml +++ b/src/main/resources/sponsorblock/host/layout/youtube_controls_layout.xml @@ -1,7 +1,7 @@ + android:src="@drawable/revanced_sb_logo" /> + android:src="@drawable/revanced_sb_voting" /> diff --git a/src/main/resources/sponsorblock/host/values/strings.xml b/src/main/resources/sponsorblock/host/values/strings.xml deleted file mode 100644 index 2322f375..00000000 --- a/src/main/resources/sponsorblock/host/values/strings.xml +++ /dev/null @@ -1,194 +0,0 @@ - - - Enable SponsorBlock - SponsorBlock is a crowd-sourced system for skipping annoying parts of YouTube videos - - Appearance - Show voting button - Segment voting button is shown - Segment voting button is not shown - Use compact skip button - Skip button styled for minimum width - Skip button styled for best appearance - Automatically hide skip button - Skip button hides after a few seconds - Skip button displayed for entire segment - Show a toast when skipping automatically - Toast is shown when a segment is automatically skipped. Tap here to see an example - Toast is not shown. Tap here to see an example - Show video length without segments - Video length minus all segments, shown in parentheses next to the full video length - Full video length shown - - Creating new segments - Show create new segment button - Create new segment button is shown - Create new segment button is not shown - Adjust new segment step - Number of milliseconds the time adjustment buttons move when creating new segments - Value must be a positive number - View guidelines - Guidelines contain rules and tips for creating new segments - Follow the guidelines - Read the SponsorBlock guidelines before creating new segments - Already read - Show me - - General - Show a toast if API is not available - Toast is shown if SponsorBlock is not available - Toast is not shown if SponsorBlock is not available - Enable skip count tracking - Lets the SponsorBlock leaderboard know how much time is saved. A message is sent to the leaderboard each time a segment is skipped - Skip count tracking is not enabled - Minimum segment duration - Segments shorter than this value (in seconds) will not be shown or skipped - Your private user id - This should be kept private. This is like a password and should not be shared with anyone. If someone has this, they can impersonate you - Private user id must be at least 30 characters long - Change API URL - The address SponsorBlock uses to make calls to the server. Do not change this unless you know what you\'re doing - API URL reset - API URL is invalid - API URL changed - Import/Export settings - Copy - Your SponsorBlock JSON configuration that can be imported/exported to ReVanced and other SponsorBlock platforms %s - This includes your private user id. Be sure to share this wisely - Settings imported successfully - Failed to import: %s - Failed to export: %s - - Your settings contain a private SponsorBlock user id.\n\nYour user id is like a password and it should never be shared.\n - Do not show again - - Change segment behavior - Sponsor - Paid promotion, paid referrals and direct advertisements. Not for self-promotion or free shout-outs to causes/creators/websites/products they like - Unpaid/Self Promotion - Similar to \'Sponsor\' except for unpaid or self promotion. Includes sections about merchandise, donations, or information about who they collaborated with - Interaction Reminder (Subscribe) - A short reminder to like, subscribe or follow them in the middle of content. If it is long or about something specific, it should instead be under self promotion - Highlight - The part of the video that most people are looking for - Intermission/Intro Animation - An interval without actual content. Could be a pause, static frame, or repeating animation. Does not include transitions containing information - Endcards/Credits - Credits or when the YouTube endcards appear. Not for conclusions with information - Preview/Recap/Hook - Collection of clips that show what is coming up or what happened in the video or in other videos of a series, where all information is repeated elsewhere - Filler Tangent/Jokes - Tangential scenes added only for filler or humor that are not required to understand the main content of the video. Does not include segments providing context or background details - Music: Non-Music Section - Only for use in music videos. Sections of music videos without music, that aren\'t already covered by another category - - Skip - Highlight - Skip sponsor - Skip promo - Skip interact - Skip to highlight - Skip intro - Skip intermission - Skip intermission - Skip outro - Skip preview - Skip preview - Skip recap - Skip filler - Skip non-music - Skip segment - - Skipped sponsor - Skipped self promotion - Skipped annoying reminder - Skipped to highlight - Skipped intro - Skipped intermission - Skipped intermission - Skipped outro - Skipped preview - Skipped preview - Skipped recap - Skipped filler - Skipped a non-music section - Skipped unsubmitted segment - Skipped multiple segments - - Skip automatically - Skip automatically once - Show a skip button - Show in seek bar - Disable - - Unable to submit segment: %s - SponsorBlock is temporarily down - Unable to submit segment (status: %d %s) - Unable to submit segment.\nRate Limited (too many from the same user or IP) - Can\'t submit the segment: %s - Can\'t submit the segment.\nAlready exists - Segment submitted successfully - - SponsorBlock temporarily not available - SponsorBlock temporarily not available (status %d) - SponsorBlock temporarily not available (API timed out) - - Unable to vote for segment (API timed out) - Unable to vote for segment (status: %d %s) - Unable to vote for segment: %s - Upvote - Downvote - Change category - There are no segments to vote for - - Choose the segment category - Category is disabled in settings. Enable category to submit. - New SponsorBlock segment - Set %02d:%02d:%03d as the start or end of a new segment? - start - end - now - Time the segment begins at - Time the segment ends at - Are the times correct? - The segment lasts from %02d:%02d to %02d:%02d (%d minutes %02d seconds)\nIs it ready to submit? - Start must be before the end - Mark two locations on the time bar first - Preview the segment, and ensure it skips smoothly - Edit timing of segment manually - Do you want to edit the timing for the start or end of the segment? - Invalid time given - - Stats - Stats temporarily not available (API is down) - Loading... - SponsorBlock is disabled - Your username: <b>%s</b> - Tap here to change your username - Unable to change username: Status: %d %s - Username successfully changed - Your reputation is <b>%.2f</b> - You\'ve created <b>%s</b> segments - SponsorBlock leaderboard - You\'ve saved people from <b>%s</b> segments - Tap here to see the global stats and top contributors - That\'s <b>%s</b> of their lives.<br>Tap here to see the leaderboard - You\'ve skipped <b>%s</b> segments - That\'s <b>%s</b> - Reset skipped segments counter? - %s hours %s minutes - %s minutes %s seconds - %s seconds - - Color: - Color changed - Color reset - Invalid color code - Reset color - - Reset - - About - sponsor.ajay.app - Data is provided by the SponsorBlock API. Tap here to learn more and see downloads for other platforms - diff --git a/src/main/resources/sponsorblock/layout/inline_sponsor_overlay.xml b/src/main/resources/sponsorblock/layout/revanced_sb_inline_sponsor_overlay.xml similarity index 79% rename from src/main/resources/sponsorblock/layout/inline_sponsor_overlay.xml rename to src/main/resources/sponsorblock/layout/revanced_sb_inline_sponsor_overlay.xml index 2e2270a3..fb57b725 100644 --- a/src/main/resources/sponsorblock/layout/inline_sponsor_overlay.xml +++ b/src/main/resources/sponsorblock/layout/revanced_sb_inline_sponsor_overlay.xml @@ -2,8 +2,8 @@ + android:src="@drawable/revanced_sb_adjust" /> + android:src="@drawable/revanced_sb_compare" /> + android:src="@drawable/revanced_sb_edit" /> + android:src="@drawable/revanced_sb_publish" /> \ No newline at end of file diff --git a/src/main/resources/sponsorblock/layout/skip_sponsor_button.xml b/src/main/resources/sponsorblock/layout/revanced_sb_skip_sponsor_button.xml similarity index 82% rename from src/main/resources/sponsorblock/layout/skip_sponsor_button.xml rename to src/main/resources/sponsorblock/layout/revanced_sb_skip_sponsor_button.xml index 185960ec..b25987ff 100644 --- a/src/main/resources/sponsorblock/layout/skip_sponsor_button.xml +++ b/src/main/resources/sponsorblock/layout/revanced_sb_skip_sponsor_button.xml @@ -3,7 +3,7 @@ xmlns:yt="http://schemas.android.com/apk/res-auto"> - - \ No newline at end of file From 1eb334a618cffe92f65654e9dd3db9a488291200 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 27 Jan 2024 01:36:04 +0000 Subject: [PATCH 40/44] chore(release): 4.0.0-dev.13 [skip ci] # [4.0.0-dev.13](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.12...v4.0.0-dev.13) (2024-01-27) ### Features * Move strings to resources for localization ([#2440](https://github.com/ReVanced/revanced-patches/issues/2440)) ([060ab8f](https://github.com/ReVanced/revanced-patches/commit/060ab8fbfeee212f9a93f52f4d24584f2c630047)) ### BREAKING CHANGES * Various APIs have been changed. --- CHANGELOG.md | 12 ++++++++++++ gradle.properties | 2 +- patches.json | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b830baa..05c07215 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# [4.0.0-dev.13](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.12...v4.0.0-dev.13) (2024-01-27) + + +### Features + +* Move strings to resources for localization ([#2440](https://github.com/ReVanced/revanced-patches/issues/2440)) ([060ab8f](https://github.com/ReVanced/revanced-patches/commit/060ab8fbfeee212f9a93f52f4d24584f2c630047)) + + +### BREAKING CHANGES + +* Various APIs have been changed. + # [4.0.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.11...v4.0.0-dev.12) (2024-01-24) diff --git a/gradle.properties b/gradle.properties index 6c05f9df..ff9881db 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 4.0.0-dev.12 +version = 4.0.0-dev.13 diff --git a/patches.json b/patches.json index 14c305f2..5af611a3 100644 --- a/patches.json +++ b/patches.json @@ -1 +1 @@ -[{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"Change header","description":"Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" Either a header name or a path to a custom header folder to use in the top bar.\n The path to a folder must contain one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player. Including this patch may cause issues with tapping or double tapping the video player overlay.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos and retains the speed configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file +[{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos and retains the speed configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player. Including this patch may cause issues with tapping or double tapping the video player overlay.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change header","description":"Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" Either a header name or a path to a custom header folder to use in the top bar.\n The path to a folder must contain one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file From dd108ff70f54c16694624ab30d3e1085ac0c215a Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 27 Jan 2024 05:42:18 +0400 Subject: [PATCH 41/44] feat(YouTube - Spoof app version): Add `18.09.39` to restore library tab (#2643) Co-authored-by: oSumAtrIX --- src/main/resources/addresources/values/arrays.xml | 2 ++ src/main/resources/addresources/values/strings.xml | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/resources/addresources/values/arrays.xml b/src/main/resources/addresources/values/arrays.xml index f54dd3b8..1c7d050f 100644 --- a/src/main/resources/addresources/values/arrays.xml +++ b/src/main/resources/addresources/values/arrays.xml @@ -7,10 +7,12 @@ @string/revanced_spoof_app_version_target_entry_3 @string/revanced_spoof_app_version_target_entry_4 @string/revanced_spoof_app_version_target_entry_5 + @string/revanced_spoof_app_version_target_entry_6 18.33.40 18.20.39 + 18.09.39 17.08.35 16.08.35 16.01.35 diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml index 354fd710..e312ffe5 100644 --- a/src/main/resources/addresources/values/strings.xml +++ b/src/main/resources/addresources/values/strings.xml @@ -782,9 +782,10 @@ Spoof app version target 18.33.40 - Restore RYD Shorts incognito mode 18.20.39 - Restore wide video speed & quality menu - 17.08.35 - Restore old UI layout - 16.08.35 - Restore explore tab - 16.01.35 - Restore fewer video player action buttons + 18.09.39 - Restore library tab + 17.08.35 - Restore old UI layout + 16.08.35 - Restore explore tab + 16.01.35 - Restore fewer video player action buttons Set start page From d5dde1610f58d0eeb55b6fa89b04ec8916746f09 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 27 Jan 2024 01:44:35 +0000 Subject: [PATCH 42/44] chore(release): 4.0.0-dev.14 [skip ci] # [4.0.0-dev.14](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.13...v4.0.0-dev.14) (2024-01-27) ### Features * **YouTube - Spoof app version:** Add `18.09.39` to restore library tab ([#2643](https://github.com/ReVanced/revanced-patches/issues/2643)) ([dd108ff](https://github.com/ReVanced/revanced-patches/commit/dd108ff70f54c16694624ab30d3e1085ac0c215a)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05c07215..507ab3a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [4.0.0-dev.14](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.13...v4.0.0-dev.14) (2024-01-27) + + +### Features + +* **YouTube - Spoof app version:** Add `18.09.39` to restore library tab ([#2643](https://github.com/ReVanced/revanced-patches/issues/2643)) ([dd108ff](https://github.com/ReVanced/revanced-patches/commit/dd108ff70f54c16694624ab30d3e1085ac0c215a)) + # [4.0.0-dev.13](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.12...v4.0.0-dev.13) (2024-01-27) diff --git a/gradle.properties b/gradle.properties index ff9881db..46008904 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 4.0.0-dev.13 +version = 4.0.0-dev.14 From fbbecd33bbc92999d79d74f0abf54d129e3ee407 Mon Sep 17 00:00:00 2001 From: Marko <34315725+rospino74@users.noreply.github.com> Date: Sat, 27 Jan 2024 02:57:22 +0100 Subject: [PATCH 43/44] feat(Photomath): Add `Hide update popup` patch (#2637) Co-authored-by: oSumAtrIX BREAKING CHANGE: Some packages have changed locations. --- api/revanced-patches.api | 10 +++++-- .../misc/annoyances/HideUpdatePopupPatch.kt | 26 +++++++++++++++++++ .../HideUpdatePopupFingerprint.kt | 22 ++++++++++++++++ .../bookpoint/EnableBookpointPatch.kt | 4 +-- .../IsBookpointEnabledFingerprint.kt | 2 +- .../plus}/UnlockPlusPatch.kt | 6 ++--- .../fingerprints/IsPlusUnlockedFingerprint.kt | 2 +- 7 files changed, 63 insertions(+), 9 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/HideUpdatePopupPatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/fingerprints/HideUpdatePopupFingerprint.kt rename src/main/kotlin/app/revanced/patches/photomath/misc/{ => unlock}/bookpoint/EnableBookpointPatch.kt (81%) rename src/main/kotlin/app/revanced/patches/photomath/misc/{ => unlock}/bookpoint/fingerprints/IsBookpointEnabledFingerprint.kt (85%) rename src/main/kotlin/app/revanced/patches/photomath/misc/{unlockplus => unlock/plus}/UnlockPlusPatch.kt (80%) rename src/main/kotlin/app/revanced/patches/photomath/misc/{unlockplus => unlock/plus}/fingerprints/IsPlusUnlockedFingerprint.kt (86%) diff --git a/api/revanced-patches.api b/api/revanced-patches.api index 1555a149..8df98dba 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -418,8 +418,14 @@ public final class app/revanced/patches/photomath/detection/signature/SignatureD public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public final class app/revanced/patches/photomath/misc/unlockplus/UnlockPlusPatch : app/revanced/patcher/patch/BytecodePatch { - public static final field INSTANCE Lapp/revanced/patches/photomath/misc/unlockplus/UnlockPlusPatch; +public final class app/revanced/patches/photomath/misc/annoyances/HideUpdatePopupPatch : app/revanced/patcher/patch/BytecodePatch { + public static final field INSTANCE Lapp/revanced/patches/photomath/misc/annoyances/HideUpdatePopupPatch; + public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V + public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V +} + +public final class app/revanced/patches/photomath/misc/unlock/plus/UnlockPlusPatch : app/revanced/patcher/patch/BytecodePatch { + public static final field INSTANCE Lapp/revanced/patches/photomath/misc/unlock/plus/UnlockPlusPatch; public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } diff --git a/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/HideUpdatePopupPatch.kt b/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/HideUpdatePopupPatch.kt new file mode 100644 index 00000000..14755590 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/HideUpdatePopupPatch.kt @@ -0,0 +1,26 @@ +package app.revanced.patches.photomath.misc.annoyances + +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.annotation.CompatiblePackage +import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.photomath.detection.signature.SignatureDetectionPatch +import app.revanced.patches.photomath.misc.annoyances.fingerprints.HideUpdatePopupFingerprint +import app.revanced.util.exception + +@Patch( + name = "Hide update popup", + description = "Prevents the update popup from showing up.", + dependencies = [SignatureDetectionPatch::class], + compatiblePackages = [CompatiblePackage("com.microblink.photomath", ["8.32.0"])] +) +@Suppress("unused") +object HideUpdatePopupPatch : BytecodePatch( + setOf(HideUpdatePopupFingerprint) +) { + override fun execute(context: BytecodeContext) = HideUpdatePopupFingerprint.result?.mutableMethod?.addInstructions( + 2, // Insert after the null check. + "return-void" + ) ?: throw HideUpdatePopupFingerprint.exception +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/fingerprints/HideUpdatePopupFingerprint.kt b/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/fingerprints/HideUpdatePopupFingerprint.kt new file mode 100644 index 00000000..f57666b6 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/fingerprints/HideUpdatePopupFingerprint.kt @@ -0,0 +1,22 @@ +package app.revanced.patches.photomath.misc.annoyances.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode + +internal object HideUpdatePopupFingerprint : MethodFingerprint( + customFingerprint = { _, classDef -> + // The popup is shown only in the main activity + classDef.type == "Lcom/microblink/photomath/main/activity/MainActivity;" + }, + opcodes = listOf( + Opcode.CONST_HIGH16, + Opcode.INVOKE_VIRTUAL, // ViewPropertyAnimator.alpha(1.0f) + Opcode.MOVE_RESULT_OBJECT, + Opcode.CONST_WIDE_16, + Opcode.INVOKE_VIRTUAL, // ViewPropertyAnimator.setDuration(1000L) + ), + accessFlags = AccessFlags.FINAL or AccessFlags.PUBLIC, + returnType = "V", +) diff --git a/src/main/kotlin/app/revanced/patches/photomath/misc/bookpoint/EnableBookpointPatch.kt b/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/EnableBookpointPatch.kt similarity index 81% rename from src/main/kotlin/app/revanced/patches/photomath/misc/bookpoint/EnableBookpointPatch.kt rename to src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/EnableBookpointPatch.kt index f3dc575e..6d12d0e2 100644 --- a/src/main/kotlin/app/revanced/patches/photomath/misc/bookpoint/EnableBookpointPatch.kt +++ b/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/EnableBookpointPatch.kt @@ -1,11 +1,11 @@ -package app.revanced.patches.photomath.misc.bookpoint +package app.revanced.patches.photomath.misc.unlock.bookpoint import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.photomath.misc.bookpoint.fingerprints.IsBookpointEnabledFingerprint +import app.revanced.patches.photomath.misc.unlock.bookpoint.fingerprints.IsBookpointEnabledFingerprint @Patch(description = "Enables textbook access") internal object EnableBookpointPatch : BytecodePatch( diff --git a/src/main/kotlin/app/revanced/patches/photomath/misc/bookpoint/fingerprints/IsBookpointEnabledFingerprint.kt b/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/fingerprints/IsBookpointEnabledFingerprint.kt similarity index 85% rename from src/main/kotlin/app/revanced/patches/photomath/misc/bookpoint/fingerprints/IsBookpointEnabledFingerprint.kt rename to src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/fingerprints/IsBookpointEnabledFingerprint.kt index 0a60647a..e5ae3c2d 100644 --- a/src/main/kotlin/app/revanced/patches/photomath/misc/bookpoint/fingerprints/IsBookpointEnabledFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/fingerprints/IsBookpointEnabledFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.photomath.misc.bookpoint.fingerprints +package app.revanced.patches.photomath.misc.unlock.bookpoint.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/photomath/misc/unlockplus/UnlockPlusPatch.kt b/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/UnlockPlusPatch.kt similarity index 80% rename from src/main/kotlin/app/revanced/patches/photomath/misc/unlockplus/UnlockPlusPatch.kt rename to src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/UnlockPlusPatch.kt index 15ec53ab..8895696c 100644 --- a/src/main/kotlin/app/revanced/patches/photomath/misc/unlockplus/UnlockPlusPatch.kt +++ b/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/UnlockPlusPatch.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.photomath.misc.unlockplus +package app.revanced.patches.photomath.misc.unlock.plus import app.revanced.util.exception import app.revanced.patcher.data.BytecodeContext @@ -7,8 +7,8 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.photomath.detection.signature.SignatureDetectionPatch -import app.revanced.patches.photomath.misc.bookpoint.EnableBookpointPatch -import app.revanced.patches.photomath.misc.unlockplus.fingerprints.IsPlusUnlockedFingerprint +import app.revanced.patches.photomath.misc.unlock.bookpoint.EnableBookpointPatch +import app.revanced.patches.photomath.misc.unlock.plus.fingerprints.IsPlusUnlockedFingerprint @Patch( name = "Unlock plus", diff --git a/src/main/kotlin/app/revanced/patches/photomath/misc/unlockplus/fingerprints/IsPlusUnlockedFingerprint.kt b/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/fingerprints/IsPlusUnlockedFingerprint.kt similarity index 86% rename from src/main/kotlin/app/revanced/patches/photomath/misc/unlockplus/fingerprints/IsPlusUnlockedFingerprint.kt rename to src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/fingerprints/IsPlusUnlockedFingerprint.kt index 72db0e6b..2ab140b1 100644 --- a/src/main/kotlin/app/revanced/patches/photomath/misc/unlockplus/fingerprints/IsPlusUnlockedFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/fingerprints/IsPlusUnlockedFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.photomath.misc.unlockplus.fingerprints +package app.revanced.patches.photomath.misc.unlock.plus.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint From db55c7bf28c28f4ea2248aee93884866970174cf Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 27 Jan 2024 01:59:36 +0000 Subject: [PATCH 44/44] chore(release): 4.0.0-dev.15 [skip ci] # [4.0.0-dev.15](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.14...v4.0.0-dev.15) (2024-01-27) ### Features * **Photomath:** Add `Hide update popup` patch ([#2637](https://github.com/ReVanced/revanced-patches/issues/2637)) ([fbbecd3](https://github.com/ReVanced/revanced-patches/commit/fbbecd33bbc92999d79d74f0abf54d129e3ee407)) ### BREAKING CHANGES * **Photomath:** Some packages have changed locations. --- CHANGELOG.md | 12 ++++++++++++ gradle.properties | 2 +- patches.json | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 507ab3a4..e93925e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# [4.0.0-dev.15](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.14...v4.0.0-dev.15) (2024-01-27) + + +### Features + +* **Photomath:** Add `Hide update popup` patch ([#2637](https://github.com/ReVanced/revanced-patches/issues/2637)) ([fbbecd3](https://github.com/ReVanced/revanced-patches/commit/fbbecd33bbc92999d79d74f0abf54d129e3ee407)) + + +### BREAKING CHANGES + +* **Photomath:** Some packages have changed locations. + # [4.0.0-dev.14](https://github.com/ReVanced/revanced-patches/compare/v4.0.0-dev.13...v4.0.0-dev.14) (2024-01-27) diff --git a/gradle.properties b/gradle.properties index 46008904..3a082331 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 4.0.0-dev.14 +version = 4.0.0-dev.15 diff --git a/patches.json b/patches.json index 5af611a3..f98e7072 100644 --- a/patches.json +++ b/patches.json @@ -1 +1 @@ -[{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos and retains the speed configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player. Including this patch may cause issues with tapping or double tapping the video player overlay.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change header","description":"Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" Either a header name or a path to a custom header folder to use in the top bar.\n The path to a folder must contain one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file +[{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide update popup","description":"Prevents the update popup from showing up.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":["8.32.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":["2.2.7"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":["4.29"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription","description":"Unlocks the subscription feature but requires a custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"values":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof SIM country","description":"Spoofs country information returned by the SIM card provider.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"networkCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Network ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false},{"key":"simCountryIso","default":null,"values":{"Andorra":"AD","United Arab Emirates":"AE","Afghanistan":"AF","Antigua \u0026 Barbuda":"AG","Anguilla":"AI","Albania":"AL","Armenia":"AM","Angola":"AO","Antarctica":"AQ","Argentina":"AR","American Samoa":"AS","Austria":"AT","Australia":"AU","Aruba":"AW","Åland Islands":"AX","Azerbaijan":"AZ","Bosnia \u0026 Herzegovina":"BA","Barbados":"BB","Bangladesh":"BD","Belgium":"BE","Burkina Faso":"BF","Bulgaria":"BG","Bahrain":"BH","Burundi":"BI","Benin":"BJ","St. Barthélemy":"BL","Bermuda":"BM","Brunei":"BN","Bolivia":"BO","Caribbean Netherlands":"BQ","Brazil":"BR","Bahamas":"BS","Bhutan":"BT","Bouvet Island":"BV","Botswana":"BW","Belarus":"BY","Belize":"BZ","Canada":"CA","Cocos (Keeling) Islands":"CC","Congo - Kinshasa":"CD","Central African Republic":"CF","Congo - Brazzaville":"CG","Switzerland":"CH","Côte d’Ivoire":"CI","Cook Islands":"CK","Chile":"CL","Cameroon":"CM","China":"CN","Colombia":"CO","Costa Rica":"CR","Cuba":"CU","Cape Verde":"CV","Curaçao":"CW","Christmas Island":"CX","Cyprus":"CY","Czechia":"CZ","Germany":"DE","Djibouti":"DJ","Denmark":"DK","Dominica":"DM","Dominican Republic":"DO","Algeria":"DZ","Ecuador":"EC","Estonia":"EE","Egypt":"EG","Western Sahara":"EH","Eritrea":"ER","Spain":"ES","Ethiopia":"ET","Finland":"FI","Fiji":"FJ","Falkland Islands":"FK","Micronesia":"FM","Faroe Islands":"FO","France":"FR","Gabon":"GA","United Kingdom":"GB","Grenada":"GD","Georgia":"GE","French Guiana":"GF","Guernsey":"GG","Ghana":"GH","Gibraltar":"GI","Greenland":"GL","Gambia":"GM","Guinea":"GN","Guadeloupe":"GP","Equatorial Guinea":"GQ","Greece":"GR","South Georgia \u0026 South Sandwich Islands":"GS","Guatemala":"GT","Guam":"GU","Guinea-Bissau":"GW","Guyana":"GY","Hong Kong SAR China":"HK","Heard \u0026 McDonald Islands":"HM","Honduras":"HN","Croatia":"HR","Haiti":"HT","Hungary":"HU","Indonesia":"ID","Ireland":"IE","Israel":"IL","Isle of Man":"IM","India":"IN","British Indian Ocean Territory":"IO","Iraq":"IQ","Iran":"IR","Iceland":"IS","Italy":"IT","Jersey":"JE","Jamaica":"JM","Jordan":"JO","Japan":"JP","Kenya":"KE","Kyrgyzstan":"KG","Cambodia":"KH","Kiribati":"KI","Comoros":"KM","St. Kitts \u0026 Nevis":"KN","North Korea":"KP","South Korea":"KR","Kuwait":"KW","Cayman Islands":"KY","Kazakhstan":"KZ","Laos":"LA","Lebanon":"LB","St. Lucia":"LC","Liechtenstein":"LI","Sri Lanka":"LK","Liberia":"LR","Lesotho":"LS","Lithuania":"LT","Luxembourg":"LU","Latvia":"LV","Libya":"LY","Morocco":"MA","Monaco":"MC","Moldova":"MD","Montenegro":"ME","St. Martin":"MF","Madagascar":"MG","Marshall Islands":"MH","Macedonia":"MK","Mali":"ML","Myanmar (Burma)":"MM","Mongolia":"MN","Macau SAR China":"MO","Northern Mariana Islands":"MP","Martinique":"MQ","Mauritania":"MR","Montserrat":"MS","Malta":"MT","Mauritius":"MU","Maldives":"MV","Malawi":"MW","Mexico":"MX","Malaysia":"MY","Mozambique":"MZ","Namibia":"NA","New Caledonia":"NC","Niger":"NE","Norfolk Island":"NF","Nigeria":"NG","Nicaragua":"NI","Netherlands":"NL","Norway":"NO","Nepal":"NP","Nauru":"NR","Niue":"NU","New Zealand":"NZ","Oman":"OM","Panama":"PA","Peru":"PE","French Polynesia":"PF","Papua New Guinea":"PG","Philippines":"PH","Pakistan":"PK","Poland":"PL","St. Pierre \u0026 Miquelon":"PM","Pitcairn Islands":"PN","Puerto Rico":"PR","Palestinian Territories":"PS","Portugal":"PT","Palau":"PW","Paraguay":"PY","Qatar":"QA","Réunion":"RE","Romania":"RO","Serbia":"RS","Russia":"RU","Rwanda":"RW","Saudi Arabia":"SA","Solomon Islands":"SB","Seychelles":"SC","Sudan":"SD","Sweden":"SE","Singapore":"SG","St. Helena":"SH","Slovenia":"SI","Svalbard \u0026 Jan Mayen":"SJ","Slovakia":"SK","Sierra Leone":"SL","San Marino":"SM","Senegal":"SN","Somalia":"SO","Suriname":"SR","South Sudan":"SS","São Tomé \u0026 Príncipe":"ST","El Salvador":"SV","Sint Maarten":"SX","Syria":"SY","Swaziland":"SZ","Turks \u0026 Caicos Islands":"TC","Chad":"TD","French Southern Territories":"TF","Togo":"TG","Thailand":"TH","Tajikistan":"TJ","Tokelau":"TK","Timor-Leste":"TL","Turkmenistan":"TM","Tunisia":"TN","Tonga":"TO","Turkey":"TR","Trinidad \u0026 Tobago":"TT","Tuvalu":"TV","Taiwan":"TW","Tanzania":"TZ","Ukraine":"UA","Uganda":"UG","U.S. Outlying Islands":"UM","United States":"US","Uruguay":"UY","Uzbekistan":"UZ","Vatican City":"VA","St. Vincent \u0026 Grenadines":"VC","Venezuela":"VE","British Virgin Islands":"VG","U.S. Virgin Islands":"VI","Vietnam":"VN","Vanuatu":"VU","Wallis \u0026 Futuna":"WF","Samoa":"WS","Yemen":"YE","Mayotte":"YT","South Africa":"ZA","Zambia":"ZM","Zimbabwe":"ZW"},"title":"Sim ISO Country Code","description":"ISO-3166-1 alpha-2 country code equivalent for the SIM provider\u0027s country code.","required":false}]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":"Default","values":{"Default":"Default"},"title":"Package name","description":"The name of the package to rename the app to.","required":true}]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"use":false,"requiresIntegrations":true,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":["2.2 build 016"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default X (Formerly Twitter) Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos and retains the speed configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember clear display","description":"Remembers the clear display configurations in between videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["32.5.3"]},{"name":"com.zhiliaoapp.musically","versions":["32.5.3"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide story ads","description":"Hides the ads in the Facebook app stories.","compatiblePackages":[{"name":"com.facebook.katana","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0","16.9.1"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","values":null,"title":"Primary background color","description":"The background color. Can be a hex color or a resource reference.","required":true},{"key":"backgroundColorSecondary","default":"#ff282828","values":null,"title":"Secondary background color","description":"The secondary background color. (e.g. search box, artist \u0026 podcast). Can be a hex color or a resource reference.","required":true},{"key":"accentColor","default":"#ff1ed760","values":null,"title":"Accent color","description":"The accent color (\u0027Spotify green\u0027 by default). Can be a hex color or a resource reference.","required":true},{"key":"accentColorPressed","default":"#ff169c46","values":null,"title":"Pressed dark theme accent color","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides most of the ads across the app.","compatiblePackages":[{"name":"com.myfitnesspal.android","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass root checks","description":"Removes the restriction to use the app with root permissions or on a custom ROM.","compatiblePackages":[{"name":"it.ipzs.cieid","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":["10.1.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options to enable and configure volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video URL","description":"Adds options to display buttons in the video player to copy video URLs.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Adds an option to enable tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable precise seeking gesture","description":"Adds an option to disable precise seeking when swiping up on the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable slide to seek","description":"Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player. Including this patch may cause issues with tapping or double tapping the video player overlay.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external downloader app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to remove general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Adds an option to remove ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device dimensions","description":"Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren\u0027t available on the device.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"gmsCoreVendor","default":"com.mgoogle","values":{"Vanced":"com.mgoogle","ReVanced":"app.revanced"},"title":"GmsCore Vendor","description":"The group id of the GmsCore vendor.","required":true}]},{"name":"Minimized playback","description":"Unlocks options for picture-in-picture and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove tracking query parameter","description":"Adds an option to remove the tracking info from links you share.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always repeat","description":"Adds an option to always repeat videos when they end.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds options for debugging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Adds options to spoof the client to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Adds an option to disable haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Announcements","description":"Adds an option to show announcements from ReVanced on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Adds an option to bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable player popup panels","description":"Adds an option to disable panels (such as live chat) from opening automatically.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Adds an option to hide the captions button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide and change navigation buttons (such as the Shorts button).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Adds an option to hide the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds options to hide action buttons (such as the Download button) under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Adds an option to hide the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds an option to hide the previous and next buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old seekbar thumbnails","description":"Adds an option to restore the old seekbar thumbnails that appear above the seekbar while seeking instead of fullscreen thumbnails.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Adds an option to spoof the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled black":"@android:color/black","Material You":"@android:color/system_neutral1_900","Classic (old YouTube)":"#FF212121","Catppuccin (Mocha)":"#FF181825","Dark pink":"#FF290025","Dark blue":"#FF001029","Dark green":"#FF002905","Dark yellow":"#FF282900","Dark orange":"#FF291800","Dark red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Material You":"@android:color/system_neutral1_50","Catppuccin (Latte)":"#FFE6E9EF","Light pink":"#FFFCCFF3","Light blue":"#FFD1E0FF","Light green":"#FFCCFFCC","Light yellow":"#FFFDFFCC","Light orange":"#FFFFE6CC","Light red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":false}]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Adds an option to enable the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Adds an option to hide the timestamp in the bottom left of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Adds options to hide components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable rolling number animations","description":"Adds an option to disable rolling number animations of video view count, user likes, and upload time.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \u0027Load more\u0027 button","description":"Adds an option to hide the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Adds an option to hide the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Adds an option to hide suggested video cards at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Adds an option to hide album cards below artist descriptions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable fullscreen ambient mode","description":"Adds an option to disable the ambient mode when in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable suggested video end screen","description":"Adds an option to disable the suggested video end screen at the end of videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Adds an option to hide the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Adds an option to hide info cards that creators add in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Adds options to hide menu items that appear when pressing the gear icon in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Adds options to hide the category bar at the top of video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Adds an option to hide the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Adds an option to hide the floating microphone button when searching.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Adds an option to change the opacity of the video player background when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change header","description":"Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"header","default":"ReVanced (borderless logo)","values":{"YouTube":"yt_wordmark_header","YouTube Premium":"yt_premium_wordmark_header","ReVanced":"ReVanced","ReVanced (borderless logo)":"ReVanced (borderless logo)"},"title":"Header","description":" Either a header name or a path to a custom header folder to use in the top bar.\n The path to a folder must contain one or more of the following folders matching the DPI of your device:\n\n - drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-mdpi\n- drawable-hdpi\n\n These folders must contain the following files:\n\n - yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png","required":true}]},{"name":"Custom branding","description":"Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","values":{"YouTube ReVanced":"YouTube ReVanced","YT ReVanced":"YT ReVanced","YT":"YT","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":false},{"key":"iconPath","default":"ReVanced*Logo","values":{"ReVanced Logo":"ReVanced*Logo"},"title":"App icon","description":"The path to a folder containing the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders has to have the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":false}]},{"name":"HDR auto brightness","description":"Adds an option to make the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds options to customize available playback speeds and to remember the last playback speed selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old video quality menu","description":"Adds an option to restore the old video quality menu with specific video resolution options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36","18.38.44","18.43.45","18.44.41","18.45.43","18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds an option to remember the last video quality selected.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.48.39","18.49.37","19.01.34","19.02.39","19.03.35"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file