hiddifypanel 3.0.0.dev63__cp38-cp38-manylinux2014_x86_64.whl → 3.0.0.dev65__cp38-cp38-manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hiddifypanel/Events.py +27 -4
- hiddifypanel/VERSION +1 -1
- hiddifypanel/VERSION.py +1 -3
- hiddifypanel/__init__.py +7 -3
- hiddifypanel/__main__.py +13 -3
- hiddifypanel/base.py +88 -3
- hiddifypanel/base2.py +40 -3
- hiddifypanel/models/__init__.py +10 -3
- hiddifypanel/models/child.py +26 -4
- hiddifypanel/models/config.py +105 -4
- hiddifypanel/models/config_enum.py +207 -4
- hiddifypanel/models/domain.py +106 -4
- hiddifypanel/models/proxy.py +55 -3
- hiddifypanel/models/usage.py +58 -3
- hiddifypanel/models/user.py +171 -3
- hiddifypanel/panel/__init__.py +7 -4
- hiddifypanel/panel/admin/Actions.py +170 -3
- hiddifypanel/panel/admin/Backup.py +80 -4
- hiddifypanel/panel/admin/ChildAdmin.py +122 -3
- hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
- hiddifypanel/panel/admin/Dashboard.py +70 -4
- hiddifypanel/panel/admin/DomainAdmin.py +195 -4
- hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
- hiddifypanel/panel/admin/QuickSetup.py +127 -4
- hiddifypanel/panel/admin/SettingAdmin.py +224 -3
- hiddifypanel/panel/admin/Terminal.py +51 -4
- hiddifypanel/panel/admin/UserAdmin.py +277 -4
- hiddifypanel/panel/admin/__init__.py +82 -4
- hiddifypanel/panel/admin/adminlte.py +13 -4
- hiddifypanel/panel/admin/commercial_info.py +23 -3
- hiddifypanel/panel/admin/templates/config.html +1 -1
- hiddifypanel/panel/admin/templates/proxy.html +2 -2
- 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 +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 +69 -71
- 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
@@ -1,5 +1,226 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00.*\x00\x00\x12\t\x04\x00\x16:\xc8\xd4\xd9\x1aB\x16\x97g\x1d\x866\xa6+V\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x99\nW-;\x92\xce\xc6\x97\xfcq\xa5\xa1\xb8\xc7\xd4"\xec\x00\xb7\xbf\xc1X\xa8v{\xdd-y\xf0\xedo\x83\x97\xad\x92\xe1/l\xcb\x8dI\x9b\x91\xcb\x99\xdbt\xb2(\xf7~\x9c\xab\xc1\xcb\xf9\xf7\xaf\x14F\x1b%\x94R\x9e\x18\x80>\xe7\x1c)B\xb8\xde\xb2\xf1o\xf2H\x14k\xf1R\x0b\x16\x90\xcf,\x0b\x90\xf8\x0f\x8c\x05GO(\xcbm[M\x87=\xd1\x1aCD\xa2H\xb7mx\x10\xb8\xe6\xf9\xbe|\x9b\x99,\\\x7fw\xd6\x19J\xefGrg\xdeg\x9fa,P)\x0e0\xa5\xce\xba\x0b\xc5\xaa\xf68\x81H\xcb\x8f\xd6.\xc2d\x87W$\x1f\xc8?\x90\x8a dA\x03A\x03\x97w\xe9\xe3\xb8\x0e.Cc4\x12%U\x83:\xceE\xd2\xeb\xde\x8a!\x17,\xffA6\xa6\xc9\x83j\xd3iW\x00=\x03\x9e4D\xae\xc5\xcbA6>\xdd\xaa%\xec\\jh*\x00\xaf\xe7\x8fpg\x93,7zz\x86\x8e+!.\x19\xb0\xc0\xa0\x9e\n\nx_\x8d#-\x86\xaa\x88\xc0\xe9\xa9$\xab]\x8f=\x8e)u\xd3\xf9\x05\xfa\x07\xfe-\x03\xe0\x8a\xe8\xa1\xd9p\xd2Q\xa1m\xbcr%\\\xa4{v\xc5\xdbAB\xf7\x1fB\x18\xca\x14\xb6\xc2\xab\xa5\xd8\n\xde\xb9\xbd\x12:\tvJ(\xa1\x1cR\xb1\xf3&\xae"\xe2\xc7\x1f=~\xddy\xa6\x90\x84\'\x11\x92\x93O\x0c\xeeCG\x9bA/\xb7\xf2e\xfd\x05\xcc"HL\x92"\xd0\xd4\xcf\x82\xe0\'\xbf7n@\xb9<\xfa\x97\r%E\xd9j\x84\xeb\xb0*\xf6\x01\x0b\xc6Tb\x91&\xd9\x85,\x07K\xe7Q\xf7\x1d\xaf\xf8v\xdd\xee*\xc4\x0f\x17v\xc0\n\x81\x88\x9bW!\xdb\x98\x17\xfe\xb7\x1co\xdfv\xd2O\xa1g\x1cm:\xeb\xe4\x81\xcc\x94\xa3%\xeek\xfe"\xf3\xa5\xcf\xc2\x91\x95st\xb9\x85%\xa2\xc9y+\x1f7B[\x8c+\x1f\xf7\xcaI|\xb2\xb5\x86\xd7\x02\xf5\xe5)\xe1{jw\x18\x9b,e?o\xce\x0f\xf3\xfaE\x0fC/\xc5%\x00R\xdfw\xe3\xb3\xe9\x03\xe3\x80\xa1\x9eD\xbe\x06t\x9f6\xac=P\x85\xf9?\x00\xba\xd3r\xcf\n\x9b5RWj;\xfe^\x97\xba\x0f\xeeR\x80\\q\x91I\xd9!\x8e\xf9\xa5cD"\xdf\xc9.e\xd0\x05\x81W\x9f\xdeF\xf8b\xeb)n_\x1eJ\xb3K9`I1\xc8\x0e\x82\x947\rT\xa3\xee\x94\x17-#\xa5F{\x91\x10\x92/\x95>\xea*\xc67r}n\xf1\x15y\x8b\xf1\xfdq.V\x92\xb9Q\xac\xcd\ry\xc8\x03\x94\xf8\xf0\x7f\xdd\x017\xea\xfc.\x90/J\x16tT\\#(%\x92\x028\xfb\xfd\xab\xe2b\xec\x0f\x81\xa5\xa7\xf7l\x91x\xf0c\xab\xe91\xb6\x05\xb76h\xc9\xed\xe8g\x83\xcb"\xe7\x02:\xc3Gc\xba;=\xaa\\0\xa2\xc0 \xf0[\xca\x92\x12\x97\x93w\xde\x15k~z\\\xd7p3\xee\x88\x03\xe6\x1eL1\xcb\xa82,h\xc8\x0e\x9e\xa8\xbd\xf2\xbb\xbbt\x07UEh7\xab\x83\xf8\xff\x14W\x1d\x8e\xb2C\xd1\xc0\xc3\xed\x97\xce\x1c\xa6\x06\xc6z\xff\xfdcv\x9cV\xd2n\xc59\xfd\xf0\xba<\xa0\x12^\x10\xc3\x84\xf4\xec\x82\xdc\xb6\xd8\x81\xe4/\xea\xd5J\xb1\xf0\x025\x7fEmv\xda\x03\x96\x95\xa3\x7fE\xeaq\xf8\r\xb2\xc6\xc7\xad:\\hK\x17\xc16\x8e\xe0\x8e\x8d\xcc\xde1,0\x10\xb7\xa7\xe2n\xf5\x03\xe6\x95\xb4\xf5W\xb3\xbb\xa7\x19\x92.\x16v\xd1X\xd1@\x84\x97}J\xe2\xdf\xcd\xbc\xdb\xb5H\x14\x0bL3\xbez?\x82\xa6\xe2\xfc\x8a?`%\xd8\x83o!Mj>\x17W\xd6M\xd7\x82\xb8\xff\xc3\x96\xad\xb0\xb6\xd20\x8a\x90\x05\xd0\xb8\x1d(\xc5IN\x8f\x1a\xbc\x8fL\x8f;\xc0\x1aix\x87u\xeck3Z\x8b\x87\xd9\x08\x84\xce\xca.\xa8f\xfd\xcbN*\xe6\x94\xee\x0c^P\xa0\xeaZ\xb9x\xc9|\xd4\x84\x18W\xe8\xf3\xaa\xd7\x82\xe9\x1e\xa0\'7Zk\x95\x13\x86\xbf!\xd0\xf3\x94w\xdb\xcb\x0f\xa8\xe7\x1f>\x89qv\xad:\xffb\xeb2\x930\xb94yAa\xe0\x91\x93\x0e\x89\nv\x8b.l\xadPZ\xca\x9a\x18@\xa5\x85\r\x9d\xa4GZ\xd0\xdb\xc3d\x85\xddz\x95\xb7\x16\rUuY5\x7f=\x03\x86\xf4\x91\x99\x9e\xce\x1f[\x1b\x1f2\xba\xf8\x17\xc0\xd1 \xc9w\x01\xbbB\x88\xcb\xa3\xa3P\x9c\x1b\xaf\x968\x13]\x9c\xe0I\'1"\xe0\xb2:\x1btJ\xf8\xbc\xb0\x1d\xf2#\x8d\xf3\tU6\x16\x10\x8dP\xf2\xe01\x98\xc9h\xd9\x88\x12\xb73Fi)\x13\x82\x80\xa6\x948\xf0\xcb\xcc\x9e\xbd2\xe2\xb7U\n8\xb8\x13\x97z\x02\xbe\xa0y|\x13\xdaV6f\xc3\x9d\xe4\xbb\xe6PL\x8b\x16\nD\xf3;v\xd5\x00\x99&\xa0\xd0+\xdbjM\xb7\x98\x98\x8e\xdd\xab)iBg\xe5\xce\x0f\x10^<\xff\xb0\x1b\x85\xcd\xf0o\xdc\x92\xcc\x8f\x15r\x99\x96\xbf\xe1\x93{\xcc\xbd\xa8s\x1b\x1eq$#\xf2\x17Y\xad*\\|)\x8c\xd7\x9a\x88S5\xcf\xd9\x9b\x10a\xb8\x85d\xf2\xef\x98xz\x87\x18\xc2\xcbm\xce\xa4W\x80\xef\x88\xd3S\xbd \x94>\xd0\xae\x0c\xc7\x89o\xbb\xc1v\x02^\xf3\x16I\xff\xb7\xbb\xcb\xabK\xce"\xf4\xc3)\xbd*\xd5\xec\xed\x88\x9f\xf0\x94\x8b@)\n\x82\xc5G\x91\x1d\xc3t\xef\xcc\x84\xd7\xb7\xfb\xc3W\x96s\x0cW\xb6b\xf4\xbe\x7f\x93W9\x89\xdcl\xf7:_\xfa\x1a\x04\xba\x88\xe0\xb5\x19=\x85\xa4v\xd9\xcc=Xo5\xbdl\xfbO\x9bq\x06\xa0\x9c-[\xd9@\xee\xf6-\x9c\x14\x83&\xffA\xb7\xd4x\x0e\xc8C\xbe\xdcxG*\xf3\xed\xd4[Q\xb5qR\x1c\xd5s\xa5g\xf0\x91c\xa2\xe3\xe4\x86\xf8\xc0zql\x9f\xff\r\xe9\x18\x15\x91\x90\x06mb\x17LPE\xc8=\x8aGxL\x9b*\x17 \xf8\x90\n\r\x1duL\xba\xa2Jj\xe0}8\x072[K\xcc\x00\x1c\xec\xd5n\xe8r\x99\n\x1f\x91\xd5C\xe4\x84G\xd4\xeb_\r\xc2D\xda\xf95\x0f\xf1p\x12v\xe4\xb80\xf4-\x1b\xb6\xe3\xfam\x90[_\xfa\x16\x00\xe8\x089\xc7\xf7\xf2d!\xe3\x98,\'\xf1\xeb:-\xe6\x18\x9f\xb4\xfa$=\xe9p\xa7\xb7\xf6\\=\'\x9ai<l\xac\x9d\x12\xb3y/L\xb7\t\xc0h\xce\xa4F\x84\xdc\xa7o\x10\xad\xeb\xdb\x03\xa6g\xf5\xf8\xccZ\xe6\xa6,\x04\x17\xfa}\x96\xa8\x18\x04K\xc6\xd7\xf4SI\x1c\x9b\x9cP:@O\xbe\xb6\xaa\x91?\x92l\x19O[\x16\xc6\x9cd\xa4\xa4"\xca\xde\xd5\\Q\xc4>\xcaIC\x18\x9d\xff\xf3\x11\'\x02C<P\xa0\xd7Pj=\xfb\xae\xf9\x8d\xf0\x8f\xa2q\x0c\xf7\x9d\xe4\x94\x0c\xfc#8\xd0`w\x82/u\x97\x15\xdf\xac\x01*=\xeb\xf9X[-x\x95\x8a\xa5\x9c\x0c\x98?\x920gVP\xc3m\x99\xe0\x81\x824F\x18\x104"][P\xa4P]w\x9an"{`\xeb\xfd#E\x04}*\x0e\xd4\xb1\xc0\x7fx\xc7\xd8\xb4\xd3\xce\xde4)\x03@\n\t*\xb5\xa0R\x90\x7f\r\x16veo\xa8F\xb2\xc8k\xad\x8c?\x892\xf5\xc6\x1bU\xdd\x91splr\xa5F\xe9\x99\x1bD\x83\xc7U\x9ev/\xe5%\'\x9d\xee7\xd1\xde\xabq\x93\x96CR}\xf8b\x84%\x9f\xba\xc6\x06c\xef\xa3K\xfe\x96\xc8\xa7\xddb\xbe\xe1\xf0\xa3\xd1\x956\xb33\x0f`\n\xfa\x0c\xf1\x87U\xc8JO\xd3[\x15\xcaZ,\xb5\x17K#\xa2;\xfa\xa2\xd8q\xb9\x050\xfdx0r\x81\x952c\xa7c\x02\xaf2\xbd\x7f\xd8\xcb\xe4g\x17)\xda/\x12B:\x91\xa9M\xa9\x9c\xdb\xda\x85\x16m\xfc\xb1\xa0\xfa`\xe4\xaa\xa9\xde\xc8a\xd1\xeaq`\xf4\n\xf4\x82\x16\xbc.\xdb\x19\x17\x83U\xdc]\xde\xf8\xe0e\x19\x13\xf3\x1d\xf7\xdd\x94<^\xef0\x1b\xcek\xb0V\xbe\xea\\\x05\xe07Y\xeb\xfd\x02\xa4)y\x0c\x90\xc9\r\xf0\xc1\x9d\xec\x84\x83;\xb8-\x96H}S\x0b\xef\x05\xb7\x90\x16\x9f\x15@\x91\x15v\x97lr\x0e\x91-~\xc3\x11<\xc9$\xd0P\xf1\x01<\xff\xb6\xb3\xbb\xf5\x95\xef\xf2\xc1|\xd6\x1bI1\xd0\xf5\xed\xb5\x84j\xbd\xbab\x18\\\xf2\xd3\xcc2_\x0f\xabc\x97\xde\xde\xc7Q\x85`\x99\xb6\x1d{j\x0b>Q\x14r\xb7Ju\x9a\x95\x87\x1f\x12\x1f\x8a<&|\xbd\x82^\xf0pdYS\xec\x8c\x01\xe2\xaa\x05\xd7\x1e` \xbb\xael\x82\xc0\xfft\xee\xe7\x0b\'[\xeb\xc9\x0f\x81j\x84\xae\x87\x86\xb6\xef\xf56\xcacg\xdc\xb9|\xcd\xfb\x7f\xd7>\x0f\xa7eC\xe57+\xac\xfc\x9eaD\x80\xb4\xafH\x01\xa1\x87j\xb4\x16\xef\xd1"X\x1a\xa3\xdb\xcf\xbd\xe5jr3<m\x8b\xc4\x0bO\x9fw9a\x1e\xfa\x8dm$L\x1e\x17\x03\xaf\x13LNpl9\xbc\x0cal\x80S\x19\xfb\xa1\xdf\xdb\xe8:f\x12\xd3\xe1@\x81\xe9\x87\xa7\xab\xa8\xee\xe8\xbf\xdd\\c\xfc\x8c.1\xa7\xf2\x08\x81X\xad\x93\xbd \x89]\x81\x19\x96Fn5\xd6\xbe1\x02p\xd3\xda\x8e\xf9C\x9c\x91 \x9b)X9\'W\x05z\xa2\x04\xc6\xf3x\xd9K\xfc\xfe\xdb\xa3\xccV\xe6\x82\r\xae\x95\x9d3@/4\xd3\xea\xc7Q\x0b\xfb\x8c\xec>\xfeA\x01O=\xd7y\x9a\xe8x>0\xd9\x8e\xc6pR\xbb5\xcc\x80\x05w\xd1#\xaa{\xe7\xf0\x1b\xb3\x03\xa9\xb1\x9a\xf1\x05\xbcH(|\xe3v\xe5\t\xb2\xd7\xdf\xe9\xb0\xd5\xe5~\xe1\xfai\x95=_\xf6;\xe5\x08u\xdf\xc6\xc4\xd7O\xcb\xea\xc9\x8e\xfeZ\x1eE\xda`u+_\xe8\xe7\x818\xae=\'\xbd\xf3\xe6\x93\x0f\x9c\xb9c"N\x8cu\t)Wyu\x8d\x87\x0b\xe8\xbe\x81^S\xd8n\x1f\xa0\xe4z\xb2$\x1f\\h\xe9\t(\xcf\xee\x8c\n\xb65\xbeq\xc3\x91\xdc\x94-:\xb2]\x1b1\xcd\x07A\xa8\xfa\xd8J!X\xd0\xb0\x9a\xde3T\xa9\xc2\xba7=\xff.\xbc2%\xb9\xd33\xbf\x1fq\xd5~\xa9\xacJM\x1d@\xce\xa7\x0c\x8eE\xd9\x88\xc9\xc9\xf4\x1e\xa2\x86\xdb\xa2\xfdiPf\xaf\x91\x9e\xa3s\x1e\xe8\xcb\xc1\x9do\x10\xbf\xca\xa4kN\xba\xf6\xa4\xf9C\xfdq\xbb"O\x9c<\xa3"7S<A\x04R\xe6\x06\x8f?D\x80\xd3\xa3O\xef\xb7Sp\xf8\xfc\x8f1\xa6`\xe0-\\\xf8@\x15\xfd.\x07\xc7\x8b>\x8d\n\x95\x91\x8e\xa61\xfb\xb6\xe1`H\x85*|\x80n\xa46\xc7\xaa\xcdn\xfe\xeel9r\x8fQ\x89?[\xcb\x7f\x85"Y\x88\x01\x93yfm8\xb8Y\x1b\xfd^\x06%5\x98\x10B\xb6\xf6\x06\x9d\xa5\x17\x02o\xef\x82N\xbe_a\xa2\xf8\x1a9b\\\xc5\x1a\xe0\x9f\xb9b\x8d\x17h`\x07%G\xf9\xa2\xd3\x069\xa7\x89\xf0\xa62L\x9eE\x1d\x86\xb0\xed\xeeW\xc3\xfd\xa6\xdc\xf2n}0\xb0\xd9\xb45j\xd9$\xc9\xa3\xce\x87a\x96G\xad\x19\xef\x14\x8c\x87\x00\x10\x98\xbd\xdb\xf9QSDMr\x98\x9f*7\xea\x00\xde\xb0\x87^7R&\xf42^\x88.\xa2\xff\xb6\x86B\xecHd\xf9q\x9cX\xe7/%5\t\x16I\x01w%\xd41\xa0\xf3\x85\x8b\x82\x9d\xc0\xa2\x1f\x1b\xd3\xe398q\xc9b\xf0\xd9D3\x9b[Gq\xc5\xbc\xc7\xa7\xdc\xa6\x00!\x80\x83Y\x96\xfe\xc4-\xccn\xb2\xa1I\xc1\x1b\xc1\xfeJF\xdd\x02\x18\x93P\x89\x11m\xf9\xb9\xa5\x14g\xf2\x08\x02\xc5\xc9-sW\x98\xc7l\xbd\xb4\x98p\xf9(\xde\x0c\xb4\x91\x04\xbe\xeadh7\x05\xf7(\x94\x1a\x1e{\x8b&\x9d\xbb\xfe\xe6\x12\xff\xc9\xd9\x1b\xe3Z\xb6\x9f\x90\xb6\x91c\x81T8\xc0n\xd5@\x91*Td\xab\xdc\xb8\x95\xd0\x98\x9a\x85\xaf\x03o\xd6\xfa\x17<s\x07\x1d\xde\xfe0\xf0f\x9d{E\xf7E\x94\xbf\x08\xbb\xc5\xa5\xc6~<=\x94\xb5\xcbJz\xea\xe7\xcfZ\x0c\x00,\xf7\x91\x7f\x87\x91\xa7Vv\t\x8ff\x88\xec\x0e\xdb\xb6y\xe73T\xfcv\xdf\xab\xb3\xe3\xa53\xcd~\xeab\x13\xe5\xdd\xb6\xe4 \x1d\xea0|\x08lr\xa9\xcdk\x9e\x99\xd0\xe2\xcb\xdc?\xee\xbd\x03\xdf\x854\\\xed\xa0\xfb`gw\xb5\x88\xd6\xbcJZ3n\xbb~\xab\xc4\xe4\x88N9uf\xa5AV\x92\x03;U1\xce\xe5\xaal\xb0\x04\xf3/\xd1\xcc\xdc\xf3\xd9\t\xb1\x99\xf3\xa8f\x85\xa8\x86\x9a\x88`+\xff\xb9H\x98\x07\x91\xf5?D\x95\x9a\xc4\x11\xa8DV/{\xf9\xd797\xec\xb3\xbea\x84<\x8f%\x8an\xc2\xb2\x06L\x8a\n\xfd\xa1\xf8aY\xf2\xb6\xce.!E(>\xb5&\x03[\xcf\x11\xc3\xb4\x1b4xO\x9b\xf7gH\x1d\xe6\xads^;\xe6n\x8d\x08>6;\x08?F\x94\r2pg\xe4P{\x1e\x8fi\x9a\t\xc1\xa5\x80\xba\x93C\xb7\x1e\xb6\xcb\xcfczt?\x042\x9b\x8fS\xc2\xc4\xab\xe1\xd0,\xde\xe0\xa5\x80\x06\xa0\n\xc8\xaa{-?K4\x18+`\x8f_\x1fr\x8a\x87ob\xea\xb0\xbb\x81\x08B\xc3^\x99\xdd \xb2i6\xa0\xd70\xf3\x1d\x19Tq\x87\x8cgV>0\xf6w\x06\xf4\x87\x1c\xbb\xb8\xfch]\xd4\xf9\xec\xdf\xbb\x0e\xc8\xf0UAo\xd3\xa7\x1d\x97\xfa\x96~\xd98\xa47c\xb6e\xe5\xd9\xff5Lz_\xd5\x1a\xa4\xda\x07\xe9\x88\xe7\xd7D<\xc2\t\xe2p\x01\xee\xb3\x07\xcb\x0f\x15A\xb3y]\xdd\x00e\xe6\x92h\x1dk\xf7\x06\xadi\xea%@ \x0568s=\xc3U\xa4\x81\x1a\xfcw\x11\x17\x07><0).FgU\x83\xbf\xb1E\xe5\x86f\xd6\xd1 \xd0\xdeU\xe6\x0f\x82r;\x1eK=\x97\xc4M\x9a\xd6L\xf1zV\xff\xcf\xe0\xa1\x91\xc4\xb6\xfe\x1c+\xe3V+?t\x11T\xb5@\xe6?/\x00o\xe6\xb9\x02\xfb\xf7m\xbf\xaei\xd7\x8c\xa1\x80\x8bV\xca\x1b\x9e\xcf7\xf73U\xb3:^\xed\xb4\xb0Z\x1b\xf8v\xc3\xdf\xcc\xa0\xcc]\xf3fb\x15\xfa\xb1\xde\x1eX\xc7t\xa9\xec\xce3\x9b\x07\x10\x98\x9e\x97[\xe14\xda\xbf\x97]\xcf\x1c\xd7\x1f\xeb%A\x88\x07\xa9\xc3$\xfe\x9f\xd2\xac\xc42S\x85\xab\x0b\x11\xd8_\x0f\xf8\xb7\x87\x17ObL\xd8x\xd2\xd0\x99\x19\\F.h_\xb0\x00\x0e\xbc\x96\x10m\xef?-x=5"\n\x13f\xed\xb7\xfdn\x03\x1b\x08lQ4\xe8s\xee\xb5Eb=\x93\x96\xa2\xc9;\xa7\x89s\xc0\xce\xf9\t\x7f5\xd0 \x15\\\xa6\x9d\xea\xb4nC\x11\x07\x1a\x937\xbd \xa4\xceF\xcc\xc2\xfa\x8bT\x8b\x00\x86wY\xeeA\xb4E\xed\xbbG\xc3\x84 e\xde._%\x81\xb9\xf1\x18\x81m&\x82\x0f\xb5\xdaN\x95\x03s\xad(\xe5}(\x00\xfd\xd96\x98\x99\x08\xfa?\xd2\x1f\xd6\xc3\t\x01\xfcwa\x9e!p1\x1d\xcc\xd9\x18c \xfb\xabd\xc9"\xa7\x86\xec\xc0\x0fo\x00\x8a\xa5,\x01\x1as\xcar\x8d\x8cl\x8b\x9c>J\xfe\x11\x06,\x88\xb1l\xf8\xbe|Y\xce\xac]]\r\xed<`\x97_bv\xa6Y\xc2D&7\xbb\xd2\x9a\x11j\x89-:\x01fp\xde\xaa\xb3\x9d\x991\xeaJ \t\x13\xd6\x18\xf0\x95\xder\xc2\xd5-p$\xff\xf1cuc;\xaf\xe2\xa7S\xd0\x10\x1c\xa1#\xb2\'~\xf0G\x17\xe2\x7f\xeb{!&*,\xc6\xa7J\x9d\xa9\xb3t\x17`\xfd\x06\xe3GD\xed<\xec\x8d\xcb3+U\x1f\xc1\xad\xa8F\xf3\x11\xbd\xeb\xbf\x81\x02\xa4[\xc9g\x92\xae\xef\xee\xd81J\x9aW65\xec\x854\xd0\x07S\xda\xb7\xf9\xb2\x97\xaf\x82\xa3\xb9\xe0\xa0\xcblr\xc8\'\xfbV\x81\x9c\xc7\xab\xd5u\xb3\xba\xe1\x0e-\xf8\xd5\xd3\xbdSw\x9d\xc1\xc08\x08!\xdb\xa9\x03\x94_7\x83\xbf\x16\xed\x99S/\x97\xfd9\xad\xbb?\xc0y\x10l\xe1#i\xa0\xcb\x0c\xc5\xf9\x8ao\xd13\xfd\xbb\xc9\xfd+\x15\xbc\x9b/r>\x84b\xd9\x8e?\xec5hU\xeeo\n\xbb\x06\x88|E\xed\xa9\xdb\xf2\xe8I-^\x15\x80U\x1a@K\xc2\x95\th\xf5&\x00\x91\x1d\xc0\x85\x82l\xd1\x05\xb6\xe5O\xbeU\xd0"1"\xab\xe1s\x1a=\x13E\xad\x1b\x12\xff\xf6\xfa:\xb2\xf5\xb5\x98P\x91\\\x0c\x9e7\xbb|^\x18\xe2\xd8;\xc4\x82\xc7~o\xc1\xff"\xfe.\x13\x16\x10?+d[\xfc\x12\xf1\xe1K\x12\xd7O/\x98K\x03\xc8]\xe0\x02e\xf0\x96\xe7\xa9\x89o\xe88\xb1\x7f\xa7\xf5\x119\x7fR\xfao\xd8\xbd\xe9\xf5\x95\x06\xda\x0c\xb4\xcf\xe3\xd0{\xa1\xee\xc6T\xf5Y\x8aq`\x10;\xb6\x15"u\xfb>\x97\x9b\xfa\xe1\x96\xaa\'@\x14\xbe\xdbPT~\xcaj\xb9\xac\x84Hc\x03\\\x19;\xe7\xf8\x8c\r\xb3\xb0X#e9\x06:n\x96\xbc\xb2\x18\xfa\x05p\x91\x9d\xa7\x05d\x96\x06t\xdd0e\r\x81\x87\xf5x\xe8\xcc;\x96\xdb\xa5\xb6\xc3\x90\xce4\x9f\xfb\xa2x\x91\xce}|m(\x85\xa6\xd2s{\x9e\xeb\xdfZC\xa0}\t\x99\xdf\x86\x8d\xc4\xbc^\xd1\xf8lzD\xceQo\xb4\xb6\xe3\x89\xf2\x8c!\x04\x86E\xb0\xb0\xb17\xb8&\xff\x84sdl\xd8\xb6\xd4\xcbw\x80,\xe2\x08r\x88\x1e\xb3\x1052pcc\xe9\xfb\xe0&;&\xfa\x9b\x0cr\xd4\xf4\xf6Z\x0e\xd4?b\xaf:\xfc\x02\xeb\xc4\x1d\xaaK\x8e#\xdd7\x0fQ\x13"\x17\x9b\xa2<\xd7\xacm[;!\xb25\xa5\x8f\x87\xeed\x9a\xb9\xcbS\xf9+\x1ds\x13\xb7\x19\x04xw\xd5\xea\xd7m\xbf~xq\xa8K!\xa2t\x8cU!\x1c\x85r\x90\xce\xb1p\x88\x87\xd6b\x97\x8f9j\xea\xe8\xc2\x8f\x1ai@\xcf\xde\x85\x00o\xed\x9d5Y\xe4\x85NT\xe0\xf4=\x0f\xcf%i\x9fn\xed\x93h\x00\xd8\x7f\xac]\x00\xe9\x85\xe9\xc7L\x02\xa0\xa4Y\x8c^\x03_WcAR\xbc_\xddt\x89\xde\x07\x9ev\x86\x87\xe7\x18\x01\x99&\xb8\xf5\xe8\xb3\x14\x8d\xfee$\x08\x8a\xbc\xa4\xe3>\xab\x91\xa2\x0f\xe8\x01\x81\x12\xd8M\x088\xa5\n\xee#\x04\x1a\xad\xe9\xf1`\x04\xfdQ\xaf\x7f\x10h\x82\xf2\xce\xa7\x1a\t@\x89qc?\xbe\x0c\xe6b\xfe]<\xe3\xe5\xee\xa4\xe4\x17\xd8\x90[c\xfe>\x92\xfc\x14Jy\xf03\xa7\xd3\x06\x7f\xed?\xd2BK\xe8\xa5\xa1\x11\xef\x93\x8f\x891\xbc^\x87;\x18\x0f|NQ1Sg:h\xae35>c\x10\xa3Q\xbfN-\xf2\x8a\xdd`\xf1\xd2@l\xc1\xc0\xed\xa9\xddt\\\xf5\xa5\xf2\xfa\x1dtz*\xf1#\xfa\xdaM+\x07N[\xa1W\x0ek\xd0\x1f\xa5I\xf1~[|\xa3p\'\x06\xe7\xcd\x0b\\\xe0HK\r\x02\xe4\xa0\xf5\x92\xcd\x03\x7f\xf2S\xe2PD`|m9jv\xc3\x06\xcbq\xbah\x97AA\xb5\xc2/\xb2F\xe7\x8d\xd0\x03\xbc\x1aL+\x93\x0en-\xd5\xac8(\xc7x{\xb3+\xe6/\x03#\xaa+\xa67\xe8\x81\x16\xd0~\xc0\xc5c\xf6\x1c\xd6\x08\x88\xda\xc1\x91\xf1\xe7\x85\x8f\xd3f?E~E|u\xdc\xc2\xde\xc5\xcf\xae\x08\xa8\x9a\x1d\xd2\x9b,Z\xa3TxT\xf9\x9a\x1e\xa5\x98\x83\xd6~\x1a\x99x\xc4\x9cQ\xa7~\xdf\x18\xc3\xb5\x9dcCM\x80qK\x17\xda\xea\xf7bz\x85\xcb(0\x9eF>\x9f\x034\xfd\xa2\x9dl\x8eA\x87bcj\xd4-I\x9a=5\xf2\xbaa9\x1bP\x92\x8c\xc1?\xe3\xaa\x1d\xf2:\xf9> |\xf2\xb0\x8e\x1c\xdc\xdb\xb0\x88g3\xbd\x92\n\x04\x84\xb03\xd7\xdd\x8foB\x9b\xae\xe4?\xd1\x04\x95\xf0h\x9fR\x0f\xdc\xae+Xg9\x08o%t\x0c\xcaa\xa1\xed\xf8\x99[5\x04j\xa1\x1a\xe3\xf1\xa7i\xba\x07L\xf4\x90L\xa1\x8fjq1M?\xd3\xbbt\x03\xc0D\xfc(~\x1d\xa7\xc6\x9b\x97B\'g\x18\x05\xa3#X\xec\xfcH\xa5\xdc\xe8\xaf\xcb\xec0,\x98\xd6\x90v\xcb\xef\x89R\xaf\x91\xb4\x0e\x9e\x80\xb0\\\xc8\xa7\x8e\x0e\x89\x7f\xcd\x0b=z\x98\x1c>>\x97\xc0\xfe\x91k\xfb_&\xedb\xe8p\xc4\xf7\xd9x2\xa6E\x9a\xdd[)~\xfd\xbe\xf5\xd6\r$B;\x91S\x16\x9cu\x95<\xce`\x1fd\xb4Ie\xae<#\x12C\xb9}B\xc8\xa4\xeb_X\xa4\xbdQ\x8f\xc9\xee\xf0h.\xdc\x0c=\xfb\xae\xeb\x16\xf3l\x1fni\x0bY>F\xdeY\x81\xa0<\xb3\xae\xdb\xad\xc8\xc9\xd4{V\xb2\xfa\x13R\\\xa4\x85\x1f\x1c\xb6\xe6\x9c\x01\x16\xb1u\xd0\xa0g\xe7d\x8e\xdd-\xa1\xf6\xec\x10\xc3\x8b]+S\xbf\xb0@\x1a\xad \x8f0\x94DP\x95+S-r\x80\xafdv*\xb1\xd6G\x94\x85\xbdm\xcc\xcbH\xdc\x88\xb0\xa6\xcf\xf0\x88\xd2\\\x07i\xc5l\x02\xa0FbQ\x18Y\xc0X:\xeaI\x04z\x00\x8a;\xa1\xad\xfc\x85]\x1e!]/\'\xf6K\x95zW`#V;\xa4\xe5\x1dW*\x187]\x90\x03\x01}l\x8e\x84=\xca7p\x9c\x03A>\xc7\xe3\xee\n\xd2\x94\xb9\x11\x82R\xf4\xf8\x0e\xec=\xfbTR\x9a\xf6\x91\x9cVO!\x8c\xcfz\xc4\xa7\xd2\xe2\xbf\xa0\xecp\x9f\x80a\xd9\x0e\x90\xb4\x06\xfa\xff\x06\x92\x12\x817{>\xac\x8a\xaaT6o\xc1,S\xe1\xb3\xfe\\\x87\x98\xfd\xb9\x89+T\xb6\x1an\xdf\tZ5\x19\xa7\x88\xa8\x9e\xdd\x13\xd2\xe9,\x0cBx/h4&\x0b\x82tK\xd8)"\xc9\xca\xea\xbc\xe3\xea\xb3<\x08\xd7WF\xd3p?\xa6\xa4\x01;T\xb4=\xa7,aP\xd4\xe43Ig\x930\x08\x8b%)Cn\xd6*\xde\xac\x12/\x9e\x1a@\xfe\x9b\x15:\x9f\xa2\xfaq\xb0\x16 \\cF`HG\xdca\xbfby{jY\xa5L}\xe8\xfdB\x80\xd4J\x18\xf0\x1cM\xfe\xdfb\x8d\x02\x9a\x02\x1e\xa1\x7f\xc6\xd3N\xa4Q<\xbc\x04hx$\xd5\xf2\x93\x84\xcf\x1b\xae\xc2M\xa5M(\xd1\xc3\xd1 FP]\xb1\xc0\x19\xf5\x01r?\x98\x16\xd6|\xfb@F\xd66\xc5\x8eE>\xca\xc5o\x02\x8dkUj\xa1m\x10\x7f\xb3%\n\xa5\xca\x14\xa0SUe.\xe9\xbd\xd2\xaf\x94\x03\x1b\x93\xdd\xec\xe0\xec\x83Vl\xc9cb\x0f\xc4`\xabN\x04\xb2\xd7\xa1\x81j\x92\x85)\xd0D\xe1\r\xeb\x00\xd6O\xe2g\x8a\tC\xdc\x07\x07\xb3\xd7\xdf\x0e\xf3;2{I\x0bxb>i\xc6\xd3A\xaf\x8f{\xdf[\x1e\xf15\xd7\xdf\t\xb9C\xfd\xacq\xce\x80Vn\xe1\xc0k\x19\xf8<\xa2J\x1d\x7f!\x05>\x8bJ*5\xf7\x95\xb5\xdf\x18\x15E\xaa\xcb\xc5u\xd9\xb6\x90\xed\x92\x0b\xcd\xaa\n4\xe9\xe3\xccz\x7f\x14T\xb6\x19\xf7\xd6VrE\xee\xa9\xf9\xce\xd3[\xdd\xde\xf2\x021\xd36\x1f\t\xf4l%"1\x1b\x97=\xbe,E\x1e\xadt\xef\xf1\x834\x1c\x0f\xcb\x10\xf4Z\x7f|\xcd\xecT\x0b\xd6>\x98ZOM\xb0\t\x0e\x04\xe5\x80\xe69\xea\x8f\xce,2Z\x0e\xa6\xa9\xe5\xe8\xac\x05\x12\x85\x83\xf7\x04\x16\x93\x86*\xc9}\x9d\xd7qB\xd9\xd5\xa9k\xa0p\x9c\x87)u\xae\xc0\xc5\xfb\xbd\x96\x9bC\xafdf-\xe0=\xdd\'\x94\x94Bm\xe0\x15k\xdfX\xd64\xa7\x7f\xf5\xcd\r?\xfd\xa2\x18\xb8\x97\xfd\xa1\xf3\xd5\xe1\x90\xd3]"-\xa8Z\xd4h_\xc8=|\xe6\x8a%6{?\x81\xfb7\x8f8\xdem\xb5m%Go\x0b|;\x19\xa3+\xa1@/\x1fX7=\x19\x97\xa0(g\xb3\x9c\xff\x90\x07\xb0X:\xebtUj\x80\x04\x92\x05\x03\'e\xab\x9dE\x8f\xea\xd8\xd7Y\xf8\xd9\xfa\xe7S\xd0A\xde[QSU((\xbeH\x19v\xd4\xe3z#\x9d\x9e\xca\xc1\xc1\xd6\x19M\x8e\xd3\n\xa3Q\xa7\xb4i\x8c\xa0[\xa4\xb3$\xde\xddA(^+\x9c~|\x1f\xc3*\x8c\xeeI\xe7`\xcf\xc9\xa7\xc2\xe8g\x1c\x1a \xfdo\xb4\xce\xaa\xd9\xee\x0e\xe8\xa7\x1aS\x12\x99\xe2\x01g4\x1b\xcfP\xbc\xa2\x9a_\x84\x0b\xe5\xac\xd0}\x8dK6q\xab\x03la\x13NB?\xbbP\xaa0RJ\xbd\xda\xba\xf0\x8d4y/\x19\xf1\xf8\\\x11\x05\xc0I6\x1f\x9cv\xb6~\\\xac\x8c)\xc0\nC\xbb\xff\xb5%\x7f\xcfWE_cm1\x93n]9\xf7\xdeCo\x82s\x81r\x05]\xa1oz\xd9L}{.\xbc\x9a\x02$\xc7\xf1:\xac6\xedU\\\x18\x85\xa7{\xb8\xe2q\xf2\x08x\xe2\x92\xf7`\xcd\x08Cs:#A\xecDT\xf3\xdd\x8an\xea\x07\x91`[cG\xe3F\xe1\x82\x0f\xae)\xf3g{5\xd4\xb4\xb6[0\xda\x17[\x04\x1a\x1cq\xa0\xb0f\x01]\x8e\xf6X0*(\x94\xc4\xde\xe0\x88\xbd\xf3\xdc\xae\xdd\xd6\xfcxq\xf5u\xee\xf9\x96/\x7fGdNVl\x8dx\xd3\xda\x81\xe8uM\xe6\xd7z\x83;\nL\n\xc2\x86\xe7g\x8f\xd6K\xd3\xa6\x17\r,w\x17b\xfd\x10\xbcv\x15[*\xd8\xa7\xe3\r\xb3\xc4\x08\xd2\x82p\xe0\x03a\x07\x1d\x91\t5\x93;\xb2\n\xb5<zS\xc0l]).\xb1b\x9cO\x8dg\xbc"\xec\x19\x960:\x8b\xe1\x1a\xebn7\xb0\x84\x1c\x80vw\xf1\x07\x8f\x170\xf19m!:\xd8\xe6H\x8b\xad\x88\x08# \xc1}\xa5\xa9Q\xde\xc6U\xf2\x16\xe9*&\xca,\xf3P\x04\xa0\xa8\xec{\xe7B@\xed\xecX\xbew\x9a\xaf\xffjm\xfd\x8e\xf5\x99R\xab\xcb2S\x1b\xd8\xecR\x10\x1bo\x1d\x17\xf2\xc1\n\xa9\x08\xdb%\x9dO\xbf\xbd\xa2x\xd9\xb8h\xd5\xf8N\x02\x96H\xb8\xa6f\xe5\xcd\xd6\xc4\xde\x8d\xa7Y\xe5r\xfb\xae\xdb\x1c(\x05~\xbe\xca\x97\xcbU\xeaK\xca\x12o\xffU\xff:u\xbbV\x89\xbc\xfdt\xf0\x03\x92\xdbX.^\xea#\xc2\x9fZ\x0b\x9e\xf2\xa4\xdb\x9d\x1b&\xb7\xff\xbc\xac\xf2P\xd5\xf8\xf0Bb\x03\x90"F\xa6e\x8e\x9bW\x0f:\xe7uw\xf6\xd8=\xc7.\x1f\x83Y\xc7\x03\xa0\xaf=\x94\x03\x11\x1f\x1aN\xcc8j\xef\x02\xf0\x18\xfe\x9c\x9etUl\xe0\xbf\n\x01\xf0\xe7;>o\x8b\x9c}\x90\xd1\xea\xa2|D,h#\xd1\x90oa[6\xe6O\x85\x85L0LW\xbb\xacI\x12\x80\x82\xe9\x12\xd2\xfc8vr\xf3"V\xc5\xc0>;\xcb\x93$s<Xx\xf0x\xabG\x1dsZ\x05.\xf4\xa7\xaf_n\x1d\xd0\xaa\x80a\x9a\xd1\x92Sa\x8e(\x8b\xdf\xf1uRp\x84\xa2vD\xf7i\x995\x94\xfa\x10\x06\xf5\x05\xf2\xad+\xcaLeRf\x8ed\xb8Z\xfcz|\xf1nV\x91\x00z\xd2\xd2\xdd\x83\xfb\xf7o7+\x9fZ\xcbo\xa2vz\xb0\x8e\xdaV\xad\xae\x0c~\xac\xd7\xee\x12\x02"\x1c~-\x89\x9e\xa1\x93~\xe8/\xdb\xcd\x0c\tz\x05\xdb\x1b\x88P*\xfe\x88J[\xa5f\x8b\x9a\x83j j`\xdfd\x1c\xe7\xedsyev\xd5\x9b\xcb\x8b\n\x8fsh\xbc\xe6\x14\x87\x9b\x80\xd6\xf1\x17\xce\xee\xc9\x14z\xa8\x8e\xb3\xdb\xf9\xe2V\x96d1[u\xce\xc4\x80P\x06\x06V#?P@U\xaa\xd3\xe6\xc4\xf1>$\xbc-\xcb\x02|g\xa2\xed\xeb\x9d\x91\x00R\xe6\x15\xc6\n\x13q\x8d\x98\xa6\xe5:Sb`6i\xb8;\xecs\xe0/C>\x10z\xba\xb6\xd5a(\xbf\xc8\xe6#\x92\xd5"\xbe\xbf\xe2DA\x96l\xee\x0c\xa2\xfe\xfc\x06\xf7S$E\xe2\xa3\xben$:\x11\xec>Oa\xf0\x1d\x9d\xc8\xee\xb8\xfa\x1d\xeev\xcdU\xb1\xeeB\x91\xd5t\xf8\xe7G\xbb;dp\x1dU_\x1d\xf4\x1b\x89d\xdf\x8f\x08\xe5\xf2\x8d\x14\xad\xc5\x11\x06?\xce\xec\x0b\x8f\x98\x17l\x10\xe4\xa2\xf4<bCA\xc6\xe6\xd5\x13\x1f\xacz\xd1\xc5\xa7\xfe\x01\xff\xb0\xa3\\\x9c\xaf\xe5_dR\xf5\xe8\x00\xb6P\xfa,\xd9\xa7x\xa3\xa6\xfd\xe3\'\xbe;b\xde{nyTT\xb5\x01\xb0\x04`\xdf\xa3(\x18X\x9a\x803\x01\x92\x19/\x99\x04a\x03\x96\x96\xaci\x82\xc5mdu\x10\x12\xf5\xb2"T\x1a\xc4(\x87t\xc8ZM?\x057\x8c\xa3d\xa8\xca8\xdc\xa9\xab\x19o\xa0\xf5\xbd\xae\x99\x8c\x0fk^erEG\xf3aDH\xbe\xe6\xa3\xf2*\xe9\xec\x0f\x190\xf9v\x82$8\xf7\x87\x95jd\xb9s\xa4\x1cj\xcc\xcb\x9d\xf9\xacq\x9ek\x14n\xff \xf6\xaf\x95l\x1c\xef`\xbd\xa2/\xc2g\x9f\xd6}\xb4\x9c\xdav\xf4\xa4N(\xd9\xd5\xbb-v\xe0\x19\x15Y+\x8b"\x04\xaf\xd7\x1e\xa3\xee\x1bH\x9c\xdfI\xf9\xeb\xebS\x81;0\xcb\xb3j(\x84\xb2c\xf7\x04\x98\xd7\x98R\xba\xee\xd8\x15\xa6b\x1e;\xc3vg\xfc8_s\x14\\\xd2\x9a\x90\x01\x88%\xcen\x01^\xb1\xb8\xc3\xd0\xe2\xa8y.z\xd4=+>\x8bI\x05\x0b\xfb\x93i@A\x92\x13c\xeb5e$\x97\xbe\x15\xc2o\xd8\x91g\xc2\xa8\xcb\xc7\xd4\xf2\xba\xc9\x94Xw\xaa\xc0\xe2\x98\xb4(\x12\xcfX29E\xe1\xd7\xbe8z\x9dp5*D\x1bKJ\xfd\x08>qF\x02\x9a\xafU\x92\xbe\x16\x07\x8c\x9b\xe8s\xb9I\x8b\xc4\xf4\xdc\t\xb3\\\x94\xb1\\\xd9\x8d\xffn\x9f\x147i\xbdXO\xa6a\xb8J\x83{\xba\x82D\x1dE4\x9e\xaeYe\xc6\xf2\xab\x8ar\x17\xf5\xd7y\x93W\xa4\x15\x90\xba\xbe5\xa6\xbd9\xb3\xab\xf3\xa5!\xd1&\x95.<\xcex|\xf2\xdb\xea\x9f\xbd\xfc\x13$\xc7\x0e8\x0fe\xb8\x9d\x11\x93\x02\xb8\xe7\xeb\xdft\xa3G\x97q\xe4\x89C}n\x0e\xe0\x08%:J\xee\x0b\\|r.V\x8c\xf8[\xc2|\xac\xd4\xd7\xbc\xc3\x1c\xa9H%\xf7\xea\xa8\xcec\xce\x81Kl\x89\xfaQ|8I\xb7\x84: x\\q151\x8d\xe0\x84\x13f\xc1&tp\xf0\xa4C\xa5\xbaT\xce{\xb8\xf3K\xc2\xd2\xb2\x93ojrAV\xb2\xc0\x8d\x82\xe9L\xdc\x88D\xb6\x88\x9cd\xeb\xfd\x02C\n\r\x01l\x12\xde\xces\xfd"\x9c\xb5z>\x18\xfe\'\x9cMC\xce@\xef\xb0\xee\xe8X\xd5_\x1d\x0e\xa9\xd3*o6)\xee\x01km\xde\xaf\x8ca\xec\xe3\xea\x0f\x96o\xe7\xe9Y\x18\x02\x07\x981\xda\x08\x8d\x8e4G\xc4e\xc4#\xed\x13\x8e\xaa\xfe\xadA\x15pL[\xaf;\xc7I\x9f\x8f\x8fU\xf4\xe0\r\xad#U\xca\xa9\xc6\xc9U\xc9\r\x0f\xb0\xd8X/\xa6\x82\x08es\xa9\x91Q#M\x9d\x98[\x1d\x1e\x99\x10\x98F\xc8\x7fjg;%\xcc\xc59\xea"~\xd0}"O\rJ\x08\xb3X\x12\x9b\x7f4\x8c[m\xab\x8f+T\xe6\x15\xcb\x8c\xdb\x98{\x02\xd4n\x83\'\x82a,\xb1\xbe\x9cO\xe2\xa7\xe4\xcc(]i{u\xe7#\x18wvM\x04\x93\xc0\x02\xddH@?\x12\xcd\xa1v\x0fV\xb9\xfdg\xc0y\xab*\xaa}\xce\x9d5\xe8\x8f\x873S\xa3B:<~;\x7f\xca\xf4\xad)\xaa"\xbb\xcc\x07\x9dY\x912\xde3E\x94`c\xa5\xcb\x17\xc1H(\x0c\x93\xd07\x01\xa1\xbai;L_V\xc6\x03N\xde\x87KCZ\'6t\x14\xcf\xd6\x95V\xa9\'\x0eC\xcd\x97\x89S\xa7\xa2\xedb\xadJ\x03\xe3v\xaa\xd9\xe5Nm&.\x80\xe2\x8aI8\xb4Jd\xa9$o\xe1\xfcB\x8a=\xb6Cx&1WD35\x91\xab\xde\xec%\xd9A\x8a\x9d\x19s4\x02<L\xc0\xfe\xa3\xddSb\xde\xa9\x9aG\x0b\xec\xf5\x1a\x01\xd80\xads6A\x94\xd3nj\xfb<\xed\xdb\xd6=\xb7\xee}\xc0E\x06\xb9\x83\xc6\x12\x8d\xf3\x95\x17\xb0\xc4\x06\'\xc4\xe3\x95\x1e\xc0\xfc\xca\xc8\x92\x0e\xe0\xf8\xce\x19\xe9\xef\x9f\x8e\x85\x1b\x8b\x16\xc2\xa5\xac\xcc\x99\xa9j\x9d!\xb5,\\\xf6E\xe8\xbc\xe1J1\x14q\x7fm:\x9d\x8e\xd6; mw\x7fh\x9bf\x10B\x9b\xe9.g\xe6\xfcf\x08\x958\xd6[\x1d\x07\xbdvi0\x1dg\xe6\xdeB\x14d\x01\x19\xad\x9d.\x06MZJ\xf0r\x98\x91\xd5\xf6mQ\xa7\x03\xcf\x0b\xb0\x1c\xb04\xfc\xaf\xd8\x81\x8f\x03\x0b\xe8\xca\xbf\xde\x81\xf3\xb1\'\t\xf3ZNz0\xc0\xb4k-\x7fbN\x9d\x16\xa3\x18\x04#c\xfe:\n\x8f$S\xe3j\x159\xb4\xd5\xc7G\xa4\xceI\xd7\xf1\xca\xacB\xc1\xbbN\x87\xe0B<\xb0H\x89!DD\xa6\x1b\xe4\x81\xba;\x9d\x9f\xa5({\xa3\x14g\xfd\\.\xc1\xd6\xb6\x80 Y\xee\xd8\xb1G\x86\x07F\xf3n\x17r\xf0\xf0\x11\xa9\xf4\xa74\x17\xaao\x19}BN\xc9\xfc}\xb2\xa6\x15\x82J-\xc0\xd5C\x8b\x93\x01\x9c\x7f\xb89\xc6L\x98\xc3`\xe1 \x17\xe74\xbd\xd0\x02<A\xea&f\x858\x0cZ\xce\xb3\xf71`\x991\x84\xa1*Q\x12\rk\xba\xfc\x83\xd5\x96\x0bI\xca3\xe8\x11\x13\x05ZPPq\xe6}\x99\xf14B\xb1m9\xb1\x17\xff\xeco\xff\xbe#\xe9\x7f3\xb5\xa7x\xbd\xf8\x07\xf2Wz\\\r\x83l\xaa\xf7\xf3\x95/>:\xa0\xc9W\xf5\x97\xfdE/\xaaPSZ\xde\xe3\x93+\xe2\xe2!\xea\xf1\xd5\xf8r2\xdd\x07\xb5\x88TQ\x16V\xbf6\n\xeb=\xa60\x08.^\x91yV\x9f\x1eB\xc6\xe1\xefCW\xf0*~\x84\x86%\xe9\xbb\xc3\xa6\x8d\xb2o\xe6\n\xce\x83\xcb\xeeR1\xe6I\xbf\x10\x1a\xc0\xe1Ca\xf6\xd6qq\xc7\xd3\x16\x06\xb5\xd3\x92$w<c\xe3\xfb\xacW!\x81/\xc5p-\xaa\x1du.\x80%\xc7\xc7[\xfc\xcf\xc5\x84\x98X\xb3^\x06\x91a\xdd1is\x9b\x0c\xc12\x90T\x92\x89\x80\x1d$\xe5}e+W\x82J\xa7\x8c\xc6^\xa0\x87\x16\x83\xfd}\xce\x04\x99\x9c\x8a\x1e\x15\x81@\xd5%\xf2J\xa4\xdb\xe8^\x15s\xc6\x06\xb5\xe5&\xe8\x03\x0fV)# \x08\xe2\x1c\x1c\xa0\x03\xbd\xdb\x98+t\x01\x07\xf8Io\x85%\xd3\xbf\xf0\xda\xa8\x96\x8d[\xad8~ jZgw\xbb@\x9d\xafr\x82+\x19\xda\x942\x04\x83 \xe7\x14WVZ/\x94/J\x8a\xc8#-\x08T\xaa:u\xe1\xd7\x022\x8e\xff*\x18\x8f[$\x90\x90\x05\xad\xb5\xbc\r\xd1C\x04\\\xdc\x03\xb8\x89\xad\xda\xe3\xee\xd1\x89_\x1f%\x89\x8aK\x9f\x87\x8a\xb3\xaf\xa4:\xaeZ\xe3\x80\xb1\xcf<\xa8t\xd8\x02\x9a*\xc7l\xd0\xe5\xe2\xdf\x05\xd5l\xcd\xcd\xe4S/\xedf_\x12\xf2\xd5\x8as\xb5\xb2\xe8T\xf5_.\x05\xd9\x930\xd6\xb5(\x0bp\x90\'C\xe7\x15`\xec]/\xb0\xb9\xae<\x92\xddC\'\x0e\xca\\mC\xa3\xf7\xad\x86\x99\x82\x1bE\xda\x92\xb4g\xb9d\xe9\x10B\x85\xef1)\x07[Z$\xfdl\x01\xeb6#\x01h\xfc\x02@{=)\x11\xa8\xc6\xef\x1b\x89B&Us\xe9\x92\x9f\x90\x00\xeb\x88H2@[\x8e\xca\xd8\xcc\xf07\x8c\xc7%\xa1\x88\xc5\x0b\x14\x7f\x00\x81I)b\xee\x82j\xa9\xb5Z\'\x9d\xd1\xd6\xc9\x97\xe6U\x08\x8b9\xac\xaa\xae\xc6\x14X\x8e\x80\x04\xd1}\xc8\xfab\xfaK\xbdj.\xb5m\x85~<\xbb\xdc\x9a\xa2\xf8W~\x885\x07\x18\xc4\xe3\x9fMQ\x15\xe1P/\x7f\xf4<\x04\x83\xdbO\xb3$\x87\xe8g4\xf5\x1dL\xab\x19I,\x0c\x11\xc7\xec\xa9b\xc0\xb7"CI\x9d\xbf\xef\xbbX\xbc \xfe\xd87r\x9a\xba=\xf5\xb3\xf5\xa0\x17\x85\x1e\x0e\x1b\xc8[\x05\xd6\xf9\xa2k\xf0\x8e\\\x04\xf4|\xafx\x82P)j=v\xbdu\\\xe7\xa3\x7fR\xed\xe0\x98|T\xec\x80\xdf?\xf6\xd8\xfe\x7fX(\xeeG\xd6\x19&\xae\xab$\x92\xd1\xb0\xc0\x03A\xe0\xda\xf1,vXV\x90\xf4\xd1[}[~\x91\xdd\x07\x81\xd5\xb6-\xe6\xfd4\xa8\x84\xf8\xfc\x9c-\x1ad\xc0\xc6H\xfb\x83\xf5\x15\x00U%\xbd\xec\x8br\xf5\xc7\x84\xa6S\x95\xc9\xe6\xf4\xab\x0c\xd7\x80w\x05!\r8/"\xf9P\x1e\x8b+\x94`\x7f/~\xafV\x04\xa3\x875gt\x12i\x0fa`\xd4\xd9\xecp\xa6@~\x01\x05b\x82\x12\x15\xac\x06~\xdc\x95\x97\xa2\xb4\x13\xa8h\xc0\xa0\xec\x0c\xe3[\xc8\xce\x03\x13\xe6\xe3\xb2\xd6\x0f\xe7\xe3\xbd\xf6p;^|\x12\x0eD\xd5^\xd6\x1b\x1d\xe6r\x98\xddYYJ\xceq*\xd9\xb9\x00\xc4\xa4\x93{\xe5\xcfG\xdb\xae?CC\xd0\xc5J\x18lX\x1c\x07\x0f\x95\xb7\xbb\x84\xc1t+a\x14\xfd\xe1S?j\x98\xee/\x08\x0e\xb7\xf8\xe2\n\xbd\xbc\xef.\t-\x0b]\xe7\xb1>a\xfd\n \xd82\xa5\xb7B\x99\xa4\xd7\xc0()\xf7k\xce\xbde=\x9d\xed\xe0\x06\xc2X\x83\xd0\xe0\xa0\x86\xdbC"\xdb/\x19\x0el0\x92\xa5\xddP6\xcd_\xcbv=\x86\x04(\xb8\xfa\x827\x944R\xb5\\\x90\xe2\xa5\xe6\xd9F\xcb[\x8c"\xe4\xe6\xef\xfe\x15\xeaw\x8eUEN\xdf\xb9\x1fvN\x08\xda\xe9\xfa#\x01*4\x7fk\xfb\xf4\x85^\xfc\xae\x11S\xd8\x8fX\xa8X\xe6\x9ccj\xb6\xcc\xed\xc3q\xc9\x1e\x00H\x7f\xb0\xd0\xc3\x99\xdf1YG\x83\xb5\xf7\x0cw\xe1m\xeag-\xe6\x07n?K\x81>\xb0\x07S3\x913\xfd\xdak\xdb\xf5zV\x8c\xb3\xa0g,z\xca\xea\x8dY\x83\x17\x14\x01\xbf\xebBC.7G\xf8u\xd1Z\xe6t\x0e~\x95\x84\x96\xcaE\xcf\xe1\xc3\x1a\r\x9e\xad\\\xd8\xcaF\'\xba\xfb\xd7\xdf\xd8\xc5\xbe\x84d\xc3\xc3H\xe3\xbf\xb0\xc2\xa7\x80\xc7D\xfc\xb1\x99\xdbUx\xe3LCB\x1b?T\x84\x10\xbc\xce,\xd2k\xdf\xc0\xfd\xa0@\xe0t\xb4\xb4h8\x9b\x93*\xda\xda\x85\xd2\x02\xef\xec\xde\xfe\x9a*\xe8\xa0\x9b\xae{\xf1\xa0~(\xe7^\xeb\xd19`\x0b\x0fc\xf5y\x01`\xd2\x10\xaaO6\xdeQ\xd9\x84\xad\x96!\x80z\xb5\x84\x16\x1a6\xa9\xa0\xb2\xa6D\x95 \xb2V\xd6\xc9\x03\xb0\xbe\x9e\xc2ON\xa2\xa6d\x11\xfd\xd67\xcc\x96\xc2lg\x06(\x8d\xfc\xb5\x95\xc4\xc4\xf1\x97\x9e\xd9:+\xe3+\x00\x0bP\xc6\x18\xde\x1b\x86aH\xb7\xb2<\x81\x16\x00U\xe3\x8d\x9d<\x12F(x&O6\x8eV\r\xe4Q\x08\xec\ne\xcdc\xc3\x98\x9d\xce/\xbe\xc4\x92W\x1d\x83\xddi\xd7MQ\xcc\x07Kr(\xddK\x83_\xe7\x8e\x19\xfd*e\xee\x08`\xa8a\xd32\xa9\x9f\x85\xa5\xa9\xf7w\x8b\xbc\x8e\xc3\xce\xeb\x990SX\xb5ye\x99\x8eP\x82\xac\x9f)]\nA7P\xfd\xd4Yl\x9e\t]\xfb\xe2;\xed\xa0v\xa3\x04\n\t\xe5\xee\x13\x9b\x01\x15\xe6\xbe\x93\xb9\xa5\x00\xa0\xc3I\xa83\'/&\xc0u\x1a\xfe\x84r?\x07\xf5\x96/\xd2\x96\x00\xff\x92\xcf\xbb=\xd0\x1e\x15\n%\xef\xae\x99\xda\x94\xd2\xe3\xee\x9d\xe8\xeb\xb5\x93\x99\xeb\x1a\x02\x92Q\xb7>\x9e\xe2\xb7\x8c=\xf8\x0eB\xd5\x15\r\xac-Nz\xc3\x95\x7f\x81N}\xa1\xe3\xa5\xf8\x07\xf8\xa7\xde\xde\x94\x0c[\xfbr\xe9\xea\xec\xd6\xb0F\xd3[UF6\x10+\xceD\xc7u\xed\x98\x9d!\xb4\xa5\xc4\x94\x8b\xaa\x81\xc7y\xd8\xc0\xdaK\xd5\x0e\xbeC#&\xfd_\x85~\x19^\x17.\x11\xa4\x95\xbb\xe8-\xd6(/\xbeD\xa8\xf6Z\xfb\xed\xfe\xad/\x85\x8f\xcd\xbb\xff3\x0b\xa3\xa5\x81\x89\\\x17WF\xf2&\x95\xad\x059,v%\xe3\x95\xbc[\xcf\xfa\x7f\xbfo"\x01r\xa8 S\xbb\xdd\xf4\xa2\xe4Le\x19\xe5\x14\xd6\xe8\x0fu\xa0\xf1\xf7\xc9\x8f\xb8\xe0\xd3\x10\xb6\x0e\xd2F\xfa\xe8Ht\xeb\x13\xb7\xd6_\xbe\xb1U;,v\x89\xaa`a`Ee\xfc\x06\xd7\xdb\xe4\xeb\x9dt\t\x88\x84\x82\xf7\xd7M\xd3\x91\xab\xd1\tdN=\x91S\xce\x9ae\x06\xb2\x84\xdb\xb1\x12|R\xccA\x11/{\x0b}\xad>w`\x9a\'\xbcx/\xae\xf1\x04Xro\x00P3\x98\x0c8`\xcet\xc6L\x94!\x8as\x8e\xb3V\xd4\xe1J~@\xd8\x06\xf6\xeb5\xc2\xeaU\xbc\x9a\xa3WId\x11\xd6\x02DC|}+h\xb3\xb6\xa3\xfc\x9dM~\x92\xf6o\xbcg\xc0\xa1\x98mb\xf6D\n1\xad\x9f\x0e\x7f\x92\xbb\xda\xd0\xe8\xed\xf93\xe6\xd1\x9a\x10\xfd,\xa1\xf6_lX\xcc\xdfR\xf8\xba\xe1\x93\x96L\xd1c\xd9\xa1\x0b\xeb\xe6y\xd0\xd1\xb4\xdc\x15y\x16\x8dN\xeb.\x93\xc6\\G\xa1\xe1\xddM\xe2\x1a\x166\xebp4\x9e\xb9h\xb0\xb5y71\rY\x9d\xf3\x160b\x05\x9fn\xcf\x88$\xc0\xbf\x1a.\xb4\xfa+%s+\x98\xe7\xfe\x80q\xfe\x99\xf4\xbf\xab\xda\x14Q\x7f\xe4\xcdCgS2\x8d\x90|Q\xd0\x96&\xe3o~\x1b\xc3\xb9&tS\xff\xd9\x01"\xca\xe0\x84\x8f\xf9_\xdc\xd0\x9f\xe6\x88\x05\x96\xf1{\x1a\xe3*\xb4~q"\xc3xn\xdci\xb2\xf9\x11\xa8\x90\x00Ii\xab\xa4\x13\xe6\x01\x96\x91\xad\x84\xda\xc49\xce\xba5\xdd)\x92W@`\xcf\x17\x14i\x9b\xdfAXzT\xcc\xce\xf5\xba\x18\xc7s\x1e\xd4\x83\xa2\x1f\xac\xe4\xf7\xba\x1a\x8a\xec\xeao*\xa9\x1e\xfd\x1cw\xadpY[\x1a\xa0\xcdMf\x96\xbf\x18\xe4\\\xda\xf9\t\xf9\x18I\xdf\x10\x9a\xd2]\xe98y\xe9\x93\xe6Ka\xc1\x9f\x03*A\x11{\xb4f8\x80;\xbeI&\xbd\x1e\xcbf\xc9\xdc{\xf6\xeb\xc9\xc2\xb9\xb9\xac;\xcf\x9fvD\xac\xefjR;\xd9\x93X0\xcd\xbb\xe3\xd1\x90\xf9o\xe1\xfe[j\xfd\x81\xf1\x0b\x13\xe3\xc6u\x05\x1c2\xf0R\x07xx\x89\xd5\n6\\\x82\x88\x17V\xe4&\xb3R\x9a\x9dj \x00\xb4Lpg6L\x18\xf2\x13\xaa\xc5\x15Z\xceX_\x01Y"\x86\t\xb0\xac\xfdA\x14\xd3#\xe5-\x8cl.\xf9i&5\xa8\xa6\x8e\x99s$\xd2\nw\x12\x0f\x9bT\x1f\xba7\x84\x1ctA\xc3\xb7\xf2\'\xd1_\xef\xd738Z\x92-\xdd\xa7xG\xae\x107\xea\xa2\x05\xbd\xefLs\x9b\xd4\xf2\x9f\xf84\xc7\x85\xeb\xfe}\xa1\xc5os\x8b\xcd.\t\x1a\x00\xbdK\r\xb1\xadE\xe7\xda/\xder7\x1f\x95\xbf\x90?\xa6\xf7\xfc\xe7\xec\xc5\t\x81\x17\xc7\x06R\xaf##\x0b\x8cX\xdd\x93S\x8a\x8b\xbf~\xbft4"A\x9c\xb5\xa2p\x10O\xb5I\xee\x1d\xb43\x82\x92\xf8\xfd\x82\x08\xd7PR\x07Ht\x16\xfc/(\x1d,\xa1"\xba}yX\xf4\xbbM\xdc\xd9\xac\xf4\x9b\x8f\xb5\xb2g\xf1\xffb\xa4M\xd7\xcb=\x90\xf1\xd5jW\xeaW\x0e\x03]U\xb3\x12\xec\t\xf6\x1b\x8d\x17W\x19t\xbe\xfa\xf6\xbd\xea>:j\xc2T\xc6\xa2|\x04\x9c1?Tm\x15\xd7\xfc\xfa\xe5\x98\xb1FHxJ\xc4hX_?\xe5\x15\x91|e\x1d\xa1!\x8e\xd4\xe3c\x86w\xb3\xeal\xcc\xc1\xeas\xef\xc1\x97U/\xed\n\x0bD\x9d\x12N\x89\xcf\x96{9:z2\x06va\xa0\x11\xc7\xcb\x18`\xdc\xfe\xff\xda=\xd6\xedpS\x94\x88\xa92\xf8\x92\xb7\xc0\xfe\x8a-\x9e\x00\xad\x16\x86\xd1\xc1fpK\x08\xf2\xcd\xd5\xf9[:\x19z{\xb4A\x00h\xc6\x89!\xdaV\xd7r\x91\x92\x19\x9f;\t?\x9e\xe6\xd2,\x00\x91I\x16\xbc\xf3\x84\x1b\x07\x0f\xd0\xbb\x99p\xb5\xa5\xda2\xbc-n:i\n\xcf\xe1\xd8W}\x16\xa5\xad\xf0\x88\x93woewD\xee\xbe>\xf4\x87\xed\xeb\xcf\r&\xc9\x16n\xfb\xc9\xa4\x94\x13\n\xbbY\xbf\x18$\xfe\xdb\x0bw\xc7c\x12\xaa\xb2\xb7\x1f\xd9\xd1\xf7\xf8\x87Xs\x05\x84\x95\xd1\x16`\xbbUn\xeb\x7f\x8b\x972c\xe15\x03\xbfS\xfd5\x13-6\' r\xc0\x0eqb|.\xa6y\xffc\xd4m\xba@\x14\xa2e\xe0\x9aL:\xf0Z\x8bv\x86\x1f\x97n\xf0nt\xc9`-\xd1\x84P\x8e\xe0\xc3\x97z\xe6\xd4\x93\xdbi\x91w\xabS\x1c.\x1d\x1cg\xb4\x9a\nkL\xe1\xc8\x07&\x1e\xa1\xd6C\xbc\x8bl\xbe0.\x86\xe1\x11\xc9g\x80:\x0c\xee\xa7v\xf3k\x19[\xe8Uwc\x93\x08\x1b\xf5\xb2\x84\x9c\x99|\x94\x12\x99\xed]\xc6\x7fsrl\x04\xc2\xe6\x00\xc9\x8c\x84C\xdf\xba\xaf\xdfE\x7f\x94&\x02-\x83~\xa0\xca\\\x9dQ\xa7H\x1f\x1e\xc1h~"\x1bH6\xbf\xbc\xfc\xf9\xf4\xbcLw\xd6\x1e\x8b\xc0\x8a,Lz\x87_\xbcyr\xf7\x0c$Z7&\xcd\xe5\xa2\x06k<\x06,\x94\x86~S\xd9p\x87\xc3\x7f\xb3\xa8Z\x1d\x8asA\xd1b\xef\x1f\xc7uP\x18B`\x8d b\xe8\r\x9c\x93\xda\xfc:\x15\xae\xe7\xf0\xad\x0c^/\xeb\xf3\xf6\x11\xdafT\xe9\x82\x14wX\x84\xc1\x01\xa0\xa8\x817\xc3\x84w\xc0Y\x1e\x8c\xaaa\x05\xff\n\x90')
|
1
|
+
import flask_babel,flask_babelex
|
2
|
+
from hiddifypanel.models import BoolConfig,StrConfig,ConfigEnum,hconfig,ConfigCategory
|
3
|
+
from wtforms.validators import Regexp, ValidationError
|
4
|
+
from flask_babelex import lazy_gettext as _
|
5
|
+
# from flask_babelex import gettext as _
|
6
|
+
import wtforms as wtf
|
7
|
+
from flask_wtf import FlaskForm, CSRFProtect
|
8
|
+
from flask_bootstrap import SwitchField
|
9
|
+
|
10
|
+
from flask_admin.base import expose
|
11
|
+
# from gettext import gettext as _
|
12
|
+
|
13
|
+
|
14
|
+
import re
|
15
|
+
from flask import render_template,current_app, Markup,url_for
|
16
|
+
from hiddifypanel.panel.hiddify import flash
|
17
|
+
from hiddifypanel.models import *
|
18
|
+
from hiddifypanel.panel.database import db
|
19
|
+
from wtforms.fields import *
|
20
|
+
from flask_classful import FlaskView
|
21
|
+
from hiddifypanel.panel import hiddify,hiddify_api,custom_widgets
|
22
|
+
|
23
|
+
class CommercialSettings(FlaskView):
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
def index(self):
|
28
|
+
form=get_config_form()
|
29
|
+
return render_template('config.html',form=form)
|
30
|
+
|
31
|
+
|
32
|
+
def post(self):
|
33
|
+
form=get_config_form()
|
34
|
+
if form.validate_on_submit():
|
35
|
+
|
36
|
+
|
37
|
+
boolconfigs=BoolConfig.query.filter(BoolConfig.child_id==0).all()
|
38
|
+
bool_types={c.key:'bool' for c in boolconfigs}
|
39
|
+
old_configs=get_hconfigs()
|
40
|
+
for cat,vs in form.data.items():#[c for c in ConfigEnum]:
|
41
|
+
|
42
|
+
if type(vs) is dict:
|
43
|
+
for k,v in vs.items():
|
44
|
+
|
45
|
+
if k in [c for c in ConfigEnum]:
|
46
|
+
#if not k.commercial():continue
|
47
|
+
if k in bool_types:
|
48
|
+
BoolConfig.query.filter(BoolConfig.key==k,BoolConfig.child_id==0).first().value=v
|
49
|
+
else:
|
50
|
+
if "_domain" in k or k in [ConfigEnum.admin_secret]:
|
51
|
+
v=v.lower()
|
52
|
+
if "port" in k:
|
53
|
+
for p in v.split(","):
|
54
|
+
for k2,v2 in vs.items():
|
55
|
+
if "port" in k2 and k!=k2 and p in v2:
|
56
|
+
flash(_("Port is already used! in")+f" {k2} {k}",'error')
|
57
|
+
return render_template('config.html', form=form)
|
58
|
+
if k == ConfigEnum.parent_panel and v!='':
|
59
|
+
# v=(v+"/").replace("/admin",'')
|
60
|
+
v=re.sub("(/admin/.*)","/",v)
|
61
|
+
|
62
|
+
try:
|
63
|
+
if hiddify_api.sync_child_to_parent(v)['status']!=200:
|
64
|
+
flash(_("Can not connect to parent panel!"),'error')
|
65
|
+
return render_template('config.html', form=form)
|
66
|
+
except:
|
67
|
+
flash(_("Can not connect to parent panel!"),'error')
|
68
|
+
return render_template('config.html', form=form)
|
69
|
+
StrConfig.query.filter(StrConfig.key==k,StrConfig.child_id==0).first().value=v
|
70
|
+
|
71
|
+
# print(cat,vs)
|
72
|
+
|
73
|
+
db.session.commit()
|
74
|
+
flask_babel.refresh()
|
75
|
+
flask_babelex.refresh()
|
76
|
+
|
77
|
+
|
78
|
+
from hiddifypanel.panel.commercial.telegrambot import register_bot
|
79
|
+
register_bot()
|
80
|
+
if hconfig(ConfigEnum.parent_panel):
|
81
|
+
hiddify_api.sync_child_to_parent()
|
82
|
+
reset_action=hiddify.check_need_reset(old_configs)
|
83
|
+
if reset_action:
|
84
|
+
return reset_action
|
85
|
+
|
86
|
+
if old_configs[ConfigEnum.admin_lang]!=hconfig(ConfigEnum.admin_lang):
|
87
|
+
form=get_config_form()
|
88
|
+
return render_template('config.html', form=form)
|
89
|
+
flash(_('config.validation-error'), 'danger')
|
90
|
+
return render_template('config.html', form=form)
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
# form=HelloForm()
|
97
|
+
# # return render('config.html',form=form)
|
98
|
+
# return render_template('config.html',form=HelloForm())
|
99
|
+
form=get_config_form()
|
100
|
+
return render_template('config.html',form=form)
|
101
|
+
|
102
|
+
def get_babel_string(self):
|
103
|
+
res=""
|
104
|
+
strconfigs=StrConfig.query.all()
|
105
|
+
boolconfigs=BoolConfig.query.all()
|
106
|
+
bool_types={c.key:'bool' for c in boolconfigs}
|
107
|
+
|
108
|
+
configs=[*boolconfigs,*strconfigs]
|
109
|
+
for cat in ConfigCategory:
|
110
|
+
if cat=='hidden':continue
|
111
|
+
|
112
|
+
cat_configs=[c for c in configs if c.key.category()==cat]
|
113
|
+
|
114
|
+
for c in cat_configs:
|
115
|
+
res+=f'{{{{_("config.{c.key}.label")}}}} {{{{_("config.{c.key}.description")}}}}'
|
116
|
+
|
117
|
+
|
118
|
+
res+=f'{{{{_("config.{cat}.label")}}}}{{{{_("config.{cat}.description")}}}}'
|
119
|
+
for c in ConfigEnum:
|
120
|
+
res+=f'{{{{_("config.{c}.label")}}}} {{{{_("config.{c}.description")}}}}'
|
121
|
+
return res
|
122
|
+
|
123
|
+
|
124
|
+
def get_config_form():
|
125
|
+
|
126
|
+
|
127
|
+
strconfigs=StrConfig.query.filter(StrConfig.child_id==0).all()
|
128
|
+
boolconfigs=BoolConfig.query.filter(BoolConfig.child_id==0).all()
|
129
|
+
bool_types={c.key:'bool' for c in boolconfigs}
|
130
|
+
|
131
|
+
configs=[*boolconfigs,*strconfigs]
|
132
|
+
# categories=sorted([ c for c in {c.key.category():1 for c in configs}])
|
133
|
+
# dict_configs={cat:[c for c in configs if c.category==cat] for cat in categories}
|
134
|
+
class DynamicForm(FlaskForm):
|
135
|
+
pass
|
136
|
+
is_parent=hconfig(ConfigEnum.is_parent)
|
137
|
+
for cat in ConfigCategory:
|
138
|
+
if cat=='hidden':continue
|
139
|
+
|
140
|
+
cat_configs=[c for c in configs if c.key.category()==cat and c.key.commercial() and (not is_parent or c.key.show_in_parent()) ]
|
141
|
+
print(cat,cat_configs)
|
142
|
+
if len(cat_configs)==0:continue
|
143
|
+
|
144
|
+
class CategoryForm(FlaskForm):
|
145
|
+
description_for_fieldset=wtf.fields.TextAreaField("",description=_(f'config.{cat}.description'),render_kw={"class":"d-none"})
|
146
|
+
for c in cat_configs:
|
147
|
+
if c.key in bool_types:
|
148
|
+
field= SwitchField(_(f'config.{c.key}.label'), default=c.value,description=_(f'config.{c.key}.description'))
|
149
|
+
elif c.key==ConfigEnum.lang or c.key==ConfigEnum.admin_lang:
|
150
|
+
field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("en",_("lang.en")),("fa",_("lang.fa")),("zh",_("lang.zh"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
|
151
|
+
elif c.key==ConfigEnum.country :
|
152
|
+
field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("ir",_("Iran")),("zh",_("China"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
|
153
|
+
elif c.key==ConfigEnum.package_mode:
|
154
|
+
field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("release",_("Release")),("develop",_("Develop"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
|
155
|
+
elif c.key==ConfigEnum.utls:
|
156
|
+
field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("none","None"),("chrome","Chrome"),("edge","Edge"),("ios","iOS"),("android","Android"),("safari","Safari"),("firefox","Firefox"),('random','random'),('randomized','randomized')],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
|
157
|
+
elif c.key==ConfigEnum.telegram_lib:
|
158
|
+
# if hconfig(ConfigEnum.telegram_lib)=='python':
|
159
|
+
# continue6
|
160
|
+
libs=[("python",_("lib.telegram.python")),("tgo",_("lib.telegram.go")),("orig",_("lib.telegram.orignal")),("erlang",_("lib.telegram.erlang"))]
|
161
|
+
field=wtf.fields.SelectField(_("config.telegram_lib.label"),choices=libs,description=_("config.telegram_lib.description"),default=hconfig(ConfigEnum.telegram_lib))
|
162
|
+
elif c.key==ConfigEnum.branding_freetext:
|
163
|
+
validators=[wtf.validators.Length(max=2048)]
|
164
|
+
render_kw={'class':"ltr",'maxlength':2048}
|
165
|
+
field= custom_widgets.CKTextAreaField(_(f'config.{c.key}.label'), validators, default=c.value, description=_(f'config.{c.key}.description'),render_kw=render_kw)
|
166
|
+
else:
|
167
|
+
render_kw={'class':"ltr"}
|
168
|
+
validators=[]
|
169
|
+
if c.key==ConfigEnum.domain_fronting_domain:
|
170
|
+
validators.append(wtf.validators.Regexp("^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})|$",re.IGNORECASE,_("config.Invalid domain")))
|
171
|
+
validators.append(hiddify.validate_domain_exist)
|
172
|
+
elif '_domain' in c.key:
|
173
|
+
validators.append(wtf.validators.Regexp("^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$",re.IGNORECASE,_("config.Invalid domain")))
|
174
|
+
validators.append(hiddify.validate_domain_exist)
|
175
|
+
|
176
|
+
if c.key!=ConfigEnum.decoy_domain:
|
177
|
+
validators.append(wtf.validators.NoneOf([d.domain.lower() for d in Domain.query.all()],_("config.Domain already used")))
|
178
|
+
validators.append(wtf.validators.NoneOf([cc.value.lower() for cc in StrConfig.query.filter(StrConfig.child_id==0).all() if cc.key!=c.key and "fakedomain" in cc.key and cc.key!=ConfigEnum.decoy_domain],_("config.Domain already used")))
|
179
|
+
render_kw['required']=""
|
180
|
+
|
181
|
+
if c.key ==ConfigEnum.parent_panel:
|
182
|
+
validators.append(wtf.validators.Regexp("()|(http(s|)://([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})/.*)",re.IGNORECASE,_("Invalid admin link")))
|
183
|
+
if c.key == ConfigEnum.telegram_bot_token:
|
184
|
+
validators.append(wtf.validators.Regexp("()|^([0-9]{8,12}:[a-zA-Z0-9_-]{30,40})|$",re.IGNORECASE,_("config.Invalid telegram bot token")))
|
185
|
+
if c.key==ConfigEnum.branding_site :
|
186
|
+
validators.append(wtf.validators.Regexp("()|(http(s|)://([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})/?.*)",re.IGNORECASE,_("config.Invalid brand link")))
|
187
|
+
# render_kw['required']=""
|
188
|
+
|
189
|
+
if 'secret' in c.key:
|
190
|
+
validators.append(wtf.validators.Regexp("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",re.IGNORECASE,_('config.invalid uuid')))
|
191
|
+
render_kw['required']=""
|
192
|
+
|
193
|
+
if c.key==ConfigEnum.proxy_path:
|
194
|
+
validators.append(wtf.validators.Regexp("^[a-zA-Z0-9]*$",re.IGNORECASE,_("config.Invalid proxy path")))
|
195
|
+
render_kw['required']=""
|
196
|
+
|
197
|
+
if 'port' in c.key:
|
198
|
+
if c.key in [ConfigEnum.http_ports,ConfigEnum.tls_ports]:
|
199
|
+
validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$",re.IGNORECASE,_("config.Invalid port")))
|
200
|
+
render_kw['required']=""
|
201
|
+
else:
|
202
|
+
validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$|^$",re.IGNORECASE,_("config.Invalid port")))
|
203
|
+
|
204
|
+
|
205
|
+
# validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$",re.IGNORECASE,_("config.port is required")))
|
206
|
+
|
207
|
+
for val in validators:
|
208
|
+
if hasattr(val,"regex"):
|
209
|
+
render_kw['pattern']=val.regex.pattern
|
210
|
+
render_kw['title']=val.message
|
211
|
+
field= wtf.fields.StringField(_(f'config.{c.key}.label'), validators, default=c.value, description=_(f'config.{c.key}.description'),render_kw=render_kw)
|
212
|
+
setattr(CategoryForm,c.key , field)
|
213
|
+
|
214
|
+
multifield=wtf.fields.FormField(CategoryForm,Markup('<i class="fa-solid fa-plus"></i> '+_(f'config.{cat}.label')))
|
215
|
+
|
216
|
+
setattr(DynamicForm, cat, multifield)
|
217
|
+
|
218
|
+
setattr(DynamicForm,"submit",wtf.fields.SubmitField(_('Submit')))
|
219
|
+
|
220
|
+
|
221
|
+
return DynamicForm()
|
222
|
+
|
223
|
+
|
224
|
+
|
4
225
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
226
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,39 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
4
|
-
|
1
|
+
from flask_admin.contrib import sqla
|
2
|
+
from hiddifypanel.panel.database import db
|
3
|
+
from wtforms.validators import Regexp
|
4
|
+
from hiddifypanel.models import User, Domain, DomainType, StrConfig, ConfigEnum, get_hconfigs,ShowDomain,hconfig
|
5
|
+
from wtforms.validators import Regexp, ValidationError
|
6
|
+
from hiddifypanel.panel.admin.adminlte import AdminLTEModelView
|
7
|
+
from flask_babelex import gettext as __
|
8
|
+
from flask_babelex import lazy_gettext as _
|
9
|
+
from hiddifypanel.panel import hiddify,hiddify_api
|
10
|
+
from flask import Markup
|
11
|
+
from flask import Flask
|
12
|
+
from flask_sqlalchemy import SQLAlchemy
|
13
|
+
from flask_admin import Admin
|
14
|
+
from flask_admin.contrib.sqla import ModelView
|
15
|
+
from wtforms import SelectMultipleField
|
16
|
+
|
17
|
+
|
18
|
+
from wtforms.widgets import ListWidget, CheckboxInput
|
19
|
+
from sqlalchemy.orm import backref
|
20
|
+
# Define a custom field type for the related domains
|
21
|
+
from flask_admin.form.fields import Select2TagsField,Select2Field
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
class ProxyDetailsAdmin(AdminLTEModelView):
|
26
|
+
column_hide_backrefs = True
|
27
|
+
form_excluded_columns=['child']
|
28
|
+
column_exclude_list =['child']
|
29
|
+
# list_template = 'model/domain_list.html'
|
30
|
+
# edit_modal = True
|
31
|
+
# form_overrides = {'work_with': Select2Field}
|
32
|
+
|
33
|
+
def after_model_change(self, form, model, is_created):
|
34
|
+
if hconfig(ConfigEnum.parent_panel):
|
35
|
+
hiddify_api.sync_child_to_parent()
|
36
|
+
def after_model_delete(self, model):
|
37
|
+
if hconfig(ConfigEnum.parent_panel):
|
38
|
+
hiddify_api.sync_child_to_parent()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
39
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,51 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
4
|
-
|
1
|
+
from .ProxyDetailsAdmin import ProxyDetailsAdmin
|
2
|
+
from .CommercialSettings import CommercialSettings
|
3
|
+
from hiddifypanel.panel import hiddify
|
4
|
+
from hiddifypanel.models import *
|
5
|
+
from hiddifypanel.panel.database import db
|
6
|
+
from hiddifypanel import Events
|
7
|
+
|
8
|
+
commercial=False
|
9
|
+
def init_app(app):
|
10
|
+
from . import restapi
|
11
|
+
restapi.init_app(app)
|
12
|
+
return
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
def config_changed_event(conf,old_value):
|
18
|
+
|
19
|
+
|
20
|
+
if conf.key==ConfigEnum.is_parent:
|
21
|
+
if conf.value and not is_valid():
|
22
|
+
set_hconfig(ConfigEnum.is_parent,False)
|
23
|
+
if not old_value and conf.value:
|
24
|
+
Domain.query.delete()
|
25
|
+
db.session.commit()
|
26
|
+
db.session.add(ParentDomain(domain=hiddify.get_ip(4)+".sslip.io"))
|
27
|
+
db.session.commit()
|
28
|
+
|
29
|
+
Events.config_changed.subscribe(config_changed_event)
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
# def db_init_event(db_version):
|
34
|
+
# if not is_valid():
|
35
|
+
# db.add(BoolConfig(ConfigEnum.db_version,10,child_id=0))
|
36
|
+
# db.add(BoolConfig(ConfigEnum.db_version,11,child_id=0))
|
37
|
+
# return
|
38
|
+
# # if hconfig(ConfigEnum.is_parent) and ParentDomain.query.count()==0:
|
39
|
+
# # external_ip=hiddify.get_ip(4)
|
40
|
+
# # db.session.add(ParentDomain(domain=f"{external_ip}.sslip.io",show_domains=[]))
|
41
|
+
# Events.db_init_event.subscribe(db_init_event)
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
def admin_prehook(flaskadmin,admin_bp):
|
46
|
+
# flaskadmin.add_view(ParentDomainAdmin(ParentDomain, db.session))
|
47
|
+
flaskadmin.add_view(ProxyDetailsAdmin(Proxy, db.session))
|
48
|
+
CommercialSettings.register(admin_bp)
|
49
|
+
|
50
|
+
Events.admin_prehook.subscribe(admin_prehook)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
51
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,16 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
from flask import Blueprint
|
2
|
+
from flask_restful import Api
|
3
|
+
from .tgbot import bot,register_bot,TGBotResource
|
4
|
+
|
5
|
+
|
6
|
+
bp = Blueprint("api", __name__, url_prefix="/<proxy_path>/<user_secret>/api/v1")
|
7
|
+
api = Api(bp)
|
8
|
+
|
9
|
+
|
10
|
+
def init_app(app):
|
11
|
+
api.add_resource(TGBotResource, "/tgbot/")
|
12
|
+
with app.app_context():
|
13
|
+
register_bot()
|
14
|
+
app.register_blueprint(bp)
|
4
15
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
16
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,59 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
import time
|
2
|
+
import telebot
|
3
|
+
from flask import abort, request
|
4
|
+
from flask_restful import Resource
|
5
|
+
|
6
|
+
from hiddifypanel.models import *
|
7
|
+
|
8
|
+
logger = telebot.logger
|
9
|
+
|
10
|
+
|
11
|
+
class ExceptionHandler(telebot.ExceptionHandler):
|
12
|
+
def handle(self, exception):
|
13
|
+
logger.error(exception)
|
14
|
+
|
15
|
+
|
16
|
+
bot = telebot.TeleBot("", parse_mode="HTML", threaded=False, exception_handler=ExceptionHandler())
|
17
|
+
bot.username=''
|
18
|
+
|
19
|
+
def register_bot():
|
20
|
+
try:
|
21
|
+
global bot
|
22
|
+
token = hconfig(ConfigEnum.telegram_bot_token)
|
23
|
+
if token:
|
24
|
+
bot.token = hconfig(ConfigEnum.telegram_bot_token)
|
25
|
+
try:
|
26
|
+
bot.username=bot.get_me().username
|
27
|
+
except:
|
28
|
+
pass
|
29
|
+
bot.remove_webhook()
|
30
|
+
time.sleep(0.1)
|
31
|
+
domain = (ParentDomain if hconfig(ConfigEnum.is_parent) else Domain).query.first().domain
|
32
|
+
proxy_path = hconfig(ConfigEnum.proxy_path)
|
33
|
+
user_secret = hconfig(ConfigEnum.admin_secret)
|
34
|
+
bot.set_webhook(url=f"https://{domain}/{proxy_path}/{user_secret}/api/v1/tgbot/")
|
35
|
+
except Exception as e:
|
36
|
+
print(e)
|
37
|
+
import traceback
|
38
|
+
traceback.print_stack()
|
39
|
+
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
class TGBotResource(Resource):
|
44
|
+
def post(self):
|
45
|
+
try:
|
46
|
+
if request.headers.get('content-type') == 'application/json':
|
47
|
+
json_string = request.get_data().decode('utf-8')
|
48
|
+
update = telebot.types.Update.de_json(json_string)
|
49
|
+
bot.process_new_updates([update])
|
50
|
+
return ''
|
51
|
+
else:
|
52
|
+
abort(403)
|
53
|
+
except Exception as e:
|
54
|
+
print("Error", e)
|
55
|
+
import traceback
|
56
|
+
traceback.print_exc()
|
57
|
+
return "", 500
|
4
58
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
59
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
from . import bot
|
2
|
+
|
3
|
+
|
4
|
+
@bot.message_handler(func=lambda message: True)
|
5
|
+
def not_handled(message):
|
6
|
+
bot.reply_to(message, "We can not understand your request")
|
7
|
+
|
8
|
+
|
9
|
+
@bot.callback_query_handler(func=lambda call: True)
|
10
|
+
def update_usage_callback(call): # <- passes a CallbackQuery type object to your function
|
11
|
+
bot.answer_callback_query(call.id, "Incorrect callback", cache_time=1)
|
4
12
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
13
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|