From b04e078e95735e8051b3d217d9fe9e838792743f Mon Sep 17 00:00:00 2001 From: Lanchon Date: Mon, 25 Feb 2019 18:19:31 -0300 Subject: [PATCH] Add UI support for APIs 26 and 27 (Android 8.0 and 8.1 Oreo) --- bulk-patch-builder/build-all | 1 + .../Settings.apk/DevelopmentSettings.java | 230 ++++++++++++++++++ .../services.jar/GeneratePackageInfoHook.java | 46 ++++ patches/bulk-patch-builder.log | 60 +++++ .../Settings.apk.dex | Bin 0 -> 10144 bytes .../services.jar.dex | Bin 0 -> 5160 bytes 6 files changed, 337 insertions(+) create mode 100644 patches-src/sigspoof-ui-global-8.0-8.1/Settings.apk/DevelopmentSettings.java create mode 100644 patches-src/sigspoof-ui-global-8.0-8.1/services.jar/GeneratePackageInfoHook.java create mode 100644 patches/sigspoof-ui-global-8.0-8.1/Settings.apk.dex create mode 100644 patches/sigspoof-ui-global-8.0-8.1/services.jar.dex diff --git a/bulk-patch-builder/build-all b/bulk-patch-builder/build-all index e21af68..5ea7f31 100755 --- a/bulk-patch-builder/build-all +++ b/bulk-patch-builder/build-all @@ -133,6 +133,7 @@ build_all() { build_one sigspoof-ui-global-4.1-6.0 "$tmp_dir"/sigspoof-core__fs/{1[6-9],2[1-3]}-* build_one sigspoof-ui-global-7.0-7.1 "$tmp_dir"/sigspoof-core__fs/2[4-5]-* + build_one sigspoof-ui-global-8.0-8.1 "$tmp_dir"/sigspoof-core__fs/2[6-7]-* rm -rf "$tmp_dir" diff --git a/patches-src/sigspoof-ui-global-8.0-8.1/Settings.apk/DevelopmentSettings.java b/patches-src/sigspoof-ui-global-8.0-8.1/Settings.apk/DevelopmentSettings.java new file mode 100644 index 0000000..62615d7 --- /dev/null +++ b/patches-src/sigspoof-ui-global-8.0-8.1/Settings.apk/DevelopmentSettings.java @@ -0,0 +1,230 @@ +/* + * Copyright (C) 2015 Marvin W + * Copyright (C) 2016 Lanchon + * + * This is Marvin's work converted to DexPatcher patches by Lanchon. + * + * https://gerrit.omnirom.org/#/c/14898/ + * https://gerrit.omnirom.org/#/c/14899/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.development; + +import java.util.ArrayList; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Build; +import android.os.Bundle; +import android.provider.Settings; +import android.support.v14.preference.PreferenceFragment; +import android.support.v14.preference.SwitchPreference; +import android.support.v7.preference.CheckBoxPreference; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceGroup; +import android.support.v7.preference.PreferenceScreen; +import android.support.v7.preference.TwoStatePreference; +import android.util.Log; + +import com.android.settings.Utils; + +import lanchon.dexpatcher.annotation.*; + +@DexEdit(contentOnly = true) +public class DevelopmentSettings extends PreferenceFragment { + + // SwitchPreference Hooks + + @DexIgnore private final ArrayList mResetSwitchPrefs = new ArrayList(); + @DexIgnore void updateSwitchPreference(SwitchPreference switchPreference, boolean value) { throw null; } + + // CheckBoxPreference Hooks + + @DexIgnore private final ArrayList mResetCbPrefs = new ArrayList(); + @DexIgnore void updateCheckBox(CheckBoxPreference checkBox, boolean value) { throw null; } + + // TwoStatePreference Interface + + @DexAdd + private boolean useSwitchPreference() { + return Build.VERSION.SDK_INT >= 22; // Build.VERSION_CODES.LOLLIPOP_MR1 + } + + @DexAdd + private TwoStatePreference createTwoStatePreference(Context context) { + if (useSwitchPreference()) { + return new SwitchPreference(context); + } else { + return new CheckBoxPreference(context); + } + } + + @DexAdd + private boolean mResetTwoStatePrefsAdd(TwoStatePreference preference) { + if (useSwitchPreference()) { + return mResetSwitchPrefs.add((SwitchPreference) preference); + } else { + return mResetCbPrefs.add((CheckBoxPreference) preference); + } + } + + @DexAdd + private void updateTwoStatePreference(TwoStatePreference preference, boolean value) { + if (useSwitchPreference()) { + updateSwitchPreference((SwitchPreference) preference, value); + } else { + updateCheckBox((CheckBoxPreference) preference, value); + } + } + + @DexAdd + static class FakeSignatureGlobalUI { + + static final String DEBUG_APPLICATIONS_CATEGORY_KEY = "debug_applications_category"; + + static final String SETTING_SECURE_KEY = "allow_fake_signature_global"; + + static final String SETTING_TITLE = + "Allow signature spoofing"; + static final String SETTING_SUMMARY = + //"Allow apps to bypass security systems by pretending to be a different app"; + //"Allow apps to spoof information about their publisher"; + "Allow apps to impersonate other apps"; + static final String SETTING_WARNING = + //"Allowing apps to bypass security systems can lead to serious security and privacy problems! " + + //"Check that only benign apps use the corresponding permission when this is active."; + "Allowing apps to impersonate other apps has security and privacy implications. " + + "Malicious apps can use this functionality to access the private data of other apps.\n\n" + + "Make sure that you trust all installed apps that use the 'FAKE_PACKAGE_SIGNATURE' " + + "permission before enabling this setting."; + + } + + @DexIgnore private final ArrayList mAllPrefs = new ArrayList(); + + @DexAdd private TwoStatePreference mAllowFakeSignatureGlobal; + @DexAdd /* private */ Dialog mAllowFakeSignatureGlobalDialog; + + @DexIgnore + private DevelopmentSettings() { throw null; } + + @DexIgnore + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { throw null; } + + @DexAppend + @Override + public void onCreate(Bundle icicle) { + try { + PreferenceGroup pg = (PreferenceGroup) findPreference( + FakeSignatureGlobalUI.DEBUG_APPLICATIONS_CATEGORY_KEY); + if (pg != null) { + TwoStatePreference p = createTwoStatePreference(pg.getContext()); + p.setKey(FakeSignatureGlobalUI.SETTING_SECURE_KEY); + p.setTitle(FakeSignatureGlobalUI.SETTING_TITLE); + p.setSummary(FakeSignatureGlobalUI.SETTING_SUMMARY); + p.setPersistent(false); + mResetTwoStatePrefsAdd(p); + mAllPrefs.add(p); + //pg.setOrderingAsAdded(true); + pg.addPreference(p); + mAllowFakeSignatureGlobal = p; + } else { + Log.e("DevelopmentSettings_FakeSignatureGlobalUI", "cannot find 'applications' preference category"); + } + } catch (Throwable t) { + Log.e("DevelopmentSettings_FakeSignatureGlobalUI", "onCreate exception", t); + } + } + + @DexAppend + private void updateAllOptions() { + if (mAllowFakeSignatureGlobal != null) { + updateAllowFakeSignatureGlobalOption(); + } + } + + @DexAdd + /* private */ void updateAllowFakeSignatureGlobalOption() { + boolean value = Settings.Secure.getInt(getActivity().getContentResolver(), + FakeSignatureGlobalUI.SETTING_SECURE_KEY, 0) != 0; + updateTwoStatePreference(mAllowFakeSignatureGlobal, value); + } + + @DexWrap + @Override + public boolean onPreferenceTreeClick(Preference preference) { + if (Utils.isMonkeyRunning()) { + return false; + } + if (mAllowFakeSignatureGlobal != null) { + if (preference == mAllowFakeSignatureGlobal) { + writeAllowFakeSignatureGlobalOption(); + return false; + } + } + return onPreferenceTreeClick(preference); + } + + @DexAdd + private void writeAllowFakeSignatureGlobalOption() { + if (mAllowFakeSignatureGlobal.isChecked()) { + if (mAllowFakeSignatureGlobalDialog != null) { + dismissDialogs(); + } + @DexAdd + class Listener implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener { + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == DialogInterface.BUTTON_POSITIVE) { + Settings.Secure.putInt(getActivity().getContentResolver(), + FakeSignatureGlobalUI.SETTING_SECURE_KEY, 1); + } + //updateAllowFakeSignatureGlobalOption(); // handled by onDismiss(...) + } + @Override + public void onDismiss(DialogInterface dialog) { + updateAllowFakeSignatureGlobalOption(); + mAllowFakeSignatureGlobalDialog = null; + } + } + Listener listener = new Listener(); + mAllowFakeSignatureGlobalDialog = new AlertDialog.Builder(getActivity()) + .setMessage(FakeSignatureGlobalUI.SETTING_WARNING) + .setTitle(FakeSignatureGlobalUI.SETTING_TITLE) + .setIconAttribute(android.R.attr.alertDialogIcon) + .setPositiveButton(android.R.string.yes, listener) + .setNegativeButton(android.R.string.no, listener) + .create(); + mAllowFakeSignatureGlobalDialog.setOnDismissListener(listener); + mAllowFakeSignatureGlobalDialog.show(); + } else { + Settings.Secure.putInt(getActivity().getContentResolver(), + FakeSignatureGlobalUI.SETTING_SECURE_KEY, 0); + updateAllowFakeSignatureGlobalOption(); + } + } + + @DexAppend + private void dismissDialogs() { + if (mAllowFakeSignatureGlobalDialog != null) { + mAllowFakeSignatureGlobalDialog.dismiss(); + mAllowFakeSignatureGlobalDialog = null; + } + } + +} diff --git a/patches-src/sigspoof-ui-global-8.0-8.1/services.jar/GeneratePackageInfoHook.java b/patches-src/sigspoof-ui-global-8.0-8.1/services.jar/GeneratePackageInfoHook.java new file mode 100644 index 0000000..a279865 --- /dev/null +++ b/patches-src/sigspoof-ui-global-8.0-8.1/services.jar/GeneratePackageInfoHook.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2015 Marvin W + * Copyright (C) 2016 Lanchon + * + * This is Marvin's work converted to DexPatcher patches by Lanchon. + * + * https://gerrit.omnirom.org/#/c/14898/ + * https://gerrit.omnirom.org/#/c/14899/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.pm; + +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageParser; +import android.provider.Settings; + +import lanchon.dexpatcher.annotation.*; + +@DexEdit +class GeneratePackageInfoHook { + + @DexAdd + static class FakeSignatureGlobalUI { + static final String SECURE_SETTING = "allow_fake_signature_global"; + } + + @DexReplace + private static boolean getGlobalEnable(PackageInfo pi, Context context, PackageParser.Package p, int flags, int userId) { + return Settings.Secure.getInt(context.getContentResolver(), + FakeSignatureGlobalUI.SECURE_SETTING, 0) != 0; + } + +} diff --git a/patches/bulk-patch-builder.log b/patches/bulk-patch-builder.log index aac2211..4f9844c 100644 --- a/patches/bulk-patch-builder.log +++ b/patches/bulk-patch-builder.log @@ -1260,3 +1260,63 @@ info: dry run due to '--dry-run' option ********* BUILT AGAINST: 24-7.0-cm-14.0-20161011-UNOFFICIAL-hammerheadcaf-nyyu_tk__sigspoof-hook-7.0-8.1__sigspoof-core +********* BUILD: sigspoof-ui-global-8.0-8.1 + +****** build: sigspoof-ui-global-8.0-8.1 +****** against: 26-8.0-lineage-15.0-20170915-UNOFFICIAL-falcon-allstargaurav__sigspoof-hook-7.0-8.1__sigspoof-core + +>>> target directory: /home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-ui-global-8.0-8.1/sigspoof-ui-global-8.0-8.1__26-8.0-lineage-15.0-20170915-UNOFFICIAL-falcon-allstargaurav__sigspoof-hook-7.0-8.1__sigspoof-core +>>> build patch: services.jar +>>> build patch: Settings.apk + +*** apply fileset patch (dry-run) +>>> apply patch: services.jar +>>> dexpatcher --api-level 26 --verbose --dry-run --multi-dex /home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-core__fs/26-8.0-lineage-15.0-20170915-UNOFFICIAL-falcon-allstargaurav__sigspoof-hook-7.0-8.1__sigspoof-core/services.jar /home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-ui-global-8.0-8.1/sigspoof-ui-global-8.0-8.1__26-8.0-lineage-15.0-20170915-UNOFFICIAL-falcon-allstargaurav__sigspoof-hook-7.0-8.1__sigspoof-core/services.jar.dex +DexPatcher version 1.6.2 by Lanchon (https://dexpatcher.github.io/) +info: read '/home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-core__fs/26-8.0-lineage-15.0-20170915-UNOFFICIAL-falcon-allstargaurav__sigspoof-hook-7.0-8.1__sigspoof-core/services.jar' +info: read '/home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-ui-global-8.0-8.1/sigspoof-ui-global-8.0-8.1__26-8.0-lineage-15.0-20170915-UNOFFICIAL-falcon-allstargaurav__sigspoof-hook-7.0-8.1__sigspoof-core/services.jar.dex' +info: type 'com.android.server.pm.GeneratePackageInfoHook': method '():void': (GeneratePackageInfoHook.java:33): implicit ignore of trivial default constructor +info: dry run due to '--dry-run' option +0 error(s), 0 warning(s) +>>> apply patch: Settings.apk +>>> dexpatcher --api-level 26 --verbose --dry-run --multi-dex /home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-core__fs/26-8.0-lineage-15.0-20170915-UNOFFICIAL-falcon-allstargaurav__sigspoof-hook-7.0-8.1__sigspoof-core/Settings.apk /home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-ui-global-8.0-8.1/sigspoof-ui-global-8.0-8.1__26-8.0-lineage-15.0-20170915-UNOFFICIAL-falcon-allstargaurav__sigspoof-hook-7.0-8.1__sigspoof-core/Settings.apk.dex +DexPatcher version 1.6.2 by Lanchon (https://dexpatcher.github.io/) +info: read '/home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-core__fs/26-8.0-lineage-15.0-20170915-UNOFFICIAL-falcon-allstargaurav__sigspoof-hook-7.0-8.1__sigspoof-core/Settings.apk' +info: read '/home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-ui-global-8.0-8.1/sigspoof-ui-global-8.0-8.1__26-8.0-lineage-15.0-20170915-UNOFFICIAL-falcon-allstargaurav__sigspoof-hook-7.0-8.1__sigspoof-core/Settings.apk.dex' +info: dry run due to '--dry-run' option +0 error(s), 0 warning(s) + +*** patch-fileset: success +*** build-patch: success + +****** build: sigspoof-ui-global-8.0-8.1 +****** against: 27-8.1-lineage-15.1-20180109-UNOFFICIAL-falcon-carlosarriaga__sigspoof-hook-7.0-8.1__sigspoof-core + +>>> target directory: /home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-ui-global-8.0-8.1/sigspoof-ui-global-8.0-8.1__27-8.1-lineage-15.1-20180109-UNOFFICIAL-falcon-carlosarriaga__sigspoof-hook-7.0-8.1__sigspoof-core +>>> build patch: services.jar +>>> build patch: Settings.apk + +*** apply fileset patch (dry-run) +>>> apply patch: services.jar +>>> dexpatcher --api-level 27 --verbose --dry-run --multi-dex /home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-core__fs/27-8.1-lineage-15.1-20180109-UNOFFICIAL-falcon-carlosarriaga__sigspoof-hook-7.0-8.1__sigspoof-core/services.jar /home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-ui-global-8.0-8.1/sigspoof-ui-global-8.0-8.1__27-8.1-lineage-15.1-20180109-UNOFFICIAL-falcon-carlosarriaga__sigspoof-hook-7.0-8.1__sigspoof-core/services.jar.dex +DexPatcher version 1.6.2 by Lanchon (https://dexpatcher.github.io/) +info: read '/home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-core__fs/27-8.1-lineage-15.1-20180109-UNOFFICIAL-falcon-carlosarriaga__sigspoof-hook-7.0-8.1__sigspoof-core/services.jar' +info: read '/home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-ui-global-8.0-8.1/sigspoof-ui-global-8.0-8.1__27-8.1-lineage-15.1-20180109-UNOFFICIAL-falcon-carlosarriaga__sigspoof-hook-7.0-8.1__sigspoof-core/services.jar.dex' +info: type 'com.android.server.pm.GeneratePackageInfoHook': method '():void': (GeneratePackageInfoHook.java:33): implicit ignore of trivial default constructor +info: dry run due to '--dry-run' option +0 error(s), 0 warning(s) +>>> apply patch: Settings.apk +>>> dexpatcher --api-level 27 --verbose --dry-run --multi-dex /home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-core__fs/27-8.1-lineage-15.1-20180109-UNOFFICIAL-falcon-carlosarriaga__sigspoof-hook-7.0-8.1__sigspoof-core/Settings.apk /home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-ui-global-8.0-8.1/sigspoof-ui-global-8.0-8.1__27-8.1-lineage-15.1-20180109-UNOFFICIAL-falcon-carlosarriaga__sigspoof-hook-7.0-8.1__sigspoof-core/Settings.apk.dex +DexPatcher version 1.6.2 by Lanchon (https://dexpatcher.github.io/) +info: read '/home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-core__fs/27-8.1-lineage-15.1-20180109-UNOFFICIAL-falcon-carlosarriaga__sigspoof-hook-7.0-8.1__sigspoof-core/Settings.apk' +info: read '/home/rod/android/haystack/git/bulk-patch-builder/../patches/tmp.$$$/sigspoof-ui-global-8.0-8.1/sigspoof-ui-global-8.0-8.1__27-8.1-lineage-15.1-20180109-UNOFFICIAL-falcon-carlosarriaga__sigspoof-hook-7.0-8.1__sigspoof-core/Settings.apk.dex' +info: dry run due to '--dry-run' option +0 error(s), 0 warning(s) + +*** patch-fileset: success +*** build-patch: success + +********* PUBLISH: sigspoof-ui-global-8.0-8.1 +********* BUILT AGAINST: 26-8.0-lineage-15.0-20170915-UNOFFICIAL-falcon-allstargaurav__sigspoof-hook-7.0-8.1__sigspoof-core + + diff --git a/patches/sigspoof-ui-global-8.0-8.1/Settings.apk.dex b/patches/sigspoof-ui-global-8.0-8.1/Settings.apk.dex new file mode 100644 index 0000000000000000000000000000000000000000..c53d291aa558b6648e58127d45472695e5db4326 GIT binary patch literal 10144 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 literal 0 HcmV?d00001 diff --git a/patches/sigspoof-ui-global-8.0-8.1/services.jar.dex b/patches/sigspoof-ui-global-8.0-8.1/services.jar.dex new file mode 100644 index 0000000000000000000000000000000000000000..7c2e60c4a24216a60687d9f0046553f3e23eee15 GIT binary patch literal 5160 zcmb7|e{5S<701u};b-TUlen#&)Jc=3>6!*wr)=#y9J+e(OX|)^T-!<8bXEFnzouTD zXV-SJRN_bYAyjEY8h>o+s)7ol1NH}-1QOH4A4njeVjvLv18Mv*@k81lL#vQL2vvyh zdG9)XH5m;z`sCbu&bjB^ci+9|z3YOx);jj+VH$YxxjjeUdG+1QnGX;B>g|)S*1mD) z#?4ob8zb9^Dnzt4|5yORE@!q8PyT-vd7ee*zlrZ4@Lx z9oz&z2X{fZlV}Q5!PmhZ@Hg-;pmY)WK?n?h5pWbFK^mL~7k~*a0}HHzZ-Ups+u(QL zJ@6q=x{0=fJ}?9hfJra|&H)2l0$0FJeokOF7y|qphrwR(2-pWkzefNe~6&;8WljcoG~3PlFkd0)2qX-47;wY2h(R4_Q9=h)PthF3zF+9)&^f|5O7I?LC_98U!U)v%PipfcIY`K&j}X|(WfA{ z;}1*4mLVZyLOvzrgpdiyARNu|0?#Ye4oO@-vXV z7W`XN#&13izC zOXGR>asw0kHDsfg0N)!Ix4jGY?}}{2bKQO1Sv%~9ZA~Mv|4`WZSxQ*&-2Z*(dA%Kn zY?K~U+;(1rDcJuZ`tx|)c8+ra_J0dI?=!cZ*Xo)pKCc0{9b1#G!5-v9io$!tZRfDp zVc#X}yjI6fc+`huOk@mD|i1LX#XDel<2RZ{R0Ge3;YDg zX#WiI*MQgeZ-wq1$Uh3*Um&^PUm@=bJzfDsxE||TA=#I80ioL`bR6?A>W%&}mv2V+ zy8E9OI`?%-LiZWbmt!`r_k2?f33tKvt71HrE@!ti^q+0g`>;NFY+r<)=QLnvWtG~c zopPG4j7i8MtB=By<#w#y zpuM*F`7y5vpB!RZUA%MHXGr)s&-wL6eDRzS>VYyQ+8mDyuhDVn;!S!UOA5L(LeIWj zE;Y43-P8}4rx&5S-sJb4ruL7T`tiQxe!pqbbN*rdpM@SxyL`~p=KI0Yx7VVC+2g|V z+JQRTSi^0W{7zBOviB_N-r@OJa!${XJhGpZk^S=|jgvY)dMrx5@qDRh73;@H8+W7( ztrCmJNsFaY`b?bKCT3?c+4S5*b~a7^xVaX~*NbKA;Iqc6L2cYF6r6@_tW-=(wA*3S z3&r|+-}>T*b%m6DMc3UhVOD zJd+7M8K)hS#$_{8T(XS%O4Xbym2*aEEog5u^lZ ziK&^{v`%UwnM{zBBsrNRC5eB#lZI8OmWzc*zHHS^s~(wfWZJBiORHuzO1+!Atkt75 z_+O^Va>O-=D2@IPkCaiZnbl$8AEluU-%7Q-S}d5=NXD$!i`G(YIAi8<$5GOg`SNn4 zF=lkf5F@zgN6f(RrV|#W$p056N_&$9qqJJQj7wYPy1`2&65FW8&5OoL2@^83iJNZa zOXV8wVxnZ!YEjy?iBH190~Ge%o7kt#<(zOZ5u$$+myKl+rLH8e;z-G`mLhgg>TcFV zsney>t(D~mda)u(0hh~c?pZUBJ9O(Z^(t=b!RyUqEk&`c?vG&88T&|=csakajCE)t z%FyOf^peRQ*{c;Si2lueoDCJF{YlJ1{t}*6!Cb2t_53BQ7uSfe*PM+XrAM~lTEM8b z64Fi=QQG(Lkeo@j6w^sEyrUj^MNcz9f( z@~j%A6_dQSn7v4vU8&))?e*hZ5&uT{eT%njKR&d)XJ6)W`}S>l_50+<8yOBA(gOeI zYB&FrTcpJvuiPr1QhjGbJrp9jOKtmy-inz9Uz#d8{Er+}z&HiNTk=NJNb$lbrq@Z@) zFSWkmZ^g%n_r{>~%DVJ0eAm|1_x#cq*41m>Qp+vyQ~n5(+CR_V=H%&sl$v0Bz_Baa zTsG*{psUUO_$1!lEA{Tg72dZahoR*Pm&SJ_%N(cx{?6J1_;)it8}ONve>>yvEk1S) zLdk1_&vyJ98h^_1x%Czt_%|aySMYbMH0Yc!_z