hiddifypanel 3.0.0.dev64__cp310-cp310-manylinux2014_x86_64.whl → 3.0.0.dev65__cp310-cp310-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/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/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +67 -69
- hiddifypanel-3.0.0.dev65.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.dev65.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
hiddifypanel/Events.py
CHANGED
@@ -1,5 +1,28 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
class Event:
|
2
|
+
def __init__(self, name):
|
3
|
+
self.name = name
|
4
|
+
self.callbacks = []
|
5
|
+
|
6
|
+
def subscribe(self, callback):
|
7
|
+
self.callbacks.append(callback)
|
8
|
+
|
9
|
+
def unsubscribe(self, callback):
|
10
|
+
self.callbacks.remove(callback)
|
11
|
+
|
12
|
+
def notify(self, **data):
|
13
|
+
for callback in self.callbacks:
|
14
|
+
if type(data)==dict:
|
15
|
+
callback(**data)
|
16
|
+
else:
|
17
|
+
callback(data)
|
18
|
+
|
19
|
+
|
20
|
+
config_changed=Event('config_changed')
|
21
|
+
user_changed=Event('user_changed')
|
22
|
+
domain_changed=Event('domain_changed')
|
23
|
+
parentdomain_changed=Event('parentdomain_changed')
|
24
|
+
admin_prehook=Event('admin_prehook')
|
25
|
+
|
26
|
+
|
27
|
+
db_init_event=Event('db_init')#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
28
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.0.0.
|
1
|
+
3.0.0.dev65
|
hiddifypanel/VERSION.py
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
|
2
|
-
from pyarmor_runtime_000000 import __pyarmor__
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00l\x01\x00\x00\x12\t\x04\x00\xe6\x94y@L\xe6-2\xa3\xa5WEcH\x06,\x00\x00\x00\x00\x00\x00\x00\x00j).\x91\x8e\xf0JAGd?\xfb~\xf4\xce\xde`\x07_\x11\xf6B\xafy\xb0\xae\x9eg(\xfb"\x1d\x92y|\xdaz\xf8\xfb8\x8d_\xa5\xc4\x8a\xb7G\xc2\x97#n\x0b\x17\x07\x9c\x88\xd79\x0ck\xbe\x0b\xd1\xbf\x99dY\x18\xe8\xde\x8c\xc8{B\x92\x89\xd9\x94V\xaa\xea\xbcISG\x87p\xfcF"\xcc\xc3\x80d\\\rb\xc7\xd4\x00$4\xc0\xfb]i\x17/B\r\xec\xc1\xe0\xd3\x11y\x17\x112\xfdOm\xe3\xd2\x08\xe4\xf8E\xd6})\xb2\xb3\x945\',\xa4y\x01|\x1a\xff\xd4\xf7k6\x1d\xc1h1V\xc8#\xac\x8a\xd9-\x7f\xba\n\x00y\x87kCH\rJq\xb3~Y\xb9\xb6\xe3\x12\xf9\xac\xe0\xfc\xe3\'\xb7H+\x1d.\xa9p\xcd}8\x1ef\x1b\x9dK\n\x8d\xc7\xb1\xd3li3\xc6\n\x9c\xaf\xbd\xb9y\xac\xdf9,\xa5%\xc5S+\xc5\xfe\xbc\xc7\xe7N\x16\x1a\xf5\xf7\x1f\xaeo\x95\xd4\x8b\xa5\x1b\xe3\xbe\xdd>\xd7\xefV\x96\xf8\xdbM\x11!\x9c9\xe5\xcd\x1e\xcb\xdd\xcep\xe6C\x0c\x8c\x06,\xc6\xa7v\xf4\xad\x1f\xe8KB\xecu7\xa9\xf1\x002\x1eb\xf7\xbe\xb3\x91\xb8\x14{\xca\x9e\xba=<\x96\xe8\xdd\x07\xb6\r\xb1\xe2\x8a~\x0f\xc0"\xfa0\xc6\x16\x15\xb1{,\xab\x8c\xbcG\x8a\x1f4m\xf8\xed\x13\xcd"bB$\x1c M*B\x80\x83\xe2N\xbf\x0e\xc8u\xa3\xb0E<\x0b\xcd\xeb\'\x05v?\xa3\xda\xfe\xd1z')
|
1
|
+
__version__='3.0.0.dev65'
|
4
2
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
3
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/__init__.py
CHANGED
@@ -1,5 +1,9 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
from .VERSION import __version__
|
2
|
+
from . import Events
|
3
|
+
from .base import create_app, create_app_wsgi
|
4
|
+
from . import panel
|
5
|
+
__all__ = ["create_app", "create_app_wsgi","create_cli_app"]
|
6
|
+
|
7
|
+
# application = create_app_wsgi()
|
4
8
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
9
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/__main__.py
CHANGED
@@ -1,5 +1,15 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
import click
|
2
|
+
from flask.cli import FlaskGroup
|
3
|
+
|
4
|
+
from . import create_app_wsgi
|
5
|
+
|
6
|
+
|
7
|
+
@click.group(cls=FlaskGroup, create_app=create_app_wsgi)
|
8
|
+
def main():
|
9
|
+
"""Management script for the hiddifypanel application."""
|
10
|
+
|
11
|
+
|
12
|
+
if __name__ == "__main__": # pragma: no cover
|
13
|
+
main()
|
4
14
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
15
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/base.py
CHANGED
@@ -1,5 +1,90 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xaf\x0e\x00\x00\x12\t\x04\x009\xb3\x95\x16\xd9\xad\x93QL\x07\xe6\x16\xbbc\x93\xa6\x00\x00\x00\x00\x00\x00\x00\x00\xa6\xb2iG\xaa\xc4b\x02\x96y\t\']H\x17\x1a\x9fy\x8d\x99Q\xb9I\xa3\x12\x1a`\xc4\x9d\xdc\x18`\xaa\xd6\xcf\xee\r0\xd9)\x99w\x05?\xfc*|\x9c\xdb\xd6\xf6\x07E/\x98\x1e\xb2\x01p\x16\x1f\xdbY\xf7\x1b\xa1W5&f\xd3W\xf5\xc4\x82E\xdb\xa85%\x00\xfa/1\xe4u\\ip\x84\x9fe\x7f\xa7\x83G\xf5\x18\xb9\xfa\x8aS\xba\xa5\xf3\xbeU\x04:\x9b\xdd]\x8f\xdf\xe9Z\x03\xb3\xdaR\x9a\xaa\x97\xd6$\xbdRx\xfb\xd9\xcb\xdeL\x95\xa3\xd5M\xb4J?\x02\xe1\xc9\x05by\xb9k+\x0f! 0\x85\xd6^\x0e\x8e\xa8\xf5s}\xf9\x03\xf8\xf7\xaf\x9a\x07j\xa4\xc0\x99:\xf2\\\x8e\xd0\xe7\xd4_\x9c\xe2_\x00@Sd\x18\x17\xb8\x8e\xedyC\x1b\xaa\x87\xd5\x8e\xa56DH\xa3\xc8\x118|\x05\x80\xd9\xddsg\xb8\x04[\xddE\xfahm\xe1P\xdb\x1c\xf5m\xc1X\xc3S\x0cw\xa5\xa4\r\xdb\x02U\xd5\xf5\nK&L\x9f\xb7a,{$h\x864\x96\xf3):\xde\xd5g\xbb\xd05L_D~\x1c\x02\x18\x86P\x8d\xfe\xf6~\x17\'\x18\xdd5\x96\x91n\xdcA\xf4(\x9d\x13\\7*<\xa2\xd9b\xa548\x0e\x92&\xc0:\xbf\x82@\xe4\rD>\xd8\x01\'\xd2\x08\xfb*v&\xe8\x06\xd9\xf2K\x0c\xfd\x037\xb5\xfc\x9a\x87m\x89\xd1;\xb1|}9\xb2W=\x97\xfe\xe2\xbcZ\xca\x1d\xc6d\xd5\xd1 \xf1\xf1w\x85H\x8a&\xc1\xd6\x19\t\xa7\xb1\x1d\xb6\x8d\x96\xfev$\xe2JV;h\x1ekhx\xfd\xbc\xda%\x99W@\xab\xdff\x84 \xf7\xab\xc6\xff\xc5o\xdaS\x83;)\x9f\xee"\xbf1\x85\x16\xf2X\xa9\xad\xde\x89\xf6\xdeB\x81\x06\x0f#\xfc.2\xe1=\xd4d\x03\x9b\x8a\x87\xc1`_\xf4\x9c7\xd3Gn\x86\x82\x8c0\xa4\x19\x83%\xce\xfa\x10H:\xedf&\x1e5\x01\x8d\x1d\x95\xc5\xdc:K\xedm\x02\x0ehJ\xf0\xe1o.b\xda\xd3\xcd\xa0c\xfb\'v\xb2\x1a-j\xef\xd7\\n\xaa\xe3\xcf\xeaB\xac\x8bR\xe6\xc9[\xf9bE\xce)\xd6\x18a_\x12\xd6\xbcz@\x92\x128\x95q\x91;\xa5\xdfm\xf4IcPJ_\x9c\x12G8\xf9\x9b\xa1\xdd\x84z\xe8\r\x87\x17\x1bAQ\xb7\x8d\x13\xc1#s\xde@\xdfx\xffv\xa0\xfa#\xb8\x95\x81Z\x82\xa5\x8d\x94\xd0\xda\x03lmr\xac\xa6f\xba3*y"\x16S\x1b\n4\xc3=\x96\x85\x95\x95~L\xda\xac-u\xa6\xfe\xbc6\x82\xdc\xe9\xa9\xf5\rk\x84\xa5\x00\x06\xb0/\xd5\xdeFS\xf9\xd2a\x06Np2\x9dI<\x8a\xd1\x04\xe0S\x17\xd5\xe2K\x8e\xc5\x9f\'5O\xc1\xd3\x8b\x873\xbd\xa6\x08\xd4\xf3\x18\xcf\xd8{i2\xae\xbd\xf7\x81\xa1-\xbc\x1dD.v\xe1\xf5+%\x8cJ\x83\x8a\xf1\xbe@\x94P\xc9B\xa2M\xc9\xfc\xe6\xd9\x81\xf5}\x87\x07\xcf\x044\x9c\x93\xd3|[>~\xdb\xac\x15#\xab\xcb\xc5u\xfaO\x8e~\xa2>\x05\xed\x139\xbbH\x18!\xb6\x11\xf4\xaa\x15\xb5Bu\x8b\xf6\xa6\xb9`\xf8\xbd\x1a\x8f\x8c/\x8d\xd7\x19\xda\xf9{h\xfb?O=<\xa0\xcd\xbf\xac\x99\x19q,\xbc\xf2\xa8m\xe6\xcc[\x9d\x82\xea\xc0@^Z5\xdf$ns\x02\xf5\xcd\x8e\x97|\xe4#/\xde\xf5\xec_\xaa\x11\x10\xb0\xd1\xafd\xab\x93B\x90T\xf9~\x95;\x9b\xbfv\xa6\x96\xe0\x928S\x0f\x99\xfe\x00e8\x13I}\x18\xd2\xa0.\x81\xcb%\xcf%\x02\xf3\xf3Y\xfbN20\xc2\xb4\xffdq\xda\xd8\x19\xbdR!{\\fXeG\x1es1%d\x15\xe4\x0bXv\xb23_\x11,\xe8\x18~~\xab\xdc\xe8U\t\xb43\x11\\\x8a\xa04\\\xe0\x9d\xf3\xdd\x9d\\\xe915\x966Q\xf1\x03\x8a_\xb5\xb1{\xfdlP\xe0wp9\xe2\x9b\xa1\xe2T\x1f:\xfeo\xd0\xda\xe9\x1a\xa1m\x8f\xf8dmP\xc8\xc6\x95\xc85LT<nra\x0e\x9f8\x89\xf4\xfew;\xd4\xe3^\xb8\x14\x06\x8dD\xef~-}d\x80\xc5L\x0b\xff\x06\xec\x1e~\xf3}\x9b\xff\xf2\x04\xe5 \xf4n\x15\xc2D$\xc3\xf9\xc8\xf7\xd0\xdf\x80Ob\xa4\x89\x02\xc5\xdf\xa8\xa3\x92\xe7>\x92\xbb1\x1c\xeb\xed \x18K\x80v\xd3\x0c\t\x04\x89\x85\xd1\xd8\xbf\xbb\x95\xc89D\xe8\x9fJ\x82\x8b\xb1\x06\x97\r\xc8\xe9P\x84\xbd\x9b\xd2f\xaa\xb10\x17\'-t\xd3\xa63<W\xcc\xc9\x0fi\x08{\xb7\x1ed\x08I3\nY\x85\xb9WR\xb1u.\xb0:\x1d\x1au\x16A\x7f\xd3{\xf8S\xcb1\xde\x13\xa6\x91J\x19\xde/\xf4k\xe55\xcb\xc9N>\x8e\nu\xb0\xa6\xd3\xa7\xd2\x9e\xafT[\x90[\xdcf=\xcaF2z\xdf\xc3\x12\xa1ZxE\x13wt\xb6T\x94b}_6Q\n"\x9b\xa2\xfa\xd32\x97F\xf2\x01\x0e\xfa\xf3\xe6qu\xe4u\x08q\xc2}H\xb8\xe1\x19\xc6\x86\x05\xd4\xa3\x86E\xea\xb9o\x8f\xd7ME\x85i\x1c\xc1\t\x9e\xb6\x10rj\xfc\x94\x83\xdaO\xb0\xfc\xc8\x05[SM\xe6D\xd4\xef\xfe\xdbe\x13B\xfc\x84\xec8y\x9b\xe2\x1b\x99m}U\x8bu\xa7{\xe3\xef\xe7F\xf3\xb4x\xc1k\xec\x96\xcb\xb2\x85}q\xc9\xd9\x9e\xfa\xb1!\xec\x10)\x1aG\x89\x7f\x13_*\xf5\x81p\xa04\x15.\xce>\xa5Q \xa8\\\x9f\xc3<\xc6\xf3!7\xcd\xa9\xb5\t\xb3\x90\xdb\xe6dl\x8b]\x84|\x9a\x1d\x84,R\xed\xbb#\xfc\x9d\xf4\xf2\t\xdd\x0f\x17LU\xf3\xb1\xc7m\xcc\xa9\x87\x16;9\x83y\xb5\x9b\xdb\xb0%\xbcO\xc1\x1aTp\xedm>W\xa8_\xc6\xc2\xd7\xb8G\xfa\xf2\xabOL7\x85q\xe8\xf8j\x86\x93(O\xb0\xb6\xfe\x03I{\xd1\xfc}r\xfc\xaeb\x18/r\xc3Qs\xf7\xd4\xca\x1d\xc7&\x06\xa7\x13\x82w\x96\xf4\xb78\x8f\xe4\xfe\x15T\xac\x0c\xf8NS\x9fP\xb3\xc49\x02\x80\xc8\xba\x06\xc1\x19\xd2\xb9g\x9c\xff\xbb\x80\'\xb5-\xd3/\xcf\xd7d\xe5\xd7\'\x1c\xc4\xec\xe7\xf6\xbd\x16\x19\xf5\x10mL\x99Y\xa5\xa3m\xc4\xf1\xb1\xc2\xfb\x18\x9c\xa0\x0eue\xc3\x01;\xef%$g\xcf/W\x1b\x18\xab7\x08Y\x00\xe4\xfa\xe4\x01S\xba\xc2\xd0o\xae\xe56\xd7\xdd\xe8g\xac\x04\x88\xf7=\xc6:\xaa\r+\xf5H!A\x11X\xcb\xcb\xbcnb\x7f\x8f\xc4\x10E\xa0\x19\xbb@\xa3\x17\xba\x13)\x15\xed\xac\xce\xa6\x9a<9\x98\x81L{\xd2\x92\xb3\x92\x84\x87.X<\xbb\xd9h\x0c\xa2\xc1\x8ct\xa2\xd6\x95}Mh\xc5\xa7G\xb00\x1d\xad\xd0;-\xe389[\x83s\xa29S-\xe3\x1ei\xf4\xef\x0b\xf7\xe0\xf1\x17\x14f\x91\xf5\x11Iq\xbfH\xc1>\x18Q\xd0\xef\xab\xe8>\x94gHr\x86\xec\xbc\xb13\x08\x01c\xe8\x18\xaa\xfd\xd5/\xfc\x1d\x84\xe36\xf2\xff\xe4\x16\xd1\x8f\xdd\x97\xb7x\xc3^C\xdfG\x9eW\x85\xaf\xec\x82j:\x19s\xd5\xa9\xc1,z\x05ZFv\x80oo\xa0\x84\xf2\xf4y\xdb\xa7O%\x7f<i\x8f\xb3G\xf4\xb4\xdd.\xe0t!i\xe3\xdd\xea\x0f]\xb5\xbdX\xbdQ\xa9\x11\xc2\x10f\xc0\xd9\xf0\xc3uaG\x7f]VW\xec8G@\xf1\xb4z\xadE\xa7\xd7\xec\x9b&\x8a\xafLl\xe8_\x04g>j\xf2\x82\x1eq\xcd\x82\xbd_\xa3\xbc\xa9s\x01\xcb\xf815A\xe9QW\xc1;\x9c{$\x82\x8b\xae\xf2E\xfa*\xab\x08\x91\xa6\xf8\x06}\xe6\x1bt\xfa|\xf6\x907:\xd3\x90\\\xab\x08\xe3\x96`Z\xe7\x845\xcf8\x197D\x92\xd1.\xac\rg\x15/\xbf\n+\x8b]\x1f\xd2\x08[\x8516Iw\x17\xe9\xfd\xcf\x1c"\x16\xae\xbf\xac\xd3\x03\x01\t\x05\xba\xc3\x9cU5\x8b@\x84:\x17GZ\xf4\x01\xc3j\x91!\xf6\x0c.{\x17\xcb\xa7I\x0b\x044\xff\x82\xd3O_F\xfba4\x1b\x9b)@q\x06I\xc8\xf6aW\xa4B}_\xd7\x92]U\xee\x8f\xa5\xde\x89\x8f_).\x83\xa79\xe7\xf9y3P\xc3\x02g\xa9W\n\x06a\xc5#X\\(\xc6q\x89\xcd\xc4s\r\xeaA\xc6fM\r\xe6\x1f\xa3t\xc7\x96=\xe6)\xf0\x08\xa4\xc6\x1c\xea\xa50w\xfc\x07\xfc\xc4\xb8\x8dt^\xbe\x1d\xf7\xaf\x05\x9d\xc0$\xe1\xe2\x03\xdarM\x94\x8c\x98\xe7\xe0\xbd\xfd=\xac\t\x9d|\xb9C*\xb6zj\xf0\xcau\xd6k\x01\xd5\x17 \xab\xcd]L>\\bU\xf3\xe5(\n\x7fL\xf2\xae\xee\x88\xa2b\xc3W\xdc8\x97w7\x17t[\xda\xc4\x9d\x88&d\xba\x99!q\xe4M?\xadV;\xc2_VT\x1b\xa5\'\x127-\xac\xa5\xb7yFN\x01\xa6\xe3i\xdc\x85\x04\xdf\x81\xb5\x13\xf0z\xc9\x82\xdb\xc1*?Rt\xcdhQb\xab\r>\xd0B\xa9\x907O\xe0\xa2g\xd4\xb4*!\x9d}\xc4aq@\xa2\x99\x1b\xbc\xdd\xcegf;jM\xde\x1fz\x8f \x82\x08{$\xc9F\x17\x17/\x03SRPgko\xef%\xa1>\xeb}\xd4vn\xc3\xd8\xa9\x19\xc2\xf2\x0f`\x10\x94\x8a\xd1\xd4\xb6@B\xe9\x9d\xe7\xcaDuZ\xc9\xa1\xaa\xd3\xdb\xd7d \xa2\xd5\xf7*\x1b\x0c\xeb\xce\xe4\x90I\x1c\xb5\x16&\xdag\xac\x90\xe3JZ\xc94\xd0\x91\xb0\\3\xbb5|\x9a\xaeoh\xdb\x91\xb5\x9f\xf2\xcd\x02\x1e\xb1\xbb\xc6W^\xb6\x96\xf9@$\x9d \x91\xacV`\x85\x90\x94u\x14\x1b\x7f\x8aI}\x913\xa1\x03\x0b\xce8\xd5\xa9S\xd3\xb9/!E`\x8b\xa4\xa5\x91\'\x9f\xce\x16c\x06\x033\x1d\'\xdeE\xa0R\xd0F\xfe`j\n\xbd\x88\xc4K\x85Q\xc1\x86\xa4\x03j\xb0\x1ct\x81\x89I#Z\x0e\xf0\xb6\xad\re\xfb\xeaEW)d<\x11\xf5\xd4\xce\xc1\x14h\xe07\xef\xab\x9e\x93\xe1D\x81B\x97\x05\x9b.E \x84\xd4\x88W\x7f\r\xe5\xbfQ\n\xd3\xedk\x0e\xcc\xc8\xe2\x97\x84\x1fu\xac\xfc\xeb\xb8\xdc\x0f\x18\x00c(\xfc\x02\x9e\xf7\xe9\xd34\x88f$7\xf4\xc9Dz\xb7\x0f\xf8\xa0\xc4\xf6\xcc\xff\x18\x04viJ&\x1b\xba>\xe2\x16p\xfb\xa6\xbf\xdb\xa2\xbe\x96?\xb8\x8b\x13-\x03\xc5\x12\x05\xae\xdd\xf3~Y\xd3bw\xe8X\xfcy,0B\x86\xd3\x80\x9eD0\x07\xc3k\xf6\xbc+v3\x9f\xa9\x9de\x0b\x1b\x9e$6\xbbbaL/H_\xa9\xee\xd5\xb9VM<!M\xd7\x11\x0b+#\xe2K\xca\x97\xf4y\xbc(u\xebo9\x7f\xf9\xff\xc2\x93W\xcal\xb0\x9a\xaaS\x1a\xd1\x12u\xf5|DV\xc2\x83\xebX\xbd\xc7W\xcb\xfb\xcc\x1eu\x94\x8e\xcb\xb6\xad\xbe>\xce\xe3$\xed\x85\x90\x08\x97\xb8\x85\xc5\xa68\xdc\x0f\xc0\xb4\xf1\xb8\x81\xdd\x08\xfcRJ\xf4!6\xdb\xf8)\xac\xb5S\xe9\x1eP]\xd7V(\xa1\xebO\xf1\xde\tf\xe5H.\xd1IvZ\xc1\x98 \xe5\xf7\x10\xbd\xba\xb1.\xff@H\x03a\xaf\xb1\xdf5=\xc8\x15Y\x99D\xc0\x05\xdd\xed\xff\xe8\xb6^\x19\x84`>\x06#;\xe6\x1e\x0b\x0f\xfa\x18\x85\xe3\x0b\x81\xb6Y\xfa\x154\xfd=\xbd)x\xe3,^\xd6(Rr"\xea\x0f\x0f\xda\xe5\xd4A6;\xa6\xcb \xd5@h\xd9\x08\xe8\x1b\x16\xb7 [b\xd9Sb*R\x83\xc0\x1as\xad\xa7esd\x9f\xa5\x8c]x3j\x99\x84\x8a\xa3\xea\x029f\xb4e\x8a\x82,<\xd4\x93En\t\x0b\xdb-\xe9H\xe2l;6\xb5\x91D\x9cb&S\xcc\x8d\xe1\x8b\xbe\x18Bg\x15@S\x1c\x9d\x94\xcfj\xbep\x12\xae\xf4X/\x18\x18j\x95\xd59d\xb4x\xb7V\xa3\x0e\\\xa9\xfc\x8c\x86Y\x81\xaa\xec\x11\x9c\xe2\xdezF\xdf\x1a6\x9dW\xda\xc20\xb2\xd3)\x04\x05\xe5\x86\xde\xf4\x84\x98\x83;\xd0\xd6f*\xdaXCG\x9ez\xaf\xfa\xe2\x14\xa5\xfa\xb4:\x9d\x9bV5U\xf3\x82\x83\x81#\xc4\xbfc6\xa8\x94\xe2\xf5\x16\xcc\x1c\xa6\x00\x02_&\x06\xaf\x03\x986\x10\xac\xa2J\xbcx$\xca \xf3Q\xc1;\x983\xa0\xef\xdd\xf9\xf49f\x8b \xdbBc8\xc7\x05G\xc1O\xd5\xef=\x8f\x89dH\xab[\x1e@\x8a}\xad,4\x9aP\xaf\xc0\xfd\xe3\xd9\xc3\xcd\x14Mt\xdf.\x9b\x86=\x14\xe5).\xa1@\xb4\x08v8g{\x0bV\x02\xfa\xab\x12bt\x8c*\x1e\xb1\xdb\xbd\x8aM\xcfm6*\xd6\xa3\xb7zzS\x12\x8aF\xae\x94\x08\xe9\x14q\xb7\xc6\xbd7fW\xa7#+\xd0p\x9f\x9d-\xc2L\xca\x86\x9c\x99\x18h\xecQ\xcaf\x82\x97\xd9\xae\xd7z\xa1G_\\?h\xfe\xff\xf0k\xac\xad[\xc0\xa0\x85\x9a\x00\xdc%xj\xf9^\xd0)M\xd9\xd1\xb8\x99\x9b\x18$g\x83*f<\xab\x9e\xbc#$\xf7=\x06\xa7\xf1D\x91\x15\xa8A\xd9/\xcb\x80e\xe2\x86\xb9pL\x19\x9b\xa4\xe8\xe7Q\x0f.\xe4\xf3\x05\rI\x8b\xc8@\x06Koj\t\x9e\x18\x8ff\x0b\x93_Y\x16\xc3\xea{\xb1\xc2\xee9\xed\x1cr\x17\x05\x18\xc95\x07\x04\x85\x83\xb5\xebt\xda\x9a\x7f\xcf\xdf\xc2\xcd\x9c\x86\xdel\xb37\xa4`\xa6\xcf\xd3\xf8qf\xb3\xd4\x03A\xa1\xe7r\xcf\xbci\x85?C\xce\xc6\x14uN\xe8\xc3\x18\x87\xe8\xc1\x08\xd59\xf7\x9f\x0eJ\xc3\x81R{"tU\xa8\xda\x9dO\xa2P\x9bK\xbf3\xc7\x9e\xed\xc4x\x01\xdd\xf7\x93\\\xbd\xa8\x0b\xd0\x9a\x12\x97\x14\x8e\x9f\xc5P\xacM\x8e\x1c\xed\x84pN\x93-\xbbr\x89=\xda?\xe26\xc2\x95T\x8d\xba2B\xfaw\x08L\x91\x11\x0fu\xaf\xdd\x89T\x95\x06\xba\xdd\n/r\x94\xe1\x93\x0f\x1cm2\xd7C_\xb4\x84\r\x8a\x1ad\xed\x9a\x18\xd0q:\x0c\xd3#\x15f\xe5\x87naS\x182^\xec\xaa9Q\x9e\xe8S\xabc\t\x95\xe7\xeb\xb8\xcd\xdd\x02<\xaa78\xbe\x01\xf4\xdcv \xc5\xa2V\xb3\x8d~\xf5]J\x90=\xee>W\xe5N3\x002\x19\xbf^\x18>\x83\x9e\xb7\xb1\x92\nm,\r\xd8\xc8\xcdb\x01\xa0\xe2\xc3,.\x7f\x99\x81\xf5\xd1h\x1eV\x0c\xbb\xa21\xfe\xc9\xcaJuS\xf5\xdd\xd2\xeb&\x8c\x86\x1a\x86;\xd6`"\\Y\xda\xb8#\x9ci\xbd\xa9\xc1\x0b\x9a\xe0\x04\x83\x91\x1f\x1eiA\xdc\xe3\xf0\xc1\xec\x9eN\x02\xdc\xeeZ\xb3r\x97\xf3w|R\xba\x0f\xaf\xd9\x16\xf5\xdc\xe1\xaea\xa8\xb9|\xe54X\xc0\xab"A\x90\x88\xc3%b7\x06FeP\xe5\xecHv\x1c\xec~fg\x17\xbc\xdb\x8dB+yC\xca\xb1\xfa\xf2\x95\xdf;\xa7f\xc4\xfa\xa7\xc7\xed.\xa1$WDxmb\xb3\xc4\x0f\xbf\x1f\xc2\x9d\xce\xbct_\x95\x93S\xda\xb5d\xeb:a\xe4\x81\x85\n\xe34\r\x1aNa\xda\xc6\x07\x80p\xb0\x1a\xea\xf4Bt6f\xa8\x8d&8I1T\xf6\x82(A\\}D\xf0Na<\xfcfHb\xc0\xea5\xaf\xdd\x00\xa2\xa9\xf7\xa3\x8eo\x96\xd6\x1e\x1d\xc5\x86\xee\xecO;\xac{\xfcN\x9f\xb5\xaa\xe3\x8b\x8e\x18\xea\xc8\x80\x94\x9f\x8a\xb8\x85iX]3\x1c\xfa\x9c\x1f"w\x03W\x13\xbdP\x9b\xac\n\xf7\xdc\x1c\x9e0:\xe4\xc0\x8e\x8cP\xdf\x0b\xe5\x9d\xed>!\xfb\x9e\x06\xc6\x01\xca\xb0\x03\x8b\xaf\xf7\n\x16\xe5\xfb\x99t\xdb\xfc\xe9\x89\xc3cA\xec_\xe3\xc5\xba\x05\xbf\xc5\xe0\xf2\x06\xa3m\x10Z\xa4\x17\x14\x06kqoE\x06\x83\xd9\x1cZ=\'\xfb')
|
1
|
+
import flask_bootstrap
|
2
|
+
import hiddifypanel
|
3
|
+
from dynaconf import FlaskDynaconf
|
4
|
+
from flask import Flask, request, g
|
5
|
+
from flask_babelex import Babel
|
6
|
+
from hiddifypanel.panel.init_db import init_db
|
7
|
+
import hiddifypanel
|
8
|
+
from hiddifypanel.models import *
|
9
|
+
from dotenv import dotenv_values
|
10
|
+
def create_app(cli=False,**config):
|
11
|
+
app = Flask(__name__, static_url_path="/<proxy_path>/static/", instance_relative_config=True)
|
12
|
+
import os
|
13
|
+
# os.environ['DOTENV_PATH']="/opt/vscode/workspace/HiddifyPanel/"
|
14
|
+
# FlaskDynaconf(app,load_dotenv=False)
|
15
|
+
for c,v in dotenv_values('app.cfg').items():
|
16
|
+
if v.isdecimal():
|
17
|
+
v= int(v)
|
18
|
+
else:
|
19
|
+
v=True if v.lower()=="true" else (False if v.lower()=="false" else v)
|
20
|
+
|
21
|
+
|
22
|
+
app.config[c]=v
|
23
|
+
|
24
|
+
|
25
|
+
app.jinja_env.line_statement_prefix = '%'
|
26
|
+
app.is_cli=cli
|
27
|
+
flask_bootstrap.Bootstrap4(app)
|
28
|
+
hiddifypanel.panel.database.init_app(app)
|
29
|
+
with app.app_context():
|
30
|
+
init_db()
|
31
|
+
|
32
|
+
|
33
|
+
hiddifypanel.panel.common.init_app(app)
|
34
|
+
hiddifypanel.panel.admin.init_app(app)
|
35
|
+
hiddifypanel.panel.user.init_app(app)
|
36
|
+
hiddifypanel.panel.cli.init_app(app)
|
37
|
+
hiddifypanel.panel.commercial.init_app(app)
|
38
|
+
|
39
|
+
app.config.update(config) # Override with passed config
|
40
|
+
app.config['WTF_CSRF_CHECK_DEFAULT'] = False
|
41
|
+
|
42
|
+
babel = Babel(app)
|
43
|
+
|
44
|
+
@babel.localeselector
|
45
|
+
def get_locale():
|
46
|
+
# Put your logic here. Application can store locale in
|
47
|
+
# user profile, cookie, session, etc.
|
48
|
+
from hiddifypanel.models import ConfigEnum, hconfig
|
49
|
+
if "admin" in request.base_url:
|
50
|
+
g.locale = hconfig(ConfigEnum.admin_lang) or hconfig(ConfigEnum.lang) or 'fa'
|
51
|
+
else:
|
52
|
+
g.locale = hconfig(ConfigEnum.lang) or "fa"
|
53
|
+
return g.locale
|
54
|
+
|
55
|
+
from flask_wtf.csrf import CSRFProtect
|
56
|
+
|
57
|
+
csrf = CSRFProtect(app)
|
58
|
+
|
59
|
+
@app.before_request
|
60
|
+
def check_csrf():
|
61
|
+
if "/admin/user/" in request.base_url: return
|
62
|
+
if "/admin/domain/" in request.base_url: return
|
63
|
+
if "/admin/actions/" in request.base_url: return
|
64
|
+
if "/api/v1/" in request.base_url: return
|
65
|
+
csrf.protect()
|
66
|
+
|
67
|
+
app.jinja_env.globals['get_locale'] = get_locale
|
68
|
+
app.jinja_env.globals['version'] = hiddifypanel.__version__
|
69
|
+
|
70
|
+
return app
|
71
|
+
|
72
|
+
|
73
|
+
def create_app_wsgi():
|
74
|
+
# workaround for Flask issue
|
75
|
+
# that doesn't allow **config
|
76
|
+
# to be passed to create_app
|
77
|
+
# https://github.com/pallets/flask/issues/4170
|
78
|
+
app = create_app()
|
79
|
+
return app
|
80
|
+
|
81
|
+
|
82
|
+
def create_cli_app():
|
83
|
+
# workaround for Flask issue
|
84
|
+
# that doesn't allow **config
|
85
|
+
# to be passed to create_app
|
86
|
+
# https://github.com/pallets/flask/issues/4170
|
87
|
+
app = create_app(cli=True)
|
88
|
+
return app
|
4
89
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
90
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/base2.py
CHANGED
@@ -1,5 +1,42 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
|
2
|
+
import os
|
3
|
+
import json
|
4
|
+
import sys
|
5
|
+
from datetime import datetime
|
6
|
+
from flask import request
|
7
|
+
from hiddifypanel.panel import hiddify,hiddify_api
|
8
|
+
from hiddifypanel.models import *
|
9
|
+
def init_app(app):
|
10
|
+
if hconfig(ConfigEnum.parent_panel):
|
11
|
+
hiddify_api.sync_child_to_parent()
|
12
|
+
@app.before_request
|
13
|
+
def test():
|
14
|
+
print(request.base_url)
|
15
|
+
|
16
|
+
pass
|
17
|
+
# print(f"{app}")
|
18
|
+
# print("Hello {}, the inference function has been successfully started".format(name))
|
19
|
+
# attribute = str(datetime.now().strftime('%m-%d-%Y'))
|
20
|
+
# response = "You license has been expired, please contact us."
|
21
|
+
# year_to_expire = int(2022)
|
22
|
+
|
23
|
+
# try:
|
24
|
+
# assert int(attribute.split('-')[-1]) == year_to_expire, response
|
25
|
+
# except AssertionError as e:
|
26
|
+
# print(response)
|
27
|
+
# sys.exit()
|
28
|
+
|
29
|
+
# # Replace your main code to operate here.
|
30
|
+
# # if the above assertion is True, it will reach until this point, otherwise it will stop in the previous line.
|
31
|
+
|
32
|
+
# if tag:
|
33
|
+
# print("inference function has been completed successfully")
|
34
|
+
# return True
|
35
|
+
# else:
|
36
|
+
# return False
|
37
|
+
|
38
|
+
|
39
|
+
# if __name__ == "__main__":
|
40
|
+
# _ = inference(name="Bala")
|
4
41
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
42
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/models/__init__.py
CHANGED
@@ -1,5 +1,12 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
from .config_enum import ConfigCategory,ConfigEnum
|
2
|
+
from .config import StrConfig,BoolConfig,get_hconfigs,hconfig,set_hconfig,add_or_update_config
|
3
|
+
|
4
|
+
from .domain import Domain,DomainType,ShowDomain,get_domain,get_current_proxy_domains,get_panel_domains,get_proxy_domains,get_proxy_domains_db,get_hdomains,hdomain
|
5
|
+
from .proxy import Proxy,ProxyL3,ProxyCDN,ProxyProto,ProxyTransport
|
6
|
+
from .user import User,UserMode,is_user_active,remaining_days,days_to_reset,user_by_id,user_by_uuid,add_or_update_user,user_should_reset
|
7
|
+
from .child import Child
|
8
|
+
from .usage import DailyUsage,get_daily_usage_stats
|
9
|
+
|
10
|
+
|
4
11
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
12
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/models/child.py
CHANGED
@@ -1,5 +1,27 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
4
|
-
|
1
|
+
from sqlalchemy_serializer import SerializerMixin
|
2
|
+
from flask import Flask
|
3
|
+
from flask_sqlalchemy import SQLAlchemy
|
4
|
+
from flask_admin import Admin
|
5
|
+
from flask_admin.contrib.sqla import ModelView
|
6
|
+
from wtforms import SelectMultipleField
|
7
|
+
|
8
|
+
from sqlalchemy.orm import backref
|
9
|
+
|
10
|
+
from flask import Markup
|
11
|
+
from dateutil import relativedelta
|
12
|
+
from hiddifypanel.panel.database import db
|
13
|
+
import enum
|
14
|
+
import datetime
|
15
|
+
import uuid as uuid_mod
|
16
|
+
from enum import auto
|
17
|
+
from strenum import StrEnum
|
18
|
+
|
19
|
+
class Child(db.Model, SerializerMixin):
|
20
|
+
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
21
|
+
# ip = db.Column(db.String(200), nullable=False, unique=True)
|
22
|
+
unique_id=db.Column(db.String(200), nullable=False, unique=True)
|
23
|
+
domains = db.relationship('Domain', cascade="all,delete",backref='child')
|
24
|
+
proxies = db.relationship('Proxy', cascade="all,delete",backref='child')
|
25
|
+
boolconfigs = db.relationship('BoolConfig', cascade="all,delete",backref='child')
|
26
|
+
strconfigs = db.relationship('StrConfig', cascade="all,delete",backref='child')#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
27
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/models/config.py
CHANGED
@@ -1,5 +1,106 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x86\x12\x00\x00\x12\t\x04\x00\xecR0\xf4\xdc\x8f|\x91\x08)q"\x98.\xa9\xf6\x00\x00\x00\x00\x00\x00\x00\x00\n\xb3\xb5\x84\xda\xe9\xe8\x18\xb4\xed\x9a\xb2\xafu\xd3\x9fL\xff\xa7\xb2\xf5\xb389@2\xc3TR\xec\xeb\xaa\xa6E\xb6\x84\xfd[mE= \t\xefx\xbe\x7f\xd4\xc2a%\xf4q\xcbG\xcc\xa9\x0c\xe4s5\x15\xab/9M\x06\x05&~d\xf0\xde\xe3\x89\xa9:\x90\xc6\xc4\x85\xe5\xf4y\x7f\xae\ng\xd5T<\xb0lG8\xda\xa0s$q\xe0\\\xb8Y18\xd7\xa8\xdcb\x98\x91\xfb\xe9\xdc\x83\xd8\xce\x98\xea\xdf?\xaf\xa8\xce\xe9M\xf6\xae\xde\xa0K\xfe\'\xa1\x88F\x87F\x17l\x17+\xdc\x82\xa4\xb1\xe6*=N\xab\x17\xe9\xf7\xa8\xcf{\x1e|\xa4\xe8Z\xbfe\xa1\x96[/r\x00\x1a,Y\x18~\x96\xbc\x89\xc2\x05\xce\xcc\xb4\x81\xcc\xcd\x95A\xa5Y\x83?\x02\x08=\xc3\x9c\x13\x11)%\xcfp\xbe\xdfX,\xea\xc6\x96|\x16K\x7f\xd2]l"\x9f\x06\xfe\xc9\xdcC\x7f\x1e\xffQ\x88\xf5\x91\xca8\x0fl\xe2\xff\xa3\xa5)\t\x10cMs,!`\x07}\xb4cV\tg@b\xb7\x167\x1a\xf2z5\xa0\xd2H\xc2m~\xc5c\xa3>\xec\xa5H\x9c7\xf7,5\xc2\xdeL\xb5\xa2\\\x94\xa9u\x00s\'\x04\\\x9c\x1c\x95\xbe\x0c \x90]\xb9WW\xe1}\x14\xeaX\xe3*5`\xc8Jw\x1b\xb8\x8d\xef>\x85p\xa8\xd0\xa3=\x1b11\xb4g\x88\xd4Q$2W\xbd$\x82&\xf6\xaa9\xffx\xf17,\xd9cU\xa8f\x0c\xda\xad<\x7f\x07\xbc\xb4j\x9eP\xec\xbf\xa5\xba\xeeh\xd9w\xc5`\x1b\x95\xd9\xb3{\xb9\xa4\xd8\x01\x17\x95V\x90TR +\x8f\xb0\xa1.\x0eD\x84\x05rC\xdc>\x95\xf3\\\xac\x11g\xaf\x0e\xe2e\x7f\xe2i1\x0c\xfc$+\xc2\xbd\x8aiwLp\xe0e}\xc1\xc8\x90\xdd\x88\xcc\x12i\x90u\xd7\x99\xb2\xa1\x8aF\\\x06\x17kB\xc5\x19\xde\x84\xaa\xa4\xea\xb3g\x8b7\xa9\xf9\xb3y\xb4\x97\xae\x8b\xf6\xee\x8d@[r:\xd59"\x08Z8O\xe2v?j\x12\xdex\xda\xa6\xbd\xc7L\x02\x81\x89\xf6\x02Dsi\xd5\xb5\xd5a\xfb\x19kp\xf0\x82\xa38\xe9Cg!e\x01\x06\x8fb\xdf\x15\x0c\xbe\xc1lB`\xb9T\xae\xe14x\xbb\xdbR\xb1K\x9a\xedr\xb4\xe9t6z\tW\x1fT+\x07\x13A\x1d\x90/f\x96\xc7\x9f\xfd\xb5\xb2\xdf\x89Q\xed\x1a\x18\x04\xab\xa4\xc2\xaf\t\x04\x9b\t\xea\xbd\xfaM\x10\xb9\xeb\xf6\x1e\x9c#Q\xae8\xce\xa1H\xff\xce\xe5?\xc8\xcd\x06qs*\xdc:0[& $\x13\xfe\xe6\x9e\xddg\xf2\x93.\xdb\x0e\x8c\x1d\xf3jZ\x8e\xda*\\6\xe7*\x86\xd8C&L\xe5;\x80Kjrd\x85!T\xc4I\xd6yN\xbdm7#\xe1\x19\xb44\xaf\xc1\xc1\x95\xe6\xd3\x15\xfd\x8av)^\x84Kn&J1\xda\xe7{\xd9cq\x951eZ(\x05\xd3i\xaay\xaf*u\x18\xa1\xb3\xed\x11/m[\xe9\x8d\\#\'\x9didm0>\xcd\x0f\xae\x19\xacb\x87P\xf9\xc7\'\xf4\xeb\x00\x8e%\xe6\x92]c~\xffD\x11\xe4\xd6\xe2\xe0L\xb2u\xc2\xe3\x1b\xe7\xcbR\x8d\xe9\xb6X\x16\x00@7\x9b\xdb\x98\xdc\x0c\xeb\xb2r\xb0\x80\x98\x1eP4\xb7r&\xe3\x03J\xd0]\x94\xfd\x98\x1dk\xd4\xe9#\xa6\x8a\xd1t\xa1Nw\x1a\xa7 \xbdr\x8f\x01\x08\xb8\xac\x80\xf3mk\xb5\xa5#&H>+W^\x7f\x1bf^\xb3\x8d\xbe\x18Xl\x8d\x19y`%{\xe1=p\x0e\xbf\xbd<b\x86\x07\xdc\x8dq\xf0\xda\x9e\xdap~F\xa2f\x96\xf1=JF\x97\x8a\xd6\xb1\x97\xa5\xd7u\xb7\xb0\xbd\xe5\x10d\x14\xddZ\x04\x03\xe1\xa2\xa4\xb2\x07\xc0\xf4\xc3\x1e\xc0POp\xb3\x0f\xd58)\xed\xa7%*\x8e\xea\x04\x05\xeeI\xb9\x97\xd8\xd2K\xc1\xe7\x86\xdcXqN\xbe\xcf\xdf\x92\xea\xcd\xfd\xa1<\xc1\xf2\xe7\xdcW\xe1%\xcf\xad\xfa\xb0c(\xfeX3\xca\xf2\xb6kd\xa7}\xe7\x92\xb8\xde\x9d\xbaM-\xd5m\x8dSE\xe3"C\x83\xd7>\xf3\xca\xab\x7f\x0e_:\xb2\x96\x037t\x0cH\xea\xbcJ\xf5P#DC\xf2Pi\xb4\xfc\xd1\x7f\x08\x9f\xcd\xd8F\x87<\xdf\xde-\t\x81k\xcfoH\x0cY\xf6A\xcb\xff\x01N\xd1]$"\xcf\x7f\x01\xd7J\xd5\xca\xd6Y\xc9?\xdf\xe5\xf9\xf0\x87\x83\x04\xc4\xf3A\xd1m\x04\xf8\x11\xcd\xf76m\xe2\xddim\xbd\xfa\x99!2\x0b\x19K\x98\xf9E\xb4\xa0\xf7\x0b({B\x08\x99\xd2\xce$\xa6\xd4\x12\xf8\x8as\x05\x99\xdb\x88\xaa\x1d\x02K5\xad\xefQR?\x15\xe3\xde\x1a\xf1g7\xdaDf\xd8\x95~C\x82q\xd1N\xc2FM\x82\xaai\xdf\x1a\xa3?m\x9e\xbdL\x9b\x8e\xafO\xfdz\x18v\xce\x07\xfd\x93@\'\x04\x9f \x82\x04g5R\xd5H.\x06\xcbp\x03\xc6\x8c\x8e\x1e\xab\xe6\xffqBL\xa7\xb6\xed;\xee\xa5\x00\xea\xd9L\x84Lk\xf8\x00M\xcdF\xb5ZV\xc3Q\x0c\x81\xec`PA\x9b\xed\xdf^\xb7_\xe5\xe5\xf2\xe3\x86\x08$\xab\xed\x1d\xdb\xe5p\x80\xbf\rT\xaa\x1c~R\x9e\xb1#\xb6\xa1r\xa1\xb5`\xdc,d\xf5\x07\x92`\xa3`\xfeQ\x165v\x83\xe9;g\xd5\xefF\x02\xe8\x83\x14\xfa\x9b0\xd8\xfe\x0f\xcc\xff\xf2\xb0\xd3\xfa]\x99\xbaA\xde\x7f\xff\xbawT\xb2\xbc\x95X\x1ed\xd6\xb8\xa9\xf9p\xa7\xf3\xb6m\x15Y?l\xf3r\xb4\x10Br\xdb\x1c\x9c\x9c\xc9\xa0F\x8d\xb2\xca\x8e\xed\x99\xcb\xd7iP\xe0n\x140BT*j\xc6b\t\x04\xf2\xd9\x9a\x9b\x88X\x96(\xe0\r\xdc+\x8e\xc08\xe4C\xe1\xf8\x9d\x93\xd9\x1d\xa4\xb9\xb8\xa2*\xad\x0b\x0c\xf1\xb2\xd4"h$j\x07\x89\x0e\xda\xf5\x98\x10_\'D\xdb\xdb\xea\x91\x0b\x0f\xab}!\xe1u\xd1#e\xfe\xe1\x05Z\xa5\xf0\xb1\xda\xad@\xe0^\xdd\x1c8\x96\xe5\t\xb4O\xedW\x85M\xeb\t\xf2(w\x85o\x8f\x12\xb8\xd2n\xdah\xe9l"\xe5A\xe2\xabf\x14\xac\xf5ND\x82<\x86\xf6xm]\xe1c\xb2>\xca\x10\x83\x9d\xb8\xe7C9\xb4\x80u\xbd\xd6\xdeC\xa0OT\x87\x8b\xc0g\x9e[\x83_\x95\xee.\xe5\xb9\x80\x11\\\xc0\xea\x07\xc0\x0e\xb0\'\x17\xbc\x07v$\xdc\xad\x85w\x0b\xf4\xaf\x96nD\x19\xae\x0e\x91yTT\x93\x93\xcb\xf6m\x12$AS\xa1\xbb\xe7Cl}\x1f\tW[\x19\xe3Z\xe3H\xd7)KY\x18\x85n\xc7(;\xec\xe0xMLl}\xa6`c\xb3\xf9\xaa;\x02\xdf\xce\xf1\x91\xe6\xa2\xcd\x05\x07\x8a\xef\xa0l\xc1,]\x0b\xf5\xfc\xaa\xc7\xbe\xba\x1e\x8b\x8f7\xe0\x85\xf2\x88#L\xce\x1d\x9b%\xdf1\xdf\x86\x8b\n\xe5\xb2\x1e<\x8d:\x9a\x1cA\x84m\xe8w\xacZU\xcc&\xae\xcb\xbc\x92dU\x98\xc5I\x1e\xc0\x84\x94\x89\xdeho\xd4\xf3\xdc\x08\xe0=\xec\x82\xb1\xd9a_\xae\xd4\xaf\xe7\xd7LGbG;\x99\xba\x1c\xbf\xbfb\xcc@\x85\xf3\xd8\xa1\xe0!1\x8b\xcd5^m\xde\x19\xc8\xb9\xca\xc0/\xae\xf7W&ODV\xd2e\xf9u\xa0\xc7\n\xbb\x04"N\x8f\x92\xcfU\x91\xc3\xdc\xf3\x8b\xc0=\x87\x7fU\x91\x9a\xfb{\x89\xe1\xcd\xcf\x00\xd9\xfd\xfd\x1e`\xd7g\xe1\xe2<\x0b&2/\xd3\x03\x12\xd5X3\x89d\xbf\xda\xfcq\x9e\x9bP\x8b,f\xaf\xa9\xd1Us!U\x0f\t\x9bO)\xfd\x82\xda1\x89E\xe5\x83\xd1\xc6\x8f\x8f\xa7\xaa\xf3\xa2D\x90;\xe8.\xdd+\x05\xd7\xb3\x05\xc3\xb0\xf0^\xfd\x0c\xe4n!9i9\xe5\x19\xd3\xb1\xbb~\xef\xa5<t\x89\xcc7\xdb\x8c\x97\xa0\x9a\xe5\xfex\xe7\xee_\xad\xa2\xa4\x836\xe2\xc4\xc1\x13a\xc5\xa7\xd8C\x9e\xaeQ!\xec\x0f\xfa9\xbc\xcf\xd2\xb7\xa6l\x1d\xe8Y\x9aka\x99U\xf9s\x8b\x81\xda\xb9\xaa\x9d\xdce\x0b\xd6\x91\xb2UG\xe9&:\xf3U\x9au\xd5|Z\x85\xcf\xc1\xaa\x94\x01\xd1w\x1c\x02 \xfe\xca\n\xc3\x13=\xbc\xfe\xd6Y\x88\x1a\xfd\xa6\xdd\xa6\x05Q\xb6\r\xe0\xc2\xc4P>)Ce$\xa7\xde\xc1r-\x10Qk\xa3M\xf8m\x8c\xf7Iz,\xcf>\x0e}\xb6d\xc8\xc4\xfc\x88w\xfa\xe0\xb6\xc4\r\xd4\xa06\x93\xfe"\xfb\xbb\x08\x90{3\xfe\x1c\x83\xd1\x8d\xab\xd7x+\x18\xab\xfeB\xe1\x0c\xe6MI\xaf\xbav\x99\x96\xf3\xa6\xa7-\xc2]\xec\xd4\xf9[\xe8\xa3\x02-6\x8c\x0b\x14\xcd\xe3\xce[\x9f:\xc9\xfa\xf7\x13\x87\x176\x1aj\xa7\xb3\x9f\x14\xf1p\xac\x16\x95\xa7\x9f\x01\xe3:Q\x12\xcc\xb0\x8f\xcc\x84\xca\x1f\x0b\xbb\xffc\xb5\xbd\xb4\xe1\xc3.\xa7C\x0b\xf9\x01\xae\xbe&`\x103m\x13\x1b\xe1\x1a\x83\xc9\x0e\xa7\xb3X\xf8\x13n\xb3\xee/A+]\x99"&\xee\xfd,\xfa\r!\xef\xf2<\xcbJ\xe5\x12\xbd\x8a\xdfL\xa8\xc2\x8fL\x189\xf4\xd4]\xb9%\x87\xe5w\xa7p\x1fm\xb4\x9b\xa7R\xe7->\xeb#\xdc\xe6\x978\x89m\xc0&\x106\xe9{\xa0fh\xffl4\x99\xfai^}-[\xce\xa7f\x01#\xc4\xc7b\xdfi\xaa\xeb\xf2\xe1\xb4J\x08\xcd<\xa6\x1d \xf8\xe5\xd8\x8a?\xa0\xbbLkI`\xa3\x13\x16\xc3{\x0b\xb4\xfe\x1f\xc6\xe5\xe4\xa52f\xec\xe4>\x0ey\x0c\xc1\x87\x9bl\xd6O\xbc\x02s\xe7\xbe\x99\xbc\x80\x0bw)\xf1\xa7a\n\xc5r\xbf\x17\x9b3\x1f\x11i\xaa\x1a\xe1*\x92fa\xf8\xf9\xa7\xdf\xc3\x93kyM/\xdc\xbfj\t\xfd\xdf\xa1\x83\xa8\x8a\xafG\x1d\xc9\xe8\\@\x11P\x96L\xa88!\xe2p\x83\xdc\x9c\xab\t\x9b\xe4\xda\xdeb\x06\xec\xfe\xd7-\x00\x06N\xb9\xf4p\xf9\xaf\xea\xc74\xb2\x91\xcbIk\xdf\xd5r\xff\x02\xc4\x17w\xe6t\xfc\x919`@_$\x91d\xbc\xa8\xaa\x18\x04\xbb\xe7Ch\xa4\xe7\xef\x8fFmO\xfb\xc4\x81\xac-+>\xe1m\x13\x15\xcd\x8dP6:\x95\xfa\xd6lpM\x0e~\xb1pR\x10\xe6\n\x8c\xa9\xb7eGc\x04\xdcVb3\xb4\x84\xfe\x11\xb9HG\xe6\xa5\xc9\x98\xdaX\x1b3EU\x1d\xe0^\x90PXpg\xde\xf08\xcf\x95\xdce \xfc\x1eq2.?\xc7\x15\x06\xb6\x98E0\xc4\x8c\x8dO\xdfs\xc1Qam+\xa74\xfb\x82Z(\xfe\xf4/\x94\x19\x06\x93\x07N\x8a\xe1\xf9t\xf4\x8b^l\xb3\x01\xad/_o\x94lX\xea\'(\x89Vp#\x95\xf7\xbbt\xf3k\xe3\xdc\\"\xae\x13Mh\x8d\xc1v\xee\xb0\xa0\xf3\xc1\x982\xe7\xa4\x9b\xde\xe7\\3K5!\x84\x8a=xP\xe9lGt\xca\xfcV\x95\xf2\xa4\xb3\x14]\xca/\x19_\xec\xec\xe8b\xb8\xd6\x88f\x92\xecn\xcf\xa9ma\xae\x92\x8b\xc7\xc3~\x8ec\xaf"\\@@>\xc8!\x0f\x8a\x1f\x9b\x87\xfc&\xa1\xd2\xc1\x86\x9c\x9d\xbbA\xd1\xb9\x8d\xea\n\x8ar\xa7t\x0b\x88\x14\x19\x1e\x1e\xff\xc7\xe8\x94\xfa\xb6\xb9Xx%9\x12\xf4\xc71}`\x19`3(\xad\x17\x1eg\xde\xe3\xd5=\x8b\xe7Q\x1d \x0f/\x0e\xdcz\xddS\xa2\xe7B@\x16P\x8c\xce\x86\x06\x85\xc0\xcf (n\x05Ds\x19\x9d\x89\xe3%:\xad\x8a &c\xb6\xefR\xb7\x99=\x05\xe2k\n\xca\xd7\x1dmXa\x12\xdc\xf8\xd3\xb9\xf2\xeb4g\xaf.Ge)G\xb0\x01\xb83\xc6\x1bS\xf3\xab-\xf4\xb0\xa6\xdeB\xc7\xfbiP\xb1\xc3N\x10\n\x88\x14\xc9\x93\xff[\xa4u\xb9Y\x87\x9f\xc4y9\x80\x93*\xe2v"[F,\xeb\xef\xc6h\x96\xd4p\x17\xd9\xf7p\x02{\xd8\xf2\xe4\xf87<\x02L\'\x83i\x80\x85n\xfc\xc4\xb7\x8d\x88\xd0[\xdb\xe2s9\x82\xf6}U\xf9\x0f\xca\'\xd6\x1f\xfes<Y\x1aZ ;\x84\x97\xf2%\xa3\xef\xae\xe4\xa1\xa31eLa=\xf4\x9e\x0bb\xd3\xdc\xf5Q\t\xc6\xee\x84\xafF\xfd\x1d\xe7\xb1i\xdeSZb\x86\x1e\xad\xc8\x07\x04\x1fa\x803:&\xca\x12\xd3<\x076^\xf3po\x8b\x0c\xb8\x9a\xd1e\xe6|\xd8N.\xf6\x7f\x15\xd7$\x0fM\x802n\x00\xbe\xdc\x88\xaa\xd0\xb2A\xc9,@\xb5\x85\xa6\x9b\x95cf\x15\xe5\xfa\xfa\xa6l\x8e\r\xbcM\x98\xb4,\x97\xff=3Cr\t70\x9bnMp\x8f$i\xbcC\r\xe7U\x16\xc6\xa3\xcdQC\xcd\xfd\xf6\xa9\x9c\xe6\xeaD!e\x82n\xd8\x1f\x05\x83\x80"<\x93\xa6~\xde^\x98\xfc\x961\xb2\xf8-\xef\x08\xb4\\\x8c\xb2\'\t\xbd\xc1\xd79\xdfvv_\x11\xdf\xf9y\xd4;\x9d\x1c\x1e/\x08\xc1\xa98\xc57f\xc2H\xdb\xe5\x95\xf2\xa9\x1b\x05=\xc9\x18[\x85\x1f\xd2\xe8\x1f\xd1/\xd8\xa6\x97\x99\x81\x82\xe0\xe2\xf1\xeci\x10H;Xj\xbc\xbd\x86q\xea\x8c_\xb4\xa3\xb6V-\xe2\xad\x98\xef\xd4x+GR\xecl\xc6i\xd5J\xb7",QX{n\xa2\xa3\xce\xd0\xb83\x97\xe0\xdbjp\xa0\x11\xdam\x04\xa9\xd6!\xc3\x821c-\x01\xd2+\xdcWy_\x97\xccu\xc9\xf5F\x8e\x8c~\xf9r\x7f\xa6\x0bSC\x8b\'\xf7\xea\xea\x1d\xc98\xfe\xbb\x8eB\x9b\xe3\x84\xdd\xaa\xb7\x84\x03\xe1\x0b\x90\xb4\xe8F\x9f\xbe\xd9]\x07\x0f\xe2}\xc6\xce\xf4\xe2\xf1p;8\xaa6\xc6\x07\xb3\xe4\xb3a2\xbfR\x95a\xea\xd8\x1e\xa9^\x12\x82|5\xa3!-\xfd;O\xe45*\xad|\xcc[\xe9J\xdbO4\xa7\xf7\xf7\xc1\xe2a*k\x06)\x87s\xd2>\xa2\x88\x89\x18\xce\\\xc4\xa9\x97\xbbY\xd2\xf1=\x80k\x88P\x0e;\xa4\r\x85\xc8\xe9\xdd\xbe\xe0"\xd0\x16\xf8\x9dW-\xb9\x06\x85\x01&\xba|\x96$\xfd\xecn\xd5Wm\xa8\x99\xd0\xa9\xb1\x15\x97\xa6\x15K\xce\x02~\xd0\xf5\x14\x97\xa8Q\xda\xa3\x08\x83F>\xd1\xbc\xfb\xa8\xed7\x97\xba\xae\xde\xccjl\xb7\x0c\xd3W@\x1c\x84\xe8\x85\x82[\xc3\r\xe4\xbd(\xfb\x173G\xb7\xce\x84\xa9d6Z>\xad\xf7\x0e\x1a;\x8co{HM\x16\x9f\xa73\xab\xca>s\'\xa9A\xfa\x98h\x18\xd3\x1b2n\xa8\x146\xaa\x9e\x9a\xbeHx\xa6\xee$}\x15\x06\xdf\x9e\xdf\x98T\xf1\xb5R\xb6sK\xc5@\xa0\xa0\x80\xe8\x80w\x1d#(\x9d\x0b\x17\xe9\xe1\x18\x99\x00E\x82D\x96\xa5\t*e\xbd\xe3\xdbq^[DB\xe3\xb2\xaa\xe33x\xba\x1ey\xc7S\xf6\x97>\xf81_.\xffV\xd9v\xad\x10\x8d\x00\x8c\xe9\xb4\x10\r\x9c\xd2P\x1a=\xa3\xf2\x82\x04\xfd\x13\xa6\xf3\nE\xee\\\x0f\xafKx\x89\xb5\x85/n\x1e\x8a#<S\xb4\xbf\xd4\x04\xa6)G\xa64i\x7fR\\\xef\x90N\x9f\xdb\x92 \xaf\xa3{n4\xc1\xee\x85\xd9#\xe6\xa2Z[\x86f|q\xa9}\xa1\xc0\x14m\xact\xf1\xb5\xb2P\xf8\x94F\xe7\xb3\xd0\xa16\xc3^\x91\x94W}\xca\x07\xd2^A:\xca\xbd\xc0Lq{\xc7\xa5\xe9\xec\xd4\x1bT5\xbe\xcec\xb3\x9c\xbda\x84n\xa0t\x89\xd8\xe7\x03\xf4\xec]\xb7\x90$\xd3\xb2\xc3\x91\x0b\xe4\xe7\x13K\r\x19g\x87\x81\xa7by\xc5tI\x80\xf3\x02\xbes\xadP0\x1c\xd6\xb6\x15(\x85[BF0\xaf\xe3\x13!\x93v)\x8e\x86\xce\xa3Q\xcd6\x0f\x03\xdd\xc4zfe&/fzS\xa1\x0b\x02\xd5\xdd\xad\x0f\xa5I\xbeA\x83\xb3>\xd0\xe38B \xaa>n_\x0f\xaf\xbf}\xf32\xe9ieh"\x17\xb9&\xed&cMixN\x98e\x0e\x1b\x1a\xf3\xde\xf4\x9c\xed\xb1\x06r\xac\xe7\x89\x9fpm\x0f\x89\x90\xfb\x84\xbc\x92i\xe4C\x00\x96`5+\xe49\xf6A]\x81\'O\xd81\xb5c\xa0Y\x17\xc3\x8a\nE\x1e\xa0H2\xeb\xee\xbe\xee\'\x1b\xd6\t\xaa\xf2\xb9\xcayI\xf6\xa0\x1f\x95\xbfM\x00j~$\x16\xf1\x16\xc1hW\x1eT\xed\xe6v\xc1\x83c\xd5@\x80\x94E+D\xb0\x17\ts\xb4` W\x90\xbf\xe9\xd2\xd8<\\\xebG\x14P\x9ao5K\xaf\xa6\xef\x1b\xcc\x94\xdd~\xf9\xca\xe1\x0e\x81h\x92\xb72\x8a\x81\xd9kUS\xb4\xe99\xf8\x98\x96\xe4\x9b\x8f\xef\xf9yi\xb2\x86\xd87M\xcb\xd8\xf7\x95\xe3\x97F\x99\xf13U(\xfd\xc8\x8d\xc1\xf1\xe7\xc4F\x03\xb0\x9e<\x95\xab$\xc8L\xde\xd9n\xb5\x80h*a\x92\rT\xbd\xfb\xecn\x1b\x1d\xff\xb5\xd8\xcf\xd6\xb7\x1b\x93z\x14K>\x93(\x81&\xb2\x95\x90\x1b\x9c\xf1\r\xea\xade\x07\x05\xb32\r\x8a\xccv\xb0\xb2v)u\xff\xe7\xce\x14\xb7\xfe"\xee\xa5$\x8a*\x04\xad\xde\xb0\x9a\xf1\x80\'G8\xec;>[\x87@:\xcc\xa1&\x9c\x95\xaf\x155\xb8\xa3.\xd7\xe8\xf9\xfb@\x1ao\xfc\xb3X\x0ckF\x84C\x0c\xc7\xed\x95\x0e\xd2\x8e\x7fhkZ\xa6\x13P\xd0\xce\x047\xbb\xea&\x7f[\xb5\xb2_"\x9ep\xe1\xf3\x84\x93\xdaM7W^\xdb?\x15I-!,!\x19\xaf\x8d\xcek\x8f\xd8\x9ew\xa4\x8b\x83Ti&X\xc6\xb8f3\x908PR\xd3n%1a,\x10J]Uv\x7fP;y\x95\x0b\xa1\xf5~\x9dX\xcc\xd3_t\x91\x9a\xcc\xcf\xff#{w\x9dWG\xc0\xe6\xdd\x01E;\xbf\x8e\xa4HT\xcb\x01\xfb\xd3&\x80\xfe\xc5p\xcf\x04\xf4\x10\x80\x90L\x11\xb56!lYqi?\xd6s\x17<\xe7\xc5\xeb\x8f\xd9e\xbf!\xc9!\xfb\xbbR\xb1\x8bP\x8f)\xd3\x0e\xc9\xb4\xddg?\x19|\xb9\xb1!\xe8\xb4\xee\xe2nl^\x7f\xd1\xf3\xc6\xbbM|\xb7}Yg\xcfq\xf1\x95#l|\xb1V>H\x8f.\x9c\xb9\xb7CG\xcc\xb8\xde>\xa0\xcc\x9f\xbbj\xb3\xef\xda\x13\x84\xf9T"/`?D\x08\xedI\x7fn\x00\xc5lUz\xf0\\\xf9V^yX\xe3\x14C\xfa\xb3L\xa7\xc2\xe4C\x0e\xa4u\xf9\xe1\x9d\xef\x15)\xf8\xe6\x06\xdfO\xbe\xde\'&\xb8:\xda\xbcS2T\xfeG*\xf8\x9d\x92\x1f\x87\xf9\xae\x9dQ\xf0\x01\x9foh\xf1\x94}B\x18\t\xdb\xe1q@ie\x05l3X\x80\r\x1d\x07\x95\x06\xdf\xf01QM\x18\xd7\x8d,\xa6\xaf\xec\xecO\xaf\x97\xfcg\xcbj\xe1X\xdeq\x01\xd2\xde\xcb\xcahlF\x17\xd4E<\x12\xeb\x15\x1cu\xdd\xe5\x8e\xe2\x12\xf3\n\xc3\xf3\xa3\xe6\x08\x06\xd4\xf6\xdf\xf9\x87\x908\xc1\xe2\x08\xafC\x8a\xb3\x10\x18\x9f\xc0\xf7V\xb7\xc4\x96i\x92\xc0\xa5\xcc\xad]Wwk\xbfz\xbd\xdf\xbd\xdd\xb5\xe0g\xf5-=\xab\x104\x97d\xc9uP\xa4\x03\x0e\x16\xc6\xc9Is\xe5|\xe4\xecJ\xfd\xd3R\x96<\\\x90\xe6\xd1r5\x1a\xfb\x03\xba\x14*md\xb2@\xfc\xcf\xcc\xf8\xf5\xe1\xb9B1\x0b\t\xa8CJi\x05c\t\xb7\x1co\x84\x9b+\xa4\xf7Z&\x97Z\x9c\x8fd\xf6q\xc4Ko\x85`}\x14uS\xaa\xe4\xd7\x9cmiG\xc6\xfa/_\xff}\xd2\x8f\xc1\xb3\xf5_F\x1a\x9e\xcf`GR\xa80\x15\x84\x10\x9c\x93\xa28\x01\xc8\xa3\xae\x93D\xd2\x85~\x89x\xd1!\xa1\x0b\x07\x80\xdfn\x9f\x0e\x92\xe9\xbf\xce\x1c\xa2\xa4\xe9\x87*\xf3\xd4\x1a\x9a\xad\x91Sde\xb3l\x8e\x00\xbd\xf7z\xf9KhV9C\xd4V\xb1+\x0f\xe5\x86\x1cS\xd3\x1e`\xe6\xa2l\xe0K\x16f\xd0=H{\xff\x16\x98\x1f\xfe\x02o"i\xe4c\xb67Q[w\x92\x18 \xe2\x90?"\xe3\xb4\x07\xd9\xe8\xed\x02\xcf\xf5A\x9e\x0e\x9e\x82\xab\xae\xa4\xa6+\x1a\xce5h\tn\x99\xc8\xac\xd6\xc1')
|
4
|
-
|
1
|
+
from sqlalchemy_serializer import SerializerMixin
|
2
|
+
from flask import Flask
|
3
|
+
from flask_sqlalchemy import SQLAlchemy
|
4
|
+
from flask_admin import Admin
|
5
|
+
from flask_admin.contrib.sqla import ModelView
|
6
|
+
from wtforms import SelectMultipleField
|
7
|
+
|
8
|
+
from sqlalchemy.orm import backref
|
9
|
+
|
10
|
+
from flask import Markup
|
11
|
+
from dateutil import relativedelta
|
12
|
+
from hiddifypanel.panel.database import db
|
13
|
+
import enum
|
14
|
+
import datetime
|
15
|
+
import uuid as uuid_mod
|
16
|
+
from enum import auto
|
17
|
+
from strenum import StrEnum
|
18
|
+
from hiddifypanel import Events
|
19
|
+
|
20
|
+
from .config_enum import ConfigEnum,ConfigCategory
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
class BoolConfig(db.Model, SerializerMixin):
|
26
|
+
child_id= db.Column(db.Integer,db.ForeignKey('child.id'), primary_key=True,default=0)
|
27
|
+
# category = db.Column(db.String(128), primary_key=True)
|
28
|
+
key = db.Column(db.Enum(ConfigEnum), primary_key=True)
|
29
|
+
value = db.Column(db.Boolean)
|
30
|
+
|
31
|
+
|
32
|
+
class StrConfig(db.Model, SerializerMixin):
|
33
|
+
child_id= db.Column(db.Integer, db.ForeignKey('child.id'), primary_key=True,default=0)
|
34
|
+
# category = db.Column(db.String(128), primary_key=True)
|
35
|
+
key = db.Column(db.Enum(ConfigEnum), primary_key=True, default=ConfigEnum.admin_secret)
|
36
|
+
value = db.Column(db.String(2048))
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
def hconfig(key: ConfigEnum,child_id=0):
|
41
|
+
value=None
|
42
|
+
try:
|
43
|
+
str_conf = StrConfig.query.filter(StrConfig.key == key, StrConfig.child_id==child_id).first()
|
44
|
+
if str_conf:
|
45
|
+
value= str_conf.value
|
46
|
+
else:
|
47
|
+
bool_conf = BoolConfig.query.filter(BoolConfig.key == key, BoolConfig.child_id==child_id).first()
|
48
|
+
if bool_conf:
|
49
|
+
value= bool_conf.value
|
50
|
+
else:
|
51
|
+
# if key == ConfigEnum.ssfaketls_fakedomain:
|
52
|
+
# return hdomain(DomainType.ss_faketls)
|
53
|
+
# if key == ConfigEnum.telegram_fakedomain:
|
54
|
+
# return hdomain(DomainType.telegram_faketls)
|
55
|
+
# if key == ConfigEnum.fake_cdn_domain:
|
56
|
+
# return hdomain(DomainType.fake_cdn)
|
57
|
+
print(f'{key} not found ')
|
58
|
+
except:
|
59
|
+
print(f'{key} error!')
|
60
|
+
raise
|
61
|
+
|
62
|
+
return value
|
63
|
+
|
64
|
+
|
65
|
+
def set_hconfig(key: ConfigEnum,value,child_id=0,commit=True):
|
66
|
+
|
67
|
+
if key.type()==bool:
|
68
|
+
dbconf = BoolConfig.query.filter(BoolConfig.key == key, BoolConfig.child_id==child_id).first()
|
69
|
+
if not dbconf:
|
70
|
+
dbconf=BoolConfig(key=key,value=value,child_id=child_id)
|
71
|
+
db.session.add(dbconf)
|
72
|
+
else:
|
73
|
+
dbconf = StrConfig.query.filter(StrConfig.key == key, StrConfig.child_id==child_id).first()
|
74
|
+
if not dbconf:
|
75
|
+
dbconf=StrConfig(key=key,value=value,child_id=child_id)
|
76
|
+
db.session.add(dbconf)
|
77
|
+
old_v=dbconf.value
|
78
|
+
dbconf.value=value
|
79
|
+
Events.config_changed.notify(conf=dbconf,old_value=old_v)
|
80
|
+
if commit:
|
81
|
+
db.session.commit()
|
82
|
+
|
83
|
+
|
84
|
+
def get_hconfigs(child_id=0):
|
85
|
+
return {**{u.key: u.value for u in BoolConfig.query.filter(BoolConfig.child_id==child_id).all()},
|
86
|
+
**{u.key: u.value for u in StrConfig.query.filter(StrConfig.child_id==child_id).all()},
|
87
|
+
# ConfigEnum.telegram_fakedomain:hdomain(DomainType.telegram_faketls),
|
88
|
+
# ConfigEnum.ssfaketls_fakedomain:hdomain(DomainType.ss_faketls),
|
89
|
+
# ConfigEnum.fake_cdn_domain:hdomain(DomainType.fake_cdn)
|
90
|
+
}
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
def add_or_update_config(commit=True,child_id=0,override_unique_id=True,**config):
|
95
|
+
print(config)
|
96
|
+
c = config['key']
|
97
|
+
ckey = ConfigEnum(c)
|
98
|
+
if c == ConfigEnum.unique_id and not override_unique_id:
|
99
|
+
return
|
100
|
+
|
101
|
+
v = str(config['value']).lower() == "true" if ckey.type()==bool else config['value']
|
102
|
+
if ckey in [ConfigEnum.db_version]:
|
103
|
+
return
|
104
|
+
set_hconfig(ckey, v,child_id,commit=commit)
|
105
|
+
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
106
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|