hiddifypanel 3.0.0.dev63__cp311-cp311-manylinux2014_x86_64.whl → 3.0.0.dev65__cp311-cp311-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/admin/Actions.py +1 -1
- hiddifypanel/panel/admin/templates/config.html +1 -1
- hiddifypanel/panel/admin/templates/proxy.html +2 -2
- hiddifypanel/panel/admin_2.py +33 -3
- hiddifypanel/panel/cf_api.py +35 -4
- hiddifypanel/panel/common.py +98 -3
- hiddifypanel/panel/custom_widgets.py +71 -4
- hiddifypanel/panel/database.py +18 -3
- hiddifypanel/panel/hiddify_api.py +70 -3
- hiddifypanel/panel/usage.py +4 -5
- hiddifypanel/panel/user/templates/home/multi.html +1 -1
- hiddifypanel/panel/user/user.py +2 -0
- hiddifypanel/static/css/custom.css +11 -0
- hiddifypanel/templates/500.html +1 -1
- hiddifypanel/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +36 -38
- hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
- hiddifypanel-3.0.0.dev63.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.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev63.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\x0b\x00\xa7\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xe4\x01\x00\x00\x12\t\x04\x00`N\x9a\xf3{\'&\x07\xa5\xbbQ0\x80\n\x8a\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x96\x9f\x9e\xf6/\x93K\xc7\x99\xaa\x8bO\xa0\xa4\xa0bx\xcb\\\xe0\xf1\x05\x127K\xa6\xb5\xb9\x96\xb1\x9c\x0f\xd0\x16\t\x1a\xfc\x83$?\xb3\xae\xab\x11e\x9d\xda\x0b\xf5\x91\xd1<\xcd\xf4\xc3\xcf]O\xcb\x87\xf0\x80\xf0s4\x93oi\xdf\x0c\xa1\xb0\xe7\x85\'\x8bT\x97\xde\xc3\x97\x9e\xc0\nF\xe0\x9e\xeaj\xb9\x9a\xea\x99\x94\xa4&k\x93\r\xdf\xc2F%\x1ck\xf3P\x0f\xb9]\x93Re\x7f\x81\x11O\x98\xac\x8a~"\xd4MbI\xbfp\x93\n\xa2\xe6I\xd8_6n\xcbQ\xe1ws \xbd\x8dI\xdc\xea.\xceo{\xcc\x8a\x18_\xbb\x1c\xf9:U\xe8z\xa0\x1b\tr\x88\x0c\x82G\xef\xae\x9b\x92\xdd\x85\xa9\xd5/M^\x16\xd1yR\xdf\xfe\x84\x11\xcfA\xd1\xd9\x95C\x19\x86\x02\x819M\x14\x8e+\xa5,\xd7\x85\x1dF\xe1\\\xcf\xa9\xc2\xfe\x90X\xac .\x11\xf6\xdf]\xab\xcf\x93\xbd\\6\xdb\xec/\x04/\x10\xd6\x19!\xb6\x90\x97=y~s\x8b\xb4\xae\x8f\xb2;\x17\xf3\x8c\x12\xdc\x01n\nP{\xf9\x87\xf2\xac\r\xee(L\xc6\xb8\xbe\\)O\x88K\xd1\x8a\xdfg\xab@\xc6,\xc4\xa2\x97|\xd1\xcfIV\x11q\xa8\x1b\x1aa\x88\xeb2\xa9%\n6\x92\x89\n\xfe\xe8j\xec\x13]l><4e\'M\x06\xa2\xfci\xf1.\xa3u\xda\xe8\x0cU\xe0\xf9P\xca\xff0\x1b\x03IT\xa1\xaa\x81\x0c\x95l\x9e\x13T\xd2\xff\xbf\\\x15r}"z\x05\xc0\xf3q\xed\x0b\xa6j\xdb\xbb\xca\xb4r\xceS\xfd@|5\x80\xf0\xea`<\x8bGv\xee\xe6sr\x00\x1d\xde\xceWm\x14;h8\xbd\x1c\xdf\x1b0\xc4paQ\x1e\xe1x\x7ff7\xbf\x9d\x84\x13\xd2\x06\xd5{\xbc\xebC\x0b\xd7\x01\xf7R\xfe!\x88=\x81f \xd0R\x07(\xd1\x14\xa1\xd8\xce F\xf8\xc8}\x806_=C\x7f\x1a\xc2A\x1ayz\x90m\x82\xa2\xc4\xc7\xa9\x1f\xa4\r\xd5\xad\x82h')
|
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\x0b\x00\xa7\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x9d\x19\x00\x00\x12\t\x04\x00v\x94\x1e`\x10\xf7\n[\xd13\xf48(y\n\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x99j\xfd\x96\x98\'M\xb1\xf2\xde\x03\xcb\xf3b\n\x80\x97\x94\xf56f\xf9\xfd\xc9\x16\x05p3}\xf6\xb4\xca\xc5\n\x0e\xa7\x9e\x85<AV9\x85\x07)\xd5i\xac%>\xf9*\x08\x03\xba\xd6\xf9\xea\x8a*qNg\x9b\x187q\xfe\x0e\x11\xbbX\x10\xab\x1e\xdc\xa3\xa0\x9a8\xd1K\x8c%Y\x16\x18\xe0U*\xf3\xdaH\x12!\xef\n\x14\xa3\xb3\xe7\xc7m\xa5\xc8-A\xa1\x08\xe6\xd2x\x16;\x06\x07\xeb\xae\xd7b\xdeYQ\x139\xad\xe2\x1eG\x97\x11B\x1d\xc1\xb1\x9a*&\xad\xbdmx\xdb\xe9\x90\x17\xa9\xeb\xb29\xe5\x04\xfb\xd5\x82\\\xfbgR\xae\x91\xd1Q\xc6\xbd\xfa\x01w:\xef\xe8\xb0\n:\xe8\xbb4\x96D-)H1\xff\r_d\x16*\'\x93\xe4\xea6R\xda\xbaA-\x84\x8a\xff,\x8c\xc2\xf4\x83\\2\x01N>\x12v\x8b0"N\xe1\xb1,\x8b6\xe7\x84\xb3\xdalH0\x19?\xda-\x86\xfb\x81\xe1p\xf1\x8ajs?\xacf-U\xf5\xce\xfa\xb4\xfd\x02hi\xd9\x8f?A\x98Q\x18I\x83OV\x95?b\xd3U\x9bGb\xaa\x0c\r\xad\xc4\x86\xfd\xb9\x96K\xd7\xb4\x98JV\xd0+\xaa\x14Y\x97\xb4\x8e%\xa4\n\xe16\xca\xd1\x0b\x92\x86\xed\rif4F\xf5 \t\xeaQ\xfc\xfe\xc2u\x80\xf6\xc3&+\xfa\xcd\xed\xcet\xe7\xe4\x14\xb5f1\xd0%2\xfc5=6\xbe\xcb\x7f\x85;\xe5\xac\xddg!\x9c\xae\\UW\x13`;\xfb\xae\'^\xa0\x81\x05c\xef\xbb@,f\x9a\x96\xcbM\t\xe3\x90\x0e\xd9\xf0\xc2\xca\xb1\x19\x821@"\xf9\xfdK\xef\x07.\xf6\xac\xe1\x9d\xd9~\x1c\x08\x1c_\x8e\xba\xdd\x01\x94\xe5!\x939&d\xe0\xc0`)\xba4\x1f\ra\xc4\x0c\xfeX\x94TB\x0c::g\x9bOP\xd2\xb3x\x8b\xa5\x15\x91\x98\xfcdQ{L4a\x8ag+Sp\xe14Mim\xc4\xfc_\xdc7\x08\xbf\xd3\x8a;\xe5>\xe7>\xf6\x00\x1e\xe3k\xb6\x97\x9c\xdeLl3\xeaw\xc7\xde\xd6>\xb1\xcep\x88\xc42v\xc0uj,nQ\xe5\xb5*a\xb72\x14\xf6\xcb\xfbBj\x89\xbcO\x02+Y\x95\xb2\xf8\x9b\xebZ\xa3c\xb5=\x83\x89\x18\x02h\x96\xa4\x16?\xf7\x8d\x83\xb6p\x0c\t\x8e\xde\xb7i^\xab\xcb\xa6~A\x19\xab+\x94\xd9+l\x0bd"\x17.\xc1\xaf\x84%\xa0\xf4\xf8\x81\xaf\xa6\xf0\xa5V:^\xf4\xa7`pd\xdf\x11\xd6\xd1\xcd\xe5\x00D\xc1\xa0c\xac\x9d2%\x1c}<\x08@&4O\x06l\x90\x17_b\x9c\xa6_\x954\x04\xf2f\xe4\x0c\xd0\x05n\x0e\x81t\x90\xf2\xbf\x10\x04y%\x11\x0f\xb8\x1f\xf9E\xaa\x0f\xa5\xddWek\xe7;\xd0\xc7\xc4\xd1a\x1c\xa8\xbcc\x9ffJN \r\xcb\x94\x16\x01\xb5\xf1a\x99\\\xbc)\xa5\xf6\t2\x97%\x1b\x85\xf7\x98\x83\x05\xa0\x9dD\x82:2?\xe60m\xae\xc8\x1b`\xbc:\xda\xfc\x1f\x8a\x8c\x99\xc7\x06\xc9@\x98\xa2!\x0c\xffE_\x17&\x0b\x04\xe1?\xcc\x08;\xb4w-\xd0\x7f\xf0\xae\xb0\xda5r\xc6O|\xa2\xc1;\x8a\x83\x1ev/\xafi\x9dk\xb5\x07\x00\x9d\xa4\x86zouH\\\x11\\\x93\x18\x89\xb8\xed\xc5\x19e\xdbF\xc2\x81\xf0u\x85X-1$\xa7\xb1\x8e\xfa\xb9\x06\xaaS<\xb6S;\xd4\xeb\xa6r\re\xfd&#\xd1}P\xe6\x0b~\x9a{\xf1\xb2\xd0vF\xee#\xda5\x94\xf0>\x9cP\xe8oh\r6G\xdc\xc1mr\x0f\x8d\x056\xf7\xe9\xe8\x9cC\x94\x92.\\r\x19\xf3L\x92\xb8z\x81T\xa4\xb6F\xa9\x16\x1b\xc6%\n\x8c\xfd\xf9\xd7\xb4\xa6\x90\xa5\x9e\xeb\n\xd1\t\xb8\x7fvu\x8dh\xd3\x04w\xf8\xd0\xac{#\xb8\x9f\x0b\xd0H\xc4e\x15\x03\x9dQ\xbf \x0e\x07\xb1f\xd6}\x17\xfd:\xbb\nC\xbb_\xecw\x12=\'\xfe\xf8)\x82\x02\xbe\x98\x8e\xbd<;-\xe8\x9e\x97$-\x9a3\xb5A\x7f#\x12N\xb2z\xd8\x89\x9al4\xad\n9\x82!\xda\x12B\x05"\x89\x18\xdd\x1el~\xfd\xc6G\xf9\xa6\xb6w\x9e\xd3\xcf\xbc\x94\x8am\\\x8f\xc1\x9a\x05\xa1\xfc9\xb8Q\xf7\xa4\xeav\xcf5B\x1b\x1d\xd4\xd2\xb0\x19\xa3\xd9\xe5\x88=\xb3\x8bqH\xb7\xf8g\xe1+\x0c\xca\xb4\xdb.\x10Cj\xb9\xec\xabA\xa6\xbb\xf8\xc7",\xf7%\xbb+\x87@_\xfdNM\x81\x83G33\xd5\xe7\xd0\xd27|\xf5*\xc2\xb7?\xf5\xe2\xe6\x81\xbe\x91\xa4X\x84\x0e\x07\x13\xff\xba\xee\xd1\xe6\x8c]\xa5\xee\xf6D1@\xa9\x83\xfe\xac\xf2\x0eK#\xe9r\xd1e\xed\xffs\xc7,B\xbb\x92\xc8\x11\x8c\x83\xe2\xb4\xfd\xcf\x99lt\xa9Kl\x98\x88\xc2\x9b\xbb{\xd1\xe3jiC\xa3[\xec\x10\xc90l\x9b"\xdf\xe9\xb8\xa5\x95\x86uf\xf2\xb1\x97\xf0{^t0A\xd11sL7\xcaqu.\xfe\xbe\xfc#G\x0c\x97\xbb\xf7\x8d\xd6*\x9e\xc6\x1ej\xca\xf7\xe3\x9b\x85H\n\x1b\x82\xbe\xeeF\xdd\xd0D\x9e<\xa0[\xad\x83\xc7?\xfd\x98Q\x02\xaa\xbb\xdc\xef\xf7\xd2i_]\x8d\x8a\x14\xb0\xe0\xb1\xae\xed\xb9\xd6d.\x9c\xc5b\xfb\x0c\x18L\xe2f\x0eN\xbbG\x06\x12j\x871\x1d\x95\x92j@E9\x82\x9eU4\x7f\xf9fo)\xf4!\x9b\x96\xb5\xc8p\x8e\x15#Um\xfen\xe3\xbd\xdb\xf1\xfaE\xb6\xa2\xfe\x1f\xa6\x01ax\x1b\x91\xb9 \x02\xfcJ\xbb\xe1%\xb6L\xcf[\xc8\t\x14\x9b\x18\xe9v\xe2\xf3\xd3d\xc9~\xc0Z&\tX\xf3\x01\x1c\'i\xab\x04\xc0:4\xa3\x8e\xef\xdeI\xd5\xc2\x8e|\xf7^[\xe6\x07\xb3M\xda\x9c\x1e\xf2\xc1K\xe9o\xe3\xe5\xe1\x87\xc8\xf07\xf0\xf2\xafjf\x1a\'\xbf\x03\x03\xec\xdcl\x98@p*M\x10KT\xec\xf2\x94\x01\xf2#\x01;\xb8;\x8d\xd7#\xf2\xe5\xb7\xe5\x0b9\x1a\xe5,\rL\xc6\xe8\x13i\xbbU\xa6$r\x88\x885\xf7\xc9\xa4\x89[\n\xfe7\xb3\'\xca\x95B0\xfbY\x84}r\xd2\xe6Z\x91a\n\x0cJ\xaa2\x114\xbc\xc9\xe4\xc8)\xe4\x01.c8G\xe2h;)\x84\xf0\xc7$pG\xe5f\xc0\xb3\x84\xa9mu:=|Nwy\xd1\x80 \xde\xb9\xe1\xa6v\x0b\xd2/*\x9d>\xd23_|\xb2\xd6jB\xf8\x01\xc6\x04,Sj=\xf5\xe1U\xd3K.||\xa4QC\xe2c\xc0\x1fP4M\xdbE\xf7\xf4\x88D\xabh\xe05Pb\x91\xfciEq\xd3\xd4\xae\xfcF\x01\xd7\x10s;r\xb21\x8e\xde>^\xe9\xcc\t\xf0lL\xe4\xac\x87\xc1\x1b\xa4\'iq\x0fiH_w\x13p\xd8\x04&\xdbv\x88\xe6\xb94C\\R\xb2/\x7fM\x8fr\x99\xfd,\x11\xd1\x92\x89KJ\x9e\x1b\xd6\xc34z~\x91,\xe2\xa8:\xdb"xUX\xac\xabK\xa4\xb1\x99\x88\xc8A\x84\x15\'\xac%\xec\x89\x12\xe8\x05\xa5 z\xecx{\t`\xae\xce=%\xc0\x1b7\x05\xe5\x16\x19V\x0f\x8b\xb5m\xe2\x9ao\n\x1c\xa3mS!\xe7zST_\x81s\xbe\n\xfe\xefuBwUf\x7f\xb8\xef\x9a\xe2\x03\xb7\x03+@\x92\xb1}H\xdfB\xcd\x8eftNd\xdd\xecb\xa3:#\x96\x83Wd\xd2\x9e>c\r\x9c\xd0*\x1f8\xaa\xb8\x12\xcf\xdb\xb6`\x9aX]\xb2&\xd6\xd4\xa4\x89K\x80\xf7\xca\xef\x01yd\x12u\xf1\xf1\x14|g\xb5\x87\x82\xeeY\x8d!\xda\xc1\xf8?\xb2\x8fMK\x18\xcf\xc8\xff\x86`\x93\x99\x84L\'\xcd\xd5\xae\xb0\x8e\x11\xe9\xec\xe2\xdd!3hT\xf3\xa4\xeb)\xc1C\xc1\xe1\xda\x15\xf7\x9c\xa1;\x0b\xe9M\x1f)\xb6\xc8\xc5\tm\xb5\x11\xa5\x15p\xbdr8;\x82\x8ffg\x814\xe4{\x06\xc9#;z\x03Z\x0f)r59\xb4\xc7\xf1Z\x90m\x0b\xd2$\t}0-\x7f\xeb\x99"\xd2\xfc\xbfC\x07\xa5C\x08 h\xd7,\xcb\xc3\x96h\x1cq\xe2\xb6-\xee\xc2\xa8\x9e.\xfb|?\x8b\xaa\'\xaeO\x8d\xca_gTV\x92\x01\xa3\xaa\x17\xf9\xec\xe4\xb0Y\xa0(h\x00\xc7\x9d\xeb\x8a\xee9\x01\xdbVjE\x1a\xae\xb2\xf8[ \x10\xbb\xbd\xb4\xf0\xd9\xd5v\x9c\x15$\x0c\x83N/{\x81[\xc2\xcc\tn\xd4\x04\xcb2Mo\xff\xe6\xd0\xfb0t\xc5\xaenb\x05y\x9e\xf5\xc5\xfa\x15\xb0\x10\x85\xa3d\xe4\x86\xd5\xce!(\xd1\x00y\xcc\xdc1T\xa87\xc0\xe7\xf1\xe3\xa2\xa8|\xca\xfa\x15\xdc\x15.\xf0S\x99\x10\xba\x8a\xe1 w\xe9+\xb3\x18t>d\xa8\x013Ng\xfb^8G\x17V\x7fXo\xf7j_\x13\xc6\x03\x8d\xba8I|\nI\x94\xcc\x9c\xab\xcf,\x04i*\xb4\xc2\xce\xf2\x9cK\x19$\xd0M\t\xbb?\x1c\x9cM\xf4S\x95\xcd\xa4\x84\x85\x1bY\x8d\x81\x85%\xa2A#\xfa\xeaW\xd1k\x91\xaf\xfd\xc6&\xde\x12\xc0\x12\xf2,j<\x07\xf42Al\x97 q\x10Q\xc3\xb7\x94_KM\x06\xaf\xf2\xde\xe5\xf5\x1b\xe5Mz\xf6\xc9\x8b\xf1\xb9\xdf\x97\xe1`\xfe\x02(\t\x8b\x17\xb4\xe5\x01\xd2\xd60\x9f=\xe4\xb5#\x16n\x12\xcb\xb5\x1f\xae\x89\x82\xb9\x85\xf5\x1a~\x91p\x00\xf0[\xe9T\x18L\xa6(\x1f\xb1\x90\x91\xcf\nR\xfaU\xe3\x98\xd8\x18]!\xc4R\xd7\x1d\xfb\xec\x84\xc6`$\x1f\xc4mm\xa0\x1d\xe9P\xcb\xbf(3lL\x13\x93\xf1\x9f\xb1\t5\x03\xeb#\xbf\x04<\xee\xe7\x00\xfa\xed\xe6\xaf\xd48\xe4\rz@ o*ON~/\x9b\xa68QZb\xfc*f\xa5\xc1\xc6L| \x8eu\xb8\xb1\x0b\xa0\x00\xc1<E\xd1,\x9f\x8ede\x80;\x8bml\xbe\xc0\xfc\xa0\x0b\x07\xf3qE\xc6~M{^@yJ\x84\x07\xe5m[y[N\x8f\xa7\x10Y\x10\xbe%\x1c\xceOd\xae\x83\x1318\x99L\x82VBp\xe1\x0f\x04@v\xee`KQ\xb82\x9e\xc2\xdai\xaa.\xb0\xce\x99\xdb|%\xb8\xd0\x18-\xf3\xb4M\xa8\xb2\xe3\x93\xa9}\xc65\xdd\x16)n\x18\x10\xb8\x17D\xcc\xb2\xb82\x89\xcc:\xdb\x1c\x92\xa69\xdaL~\xe0\x9f\xf7\x99\xeb\xf9\xcb\xa8y:{\xfd)\x9b\x82i\xf5\x0cd\xc4\x81\x1eG\xc7\x93v]/@\xd0\n\xd2|G\x02^\xcc$\xbf\xf6\xe7Y\xef\xf7\x83t\tm\xf0\x8a\xbb\xce\x15\xc7Uk\x9f\x83\xfeQ\xe8}/\xe69A\xf5\xc5I\xc4\xe5d\xb4\x8e}\x81{P\xccr\x9f\xcb\x93:\x1d\xa9\x87\xf1ea\xcaQ\x9f\x07\xe9\xb5n\xe44\xac\xb4\xebJ/\x9f\x84(\tP<\xca\xe0\xa21\xfb\xb4\xf3K\xba\xfd\xf3s\xde\xe1\xa6\x15\xe6\xce\xc1\xca\xaa\xf0\xd0\x9e\x05\xec0\xf39>x\x1b\xc4b\xf4Brc\x11\xa30\x0635\x9b\x93\x0c-\xf4\xbdk\x8a,Qt\xc4\x95\x94+\x13\xab\x18!\x15M\xc4jB\xd3!4\x89\xb2\xc2X\xbc\xc1\xf9\x9c\x10\xb7DRjTgq\xd9\x881\x8b\xd9\xe0\xfe1\xdb\xf3\\\xf8\x97\x01c\xeeI\xc2,n\xb6\xef\x8ae\x9a\x0e\x96ia\xcf\x97\xdd\xc5\xb5)\xd4Y8\xe5\x81\x13\xd28\xbfn,\x016.\x03O\xc2\xfb\x93\xaer\x8bb\xd3\xdf\xe4\xa7\xb0\xa5\xd9fP\xbb\xe6N[\xe2\xe9\r\xa2\xeb\xf7}\x9e\x8dg\xf1\x86\xd4\x8b\x01 \xd9\xeb%1\x90\xbe\xc9\xd3\xe6V%\xc0\xde(\x16r\xa5\x07\'\x9e\x93c\x9e]\xcd\xb2\xbd\x9d\xff\r%\x81\xb0M\xe0GOI\x06\xe9)\xc5-\x14\xc5W\xa5Z\xa1\x16o\xca\xdcwv\x08^\xd9\xd4rw\xa5\x194\x80\x17\xc4Y.\xd7\xf2\xd8\\\xf9\xc0A\xb6#\x88\x1bt\xe5<\x9cO\x86\x97\xe0\x0f\xbfc\xdf\xac\xb5\x87\xdb\xef\xceE\xc7\xb9\x08\xfa\xd1\xf2\xc3\x87\x93\xfb\x15\x94:\xf2\xe4\xfcV\xcf\x04\xf4\x9c\x94\x95\x0bbP\x1c\xb0\xc9\x9c\xb5)\xef\x1az\x19\xb7\x81\xec\xbb\xc5\xa0f\xf5\xc9\xc3\xf2Z\xa4\xce\x03A\x9a+.`n7\x8e\xdcN\xd8\xf9\x1a\xff\x8b\x84\xf1,\x88\xd9!\t\xf1\x92\x17\xa6i \x01\x14\xd2\xdbja\x8cUm\x18o\xe9^\xb3\x1e\x10\x08\xa8\xc9\x83F\xf2d\xd7\x91\xaem\xdf6R\xf0w\xb2\xb6\xb0D?\x84\x1aVj\xae\xce\x16r\xfejA\xd1\xa0\x05\x07\xf5uX\xa9\xf0\'\x15\xe67\x16\x0bb\x08Wi)j\xb0\xae{\xe8k\xd8\x98\xa3\n\xb8\x95\xe6$\xc7hj\x07\\|\xad\x12o|5D\xbe\xa8\xb2\xefi\x1e\xf6G\xa9\xe5\xa4\x9e\xfc\xfan"\x9e\x1fj\x8et\x95\x9fg\x19\xa4\x96teq\xb9\xb8\x0c"\x01I\x8ca\xa3\xa3\xe0a\x1cP\x02\xf7"\x01\xe7J\xd5\xb0Ot\xc3\x7fI\xa5-\x07\x90\xdeGn\xaa\xc8\xae\x06\xeb\x1ao\x88zIY\xf3\\p\xda\xa0!\xc0\xd1\xc93i\xfbL\xb5\xce\xf7@\xb1\xa6\x8bw\xe7{5\xc0\xb8\xf5{\xdct\x82\xa03w\x10]@B\x865\x85>\x8d\x8d\xe4?\xfd7|\x05\xb9\xef\x98CTlB/P`\xfc\xc2\x87\x1e\xb8Z\xcb\xd5\x1a\xc6i`\x8e(u\x97\x86\x91"h\xba\x00\x0e\x0e\xd1HkEv\xe1\x11}\xaf\x97\xd4\xbas\xfb!DQ\x07}3t]&\x11x\x996\r\xc1\x00\xbe\xdb\xcaRyZ.Q<\x06,]\x90\xdf*\xc4zJ\xd9\xc1\x14\x8ff~\xbe\x84=\xceTX\xf8{\x84w\x80\xe64\x0e\xf8Y\x94*\xb2\xda[\xfc\x84\xee\xd5\xef\x08\x97\x00\xc1\xf3\xae}\x95z\xee]\xb8~\xbe9\xa1\x81\xf4\xf8\xa7B\xbe\xfe\x88\xbb\x93B\xab\x10\xb5&\xf2x\x07\xa8\xc4\xeal\\\xda?\\\x7f\xa0;\rX\xbd\xf9\x1e.Sy\x87\x8e1V\x04\x87\xcb\x7f\xfcR\xb8\x880\xc4\x9c\x027i\x18\x8b\xecG\xb5\x16\t\xea\xff\x00\x0e\xe53?\xd5\x1c\x04E\xde\xcfz\xe9\x03\xcb_m\xe9Q\x01\x1a\xca\xb2\x1c\xe9\xce\xc6h\x7f\x8e\x81\x8f\xda\x10\x93S*G\x9f8\x1c\xc1\xae\xe4\xb6\x17\x87%k?\r8\xd0\xa4\t\xe3\x81\x82\x93\x14\xbaV\xec\x1c,\xbb\x94\x03kC\x8ff\x07?X\x10\xdam\xca\xae\x82\xeb\xd5\x14\xa6_\xe2l%As\xd2n\x8cK\xc4p\xae\x9f\x7fi\xea\x84\xad~F\xe5\x8d\x13\x93j\x9c\xa5\x8d\xe0\x92\xf1\x8bd\xee\xba\xa6\x82\xcd\xdb\xebks\xe2\xdbg\xcf\x08Y?n\xd2\xb3\x03\xe6vK\x99[\xa9\xc5\x02\xb1T\xba\xdb\x03{\xc5B\xdfNa-\x81,e\x08-\xf1\xe6\x0e8W\x1c\xde\x7f\xedQG%\x04\x008\xe0Af7\x9cW\xbf\x982\xac\xe6\xa9\x05\xb1\x0f=\xff\xae\xd9F\x05\xec\xeb^\x0fEl\xd7a\xe3\x07\xf8V\x94H\x8c\x94WiO\xc0[\x8a\xd9\x13\x11e\x9b\x8az\xe8\xdb\xfb\xfbD \xba\x9c\xa9!\x9b\x18@\xa3\xd6q\xcb\x84\xd0&\x90\x8b\x9e\x00#\xbf\x14\xeaR;\xc0\x99j\xd4\xb59\xe7\x1a\xeb\x99\xac\xd5\x04>\xc5fi\x8f3\xab\xef\xa5U\xdc@\xeb\xb2\xe6a\xbe\r\xdf\xd0\xa6\xa2\xea\xba\xd4\xde\xde\xc43\xe3\xd2\x86e\xf9\xcc\xad\xb6\x85Mf\x1a\x0fBeU\x05\xf4\x15\x8aeC\xbaO\xb0\x95}\xd8vc\x0f\x18\xfb]\xe8\xff\x14\xfb\\\x0e\xf923\xaf\xe5\xf41d6aM\xb0\xba\x98d\x02\x98v\xd7\xf8[\xa5\xc4\xbc\xea\xd5\xe8\xf2`\x1e)\xa5\xa8!\xbc\x9b.SuO,\x90a*\xde\xe8\xf6\xc2\xab\x8a;\x83p\xda\xfd\xe4\x88\xe2\xe8h!#\\C+_\x05f\xffc\x0f1\xd1\xbe\x82{\xf0X\x0e\x8f\xee\xad\x01K\xa27H\xa2\xe9\x0b\xad8\tD\n\xad\xe1\xb9\xfen\x80M\xb2\xb1\x0c\xb6\x8bn\xcb4\x80\xfc\xa2(\x04\xb7\x1bz\xa0[\xbb\x98e\x0f\xf4C\xd1\xa2\xae=E\x82\x14\xf7\xe6\xed\x02\x8e\xf9\xe9\x98\x8e\x92\xf3\xe6\xfeO^;\x03\x0fy{\xdcYF\xfc\xe6M6Gr\xae<\x08\x0bgjS\xe2\xa4\x85\xf9\xfe%\xec\xddK\x90YT\xc1;\xcd\xa89\xa8\xcb\xee\x92\xcb\x1d!f\xd8a\x07\xcds\x80\xeeUjSm\xa2\xbb\x9b\x0c\x0f\x1a\x94\x187WK\xb1\xd5X\x96\xdb\x8a\x00\x97\x08\xbb\xac\xc81F\xc8\r\xb3\x0f>\x07\x80\x89\'\xe1\xca\x95\xbe\x1fi\x8a\x8e\xe6#\xa8\xfam\xd4u\xebk]>\x87\x84\x8fNz\x9c\x11#\xd1g\xbd\x9f\x96\x98\xffl9\xe4\xe6\x81w\x181\x10\r\x8c\xfd\xcaTT/\x0b\x14\x8d3\x9an%\xb9\'\xce\x9d\xfeU\xa1\x07\xcbz\x17\x85\x1f\xf8\xd8\x84 \xcc{\x12Q\xbd\xce\xa3\x9a$%\xf3i3\xd8N\xce\xfc1\x12\xe5M\xee}\x0e\xed-JLxz\x02\xf3f\xb5M\xd6\xbc5\x8eK\xd4\x97I\x8f\x86\xa7\x87\xe6SiKb\xf8\x87\x96#\xa0\x8d\x19|\x87\xeb\x05\xb1{y-\xbf\xf1L\x1d\x06\x90\xf2\x1e\x1e\xdd\xf4\x01\x0f:R\xaeE^_\xb1\xd5\xa7\x1b0\x86\xd5\xad\x96Z\xfbr\xd9\x1f?\xfc\x91\xf9\x957\xc2\xab\x8f<\xc0/\x14\x1a\x932/[\x87\xaeE\x89\x82!*\xf7Tp\xed\x1f\xedw\xda,l\xefJ}\x080\xea\xd1f\x161\xcd\xb4\xea\xc81\xf2\xb1-\xf1[\xf4ZWV\xef\x1a\xe2s@(\xc5G\xf7\xa9\xf0\xf8\x1b\x19@\x07$\xcb\xf3\x1e\x1aG\xda\xcf\xa1Nu\xa5\r\x1b\xd1\xf19sR\xc6l\x87F\xea\x8aR<\xc8\x1dN\xdfB\x00K\x12\xd5\xa9!-\xb5P\xf0\xc9]\xccO\x1c\xcfx\xc0\xe2)\xd6\x18\x9b\x87S^:\r\xd7W\xdc\xd0\xd0RS\xe7\xb3y \xee\xce\xfc#\xc4=Q\xaf\xefE\xb9"(IJ\xfdO\x0b\xb6\x1d\xff\x9d\xf1\x01\xa4\xc4\xc6\xce\r\xbf\xde\x04\x87}\x8a\x1a\x9e\x9d\xd8\xd1\xfbR\xc6\xaf\x14*H\xab\x8b\x1c\x1cR\xc3\x9a_N\x85~\xc7P\xf6\x01\xea\xa1\xa4\x86\xed\xa5=\\.\x05?>\x89\xe96!\xc1R\x19<\x0f\xa4K\x18o\x10\xd9\x1f\xfc\x1c\x886\xcc\xc3\x19%\x14\x11\xa7Q\x86y\x86\x9d\x95\xce\xc8\xc5\xaa\x9c\x07\x7fj\xbf\x81\xd9\x8efE\xad\'\x95\xfe\x9e\x93\xed\xb7\xca-\xd3pi\xb9\xa6\xdd\xea\xfe\x03J\x8f\xcbu\x1c\xa7n\xea\xf4l\xb3\xa2[\xe0\xc5\xf3E\xbf\x9e\x89\xc0\x8a\xa2\xae#\x91\xd2\xba\x15~gTFW\xb0,O\xa4U8\x9d\xbb@g2<\x95\x7f\xdd\xe6\x08\xb0pr\xce\xf1\xfe>\xfbpG\x83\xb1\xc6V\tl/\xb7\xc38\x7f\xcf\x97\xc4B\xd8\x0c\xae\xf3\xd0\x00+i\xfbc\xd03\xda\xa0\x8c\xa58\xb9$?\x85)\xc7\x8c\xea\x91|\x8eE\x84\x96\xdb\x90-/g[\x94=\xb2?\xa2\xb8\x13R&p\x1e\xa3\x83xc\x135\x92\xaa+\xc1S\x90\'\xc7\xefw\x99\xd56\x17\x00m\xf9\x8ad\x13$\x17\x85\x1b\xb0O\xf4.\xc9\x94\x80\x9f\x8ak\x95Q\x84\xeb\x04\x9c\xdab\t\xaf\x84\x05\xf8D\xc3q^|\x85\xd0\xc2W\t\xbco\xdc)\x9bR\x12\xd0\xab\x03O\xdc\x05%\xe2\xe1\xb6\x10P\xe0\t\x03\xb6\xec\x00\n\x9e\x96\xb1\x18\xc7\x91\xbf{\xcd\xa2\x0czc\x9f.\x87\xe4\xa80\x811\x94\xbb\xe7\xbc\xf0L\xcc\xcb\x19\xc2\xeb\x87\xcd#\xca\xf8\xb42\xd6\x96\x96`@\xa2QW\xe4\x8f\x00&{\xc1\xb3d\x81]\xa3\x96$\xdf_\x01\xe6\xadW!2c\xd0\xde2\xcb\x96N\xfe\xfds\xf2\xdf\xb8\xb8\xfa_c\xeb\xa2pa\xb9\xdc(\xafUe\xcb7\xda\xea\x11\x98\xbc\xd2[t\x01\x03p+\x0f\xe5\xd4}\x17\xfe\x03\x1e5\xcc\xdf\xf6_gn`\x0e\xa6\xeb\xcf\x80\xe7\xa0\xb7\x19\x89\xae\xda}\xe0Bm\xf1\xa0\xa8\x92\x15\x81H\xc6\x06M\x9c\xc0\xdc)\x8d\xee>\xb7S_\xf8\x97#\xb3sA%"\x87/\xdc\xb7\x14\xef\xb6\xa7\xb7$\r\xb6\xc9a\xfc\x14\r\xe5\xcby\x1b\xf1n\x8a*\x9e&\x80Kr\xdd\xa5\xf5m\x9c>\xc2L\x0b\xcf\xe8:\x01\xe1\xdf\x13\xa4\xc4\x89\xcc\xd0V\xe6e\xbb\xe5\x88\x02\x89<E\xad\xb1\xd3&MR\x8c?\xcb\xe5\x19\x95\\\xbf\xf4\xc9\x0c\x11"0\x1aG\xc1$\xcdG\xd8r\xafGn\x91\x8c2\x16\x82\xe5e\xc2\xf6\xbc\xe8|\xc0\x06\x7f\xe7\x08\xc2Q\xee=\x9a2`j\xc1\x86\x84\x8a\xc1\xf5>Hz\x17Hr\x00\xfb\x06N\x07\x17b\xd9\xa6\xc7w9\x16\xaa\x8bca\x0e\xde&\xa2\xd1\x1e\n\xe3v\x8d\x89\x0e\xc2\x9c\x81\xe9`\x99\xa4\x03\xb7\x87\xb0<\xbd\xe5\xa8(\x8eA9T(\xad\x08\xc0\x05:\x0f<\xd2\x1e\x8d\x00\x03<K"\x93\xf4\xbb\x94\x14\x96\xae\x90\xec\xe9\xea\xa1\x98\xd1\xf9\x8f\xf6\xeb2\xc2\x1e\xb4\x92E\x8e$\x0f,\x8c\xc3\xdey\x1d\x9d\xc6R7"\x9e$\xda\xcc>-i\xf1\x8a\x1a\xcd\x98\xe7)\x06\xb3\x06\xaaB4K{\xf7\xdfe\xcd\x0f\xf1\xb8\xa8\xcc?M\x84\xf7fP\x86\x86\xf57\x01\xdb\x96\x00d)\xd1s\xde\xdfhOk\xe7\xaa\x06\xe4\x7f\xa1\xfe\x02l\xd4\x12\xc6\xbd\xff\xfcLm\xaeJ\xc7\\\xa4u\\8\xaf\x8cC\xfabG5\xe2\x8a\xf8\xeb\x9e\xb1\xbb\xbf#\xe4m-\xc1{`\x1f\xecb_\xe4\xc3*\xe7\xee]\x80\xe5\x17\xbaQh^r\xd3\xce\x1b\xf2i\xe7B\x0f=\xffa\x03ja\xfd\xdbm\xf4h\xfe\x9d9\xc5\x88\x1b3\x87\xff\x80\x9e\x9a\x8d\xcai\x10\xee\xb5\x8f^\x92\xb9\x86\x02\xa8\xe7\x01\x8f\x94\xcc\xcf5\x156\xed\x95\x8c\x8d\x89\x9b(X\xca\xf1\x86\x01\r\r\r\xb5\x05\x7f\'\xf5Z\x00\xa6\xb8"\xe1\xb5\xa5-:s[\xa7\x8a\xea\xae\x94\x9f\xb8\xff\xf06\xb9\xbe\x12\x08\x90\xdc\xc2z\n\xbc\xe0\x92*\x98\x13\xa1\xf9\x95i\xccaD\xf1\xb7\xc4\xcc\xda\x00\x88\xf4d\x7f\x85}y\x85s\xec`#\xf4\x14\xb31\x01!\xc0(D]m\xfd\xa0Oq\x08\x91\x02\xcf\xc0\x10Q\xcf&\x9c\xa3\xbf%bQ\xa2\xd7S\x93\xd2\x01\x96f\x107mps\x04\xf3d\xee\x01{?o\xbalY\x1e\x1f $T\xe1R~\xbf\xe9\xdf\xbd\xa6\xb8\xf9w\xe5>\xa0\xabP,#Da\x8f\x8e\xa9\xf1u\xc4]\x1f\x0c e(\xd3\x83O\x97\xb6\x98\xe2\x90\x86O\x8a|\xf3\xfeP\x89\xd7\xdf\xfc;\xa0\xfc\x89\xcd\xfa)\xb8A\xf2^\x11"\x0b\x16xE\x16\x98\\Z\x8d\x86\x85P\xe9\xdb\xec\x98^\xc29\xe9d{\x1d\x9c\x9b\xc4\xc2P2w*\x11\x8for}6\xf4\xfc\xa4K\xcdj\xe2_\x03^^\x9c]ad\x9e\xd8jL\x1a\x8b \xb7#\x00\xb0\xd0\x9c\x85\xae\x7f\xa90\xc6\xc9\x04o\xfbY\n\x8c-\x16\x12.\x84\xad\xa7\x7f\xac)\xb3\xf3\t#\xffpTH<8\x85\x91w\xc0\x93\x04Uh\xcb\xa5)\xafl"T\xcd^\x0c\x81h\xef\x8d\x01\xac\x06\xdd\xa6"lw\xff~C\xa6\xd4;\xa8ZC\x8bl]`\xad\x04v\xd6\xc7\x02\x05\xfa\x14\xf8&\xae\xe1\xc4\x00?\x07\x02D\x83\xf3\x90\x96\x83\x11\xa4\xb4\x89\xb8R\x17\xf6p+\x99=r\xfb\xabG\x19\xb2N\xfd\xcd-\x1fo@\xcf\x7f\xc6.\x0f\xbc\x81\xc1z,L\x84G+\x03\x88\x8c\x11}\x82f\xc4\xe7g\xf7OK\x08\x91\x1e1\x1b$6\xd8\t\x05v\x0c\xe8*\x8e4\xcb\'\x06\xb1W\xb6\xd5\x17\xa9+g\x85u\xec\xbb$@jL\x04\xaao-Y\r\xfd*\xd0\x8e\xa1\xcf\x8d\x8b\xfd/\x11\xb5\x8c4\xb61\xb5vL\x11%z\x80\xd4o\x02\xcd\xc6\xf4\xeaQ5X\xff%\xe3\x19\xf5=\xc3*\x12\xbb\x01\x95B\xf8\x96\x83\x0f\xc2\xed\x17\x97(/\xd7Qp?\x0eH\xaf*\xc2L/G\x07b\xf5f\xf2g\xfcx\x8a%\xcfc*Z\x1c\xbe\x98\xff\x94\xf8\n\xd8\xc3\xb9\xa3\r\x91\x93\xb3\xfc\x0en\x15\x80\xdc+\xc4:\x0f\xb6\xd9\xe1\x9e\xcbJArWiB\xe0u\xe3\x93xn\x0e\x08q\xbe\x93\xde\x83\xb4\xccZG\x06l\xb3\xbde:\x96\xed\x8e\xf9D\x92K\xc5\xe1>@#\x03\t\xe0@\x03\nk\x95&?\x07\xd7\xf9g\\-\r^\xb0\x93\x96J@\x8eU\xc7\xbe\t9\x8d\xff\x99\x8br\xd4\xff#\xf4p\x08\xad\x07\xff\xb6\xb3>0\x9a\xb2\x0f\xf9\xb4\xdb5/t\x07\xe0\x0f\xfez\xa4\xcc\xa2\xf2\x88\xf5\xe2\xe3\xd4\x98\x95\xe7\x08\xab\x93\xf2\x85\xe8\x87\xdf\x8cz7\x8d@\nPr\xf6\x7f\x03Q\x9d\xb5jvf\x87?\xba\x91\x0bps\x8e\x7fS\xc1\xda\x18O\xeb\xed\xf3L\x8b\xd0d\xea6\xb9f\xb8\x0b\xe3L\xc0RJ\xcam\xe5\x17\xed7\xdf:\x10\xe3\xf3\xcc`\x0b\xf7\x1f@\xa6%l\xbe\xa9\xbd\xed*\xe3C\xbd[\x8f\x0e\xdd\xd7:\xeb\xbb\x1c\xbe\x93\xd6\x8c5Dt.\x8c\x08\xa1\x05\xea0)\n\x1d\xee\xd4\xee1[Pzg\xc0\xc3\x86\rZ[Y\x17Wt\xab\xce\xb5\\\xa2\x98Di:\xe8nb\xea\xa6\x00\xc3\x86\x0f\xfd.F\xad0o\x96=\xee47\xaap\xbe\xa5xE_\xf2{\xd5\x86I\x0cF\xb8\xe6\xabtD\x9f6^\xc0\x7f\x9f}q\xa4-C\xb3f\x15,\xd5\xf7\x87\xc5WO\x07\x84\xac\xc2|\xea\xecjE\xb9\xc1\xf8.rb\x89\x07H\xbd\x85\xba\xda\x0fU\xa6\x87\xd8\x07\'\xe2N\xd2\xa1_\x95p3\x0b\xe3;$\xd0\xb3\x8f\xd7Q\x9f\x1e\x0f"48#\x0bQ;\x0b\x82\t=\xc8d\x9d\xdc\xd7\xc4\x9a\x96\xd8pjL\xa3\x92\x1cb\xa6\xd4\x8e1\xe7\xa6\xdd\xf6\x18{\x98\x1b\xfb\x15\xa4;\x88\xd0\xfc\xb7\xd4\xe5Z\xa3\x05xdW\xf5\xfaE\xb4\xf5\xbcM\xaa\xae\xe8\xf1\x1a(\xe0\x0c\x87\xd3\xb2\x7f\xba07\xa9z\xdd\xd3\x87\xa8\x9b\x92\x86\x95\xff\xa0\xd92QMG\xb5\xff;\xe8o!x\x1f\x0f&\xa0\xe6\x86zty\x98\xce[\x88\x91\x9ex\xc7\xa8{\xc8nG~YwqN\xf8\xec\x88e-\x95\xbf\x1e\x1bB\xccY\x81`\x89\x07\xdd\xbc\\H}]\xcc\xab\x9a\xfa\x96\x9a\x87\x0c7\xf3\xbd\xa9@jPRZ\x08\xfc\xb3\xf8\xbcN\xca0BO\xb8m^2\xee\xee\xa7\xad[\xb5\x9b\xad>\xbb\xcc\xf9\xa7\xba\x93\xd4\xea;\rPmf\xaf\x94u>,B6h6\x88l\xf5\x96\x14\xd0\x8f\x89YA\xd9]h\xf1c\x0b\x94O\xccb\xe5\x17\xc3\x8b\xbb\xba\xda\x01\xc8\xcc\xcc{\xe1{\xd8z\xb0\xfb\xac:c(\x91\xeb\x97\xfd\xbc\xb9^D\x89\xfb\x17@\xca\xe7\x80\xbb\x1f\xfc\xe6\x98\x08\xcd\xb2\xe7\xa6\xceDm\x05\xbc`"\xae\xfbA\x15YcyS~fty\xa2\\\xdfU\xc3\n6&\r*\xa0\xef\x83<\xac\xe7[0[TC\x9b\x08\x9a)\x9f\x06\xab\xbd0\x1f\xbd\x88?\x14\x84,\xf5\xe2\xb2\x19\xda\xb7\x06D\x98.+\xe8J\xfbf\x97\x90\x86/y\xfc{\xdc\x96\xd5CT<u>\x9d\xe6BD\r\x9cK\x01v\x08Nt0d\x1b\x15Z\x8a\xb6\xd9*\xd2&\x02~\xa3\x1c\x7f\xaaQ\xa8\xf2P\xf4E\x81\x06\x86L=\x1c3\x17\x8f\xc4\x17\xf9\xcc\x19Tq\x84\x9d\x97\nv|\xcbAw\x10\x17c\x9c\xca"\xe1\xf8\x14B\xce\xfa\x94T`;?EY\x80p\xc0\xa0\xd1<5\xdb\x90fA\xdf\xc7')
|
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\x0b\x00\xa7\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xb6!\x00\x00\x12\t\x04\x00/\xbdjU,\x9d\x1d\x94\xcf\xfb\x81\n\x971t\xb6\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x7f9\xc2)\x007 \xf8\x91^\xdf\x12\xcc\xe2\x7fN\x89re\xd6X\x86C\xb7\xf3\xe7v\xdeM\xd6\xdb\x83\x12b\x0cG^\xf7?=E\xc0=\x1e1\xc5B\xe2=(\xca\xbf>\x89\x88\x9eL\xe8\xd9\x02b\xc9W\x06\xcf\xd3\xa3M"\x97\xf86\xc2Soi\x02\xbe\x89\xe6\xf8+s\x80\x9d\x9e\xaf\xd3y\xee+4\r\xbd\xb6@\xc3\xab\x02 `2\xc3\x01\xad5%\x03N\xd6\x16q\xf9L\xa7\x93\x8eU\x84\xaf\xaf\xb04\xb3\xfe!`\x87\x82H\xedRM\x1f\xa4\x9f\xf5\xc3\xd2\x84\xcb\x1eU\xf2\xc7F8\xdb\xbd\x03\x1b\xf0\xb3\xe0d\x8aQ\xd5PD\xe7xY\xacu/\x89\xd6\xba$\\\xder\xee\xb9\xb7\x87\xb4\x16\x1e\xc3\xce\xc7\x8a\xbb(\xcb\xd09\xd5D4\xc0\xa1\xf5x[\xdb\xd8\xfd\xf1\xbac\x1b6\xfd\x93"\xf7\x80\xc6\xbcB\xbaB\xf8\xf73|,\xaa\x9fh\xc5\xb34\x055\xef\xef\xa9\x8e\xe3\x9a\xb0\xdd\t\x91\x0e\x169S\x9aBZ\xbd~\xd7\x03q\xb0\xaf\x8c\xcf-\xf4rk:\xce#\xc46\xacF`&\\\x9a\x1b*c\x12\xa6\xe9\xe6\x92\xb5\xfe\xefTNL\xe9\xe5\xcaVo\x8d\xf7\xd6\x11\x8d\x17\xdf\x85\xee\xbcx-\xd5#\x11\xad\xb7~\xbc\x03\x83^\xb2\xee\xd6\xaa\xec\xf4\x98\xb5\xb4\x101\x9b\xc9\xa8\xf1\xab\xe6\x1b\xc8\x1cY`a&\x87\x0f\x0f\xe9,\r\x9aE\xablv$\xbbz\xe30\x8b\xd1\x01\xdd\xcb\xaa\x92\xd5&\xf0j\x96~\xba\xf8ud^F\xbc\xc4\xae\x152x\x97\xef\xb1\xddV\xf3Z\x1f\x9e\xf3\xbc\x1c[q\xce\x1f[\x1a\xcc5\x17\xcfP\xc6\xb5\xf8Z\xba@\r0\x1587\x02\x0eE^I\xac\xd2%a\xd1\x88\xa4\xb3s4\x94eC\x0b\xa4\x84\xb6\xc3\xd1\xd0I\xd1\xe5\xccL\x98\x07|\x9f\x96\xfem\x16\xf8n3\xfa\xe0d\xcd\xb8\x12\xe2\x1e\xc0\x9c\x83\x04H\x882 \x12\x83\x1cqXn\xe1UA\xdd\xdeU\x98 \xb6\x90=\xfb\xfc\x12\xc5\xba\xf3g|eB\xaf\xb7O\xbb\x97\xa3\xa8\xb3\xf4e\xad\x8ac\'\xa9"8:zyL\x85\x02\x0c\x8b"ze\xe2a\x9f\x94\xa1\xaa\xac]\xfa\xb4v\xa6\'mO\xe1\xa9j\xc1\xc7/)\x83\xe4\xd6|\xa92DH\n1\xd8\xfad\x97\xed\xc3\x8f(\xb5\xb8eNP>\x86cr\xc9\xbf\r\xc5\xfc\xe8Ed\xf5t\xfc]fG\xbe\xb2Z\xba\x1c\xfd\xde\x85\x7f=\x0f\xa0\'\xdf\x08\xe4\xe8\xcb\x0b@\x1a\xb93\x82G\xfdW]<\x0f?\xf6a\x14\xa1\xf6M\x83\x98\xd6\xa7\xe28SN\xfe\xb4\xcd\xbd""n\xf5\x9f4\xe6\x11\td"\xb6\xc1\xe1\x11s\xdbS\x0b!\x14\xe2\xb34\x1c\xa8\x95\xab\xc7\xc6)\x05\xbd\xff\xad\x9b\x13*\x82\x85\x0b\x9e\xad\x01\xc7\xb792\x06\x9b\xac\xcdKr\x90T\x0c\xa8\xbdX\xc5\\\xf2\x03Y\xe6-\x86\x88\xac\xe6\x84y#\xbe\\~f\xc8\x06\xf1{\xd0o\xd9\x8c\xb1\xd8\x8c\x06\xc9BwC7\xc8\xf5\x15\xcc\xa9\xa2\xb7\xafo\xa0K\xd6k\x88I\x99\x84\x8d\xda\xe0.\xafC\xea\xd2\xf6\xdd\xa6\n\xa0\xc1\x92\xc0n\xd3\xd0XI)\xd4\x83\xd1\x03\'\x06w\xcfR<\x1d\x7fE\x03zG&\x0f\'\x13\xeb\xb7i\x07\xc5\xed\x1d\xef\x0e\xaem\xf6\x9bA\x8f\xd2\xc1 p\xa8,j&\x0b!\\\x07B\xb8\x8b\xd2\xf8Y\xc3\xec\x12@g\xb3|[\xe1\x1c6\xb6\x1e\x16\xad\xb9\xf6\xec7\x0f2\xe4\xec\xf685^\xbebj\x84\xb7\xbc\t\xeao\xed\x8a\xd4p\x97\x00O/)\x00\xa7\xeb&~\xbb\xe87\x03\xe6\xa1\x8e\xf2z7\xb0\x9dg\xbd:\xa8N+\x1c\xed\xf6b\x97\xce\xd2u\xe0d\xfc\x89\xe3G\xa3\xf6S\x0e\xfe\xff\xf9\x15\xb2\xac\xfe\xf0\xde\xbf\xa1#\xb2\xf2\xc2\xd4S\x181\x8a\xdc\xac\xfc\x14)\xae|t\x9b\x0e1A\xc2\x01\x93\x06X0]\xbe\xb2\x023\xdd\x10\xffGo\xc9sN\xeeb\x12\x92\xed\xed?\x91\xdc\xf4U\xac\x01\x00\x00\t\xd6\x94\xb9\xa3\xc6a\x0cq\xa9\xc7e\x06\xd2\xf7j\xf2%\x16Gb\x08Kje\xefB@\xc8\xf9\x12\xee\x14\xa1\x9e\xdd\xaaU\xa9\xe56\xaf\xb2\xd3w\xa4. \x97\xa3\xbb\xf6\x8e\x993\x90^\t.{I~^M\xbe\x85g\x8ff]\x0c\x1e<\x17\x05\xeah\xe4s\x8b\xbfVv\x9eU%\x90>\xebc+:\xe3 \xd8\x17\x03Sk\x07\xb8\x7f\xeeZ\xd2\x91\xe4n\xbfP\x86\xd2\x86\x90\xe5\x0fX\xd6z\x1f\x85\xd7\xb1:\xdftj 35T\x80+\x84Q\x0eE\x1e\x90\x07\xd8\x80C\xe2\x1fT{\xe4\xa7\x93\x00\xd8l\x16{y\x9d\r\xd1\xe9\x12A\x8bEO\x16\xa1\xc0Y\x9d\xef\x89E\xca\x10\xa0h0\xd3\xf42\xc7L\x8f\xe6\xbf\xe2\xfd\x02x\xa0g_\xafK\x1b\xa22Q$F\xb5\xeb\x94\xbc\x19\x8d\x91\xe6\xed\xfb#\x04v\xe1E|{\xcf\'n\x01\x08@@\xd36D\xdbg\xffV\x8dOy\xc6\xc3R>3\x08y\xc2*\xbbs`\xfa\x05K\xb6D\x0c\xad\xb0\xca\xd7\x1e\x98`\xe0U\xa3\x8e\x1d*\xf9\xc5\x7f\x86\x00(\xdap\x8b\x1b\xecp{\x1b\x90\xd9\xce\x95\x96Ce\xed_\xdb\x00n\xda\x85\x05-\xb5\xceN(R\x9d\xd1.\xc52\xa4v"\xa5\x01\x05\xdfx\xa3$\xc7\xc38\xd7\xfd7\x9d-ta<R\xae\xbb\x16\xff?\xc0\x1c\xca\x0e\x94\x0c\x10<\xf1u\x1c\x84\x92\xb8v-\xb6%\xc7\xfa\x7fY\xe1\xf8\x1bb\xb9r,T\x92\t\x94\xa3!\xd7\x15a\xfb=\xbf\x87\xd6\x88\x06\xd2O\xcf\xede\x1e\xe2G\x13\xc7\x1f\x8fZ\xbcO\xd6\xb3%\xc5u\xces9\xca\x800\x10\xfc;\x87\xd0 \xe07++\x9bq5e.\xee\xa8\xe9z\xfaD=hF\x7f\xfa[`\x84\xaa5\xe2W?\xcb\xc7\x17D\xd1\xd1\xd1\xa3v\xf65\xed\x928\x84\xc4\xd5-~\x8d\xd6\x1ej\n \xe7=\x96\x9d\xea]\xbd\xf5\xab\x899\x1b\x18\x14\xde\x98\xe0o\x0f\xc1\xbd\xe15\xe9\xe5\xec5\xe3\x99\xb9\x1eF\xb0\xb0F\xe3V\xdb\xdc\x1b>\'\xc35=N\x07\xc2\xaa\xd0\xd3\xff\xa9\x12\xb1\xb6\x15:\x95\x81\x083\x03Vb\x1b\x8d\xbe\xf5,"4\xdc\xb7\xab\xac\x04\xc0\x1e\xd1@\xd6_\xfd\xaau\xb2\x96\x17\xb6\x86\x95{\x9f\xb8\xd8=\xe7A\xb2z6E\xea\xe1\xe0\xd6D\xf9\x15w\xb0f\xdd\x8e\x1cN\xfa\xd8\xdbq\xde\xb2,WOwa\x99\xf7\xca\x0e\xfa\xe9\xd8}\xf5\xe8\xb1nk\x7f\xa3%\x19M${\xc7#\x1c\xf7\xe5\x94>\xdd\xd8\xce\n\xb1\x01\xfb\x1d\xdc\x08\x07,\xf2\xb2zv\xa8\x994\xc2\x0bH\x00\x9a\x92\xe6\x8a\x14p~8\\\x80\xf5\xad\xdcnas\x14\x1cR\xe8\x1e\xb7\xd8167\xe5\xb2gL\x97\xe0\x03j\xde\xc0\xaca\xf8o\x81\xb9\xcf\x11\xb6\x11\xa4\xdf_\xef\x90\xfb0\xb2U\x05emd!<\xa4C"\rA\xb5?4o\tj\x07\x8e\x9bKh\x07\x87\x1bIO\xcer\xb515\x08(\x16\x1f.\xd5\x95\xfd\xcd\xcb\x13kw\xf7{D\x17\xf8%\xeb\x1a\xc4\xc9\xa3kA@\x866\xf2\xd7|\xa9o\xa0\xc0;6z\x95\xb4t\xb4\x0eD\x06*q\xc5mI\x92\rQ0oi\x9b\x10\xfc,\xe3\x90\xee\xcc\x9aH\x87\x0b(\x7f\xc8$\x18A\xf8\xf1\xa2jIY\x19,\xcf\x08\x90(\x05\xac\x83\x03V\x0fl\xc3N\x00u\x1d\x0cSZbu\xed`x|\xc2\xe35>\xa4n]4u\xb1\x86\x18\xb5"\xa1\xf7\xec\x00t[{\x82\x0bE\x9c~\xf8\x1b\xa4l\xd1E,\x9b\xdc\xf3\x81!N\xafc:p\xf2\xcbn\xb2\x97\xea\xe7\x0bl\xcc\xe4\x8a\xc5\xb5\xa5l\t\x9fV\x86yk_\x16\xdee\xab\xc4o\xe4\xe7\x18c\x1df\xd3H\xc7\xc8\xbd\x9e)\xe3\x17K\xd6i\x1a\xa6\xb6\xbbSe\xf9\x9f\xa0\xfb\xb6\x91\'PAD\xa1P\x13<\xc5r o\x01H6\x89\xbc\xa4\x94\xd0\xfb\xd5\x9b\r)X\x8ciBg\x00\xb5\x982\x19?\xf1\xf5#I\x84E\x91L\x91\xbfp7\xeen\xa1\x99$`\x83\xb0)\xd7\xd2\x8a\x03\r\xb5\xda\x1c#\xba\xca\xed$\xa6\xbb\x1c\x8b\x97:g\x8d\xcbn\x8f\xc8\x04\xb2\x07\xf4\x9f\xe3\x12\x13\xdc\xe7\x8a\xccfg4\x81\tS\x1cj\xbb\xfd>d\x17k\x18\x1b\x15\x88\xc5H\x0f\x1bkU\x88-X\xc3\x1b\xd5\x9b\x02\x1c\xa4\n/-[C\xeeo\xdb\xbf\x02\xe9\xf9&\x08\x95-\x8e<\xc3\xff\rh\xf8\xa4Y\xda\x16\xcf5\xd3^\x1f@s\x98\x0bh\xc27\xc4h\xb48\xf5\xc3\xd2\x03\x15\xcc\x1e]\xf7f\xe3k4\x07\xbcc\xe2\x9c>a\xab\xe2\x10\x94\xe1b\x8et|H\xce\x88\xe1W\xeb>\xe6y\xf6\x01\xaf\xc5\xd6t\xc6q\xcb\xa4\t\xab\xf3\xcd\x9f\xba\xfdq\xb5\x8f\x8d@\x94Zc\x19Q\xd2}\x0c2F\x85m\xfa\xb7\xd1\xa3\xdc\xdc\xb4p4DY>\x95\x9c\xf7\xb6\xcfV\xb8\xafzS\xdd\xc5\xfa\x08 C\xa6\xe2S\x14#+b\xd09\xd4R\x82\x9a{\xc5+\xa5.\xaaY\xfb\xdb\xfa\x11`\x11V9\xdf]+\xdc\xbfi4X/\xf2ts\x9c\xdb\x80#\x18\xf1\x93Y\x9f\xca\x8c,\xb0~\x03\xcb\r\\1\x16\x9f\x91(\x1b|B\x0f\xcf^n\x9ep\xc8e\xeb}\x7f\xac\xbe\xc5LU\x1f\x96R\xfdx<\xc8k\xe6\'\xe7\xa41)To\xd8\xf9Kx7\xf12\x19\x95\xf1Q\tx\xa9\xac+\xe9p:z}-\x95 z_\x1d`\x11V!\xe9\x13N\xe7)\xce22-*\x01\xbaP\n\x1c`\xe1\t4ei\x8dJ\xb7\r\x1b\xfeG\xd8\xe2\x0c"\xcd\xaeW\xfa\xfe?=\xfe\xa5d\xba>\x93\x83\xd0t\xd1\xedh\xae\x8fq\xbc\xd8\rG\xc8B\x1a\x8c\xf4#D\xb2\xcb\xa2=\xd5X\xc4\x1b\xb7\xf7\x11O\xd5l\xad\xf0\xe1\xde\xdc/\x0ciG]\xe1\xf0}0\x99\xa8\x0fUb\xffx@\x08\xab:\xceK\x0c5\xa2D\x80\x1bv&~^\xf2i\xc3\xcf\x16\xd3.\xabo\xa4\xd1^d\x83\xb6\xff]\x0e<\x82\xbdBuk\xb7\xe0\x81;\x15\x87\xa1Ao\xc1e\xc8\xceX\x0c\xe3d5\x8b\xbe\xd5-\x15j\x14\xd3\xc5\x19\xd2\xac\x87n\x7f\x067\xc7$\x19\xed\xe6\xe4\x80\xb1\x04\x8e\xbaGz\xc7\xf1\xe9\xe7\xd7\x9a\xa6H\x10_\xd5`;\xe4\x03o\x17\xa627<S\x91\xa8\x89g\x1d\x92\xb1\xab\x86\x04 \x94M<\x19=\xfa\xa7\x19(@Y\x9a\xbe\xa4n\x0b\x00\xa0\x1a\x05\xf0\xbbwv+\x90\xe1\xb6!\xb7\x14jr\tQa%\x1eP\xbcO\x10\xd6\x1fh\xce\x94\x8d\xac(\x10\x01\xb4\xfb\xf2\x84%\xd8\xcc\xe9\x81L\xda\xf4:~yZ?^\tW\x91\'\xe5r\xb2\xff\xdc\xbe3\xaaS\xbf\x80\x81\x83\x8e\xfe\x9cfB\xe4\xec\xb1\\\x92E\xb5+\x85)`Up\x12\x15\xcc\xc9z\xff:\xa1B\xcc\'\x83\xf9&Mh\x91\xc9\xae\xf5r\xac\xbd\x13\\\xa7\xcf\xa5"J\xbc}\x95\xc1\x0b\xd9\x16\x9b\xc9\xcc\xed#\xdf~\xcc$X\x1e\x91\xb9\x15\x9d\x87\x07\xe2\xef\xa6)\x0c\xf1\xa8\xafu\xf6\xeeN\x01\xd6.\xb5\xd2K\x92\xc4\x98\xddi\xd3gv\x19Z\xb4\xda\xc6\xf6\x7fiI\x8e\xc8b\xa2\x92\xf2\xe4\xed}\xbd\x0ep\x18\xa6\x8d\xa9\xb4^\x85\x00\xdc\x93\x11\x8f\xf9\xc5\xef\x86\x823u\xc6\xf6J#\xcc\x94\x8b\x15q\xe1\xf6\xe6\t\xea+x"J\xdc&,5D\x1a\xb5\xffU9\x0c%\x84\x1f\x02\\\x8c-%\xe3\x8c\t\x9d\xb3\xb7\xaa\x98\x1eF\xc0V\x81\x18e\xdd*\x7f\xc8h\x0c3\x95\x04\x94 n&\x93\x1f\xe4\xbcAn\xc0\xe1\xd6\xd0\xd6i3\t\xfa$\xfa\xf1\xce\xdaI\xd2\x95G\xded\xe4\x9aop0\x96\xc4\x1c\x0c\x12\xc3\xdc\xa5\xa5m\x8b\x8b\xca-\xde\xff\xf4\x10\xecp<V\x10#\xeaV\x80\x19k0\xeb\x10\xb4HLc\x16\xf3\x86\xe8\x95\xea\x07\x8d\x04/\xff\x05\xa9\x0c= \xad\x85~\xc9\x85_K/Q\xb8\xa6\xd7$Lmt{^\x0c\xf4I\x88H\x8eS_\xb2\xd3\xc9\xc2y\x01\xa8\x82\t\x1dqJk\x8a\xef\x9d5\x7fk\xdb\xc0\xe2\x92c\x03xNk\xd4V\xa9"6^\xe2|v\x91\x17\xa9\x86\xec=1M\xc2]K\xd4\x95\xd6:\x14\x82n*\xda5Z\x16%p\x9c\x9a\xfb\xa0\x87\x7f]\xc3\xe6\xdaW \x0e\x7f\t\xe3\x84Y\xd1\xd1\xcao\xba\xdd\x9eF\x14\x97\xbc\xc4\x84\xd1cu\xfb\xa5\xf5\x9c\xaa6$\xdfU\x05\xd2\xe5\x9a\xeb<H\x89\x9cO\xfa\xdbU\xf7\xd5\xd8~\r\xce \r\xca\xfe\xce\x9e\xca\x940\xeb\x92\xe2\x94=\x94\x99\x8ftT\xccd$M\xb8\x94\xbe\x96\x92~\xe2\xcf\xe6\x05\x1a\x93n\xa0Q\xea\xfe5\x15l\xf1\xcd\xcb\xae\x0e\x0c!\x81\xf1\x11/hk~\xfcy\xe9\x8f#p\xf3\x90H\xa3\xdfCC.#L\xf7\xa6\x026\x12q\x80\xf0\xa0$t\xf6\xce\xe5\x83\xa2\x06\xbe\xdfZ\x06\x8a\\\x9aJ}\xf4\xca2\n\x98\xa6\xff:\x88\x05\x0e\x84T\xe5Y\x0fF\xbd\x02\xeb``\xa9N\xaf\xed\xa1\r\xcd\xdf\xa3s\xd5%"M\xe8\x13<LQh|\x13\x9eb\x9f\xe6v\x03\xe9\x02/l\x01\xd4i2\xd6\x16\x82\x83\xd2m\x10=\x07P\x18W\x01\xf8\'e\x01\xf9\xed\tV\x15\x04\xc8\x12\xf7\xc0\xf0\xc1\xfe\xecW\x95\xc1\xdb\xddD\xb82\xa3\xf1\r\x96\x868_\xb3\x06\xd3\x8c>\xc8\xf7\x15\x0c8\xb3tk\x1b\xe9`\x04dsBSz\xbb\xc6}\xca\\\x85#D\x85\x8b\x17o\x8e\x9b\x9b{\xd2X\xfb\xcc4(\x90\xc8\x88\xe5\x12N\x9ej\xc5\xf0\xf4l\tkX\x8f\xc8\xb2\xef%\xdf\x87\xcc\xb8\xa4Qc\xf6\x1ag\x90\xa3\xf8C\xda\xa1*\xcf1\x82\xe3\'\x18\xf1\xd1=\xe2\x16\xb3\xa6\x88\xdfE\x03\xd5\xe1\xcd\x16\xe7\xfe\x18s\xc7\xd1\x1b\x9b"\x9c\xc1yq\x1bB\xc2\x03\x16\x91\x9b\x91\xf7\x1bpR)B\xb3\xd7D\xa3,\x13\xd86\xc4\xb0I\xbf\xf9m~,\xb6Q\x9a\xe0=\x8d\x03\xd3\x02\xab:V\x00\xee/KGz\x12+\x82o\xcf\x03\xbe\xc0\xfb\xae\xedv\xa4\x08\x18+\xa6j`\x8f&\xcd\xdbn\x83\xbe\xec\x07\x91\x9d\x82A\xbc\xcc\xf9\xf1\xfa\xf2u\x02\xa9\xa3\x87Z\x0e\xa0hZ\xe2\x99\x16\xc7\x06\x11\x04\xf2\xad\x0c\xb1\xed}I\x8d\x05Z\x19\x94/\xdeb\xc2O\x9f\x08\x8c\x18\rm\xddz\xdaJ\x81\x80\xc0%u%!\xf2\xa7\xa1Nd\x0f\xbaF\xcf^E\xf7}@ZZ\xab\xadAf\xe3\x94O5\xa1\x0f}\xac\xe3\x8b1\x82\xb0K\x07\xc6S\x10\x1a\xb1{\x0c3f\xc5b\x14\x8b0\xa2\x01z\x10\xdc&$\xf0(\x18\x12\xd0M\xea.\xf8\xd5\xb4\xd1\xff\xe1cU:8\r\xcf~\xd0\x9a\xb6$\x80h\x00\xa4\xbc\xdc\xd0R\x98>W7\xe3[\xc3\xf3Y\xdde\xd1\xca".\x7f\xe4R \x0c%\x96b\x90n\xd0Us\xa4G\xd7\xe4-\xf9\xd3\xf6\\\x16\xea\xa6\x16\x00_(,\xf8\xe1\x9d\xa8\xb0g\x13!|\x07`\x0e\xbaDH\x98Q\xa7\x00v\x0b[.\xc0\xe2\xd7\x00\xcdct\xcej\xd1\xc5m\xfd\x92\t\xbf\xa1\x7f\xe6"\x80RbI\x8d\x85\x92\x98\xdbzA\t(\x14\xf3TY@\xf2Q(n\xb3\x9aSo\x0b\xd3\xcf\x80\xb9\xc1a\x10\x88\x95j[e\x14\x81\x80\xcc\xdc>\xb5""`\xbd\x9f\x8ax\xe09K8\xea&\x05\x17\xdb-\x0e#\xd6\x17\x1f\xb0\xf7\x12U\x1f\x90O\xecF\xbd\xd2k-\x1ep\xb8_\x8f\xbb\x89\xa4C\xd7\xc7b\x10\xb9 @\x06\xdc`+\xad7\xe1\xc2\x07*\x05\xfc(\x90\xeb\xda\xb7!\xe1\xa5<\x94\xa3\x8a\x83\xa2\xa55ErY\x88v\xd1\x9e.\xbff\xb2t\x0f\xa8\xa8B\x18\xbd\xb9JE\x08\xc9\x9d\x11\x99\x92^\x15\x95y\x8c$e>>\xb1\xb0\xa1,\xc8d\xecU\x92?\xa2O{U\xd3l\x82#\x01\xaf\xbf`\xac\x9a\xef\xf9\xd7\xebY\xcd\xa1\xea)\x18A\xf8M=\x81\x85\xa7\xbcZ`\x95\xf9%\xe0\x9d\x19\xa7`\x95f\x03\x1c\xbb!\xafq\xf0\x9c\xb7&\xfd\x03\xec[u\xb2\xe9\x81\xfdR\xd3\xf8G\x15\xf2+\x88\xc2\xb8\xcbG\x1b\'\xc7\x1c\xc9(LI\x18;\x96\x01\xc6\x93\xb4\xf6\x11\x9c1\xdbW?K\xfc\x13\xc3\xd1\x1c\xc0\xbc+YX\xa0\xcf\x9fwgc*\xc5\xfe\x86\xda\x88\xf5\x1d\xf0b\xc0\xc3\x161\x84\xf3\x85pr\xf6fEe&\xebS:\xc7\xe6\xe0u,\xdd*8RV\xf8\x02{\xba3\x08\xa7\x80\xa3\xfb\xf0\tV$r\xbf\xe0\xaek\xeb\xd0\xb5\xd6\xcc(z\x89t\xe6\xd7\xech0\xe8q\x10\xecS\x7f2\xc5\x16\x8an~n\xaf\r`!;7\xa3;Mc\xcd\xb1.\xd8\x94\xb0H\xe7\\Y\x148\xee\x9c\x9e\x14\xb8\xf2X\xaa$L\xea\x92\xa0\x90\x92\'\t~>@\xbf4\xb7\xfd\xa1\xb2\xe6\xebj \xf3\\\xc4\x9c/\xa0B\x17\xef\xb3#\x92\x8d\x99\xbdt\xc1xt\xec\xa4\xbe\xe9\xc5\x15T\xb8\x10\xa3\x10-\xb4\xfe\x1eF\xfd\xfc|\'\x99\xbe\x9d-ks\x16\xdd-uz\xf0M\xb60\xa4p\xc2\xb5\x94 \xe0@\'\x97\xba\xbf~,\xdc"\xd7>\xd0-\x01\xeb\x06h\x99k\\\x8d\x1c\xfc\xbeo\xd5\xfe\xead\xdf\xb1\xa7\xdcL\xfcf\xf2\x8b\xbcQk&\xbbT\xe1\xbb\xae@R\xde_\x9a\xb5}vr,\xca\x941\xbd\x8f\x0e\x0f8\x15\x1b*\x1e\xc7\xf9\x84R\x937\xea\xbb\xd4\xb4:nE$\xbd4\x97\xf4\x97\xea\x8b~p \xc6\x1d\x05f;\xfa\xca\xdcB\xaa\xef\xdc\xb6\x05^\x9eS\\3uCX\xaa(L\xcb\x14%]\xaaJV\x05&\x06\xa5a7\x06_\xf2>\x05\xd2C\x03M\x94\xb6~V\x94c\x89\xa6\x91\xa2\xe4\x15\xe3o\x00UE\x16\xc7\xf5\xc1\xac\xea\x11\xf4\xf1\xfa\x96\xe6\xc6\xdb\x1b*lc\xcc\xc8\xf5\x90\xbcM\x99q\x91\xbc\xe1R\x9a \x9e)\x95\x0e\xdb\x14\xd3\xf0Jr\x1c\xdbQ\xfe\xb0sx\xab\xc9\xda\xd9\x0c\xd3\x86\x9aBoV\xc7\xb6\xd4\xba\x97\xd4\x9bE\xce;\x08%!!E\xc8\xb0\x046za\x8dZh\xce\xf2\xbb\xc0\x92uv\xff\xdb\x0f\xebS\xe1\x01&\xcc\xa6"p\xe2R_\xf5\xd7Z\xb5:!r[\xa0A\xb8\xde\xba\x9cUc\x905\xdd\x08fp\xe7\xe3g"7\xd3\x0cy\xab\xfa<\x07c\xe9{f\x9b<\xcfax\xd4\xfaf#~\xd9~\xfd\xb1\xb8p\x9ai\xff\xb5\x92\xc1#\xad#\x18\x0f\xd4e\x8e\x12,Z\x0c8\\\x16\xfd`\x84\xa1\xc6v\x12\x9ex\xe4\x88\x1e\x8cu\xc0\xbf\xe7k\xa2\xb9_\xc0\xed\x8c\x80w\x13\xf1knA\x94\xb7{]|\xfe\x00\x8f\x02g\xb8x@G\x13-6x5\xd1\xdd\xd6\x8a\xe3\xc5\x99\xe6?cX\xb9]V\xc0\xb4B\xe6\x1cL\xc0\x10\xd4\xbb\x1f\xdd@\xe9\xdd\x19\xff#\xb9A\xb6\xdbm\xa6\x9d:F\x0b\xb6\xbb\xccl&\x85\xc1\xe8\x06RD!Q7%\xc8\x93\xe3\xc6\xb0\xa4\x10\xeb\x8eS\n\xb9\xa1\xce\xc36M\x97]`\x1fx\xc4\x89\x97\xa6\x00\x19.\t\xbf\xc0I\\\x94\xa5\x93z\x08\xde\xa0&\xa1#l\x91\x1e\x8f\xe4\x07\x02\xc7\xc6\xe9QQ\xfb{\x8f\xf4\xb6\x9b\xdc\x83\xe8x\xbb\\k\x97\xd2\x80\x14\xde"\xac\xaa\x16\x8fD\t\xa6\xc3\xa2\x1962\xe0\x83\xbe\xf6\xc1\x0b1\xdc\xcaV]S\x0c\x04\xde\x03\xae\t\xf1\xaf\xa5\xeb\xf5\xe9L\\\xc5\xe1\xb6\xf6\x83I\xf4\xfb+&\x8f \xf9\xcd\x82\x84#\xfd4\xa5W\xb0\xaf\xf9YT\xc1\xc3 \xc8\xb7\\7X\xab\x96Y\x93\x06\x05\xbf<m\x93\t\x17\xb3\xc3*h#\'x\x8f4\xbc\xb6\xe9C\x9f\xea%R+z\xb1l\x0e\x1e9Q\xf1\xbd]E\x0f\x8b`\xf2\x8c-4w\x19\xdewF\x8a\x02\x16|\x98\xbc\xa8=\t\x7f\xbc\x1c\xab\x9b\x91o\x0fXL\nb\xbe\x86=\xb8\xfe\x8bqs\x81\x96.\x0b\xde\xf0%>\xdf,\xdf8a\x92\xb6\xec\xba\x99\xe8\xb6vV\xe4O\x03\xa8?\xb7\xc5\xf8\xb0?u\x94\x81_\xe7\xfey/\xdb\xfea_B\xff\xc3\x85F\n\xab\x8f\xb4\x04Q)k\xa3+\x9cG\x11\xce\xe3\x90\x92\xb5\x89B\x1e\x85\xc9~M<a!][df\x0cL/\xabO\xa5@\x86G\xf76\xfa\xd7\x93\xb2wV\xddf\xbe\xb4\x92\x10\xa42\\\x15W\x1d\xfcU\xc2-\x93n\xbc\xa80hRD\xfa\xac\n\xb6\xe6\xb9\xbd\xe1d\x15-P\x98\xbaXt\x9f\xfa%c\xfb:\\\x13\x0c\xfc\xb6d\xe7\xe6K\x8dw\xff\x8f\xa7\x05\x05\xf1\xdfo\x1ec\x8dK\xe4\x01\xe1\x90\x11H@\x9e\xa2\x96\x81@\xc6\xf1\xf5\x86\xb4&y\xf9\xd6\xe9\xcf9\xc3j\x97\x86)\xea\xddr\xe5^ \xcex\x9d\x9f\x0c;V\xff\xfa\x1c7\xb1\xd7\xdaf\x83\xa1\xa5@\xf2\xec\x1e\xa8">X\xda\xcc\x9f\x1c\x9c)\x15\xeb.2\x89~\xac\xff\xf7cY\xe6~\x97\x8f\xb8\'l:\xce\xee\x1a\xfb\x14&\xb9\x13bpu\xc1\xdb2\xc8\x99\x8ekgx\xd9\xc1\xaa\xcd%\x94)\xe8\xa3\xd2\x8cI\x1crY\xbd\xbe\x13\x1e\x0f\xdbJ\x97\x90y\xac\xd4\x89\xcc\x90\xaffgP\xc5\x8f\x93\xaf\xdf*\xe4\xf2\'\xe3\\\x8d9\xa7\x01\x19&*\x7f$\x10@\xd9\xc1\x0c4\xf70\xf5\x1cL\x9e\xd7\xc4\x83\xab,\xad\x8e\x0c\t\x97\xda*L\xe1\xf5\tm\x0b\x80g\xab\xc7i\xf3\xa0\x129\xf9\r\x81\x8f\n:\xac\x9bY\xa5G\xe1\xa2\x1e\xf4\x17\xf0\xe1\xfc-\xa7\x90\x1a\x95W\xb2\x9d\xd2\x80s\x8bG\xbbg6M7x\xcf2?\xf5\x9eTHB\xfbI\xa7\xf5*\xba\t\x1b\xcev(\xe2\\\xfc\x03E\xfb\xd9\x82\x88\xfb`\x83e\x8b\xa4\x84\xf1:_\xa3\xd8\x8d\x7fe9\xa0\xff\xd4_\x0e\x9f\xa8\x9a\xe7\xee\x07\xcb]w\xb0\x0eWi\x82\xa8\xc4\xbf?\x8cc\xcb\xde\x90\x07\xda8\x83\x8bS+\x91@(\xb4\xcfrB\x93\xc6\x08\xc8\xd6+\xe9uwo"_\xc2\xb8\xeb\xc1\xec=\x12\x17\x15\x1c\xe5j\xe2\xa8`K\'\x99\xcd\x8d\x9a\x0e\xd4pG\x8c\xa8\xa9\xe2\x89\\upX\xd3\xe72\x1f\x03\x00\x1c\x076\x8b\xcc\x1d\x02R\x04\xa2\xb0\xd3\x1c\x1bo\x15L\xf3,\xc9\x8b\x1d|\xedG\x17$\xe7$!D \xcb\x88:\xbb\xdf!\r\xa6\xb6\xb7\x91\xca+\xf0\xf9Y\xe4`\x1b\x81\x9c\x11$m\xe1z\xdc\xc5\x8a\xb9W\x81\xa3!A\x8f\xf3?nP\xf9\xa2i$\x15\x8f\r\xd9\xeaXY\x80\xd4L\xc4)\xde:\xda\xab\xd5K\xba,%\x13+\r\x8c\xac\xe6\n\xcf\xc4\xad\xe9\x87\xac-y\xc2Q\xe7:>}\x86\x94\x11Z;_&rB\xac\xb1f\x10\xee\xc0Q\x13\xd2\xfel\x13.T\xbe\xe9\xc6U\xb0\xf7\xd4\xd1\xe0\xc0p\x99\xd3&-\x06\x13\xa37\xfc{\x08\x19\x8e\xb46S\xf3\xf3\xa9c\x90\xb4\xa0\xeb\x01\x1c\x90\x1e\'\xcd\x1a\xdc\x137m\xc07\xc3z\xd6\xeb\xd9$%d\x00\xba\xc2\xc9\xdc\rC\xd65\xbf\xf7l8\x98\n*\xd6\x06\x97f0\xbe\xf8\x1d\xb7\xa0\t\xbd\x06XL\x01\x8c\x94|\t\xf5\xaa\xd3\xb6\x8du\xdax\xc2\xa4\xf9`q\xd1\xb5\xb8\xc1J\xdd\x9051\x0f\x81\xbb\xa5\xe4\xday\x90\x04\xecD\xef\xbf\xa1Y\xf0\xa4\xe9\xa4\xdf.W\xe7?\xb2\x1c5\x12\x1f$]m\xa4O\xe7\x8bp)\x1d\xb7\x86Z \xfb_\xf5\xedi\xa6\xcf\x18?$t\xb7\xfdJ5\x9d\x91\xcc\x99s\xf5>\x13N\x9b[P\xb8\xc3\xfa\xe2\x89Z\xc3a\x05\xf6\xc6k>\xbc\xd9\xef\x87\x89\n\t\x06\xec\x84\xf5\xf4=;I\xc2\xf4\xf4c\x93\xa2\xfa\x92\x9ev\x838\x8c\xab\xaf`\x9f\xb8\xbbX1\xbd\xb5\xe2\xb2\xd6\xf3\x92\xe8o\xa7\x95\x12\xaa\xaa\xd8\x90\x93\x871\x9ao\xdd\x12\xd2\x10\\\xadF\x92g+\xb0\xa9G\xcbV\x14\x12%\xfc\xba\xea\x8d\x13\x18,\xa7\xa7\xc0\xe0M\xf2\x8f\x1fT\x94.\xba\xe9\xce\xab\x80\xb0=Lv\x11\xe40\xf5\x8a\xb5\x06-\x1d\x06[\x7f\x11r\xd3x-\xed\x82\x98Z~\x9f\x05O\xf0\xfcP\x0ec\x98\x0e\xf2g<\n\x9d\x87\xd0\xe0\xb7\xcd\xa9F\xe5\x97\xb9\xa5z\xae\xd5PF\xf3\xb0\xcf\x81\x85\xe4\x14\x8a\x19\xae;\x9a\xa2A\xcb\x08\xd6s\xdaPJ\x96\xaf\x92\x85RY]P\xe0\x13\x8e<\x13i\xaa\x08n#g\xb6\xe0d\xdd^\x18\xaas]\x8cw\x8d\xf6\xf9\x88\xfc\xbf\x80\x181\x90\x95\xa2\x0f\x83U\xaf\xa8\x0e\xd9R*^\xdaX\xaf\xb6\x84\x0b@p#\x12\x8bR[\x14\xf6\xd9G\xa9\r\x9e\xa9h1\xf0>t+\x19\x02yj\xb2C\r\x00\x9fz2\x99z\xf6V\xb2\xfb\x96U\x97\xeb\xf0U~K\xaf\x1fz0fc\x89\xb8\xcds\xea\xad;Dl\x0b?\xa4Pj\x1bq\x8c*\xa8\xb2|\xaewG\xcc\x1d\x83tt\xc6\xbd(\xaf?\x92\x9cT\xfbI]X\xc7\x88%\xb7\x04\x04\t_\xa9\xbe\xed\xd0\xa1y3C[\x90*\xea\xf3P,Z\xd0\xde\xd7>sK\xde\x06\x95\x8a?\x8c\xb2=\xc7\x99\x18\x85\x8c\xce\x0f\x8e\xd0?\x1a\x9b\xc2H\xd84K2-\x9c]\xcf\xe2\xd0\xa7\xc8/NL\xf3\x83\x1e\xbf\x1a,\xfd\x1d\x94\xaco\xe7\x9d\' \xde}\x84\x9b\xa5\xa4\x91\x85\xe3Ee\xc4\x16\xce\x11\xa1\\\x86E{\x98\xb6\xf4\xff\xf4\x01\x80\xa3\xae\xb2\x14\xa2\x97~z\x96\x1d\x0c\xba,\xf7?\xea\x84Y\xd6\xf0\xbc;\xdf\x8ca\x92\xad|\xbbU\xf7u!\x0eJ\x0c,\xbfR\x8bL-\xa1\xcdF\xab\xd1_\xa9\x1aM\x1f\xb9\x9c\x97\xb8 G\x9b\x14#|\x05\xeekr?\x05m\xee\xdd\x08\xa8\xac\xc0\xb9\xa2#\x7fsy\xcb\x11\xfb7\x0b\xfc\xbbm\xb7\x97r\xcbH\x00mzS6\x95#\x806U\x81~v^\xd1\xf1\x1f\x1c\xb7\x89\xda\xde\xe4\x85}\xdcI\xda\x02R\x13\x93\x81#Vh\xdc\x05\xf4dW\x05\\\xf2\x95\xa7\xa7\xcd\xc8\xc7X\xde\xb8\xf1\x94\xc8\xcag\x16I\xeeL\x18\xfa\xc5 \xdfc\x00\x1e\xdb\xae\xce\xff\xc65L\xe9`8\xfcv\xd5[\x9d3\xba\r\x9e\xa4E>9?\x8f\x88\xec\xcd\x1e\x13\x84\xe2\xdeCs\x96\x05\x1du@\xeaio2\x1d\xcf\x1c\xe2\x0b\x01H\x80\x06\x8c\x8ew\xf8k*\xa5\xa9F8\x14\x0bO\xc6&\xfa\xb4\x03\x08\x92\xb9B[\x97"\xb1\xf6\n]\xb0\xe1\xa8Q\x80\x89\x93\xc6\xd5@e\xc2\x9fu\x92\xe3\xdc*E\'7\xdc0\xbf\xafk\r\xdeScX\xf8\x98\x16\x8fQ\x94K1\xfe\xbc\xeeF1\xddA~WG\x1e\xbe \x1a\xb2H\x95=\x87\xb7g8\x05\xa0\xf2\x93\x95\xda7\xa2\x0f\xb9<\xbf\xf3\x8eA\x9a\x08m\xd9\xb2\x0bR\xc1X\x03xA\xdf\xa6\xed\xac#\x91\xb7\xeae\x17\xd8\xb1Aa\xb1\xf6\xded\xb00\x05\xcaw8\x89@\xdbF\xb6~\xcc\'\x1a\xcf\xb9\xa5Z\xe2x\x0f<@\xd6\x89\x14\xed\xc3n|?\xf7;\xc0\x167)\x1c\xd9\xec#>xU\xc4\x17\x1b\xba\xa7\x98\x06Y\x8d\xff\xbfw!\x83\x99\n\xaf\x14G#\xb0"\xcc7\xc2\x8f\xe9\xd6\xbac\xcc\x01\xd3G\xea\xb2\x8b\xaf\x1dA#T}*\xd3\xff\x0e;g\xb6Db_=\xca\x98P\xb2\xde%O@iV\x85!\xd9\x90}>:C\xf5\xa1\x9a?3\xc0\'\xff\r\n<_\x1a\x02\xbe\xe4\xa0\x96\xda\xa85,\x0e\xef\x1at\xfa\xd4\x84\xb41\x94\xa6$\xa5\x05\x05]\x0c\xa7\xcf<b\xe2\xa1\xa7\xd4\xe8\xc4\xfcAS&\x90\x10C\xf8\xe8W\xa78\x07v+\x081\x12\xa2\xc1\\\xb8\xe5\xaeBa%F\x08Knr\x9d\x92\xf5r\xa3\xea\xd5<\xfe;\xea\xbd\n\xbfz\xd5\xf9}8\tOF\x10\xe5\'Bk\x81\xe5z\xdfn\x86\x81\xc9\xa1<\x83\x9d\x03a\x19\xf2k\xa8\x1f\x7f\xbf\xfb;k\x82\xd3\xb2\x9c1\xa7\x18\x1aP\xcaJ\x81\xd2<\xef$y\x18K@\x88\x86\xab\xe8\r/m\x03\xe7\xacG\x03l\xc8\xfa(J\x11\x0e9C\xc6z\xb7\x0e,Y\x95\xf9\xe0\xfd\x8d~\xe5I9\x05\x8a\xd7\xa1\x16\x0e*]O\x8ev\x81\x9f1U\xa2\xb4\xcd\x1a\xd9M\xe1\xae\x9f\x82\xd6\xd4\xb6\xde\xb6"\xb2\xc2\xbe\t}`\xe8\xab/\xd1\xf1zj\x96\x96\xed\x8b\xc8z<\\GG\x05|\xafc\xe1u\xe8\xa9a5\xe7\xc1\x01!\xea}\x90\xf5hq\x16\xe1\xb4\tzA\xf0\x8e\xf8\xfc\xea\x83&\x0f\x03a\xac\xaa;\xdc+\x876\x0b\xfd\xf4\x13YE\xe9J\x8b3;\xd6\xde\xf3\xa4\x10\xe0\x11\xc3\xb0\x0b\xdd\x1eAC\xf4\n\x03L\xef\xbc\xdb\xf3F5\x13\xda)\x19\x15SA\x93\xee\xe8\xa7\x9c\xfd3p\x8e \rI]\x17\x10W\xfc.8^\n\xaa\x941\x7f9\x0c\x81j\xed2GueS\xa1\xc9H0?\xd3\x88\xbdY\x0c\x10:\x80\x16n\xbdX\x10\xe9\xcd\x0f\xa4\xb4\xfeF\x04\xad\xc2Xc\x06L|U\x92Wd\xc8[gD\x80^~c\xd5-\xa34J\x17\xf4 @\x97\xb2\xfe\x94\xa4\x9c\x1d\xc4L\\\x82\xeb9gc7\xeb\xfc\xda\x8b\xdc\xc9\x84\'\r;\xe5i\x01y37\xaa\xe1\xff\x87E\x00\xa6\x90^\xc8o\x18\x89H}\xdd\x9b>p\x87\x03\x845\\\xa17\xc1\x8cB\x93\xb4=\\\xf2\tf\x1b\xf9/\x99\xa1b\xaf1\xc7\x1c\xa5\x17\xe6t\xcf\xe09he\x9d\xc4\xae\xe1\xc2\xce\xfa\x89\x1b\xd2\xef\x17;\x0e\xe1\x9f\xa0Bp\x07\x13\xc7\xee}fu\xec$\x1c@v\xd3\xb5=)\xc3NU\x00\xa30\x17\xd2\x87\xab\xa9r6\xca\xfe\x95}(\xc0\xc0\xf2~\x94\x07;\xbf\xe0\x9b\n,\x1e\x1dn^\xc6oP}\x86*\x08\x03\xb6\xc41\x80\xd2\xd0\x0b(j\xc4\xad\xd3\xb9S\x8b%\r*\x85=r\x87.\x1e\xe1\x85\xaa\x98\xdf\xddk\xa9`M\xfe\xc2V\xd1"``j\n\x15h\xf4\xaf\xe5=\x8f\x93\xc9\xe0\xe3W\xa2X \xb4\'\xd7~*n\xde\xb4-\'\x88\xac\xb2\x08\xe3\to TNk\xa6|\x81p\xe9\xd7\xc9\x83\xeb\x1er\x81j\xa2\xd8\x1e\xef\xd8\'6\xc9\x90\x01\xd4|Jh\xdd_\xee)m\xdd\xaaD\x18\xcc\x8c\xc3\xd5^\xc6\xc2#\x92!\x80H\x1c\x90k\xfb[\r\xda\xa6Sm\xb5%\xcfBd\x10\x89#g\xdb\x7fE\x13\xdfA"\xcf\x82\xe2\x13`j:\xc7\x19\x0e[z;q\xc5\xfa\xc0\x7f>\x98\xecwa\xe8\xe0\xf2S>P\xcaU\xde\x97\xec\x9e\xc5T\x90\xb7\xd3\x83\xf6\xc8\x0eX\x8c\xc9\x16\x0fD\r\xd4\x8a\x92\xca\xad\xb3a\xe4\xf08y\x15S\xcc\nP?\xbc\xc5\x07+!\xab\x06\xd3X`\xf4\x89\xb9\xe4l\xb8\xaa\xee[_\x807\xe3\xad7\x81] \xbf\x9eG\x1b1\xb8\x95S\xf7\x92f\x9b\xa8A\xa6\xca\x93\xbb=\x1c\x1f\x00h \xed\xd3\xaa\xc6\xa9\xaa\xc8\xac\xf1*\xca\xcc\xad\xf1\xd02\x1d\xefw\x1d\x90M\x8d0\'X\xe1\xddm\xfa\xc8\xb8\x9b\x0ecv\xbfy\xa3\xe5\xab\xb4<\xd5\xb0\xfa\xf8\x8c\x05\xfb\xc2\xf4\xb4\xdeVN o\xcc\xc3\xde\xc7\xed#z]\x86\xc4T\x92W\xe2\x9a\xf1(v\xf2N\xea\x0e\xbbL\x00\xa0\x12=X\xaa}\xb4\x9ah\xe6=\xb0\xa8\x16\x9b\x01\r\xa0\x06|X\xff\xe0\x9cf\xc1\xfe\xf9L\xc2\x9ct\xedq\xdd0\xb5\x8d\xd2\xa5S\x0b\x80\xccV\x95\x14\x8f\x86\xf3\x11\x88Si:M=pm3.c:\xa2\xfc\xfb:\xc4\x1f\xbe\x97|\xb8I\xee\xba+\xd8\xb9\xfe\x92\xdc\x88W\x96u]|=\xbbZx41\xb8`\r\xb4\x8a\x02\x072\xf2\xdbk\xe3\xc4>\x96\xd7\xd7.\x9e6\xf6\xf6m%\xc6O\xf7&K\x1f\x8dx\xd8=\xeb\x8c\x19L\xe57\xea.\xc6o\x7fc\xab\x10#\x80\xe5\xc8\xb7\xf0\xcf\xf7x\xc4\x0f\x9f\xceA\xdb]\x89\x1e"6}\xf3`\x8f\x9d\xfe\x17|z\xc5\xb7Z\x06\x10\x15\xa0\x0cAo\xaeh\x7f\x8e%\x02\x9dv\xb8\xf4\x8e\xcazhk\x9a\xca\xc5G\xb1e\xfd\xbb3\xc4\x03A\xfc\xfd\xf0\xf9\xa4\xf1u\x87\xe8\xd3\xaa\x90\x91\n\xfb\xc2\xc7D\x91\x90"9\x9b=H\x9a-\xf6S\x9e.\xe64\xec.A`\xe6\x88\xcaV,\\\xf7\xaa\x04\xa0\x8c\x96I\x05\xec\x84\x95P\xbfJ\xc2.3Y\x13\x9b\xc7R\x9e\xd9\xc39\x1e\x8d\xdb\xdb\xbcQ\'\x02\\\xfb;\x8ay{Z\xbb\xab\x8ct.\x16\xd2\xa4\x87V]\xde\x15B:S6\xfar\xdc\xdf\xd5\x00\xda\xfd]_\x0b\xd1\nT\x92\x17\xba\x16f\xcf\xd4|\x1b&\x1c\x16\xc5\xe1\xe8%p\xfcB\xa4\\\xd9K\xfe\xcfH\xa5\xd9\xaei8\x14i\xbc,Y\'\xba8\x1aah<0\x9f\xed\xdb\xd7\xf9\x9c\xbc\xd8\xed~\xc4\xb1w\x9a]p\x07\x85\xd00yP\xf2\xf1\x99d\xac\x84\xf3xj\xe3F\xc1*\xb7\xe6mw\xae7\x9f\x98\x15\t<O,\xc6\x99\xc4lw\x96W\xb2\xb3*9\x9e\xc9 \x84WS\xdc\xa4[\xd6\xc3\x93\xccD\xcaD\xc5\x1d\xac\xd6\xe0\x0f|\x0e\x97\xbb\xb8\xe7\x86\x8f\xc0\xf2\x9d+<s\x18F\xe8\x0f\x1e\'\xf0\x86k\xa2\t\xfeJV\xab\xba\xf0\xe4\xb2\x83\x0c?Z\x89\x0c\xb0\x81\xc4.7W\x08e\x01Cj\x8c\x0e\\\xba\xe3qg\xee1`\xf6\x9e\xb9!ax\x1aPcE\x8f\xbb\xbfn\xac\xd0\xb5\x84\x12\xf2eP\xe0\xb01\x95\xa3\t\xaeC\xf5\x0e\xfe\xff\xcf%\xa1e^i\xc5x\xec\xa6\xa0\xe5\x96>xl\x98\xa7\x9d6r\x9a\xfa,=,\xc2"\xf2\x1d\x88\x86\x81\x8b>\xefy\x1dD\xc0\x1b\xadl\x96\xd4K\x93[\xa6\xa6\xf2\xff\xd8\xffVq\x8a\xbb\x8f2Q.\xaa\'|7\xa8\x7fM\xef#\xeeq\xb8\xdc\xd4\x1a9#\xbd:\xe2(\x8c\xcb\xbc\xccL\xf1\xa6h@\x89\xad\xff\x99/Z\x1avGEJ\xd4\xa3\x01\xe8Y\xf3\x91\'Z\xc0YL\xe09#\x9b"\xc1?\xfb\xc7\x04qFz\xf5\xbf\xd75\xa5\xe1\x91Z\xde\x94\xdc/*\x85\xf6\xf9\xcb\xfeC\xf8\x0b\xa1\xca\xb3\xd3\xac\x8c>\x99\xe9\x04\xc6\xa7\n\xea\x0e5\xd2\xe7\xa0\x8a@\xcdk\xbaj\x96i\xdaq\tp\xd3\xeb\xcbT\x11\x8e\x9dv%\xbe\x7f\x86A\xa5/#\xc9!D\x0c\rs\x12\xb2\xacTVL\x88\x17%]<G H\xbe\xb2\xb0#R\xe7\x86\x8a\x01\x07*\x08\xdb\xea\xead\x92\xc7\\\xe0\x83\xe1\x15\xa2;b\x14Y\xc3Eru\x82\x87t\x15\x96\x853<\xddp\xd5\x83\xb2\xbft\xd1\xae\xcc\x99_R*\x90\xd8\x91dT\xc7e\xe1\x80:+\xae\xd5.\xd6\xba\x81\x0ez\x86\r~\xb0Yw\xf9F"\xeb\xb4\xd6P\xa2\x98+\xce\x9fNY\xcd\x19\xa2~\tPqs\xb1\xf2\xc8e\xa3\xef\xe3\x9a\xb8B\xec\x88\x03\x1c*\xc1\x88l!\xdd\xb79\x05\x02\xa8\xd8\x10Y7\x81N\x9c\xca\x92\x9c\x0bl\x82u&\x1f\xe7\xb7n \xd8Mk\n\x94\x96\xdc\xc44 \'\xcfp\xb4\x14\xce\x9d\xfa\xa4w\xd5 ns\x0e\xe3w\xb6K\xfc\xba\xc4N\xaf\xfd(>B\n.\xc2\xce\xa2\x82\xa2\x9c\xd5\x1ba\xa8\xa3N\t\xa2`\xed\x98<3\xf8\x06\xb1:\x8a\xbd\xf1\xeaUyZ\xee\x8e\xcbaW~\xc2\x81\xa8\xe7\n\xd5\xc0\x00\xf6\xc0\x84\xffB\xb8\x06\xc0\x9d\\MM\xd8TC\x0b\\\xdf\xcb\xcd\xf1Lb}\xec\xd8\rAS5\xfd\x96H\xab\x1ai\xb8\xb3\x1b\x94\xaf\xba%yV\x9d\xa4W\xa2%\x0c_\x81\x91\xb0M\x08\x1e\xb2\x0e\xf1\xb1\x8e\xc3\x9b#b\xd1)h\xeeEIX\xd9\xef=\xe4')
|
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
|