From 66963e6f26fbc46d9054aabb407026c526645200 Mon Sep 17 00:00:00 2001 From: gfdgd_xi <3025613752@qq.com> Date: Sun, 4 Dec 2022 22:28:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=A7=BB=E9=99=A4=E5=AE=B9?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QemuDownload.py | 3 + QemuRun.py | 2 +- .../apps/deepin-wine-runner/ChangePassword.sh | 3 + .../__pycache__/__init__.cpython-310.pyc | Bin 1180 -> 1122 bytes deb/opt/apps/deepin-wine-runner/ProgramFen.py | 122 ++++++++++++++++++ .../deepin-wine-runner/package-script.zip | Bin 301376 -> 301376 bytes .../apps/deepin-wine-runner/req/__init__.py | 19 +-- .../req/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1163 bytes .../req/__pycache__/__init__.cpython-37.pyc | Bin 1195 -> 980 bytes mainwindow.py | 40 +++++- package-script.zip | Bin 301376 -> 301376 bytes 11 files changed, 172 insertions(+), 17 deletions(-) create mode 100644 deb/opt/apps/deepin-wine-runner/ChangePassword.sh create mode 100644 deb/opt/apps/deepin-wine-runner/ProgramFen.py create mode 100644 deb/opt/apps/deepin-wine-runner/req/__pycache__/__init__.cpython-310.pyc diff --git a/QemuDownload.py b/QemuDownload.py index 7dede56..c081e03 100755 --- a/QemuDownload.py +++ b/QemuDownload.py @@ -334,6 +334,9 @@ def on_addButton_clicked(): QT.thread.start() def on_delButton_clicked(): + if os.path.exists("/tmp/deepin-wine-runner-qemu-lock"): + if QtWidgets.QMessageBox.question(window, "提示", "检测到您的电脑已经运行了 Qemu/Chroot 容器,建议您重启电脑后再删除该容器,否则容易造成数据损失!\n是否取消操作?") == QtWidgets.QMessageBox.Yes: + return if QtWidgets.QMessageBox.question(window, "提示", "你确定要删除吗?") == QtWidgets.QMessageBox.No: return if ui.localWineList.currentIndex().row() < 0: diff --git a/QemuRun.py b/QemuRun.py index 77bcd5f..1f0541c 100755 --- a/QemuRun.py +++ b/QemuRun.py @@ -33,7 +33,7 @@ if __name__ == "__main__": continue if os.path.ismount(f"{bottlePath}/dev"): os.system(f"pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY bash '{programPath}/UnMount.sh' '{bottlePath}' ") - + os.system("touch /tmp/deepin-wine-runner-qemu-lock") # 判断是否挂载 if not os.path.ismount(f"{homePath}/.deepin-wine-runner-ubuntu-images/{sys.argv[1]}/dev"): print("文件暂未挂载,开始挂载") diff --git a/deb/opt/apps/deepin-wine-runner/ChangePassword.sh b/deb/opt/apps/deepin-wine-runner/ChangePassword.sh new file mode 100644 index 0000000..f9ab33c --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/ChangePassword.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo -e "123456\n123456\n\n\n\n\n\n\n\n\n" | adduser "$1" +echo -e "123456\n123456\n" | passwd root \ No newline at end of file diff --git a/deb/opt/apps/deepin-wine-runner/Model/__pycache__/__init__.cpython-310.pyc b/deb/opt/apps/deepin-wine-runner/Model/__pycache__/__init__.cpython-310.pyc index e66ac70ec52f49dac0960237dd9b294de12fe9fc..0738c427d64c81cce6c00b0273f1a9a09eda4f91 100755 GIT binary patch delta 49 zcmbQk`G|u%pO=@50SGpK&e_QQfl*LTKfj<vKe3>oSU)8-wIDNZvm4V~M#fu{pD^zL E0C)lr+W-In delta 107 zcmaFFF^7{opO=@50SLA)klD!nfzdldKQ}ccGf_W1EhRlAz9LiKAlcMB$vibl*T~2+ zQP;%OAW7H4G{s!kAT`k}(KyLG$=E0fq1q+2IJ+djKtCllwO}(3(_BWzsL89CcK`sj CaUoLx diff --git a/deb/opt/apps/deepin-wine-runner/ProgramFen.py b/deb/opt/apps/deepin-wine-runner/ProgramFen.py new file mode 100644 index 0000000..c2b48fa --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/ProgramFen.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 +import os +import sys +import base64 +import traceback +import req as requests +import PyQt5.QtGui as QtGui +import PyQt5.QtCore as QtCore +import PyQt5.QtWidgets as QtWidgets + +class ProgramRunStatusShow(): + msgWindow = None + def ShowWindow(): + try: + #fenlists = requests.get(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3NwYXJrLWRlZXBpbi13aW5lLXJ1bm5lci9iYXNoYXBwLw==").decode("utf-8") + fileName + base64.b64decode("L2FsbC5qc29u").decode("utf-8")).json() + fenlists = [] + for i in range(6): + fenlists.append(int(requests.get(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3NwYXJrLWRlZXBpbi13aW5lLXJ1bm5lci9GZW4=").decode("utf-8") + f"{i}/data.txt").text)) + tipsInfo = "" + except: + traceback.print_exc() + fenlists = [0, 0, 0, 0, 0] + tipsInfo = "暂时无人提交此脚本运行情况,是否立即提交?" + + maxHead = fenlists.index(max(fenlists)) + allNumber = 0 + for i in fenlists: + allNumber += i + try: + tipsInfo = "" + for i in range(len(fenlists)): + tipsInfo += f"有 {fenlists[i] / allNumber * 100}% 的用户选择了 {i} 分({fenlists[i]}/{allNumber})\n" + maxNumber = max(fenlists) / allNumber * 100 + #if tipsInfo == "": + # tipsInfo = f"有{maxNumber}%的用户选择了这个评分" + except: + pass + ProgramRunStatusShow.msgWindow = QtWidgets.QMainWindow() + msgWidget = QtWidgets.QWidget() + msgWidgetLayout = QtWidgets.QGridLayout() + starLayout = QtWidgets.QHBoxLayout() + uploadButton = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "点此上传运行情况")) + uploadButton.clicked.connect(ProgramRunStatusUpload.ShowWindow) + msgWidgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "综合评价:")), 0, 0) + msgWidgetLayout.addLayout(starLayout, 0, 1) + msgWidgetLayout.addWidget(QtWidgets.QLabel(tipsInfo), 1, 0, 1, 2) + msgWidgetLayout.addWidget(uploadButton, 3, 0, 1, 2) + end = 5 + if maxHead > 5: + for i in range(end): + starLayout.addWidget(QtWidgets.QLabel(f"<img src='{programPath}/Icon/BadStar.svg' width=50>")) + else: + for i in range(maxHead): + starLayout.addWidget(QtWidgets.QLabel(f"<img src='{programPath}/Icon/Star.svg' width=50>")) + head = maxHead + for i in range(head, end): + starLayout.addWidget(QtWidgets.QLabel(f"<img src='{programPath}/Icon/UnStar.svg' width=50>")) + msgWidget.setLayout(msgWidgetLayout) + ProgramRunStatusShow.msgWindow.setCentralWidget(msgWidget) + ProgramRunStatusShow.msgWindow.setWindowIcon(QtGui.QIcon(iconPath)) + ProgramRunStatusShow.msgWindow.setWindowTitle(f"程序运行情况") + ProgramRunStatusShow.msgWindow.show() + +class ProgramRunStatusUpload(): + msgWindow = None + starLayout = None + fen = None + starList = [] + sha1Value = "" + programName = None + def ChangeStar(): + if ProgramRunStatusUpload.fen.currentIndex() > 5: + for i in ProgramRunStatusUpload.starList: + i.setText(f"<img src='{programPath}/Icon/BadStar.svg' width=25>") + return + for i in range(ProgramRunStatusUpload.fen.currentIndex()): + ProgramRunStatusUpload.starList[i].setText(f"<img src='{programPath}/Icon/Star.svg' width=25>") + head = ProgramRunStatusUpload.fen.currentIndex() + end = len(ProgramRunStatusUpload.starList) + for i in range(head, end): + ProgramRunStatusUpload.starList[i].setText(f"<img src='{programPath}/Icon/UnStar.svg' width=25>") + + def ShowWindow(): + ProgramRunStatusUpload.starList = [] + ProgramRunStatusUpload.msgWindow = QtWidgets.QMainWindow() + msgWidget = QtWidgets.QWidget() + msgWidgetLayout = QtWidgets.QGridLayout() + ProgramRunStatusUpload.fen = QtWidgets.QComboBox() + ProgramRunStatusUpload.starLayout = QtWidgets.QHBoxLayout() + upload = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "上传")) + upload.clicked.connect(ProgramRunStatusUpload.Upload) + # 生成星星列表 + for i in [1, 1, 1, 1, 0]: + ProgramRunStatusUpload.starList.append(QtWidgets.QLabel(f"<img src='{programPath}/Icon/{['Un', ''][i]}Star.svg' width=25>")) + ProgramRunStatusUpload.starLayout.addWidget(ProgramRunStatusUpload.starList[-1]) + ProgramRunStatusUpload.starLayout.addItem(QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)) + ProgramRunStatusUpload.fen.addItems(["0分", "1分", "2分", "3分", "4分", "5分"]) + ProgramRunStatusUpload.fen.setCurrentIndex(4) + ProgramRunStatusUpload.fen.currentIndexChanged.connect(ProgramRunStatusUpload.ChangeStar) + msgWidgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "评分:")), 1, 0) + msgWidgetLayout.addWidget(ProgramRunStatusUpload.fen, 1, 1) + msgWidgetLayout.addLayout(ProgramRunStatusUpload.starLayout, 2, 1) + msgWidgetLayout.addWidget(upload, 3, 1) + msgWidget.setLayout(msgWidgetLayout) + ProgramRunStatusUpload.msgWindow.setCentralWidget(msgWidget) + ProgramRunStatusUpload.msgWindow.setWindowTitle(QtCore.QCoreApplication.translate("U", "上传程序运行情况")) + ProgramRunStatusUpload.msgWindow.setWindowIcon(QtGui.QIcon(iconPath)) + ProgramRunStatusUpload.msgWindow.show() + + def Upload(): + try: + QtWidgets.QMessageBox.information(None, QtCore.QCoreApplication.translate("U", "提示"), requests.get(f"http://120.25.153.144/spark-deepin-wine-runner/Install.php?Version=Fen{ProgramRunStatusUpload.fen.currentIndex()}").json()["Error"]) + except: + traceback.print_exc() + QtWidgets.QMessageBox.critical(None, QtCore.QCoreApplication.translate("U", "错误"), QtCore.QCoreApplication.translate("U", "数据上传失败!")) + +if __name__ == "__main__": + programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string + iconPath = "{}/deepin-wine-runner.svg".format(programPath) + app = QtWidgets.QApplication(sys.argv) + ProgramRunStatusShow.ShowWindow() + app.exec_() diff --git a/deb/opt/apps/deepin-wine-runner/package-script.zip b/deb/opt/apps/deepin-wine-runner/package-script.zip index 304c44b3975a28833e1a03b86cb2ed695caf138f..0c892f249960408eaf492ce849a8e311192cc9c4 100755 GIT binary patch delta 316 zcmX@GN$9{Pp$War#VI`-Copp{@0#B;{a`7x$V6YR=~<mDe3K7xsevRXzvlV|rk`*h z2Ggr}!a($9W?mj9uz(Q%ez3q5{#OzpM)N_9?FTg&AMZjj^XOwnbLNtip6&l1Gk)Yn zkrMpG=nR$$|HK%@1ZHjd!YBY{O+WsPaW+^e^*f_E3y9S||2O0I`M;Uo27-9g`+b?S z!3zHRGRH83Suugkst{I72=i@zuvk(G^EyEkYYoeoO~F!`Wy}JMU{*~z^F9d6wvyQ% X%$i<b#rz5+*`8C)ygjFy<%%o-G01%8 delta 316 zcmX@GN$9{Pp$WarqVL)^PGII@zF^!v{a`7x$V6YR=~<mDe3K7xsevRXzvlV|rk`*h z2Ggr}!a($9W?mj9uz(Q%ez3q5{#OzpM)N_9?FTg&AMZjj^XOwnbCB%z|Bo3z@}fuy zeqwY6OND=8i~^gveaja{0WfR&@o$W?!IG)p8O>QhtoHf88Mn{>&Ga@9#GBsl%bX2X z@Yk0)h8fI?31n7<uv$WxZ}Wr2l2Vx038GkQSjKD$mdY$+7GMOkYRZ}SL0Gnx%=Tc` V^!h61S0KsuoNDInIn^vzWC1@?e+mEq diff --git a/deb/opt/apps/deepin-wine-runner/req/__init__.py b/deb/opt/apps/deepin-wine-runner/req/__init__.py index 44344d8..f52e5c6 100755 --- a/deb/opt/apps/deepin-wine-runner/req/__init__.py +++ b/deb/opt/apps/deepin-wine-runner/req/__init__.py @@ -7,32 +7,21 @@ with open("/var/lib/dpkg/status", "r") as i: if unConnect: print("52专版,将会无法连接服务器") -badUrl = [ - "http://120.25.153.144", - "https://304626p927.goho.co", - "https://30x46269h2.goho.co", - "http://gfdgdxi.msns.cn" -] - class Respon: text = "" def get(url, timeout=None): # -> requests.Response: if unConnect: - # 筛选 Url,只有特定的 url 才会被拦截 - for i in badUrl: - if i in url: - raise Exception("52专版不支持连接作者服务器") + # 全部 Url 都拦截 + raise Exception("52专版不支持连接服务器") if timeout == None: return requests.get(url) return requests.get(url, timeout=timeout) def post(url, data, timeout=None): if unConnect: - # 筛选 Url,只有特定的 url 才会被拦截 - for i in badUrl: - if i in url: - raise Exception("52专版不支持连接作者服务器") + # 全部 Url 都拦截 + raise Exception("52专版不支持连接服务器") if timeout == None: return requests.post(url, data) return requests.post(url, data, timeout=timeout) \ No newline at end of file diff --git a/deb/opt/apps/deepin-wine-runner/req/__pycache__/__init__.cpython-310.pyc b/deb/opt/apps/deepin-wine-runner/req/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae95dabd4c4cc1ea9aac70ef0a43ec4d39141465 GIT binary patch literal 1163 zcmZWo&1(}u6rY)$w40cwtyWPH^&mpTWZT$Q6cMq0+=3_~24q=x#&m7EyPci2F+@<K zqGI)+;s-@qLC}+emmVtqAA2>8dh+1Si@w?PBht6LxAWeceKWt`d+YV|q!7sG-xd2M zMd+JyIz<QP7-(=C3_}c8Pzf<o!kjRT(FS?aU(#4&#hat^=o%{F3$T+SiW(Y5u0Di< zUDFsN^;`tySnT5o*42Pm8L{rSxYTtTF`XsvAeL;9Qa8)66x(nImvmUASr4p|44*^U z-k)#}R6JE1Fs@m`s5qAm=1-K3Kw2^kA}nfq&RF(@Rpy6x2figHa*T7|adXp-%X1=h zT`qDXg>Wxa87VXuo_>FD|JUN9rBC;oi?3TR=31Yh|M>c*_4r+Dc4q0}{L-uUSz6mX zE~S6iFop_)`NBwkXyibCXn44`U4;XP9~c}SEsXky3J3FLZ`{k<UT3bVl843%tGO-9 z<;quBnN^+qWZ(vQ+qD(4PQl<D0}cAXaA1|85@8tlCcuOib)Dsb@3|2wW@)6GrfW@d z(~MH4Iq9*mqSk5CoC>YVa)wG?l^>8uLcQ4h*>8BhG%Vi_jP*Pjf=?Ny>9~$G&AfkI zXz*RXx)4kX(vgnih)uv-5w%5S$3TOlU?dW~5}!bqQa4DQ)L}YAMgockzKy479WYH0 zu~lkww2tPX!&18nD~OXBK>0x{{@1GJ!c6Pg$JV1;?Itz9%>KA}cdb=8>XyzV_d=OX zM9I({^Pu0hjJhsc?7XN%$&*!^`_ci@bO0CfKn9Uk<`US{LQxTExN(G?HHL)xJ%j>1 z02+6KVx8z%$K<b0QaFR-tgV2rh$0{X8k2Aw79AvLb!{C9Bqm{7n}j-^2jD9-)Cmxw zokL;+l*uMU54=Q1nO<eoWJJ{W0-2>^W9%?XS}_i>N$ptebsLF7u@iJ1k~HqaLS?hK zm`%ln<HI8A`P_|bMO1K$MG0Rxu54dIp^ov#pLQG;AFH^F^ds$QJgUYy*aAk!l%(+h Q-tm_zB1xt@rDan80QC|cV*mgE literal 0 HcmV?d00001 diff --git a/deb/opt/apps/deepin-wine-runner/req/__pycache__/__init__.cpython-37.pyc b/deb/opt/apps/deepin-wine-runner/req/__pycache__/__init__.cpython-37.pyc index ab16091916d4833f521e3ec829decd1d021450b3..d1051f7a43a4cb97cee64e1165f9ee71ec234c41 100755 GIT binary patch delta 529 zcmZvZ&q~8U5XLjRTeC@%)PjOkk$O=B9()FS@Yai->ZxQS)IUkxZaf7FwkNTN(vv7+ zZ-V$T;wj*<K8Ld_N(&D8zL`wm+uxE`=fe&TeBZUO-m|;tn2v)rI34dab`LFK3qG_2 zACT6P@P#AXA+&4}h_di-;sTDWurhwSnq0%%iO%Q|G!Bwti}b8ZcZO=9dV6TflAZzq z1Gs@4gmq5jrXtTYx2Bk=$Qe$!CnJLSw3*c>545)R^*EZ{PG|QoAr!XiT*hgpLRL6g z(nymej@0CntoKPlGkGD)c#L%ZOtZ-fnvd$4+X5pTIJjW;ktWuqdkJM=_i<Q&B?h+s z1DnGX0e^9Gg22?CBks=;8=#O$4-=(^kO5l3x@k{^R4$tr(N^t$$*cHz6}3R_fz<mD yn)-1}pvf;-+KrO}YMp|~xGjoOS9TI*eu}xQtWG*?dqp402?Gx{fB`1~b@?~sXK6?P delta 789 zcmZvZy>HV{5Ws!!If?CjG-(TpO2oiW<i%~$B&bZN;bZH95GWEu@H0thYA4SxQdAig z(INp-h7gbdbs!rO141la_%E0|w}qX5fO}4hXyNQT-@7}V?|1Ke;**|POQ#J5<?FAG z{Z<`i^1w%zYh{*T8q=B4RO|6u3QMxouEJ6~q@G|omS&k<sB3JN&9E$bI)mGaIX8OM z+ul0Y5~6!`X{lIRwn`PNSXr@(<?_~o4Eq>gSuR&g)$VHPiq-U5o@IM~=LRyl+A96Y zoj-2Ze8`$?(6%;x*SBofmLs1CpmPn?&nn{!@CI_@FOa`SF`}Z@WM&PGQ23=mLBMt8 z{`_MSkU-gpb3+gYJMa{G#$6=<rfd*i7W9J}C=-Md^bvX(CqsgWbiKbgPLhS~gKv93 zpFBI-8y>!#9KQQ#LYNTkO~>mCGZyN7x8}L7V~a5Upuz6&PN?4)*iKipJvY?2)9X9F z@I%^kgh@l%=N+EJ0YhkW9lui}Z-r;k%%l1lGzzH101Z;Gt$_hi(w3M~Bx(#b!o7*k zDO?)R|KO4cw>rfQV1kGzzyU#IdW?+SDy4({@sAhJ5B7&guRo6qME`dO5ri4zDXiyd zY2?&=22H4TJztnA&qW8;5RIss&&rB3&~q5Oh<XNEf^(TOVIAL!X+*7~--W8zb=;_1 rsB)*l!dRELT`?U)?kL(8pBulYi-kO%HKJm_0;r%-0`iH|3^k139fP;- diff --git a/mainwindow.py b/mainwindow.py index f5c6a6f..0113ba1 100755 --- a/mainwindow.py +++ b/mainwindow.py @@ -14,6 +14,7 @@ import os import sys import time import json +import random import base64 import shutil import hashlib @@ -2160,6 +2161,39 @@ def GetVersion(): runVersion.signal.connect(AddDockerMenu) runVersion.start() +def UnPackage(): + debPath = QtWidgets.QFileDialog.getOpenFileName(window) + if not debPath[1]: + return + path = QtWidgets.QFileDialog.getExistingDirectory(window) + print(path) + if not path[1]: + return + tempDebDir = f"/tmp/wine-runner-unpack-deb-{random.randint(0, 1000)}" + if os.system(f"dpkg -b '{debPath}' '{tempDebDir}'"): + QtWidgets.QMessageBox.critical(window, "错误", "解压失败!") + return + zippath = FindFile(tempDebDir, "files.7z") + if zippath == None: + QtWidgets.QMessageBox.critical(window, "错误", "解压失败!") + return + print(path) + # 解压文件 + os.system(f"mkdir -p '{path[0]}'") + os.system(f"7z x '{zippath}' -o'{path[0]}'") + +def FindFile(file, name): + for i in os.listdir(file): + path = f"{file}/{i}" + if os.path.isdir(path): + returnPath = FindFile(path, name) + if returnPath != None: + return returnPath.replace("//", "/") + if os.path.isfile(path): + if i == name: + return path + return None + programVersionType = "" print(wine) ########################### @@ -2193,10 +2227,14 @@ exe路径\' 参数 \' updateThingsString = '''※1、支持使用 Qemu + Chroot 跨运行 Wine 以及指定程序的功能; ※2、提供了简易打包器以用于打包简易 deb; ※3、支持下载配置过的 Qemu + Chroot 容器; +※4、支持解压指定 deb 的内打包好的容器; +5、优化 Wine 列表显示; +6、优化非基于生态适配脚本的打包器内容自动填充功能; +7、新增程序论坛和教程入口 ''' for i in information["Thank"]: thankText += f"{i}\n" -updateTime = "2022年12月03日" +updateTime = "2022年12月04日" about = f'''<style> a:link, a:active {{ text-decoration: none; diff --git a/package-script.zip b/package-script.zip index 304c44b3975a28833e1a03b86cb2ed695caf138f..0c892f249960408eaf492ce849a8e311192cc9c4 100755 GIT binary patch delta 316 zcmX@GN$9{Pp$War#VI`-Copp{@0#B;{a`7x$V6YR=~<mDe3K7xsevRXzvlV|rk`*h z2Ggr}!a($9W?mj9uz(Q%ez3q5{#OzpM)N_9?FTg&AMZjj^XOwnbLNtip6&l1Gk)Yn zkrMpG=nR$$|HK%@1ZHjd!YBY{O+WsPaW+^e^*f_E3y9S||2O0I`M;Uo27-9g`+b?S z!3zHRGRH83Suugkst{I72=i@zuvk(G^EyEkYYoeoO~F!`Wy}JMU{*~z^F9d6wvyQ% X%$i<b#rz5+*`8C)ygjFy<%%o-G01%8 delta 316 zcmX@GN$9{Pp$WarqVL)^PGII@zF^!v{a`7x$V6YR=~<mDe3K7xsevRXzvlV|rk`*h z2Ggr}!a($9W?mj9uz(Q%ez3q5{#OzpM)N_9?FTg&AMZjj^XOwnbCB%z|Bo3z@}fuy zeqwY6OND=8i~^gveaja{0WfR&@o$W?!IG)p8O>QhtoHf88Mn{>&Ga@9#GBsl%bX2X z@Yk0)h8fI?31n7<uv$WxZ}Wr2l2Vx038GkQSjKD$mdY$+7GMOkYRZ}SL0Gnx%=Tc` V^!h61S0KsuoNDInIn^vzWC1@?e+mEq