hiddifypanel 3.0.0.dev64__cp38-cp38-manylinux2014_x86_64.whl → 3.0.0.dev66__cp38-cp38-manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hiddifypanel/Events.py +27 -4
- hiddifypanel/VERSION +1 -1
- hiddifypanel/VERSION.py +1 -3
- hiddifypanel/__init__.py +7 -3
- hiddifypanel/__main__.py +13 -3
- hiddifypanel/base.py +88 -3
- hiddifypanel/base2.py +40 -3
- hiddifypanel/models/__init__.py +10 -3
- hiddifypanel/models/child.py +26 -4
- hiddifypanel/models/config.py +105 -4
- hiddifypanel/models/config_enum.py +207 -4
- hiddifypanel/models/domain.py +106 -4
- hiddifypanel/models/proxy.py +55 -3
- hiddifypanel/models/usage.py +58 -3
- hiddifypanel/models/user.py +171 -3
- hiddifypanel/panel/__init__.py +7 -4
- hiddifypanel/panel/admin/Actions.py +170 -3
- hiddifypanel/panel/admin/Backup.py +80 -4
- hiddifypanel/panel/admin/ChildAdmin.py +122 -3
- hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
- hiddifypanel/panel/admin/Dashboard.py +70 -4
- hiddifypanel/panel/admin/DomainAdmin.py +195 -4
- hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
- hiddifypanel/panel/admin/QuickSetup.py +127 -4
- hiddifypanel/panel/admin/SettingAdmin.py +224 -3
- hiddifypanel/panel/admin/Terminal.py +51 -4
- hiddifypanel/panel/admin/UserAdmin.py +277 -4
- hiddifypanel/panel/admin/__init__.py +82 -4
- hiddifypanel/panel/admin/adminlte.py +13 -4
- hiddifypanel/panel/admin/commercial_info.py +23 -3
- hiddifypanel/panel/admin/websocket.py +9 -3
- hiddifypanel/panel/admin_2.py +33 -3
- hiddifypanel/panel/asset.py +17 -3
- hiddifypanel/panel/cf_api.py +35 -4
- hiddifypanel/panel/clean_ip.py +125 -3
- hiddifypanel/panel/cli.py +172 -3
- hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
- hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
- hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
- hiddifypanel/panel/commercial/__init__.py +50 -4
- hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
- hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
- hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
- hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
- hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
- hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
- hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
- hiddifypanel/panel/common.py +98 -3
- hiddifypanel/panel/custom_widgets.py +71 -4
- hiddifypanel/panel/database.py +18 -3
- hiddifypanel/panel/hiddify.py +655 -4
- hiddifypanel/panel/hiddify_api.py +70 -3
- hiddifypanel/panel/init_db.py +393 -3
- hiddifypanel/panel/usage.py +85 -3
- hiddifypanel/panel/user/__init__.py +25 -4
- hiddifypanel/panel/user/link_maker.py +416 -3
- hiddifypanel/panel/user/templates/clash_config.yml +1 -0
- hiddifypanel/panel/user/templates/home/multi.html +1 -1
- hiddifypanel/panel/user/user.py +233 -3
- hiddifypanel/static/css/custom.css +6 -0
- hiddifypanel/templates/500.html +1 -1
- hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/en/LC_MESSAGES/messages.po +194 -190
- hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/fa/LC_MESSAGES/messages.po +123 -120
- hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/zh/LC_MESSAGES/messages.po +123 -121
- hiddifypanel/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/RECORD +74 -76
- hiddifypanel-3.0.0.dev66.dist-info/top_level.txt +1 -0
- hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
- pyarmor_runtime_000000/__init__.py +0 -4
- pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/entry_points.txt +0 -0
hiddifypanel/panel/user/user.py
CHANGED
@@ -1,5 +1,235 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xc1&\x00\x00\x12\t\x04\x005\xde_\xcf\x85T\\\xc6\x9f\x9b:\xf9\xfa\xe3\x99\x91\x00\x00\x00\x00\x00\x00\x00\x00\x85<xR\x10l\xe5\x13\xfc\x1b1\x8cu\x87c\x0b\xac,\xc8\xbd\xcc0\x98\x8au|\xf1\xe1\xd8\xad\xc7\xe6V\xfc\x80\xf7.\xcc@\xdc\xed0\xd2\xf0\xdb\x14\x03D\x9a\xf6\xd5\xd1\xde{\x99\x84\xd8\xed\xe7*,r\xee\x13\xb1\xb5\xe8P\x9a\x04\x1a\xa7\x05\xb0\xfa\xefp\xdc\xea5s*n\xd5\xe8\xef@\'1>\xaa\x8cn\x8fR\x8e\x9d\xe3|e\x0e\xd3\xbf3?\x11cA\x1b\x0c\xf5\xdb?\x93\xb6\xd8\xac\'\x04\xe9\x95%\x01\xa5\xa0T\x07Kj\xf8l:\x07\xdb\x85\xd1\xeb\xb0Y)\xa0\xaa\x1e\\\x9b@\xc10\xd8\xed\x97Q\xc9W\xeb%l.-l\xd7\xb4\xceG\xb8\x05\x9d\xdd\xfaH\xd3\x9d[\x00\xc7\x8b\xb3n\xfch\xaf\x8b\xc5\xe7#\x84g\xdc\xa80!\x81\xd5@\x04\xc9\x90*\xfa&@$\xe30\x87\x03q\xcb\x9bH/\xed\xday\x00z\x95ty]\xc5\x17\xc0\xea\xa8u\xf8\xf4\x9e\xf5x\x87\x9e\xdb\xfe\xa9\xb8\xa1\xbb\xcc\x80\x8b>\xbcM]\x95\xe7\x0c\xfa\xc0VX\xce\xb5\xe9\x0e\x08\xd4vC\t\x00w\xfdX\x08\xd2]o \x19\x06\xf0y\xd2/y\xed\xd5\x13\x13aIb\x99z\x84;\xab\xe8\xbb3\x8c\xf5&\x95\xd8\x0f\x04\x17L\xd6\xe3\x1bg!\x9a\xcaf G%\xaeS\x97\xc6\x99X\xb9\x12\n\x84\x97\x05\x1cJyG\xbb\x0bv#%J$\x9e\x0cBS@\x1cd\xae%P\x1b\xf28~\x13\xc64\xf0\xad\xcb\x9ej\xd7\xff\xe6\xe6-\xad{\xc4\xc5\x12\x8f?aQ\x95;\x85\xac\x12\xf3\x07W\x88.\xa3XE\xe7X\x94\x05f*\xbf\xc4|9\xe5\xd63\xbe\xb3O\xdb\xc5P\xf1\x1d\x1f\x1b\xa0NPO\x0c~\x190\xea,\x80\xa1\xccc\xf2\xe6R\xe8\xcb\xae\xf2\xfbw\xa5\xea\xd5\x00\x87\xa2O\xe9\xc4=\n?\xa4rA\x82\t\x13\x0e,-)5_\x03\'N\x18\x85z\xaa\xfd\xb3K\xe2\x1an#cU\xb1\xb8\xcb9\x8e8\xbe\x18\xad\xf1q\xa6\x89\x1blh\x9b\xcf\xf1Q\x10\xaca\x0b\xcc\x87\xb4\xdd\x0c\xc26V*zd\xea\xcbBd`\xda\xdd\xa6\x1c\x8do~\xe1\x07y\x0f\x93\x8f\xba\x03\xec\xe1d\x1c\x06\x16\xa5\xb7\xc6\xd4\xa9n`=\x8f\xa9\xdbv\xcdtf\x03n\xd6\x1f1\xa9\x80-I\x8f1\xbfcF\xd4\xbcW\xa2\xc0\xeb\x9a\x96\xbb5l\xb8s530\x18\xccC\x91\xf6\x94,\xd2^j\x14\x03\xa6\x84\xae8c\xc98v\xd0\xa3\xae\xc7Uy\x9b)\xd5\x9e\xcd\xefD\x1e\x98\x83\xc0\xf8\xaf7\xf9\xcd_J\xb1\xe1\x12\xf45\xf7\x98\xc1\x87\xae;\xaaB\xd3\x0f\x08&\xf8E*\xda\xbd\xdb\t*\x7f\xb5\xb5\x84\xcd\x11\xc5\xffx\xf1\x9bl\xf7(W\xb2\xd2\'\xca<\x8f\'n\x94|g^\x0f\x9f\xc15*\x07|s\xc8\n\xf4G\xa4\xb7\xa9Wi\xfbBk\xfa,E\x12\x01\xc9\xf9\xe2\xa7+p\xea"\x06\xc6#F\xde\x0fA\x1c\xe90\xcf\xdaM\xfa\xe0\xf6\xa6\xeb\xe7\xe6\xc6}\x1e\x87\x9b%\xaesp\x94w\xf4H\xc3w\xac\xbf\xc0\xfc9\xeb\xffL\x86\x14\xa9\xb5dzL\x8e\xe9\xe1&D?\xaa\x86-\xf6\x85\x84\xa3G\r\x94\\\x12\xfb\x9fxJ\x95\x0e\x8edMFx\x0f\xa6m\xb5|\x06\xe9F,\xaf\xe5Y\x83=f\xb6\xee\xf3\xe4\x1a\xf3\xbeV\x94\x02\x86\xb1\xe6\xea\xfc\xf2\xa4\xd3\x0f\x07p7C\xd3#O\x81n?\xbc.\xc4=\xaaX\xed*\xf0HO\xae\xfc\xe4\x04\x19\xa2r\xde\xe0\x8e\xff+\x86\xc1k\x038\xd0\'\x8d\xdd\xe12\xe6Q\xed\xa2zA\xe7\xaeG9!\xec{\xf8\xcc\xca\xe4\xe5\x15O\xe2X\x80(c\x9e\xfb\xd3\xd3\xc9\xce\x9b\x9a\xffr;\x9e\xc1\xe6\x02=\t\xech\x13\xf0\xb1m\x9b\x93\xd6\x03\x93\xeb\x93\xf2\xed\x00\xe8.\xb7\x9d\xb3\x96\xaa\x7fd\xd8\xd2\x17\xf0\xa6\xb8X\x9b\x10\x1d\xad\xffg\x82\xbd&5\xa4\x80\x8cw-k*K\xdc[\x10\xdc\rJP\x05\xc7\x8a8&\xd2p\xa5\x83\xb1\x0c\x05t\xc3\xb4\x08\x16\x07\xd1\xdb\x13\xdfY\x90\xba\x96\x04{\x90\x92\x80\xc0\x01\xaf2\xe0q\xe5F/\xbb\xf1\x16<\xd7f\xa6.l?\xc6\x1b\x83/C;<\xcbSQ\xe2\x16\x8f\xe6cC\xb3\xe2\x87"e\x00\xb5\xf1\xd9$\xf1k\x16\x0f,\xa6f\xd5\xd8\xaa\x90\xfb\x88\xa3-Y\xd6\xf2\xf0+\xd1\xb8\xd1\xcc\xfa&\x81c%G3\x16[i\xea\xcc\xe8\xa6\x1bY\xd1\xb6\xce6@x\xdf\x08\x87l\x10\xb6\xc3$\xef\x1b\xe8\xd2\xaa\xa9I\xdcD\xa8\x814\x1c\x07c\rR\xdc\xc3\xce8\xe3\xa11_\xa7\xef\n\rTx\xd4\xce\xfa_\x0f\xb7\xd6\x82\x0b/f\xde\x1dh\xec:2 P\x08\xbf\xd8\xb4\x13\xcd{~\xe6\xc1&e\xf5\xf3\xb8\xad\xd9\xef\xbb4\x85>\xcd(\x11\xf4\xc6\xebD\x90n\xdc\x12+\xd2i\x1ano7\xd5\xec\xcd\xedk\x06t;d\xbc\xe5\x9d\xa1-\x00<\x97\xbbU\xcc\x1e\x14\xaf8\xf3\xfb\xa7\x9d\xb0 \xda@y2\x9b\xcb}\xc0F\xb5\x87$>\x89,|\x14F\x87\x8ea\xf5\xdc\xb9Z\x0fO\xce\x06.\x14bqs\xc9\x87+\xc1\x1dK~1\xba\xab!\x93C\xe1\xe1\xb6\xb0\x84\x8eV\x85\xfa\x93\xbc\xe6\x8a\xb1X\xa1\xcc\x8d|\xac\x06\x1d\x8a"\x9b@\x182# \xba\xe4\x05\xef\xde6\xe5\xecW\x05$\x9c\xc8qc\xf1:\xe2$\xa0\x94&o\x05\xf7P"\xe4\xe8\xd2\xe6\x82\xcc\xdd\xb1\xceBr(\xfe\xfa\xb3V\xa3\xd2\xe4\xe0\x8d\xec\xe0^}\x84\xbc\xb5\x85\'\x00E\xe9\xc2\xd9\x17\xb2l.Y\x93\x90+(\xee\xcc\xb5\xa9\x18\xfcV3\xba~L\xf0\xf0_X\x13\xd3\xa2k\xbf\x95\xf7\xfe\xea\xe4n+rQF\xb8\x15\x9f~\x10\xd2\x00\xd8X\xcc\xe9\xd4\xcb\n_\x1e\n\\\x1d5F,\xcc\xdb\xcb\xf1\xe88,\x13\x99\xff%\xf6\xdab9\xa1\x00\xf9\xfd\x0b\x10\x7f:\x19\nq\x00\xcc0V\xc6\xe3%\xe3;\r\x97\x98\xfe\x94\xc0\xbe\x14f\xc4N\xbe;\xa4\xba\\\xf8\x98\xd3\x8f\x98\xd3\x0c\xd1\xcd8\x03S\xef/4\xc4\x96\xab\xec\xba[\x8b#r\x1793\xc6\xc9\xab\xdc\xa3\xa2N\x97\x94\x120\xdc\x88\xc6Ip\x04\xa4\xc1\x86\xf2;\xb1\xbc\x168\xc0u\xdc\xd8|\xa3\r\xce\x0c\x8d<\x8eG\xf7~\xb0\xf3\xd4\xb8\x97\xb9&8\xba\x01\xf6aGzh^4Ah\x81\x05:\xbd\xff\x05~\xe8}\x7fn\xb3\x95\xcc\xfb\xe7\xfc{U\xc0T[\xbc\xaf\xd9\x00\xf2\x03\xc9\xc6 \xde\xea\xa9\xb3U\xc1UVSs/\x83{\xdbXIc\xdc\x18\xda F\x9fs=\xf8\x97i\xe9^\x9b\xa4YM^CZ\x86en=\xf1\xfac\xd2\xe8\x01\xbbBA\x00\x8d\x1bWm`\xbc~\xfa\xa8"\t}uf)b\x90\xe4\xf6T\x1c!\x8d\xfb\xa1\xb0\x16\xc58Y\re\x08R\x83[s\x9a\x8d]\x8d\x0e\xf7\x1aWsw\x98=\xa2\x19!0\xc9\xdf\xc8\xdb\x9e\xd4\xed\xdey\x08\xe5\xec\xd9\xcfQ7\xd9\x0b\x99\xd4{\xc3>\xc8\xed\xb7\xd4X[\xc8\xeb\xd4\xc9\x7f\x92E\x1a\x85bJp\xeb\x19\xec%J\x9b\xf0\xd2\x11\x1a\x82l\\\xaf\xc4\x01P\xe7C\xe9\x86Y\xd7\xc6\xb6_!\rF0\xbf~\xd2\xbc\xdc\xeeD=\x82\xb1\xe0\xa8gqS\xc1\xab\xb3\xb4\x12k\x18\x9d\'Q9\xdb\xb0\xa8p\xec\r\xb4\x1ck\x8dMu\x00Tn\x1e#\xb4&[1MN\xdb\x88\x9d3\xac\xd8\xf1{K\xa9oM\x17\xf5\x0e\xd44\xc9\xa9\x0e\xbb\xb6F\xb00\x0f/\xbb#_ez\xcfQp\xbf\x87\'\x11\xbd\xbc\x94k\x9f@\xef\xad\x82\xb5\x9d^\xcd\xb76\xc0pp\x1e\x1f+\xf0) \xd1\x8bB\xf7\x96\x9fy\x02\xabWP\xed\xc0\xb8M\xf9{\xad\xff{\xab1\x91d1\xa1f\xbc/\x9e^\x80\'wQL\xd2\xcb\xa6^>\xb4\x84\xba\x954\xcd=\xea\xae]\x80a\x98\xb3\xf6pz"P\x00u\xce\xecQ\xe6\xe4\xe8\xa3?\x8a\x9c5NS[\x1a\x86\x9e\x18T|\xd6J\xfe\xf8\x00\x93\x95\x88\x8d\x14\xc7e\xb6\xee\xfbICM#_\x07\x88=h\xc0U\xe51\x02l\x14\xb3\xbc\xcb\xb9\r\xbecq\xcb\x13\n\xbf\xc4|\xbdFs\\\x94\'\x8a~t\xf5V\xf5/V\xca\t05Z\\\xa7\xd1\x86=\xb4\x08\x84c=\xb4\xd3AL\xe2\xbb\x0c\xca\xd7\xdcB\xee2Hf\xf9\x0c\x7f\xf7@\x997\x82\xa9\x0f,\xc8n\x8f\x01G_\xea\x93\n_O\x80\xfec\x07%jt\x1c\x94C^D\x17\x02\x1eP\xd2\xd2\xc0\rTV\x0f\x7f\xc1\xee\x05\xfa\x1d\xe1\xcd\xb7\xd7\x94\x88I\xd6}\xf5\x9b\x0c\x93\xbc\xc4\xd8\xb6.\xca\xc4n\xfd\xeb!\x01\xa5\'\x8d\x98\xad\x00\x84I\'_V\x98\x98\xfaw\xa5\xa3\x87\xd1\x0f0\xab\xf4\x8c\xee54\xfd5\x94,\xfaz\x9f\xab:{W\x97\xf0\xeay\x9df\x0f\xe9z?\x01\x08\xb8\xed\xf4n\x87\xfb8\x02\xd4\x1c#*d\xc6.\xe2\xd47\x9a\xb1\n\x08\xea\xa5.\x8f\x1eV\xc1\x19\x8e\x07\xf0\x8dJ\x92Ign\x9e\x18\x9cd\xd7\xf3A\x9b\xa0\xd3 \xf7\x9b\x19\\\xa0\xa9\xb5X\x86\xcd\x8eW\xa74,H^3\x9cz\x10W\x99\xd3\x1e\x15S&\xa4\xdf\xa3\xe4\xd6\x91\xfd\x8c\xbb\xb5\xcas\x83\x8a\x0f\x8f\x99c\xec\x0e\tMT\xe9\xe22M\xf3(=\x04h\xdd{E\x0b\r\xc1\xd7"\x1e\xbf\xcdu|D|3\xfb,\n\xefQ\xcdW\xe5\xc7u\xae\xd6\xb4\x8a\xb9\x14\xd1\xbe6\x01\x81G\x15y\xcc\xc0\xd3\x9b\xc4(\x1f\xfcQ\xb80\xdd\x9dI\xf0%\x196%\x88\xdf\xc9B\x7f\xef\xc5d8\x1b\xc4\xcb\xbf\xaf\xb2\xca\x86\xde\x9a)\xcf\x92\xc9\xd5\x9a\xc9\xefRP\xa2.H\xe8\xd7\xea\x8dW\xad\xd2\xac\x07\xcb\xfc7R(\xcd\x19D2\xbd\x91\xc3\x9f\xbbT\xe9\x9b\x18\x99h\xc2\x06\xa7\xb4j\xa6\xb1\x80)\x1fg\x15 v=o\x8f\x9d\r\x98\x81\x1f\xa5\xb9\x86\xae\x0e\xd0\xec>l\xca\xf8\xf2\xa7\xa3\xca\xe2Q\x8c\x85\xa3\xaf\x1d\x84E\x9a5\xa7\xa9\x1e\x13\\\xb60\xfa\xf2\xd2\x0be\xdd\xcd\xfeFn5p\xb9\x04`%\x105\x1b\xd4\x1b]\xd1co\x15~W\xd6\xbd\x91\xb39\xe7\xe9\xc8\xd8\xa8\xb5\xb7\xe9\xd7\xc3\xbc\xc1\x025,yp3qk\xb6AVM\xa6r\xe8\x91!\xef\xf9+s\x1e\x8a\xe7+S_\x0c;3\xe9\x7f*\xe9I|\x1abH\xd0\xf6\x85x!D\xda\x0fN\xb6Dg\xf2A\xa9\xf9y5:Y\x1d\xd1\xb1\xae\xb0F9\x9bn\xb1\xdf\x87\x07\x15\xafd\x82\x125\x13|U\xcf\xe3[\xbe\xcc\xdb\xba\x8d\xda\x10\x1a\x85\xaa\xfd\x8dp\xcb\n\xf12\xb4\x9e\x8c\xb1\x91\xce5\x96\x7f\xf0H\xaf(\xb7\xa3\xa1R) \x08\x97\xd6w\x19\xa3\xa2\x91YV\x84\x9eg\xab\x9f0\xfbn\xaae\xa4\xe8\x07\xb7hR\xdf\x80\xb4\xfeV\xd7\xce\x8a=q\xc3e^\x9d\x1a8s\xc8:\x8b\x1d=\xd7y\x95\x1e\xec\xdb\xa2\x88|\x8c\x7f\xa6\x1c\xe1 \x15\xe27\xac\xe2\xa8\x9by\x9c\x1b\xff\xae\x11\xfa\x0bL\x00\x8c\xc6b\xe99R\xa9\xd5%m$\xeb\xda\x9bYM\xb6\xec\xc88\xbd~q\x0b>Wq\xd3\xa9/\tXUv\xbb\x7f\x1dR\xbd\xcfU\x9b\x04\x83\x02\xcar`\xce\x16\xc2\x8f]G\x81\xfc\xc5\xfe\x90\xadC*\xa6,\x12\xa9\xd6\x144\x85\xec\xe5\x9c\xd4\xf0&\x1c\xff\xb8:^\x03\xd0\n{w\xe6\xb6\xe5+\xca\xfb\x9a\x14\x83\x8b\xb4\xee\xb6\xb7\xe0\xd1F!\x90\xfa\x1eZ\xaf\x97\x87R4\x08\x15\xdbw?\xd3F\x8d\x86\r\xb5m\x1d\xe3\x98\x0b\xf8}\t(\xa4\xde\x7f\\\xfaV~8.\xa4\xd8\x1f\xd0%w\x86t\xa5\xc3\x94\xe4l\x1ek\x87F\xcf\x01\xc4\xedBU\x18\xa4{\xea\xa9\xfcJ\xcd\x99O$\xdfo\x1c\xe4ztH!\xb4\x8e\x1a\xaa\xe0\xb5B*P\x1e\xacX?\xd2\x84\r^\x1d\xc4x\xc7\xb9\xd3\x8a\xe6\xe6\x1cc4\xd8\xfc\x1aDHB\xeb\x93\xd8\xc7\xe5;V\xe2vjK\xce\x9c\x91jYw\x9eZ\x08m\xf8r\xbd\xc9\xe6\x08*!}\xb8\xea\x83\xb0N\xf1\x88\x0fBM\x7f\xf8\x84\'\x85w{\xb3\xda$\x0e8&4{\xfc\x87\xba\xc9\x18\x0b\xa158"\n\xdbW\r\xa9\xbfk+\xd0~o\x9e\x1b\xb2\xc2G:\xe8\xa0\x1e\x95\xdb\x9fM\x1f\xab\xd3\x10\x12k\x10\x9b\x12fcH]p\xb3@\x13_\x80\xfcBqph>\x0bb\xbc19A\t<8\xaak\xff\xbfH\x9d0\x00\x88\xd1Mk]q\xd2\xe2#\xcf\x8d\xc2\x04\x08Xn\x84\x12\x86@\xcd*lg\xac\xf0j>\xa5\x9a\xe9\xf1\xb6\xb2=\x08c\xab\xac\xc5\x02\xa6">\xc0\x17K\xdb#>K\x98 \x9bi\xaf\xc2B\xdd\xea\xbbK\xb7Z\xbc\xb6\x18)\xf3?\xc1\x8c\x99\xfc\xcb\xdd-[\xba\x0e\xc0\xa2\xdf\xd1\xfcQ\xee\xb7\x17\x9c\x19\x9f\xad\xed\xfdR\xc2\xba}OTN*\x01\xaaOtf\xdf\xf2\x1b\x14g\x1c\x1a\xdb\x01\xdc\xdb\xefs\x9c0\x88\xc5X\xd6\x15\x9c\x87>\x93\x92;rm\xaf\xa9p\xe6\x87\xe0\r3\xae!\x90\xb9\x8b\xd6i>\xd7%\x8e\x97aI\xa7\xae\x80\x0c;\x88>T\xfc\x05IE\xfc\x1ft\xb4%9\x95\xc7\x13n\xe2\tT*A\xd2\\%\xd2w\xfc\xb1\x8c\xa4\x95\xea\xac\xaa\xa7\x0f@"\xe9\xdd!\x82o\x15\xb0\x88a\x0c\x7f\xc4j\x82\x9b\x99P|4\x89\x9c\xbd^A-h\\\x02\ts\x1b$\x1b\x1b\x84\x97\x02\x13\xd5#\xc7\xee\xd0^\xf7\xfe\xa4\xf9\xcb\xf7x\xf8\x0e&M\x1c\x81.\x8bI+_?[\xed\xa7\xfaW^\xc5\xbe?:{o\xa9s\xce\x13\x9b\xaaj\xdf?\x01\x937\x8b>\xc2\x0c\x90_\x9bG\xe3Ar\x96\x162P]t\xf0\xc6|\xa4\xb8\x80"\x1a[\xb7D\xf5l\x1ae\x8f\xa3\xf2\x15?\x03H\x1b\xbfs\x8a\x8e\xf2\x980\xdf\xf6\x99Nn\x8b\tL\xefniv\xfa\xf8\xfa\x92a\xa8\x8di\x8ec\x8a\x8b&\xfagz\xf1\xdc,\xe4Q\x14)\xa8Z\xba&\xa9\xf8aa\xe5\x80\xf0i?\xb5\x01\x88N\x85\xfb\xbf?\x19\xb5F*u\xb8\xe7\x1eYiV@n\x0f\x8bC\xca\x1b\xc9Bb\x07\xe9e\x13E\xf2\xf8dvF\xc4/\xe88\xa2&\xf9P\xe5B"\xf1\xf1_\x8bGK\xae\x17\x9c\xcd\x88\xd6\xd01\xa3\x03\xccAlQ\xcb\xaf+u-\xb1\x02\x1a#\xdd8\xebQ\xda\xbf\xd7\xc1S\x131sH\x1f\xeeO\xbe\x0e\xfb\x00Tn\xc2\x95\x98]d^\xc6\x7f\xfe/l\x19a# \x1e\xa6ia\xca\x92zr\xa9)\xe04\x8c\xa2\xdbwh\xd2\xde\x1b^\x1e\xf36\x9f+\xd5WU\xce\x1b\xbbOGK\xbdr\xdb\xd4\xe1\x89o41\x8b\xec\x0f\xeew\x03\x81zqh\xd5t\x03m\x83\xdf\xe2\xc7cn\xd3M\xd9\xaa\xf2\x8fE\xcb\xb0\xbeI\xfeh\x00\tw\xa9`\xefJ/\x99m\xef4c\x06XFe\xc0\xf73\x19\x9d\x92?1\xdd\xe0\x94\xa0P|o\x9d_{\xad\xba\xafyy\xf6\xb9L\x92\xac\xb36\xd7\xc0\x1d\xa7n\xf2m\xf61h*P\x0b\xf4V\x838\xc6|\x87\xef\xb4\xdf#\xc8\xa22:\x1f\xe1\xb5\x80\x873\x1e\x9e:f\xc2$\xe5\xadFz\xcc":g\x87\xcal?\xb7\xd5Vt\xca\xfa\x843\xda\x1ap\x82\xbf\xb1=\xde/5\xeei\\\x1f\xe2C-3\x99\x98\xca\xf6\x89\xba\x01hR\xea\xda\xd2\x1c\xbb\xdaz!\xeeb\x01Wj\xa8\x9d\xc5\xf7{4S\x0e\xbf\x16`6"&\xe0\xf3\xe0\xce\xf7\xd4~M\xa1K\xb6\xe3^!\xa3\xd0\xd9Q\xd9\xa5c\xde\x08\x1b\xaf-\xb8\xd5\x00W\xb4dSf\xe0\xba\x7f\xd2%7@t(JH\xc9\xea\xa9\x81\x10[\xfa\xbd\xfc\x00\x1d\xe5\xce\xd2\xcc\x8d:(\xa1\xc9\xad;\x10\xdex\xad;r\xa2#\xa0\xd3\xea\xbb\x00\x88\xfab7\x9c\xe9\x1c1P\x18\xc1\xe7/K\xef_0c(\xd9\xfa\xb3\xe0\x95\xd6\xe5*\x03F\x06\x04\xad\x13\x93~.\xccp\xd3\x9c\x07\xde\xaf\xdb\xd6R\xa81\xd0\xdf\xa4\x0fm\x00\x13\xdd\\B+\xb5\x0eR\x0c\xc9~\xcff*7\x8ci\xb4\xc5]O\x85)\x14jc\xf02\xbb\xd9xR\xd2\x84\xfb\xf5\xc2\xdf\xdb\x84*\xcc\x97\x8b:\xafs\x03*\xbc\xa5&\xf0\xe3`\xf9\xa9:;[w\x167\xec\x8ek#(\x0c\x19\xdc\xdb\x11\x1a\x85W\x9a 6\xcf\x0cg\x89\x1d\xfe\xba\xc3\t\xd4v\xc9\xe8\xae6\x14>\xcf<\x13\xbf\xe7%.m\x95\x8a<R\xc8\xb2\x83\x0f\xe5\xd0\x81\xe5\xdc\xf8cBn\x01(\x02\xe5\xb8c\xf4M\xd88\x7f\xd9\xf6\xd4\x91\xd0$\xfaF\x03\xa6s%\x84\xd4\xe0\xea"\x0eJ\xf7\xdb\x86\xeeJa\x0c\xca|E\x8bdF\xbf\x9bEF\x9em\xb5Aa\xd4\xc2\xd1z\xdco+N\xc1\x03\x86s 4k\x93\xb7\xd1\x90\xe2\xab\x06\xcd\x8c\x83\x11-3C\x1a\x9b\xe1\xe5#e\xcd.b]\xfcWJ\xc5\x88\x7f:\x9f\xcd\r\xd8\xda\xb4\xde\x97\xa8\x15w\xdf\x04z\x06\xd5,?\x1c\x01E\x15\xa3\xfc\x956b|\xeaK\x07e\x8b\x95j}8T\x9f\xd2OqU\x05\xf0\xf0Qi\xb5\x02\x1c\xb0Y\xa0{\xcfE%h\xe4\xf8[\x9bA\x7f\xf5/b\x13\x06Y\x94\xa5]\xfc_)\xfb\xffA\xe0\xc9\xc0\xd6\xa5Yc\xa9&^\xd7\xc7\xc8\xa0*E\xb8\x84\xc9\xf9\xbc\x06\x9f\xf5\xaf\x8f%:\x04>\xe1\xae\x8c*c!\x99z\xa9 \t(&P\xeaX\xe3w8\xf4F\x86E9\xd5\x97~Y)m\xfeRe\x80Z\x1b\xf4\x17\xf1\xa1hEsIJz\xe6\xf9\xa2\xec\x87-kO\xef\xab\x04\x0cY\xeb\x1bJ{<\x1f\xf5\x85w\n\xefG?\t3H\x97\x99\xe1\xa3\nr\x9b\xa2\x97\xc0\x95aH7\xf4\xd0\xa8\xfc\x97\xac\xdc$\xf6\xd2\x06\xe1\xee\xfe2\x8c~\xa9\xcan74\xfeM\xfaZ\xc4$\xf95D\x05\xfb)\xa6v\xe3\xcb\xae\xc9O\x05#\xa5\x12\x92s\xd6\x8d\x81\xa6\xad@\x88\xad^~\xea\xa1\xa3\xae\xdeF4\xd77\xf6\x8a`O\x07\xe2\xf6\xaa\x17\x16\x1fC7\x85u \xa3L|R&.[}\xbaEF\xe0\x12\xb7\xd0h\xa0\xd3\x03e\x1cH\x83\x01\x9fF\x0c\x9br\xdc\x7f\x11\xae\x98\xee\x1d\xba\xee\xcd\xac\xfe\xe1\x16\x89Z\xb4\xff\xc5\xa7\xda4\xa6\x9d\x17\x0b\x1e\xb3\xa4;\x0b\xedF\xfa\x06\x1c6\x8f\xe1\xf4J\xdc \x96k\xac\x19\x17z*B\xc0[\xd7\x10}K\x7f\xbfCN\x99\\\x83r\xb4\xbb\x9d\xb6*\xf2\xd0\x8b\xf2\xd9X\xe9\xc4\xc0\xb8/\x97TJB\xa5}77l\x02\x94\x97\x84\x96\xb8\x17\xfd\x9b\xe5H\x17\xec\x08c\x9drN\xf7\x0b\xc5l\xcd0\xbag\xf0\x80i\xeb\xacA\xa2\x92Y\xbbm\xd1\xfaX;BB\x86\xc1w\xc3\xd0C)\n\xd1q@T\x87e\xf5\xcb0\xb7?,\xbc$&\xd4\xe52)\x99\xa7\xb0Gg\x18\xcb\xa5Yt\xe2\x9e\xb7\x90Q\xd1\xb2gp;\x1a\x13L\xb0\x02=_\\\xb5o!3\xa2<\x1cv\x8d\xa13\x87\xf5\xad\x00\x13\xbfa4\x00\x9a\t\xd7\x17\xf1E2\xfd\x06\x0c\xfc\xb8\xe3\x03\xdf\xb3\xb3\xaf\x0b\xad\x13|i.-v\xe6\xa8\x07\xb3\xd7\x14Y)\xfa\xc9F\x9bS(E\xb20=\x8b\xf16c\xf98\xffw:\x01\xe6\x1f\x0c/\x17X\x1b\xff\xefN\xe9\x18\xa4\x8d\xaa\x86\xb1q\xea\x8c9Y\xd3@uR\xc3\th0@#X(\x1aW\xd1t\x0e=Db\x88\x94`\x07\x16\xb6\xb9\xd6]}Jh\xd3\xef\xcdH\xfbDG\xd2\xe7\xeb\x0ft\x1c\xdb!\xc8`\x90\xec\xae\xac\xe5\x9ePw\xa3\x81dV\x1d\xa0r\r*F\t\x83\x06\xe1\xde\xc8\xb7P\xb2\xd2\xb3\xde\x93\x81\xdc\xf6\xe9\xc2d\xc3<R.\xa8\xae\xfd}Y{)z\xc2TH}~l\x18"U\xffp\x13t\xbc\xe9\xe8\x08\xf7\x10\xc1\x8a\xfbw\xcb.\x90\x1c\x8e\xd3\xf2\xa4\x0f\xad\xd9\x82\xf8\x93\xb7\x01\xfa\x1dY4+\xb8\x0e\x9b\xa1\xfb\x97\xb30\xf5\xc5Q\x19\x11cH\x9dm\xdd\xe6\xd7\xde\xb7\x95\x94\r\x94[~\xac\x00\xf2\xd1\x12\xb9\xcbM^Y(L\x19\xabc\xdd\xce\xe0\x86\xbdv\xddI\xcf\xb1\x05k\r\x14\xe7|\xeb\xf5\x97\x82\x12\x8c\xb5\x87o\xc3ZN\xc97/T\x83\tS\x8b\xaf\x9b\xfb\xa7x\\,p\xd7\xe9?-\x01\xb5\x99\xc5\x19U\x04\x02\x8f\xef#\xe6\x7fFrE0\x1f\xea\xabn\xbf|d\xb1\x80\xc7k\xda\xa4\xc7.\x03\x95A\xcd\xa7\xe4\xa7\xe9\x8a"Pe\x1e\xc5\x90\xe6\x1c\xb6kO\x02\x1b\xe0\x98\xfd>R\x97\xd8B\xb5\xbb\x91\xc5\x851_0&\xd7g\x8f\x90\rl0\x84\xe3\r[>\xf1(\xccU\xddss\xc5\x0e\x18A\xf6\xdc\x02V\xf7\xe8\xf3\xcd\t\xcb\x00\x8b\x1d.\xc9M\xaa\xe6\xb8\xf7\xc1\x05my\x96@!\x86Bc1`\x03\x82\x98\xbe\xf9x\x919\xc8K\xf6L\xeb\x04>l{4i\x9ax\x9d?\xaa\xd4\x80\x1a?\x14\xa9\x06\xda.\xf9\xf4\xd5\xe6\xee2_2\xe0!\xf8\x9cXz?6#\xfb\x80\xe3\xce\xde\x14\x83\xe4(R\x94\x1f\x899\xd2<\xc60\xc3\xe5\x18\xe4\xaa\x03\xf9\xfb\xfew}F\x0ed\xca\xee]6\xb4\xe3\xd2\xd4\x1d\x1d\x83=h($\xf4\xc3\xb0\x0c\xd0\x90MV3j\xc4\xbag6\x9f\xe8D\xcb\x10\xe6\xaa|\x15\xb6)e\x0f@q\xc1\x03nDG\xa4\x0b\xcd5[\xdd\xac\xb6\x04\x0b\x07<>\x1du@T\xfe\xaa\x85\x0fm\xbb\xf9\xf5\x00\xa6\x17c\ra\x8c\xca\xe6\xe8\x0f\xab\xd6z\x07\xeeJ\xfd\n\xf7}\xda\x0eX#U\xf7Y\xd7\x1f\x8dxg\xbd6\x84*\xd5\xab\xd8]\xffk\x98\xb8\xd7\x9a\rPY%>\xf5@\xcb\xd8\'{\x82\xe6\xabv$\xa2\x86\xf9\xb7=*\xba\xc18\x16\x18g"|\xb3\'\xdcV\xc5\x1d~\x85\x9c\x06 \x0f(l\xfd\xb4py\n\xdd\x98\xd2\xa5\x13Eg).\x892k\x7f\xd4V\xf0\xe7V\x19\xa5\xf3lg\x93\xb5\xfa8\xa0t\x01B.\xae\xfc\xf6h\xf7s\nz\xbdV\x88\xa2\xca\xd1\x07\xb6\xa4-\xc8\xcf5\x9f\xc4\x05\xdc\x8e\xe2\xaa\xe7\xbe:D\xddM\x8b\x9fh\xeaY%\xe0\xf45\x1aj\xda\xdc\x19\x08\x8c\xe0\xf7\x15=\x8b\xa2M\xb3|]\x15|\xe2?\x99d\xc4mp_\x9e\x17;\x06\r#\xadD\xc8#\x00\x81\xfcR\x812|h\xb3\xeevic\xa0L-<\x83\xa7\xe4r\xc8\xad\x19\x81~\xd2!k\x9f\xa2\xc3.\xaeZ\x17\x9dZ\xc7\xde\xda\x90\xbf\rjw\xec\x13\xc8\x8e\xcf\xd8{\xa7%P\x86#2\xb8\xd2\x025:\xcb*%\xb8T\r\xe9\xbd\x90\x86\xf2r\xcey\x93\x9f\x1d\x87\x19\x12!\xcf\'\xee\xe0\xb6=\xa4\x89<Q\xd6\x9f\x1d\x88\x1a}\xb5\xf5\xfe\xbb\xd1\xc2\x819V\xe3\xf6\xdd*\x928\xfe\x9b\xa5x\x0eS\x0bu\xe0\'\xc2\xff\xdc0\xf0V\x06\xb6\x13of\xf8\x8a\n\xe7\x8c\x08P\x1d\x06\x15\x15\x90\x01\xeb\xb3\x14\xb0\x16i\x88\x83\xf7\xf4\xe5\xa4OI\x13k#\x12\xab\x83\xdcW@\x7f&~\x03\xae\xa6\xb2*\xcc\x90Mu\xb6\x8b#W\x02\x00-e*\xb6\xec\xb62V\xa97\xa07h\xaeVl\xd9\xc8\x1e"S3\x821B\xfa\xc9Wy\xefa\x08\xcc\xea\r,\xcf\x0c\xe0\xc4]\xb5\xd6\xd8\xb75\xdf\x81\xdc\x9c\xef\xeb\r\x9b\xf7\xc8\xee\x8e\nt\xf0\x86\xd0\xdb\xd6\x112\xd9*C\x07\xde\xc8\x01\x90Y\x1b)\x07\xff\xfa\x0eN\x0c3`OZ>\xe2\xe5/0\xa3\x89\xc3\x8dt\xe7\xe5\x86\xcf\xc4\x0c\x8d$\xe35\xe9#*\xfe\x11\xa2\x89\xb1\xb5\x08ky\x03\xf9\xbbf\xae\xe7\x88\xcc\xe9\x19\xf1\x11\x98u\xc5\xc5\xd9}\x90C7\x05z\xb8\x13`-\x80R\xce\xe3\x99\xd0jvFn0;gA\x9e\xd3t\x8fKs\x92\x08\xd5\xd1\xe0\xa3m\x8e\x93\x00\xb0\xd0\xe3A\xf8\x9b\x03\xab\xc7\xed^;3\x9c\x91\x04\xd5\xbf*-;\xd6\x85\xdf\xff\xff\tg.iu\x83\xd1\x16\x901\xd2\x05\x84\xa6\xf0\x07^\x87D:\xc8\x9c\xe9\x8e\xdaM{\x16\xc5AU\x84T\xb4"m\x884\xab"\xbcV\x97c+\xcb\xb6\xb8\x96x\xef\x14\xf6q\xb7\x12\xfb}\x9e\xae5\xee\xbb\xa8\x83\x90\x00\xd6\'\xfar\xf0<$\x94\xfa|\xf8\x06-\xf8\xd5z\xf9\x8f\xd7mt\xado\xf2J\xeb\xbf"\x9cC\xf1\x1f^\x98`\xd1\xe0\xcdC\x06\xc6\x151\xe1\xa2\x0c\xe4/\xb2\x95#^\xc3\xeaqj\xc6\x0e:\xd7\xc0\x8a\x89\xd1\xc9\x07\x14\xf7\xff\xe4P\xe7\xd3\x10\x1c\x99\xa3\x06{\xee8yh\x7f\xc4\x0c\xfd\xc2K\xf6B\x93_\xcc\x1b\xf9\xf7Hr\x1f\xc0>Mau\x0b\xcbH\x94\x1c.\xce \xf9-\xcf\x16rP\xc0J\xaf\xb0Cp\xf2\xaa\xd0\xcd8\xfb>\x06\xc8\xe619?\x1e\xc4\x019%\x12\xe7\xa6\x1d\xec@\xf7\x9f\xfb\xd4_\x97\xe2A\xfe\x83\xec\xcf\xb4u\xdetj\x9e\x96Z\xc1\x973\xbf>\r\tV\xf4\x97\x80\x9e!I\xa5\xd2\x81\x8dr\xdd\xde\xc4\x04\xefr>R\xf4u\xae< e"\x83\xf6\xca\xd5\xa8\xa4O\xc5"\x8e\xd1\xb6\x1egr\xce\xc0\xc8\xa6D\x9b\xc6\xff\x8c\xcc\x12Z\xb6\xfd\xb2\xff\x94\xedYF!?R\xabv\xe6\xa6\t\xa1\xc7\xc8w\r\x11\x81Q\\+%\xe1X\xb55\x9f\xfb\xb2(d\x8c\xe0ud\xe4R\\P\xc4\xc6(9^I\xe9l\x10CW@\xd0Rx\xbf-\xb7\x8a\xa0\x03\xb8\xcb\x904\xc3:=\xb5}A\x04\xeb\xc5\x8ai#\xa7@\xd2@\xd4Z\xfc|#\xe51\xbe\xbe\xfe8\xdc9\x9b6,\xbe\xa1\xd1\xc1[\xbeer\xc2#\xe9\xe0"\x93\xb7F99E\xfd^;K\xcd3H\xad\x9e\xa0r]\xc2*\xd5[\xc7p?Z\x1b\x06\x10\xdb\x19=R\x94>\xc7\x10\x0bH\x13\x06\x0bv\xef\xb6\xf8_\xbeo`\xad \xb4\x80@U\xdf\xf2\xdc\xf6O\xe8\x18\x1f\xe6\x8c$\xab\xbc\x82\xe0\'(\x8b\xd2\xda\xea\xbf=\xa4\xc6\xf6\xef\xb3\xd5\xa6O=\xe2\xcd\xe25gX\x8f\xbd\xd7\x9e\x1e+i(\x87^\xd5+\xa9i;\xc4\x00\xffM\xdb\xac\x01(\x17\xb0\xe2\x9a\xf9\xbe\xd0J]\xef}4\xee\xb2\xf0D\x914\x94\xb79\xbad\xd2\xa3\x19\xd2F\x98vQ\n@MU\xac\xdc\x97f\xe0\xc7\xf3,""\xaf\x9a\xc1-\'\xdc\xbc"\xf6i\xac\xb5\x11\xd6\x9d\x14v\r\xdd\xfe&\xac\xe0\xfb|\xa2\xcbZ\x12uo\xd03\xb2\x1fU=\xf8\n\xe6My\x97\x95>\xbd\xf5\xf9})\xcc@\x87/\xaf\xc3m\xacS\x1c\xe0swQI\x04r\xe9\xaeVz\xf4Y\x9abv\xd3\xf3_u\x18\xa1\x85\xadx\xa8DrE\x16C:M\x13x6\x9f\xe1p\xb2\xdf\xc4\xdf\x0b\xb0\xd2a\xea-\\->\x9e(\r\xb3S\xd5\x8c{\x01\xf2Y\xaa\x9f\x95cZ%1w\xe0\xb8-\x8b\xd6\xa2\x17?\x89vI\x8e\x05A\x19\xbd\x1e\xc0?\xa3c]\xb3\xd5t,W\x98,\xcb\xab\xdbU)a\x87+\x8cJ&\xd6?q`(\t\x95Lw}\xe3\xdd\x9a\x13Vi\xc5\xe6\x17(T\x02\xbdu$\'_\xf0f*\x84\xcb-\xfd\x97\xe6\xf7\x040k0C\xeb\x81\x9e\xbe\xe1|8\x1aY\x07\xfd\x90<\xac\xb1\x16\xe3\x0f:\xab\xf6\x95\xf4:\x11`\xa1\xa6\xd0y,\xfbe\x86\x16\xbd\xef\xbe\xa7\xcfc\xc0\x0c\xa0\x9e\xb9zQ\xc0\x86^`J\xda\x98\xa6\xf4*\xe3u\xeb\xbb|\x88\xf0X\x9d{\xaa\x82\xfbs\xd6\xad<\x88t\xf6\xea\xc7\xd4\xe7\xee\xc5\x1a\xcbOz7\x979\xd3\xc3\xa6ONmJ.v\xdc\xf8j\xad2t\x9eqZ\x1f\xe5so[;\xe1X\x8f\xee-&\xa8\xba\xb8\xf3\x90\x9a\x82\xa3\xd9\xd9\xb7\xf5b/3\x14:$\x81\xe6\xe6\xb8\xd1\xfe\x1e\xa9x\xdb\x07\xf8N\x90\x98\xce\xe6\x1aOL\x8bT\xe4\x0e#K\xa3\xdez\xb4KT..\xd1\xfc\xb7\x9b\xa7\xc7\x07\x9c\t\x07\x0bLu\xa6\xb6+\x04N\t\x11^\xcd+\xd6H&\x12\xcfM\xa4e\xea\xa6\x94\x923T\xfa\xa9\xd0\xdc\xb8\xb0\xfe\xa0Y\x04\xb5E\xe3T<P\xd2o\xf5\x02\x92\xb7\xac\xb0\x93\x99\x06(\xcf\xb1\x81\xf0h\xf6Z\t\xb7\x13\x8c*j*\x15\xf9\xf6yhL8\xe0c\x96\xe3\xbc\t\x8f1\x06\x9b\x95\xedx\x87c4\xf6J\xa4\xd3\xe9\x1e=\xe6>f\xc8I\xc45\x7f\xbf1\xdc\x08\xf7\x1fA\xcfGg\xd3\xd9>^\x14\xdc\xcbeX\x13\xde\xc9\x9d\t+\xfdW5\x99O,\xf2p\x93n-\x99\x95~\x08J3\x0c\xfe\x8fS\xc8U9\xc2n/+\xabT\xd8\x91\xa4\xe1\xcb\xc6\xab\x82\xa0\xec\xeb\xab\xee\xc4\xbc\xdeg\xce\xba#H\xe1{h\xb0b`\x81`N\x9bD\xad\x0c)y\x03\xbf\xdc!\xb0a4<g,\xf0~\x19\x0b2n\xdew\xfe>K^\xebN\x9f\xbe9;\x0f\xb6\xe0f\x18~\xe7\x8d\xfdOEJ\x14\xc9\x99\xc1+\xc2\xba2\xa5\xfc\xcf\xffB\xb4\xe1\x07p\xa1\x1c\xacA\xaa\x9e\xbfLp\x93d\x97,z\x88\x17F\xf1\x9bO\x19\x9d(\xed\xf6\x13jE\xceF\x84\xf2Tj\x8cJb\xeb\x04\x8b\xfc\xf6\'\xf76P&Fe\xadx2\x93\xd6)\xa2\xf6&\xa1\xdf\xc3<\xe2\x9b\x82\x87\xd1\x12)\x9a\n\xc7D\x0fI;\xca\xcd\xbd\x87\xab\xc4\x85\x99\xe5eG\xa7\xff\x1a\xe1]\xa6\xe0\xd2\xca\xb8NM\xe7%\x83w"\xb9\x90\xb5\x07\xb6\x9cB48\xf9\xa5\xc9\x8e\xccw3cXR\xd9?\x08\xa2\xd8T\x88\xe0\x81 \x18\x1dh\xac\xf0\xa7\\\xcaUF\x0b;\x88x\xd0t?\xf2rV\xae;M3\x95\x11\x85G3\xfd!\x1d[y2\xb5\x91\xb6/\xf2\x97X\xf3\xf7\xe9m\xda}\x97\xbdo\xfb\x9b2\xc7\xbf\xf8\xe7\x92\x17\xbb\xb2*\x11/R(\xb1F\xe2\xfb\xeeU\x16#\xe1\xad\xd1"\x14\x9d\xde/\x9ah\x80\xa3WN\x1fK\x81\xb7\xf8)%\xec\xa9\xc2U=\xff"{+m0\xe1\xb5+A\xee\xec\x89\xfdF\xd6\xfa\xaab\x84\xccH:\x8eV\xf8\tZ\xf4\xd8~\xdc\xc1\r\x97\x1aK:oJ\xabT\x83{\xfa\xab\x9d\xb9XA\x99\x08\x0cJ\x18\xf0\x01\xda\xb0`\xd9#[\x8a\x90\x7f\xd6\xaa\xf8\xfdc\xd7<\xcc\x0c\xffr\x98\x00\x8c\xefJ\xc9g\x0f\x0e\xe6\xf8\n\xb1\xf4\x16\x19N$\x89\xf1\x1e\xd2q\xfd\xf1\xe8\xf4\x0b h\xd2e\xe6GN\xa7D\xb1\x85gl\x15\xb1\x0c\xbd:\xc5\xff{%\xff\x83p\xec\xf9{\xb4\xf5\x9c\xa6O\x1cW\t)l\x8f\xf1{\xc2>\xe3Y\x90d\xba\x83\xf6\xd9m\xc0F\x86\xe2\x8c\xabZL\x1e\xe8K\x05\x914\xee\xf5\xe2G\xa2\xfe\x9bN\x154$G\xe6\x19%\x97\x00\\T\xa7\x1c7\xec\xc7\xf3\n{\xa0\xd7\xc7[\xe0X\x0ex\x15De\xf6.\xdf\x13\xbfLnS\x94\x95 \xa2[wWS\xfd`\xe7\xdd\xe8\xc2\xa5\x10<\xf3\x97\xb3\x92r\xdcw\xcc+\xc9\x05\x97.;b\xcc\x0b\xe0\x14w}\x89^\x8a\xa0\xa4\xeb\x0f\x87\xe8\xdc{}\x81,*\xa2o\xadl\x02cG/t;c\xd3\x01\xa9\xe2\xdc\xf91\xa8\x1e\x984\x1b\xc7\xe7\x81\x11\xc5\xb19\x1b\x83\x96kk\x89\xda\x8c\x1c$Sf\xdc\xe9=P@\x18\xed\xebU\\+ \xf0S\x85\xf8\xd5X\xb7\x9f\x8aj\xab\x8fN*!\x0e;\x8e\x1b\xa1_\xb3\xf7\xc6H\xfe\x14\x1a\xd2CxU\xa8\xc6U\x0c\x1a,!\xa7P\xc1H\x083\xe3\xa4g#\t}\x95\xbc\xe9"4\xfa\t\xbe\xbf\xc9@\xac\xfdlK\xc5\xac\xc9\x04\x8dLUh\x95\x9bB\x9c\xd7\x7fa\xf5#\xcc~\xf0\xe5k)\x8d\xab\xa6\x84;}\x9dr\xb0\x94\x8d\xbd\x80\xbce\n\x01\xefH\x84\x91\xf6\xac\xfdj\xb3|\x93\xc3MWa\x88\xfc\xe25\x84\x98\xc8\x95\x02\x1d\xbc\x08\xd7\xfar\x11\xbb\xec)\xb5\x03j\xd8Je\xa8\xfd0\x13T\xbe!\xf5\xd9\x15.\xc4I\xad\x90\xee\x1a\xce`\x8f\x81\x9f\r\x12\x88\xee|\xaf\x0b\xad\xc4p\x03\xedN\x9b\x8cv\xe9\xd9\xbd\t\xfbr\xeaBJ\xbb\xd8\xa5:\x0f\xc0\xb7 \x9eR\xf5al<\xebM\xb7\xb88Ecb\xf0\x16\x19\xbf\xe3\xd8\x85\xc6\xb4{\x1b\xc2\x95\xc9\x86nw~Q\xafV?\x06\xf7c\xf8\x93\xc2\xbdVX\x9e\xa5\x06\xf1\xa6Ky\x82\xd2\xd7\x10\xdb\xca\xd4,:\xa8.=\x14\x00\x18\xbb=\x98\x12\xbc\x14Ko\xdc\xa8W`\xcc\xed\xbc\xda\xd4Y\x0f\x82\xe39\x16\xb9K\xf1\x02\xcd\xbbC\xf4\x87n\xb0\x8b\x92\xa8\x89>)p\x8e"\x9eK4\xae\xb3\xb1J\xbf\xd4E\xfah\xe62\xc4\xb9\xbe}\xba`{\t{<\xa5tv\xdej\x801\xec\xe7\xea\x9b\x15\xb8v\xfa-J\xf5\xa4D4Om\xd2\xfcK\xb1\x87w\xff\x18E\xb8\x9f~6D\xf8\xbf\x19Z\x90s\xf3U\x0bW@\xc2}_\xd0:E3\x16G\xaa\x0f\xba\x99\x16\x84o|\x80\xf2\x8d=\xd6M6fY\xa6\xc6\xef\xea!)W:P\x01\xa9\x00\xed\xcb\x01z\x06t"\xd7\xc9bw\xa8\xef\xa3\xd2)*4,9\\\xf4p9\xd1\x81\x19\xea\x7f\xb3\xd0/\xb0~=\xc0\xf5\xd3\x8c\xbc\xf7k68\xc4\xe5 <\x84y\xd8\xef2\xe3F\xf7\xf8\x83\xbaj]{[\xeb\xf72\'5o\x19\xc9s\x0b\xaa\xf5\xc4\xc9\x01&p\xc1\xa2\xc6\xe1dz\xdd\xc4k\x96\xb8\xf0\xdd\xf0\xa0\x93\xd5\x0b\xcf\xe1,7\x16\xff\xb2Q\x92\x9dn\xafd6\xeb\xdf\xa0##\xdc\x05\xf9Fni\x849r\xae\xc9\x8c0QP\x94\xe4\xe0\xb9\x12\t<\xfe[2\xc9\x1a\xfd3\x00\xbc\x0e\xdf}\xa0\xf4\xb5\x91\x9b\xcbB\x1e\n\x86\xab_\xc5?\t\xd4\x01"Vy8\x85\xe18\xd9\xdcJX%\x888\'\xd1\x8b2,\xc8d\xb4\xf9\x9dI+f\xb6E\xaa\xcb\x97$ \x00n\xa5\xd0\xd96\xcd.\x86\xc4\x80\x9e\r\xd9\xb0\xd1k\xe2G\xef\xc41`\xbdT\xb2\xce\x04h}\xaa\xb0\x1b\xb5\xf81\xcc1\xbc\x92Y\x8c\x1f\xa1;u\xea\x9eY\xb5"\x1c)2Z+\xe0A\xefK\x1d\xab\x17RN[\tX_I\xb6\xc5\xca ?|\x11b6\xb6\xe8&\xa2fZm\xf5Ju\xa2G\xb7\xe5\x0cC\xccZ\x1e|\xb3{\x83\x1d\xe58\xf3\x13\xa9\x9dd\x0f\xd7\xcc\xae\xee\xa8\t\x85\x84\xb3BoT.\xb0UI\xfd\xd2\xad\xf1>\xbbJ\xd7\xdc\xc4YC\xcfFI\x07\xcd\x13Y4\xb6\xe3\xa8\x9b\xf7KdB\r"\xac\xe7:MpS5\xd7\xad\xae\xba\xb0D|xe\x0co\xc2c\xba\xec\xb2\x1c\xb1zLs}\xfd\x85\\\xe12\xe8F\x0bp\xe5\n\xc1\xaa{\xb7|qIa\x1b\x9aG\xea\xab\xe7,\xc7\x1c\x8a\xef\x8fm\x87B\x0f\xff\xee^\x8d\x06\x8d[\xa1\'\x0e\xac\x07\xbc\xd3\x14\xeeV\xcf\xf8%Ln%\x05\x88"\xc2W\xe9\xe5nO\xfa\xa9\xb1H\xc0A\xa7\xa2\x86\x98R\xcb1s\x1c\xf2\x1d\x04\x82y\'\xf96\xc9cw\xcd\xb9\x88\x0ftr\x89\xf5NT9}\x0c\x8ek]\xe0b\x9d\xdf\x9c`$7\x05\x1a\\]\xd0G<\xda\xfe`6\xa8\x1f\xa5\x92\'\xc2\xb19\x03\xa9\xde\x1f\xdd\x1c\xdf|\x80L\x86\xd5<\xec\xb7#P\x0b7\x01\x9f\x02\xd5N\xddJ\xa8f\x93Y(\xf9O\xa5-\xc8\x90\x1b^{\xdbc\xe4\xd2\x80\xc5\xaa\xc5@y\xa3\x10\x94\xc1\t\xb0\xda\x14\xfa\xa9\xad\xa4t\xf6\xbc_A\x88\x8a\xfc\x8f\xf2WdW\xfbm\xd5\xed\xcb \xae}\x04S\'\x9a\xf5\xe3\x13O_&9k\xd3\xfc4Ee\xac\xf9j`mTPQT\x82-F\xd2&ZG\x8bec9\xafd\xdf\x93\x1b_3\xc0\xbeL\x05#\xf9Dto\xaf\xd3\xc7\xdc\xb5\xa6/\xd9\x00dg\xc5\xa6"\x9d\x1e\xbc\xb1\xa9\xe6\xc2\xdc\xb8`%U\xd1\xae\xfd\x0e\xef~R\xce\xdc\xac!\x13\xb2\xfb\xc8#>T\xa3h\x14X%\xc5f\xd2U\xc9p\xac\x92\xba\xb1R\x03\x1b\x16\x86\x0c\xbc\xaaN\xad\x03\xcd\xa8Xd5\xeb\xff\xbb5\xe3\x05\xc2\xc1\x91]\xb3R\xad\xdc`:\xabeN\xb3\xdf\xa8\x1fQ\x17/(P*\xb7d\xb4\xe8\x81\x86\x86\x9d{\x84q \x03u\xddW\x9ev\xb5\x14<\xd4E)\xde\xdd\x0e<\xe6r$\xb1\x1f\x05)r\x0c\xe9*\xe18\x8e\xa35x\x84\xf4\x1e\xc3\x9f\x15b\xc4b\xb6c\xdc\xadr\x02q\xf9\xe3\x9d\x9a\xe7u;m\x7ff\xf2\xcc\x81H\x88]\xef6\x06\xb1\xe4\xd2\n\xdc\xbcF\x88\x81\x0f,*\x11\xa7,\xb1",2:\x89\x98}\x13?\xb6\x0f9\x9b\xb33"0\x86\xfcnr\x90\xa0\xcfq\x1bU;\xcf\x19\x84f\x81\x8c\x7f\x08\x9f\xd9i\xf0;0\xdd\x18"\x19(dV\x1b\x8c\xc6\x88u\x9bR\xb7\xac>\x9d\xc6,q\xc9\xce\x05\xeewT}\xc5\x9e\x85tb]\xe2z\xab\xd1+\xb0=\xcb?\x8d\xf1\x01\xc4D\x97\xe3`2\xaf\xdc\xcf\xdd~u\x05\x0b\xfd7\xef\x05\xd9\xc5A"\x87\xd9\xa3\nv<\xb3!\xe2|x\x82g\xdc\x98\x15\xd7\x0f\xdd\xe9\x8a\xc3sy\xa6SGK{\x18\xf4\x0fU\xeb\xcdj\xa7Nu\xebO\xf8\x9b\xdcV\xda\xa7\'T%\xd8E=r?!\xa6*\xc9\xa7\xd0\x82\xf5\xda\x84O\x85\xa6Np\x82\x9f\xbf=\x13W\xb2\xed~\xb4Z\x19o\xcbK^\xd4\x08K\x91\xb2\x1e3E\xf8Ch\xe8\xd1\xa7\xa1\xc7L\xec\x92=+\xbc#`U\xac\x17\xa3\xf7\xf8\x8f\xf7h=NQ\x88\x85]"\xfa\x1d\x03\xe7\x94&-\xea\xa0y\xf9\xa7\xa9.\xfd\xa9\xfe\xb6\xfc`\xb3\xaa\xc3}y\xa4n\x81N\xeb\xc3{J\x8f\x88f\xfe\xef\x1a\xcc\xacAM\xe2\x0f\xcd\x0fn\x05<\xb05\xe4\xfa\xd5\xdf\x8b\xdc\xdf\xb13\x07\xfaw\xec\x0ez\xa91\xb4lL\x84cj\xafJ\xd7\x1e\xb0u8\xdc?\x0c&\xfat\xdaU\xec\xfe\xd5\xd4IX+ Q\x80\x0c\x13A:;P\xbc\xff=\xfc\xc0!\xec\xf8\x9f\xb3\xab\xdb\xe2\'\xe7\xb1\xe6\xf0\xe5Os\xd0\xaf\xd6\xcd\xcf\x08\x05 \x85\xa9\xba<x]\xfe\x16\xc7\xaes\x9e\x8a0\x0c-\xac\xd5\xce\x8a\xe7\xf3\x8d\xc1\xa4\x17\xa8;\x9e\x14\x0c/\x0e\'//G\x1c\xce\x9bo@,Cc\xc6\xa8\xa2\xf0C0\x83\xa5\'\x17zWn\xf7\xd6K\xbfa\xefb\xfcI\xe5\xcc\x10\xdc\x9d\xaa\x14\xd8L\xb0\xd5\x9a\xa9\xdd \xb1\x9d\xbe\xaf\r\x1b6qpB]\xa2<\xea\xe3u\xbf\x98U"|\xa6\xe5c\x08%7\'\xbb~"\x13X\x89\xf2a\x8d=V\x1a\xad\xbf\x92\xfd\xe75\xf6\xca\x95\x8e\x1d\x03\xa5\xd06\x81,m\x8d:\xab_\x13\xb3jw\x91/Ub\rs\x05\xdf6\xe1\xd1\xda\xe6\xfd{\x14\xac\xfa\x1c\xe2\x8d\xb2"\xc3\xf8n\x91\x01\xd5\x8cg\x7fa\x14\xb6\x83\xd6\x97\x9a?\xc5\x08\xb6MvKz>\x84\xd4\x0c6MFTQ\xf0\x9d\xeb\x1e`\xbe\xa5B\x91\xb4\xe3O\xfb\xc2\x17o\xcet\xaa\xe23g\x91=H\xa8\xf9=^f\n\xf7\xa1\xec\xa4\xf8\x00\xea\xf5\xcaI\xfe\xb1\xb8\xe3\xcff\xcdZ\xbe]\xe5\xa4\x15\x8e<+\xd5\xe6\xca\xd6\x9d\xfb\xbej)8\xd9\xce\xc9\x85{\xf2\x12"\t\x1f\xa1\x1a\xe2\x8d\xa8\x83\xc3]a\x82-K\xde\xdb\xc8H\xd2[!#\xce0\xed7*Pk R|\x8c\x05.\x05\x1aV\x81\xbc./t\xe5\xb0\xf1iB<\t<\xea\x1d\x05g\x19\xb8\x12z\x9dk\x16\x1b\x87\xfc\x84f\xce\x00~\xc1\xae\xa7\xde[\xcf\xd8\xfe\x87\xee\x9f\xd8\xccw\xab\xde\xd1\xaa;&\x8b\x12\xa5v\xa8\xbe\xa2_\x14~\x99\xe8vJVc}\x04\x1c\xd2\xacmq\xb8\xf7\xa3\'\x8cY\x84\x19\xcb\x07\xb0\xebX\xf576Y\x93:\x85Hl\x11\x89\xd6\xd8\xd1H\x14#~l\t\xcd\x0b@4/\n4nL\xa9\xf1\x8f\x96d\xd9c\xbf_\x9f\x86t\xeb\xa2\x97\xc7n\xefZ\x94\x8d\xc2\xabrC\x08\x1e\xf2\xf5\xa8\xbd\x059\xd7\x84"\x1b\xd1\xccZ6-\xba\x99-l\xb9#\x93\xc2\xb0\x02{]\x19\x1d\x1a\x13\x1a\xd8{c\x13\x1d@\x05\x8d\x8c\x11\xbdk\x0f\x07i\xad\xfe\xaa?\xd5\xdb=\x93\xf9X\x8bn\x0c\xc5\x94Y\xcb0\x00\xb8)\x15TI\xef\x8a\'\xa8\x9b\x8c=\x9b\xfe\xab#\xaa!\xe7`+JT\xea\xf8\xa10k\xceT\xc1\xd1\xd0\r\x87\x18\x97\x18\xd6\xea\x83\xd9q,\xc8\x8dk\xd6\x84\xa8\x97\xe2\xcc"\x88s>\xdd\xb3E{\xf1$\x0c\xc1BpH0\xf1\x813\xb1j\xc7\x87z\xd1\xd2|\x9b\x84f{\x07\xb9\xff\x11\xcc(\x8aV\x14{\x82\xd0\x0cI\xa2U\xd1\xce\x91J\xb1(\x95\xb0G\x02\xe9\xd5\xc4')
|
1
|
+
|
2
|
+
from flask import abort, render_template,request,Response,g,url_for,jsonify
|
3
|
+
from wtforms.validators import Regexp,ValidationError
|
4
|
+
import urllib,uuid
|
5
|
+
import datetime
|
6
|
+
from hiddifypanel.models import *
|
7
|
+
from hiddifypanel.panel.database import db
|
8
|
+
from hiddifypanel.panel import hiddify,clean_ip
|
9
|
+
|
10
|
+
from . import link_maker
|
11
|
+
from flask_classful import FlaskView,route
|
12
|
+
import random
|
13
|
+
from urllib.parse import urlparse
|
14
|
+
import user_agents
|
15
|
+
|
16
|
+
|
17
|
+
class UserView(FlaskView):
|
18
|
+
|
19
|
+
@route('/old')
|
20
|
+
@route('/old/')
|
21
|
+
def index(self):
|
22
|
+
|
23
|
+
c=get_common_data(g.user_uuid,mode="")
|
24
|
+
user_agent = user_agents.parse(request.user_agent.string)
|
25
|
+
|
26
|
+
|
27
|
+
return render_template('home/index.html',**c,ua=user_agent)
|
28
|
+
@route('/multi/')
|
29
|
+
@route('/multi')
|
30
|
+
def multi(self):
|
31
|
+
|
32
|
+
c=get_common_data(g.user_uuid,mode="multi")
|
33
|
+
|
34
|
+
user_agent = user_agents.parse(request.user_agent.string)
|
35
|
+
|
36
|
+
return render_template('home/multi.html',**c,ua=user_agent)
|
37
|
+
|
38
|
+
@route('/new/')
|
39
|
+
@route('/new')
|
40
|
+
@route('/')
|
41
|
+
def new(self):
|
42
|
+
|
43
|
+
c=get_common_data(g.user_uuid,mode="new")
|
44
|
+
|
45
|
+
user_agent = user_agents.parse(request.user_agent.string)
|
46
|
+
|
47
|
+
return render_template('home/multi.html',**c,ua=user_agent)
|
48
|
+
|
49
|
+
@route('/clash/<meta_or_normal>/proxies.yml')
|
50
|
+
@route('/clash/proxies.yml')
|
51
|
+
def clash_proxies(self,meta_or_normal="normal"):
|
52
|
+
mode=request.args.get("mode")
|
53
|
+
domain=request.args.get("domain",None)
|
54
|
+
|
55
|
+
|
56
|
+
c=get_common_data(g.user_uuid,mode,filter_domain=domain)
|
57
|
+
resp= Response(render_template('clash_proxies.yml',meta_or_normal=meta_or_normal,**c))
|
58
|
+
resp.mimetype="text/plain"
|
59
|
+
|
60
|
+
return resp
|
61
|
+
|
62
|
+
@route('/clash/<typ>.yml')
|
63
|
+
@route('/clash/<meta_or_normal>/<typ>.yml')
|
64
|
+
def clash_config(self,meta_or_normal="normal",typ="all.yml"):
|
65
|
+
mode=request.args.get("mode")
|
66
|
+
|
67
|
+
c=get_common_data(g.user_uuid,mode)
|
68
|
+
|
69
|
+
|
70
|
+
hash_rnd=random.randint(0,1000000) #hash(f'{c}')
|
71
|
+
resp= Response(render_template('clash_config.yml',typ=typ,meta_or_normal=meta_or_normal,**c,hash=hash_rnd))
|
72
|
+
resp.mimetype="text/plain"
|
73
|
+
resp.headers['Subscription-Userinfo']=f"upload=0;download={c['usage_current_b']};total={c['usage_limit_b']};expire={c['expire_s']}"
|
74
|
+
return resp
|
75
|
+
|
76
|
+
@route('/all.txt')
|
77
|
+
def all_configs(self):
|
78
|
+
mode=request.args.get("mode")
|
79
|
+
base64=request.args.get("base64","").lower()=="true"
|
80
|
+
c=get_common_data(g.user_uuid,mode)
|
81
|
+
# response.content_type = 'text/plain';
|
82
|
+
|
83
|
+
resp= render_template('all_configs.txt',**c,base64=do_base_64)
|
84
|
+
res=""
|
85
|
+
for line in resp.split("\n"):
|
86
|
+
if "vmess://" in line:
|
87
|
+
line="vmess://"+do_base_64(line.replace("vmess://",""))
|
88
|
+
res+=line+"\n"
|
89
|
+
if base64:
|
90
|
+
res=do_base_64(res)
|
91
|
+
resp= Response(res)
|
92
|
+
resp.mimetype="text/plain"
|
93
|
+
resp.headers['Subscription-Userinfo']=f"upload=0;download={c['usage_current_b']};total={c['usage_limit_b']};expire={c['expire_s']}"
|
94
|
+
return resp
|
95
|
+
|
96
|
+
@route('/manifest.webmanifest')
|
97
|
+
def create_pwa_manifest(self):
|
98
|
+
|
99
|
+
domain=urlparse(request.base_url).hostname
|
100
|
+
name=(domain if g.is_admin else g.user.name)
|
101
|
+
return jsonify({
|
102
|
+
"name": f"Hiddify {name}",
|
103
|
+
"short_name": f"{name}"[:12],
|
104
|
+
"theme_color": "#f2f4fb",
|
105
|
+
"background_color": "#1a1b21",
|
106
|
+
"display": "standalone",
|
107
|
+
"scope": f"/",
|
108
|
+
"start_url": f"https://{domain}"+url_for("admin.Dashboard:index" if g.is_admin else "user2.UserView:new_1")+"?pwa=true",
|
109
|
+
"description": "Hiddify, for a free Internet",
|
110
|
+
"orientation": "any",
|
111
|
+
"icons": [
|
112
|
+
{
|
113
|
+
"src": url_for('static', filename='images/hiddify-dark.png'),
|
114
|
+
"sizes": "512x512",
|
115
|
+
"type": "image/png",
|
116
|
+
"purpose": "maskable any"
|
117
|
+
}
|
118
|
+
]
|
119
|
+
})
|
120
|
+
|
121
|
+
@route("/offline.html")
|
122
|
+
def offline():
|
123
|
+
return f"Not Connected <a href='/{hconfig(ConfigEnum.proxy_path)}/{g.user.uuid}/'>click for reload</a>"
|
124
|
+
def do_base_64(str):
|
125
|
+
import base64
|
126
|
+
resp=base64.b64encode(f'{str}'.encode("utf-8"))
|
127
|
+
return resp.decode()
|
128
|
+
|
129
|
+
def get_common_data(user_uuid,mode,no_domain=False,filter_domain=None):
|
130
|
+
default_asn=request.args.get("asn")
|
131
|
+
if filter_domain:
|
132
|
+
domain=filter_domain
|
133
|
+
db_domain=Domain.query.filter(Domain.domain==domain).first() or Domain(domain=domain,mode=DomainType.direct,cdn_ip='',show_domains=[],child_id=0)
|
134
|
+
domains=[db_domain]
|
135
|
+
else:
|
136
|
+
domain=urlparse(request.base_url).hostname if not no_domain else None
|
137
|
+
if hconfig(ConfigEnum.is_parent):
|
138
|
+
from hiddifypanel.panel.commercial import ParentDomain
|
139
|
+
db_domain=ParentDomain.query.filter(ParentDomain.domain==domain).first() or ParentDomain(domain=domain,show_domains=[])
|
140
|
+
else:
|
141
|
+
db_domain=Domain.query.filter(Domain.domain==domain).first() or Domain(domain=domain,mode=DomainType.direct,cdn_ip='',show_domains=[])
|
142
|
+
if not db_domain:
|
143
|
+
db_domain=Domain(domain=domain,mode=DomainType.direct,show_domains=[])
|
144
|
+
print("no domain")
|
145
|
+
flash(_("This domain does not exist in the panel!" + domain))
|
146
|
+
print("HI")
|
147
|
+
if mode =='multi':
|
148
|
+
domains=Domain.query.all()
|
149
|
+
elif mode =='new':
|
150
|
+
# db_domain=Domain.query.filter(Domain.domain==domain).first()
|
151
|
+
domains=db_domain.show_domains or Domain.query.all()
|
152
|
+
else:
|
153
|
+
|
154
|
+
domains=[db_domain]
|
155
|
+
direct_host= domain
|
156
|
+
|
157
|
+
# if db_domain and db_domain.mode==DomainType.cdn:
|
158
|
+
# direct_domain_db=Domain.query.filter(Domain.mode==DomainType.direct).first()
|
159
|
+
# if not direct_domain_db:
|
160
|
+
# direct_host=urllib.request.urlopen('https://v4.ident.me/').read().decode('utf8')
|
161
|
+
# direct_domain_db=Domain(domain=direct_host,mode=DomainType.direct)
|
162
|
+
|
163
|
+
# domains.append(direct_domain_db)
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
# uuid_secret=str(uuid.UUID(user_secret))
|
168
|
+
user=User.query.filter(User.uuid==f'{user_uuid}').first()
|
169
|
+
if user is None:
|
170
|
+
abort(401,"Invalid User")
|
171
|
+
|
172
|
+
has_auto_cdn=False
|
173
|
+
for d in domains:
|
174
|
+
db.session.expunge(d)
|
175
|
+
d.has_auto_ip=False
|
176
|
+
if d.mode==DomainType.auto_cdn_ip or d.cdn_ip:
|
177
|
+
has_auto_cdn=True
|
178
|
+
d.has_auto_ip=d.mode==DomainType.auto_cdn_ip or "MTN" in d.cdn_ip
|
179
|
+
d.cdn_ip=clean_ip.get_clean_ip(d.cdn_ip,d.mode==DomainType.auto_cdn_ip ,default_asn)
|
180
|
+
print("autocdn ip mode ",d.cdn_ip)
|
181
|
+
if "*" in d.domain:
|
182
|
+
d.domain=d.domain.replace("*",hiddify.get_random_string(5,15))
|
183
|
+
|
184
|
+
|
185
|
+
package_mode_dic={
|
186
|
+
UserMode.daily:1,
|
187
|
+
UserMode.weekly:7,
|
188
|
+
UserMode.monthly:30
|
189
|
+
|
190
|
+
}
|
191
|
+
bot=None
|
192
|
+
if hconfig(ConfigEnum.license):
|
193
|
+
from hiddifypanel.panel.telegrambot import bot
|
194
|
+
|
195
|
+
g.locale= hconfig(ConfigEnum.lang)
|
196
|
+
expire_days=remaining_days(user)
|
197
|
+
reset_days=days_to_reset(user)
|
198
|
+
# print(reset_days)
|
199
|
+
# raise
|
200
|
+
if reset_days>=expire_days:
|
201
|
+
reset_days=1000
|
202
|
+
# print(reset_days,expire_days,reset_days<=expire_days)
|
203
|
+
expire_s=int((datetime.date.today()+datetime.timedelta(days=expire_days)-datetime.date(1970, 1, 1)).total_seconds())
|
204
|
+
|
205
|
+
user_ip=clean_ip.get_real_user_ip()
|
206
|
+
return {
|
207
|
+
# 'direct_host':direct_host,
|
208
|
+
'user':user,
|
209
|
+
'user_activate':is_user_active(user),
|
210
|
+
'domain':domain,
|
211
|
+
'mode':mode,
|
212
|
+
'fake_ip_for_sub_link':datetime.datetime.now().strftime(f"20.%y.%m.%d:{max(1,datetime.datetime.now().hour)}"),
|
213
|
+
'usage_limit_b':int(user.usage_limit_GB*1024*1024*1024),
|
214
|
+
'usage_current_b':int(user.current_usage_GB*1024*1024*1024),
|
215
|
+
'expire_s':expire_s,
|
216
|
+
'expire_days':expire_days,
|
217
|
+
'expire_rel':hiddify.format_timedelta(datetime.timedelta(days=expire_days)),
|
218
|
+
'reset_day':reset_days,
|
219
|
+
'hconfigs':get_hconfigs(),
|
220
|
+
'hdomains':get_hdomains(),
|
221
|
+
'ConfigEnum':ConfigEnum,
|
222
|
+
'link_maker':link_maker,
|
223
|
+
'domains':domains,
|
224
|
+
"bot":bot,
|
225
|
+
"db_domain":db_domain,
|
226
|
+
"telegram_enable":hconfig(ConfigEnum.telegram_enable) and any([d for d in domains if d.mode!=DomainType.cdn and d.mode!=DomainType.auto_cdn_ip ]),
|
227
|
+
"ip":user_ip,
|
228
|
+
"ip_debug":clean_ip.get_real_user_ip_debug(user_ip),
|
229
|
+
"asn":clean_ip.get_asn_short_name(user_ip),
|
230
|
+
"country":clean_ip.get_country(user_ip),
|
231
|
+
'has_auto_cdn':has_auto_cdn
|
232
|
+
}
|
233
|
+
|
4
234
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
235
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/templates/500.html
CHANGED
Binary file
|