hiddifypanel 3.0.0.dev64__cp310-cp310-manylinux2014_x86_64.whl → 3.0.0.dev65__cp310-cp310-manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hiddifypanel/Events.py +27 -4
- hiddifypanel/VERSION +1 -1
- hiddifypanel/VERSION.py +1 -3
- hiddifypanel/__init__.py +7 -3
- hiddifypanel/__main__.py +13 -3
- hiddifypanel/base.py +88 -3
- hiddifypanel/base2.py +40 -3
- hiddifypanel/models/__init__.py +10 -3
- hiddifypanel/models/child.py +26 -4
- hiddifypanel/models/config.py +105 -4
- hiddifypanel/models/config_enum.py +207 -4
- hiddifypanel/models/domain.py +106 -4
- hiddifypanel/models/proxy.py +55 -3
- hiddifypanel/models/usage.py +58 -3
- hiddifypanel/models/user.py +171 -3
- hiddifypanel/panel/__init__.py +7 -4
- hiddifypanel/panel/admin/Actions.py +170 -3
- hiddifypanel/panel/admin/Backup.py +80 -4
- hiddifypanel/panel/admin/ChildAdmin.py +122 -3
- hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
- hiddifypanel/panel/admin/Dashboard.py +70 -4
- hiddifypanel/panel/admin/DomainAdmin.py +195 -4
- hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
- hiddifypanel/panel/admin/QuickSetup.py +127 -4
- hiddifypanel/panel/admin/SettingAdmin.py +224 -3
- hiddifypanel/panel/admin/Terminal.py +51 -4
- hiddifypanel/panel/admin/UserAdmin.py +277 -4
- hiddifypanel/panel/admin/__init__.py +82 -4
- hiddifypanel/panel/admin/adminlte.py +13 -4
- hiddifypanel/panel/admin/commercial_info.py +23 -3
- hiddifypanel/panel/admin/websocket.py +9 -3
- hiddifypanel/panel/admin_2.py +33 -3
- hiddifypanel/panel/asset.py +17 -3
- hiddifypanel/panel/cf_api.py +35 -4
- hiddifypanel/panel/clean_ip.py +125 -3
- hiddifypanel/panel/cli.py +172 -3
- hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
- hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
- hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
- hiddifypanel/panel/commercial/__init__.py +50 -4
- hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
- hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
- hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
- hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
- hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
- hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
- hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
- hiddifypanel/panel/common.py +98 -3
- hiddifypanel/panel/custom_widgets.py +71 -4
- hiddifypanel/panel/database.py +18 -3
- hiddifypanel/panel/hiddify.py +655 -4
- hiddifypanel/panel/hiddify_api.py +70 -3
- hiddifypanel/panel/init_db.py +393 -3
- hiddifypanel/panel/usage.py +85 -3
- hiddifypanel/panel/user/__init__.py +25 -4
- hiddifypanel/panel/user/link_maker.py +416 -3
- hiddifypanel/panel/user/templates/home/multi.html +1 -1
- hiddifypanel/panel/user/user.py +233 -3
- hiddifypanel/static/css/custom.css +6 -0
- hiddifypanel/templates/500.html +1 -1
- hiddifypanel/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +67 -69
- hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
- hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
- pyarmor_runtime_000000/__init__.py +0 -4
- pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,130 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x8e\x1d\x00\x00\x12\t\x04\x00\x0c\xd5\x96\xa9\\\x01B\xdb\x80\xe2\x88\x86\xd8\xe2Z7\x00\x00\x00\x00\x00\x00\x00\x00\xd8%\xcd\x92\xb8\xf5I\x17\xe2\xa0v\x07\x82\x1e\xbf6\x14\xeb\x9b\xe9i\xd3\xdc\x00b\x1f\x14\xcaA\xc6\xff\\\xce\xc2\x83\xa5<\xd4\xee\xf1\xd6\xe5A\x11\xb5M\x91]v\x7f9\x83H\x058\xa5\xc6\x82O4N\xc7B\x8f\x83`d\xed\\\x00\xc4\x12\xf3\xc6B\x02AB\x96iM+\xe6U\x98\xf8\x8au\xf9\xa59\xfe\x1b\x93\xe2\xe7a\xf6\xc4L\xe03R\xf9\xbe2\xb5\x83\x90\x8f\x8d\xa2\xb7\xf7\x7f\x87\x9fa\x98\x8e\xff\x81\x12F\xfb}\x96\x8f\xc2e\x0c(\xaa\x97\xb0\xd2\xc3\x91\x1bQ\x1c)\x835\x913P\x99\x84\xediw\x7fMX)\xc6\xb2\xea\x8eo\xeb\x8e\xcbL\xbe]\xb6\xe7wy\xbf\'\x93\xd9\xc60\xce0\xdeN2b,`\xc1@\xf5Tk\x91\xba\xb2\x12\xa1\xb6P\x80\xe5\x91\x8c|\xa3-\x0c\xcb/\xc1ey\x92\xeek\xdaX\x82\xc8Z6GYuI\xe5\x02t\x0b\x1dL\x89\xe4\x9f\xf0\x80v\xb45]\x8fk\x1c\xdb4`\x0c~\x1d\xaeS\x92\xba\x90\xe8*|\xb1\xa1T:g\xd3N:7\x10\xef\x953\xf8\xcc\x91\x0c\xf9\xb4\xeeTb\xfc;Y.M\xce[\xc0\')\x8aV\xdd7\x1f\xcc\xdb\xfeF\xf8C$\x9a\x8c\xe1\x07\xbb\xd8\xda\x12\xe9\x18\xfe\x17\xcb\x93\xb1\xd8fI9\x1a\x10e*\xf3\xb2\x9ct=t\xed\x00\xebf7\x12\xc9l\xa7\xa8\x84\xaa\x9d\x88\xa1\x1ey4\xad\xb4\x82)\xc3h\xe18\x94r\x18^\xb7\xee4\xc7<npSEN\x98\x8b&~H\xa6\xba\x066O\xd7\x88\xa7E\x80\xb1\xe63\xc5\x1e`mr:\x8a]\x07\xbc\xf6\xe1d\x8c$\xd5\x8d]O[Z8\x1a\xfc\xbf\x1b\x9fD\x80\xb1\xeaw\xfelca\x89\x99\xc7Bt]\xe7(8\x16\xd7\xbaDas\x15\r?\xeb0\xe2\xb4\xa3r\xc2\n;\xcd\xdel\x06x\xa0\x84*\xb9\x9a\xca@#\xa7u\t\xc3\xc5\xc2\xc1\xb6 \x06)\x8b\xb7\xae -\xaa\x1c"\xf5\x8a\xd4*\xf4*\x12P\xc3\xe9\xc3\rrM\xc3\xb6\xcb5|a\x10l\xa8\xbbb\t\xc9\xa6\x16u\xf3AH\xa7\x1fJ?\xd4\xdcV\xdd\x91\xde?\xba\x8a\xbc\x04\xa8\xfd\x10_\x05\x00\xde\xf5\xf9+\x80\xbf\x92\x8cAb<\xcfR\xadw\xd1I be\x86\x7f\xe4\xbbO\x85\xc9\xa7\xbb\x95"y\xceU\xc3\xae\xc1vl;Z\xa8\x0b6\rF\xcd\x1chl0\x87[e\xbd\x01\x95\xbb@\x1a;\x81\x9a\xcd&\x1b\x1f\x13\xf5o\xab\x8bd\xd24ar\xd9W\xf9y\x8fI\xc8\xb9^\x14\x03\xeb\xa9\xf2"\xd2\xaat\xa6kj\x01c\x8e\xc7t\xdf\xaa\xf7%\xcd\x82]\r\xd2\x0e(\xfa\x9c,?\xca\xb0\x02\x1f\x89\xf4L\x08\x87\x0f8\x9b]\xeaM\t\xfe\xa6\x1d\xbee\xa4A\x15\x86%B%!\x0e\xe72b\xddu\xd9S\x80\xb7\xb0\xd36\x1f\xbb\xc6\xed\x94\xc6\xb8\xae\x0b\xb9cF\xc7\xea\xe6\xe6\x8b\xe9`\x9e\xeb\xeb\xb0\xae\xf6\xea\xa5S\x87\x8c\x07\x1f\x87Q\x80F\xb4?,\xf5\x927\xa2\x97\x87\x87p!or\xbc6E\xd2.\xc0\x8d\x00\xda\xe6/\xdc*Rt\xc3}\xa0\xb8t@\xf0[Y\xad\xb0\xe6\xabP\x86\xe1%Q\t\x8fY\x81\x11\xff)\xdd~\x1d7\x02]\xcd\xc4\xe3\x18\x1b\xb3\xa6J\xc1R\x81\xfb\x94 \x87\xe3\x1e\xd9|\x93?\xbc\xc6\xf00\xb9\x0e\xd0\']a\xf3\x87\x8b\xe8\t5\x84Fd;\x17[\xb5i\xd1\xa0:\xb9WX\x9a\xa6\x7f n\xb3\xfd|\x9b\xd5\x9c\x7f\x00\x8d\xf3\x00\xbav\xc7\xb8\xfcI%M@\xd5L\xbe=\xe28\xa1\x96EXGJ\xe2\xc5\xce\xec\xec\x11\x80\x84=\xf5\xdf\xba\xaf<\xd5l\xe9\xdc\x01}\x95\xc4q\xed\xba@\x8a\x9e\x8c\xea\xfd\xc7\xbbU\xb0\x11\xa2\xd5\xf6\x8f\xb6\xde;\x15\xf0h\x06\xcb/\x8az\xbdt\xdf\xa9\xce\xb0o\x1cB\xdd\x17\xa0m\xb8\x8cq)\xc5\x13\x9b\x88\x0b\xc2X\xa1\x9f\x9a\xf8\x90\xd8[\xec\xa4\xad\x0b\xb2i\xdc\xaa\xcc@\xf6\xc7\x9c`\xfb\x17\x18\xa9\x8800\x1e\xcf0\x0b\xc6\x12\x8f\x9f\x10\xa79\xf5;\xd7\xdc\xfc\rk\xcd\x18\x88*\xec\xad\xf2:\x0c\x8eM\xbfa\r\xfdD\x9dh\xcblIK\xe8\xca/u\x07\xd0\xa3\x89\xc2J\xcf\xf5Q\xa8\xd8\xc28\xbf69\x11\x92F\x98\xdd\xe2"P\xf5\x13\xa4\xe4\xf57\x11L\xbd\xa6\xffo\xd0\xf3\x836\xb7\xd0\xb4\xd0\xec\x17aHW(\x9d\x07%d\xfe\xe3_\x9f"\x91\xf4W\x91\xfb\xd6\x1b=\x92\x11/\x18\xf5\x10\x96\x0c\xe7\xac\x01$\xba&}\x97\xbf\xb5BO\x10\x18\xd3\xe8\x8c\xda\x14\xf5\xad\x87\\\x84\xb2a\xa7?\x8b\xb5i\x7fY\x18\xc3j\xdfMU~\xea\x8b\xb6N\x84Z\xb1/S\xb1\\\xd9&n\xce\xee\x96\x8di\x0f\x1e<\xed\xe2\xb2\xd8\xd1(q:\xb7\x17\xe3\xa0\x0f\x07:\xc2\xc6\xebD\xa2\xe6\xfd %\xbd\xc3\xc9\xe6\x94\xb8CW\xc9\x140+1\xc0![\x99A\x17j\x81M\x93\xf0K\x01[\xbf\t\xcb\x9eB\xf7\xa6\xf6\xd5\xc7!\xeeTP\x8c\x10\x85\xc8\x91\rqn\x92\xa9\xc1\xce%\xf8\xdc\x13%\xf2\xed\xa4d\xc5\x81\x1a\x9f\xa3C\x89\xf1\x81\xe0\x9b\x9fZg\x97=\xef\xfc\xbb~\xc1\x14Rz\xa4\x0e#v\x86\xe5\xac\xd5\xf9\xd3\x14\x8dU,IN\xca\xd0\x03Z\xe3\x88(\xa4\xd2\xd1Y\xea[\xb8\xcc;B\x90s7\xa6\x88K\xdcM;\xcd\x11\xcb\xaf\x10\xaf\x11nz`\xfc\xfd\xd2 wMO\x18\x9a,\xbd8\xd0<\xb2\xca\xe0\x00\xee\x1e\xd0\xf0\xe0\xdf(\x1by\xb4*=j0\xa3h\xa6\x96\x18\xe6\xec\xc5R$\xdf Pb\xf4\xc6\xb5\'\tN\xe2\xa9\xb3y\x02\x19y\xd99t\x1az)~^"\xc2\xafN\x1c\x81\xacHLJ\xd5G9\xa5\xeaS\xb9\x03%l\xd1\xfae\xe4\xa5U\xc6\xf4w\xea\xbe9[\x90R\xeam2I\r\xf4k\xc3L\x91\xef\x07\x8c\x88)P\xdf7E\xa6v\xc8\x8e\xccG;\x96>1~\x07\xc15\x0b[}^\xe9\xceHs~\xfeS\xfd\\u\xf6\xa6C\xff9J\xe5\x90K\xed\xff\xb8c\xe8\xe4\xb5>G\xe1\x81\xbb\x1f\xeex\x00\xd8\xa9\xc7\xa15\xc7\xb8\x9c\xb9U\x8c\xc4\xb1\xfcx($\x8e\xfe$\xd4\x8d1\x99u\xb1\xc5\x0c(;\x01\xb8\xa4 \xddh\x93\xcf\xaaz\xb4lR\x97\xd0^$\xa3\xb1qZX\xf2\xc3.\xff\xe5`\xb4r\xa8\xbbf=\x07\xa1B\xef\xafS\x95\xcb,\x0b\xb5\xde\xb6\n2\xe2@q\xc5\xb2\x1d!\x99\x9b}\xa0V\xd4]\x11?ds$\x10\xc7\xb3\x18\xe2;\xc6\xf7\xc6y\x12I\xcf\xd6hd\xab+\x89.U\xe8\xcb\xa2\r~\xa6\x88\xb6Bw\xd7&\x1cK\n\xbb\xc7\xd0;\xfe\xdc\xc6\x16&RR\x92\x1f\xefI{\xfb\x18\x07<\xce\xffb\xe3\x00\x84Ev\xc6O\xf8S$w\xdf\xfe]>\xd5\x15\x9c\xc4\xfa\xd0EZ\xbe\x90\xa6L\tG\x16\xf68Uu\xe9\x0e\xf4\xe2yD#\xaa\xf5\x7fe\x01\xc7U:6)\x99\xe7\xfc\xc5\x85\x05\xd4\xce\x8f\xae\x8d\x80\xa7R\x0f\x96"\x84\xc8H\xce\xee\xe5y\xc5\x92r\xa7P$\xd1\x08\x0c\x85\xa7 \xf2\xaf\x88\xd0\xb6g\nU\xc8V\xd3\'o\x8e\x1c\xef\x93\x01\x9e\x85)Y\x8e\x82Y\xa4\xa1\x94\xebI\x14)\xa9\xbbO~h\xb5\xbc=+%s_\xd8Il\xd4\xe9y\x96\xd0\x13\xadU\x85\x8a#\t9\xaf\xe3\x01\xd4\x7f\x11\x99-q\xc914\x8c\x08\x1e\x8f\x89\xd0\xe2q\xe2\x9fl\x01\xc2K\xbe\xb6m\x91\x92`(\x15@T\xecW\xdd/\xf5\xf6\xa0F`\xb8eC\x8b\x8aY{\x10$;|\xc3\xf8\xbe\xe7\x11Tu\x1a\x03!P1\xbb\xc2\xe65\xab\xf6\xc0\xb2\xd9\xc3\xe0G\x8b\x98&\x9c\xa4s\xed\x92\xeaeS\xc5\x84\x99\xca!\x07J\xadp\xd8\xfbjp\xd4\x05H\xf1|Z\x06\x87HJ:\xe8\x1d3F\x16\x9b\xf6\xcb\xe2}1]\xee\xf3\xf4\xcc\xb9\xe4\xd6\xbc\x85\xd6;\x91\xbe\x07\xc0\xfe\x14\xfd\x00\xf7R`\xf4\n\xc7u\x9d\xa0\xeb\xe1\xb1\xb7R\x8bn\x15#E\xc7\xe3\xebb\x8a-Y\xdd"\x91\xbe\xa2\x13\xbaRU\x14\xb2nA.\x04\xcf\x8c\xb2\xecl$\xa6\x99QO\x9a\xd2\x8bJs.\x0c[\xbe\x91\xea\x177$A\xf7 D\x04\x01\xf8L\x1e\xe6\xfe2\x98d8`\x00\x9f\xd3\x82p`\x15\xc9\x94\x1dMx\xdf\xd8\xd8\xbc\xeb\x83\x00\xfd\x8c\x1e\x99\x8e\xbd\xd4\x9f\x94\x91\x9b\x7f6-2\xca\xbb\xd0\xcd\x08P\xaa\x81\x98\xa5\x14\r,\x19a$5\xac\xa0\x8a\xe4\xb4\x8c\xb0\xc8\xd7\x8f)\x9d\x93Q\xed\xe7\xf9\xa1"9\x9d |\xd1\x8bn\x81\xb8\xc7\xc4\x08\xb5\xc0.\xe5\xd4\xcf\x06\x85E\xfe\x82\x92\xfbN\t\x03\xc5\xd0\xf6\xcb\xfc\xd0p\x8c\xce:\xed7X\xe5\x0e6\x0b\xc5\xe4\x9b\xc0Q\r\x9a\xcc?\n\xd8\x97g"\xc1\xd2t\x9fZ\xf8\xceK\xe76\xc2\x10p<\xfe.Chg\xc9W\xf8\x91\xbe\xc6)\x03\xce!"\xa2\xceK\x0e\xecU\x1f:=}&?\x03\\\xce\xbb\xbcD\xe1dX2|?\x12\xc0\xf9\x18\xf0\x90t\xe5\xcc\x91y\x0bM\x92\xc3\xa1%O8\xbf\xd0\xcfCb\xa5.\xbd\xf0\xfc\x88\x13\xaf\xdd\xa4E\x08\x1b\xdf\xd8\x9f\xb8\xe6rC\xc4\xa3q\xfbaY\x9c\xb8\xa4\xdb!?<p)n\xda2[-\xd2|\x92\xb0W|\xe9\x8c\xd9N\xb1\xd4\x93zbL"\xda\x9d8wzK\xdaT\xb6aEUX\x95\x9a\xef\x90\x12\'\x0b\x15\x9c\x94y9\x93\xb1\xa1\xbb5r>J\x82\xee\xeb\\F\n\xbd\x1ai%b4\xe5\xe4\x17\x82\x03I^G+\xef\xafI2\xae\x00\xfe\xbc\xe2 \xf1\x94\xe8\x05\x01\xeb\xde&\x0f\x92\xc8\xd7\x1d;r(\x82R<5;|\xa2\xd2\x8d\xb8\x07\xfd%\t\xfa\xef\xa7\r\xdfY\x1d\x01)\x831\xc4\xf9\xf3\xdb\xf6L\x8a_\x8fj\xc8\xd6\xd0\xe0\x90\x06\x82gI\xc9s\xde:\x95\xbdX r\x97\x08C\xf6\x16v\xbe\xc8|!\xa2\xf0)\xca\x19q{\x82\x8d\x8b$\xf6/\xe5\x81z\x93\xff\x85$W\xe4\xfe\x95v\x1f\x85\x92\xbe\x0b\xaa)\xe3\xd4\x00d-\xce\xd3X\x1dg\x88q\xdas\xfe\x83\xa1\x95\x90\xd6\x8b2\xb2\xfb?\x0b)s&h\x10\'\x01\xad3B\xa5Lrz\xfb\xf2\xba\x81,\xc9\x9e\xc9\xc2\xda5\xe6{#"\xb0\x96\xc0>\xc4T\xf0\x17\xf4Y\xc6\xe0O\x8e\x7fP\xecQF\xf9\xd1\x9a4\xb5\xb4\xbd\xe8\x067\xa62aqv6\xadw\xe3h\xff9\xe3;\xb1\x16\xf2l\xe7\xaa\x99\r\xc7\xc3\xcce\xf9p\x89\xbe\x91T\xea"q\'\xa5\xbc\xbd\xa4\xe9dZ\x1e\x168l\x00f\x1f\xce1\x9fM\xf6;u\xcb\x145\xa07\x1f$lo\x07\xe4\x90\xdb\x08\x89\xe5\x00~\xcc\x14\x11\x17\xa8T\xd9\xa6\x10&\x9aQ}\xa8\xa3\xce}[S\xe1u\xd6\xb0\xe7\x0cv\xd3\xdf\xdf\x9c$\xcb\xf4+DR\xe7;\x19\xb1\x81!4\x8b\xcb\xe8\x11\x04\x0b>mE\xfb\x06g\x1d)u78\xc5\xba\xf1?\xac\xa6.\xb4\xc3\xa46\xfdV\xed\xad\xcb\xb0 \xf7\xfcR\xcf&=A\xa3P\x9a\xdc\x18\xc9\x01\x1a;\xcc\xfd@\xe8\x95*n\xad\xec\x85\x86\xc3\xf0,\xe0\x01LVT\x9ft4\x97-L\x9b\xc0\xd9\xa6\xbb\xbe\xe9\xf0}\xc2~\xb0\xe5F\xd5\xed\xaf\x81<\x92KE\\\x9d\xc5-\xda\xfdq\x0b\xce\xf3\xfd\x90`\xf2P\x86$\x1e\xaa\xca:*\x15\xac\x98\xc6\xe6~\x8c\xf0r\xe2| \xf5Q\xa30\xde\x99\x94Z9\x9e\x9e>\xe3\x0e\xf1\xda\xa1\x83T-{\xba\xd2\x80\xf5s8\x05`\x89\x85\xa1\xe3\xcc^(\x13/\x9f\xe1#\x80*T\xa6r\x05\x19\x08\xfa+!\xcf,A_\x82\xdea\xcdf\x06\xb0ui\xcf\xd8\xfc;\xcf\xe3]\xf4\xaa$\xa3\xd3Wp\xa5s\xd3\xb5\x97\x11\xa3\x95\tz\xf4-\x03~\xaca\xb1\xc3\x15\x8e\x03`\x03\x17z\x89\xa9 `\x08\x8c\xb1\xb0k\x96\xc7]y\x1c\xd3\xdcZt2\x0e\x95\xd7O?_\xe7\xdai6\xc1$\xf1G9\x8fy\x91\xb2\xe4H\xe7\xdb2\xc4}R\x04?\xe5\xb4\xf0g\xc1\xe7A\n\x1ccB\xd4\x85z\xf7\xf3\x0cP\x08\x1b*\x00\xf0\x8b"\xe9\x00m\xdal\x7f\x92hk+cb>\xa0\xac\xf1\\q<\x87$\xb40j|\xe4{\xbf\x07\xd7\x14\x075\x9f\x02\x1fE\x00\xc1\xed\x03_\x91\x9d\xa4\x8e\x8d,\xbd\x12\x05\x0f\xed-\x9a\xe8\x0e\x8f\xf0\x1d\x18\x98Qp\x015*\x92\xd8\x86\x92\xc1\xee\xe9\x01-|\xf5\xb4\xd1\r\xec\xd4\xd9b\xb1\x87\xdeZ\x97F3\xcc\x9d\xac\xf8\xa3$\xb9:*\xfa$:\x95\xcdD\xa3FY\xe2\xa3\x7f?\x85\xb1\xb1\xf0P\xed\x8b\xde\x80\x0ca\x92\x12\xbb\x12\x80DG\x93\xdd+\x05\xbd\xef\xab\x13\xad #\xc3\x97(w\xc1N\xfdY\x8b\xd8\x04"\x88L\xfa\xfe\x8c\xc3\x91&X\x06\x8a8D\xe4]rTF\xe68\xcd \n-\xfds\xd3?\x0b\xb8`\x9d\xd1\x06ZE^\xfb\x06C[\x1e\x03y\xc4\x9aFw\xe5\xd0\xfe\xe0\xe2J\xde\xce\x0e\x9bJ\x129pRs\x9c\x95)O\xa6vk\xfc\xb7\xd4\xec\xf2B\xb4\xf4,\xb74\x99\xb2o\x1a[\xbf\xeaS5\xbd\x87\xb9\xdf\xc06\xf4\xb6v\xd6\t\xb27\x83\t\x08:\xb4\xcf\xffb\x85\x18Z`3\xdc,\xf0L>\x85\xa28\xf0d\xeb\t\xc5d~\xfbS\x05\x9d\xc8\xa7\xa5\xcc\x10\xd1 <\xf2#\xb0\x02s\x15\xd6rr\xa8\xa7\xa97(ae[\x8d\xb1Jq\xb5\x19[\xb5i \x95Thz`\xef\x8e\xa8\x8a4\xb7K\x15QJ\xf7\xbeQ\xbb\x96&\x97-\x9a\x94\xd3\x98*\xb6\x9ej?\x06P\x83S\xe0\xc6P\xa9\xf6\xe3\x1d)\xd6\xf3\x88\xc9\xe1y\x92\x0e\xd8\x9d\'\xdd\xbd\xf2e\xa5\x10\x8f\xe5\xf38\xe80\xb7\xd5T\xfb\xa7\xa8c\xb0-l\xf9\x82U\xef6\x80\x8e\x19\xb5\x06b\xa5\xee\xb7rU\x9b\xf4\x87\x1a(R\x1a\xe8\x0f\xe7\xff\x00d\xa5v5nD\xed\xb5\xf9^\xc0\x00\xb5\xae(/>T\x0c#\xea\xeamD\x06\x17\xbffx\xce\x82#S5\x1d\xed\xf5\x1d\x86^m\xfb5\xb7\xca\x93\xab\xdf\'\xa6!\xb6(M;\xb6X\xdb\x8a\xbba$ \x9a\x8bE\xec\x10\x90\xdc\xa2F\x12\x7f:@\x01\xfc\xcen\x9d\x82\x82\xfc\x14\x16\x00\x19\xee\xa7\xf6\xa8q\x886\xf0\x8cF\x85on\xa1\xf4\xd4J\x17\xe6<\xf2\xc0!Uf\x7f\x9c$\x9d\xc4h\x01\xc8\x9f\xb6\x16;k\x99^\x8eUi\x03\x8c\x93\x83\x9b\xe0\x1e\x80*P(\xe3Q\x02\xac\xce\x1b4\x1e\xcc\x95V\xd1\xb7\xfcw\x18\xf4\xe5\xc4@\xf4\xf8U\'\xe6sb9\xedfN\x06\x94\x80\xa5r\xe8S\x05\x8d\xe8\xcf\xb6t\xb0\xb1\xc0\xae\x82\xa3A\xddWRe^8"O\xc5\x13\xaeo\xfd\x02\xc5E\xab7\td\x11H\xc8Z\x95}\x01\xfe\x02F\x1f\xa24\x97s\xf0G<\x1du\x82"}\x93\xe8\x1c\x89\x85\x01\x99\xbb\xf8\x9c\x7f\x1ch4\xe5D\xd3\ts^\xb2\xd2\x9e\x1b}\xd2@\xd4\x9fGE\xca[V(j\xeb\xe7$\x96\xc2\xad[\xc7c\xf7.\xbc\xdaq\xd0\x90.\xc4D\xa1\xd3MO\x99ZcR#\xf4\x86\x98ct\xa8\xca\xc9\xfa\xd9@[Y\x8ck\xca\x8f\xc3NHV\x9f*\xd3\xef\x03\x9a\x9d/@\xc5\xba8\x00\x13\xe8\xffm{\x02\xfa\x8a\x94\x8a\x83u\xb0.Cl\xbd\xfe\xdc\x83\xfcC"\xd1\x9d\xa6\xdc\x8f\x804$8\x18\x84\xe6_\xe6b\xff\xdc\x80q\x8dZ3Gy\x92O\x89Mm\xb1,\x81x\x8c\xba\xb9"v\xb2\x15\x81\xcd;\x95\x80\x9c]\x08\xc2\xb6\x13S\xd1\x9a\xb022RVG\x15\x96M\x018)\x7fPoE~\xc5 \x10\xc3\xcaQ^}\x11\x88T4\x05\x1buQ\xdf\xe6\x95_\xbe\x03w\xd8u\x98Q47oio\xf1\x9c\xbb\xdd\xbd\xf6\x05\xaau\xda\xe0c*lJ\x91\x0f\xfd\xc3~z|\xa5\xe19M\x91;\xa8g\xf1\x8cS]]\x8b\xcc\xdba\xe8\xfc\xc3j\xfa\x89\xbbRI=\x8eK\r\xb3\xf5\xff\x94\xe5D\x1d\xb8@C\x82kj~U\xaf\xe7cl7\xf1k\xebZ\x93\x9e\xc3z\x8d\xc8\xb8 E\x96]\x14\xc8G\x8a\x14#\xc1r\xbbf\xd4\x12\x90\xa8e.Vb]\xac\x1d!\x83\r\x15KL\xc9\xef/\xe5\x88\xcb\xdd\x04\x10\x02\xed]s\xb0/\xca\xf8\xabS\xc6jO\xcf\xc0[\xbfb\xb1\xb3\xd7\xb8S\xae\xbd\x07\t\xa4+\xdcD]\x94"Q\x01]\x83\x18\xf6\x03\xff)\x03]\x19\xf9\x17\xab\xae\x02x\x12A+\xf4\xd1\xd6p9\xd0P\xb4\x1c\x07vj\xbc\xdd\x8a\x80\x81\xa6Hw\xbf\xfcU0\x86\x12\x1f\xdf\xab\xe0\xeb\xcaZI\xcb\xfa\xef\xaa\x96lM\xd9 \x9cZ\x80\x0fR\x8e\x809\x0b\xbf8 \xfd{\x7f\x80\xb8\xdb\x9f\x88d\xc5\x99;\x00\x91P?(w;\x08\xc5\x1b%-\x1fA\x9c\x95\'S\xbc\x94:\xe7vp^\x03\xebG\x0e\xb5O6+P$^/\xb5\'\xb4\x8cn\x8e\x8a\n\xa1#\x18\xa6\x1c\xea\n\xf9\xdc\xa4\n\x1a\xe3\xeb\t\xa9Kl"\x80?\xd7\x07w|\x119\xe9x\x0f\x92\xdcGq\xab\x9b\xf5F\x1e\nf\xb6`\xbb\xf4\x83(68\xac\xa1T~\x9a;\xe8\xba\xfb\xf2q\xc1\x07\xa4\x91E2\xf4\x7f:\xfew\xe4\x8c\x1b2\xf8-\\\xf7\x1e\xe7\x07\x84:\x11\xd4\x7f\xbe\'\xad/x\xfc\x0b\xd9\x15\x0f8\x8f\x99\xc2\xe5\x99RE\xcb\xac\xa4~NtF\xf1E]N\x04\xcf\x93\xef\xf8\xc5\x14\xd4\xed\xe8]\x05\x04\xb10N\xf1q\x1d\xf1G\x97\x06\xf6Ze2!\xdewn\x96\xfe}\x02nu\xf7x\xb3\xd9\xb3>\xd8\xbc\x83n\x98\x9b\'\x96\xb3\xfck\x7f\xc2\xac7s\xdb\x08v\xf4\x02A\xfaI\x07`\xd1\xd2\x17\xc4ZB\xba\xbf\x19\r\x9c\x818\xeb\x8c\x8a\xc5\xbd\xc7\xdc\xf8\xef\xf2\xc1\xa5\xc8\xdd\xe6\n\xb8X\x8d\xbbx\x80)\xb2|\xcfg\xc1\x9f\xe2\x87\x82.c^\xb5!X\xa3\xa1|@Z,1\xab\xf9\xc2kv\x96\x8a~\x95\xe9q\x0c\x1f\xc7[\x122:S\x16\x07\x17R\xda\xc1Y0O\xd8\xb4\xe1\x92;U\xb8&\xd5H\xeb!!(\xa59\xdf\xe9X\xb6q\xd6\xc7\xa8\xdd\r]<\xc9-\x7f\xfd\xa8&\x84\xc4\x06\xc59\xa66\x1a\x12\x93\xbd,4\xa7\x1eB\xd49\x19N\xbe\xbcq\xa2\xa0\xfb{\x0c\xd4\r\xc8/\x17\xeb/\xe7\xcc\xf7%#\xf2u\xa3n9B\x97\xfd\xa4d\xe7\x7fw3\x1a\xff\xef\x87\xfaT\xfd\x99\x8d\x7f\xa6\xc7\x99\xf5L\xc3\x91s\xf2p\xd9\xd6{,!\xed\xf2\xf4\xbd\x05\x1f\xe6\xfb\x85\xfd8\x8d\xa9Q\xed\xbe\xbe\xc7\x15e\xe1$\x84(\xab\xe9\xd4\xaf\xffG&\x14w\xcbZw\xc7\x0e\x02\xb4\x9cEz\xb85\xc9\x91H\xfe\xad\xaeS\xd5\xe2\xed=\xab?\xf2TPr\x0c\xbf\x161\x1e\xac\x8e\x90\x9a\xcb\xb3\x98\xc0T:G\xb2\x9b8W\xac\xc7\xf1\xe2QO\x15\xd2P\x05\x08\x06\x86\x91)]\x0c\x9b5\xe7\x861<\xf9\x14+\xa8}\x0be)\xb0\xbd\xa0\x17\x9c\xf8\xd5*\x15\xa0\r\x0e\xb7X\x1a\\\x9cA\xdeE1"\x01\xfc\xe0\xac\xe9\x95\x9eU1N\xf5W+`e\x15\xe3\x19\xdc\xc5\x0f\x12\xaa\xf0\x9cO\xeb;)<\xa0\xb5\x03\xf0\x06\xe6\x9b.\x89\xf5\xc5\xb2\xc1\xd6H\xfd\xe3\x9eF\x99\x90\xdd\xe4\x9c\x10bV25\x07E\xc6\xa6\xb3O\xa0\xbb\xa0\xb7\xd0\xdb\x12`f\x99\x88\xb8A\xd1\xaa\xe3\xba\xfe:T\x92\x08\xe4]\xd8\x9d[S3p^Y\x92\xf8\x83vh\xa6;\xbb\rQ\xd50\xd6$Z=f\x1b\x91S\xb2\x91m\xb8\xf7\x9b\xb7\xb9\xf1\xf4\x0f\xcf\x15u1u\\:&\xfb7\xd7\x1e\x86*|y\xc5Z\xa3\xef\xd9"^\x90\x96\r\xd7\x81\xde:w\x0cWu[ye\xb2\xd6\x03\x95\xb3\xa3\xf6W\xd39d\\X\x9f[\xb88\xeb\nfl\x81U\x8fSY\xe0O\xeeqt=\xf4\x05i\xa8p\xd3:o\xbc\xf9Q\xdc\xe8\x03\x1e\xc3.\xf1S#=\x98k}2D\x12\xc4{\x8c\xa76\xa3\xb0!@\x01\xddU2\x82\xc6 *\x0b}\nl,oLv\xc7\xdfz\x1d/\xfe\x10\x10u$\xbb\xa6\x9e%y\x08[\xdfC\x86\xb8\xf2\xd4j\xc4\x88 ":\xef\xce\x8a\xb7\x93A\xd4F)\x9a\xac\xb7\x96>\xe7\xba2SV\x91\x8b:f\x9cQ\x97\nZ\xfd\xf390\xc6l\xd4\xc6o\xbf\x84\xd4\xd5\x115\xce\n\x94\xaeKX\xba\x1a\xe6\xd9\xf2\x8f\xd62v\x80\xb0\xfb\xc0\x9ah[\x1aU\x98\x86"f\x0fc:\x97\xaa\xc9\xdf\xc95\x1d\xcb:A\xf7\xbc|:@\xdd\xe8\xb6\xe1\xc1,\x8c\x03\x17[D/\xaa0\xc7?weB\xfd\x1dB\xd5^J_\x8aB`P\xc1Y.\x10\x88\xbe\xfc\x9d\x8bU\x9d5\xf10\x80M$\xc2}\xa6\xf42\x82\x81\xd0x\xa2\x86\xcf\x18\x1b\xa2`H\x91\x99\xa0\xbfS|\x1a\x82,\xe3\x10_\x0c\x0b\t\xc3\xe7\x12\xfd\xbb\x95Ty\x07Km\xf1\x90\x83\xb4\xe1\xea~q:\xaeW\xc8\xceHd\x92\x9e4\xea\xe5X\x89,\xfd_U=\x01\xc3\xe6Y\xa0\xb4\xf9\x91\xca\xd1\x9eK\xda\xe2\xa1\x10\x8c\xd8\xa0&r\xb7\xc3\xecz\xf9\xfb\xdd\xfaY\xd3`\\\xd5\xd6b\xae\x89AT\xd9G\nm\xf3D?Y\'\xdb\x83(\xcaX\x1a\x02\xccqT\x17\xb7\\\xb1\xa43\x03\x16/\\\x11\xa2\xc2D\xa0\xd6\xa1s\xd6\xaa\x19C\x14\x050\xc8P\'\xbe\x99^\xf3\x95\x9aJ\x03\x17\xf72\t\xa1\ncZV\x91V\x1d\xd6G\xde\xfa`N\xd5"\xb2\t\xc8]\x94\xa1\x15\x7fa\xa9\x05\xc9\xe4\x94\xe0\x04\xbf\xf0\xcbJ[$\\#\x19\xcae\xf7\x11\x94\xc4\xf5mKhA~\xaec\x9dQ\xec\x15\xba:o\xfeo9P0\x1b\xb7K~>o\x85\x92\xa4\xdf\x04T\xf8\x0b\xc2.\xb1\x8a\x07nD\xbd\xd3\x7f\xf9\x9c\xb3\x94\x1d\xf7\xde\x072\x1d\x8b\xdaF[\xaa\xbd\x85y\xd8\xa4\xf1r\xc1l,=\xa0O\xff\xa2T\xe4\xce\xd4\x02\xb3\r\xed\xf4\xc71\x03\x88\x99Th\xdb\xa2\xb5G\xc5D<\xc1\x0f\x07\x89\xe0\xc9\xed\xcd\xc9~\xbdy\xedZ16\x0f\x87V"]\x1e\xf8\xe3\xc1\xb7\x8e\xe0\'\xa9\xee\xfd\xda\xbfG\xe6\x16x\xf5(Y\x0c\xe2\x8d;V<<J\xa9\xe6|]\xce&Y\x1f\xa4\xb0\xee\x82\x8e\xd2\xdb\xaf\x81e\x94\x98J1\x99\xb0\xc1\x92\x80\x83\xb4\xbe\xd0\x9em\xd5\xe8\xca\xf7\xb6\x14QxN\xf2j\xca\r\x8aT\xde{0\x7f\x83\xe1\xfd\x95Se\xe9`\xeb\xf0\xb8\xea\xf7\x9cQV\xf7$=!cc2\xb6\xa5\xe8\xfc\xea\xf4\xdf\xa9\xbdp]\x00I\xa4\xadmA\xcb\xffM\xdb\x18\'[KTd\xd7\xa4>M\xe7\xca:e\x87L\x06\x81\xd0[\xe5\xe3\xf3b\x16:z\xed\xd75d\xa8\xbd\x8b\x95\x9f\xbc\xff\xd7s\xdf\x00\x0e\x07\x89UU;\x16\xddV\xc9\xb5\xa2\xae}\xa5\x03\x84?\xe5l=\xd4\xd7\xd0\xcb\\\xa7\n\xfeg@t\xb65\xe2\x12=\xa4\x16~1~\xd2D\xa1V\r\xb0\x1fl\x06H8\xcd\xe7\x9e\xc3\xe7\xf2\xb5nI\xb8^\x1c[v\x13\xb0\xde\xb9\xe5\x0e\x1c\xdbp\xef\x0fu\xb2\xee-\xc9\xddY\xbb\xa8\xa7x\x96p6\xabti\x84\xff\xd2\x02b\x82\xf5\xdb\xb7\xbc\xfc\x8f\xf2\xf53\xe3\xdb\xec\xf2&\x88;\x0f]\xbc\x18\x1e\xec\x8c\x9f\x84\xd2\xc0\xd2\x84\xd6\xc7\xb4\x80h\x13\x8d\x1fE\x94\x81p\x8ap\xa1\x9dO4l\x12\xa8\xe7>P\xf1\xf3a\xbfR\x8a\xfe0\x00D\xa5x\xd5\x04\xd2\xb5\xd8)\xbc\xa8v\xf0\xa2\x89\xdfM\xf6Q>,\xadp\x8d0\xa33%\x19\xb0*\xf7\xb9\xcae\t\x06\x9b2N\x1dS\x18Q\xf5$*\':\xd7>E\xa6\xe4\x17f\xdb\xee\xbdlF\xfc\x1c\xed\x82\xf2Tjo\xd5\x85."\xdao\xe2qC=\x98\xc81n\xba7H\x0e\xea\xc2W6\x06\x92\xe1=\xe3\xf1C\xe1\x1c\\DM\xe5|\x1e\xc7\xbc\x14\xfc\xad\xae\xd6QD\x8c\xc0\x0bP\xf2\xaa\x06idW\xea\xa5/odJ\xe6\x92\xfc\xf4\x8b\xbc\xa9\x1d)m\x19\x13f@e\x82\x95\xe1\xd6|\xfa\xf8L\x11\xd1\x9e\xce\x81\xbe\xd2\xd7\xe8;H\x84\x86\r\xb5\xa4p\xb7\x95+\x93\xedI\xb4\x15\x1a=\xc5\xbf\xaf\xbc\xce1jyLn\xcf\xdaE\x19\x8bt\x13\xd9c\x124\xb1:i\x97G\xbd\xb0\xb7\x11!\xa6?"D\x84\x9fj\xe3\xc1^{b\x92=\'\xb9.\xa3\xe8\xcb\x88E\x93\xf1?\xd7\xd5\xc2\x8b.H\x11\xd8\x82\xa0\xf3\'\x0f\x86c\r&\x04T\xac\xa3\x07o\xe2\x0f\xa2\xe2\xcc\x84\xceD\xb1\x94%\n\x0c\x8f|\xa7\xe7\xcb+\x1eY\t\xa9k\x01q\x8e\xd5\xa8pv\xb4\xa2_*\x156Y\xd9)&\xd5h\xe6h\xe5{\xad\xb4j\x9a&\x84C\x9a =\x024y\x1b\x83\xd0`\xec\xee>\xe5\xb5\xc2\x9e\x8dV\xe4\x8d%f\xf6>\t\x05\x84\x94#g\x99L\xe8\x8e\xa8\x88\x86\xa2\xda\xb1l\xc3\x87\x91\x90\x7f\xcf-\xb1S\x9a\xe8\xd7\xa6Y\x05\t\xfd\x92\xbc\xf6\xb1\x00([\xa9\x11q\x8e\x0by}#\xac-@/\x9f\xff\xe4\xe5\x1f\xefg,\x10\x12\x02n\xa5;\xe6\xb6\xacD\xf9\xfa\xf8z+y\xc1j\xcfm\xb9U\xb2\x9e\xda\x8f\xd9u\x89\xeb6\x14\x8a\xc2).\xdd\xc8X\xf8\xfc\x1dbf\xef\xe6H\x9b\xe1\xd1\xe7\xc5\xab\x9a8 \x86Q\xca\xfep\xaf\xc0\xe3\xc7\xe9\xb1\xd8\xd4\t\xdfZ\x98X\x19ct\x1dG\xf7\x01\r$<\xa7\xde\xf8n\xc1Lz\xdc\x07\xa6V\x94\x05\x9a\xbcL\xd9\x06\x02\xa1s\xd1\xfbd\xb7\xa6K\x96l\xe1G\xbb>\xb6\x06\xcb\x103?\x10\x1a\xed 54\xe6\x91\x8a\xde\xb90\xd5\x85\xec\x80\x10W\xc0\x1f\x07e\x98o\xb9T\x80\x12\xac\x93=\x1c\x15X\xfa\xa3_\xc9p\xb0\tG\xf4N\xd9\x81\xd1\xbbM\x1dN\x87\x14\xe5ld\xbf\x8d\x80\xa7G\x1d\xa7CNm\xf2M\xb8 \x9a\xbba\t\x14\xe9W\x12\xea\x92Rr3"Eg\x10\x00md\xca\xbaY\x82d0\xfemx=\x13\x8d\x99\xdb>+\r\xa1\x9b\x0f\xfd\x02\xb1hi\x14!/\xdfAV\xab\xc88^\xb6\xec\xe9\xe5\xc5\x15\xaa\x11\xa0\x82HbB\xf2\x1ef\']\xd2\x02\x07\xb8\xe9\x10\xe6a\xda!\t\x80f}\xef\xbd\x1a%p\xa6\xbe\xee\xef\xc66\xc39\xbf\xa8x\x1a\xa1\xb0\xc2\xe7A\x1d\xc37\xe0\xb3\xc3\xd7\xc0n\xe6\x9b\xe7$\x85\x06\xad\xaep\x84\xd5\xa74IW\xa3Xl\x162\xb4j\xb2\x1f\xe0\xc5\xbd\x8f\x18\x8bm\x91\xbe\xe7$Y\t\xe7!\x96.\x90\x19\x9f\xce\xf3\x84swr\x02\x1d\xb8l\xc0\xb2\xc8\x0c\xfb\x1a!\xcdu/x\x01\xbf\xd7`\xcc\xb6\xb4\xcd\x8cpA\x8c\xe2\x82\xad\x11sd\xe3$r\xdc\xdb\x13\xbd\xc6/\' \x05\xd4\r+\x07\xa9\x8c\xac\xadKS\x08\xf6Y\x0f\xdc\xcf\x81l\xd1\xcb\r\xe0Gb\xc9R3R\xac\xe7\xae\r0\x92&\xea\t\xfdl\xfe\xafI\x81\xd9\xefg\x88\x97\xdc3e\x0b\xb8\xc6!\'i\x9c\xbd\x0fv\x12\xd6\xbf\xee\xbf\x8e\r\xb3zyE\r\x19\x02\xb3+\x15\x98\xeb\xf0\xc65\xc0\xdaP\xeb4\xd5\xe0\x01lOx\xd8&\xaa\xf3\xdfL\x95\xf7\x9e\x08\x9a\xbdJ\x05rjjySS\x9f\xec@\x91\n\xbc\x01y\xce\xa3&3\xbd\\\x00\xcaB\xf0\xa1\xaf\xb8\xd0\x9bk\x8dK\xa5\xc9\xdb\xfc\x82\xc4\x1dR\xe9oOP\xe3x\x03#\x1d\x1ba\xf92\xfa\x0e\xeb\x11\x1d\xac>1\x11\x86\xe8/l\x87_C#:\xa5\xcd3k\xd2B\x1b\x14\xf4\x01M\x10\xa5\xdb\xe9\xb8\x86;\xbf\x8f;\x9c\xc0|\xa2\xaf\x87\x06\n\xb1\xfb\xf9\\\x89\xb7n\xf5\x97\xb3\x84\x92:\x96\x9c\x99Az\xd3S\xce\xcd\x91\xfb\x85\x88*\xa4#]\x80\xea=\t|\xd7\xbd;\xcf\xd6\xae\xce4\x1c\x12+\xbc\x03\xf9\x87\xea{\xd5\xb5\xc0\xe5b\x03\t1E\x1b\xd8{?o\xf9\x1c\x91\xd9\xf9\xeb\xa7\xbfY3\xeb\x08\xd4\x16\x8b\xc9On6\n2\xfa\x01\xc4\xdb\xc3.\x91s\x15x\xbd\x9cI\x8a\xda\xf65\xb0\xc2\xd25\xaf\xc6\t\'\xd8\x8e1o\xe9\xaa\xe82\x8b\x11\x8cny(}\x05\xcd.\x19\xb0m\xc8\xa6\x8bt\x13\xfa"\xe0\x07\xca-7\xa5\x99\xd0\x9ae\x1f.:\xfd\xa8\xe4\\e\x88\x8b\x8ek\x02\xe6YI\x12;\xa8\x1b\x9c\xd8\x8e1\xffLd\xce\xc4\x13\x1e\xc0\x08\x05\xbdIT\xc76\x90\xe4z\x91\xf0\x17\x98c\x10\x9d\xe4\xa1[}d@8\x98H\xfe\x07\xe7\xe7\xb2\xaf*>\xfa;\xff2\x80\x04\xaf\x1e\xa6[\x19p\x87Ne \xe1\xc8\x1c\xb9\x8b{CA\xe6Q\x7f\xb9*\x85\xf1T\xd3BizI\xcf\x13}(\xa3\x03\xe4\xcdtF~\xf1+\xf0\x98\x18\xd9\x10\xa6;Ur&\xaa+\xaay\xe5k\xd8\xe7/\xa9*\x91\xf1OC[\x9e\xa9W\xbb\xae\xc3\xbd%g@\xf3\xbc\xbcV\xce;\x99\xb9\xc6\xaet\xb4Z\x12\x00\xcf\xba\xae\xd7o\xee\x99\x08\x98{}\x81\x06\x02\n\x1d!Y\xafj\xf7\xdb\xf8\x15VMw\xdc\x90\xa7\xb0\xf8\xdd*+\x8a\xe0&\x14t\x9a\xb8\xb7\xa7\xaaI\xac\xe6\xaf\xf1\x0e\x17\xb8e4T\x10\xd70=\xaf\r\xac\xb4\x10\xab&.\xb3G\xee\x8b\x1d\xd4\x94\xe7\x03+\x82\xc9\xa2;\xef8\xd0b\xa8\xf2\xf6\xad\x13\xbd\xa9Sc\x81\x8f\xe9]fl\xf3\x95\xb2\x82/~\x0bs\xe3":\xb3\t\xd3l\x1c\xb7\x00t\x05W\x84Z\x9a\xfc\xd9\xcf\xc4\xee\xdc\xd6\x94\xfar\x9b~\xc1\x9cV\xf3a\xd3;\x82gmq\xf1\xa1~\xc2\x8er_\x8c\xb7\x91\x15*\x1c\xe1\xc1|\x9b\x86\xcdz\x89\x86~\x01\xeb\xfd\\\x01s*\x03k\xe4;\xa0\xdc\x101R=\x13\xffT\x812\xe3\xab\x04T\x9e\x8eG}\xdc\x89\xd31<\x93\xe3{\x89\x913\x12W\x0b\xc7v\xceF\x8a\xf1\xafXo]x#\x9f\x04\xf9\xdc\x04Y\xfa\xe4\x90N|\x02n\x8a\x8dl\x0fp~\x1c\xe0\xabP\xc36\xc9O\xe6\xec%Y\x01:p\x9e\xc7\xc9y%0i\x8f\xae\n`\x92\x97\xb1\x84n9\xafg\x0b\x92\x94\x91\xf4\xd1\r\x86\x0f5\x17.\xbe\xb7\xbc\x9a\x0b]{\xcak.p\x93\x05n$s\xac\xcc\xe0WQ\x7f;j\xefpO|#\'\xcc\xec\xd8\xb4\xect#\xb7\xfa\x8c0\x0e[\x0cEB\xb3\x0e\xb4\xd8\xb4\xfb\xfd}fu\xaf\xcf\x1bd\x18\x88W\x98\xed\xfe\xef\x87\xc5\x03\x97?\xbe\xcbTh\xd8\xecd\\D\xaeo\x85\x0b\xcfib\x89z\xf7\x07\x81$\x16\x1af\xd5\x9d\xfa\xad:|z\xa3\xad\xaeh\xdf\xd3\x93\xcaG@\x8b\x9559\t\xf8\xe1J \x9b$=j\x05\xe9\xb2\x17\r<\xa8X9E_\xd1s}\x84Z\x93\xcc\xaf\x17\x95\xdb\x17\x95\xc2\xc2\xecR\x88f\xac\x86\xd1\xa0\x0eLn#\xe4\x91\xa2x\x87D\xd9NS\x16C\x11\xd2\xebL?\xd3\t/\x160')
|
1
|
+
from hiddifypanel.models import BoolConfig,StrConfig,ConfigEnum,hconfig,Proxy
|
2
|
+
# from flask_babelex import lazy_gettext as __
|
3
|
+
from flask_babelex import gettext as _
|
4
|
+
import wtforms as wtf
|
5
|
+
from flask_wtf import FlaskForm
|
6
|
+
from flask_bootstrap import SwitchField
|
7
|
+
|
8
|
+
from flask_admin.base import expose
|
9
|
+
# from gettext import gettext as _
|
10
|
+
from hiddifypanel.panel import hiddify,hiddify_api
|
11
|
+
|
12
|
+
|
13
|
+
import re
|
14
|
+
from flask import render_template,current_app, Markup,url_for
|
15
|
+
from hiddifypanel.panel.hiddify import flash
|
16
|
+
from hiddifypanel.models import User,Domain,DomainType,StrConfig,ConfigEnum,get_hconfigs
|
17
|
+
from hiddifypanel.panel.database import db
|
18
|
+
from wtforms.fields import *
|
19
|
+
from hiddifypanel.panel import hiddify
|
20
|
+
from flask_classful import FlaskView
|
21
|
+
from hiddifypanel.panel.hiddify import flash
|
22
|
+
class ProxyAdmin(FlaskView):
|
23
|
+
|
24
|
+
def index(self):
|
25
|
+
|
26
|
+
return render_template('proxy.html',global_config_form=get_global_config_form(), detailed_config_form=get_all_proxy_form() )
|
27
|
+
|
28
|
+
def post(self):
|
29
|
+
global_config_form=get_global_config_form()
|
30
|
+
all_proxy_form=get_all_proxy_form()
|
31
|
+
|
32
|
+
if global_config_form.submit_global.data and global_config_form.validate_on_submit():
|
33
|
+
old_configs=get_hconfigs()
|
34
|
+
for k,vs in global_config_form.data.items():
|
35
|
+
if k in [c for c in ConfigEnum]:
|
36
|
+
BoolConfig.query.filter(BoolConfig.key==k).first().value=vs
|
37
|
+
if vs and k in [ConfigEnum.domain_fronting_http_enable, ConfigEnum.domain_fronting_tls_enable] and hconfig(ConfigEnum.domain_fronting_domain)=="":
|
38
|
+
flash((_('config.domain-fronting-notsetup-error')), 'danger')
|
39
|
+
|
40
|
+
|
41
|
+
# print(cat,vs)
|
42
|
+
db.session.commit()
|
43
|
+
hiddify.check_need_reset(old_configs)
|
44
|
+
all_proxy_form=get_all_proxy_form(True)
|
45
|
+
|
46
|
+
|
47
|
+
elif all_proxy_form.submit_detail.data and all_proxy_form.validate_on_submit():
|
48
|
+
|
49
|
+
for cdn,vs in all_proxy_form.data.items():#[c for c in ConfigEnum]:
|
50
|
+
if type(vs) is not dict:continue
|
51
|
+
for proto,v in vs.items():#[c for c in ConfigEnum]:
|
52
|
+
if type(v) is not dict:continue
|
53
|
+
for proxy_id,enable in v.items():
|
54
|
+
if not proxy_id.startswith("p_"):continue
|
55
|
+
id=int(proxy_id.split('_')[-1])
|
56
|
+
Proxy.query.filter(Proxy.id==id).first().enable=enable
|
57
|
+
|
58
|
+
|
59
|
+
# print(cat,vs)
|
60
|
+
db.session.commit()
|
61
|
+
hiddify.flash_config_success(restart_mode='apply',domain_changed=False)
|
62
|
+
if hconfig(ConfigEnum.parent_panel):
|
63
|
+
hiddify_api.sync_child_to_parent()
|
64
|
+
global_config_form= get_global_config_form(True)
|
65
|
+
else:
|
66
|
+
flash((_('config.validation-error')), 'danger')
|
67
|
+
|
68
|
+
return render_template('proxy.html', global_config_form=global_config_form, detailed_config_form=all_proxy_form)
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
import flask_babelex
|
73
|
+
|
74
|
+
|
75
|
+
# form=HelloForm()
|
76
|
+
# # return render('config.html',form=form)
|
77
|
+
# return render_template('config.html',form=HelloForm())
|
78
|
+
form=get_config_form()
|
79
|
+
return render_template('config.html',form=form)
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
def get_global_config_form(empty=False):
|
84
|
+
boolconfigs=BoolConfig.query.all()
|
85
|
+
|
86
|
+
class DynamicForm(FlaskForm):
|
87
|
+
pass
|
88
|
+
|
89
|
+
for cf in boolconfigs:
|
90
|
+
if cf.key.category()=='hidden':continue
|
91
|
+
if not cf.key.endswith("_enable"):continue
|
92
|
+
field= SwitchField(_(f'config.{cf.key}.label'), default=cf.value,description=_(f'config.{cf.key}.description'))
|
93
|
+
setattr(DynamicForm, cf.key, field)
|
94
|
+
setattr(DynamicForm,"submit_global",wtf.fields.SubmitField(_('Submit')))
|
95
|
+
if empty:
|
96
|
+
return DynamicForm(None)
|
97
|
+
return DynamicForm()
|
98
|
+
|
99
|
+
|
100
|
+
def get_all_proxy_form(empty=False):
|
101
|
+
proxies=hiddify.get_available_proxies(0)
|
102
|
+
categories1=sorted([ c for c in {c.cdn:1 for c in proxies}])
|
103
|
+
class DynamicForm(FlaskForm):
|
104
|
+
pass
|
105
|
+
|
106
|
+
for cdn in categories1:
|
107
|
+
class CDNForm(FlaskForm):
|
108
|
+
pass
|
109
|
+
cdn_proxies=[c for c in proxies if c.cdn==cdn]
|
110
|
+
protos=sorted([ c for c in {c.proto:1 for c in cdn_proxies}])
|
111
|
+
for proto in protos:
|
112
|
+
class ProtoForm(FlaskForm):
|
113
|
+
pass
|
114
|
+
proto_proxies=[c for c in cdn_proxies if c.proto==proto]
|
115
|
+
for proxy in proto_proxies:
|
116
|
+
field= SwitchField(proxy.name, default=proxy.enable,description=f"l3:{proxy.l3} transport:{proxy.transport}")
|
117
|
+
setattr(ProtoForm, f"p_{proxy.id}", field)
|
118
|
+
|
119
|
+
multifield=wtf.fields.FormField(ProtoForm,proto)
|
120
|
+
setattr(CDNForm, proto, multifield)
|
121
|
+
field_name=cdn if cdn!="Fake" else _('config.domain_fronting.label')
|
122
|
+
multifield=wtf.fields.FormField(CDNForm,field_name)
|
123
|
+
setattr(DynamicForm, cdn, multifield)
|
124
|
+
setattr(DynamicForm,"submit_detail",wtf.fields.SubmitField(_('Submit')))
|
125
|
+
if empty:
|
126
|
+
return DynamicForm(None)
|
127
|
+
return DynamicForm()
|
128
|
+
|
4
129
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
130
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,128 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xa6"\x00\x00\x12\t\x04\x00=\x85ZoIo\x98\xe6\xfd\xec\xe2p\xed$\xe3\xda\x00\x00\x00\x00\x00\x00\x00\x00\xb3\xafd\xa7\x1f<)\x1c\xb96\x1c\x87=\xc1\xb8h\x12$q\xa0h\xb6j`z\x95\xbe\x96\xb6\xf6\xe0#}\xec&6A{\x93\xf4\x7f@J\xff\xdb\x9c+\x8b\x8c\xbd\xe6.#\x1c\x9c\x03\xcc\xf5\xfe\xcc\x92\x01\xa5\xbb\xd3\xd7\x94L(h\xcf\x16\xdb\xef\xf2/P\xde\xd9l-k0\xa5>\xf4\xc2\xba\xf6\xd1WG\xec!\xda\x86\xfd\xb5\xff\x9e\x04\xfbP\'2\xae\xb07\xd1\xe0\xfaO\xbd\x0b\xcb\x96\xa9\xfb\x90\x9a\x8b4\xf5P\x88\x87K\xc2\xc1\xee!\x84d\x94\x16\x10hz\x88\n\x1fR\xdfn\xb6\xf8\xf3\xf8\x15\xa8N\x1a\x15\x0f\xaff\xef\xe7<\xce\xaaL\xfa\x9e\xfa\xce\xef\xa8;\xf4f\xd2\x93Hc\x00\xe8\x9b\xe6k\xc3\\\xa9\x89z\xb01\xa9\x11{L\xcf\xd8\xf9\x10\x85\xb3__\xa2\xc2\xd4\xd5\x89M\xbaY\xddm#\x8b\xee`H\x98\xc5\xa7V\x82\x89\xcc\x8a_\xc0\x87\xdd\x9d\xd5\xe7\xab\xc4\n\xc0\xcf\xc6\xe4\x0e\xbf\xd3\x8d[\xf05\xe2\xc6M\xd3\r+\x1b\x9d;\x08\xd1\x037\x1d\xef\xaf- \x85\xf4\xb3\x9e\xc7i\x8c\xdc\x1b\x93\x12/\x04\x8bn\xa0\xcb\x7f4m\x0f\xc7\x10>],+\x18\x84\xe0=cWz\x92J\xfb\xf9\xbb\xdc\xf7-\x05&\xa86\xef\xf7q6\x03N\xf6\x18\xcf\xe8\xd6\xd5\x8d`\xf4\x0e\xbd=\xce\x10\xe3\xf9\xe7\x08\xfd\xfe\xcf\xa7\xa3\xb8\xde\x97!\xe50\x8e\xcf\x9d6\x95\x1d\xe3\x90\xe3\x8e\x0c`\x0f\xbd\x9a\xdby!V\x97\xe0\xcd\x95\xe0P\xff\xbb=\xf6\xddZsxn\xf4~n\x87\xd8c~\xaf4w\x17\xe4\x8d\xbc\x80\x80Z\xf2\xc2\x19\xed\xf7\x9bu\xc9`\xd1w\xe7\x8e\x04\n\xff\x8d\x8a\xc3B\x17_\xa9\x94,\x83\xb0\xde/\x8d\xbe\xee\x8c\xf4\xbb\xb7\xe9\x80<\xd84\n}\x1d\xb0\x0cRQlJv*\xd6\xbf\x04\xf2\xcd>?3V\xc2\x93\x9b\xfc"\xe92\xcc5\x93h\n-Z\xcf\x87\x06n\xeb8\x15}\xdb\xb2\x8b5!\xb1\xa8\xe8\xa9r\xd4U\x92\x99b\xaeb{\x8e\x97\x8c#\x01x8x\x9c\xe8\x1d\xbc*\xa7\xe4\xe3\xccF\x9e\xc9\xb8\xb2KK\xc5_\x95u\x1e\'\xb4\x04\xfa\xd4\xc3\xaf\xd7X\x0b\x16\'\xeeE\xdf\x1cI\x01\xa7\xcc\x15\x1c\x05\xd8\x95\x87H\xcb})~\x16F\xa6\xfdyq\x08o\x1c.\xae\xf5\x9f\xd5(\xff\xf6\xe4)\x86x}\xae^\xf9s\xb1C%\x83e\x1f\xe1^\x1b\x87\xdb3\x958\xd2\x8b\xf4\x95I\xf1\xba \xe9jt\xb3"\x9e\xf9\x99\x90r\xbe\xf5\x81\xc8\xe2A\x1d\x89c4\x10\xdc^\xebg\x96zr\x1b|J\xf4\\\xae@\x91\x02+\xeaa:\x01\x90\xad\x11\x96\xd3ca\xe4\x19\x8d\xceV\xe8Jz\x16+\xd3\xe8\x8a\xe8\xcbb\xe5\xcc\xe4\xb6tX\xda!~\xf3\xb5}\xff\xbeo\xfb\xdb\xa0\x17+\x9e\xe7[\r\x8dG\x8b\xe2CU/I\xbe{\xa3\xdaA\xf9\'\xca|\xa5\xe6\x13\xd8UL\x89H\xd9\x80F\x1c\xbbOmJ\xc2\xda\x83\xd9\xad\xc6P\x87iZDM\x14qOf\x13_\xd5S|O\x1d\x0b\xe4\x14\xbb\xba\xa4\xa1\xc5`\xac\xef\xefB\xa7\xa4\xc6\x0c\xf9\xe0;\x80$\xe9\x06\xbb#7\xbd\xc3K\x08d\x07\x06\xb1\xady\x9b\x17\xf3\x12_\x8a\xc8\x92x\x04\x87u\xb0\x9e\xf3\x8cT\xd6\x15\x17\x85\xa8\x89J\xd9\xd7\x91\x0c|\xa1x-\x0bB\xfbH#\x16\x80\xb9\x93\xc47\x00\xb4\xf0B\xad\xc6z;P\x91\x03\x02\xb1\xcb\x8a\x81\xd3@\x8c\xff\xeb\xefW\x19\xc0K3$\xce\x8a)\x88\xa0\x92U\xcd\xc3\xc8\xdf\x03\xddj\xfe\xf8[\xbc\xab2\xbf\x99\xb4r\x02\xfcg\xfa\x19\xa6"J\x9fD>\x88i\xdb\x9c\x93\xca\xb4S\xaf\xa5\x1anw\xdc\xe4\xd2\xd1N|(\x1b\xdf\xf9X\xed\xcc\xbe\xe7\x9ad\xd1\x1fM[7;L\x9es\xff\xe9\xd9V\x16CY\x1fTI\x0f\xcd\x15\xbd\xdfg\xdc\x1a\x9f\n+\xb5\xb7\x00d\xef@b\xa1\x0b\xc2l"\x17\xd6\x80nz\xf3\xa2i\xa59\xab\xba\xdb;\xbc\xfae\x99\x8e\x9d\x0fx\x7f\xd6\xe4sGO\x8b\xcd\xcb\x83\xa8\xabS\xb7?\x12\xd9\xf3\x96\xd9\x88\x00\xe2\x12D\x14\xfb\xcd\x94\xb6\xebf`_\xc5ZF\xd5\xdb\xf5\xae}(QS\'\x06\xc5\x02\x8bv\x1b\xec\x93\xf7C\x8c\xc5\x17\xfe\x85w\x16HK\xf6M\x81\xe73VC6 \xd4\xc8\xdaDH\xb4W\xb7Y\xe2\x1a\x93\xcd\xa4C\xcb\xb5\x1a\x9c\xfe\x15\xef_\xd9wr+\x18d\xe4\xbdI\x94\xb0\xab?_\x94aR\xc0A<\xce7\x958\t)\x84\xf2lT(ese!^d\x1e\xfe\xe2*\xab\x8f\xe3A\x80\xe3\x1f\xb3\x920\xfci\x86\xeb\xb8|\xbax\x00\x10\xa2\xd12\x19\x88\xddL<\xd6\xd1\xbc\x94\x1c`<O\x0b\xe2\xa1\xec\x86\x1a+\x8a\x9d\x9a\x93\xf1\xa7\x03Q\x08\x97\xc3\x05KC&\xd2\x7f\xea\xfb\xa4s\xa4\x01\xa2\x12x\xee\x14a\xd5\xd8\xff\xed1\xa8\xdd#,!\x05\xb4\xdd\x15\xbf:>\xb2p\x85o\x1c\x9bp\xe98\x87*\x8f\xec\x03\xa0\x16\xb3\xe9\xcbQ\xd6\xa8\xdcb\xfcs\x844ys)\xab\x1c\x16B^\xfe\xd0\x90c\x96\xa8\x17sOAOs\xfdMIE\xebo{*\xd4\xbc\xe0x7V#\xeb\x0b\xf4M^?2\xa0\x0f\xfd8\x85\xaaM\xdf\xce:\x9d\xe4w\xef\xbd.\xf1]\xa7\xff\xdb]\x04\xbe\xb7\xf3\xc8\xaeR\xa1\x88>j\xe5u\xf4\xfd\x9bmO\xff\xd3+~#8\x17\x0c\xef\x83PJ\x1d\x9aV\xd5R*U^\xf4d1\x04j\x930\x83\xb3*\xa0\xe1\x03p\x9bn\xd3\x04\x8aW=i\xd04%\\\xfc\x07\xf4\xea\x8f\x84q\x88g&\xd0\xa3\xf0\xa8mZ\xe79\tr\x87\xf5\x85\x9a\xfe\xef\x05\xfc\x97a(z` wA\x80\x90\x01j\x97\x9c@re^\xbd\xb0\xef^\xc7\xda\xdc\xe2A\xc1\xa1\xa0\x0f@\xda(\xe6\x1d\x81O\x1cun\xf9:\x8dlv^\x94\xec$\x86\xe2\xeeS\x86\xd2\x19bG\xf5\x12\x89o]J\xf1>\x0cB\xc19\xa7\x14\xd5>\x19\xed|\x12\xc2H\x01[m\xa6\x93\x0e\xce!x\xf7V\xdcM\x03\x0c\x07\xb8\x97Z\xd9\xd2\x80Y\x1eJE\n\xbd0\x8dj\x89V\xf7\xd3\xdd\xf9\xa4,\xca\xc2\xf3!D\x1e o\xd3_L\xff\x86\trHh\xee\x83"\xa4\x8b\xbe+$\xc8\xf1\x9722\r\xef\xc1\x02,\xa0\xcca(\xf0\xbbe\xcbSL)ew\xdc\xdd\xe6S\x8eHg\x98\xfa\x08\xed\x0b%J\xed\xcb\xf4@\x84\xa3A\x97\xcd[\x01\xc3\xbc\xa1\xc7_\xaf\x83\x856\xb3\xfb\xd9\x19\xe5\x97\xb5\x03\xdd\xbb\x00e\x85\x13\xd7\xba\r\xd75(\xd7\x83\xb4E\xea\xbc\xff\x9c\xf6-{\xf5\xdd\x1c\xed\xc9\xac\xaf\xf5W\xb3\xa3\xaamY/\x07G\t\xe8\x90\xd8R\x89\xf7\x88\x04.\x9c\x061\xa8\xbd\xebci\xe9\x80D\x06O(\xd3\x94\xc9_\xc0\x1b\xa0\xc9r\x97\x82{\x9da`\x96\xd9J\xbc\xf25\xc4\xc1|4\xd9\xe7o\x919\x92\x15(\x02]\x12Z\x1c"\x96\x07\xc6\x916\xe4\x1a\x7f\xba\xd5\xabk;\xdc*\xbe\xf5\x18/\x13\x83\xe7\x18\x1e\x15\xdf\xb0\x94\xe06* \xf1?\x18q\xd0\x1eC\xbe\x9e9\xa9E\xee\x0fx\x01\xf4\xb3\xf0\x8a\x0c~\xa0\xd7\x1a\x16\x97N%\xe8\x7f\xbflw\x1b\xebM<@\x80\xdd\xe1\xd5\x14m\'t\xbdh\xe4\xba\xe5\xf2\xe3j\xc60\x16^\tf\\\xe3\xf7\xb7\xc0\xb0\xa9K\xbb\xf6\x8ct\x97\\~U\x0b\x06$3\x91\x9a\x15\x17\xcd\xb0j\x0f\xda\xa8\xcf66\xea\xcd\xfc\x1b\xfe\x96<\xf3\x02^\xba\x88\x1f`\xd9\x8c\x9e?\xc3\x1d\x1b~\x93P\xbb\xe9$($\xc4\xeb\xb1\xe7i\x8dj\x1e\x1c\x8c\xa9\x8f+\xc0s/\x87\xa4\x8ak(\xe3\x95A\x7f\xa2\xc1\x84\xf0\n_{\x85\xcb\x1b\xacHd\x802W\x98R\x86\xd7\xb4\xd0`\x89\xee\x00[d\x1c\r\xfb%\x08\x01\xc7\xd0.Jy\xc2T?\xff~5\xcd\x11\x8f\xa3c\x82]\xc4NJ\x95H\x9e\xdf\xddl)\xd1h\x05/<\xa3.kfF\x9ew\xd5k\x1eL\xd3\xd46!\xca\xefM\xc6\x99iwZ\xa6\xf9\r\x15\x8f\x9b\x00&\x92c\xdbz\x0bC\xc0\xe6\x8bm\xdfY\x13\x12\xa7\xc9.~\x80/\x1fL5G\x02P\x01\x0f>\xe0\x9e\x19\xe2\xbc\xcf>]\x81"\xe6P\xd0knyu\xa9#\xcb,\xf8\xbb\xd2\x15[\x88\xcc\x92\x0e\'\xaf\x83\x98[\x1c\x8fcpn\x13(\x04v\x98\xc7\xd3;X\x18e\x82\xd2#[\xeb\x1a:\xa0\xd4\xbft\xa4\xbc\n\xe6\xdd\x82\x18Db\x12\xa5\x88\x9f\xc9)]\xa0\x01r\t7\x8aP\xf1\xdck\x91X\xff\r<\xc3\x91+\x1coV8\x88\x98\x01\x0c\xa5\x9f1S\x0c\xed\x8bx#\x8b\x8eA\xc9Ac\x03_\xe0\xe0!\xa5#$\xca\xfa\xe7r\x05\xc4\xa4w1G\x85+\x18\xb5\xa5\x9c\x9d\xce\x87\x8f\xbcW\x9d\xaa1\x0c\r\xff\x8cJ\xe0k.\x03D\xb8\xb5\x93s\xb1\xa6C\x95\xef3\xf9\xbeH8E\x0fU*]\x1d\xf6\xc9\xa8/?O\xf1\x0b\x13\xeeB$\xea\xe9C\x15;]\xb7|\xd17s\x94)\xac\xab\x88,HB\xb6\x9f\xd8c\xb3\xaaB\xc0\xcc>k\xd5@\x96\xce\xf6Y\xe2\xd9x3~w\x86\xf7R8z\xe3\xedX\x87\xd7\xf7\x95\\r!\\\xc4\x82\x1f8\x93_k;\xbd\xc4\x1c\x94D\xc5\xe2\xf1p\x8f\xe4\xb2\x1f\xb1\xf8\xb6Tgf\xa2\xbd\xc2\xf2\xd8\x1f\xacg\xb2y\xd0\xc8\xd4\x0e\x8d\xc8M8\n\r\x10\xd9\xe1\xe0\xf0\xb5J\xee\x0f\xd7X\xe6\xea\xb8L.\x0f1#\x9d\x83\xc2\x97\xdb\x1d\xfb~\t\xc7b"\x05\xa0-*\x9f]\x7f1\x1d\xb8#urM"\xf3\x1d\xc4H\xef\x98u\xf7a\tgp\x9f\x06\x8d\xbd\xc25x\xb9@\x7f\xb9\xaf\xda\x1e\xae\xb67C\xd4l\xfb\xf2\xc7\xe7\xae:\xd0\xbb\xe7\xe4h\xee\x89\xb7\xb9\x17t\xeb\x8c\xa4:4\xff]\xa7\x1f\xbe\xb2[\xd7\x14\xb0\xaa\x9a\x15\x81+\r\x99o \xab\xceh;\xd5Gy\x92C\xb1\xc5\xe7\x1f}\x98W2\x05v(\xea\xa4\x1b\xa9\xab\x16y\xfc\xf5)\xae\x8fC\x7f\x06-\x98\xff\x93"\xf7\xe8\xe1c\x0f\xb2\x19;T\xb3]x\xa1m\x834O\x1f\xa03E\x9fi\x18d\r\x00\xa9\x007^\xd9\x11\x1bA\x02\x8eY\x94\xdb\xce\xe2\x0b8\x00Q$A\x137\x9a\xd5\rut<\x8bG>\xb7\x14vrs\xd3\xe4\xfb\x1f`\x80\xaf.\xd30\xe5\xf8:@:-\xd5\xe3\x1ef@6\x07\xa1<\x05\x1eX\x87S\xcf\xae\x0c\x18\xe7\\\x11\x98\xc0h\x8a\xc5\xe2m\xc9\xd2\xfdsH\x17\x01\xad\xb4\xe5\xf4{q\x87\xc1\xc3\x87\xf6\x9d\xff\xd5\x14\x1b1I\x08q\r\xff\x15\xad\xaf,r\xc1\x90>\xe8R\xeafl\xb6\xc3\x08\x06\xb9\xd5u\xde\x96\x86\x03\xa2\x1c\x14\xfa\xbdu\'\x84\x8d\xf4#X\xd3\x99\xea\x86\x8b\xca\xbd:i\xc97\x1fR\xf7x\x06c\xf3_\xb1\xb2\x83e\xc8e\xaf\xa8?\xaa\x0c\xa3\xa3 \x97\xa9s\x03\x90?\\end\x9b`\x0b\x8b\x0fD S}\xb2\xb4l\xf38\xe4el\x05\xf4\xc0L\xec\x8b\x1f\x94LM\x95\xad\xd2pP\xce\xbb\x9d\x87\x92\xe0R\x1dV\xf8DG/\xec\xd6 \xe7O\xab>\xd5\xb4\xf9\xdbA\xcb\xe7\xe3\xe8\x04\x08[ )\xac9\xd1\x0c\x15\xa8\xe7\xdc\xf11\xc1\x01.\xc1\x17\x1c\xe3"\xb5\x8cU08\xeb\xe6=\xe8%\x07Brb\x0f\xc1\x91\x02\x16\xcc\xd0\x83\xe7\xb0\xbf\x82#\xfe\xb0vX\xa42\xa6[\x07\x954L\xc4z\xdb\x0f)c\xee\xdaA\x99\xea\x11H(\xbc:\xea\xd3\xd4\xfb\xfd\xc4\x00\xc4\xc2\xda\x84\x1a5\xfe\x04\x9a\x01\xdf{\xcfv@\xe3l\x85c7F\xe2){\xb8\xfa9\x9d\x01\x84\xe3\xa9\xa4xV\xfa\x1d^\xfe9a\xc6m=A\x172\n\x83\xf2S\xeax\xa9d\xd5\x11\x0b\xb2\xde\xf6"\xdf|\xbf\xbe\xf9\t+\x86[^E\xc76Vq\x9b\xfd\xb5\xa3\x86K\xae\xd6\xd0L\xdb\xec[\xf5\xdc\xe8\xa7\x03J\xef\xcd\xd0\xe5;\x07\x11K\xc0D\x89\xfc\xc3\x05\x89\'x\xb0v`\x92\xe8\xb3\xa6\xa8D:mO\xee\x88c\x18\xad6\xbc\x80]\xc6(\xcdvM\x9f\xa9\x04\t\x06\xa5\xbd\xf2\x7fR\xb74\xcf\x87\x13\xa2{\x08\xa7\x14\x84\xf0\x98\x0f\xced\xdeh\xf3)\x8ek\x92\x18\xdf$B\xaa&<$\xc5\xad\xfeU,\xa1\x8e\xea\xe7\x06\x81P\xbc\x0c\x1c\xc5\x1b\xd1-\x15\xd5Y\x01\x03\x9f\x80\x9b\xc3\xb5y\xf1\xb1\x98\xcf\xa0\x15\tC\xa6\xf3\xcf\x03\x12V\xd2\x8b\xf7\x9a9\xa0\xb5\xb4\x80\xfc\xfd\xe3\xaej\x9a\x8fUL\xda\x06W\xd0wbR\xbc\xfeN\x86\xb3\xa1\x12\xe6\x98|\x00\x88\xae\xfeJE\x0f\xb2dB60A9\x91%y\x9cI\xe8VO\xf4\xb0\x91PY\xe4\xa9\xcc\x82U\xab>m*\x0fT^f\xc9K\xb7r\xb9|\x87\x88\x83\xfe\xde~\x89X6Co\xd3)0\'\x97\xa2\xd7\tO.\xeeW\x94\xe1\xe5[\x04\x82\xef*\xfa\xa0\xb7x\x86.\xd0\x8b*d\xb5\x012E\xdc\xd8\xdfoG9\xd0\xbc`\xa4y`_\xd05\x18\xfa\xb8H\x88\xa8!\x06\x87\xa4\xd6\x01q\xdb\xae\xfa\x9d\xd1q\x02oq]\xed`\x98?\xeb\xe0\x8e\x86\xec6\x8fL^\xf2\x8d\x7fy_\xb7(\x08\xf1\x94!]\x8a /y\x80\xae\xebZ\xa2\xa4\xcf\x1b\x9c\xc3Q\xc7jt\xbd\x12\xfd\x12\xea\r\xc7\xbf\x91T\x85\x07~\x1d\xc0\x9c\xee\\q\xe4\xf8Q$\xe2\x16.\xd4\xf4\xce\xb1\xbd\xb9\xdd\x8a\x05\xec\x11\xb5i\x94\xd6\x93\xe6V\x83\x13M\xcf\x11J\xaf\xf8\xc8\x16\x053<\xc0\x15\xf6\x84\x99]\xea\xd5b\x80\x0ci\x03\xe4\xd9A h\x1c\xa15\xebC8\xcb\xbc\x83\xf3\xbb?bw\xcd\xa5f\xd5\xe3;\xf4s1\xc0P\x8dIi\xf3\xa8\x0c\xa3\x9b\xb8t\x1d\x87z\x1b\xac\'\xc1\xa9l\xd7\xdd\x13E0B\x83R\x05\x942\xdaj\x9e\x02\x1f,\xe6\xabkU\x0c\xa0\x9c\xb7\xcfD\x87Y9\xc8\xa1\x1b\n|\xd11\xe9\xc8\xa9\xa7~\x0f\xbb\xc5\xd1\xc2\x93\x93\xa4K\xe2=\xc5\xfa)r\x1f\xd0k\xcd\xbf\xd1\xc5\x07\xcd\xdb\'\xb97e\x98\xea\xc0\x1e~\xdf\xeb\x98]\xe8\x0fd\xffMK\xc8\x1cg\xa3z\xb3gCQ\x19\x8b\xc2\xef\xff\xa9\xc9\x1bWv\'W\rT}\xad+\xfd\x05]\x07\xe4AWc\x9c\x93\xf8f\xe2z\xf4G;\xfe\x179\xb1\xf4\xed\xf9U\xef\x06\x83\x8c\xf3\xa0\xd0"G\xf3\xbbf)\x94\\\x96\x1f\xa8\xd1\xe0\xac\xce\x98\x91s\xc0\x10Z\xe8\xfc\x96\'\xb0z\xc1\xc3>\x1b\xd5h\x85\xa16\x7fs\x9fc\xc9)\xe3\xea\x8b<\xcc\xbe\xb2\x06D\xb0\xebvA\xaer\x02\xe8S\x0c\xb1V\xa4\x84\x8af2]\xc8%(\xd4\x1e\xb6Q\xde\xc8?\xbd\xf2\xbbUrJ\xc1~C\xb3\xd4{T\xb0~;=\xcfrp\x9c\xb8\xc7\x8dQ\xf8\xb6p\xa3\xf3\xfa\x1a\x07\x93\x0f\x80\x9b\x88\xdc\xe5\x0c\xc2\xb5\x1b\xa9\x84\x08\xb3=\x12\xde2\xd088\xc9L\xeb\x16\x91\x1e%\x07\xb2\xa4U\x8fh\x8c\xb8lD\xf0\x93\xba\x1e\xc8G\x9d,6`\x7fo5\x0f\x0bO\xe5{\x87\xc5\x16\xf1\xe9\xf2v&\x92\xc9\x86\xc6o\x0fMA.\x17\xcas\xfc\x8eO\xb2\xf2\x1es\x88\x14\xb5aV\xd0\xc4\xf2fX\xbcR_ \xd4-\xf4\xf7~2\x88\xfd\xea\x1ec6K\x00\x00\xb9B\xdf\x13\xb5aD\r\xd7%#\xee\xea\xd3z\xae\x1e\x8f\xfa\xb6d\xfa\xee\tF\xe3\x9dwx9\x90\xbe\xd9\xf2\xd9P\x7fh\xf5\xb5\xba\xe9\x12\xff\xfc\xa1\x01\xee\xeb\xb5\xc4\x1e\x04`\xea\xb42nBg\x9a>Z,\xd0\xa2K\x1d\xdef\xe3\xba4\xd5n\xa7\xe6]\x04P\xf2\xfbZ\xbe\xb5\xab\xd6B5\x13\xf9#e\xf0\xee\x9f<\xe6\xb5,\xe3\xcd\xe0 \xf9da\x04\x1c\x86y\x7fZ\xa3ZU\xab\xfe\xbf\xec0}7\x04W\xdb3>-D\xacjv\x7f^K\x14u8g\x0c\x01\xba(\xa5;\x0e:\r\x89\x83\xd0\x1d\xff>\xa4Y$\n\xbcs\xdd,\xd3W\xadc\xb2G0\x1b\x8e\x1f\xc0\xf4jYu6W\x89+\x13\xb1V\x1eZz>r\xae76I.X\xbd\x8b\x00r;\x82\x93\xef\xc4\\\xe4_\xee\xf0L\xb8?\x82SbM\x18\x01\x1a\x0fn\xad\r\xe6\x88\xbe\xa8\xffueI\x96G\x91\x95\xda\xd9\xa9\xe8\x82\xc7P\x0eU\x1b]C\x8fQ\x80I \xa2\xbfP\x0c4\xb5\xa2\xae\xcdd\xc3\xd7\xb1I)W\xbc\xff\xe0\xcb\x85a\xdea\xcd\x884Y(\x8b\xd4\xbev\xba\xc2\xfb7\xbfw\n\x19x\x86\x92\x11\x13\xfe\xcfz\xcfY\xd9\x8d\xa5n\xcc\xc8U\x84%Q\xf8\xbc\x87\xce\xf2\t\xdd\xb7VL\x1azb\xd0\xfb\xe5\x1f\x93i\xbc\xf7ij\xf6\x93k.L}"\xb0gM~\xf8!\x9dy\x8b\xcex5\x8bf\xea\xa2\xf9\xb6\xa8ng\x1a\x81\xdfD L&\xfa\xdf\xf2&\x93\xbf|\xbb\x00\xe5\xb3\x80\xd0\x878\x0b\x1e.\x1f\x1e\xd9\xca1t\xa0\xa6\x80\t\x1c\x87\xd2\xb3\xe4*\xfeX\x96\x85H\x8d,\xd0\x1d\x0c\x02\xda\x1b\x12\xaf\x7fmT+\x1dO[\xaf\x16\x16\x1f\xe4x\xf8\x8e\xf3\xad\\\x82#\xd0\xf7B\xed\xf0\x15\xd6%\'\xe9\x05\x13\x8d\x00\xd9F1\xaa\x16R\x1a)*=t\x9f\x1d\x80\xcf\xef\x05\xce=\x02\xc8\x1dg\x9e\xf6x:\xdc\xe7\x9b_gS \x7f\xe9%\xfd\xc2\xcc\xa9\x15\x99\x8a)2\xd9\xf5q\xb4\xe9?^f#\xb9\xc5\x90\xb7&\xfe\xcc\x1dG\x03\xd6E\x00vnwG\n\xd8\x9a4\xefE\x93\xc9\xd37\xcd\x85p/\x97\xcb\xa6\x7f\xb31\x17\xc1I\xaaHj\xb60\xdf\xaf\xdd\xa1\x99\xb2 Q\xe2MoL\xda\xa3)\'i\xc8\xd0\xc9\xfa\xfay\xf7~E\x0f\xfbayT\x84+\xb1W\x11\xdc\xaf5\x93\x05j\xc8\x84\x94?uZ\xeaR\xcb\xe7wJ\xc3\xfd\x0b\xa5\xca\x08\xb3\xbf\x94\xa8\xb5\xc5\x90W\xf5-\xb2\x8e\xc8+\xf6;\xb3\xe1/\xe7p\xc3\xbe?\xf4v\xdeI\xda\x08\x8c\x8a2\xdd\xda\xca\xc8\x0e\x9d0\xc0P\xe8w\xb59\x8c\xb8\x88\x85\x9f\x01\xa0\xb46\x15\n\x10\xb9\xe8\xe0%\xba\x13\xd7l\x1a\xefT^5\xf8\xa4<\xfe\x92\xe2AY<=!\xcb\xeb^\x0b\xa0\xcbp\xcaF\x9c\x91s\x03\xcd\x1b\xe6\xd0\x11\xec\xe2-|V;\xcd\x13\x96\x14\x82\x1b\xe1\x8e\x9b2\xe0\x82\xa8B\xe2\xae\x88r\xe6g\x9fbp#,6\xa0\xb1\x1b\x8f\x83\xa6\xeb/\xe4\x85n\x0f\x94\xcc\xf5\xb6\x1bO\xcbX\x9dC\xf3\xca\x0c\x1d\xc3\x92\xceo)\xffw\xae\x9b\xa7\x972>P\xb3\x9a]\'\x1dH\'\xd1\x90j\xe8\xbc\x87\x9b\x9a\xd2\xac8)\x83\x0c HT\xebd}\xcd\x17n\n\xd7\x81\xd7\x07\r\x9a\xfa\xa3\xe1~\x99\xa3\xc1\xc5\x7f\x1evnJX\xb1k\xef\xb8a\xa4\xd9\x1ft\x06{\xc0\xed\x947\xbcR\x99g\xd5\xc2\xfdF\xd5\x13\x99\x06\xe9\xcf\x1ey\xf1\xcaI\x88a\xc8\xdf\x99kT\xf3tN\x9co\xc6\x9a\xd2W!\xbf\xe04\x1e\xdb\xafo\xd2=Qa\x86\x8c\x86J\xbd\xbek\x98\x85\xf5\xde\x05\xff\x9eA\x14\xb8\x9b|\xa6\xac\xc4R\x82U9\xa6\xef}\x8f\xc5)`y*i\x01h]\xed\xdfB\xbf(\x8b\x07z\xa0gh\x1dF\x01\xdfG4\xa7H\x01\xd2bZ$\x184,;.\xef\xdf\x92\xcd\x9d\x19\x974|\xce`\xd0\x97\xbfZ\x99\x1c\xb1\xc8\xe0\n\xe8\xc4\xc5\xa7J\x8c+\x12\x81\xb6\xe9+nG:)\xfc\xc7\xfb\xa1\xd30rg\x8a\xa0oT\x0b\xdf\x8f{\x83\xe6\xd5\xcd\x10\xfc\x08\xc7Z$\x12y\xd6\x86\xc3\xad|\xf3\x91"\xcf\x94s\xbeH`\xaan}r\n\xc0\xb9\xd8;U\xaa\xea\xf8\xf9\x8eF.\xcaj\xa2\xc3@\x87X\xb3r\xecehZ=\x85\\\xf4E\xf2\xcb\x9c\xa4\xc8;\xc4\x97\xef\x1a\xdb\x14\xf7\xb6\xd15\x862D6o\xeb\xb97\xc8_u\xc9z\x8b\xaf\xc5\xee\xfb\xad\x008\x16Z\xd0\xe8\x81\x87jyp\xc53F\x89\xe2\x14\xd0\x19#\xf4\xe6UB\x81\'L/\xb0\xa9\x1b\x7f\x13\x1c\xcf@2\xdf\x11\x82\xe4\x86\xd4\xceGX\xb0\xb3\x99\x9b\xfeTo\x0fZw\xce\x8b\x84\xfb\xcf\xe7w\x96kPA(+g\xd9\xad\xb2\xe6\xbf\xd2\x9eHbZK\xd3\xca\x98\xe6\xfa"\nT\xb4\xe7\x9a\xe8\x02\xdb\xab\xea\xcbG\n\x0e\x81YA\x0bg\xa4o{\xe6M\xdc\\\x9d\xcfw\xec\xcb5\xafu0\xb62[!T\x05\xc3\x81ZA\xdaG(\x88=}\x92\xbe\x04\x948\x0e?\x17\xe1K\x82\x04\x18\xec\x8e\xd01\x11y>\xcce\xc3\xfd\xd5\x02\xa4\x86\xa6M$\xf3T\x97\x1e\xe8m\xa0\xc7\xce\xecI\xdfM\x9a\xf0^\x1av\xe4gD)8z\xb50\xc8\xa1\xdb\xdf\x0f6\xf1\xc4\xa4\x0b-\xdc\x1a\xcbW\x9f6S\xfcz\xcc\x06\xec0\x1b\x8bhK1\xdf\x83\x18\x08d3\xcb\x89\xca@\xfd\xed.8\x91\xa0-\xc8\x94xSU\xe3`@\xf8P\x7f\xea\xc1\x83\xee\xb6\x17\xa3\x117%\x9f\xc3\x86]7\x99L_\xd5\xc4\xf4\xb1\r\xad\x94G{\xc9\x93\x87\xce\x01\x98`\x9b\x00\xd4\xe6\xd2<\xb6\x194\x15\xaf\x1f\xc1\xe9\xb7N$\xe86\x1b\nX\xc7\xeb\x8fG),Mu1XW\x84\x92\x03:\xebNa{-:\xe1\x9d\xaa\x94\x00o\xa8\x0cP@\xf0\xf3\x15\xd0\x9e\x8a\xd7W\xce\xd9\xd8\xebz65\x18\xe5\xd2\xcb$V/\x9c\xa3tAE>F\x81\x99\x16\xfa\n\xe1\xd6o\xb09D\xca\x9bm\xc8G\n\xe1\x18\x88\x16\xa2hD\xb07\xa4\xc1\xc0\nz\xfdWf=\x05\xa1w:\x10X\xebI\xa0\x9e\x91\'\xec\xc2\x04`\xf1\xee\xe2W,\xddB\xbbl\xc7[\xcfA4\\g\xd7\x02\x8c\xa1\xee0\xec%5\xb8\x08\'Z\xa04Y\xffx\x86\xc66\xd6\xd1r\x82!\x90D\xb7\xc9\xcc\x0f\x95L,\x19\x9fu\x1ab\xb3gu\x97P\x00\xf0QuE\x17\xe6\x87Pn\xa9\x18\xed\xe1K-\xc1\xc9Y\xaeT:\x8a\xb4\xcb\xdd\xed\xa6|c\x16{\xf5\x93\xa4\xc6\x86\xce\\\xc0\xaey\x9c|\xf5Wx\x125\x93\xdb\xac\xbaC\xf3$\xe5\x16\xa3\xfd\t\xefy\xd5\xe5\x88/)\x99\r\x97<\xc9\xdb\x97\xc8\x9d6aPY\xb5\xfd\xcd\xe9L>W\x05}\xff\xaa\'\xf3\x12\xa0\xc7o(%\xe5579\xad\xb5\xe5\xc4kN\xfd\xf17\x16\x99\xc3_\x04\xe1\xd9I\xe7|\x80\x9b\xc0\x99\xa8D\x1e\xbf\x03\x7f\xef\ri\xa8\xeaw\xbd\xdb\xab\x9cC\x87\x9aQ\x89P\xf6\xd1w\xdd\xfb\x1b\x04\xc8\x8f4\x7f3\x9eu\xae)\xb2\x0f[\xe3U\x07\xea\x99\xe6\xd2\x0f\xcfsi\xf3\x92\xdc\x07AY\x8e\x9d\x1c\'W\x9b\xd6\\\xe8\xbdM\xc5 \xab\x9f7\xdaS\x8e\x90\xd5\xc6*\xa1\xd4/\x0f[\x84@\xf8\xc3\xd1\xf2\xa9\xdd\n{\xf9>\x84H\xa3Sl\xac\xff\x88.\xee\x12\xef\x1e\xeb\x92\xdct\x1d\xffY\xd6\x11$*Ey\xcc\xfc\n\xef0~\xbc\xec=\x98J\x85@\xc2c^b\xe0"\x88Ac\x1ct$\xa2\xd7\x97\xffP\x19\xe4\x96ys\x96\xd2 b\x8aR{\xadG\xbf\xc1\xde\x9b\xc7\xb2c8\xb6\xedI\x90C\xac\x17\xd0\x9b\xfaR\x1a\x1aT\xf1\xd3[\x04h\xc1\x16\xbe\xad\xa3\xc0\x7fM8\xec\xf7\x87?Y\x86I&\x18\x19c%\xb65\r\xf1\x98\xed\xad\xa3\xc2\x7fG(\xd6\x9a\xc8\xa8\t\xf4\xcd\xe4\x92\xab\xb6\x87Q\t\x95\xe8\xbb2\xbd\x8e\x0c:|\x8d\x86\x90\x12\x87!S\xff\xddyX]K\xd0\xcb\x0c\xc4\xfc.\x93\xde\xce\x91\xd0\xfb\x9d\xcc\x15_\xb4^\xc4u\x194\x03<\xdb|\x8a\x12\xf2#s\x99\x84\xc2\xf7\x88\xd6\x89.\x9a\x98\xf7Z\xfc$\xe28t\xa7q \xa8\xdbh\x07\x1f\xdfD\x03\\\x19\x8d\xa0/\xe5\xdf\xcf\xfa\x18\xf03\x86\x1c\xe7-v\x0f\x95z\x15b\xe2+\x08\xe7\x92\x00\x18Jb\x8f\x0b$\x1fnx\x84\x7f\x00x\xba\xa3h"\xc5\xbd>\xfd@D\xea\xe2\x8bPzd\xf2\xec\x15\x98\x84\xf2\x07\xcd\xcc\x13^\x17t\xbd\x8e\xba\x1d\x95\xcb\x15\xb7\xddC\x92Q\xaaF\xfd\xe3\xb9\xe3t\xb9b\x89\xa1\xcew\xa5h\x9c\t8\xb3R<s\x92e$\x93\xe3\xeb\xdc[\x91%\xc1PBy\xecb|\xf7\xc1O\xd6 \xee\xb1\x95\x1d\x00\x1ba\x85\xd0\xd9\x8a\xa9\xcd\xae\x94\xd3\xf7\x0e\x86\xe42\x8e\xae\x05eJ:\x8b\xdb\xc3f1n\xd6\xd4EQY\x94\x86\x05\x12\xcf\xc9\x9eY\xb7\r\x897\n\xd7\xa3*\xe4~W\x08\xa7\xb3H-\x1f\\1a.\xe8\xa3\xce;M\xc3\x81_\x9e\xcc\xdf\xe6\xd1\x93`L\xd9q\x1cPF\x930\xe2it\x88I\x13|,\xc0\xf9?\x06b=\x04\xab\xd1\x1f\xa9LH(~v\x11s\xe2|5.\x08|qz\xd3\xf3cA\xa2\xf7\xb10\xaa\xf5\x05\xda\x93i\x85\xa0*/\xb5m\xd5\x889 \x01\xbe\x04\x1a\xc6<\xd7a\x0e\x9f\xa9\x8ba\xd0Jg\xb2\xed\rc\xa0\x807.\x08\x811\x14\x19\xf41I\xfe\xb7!\x11\xfb\xb1\xa8\xb8B\x11@y\xb0A\x03\x84V\xe2\r\x15\x147"\xa9\xc92\xc2\xf8\xdaZ\xdb\xd40\xe4\xe1#6K\x94*%\xd2g\x7f\xa2\xab?\xc1\x98\xf5\xd1\xaf\xcc\xfag\xbd\x9b\x80)\xc4r\xe0\x14\x99\xf4\xf6\xb2\xc9\x97mv0N\xe2\x82v\xffz\x12\xadw\xc3\xbf\x8aD\xa4\x92\xc9\xf7\xa6\xd7"\xd0\x13\x95wRW\xaa8\x1dn\xca\x8e\x05Z\x0f\xe8\xda\x9d\t\x05\x03\x91\xdd\x80|\x84\xe0\nLMUEJszUE\xfa\x10hj\x8a;x&\x98H\xea:\xe3\x97\x98\xf7\'\x146\xe3\x00\xfbYNO\x0c\x9d\xfb\xee\x1c!\x10\xca.\x9b\x0be|]:_\xda\xc91\xb2"\x87b\x15\x7f\xdc\xb2\xdc\xe2J@\x0e\xd1J\x83\xba\x96\xe5m\x7f\x82LA\xcb\xa0\xee>O,S\xa2V8\xed\x7fu\xd0X\xb6P\x8b@\x10\x01J\xf9j\xd4\xc3d\x8bo\xd5\xe0o\x02@\x8d\xa3@\x98\xa8a;\xdfV,r\xf1>\x9a\x1cW\x94\xa5\xb5a~\xde\x13\xe85u*\xcd\xeb\xbd7D\xb6\x82\xf5&\xcaR\xef\xe6(\xfca\xf58\xa7\x8e!\xfb\x0c`\xab\xc0\xa2\x84\xd0Z\xb4\r\n\x1d\xfdt/Np\xcd{%\x0c\x00\xac\x8d3\xf0\x83xM\xb2\x0e\x81O\xb06%\xc7#\x01\x8c\xd6g\x10\x19g\xed\xe8\xff;\x9a>Y\x88\xbf\x19x>u\xcf\x01\x08\xe6w\xe4Q\xa4\xd4\xca\xcb\xeas-\xc2`ZJv\xf9\x1fF\xda=z\xa8\x0f\x10\xf6\xf0?<\xd6\xf5%)\r\xf5{\xf0oq\xcb\xcd\x89 \x0e\xc7\xc0_\x86\xf8\x9b\xe8\xc6*GB\xdc\x9b\x03\xe4\xa2\xcf\xf6\x01\xaed**\x16\x86K\x8b\x81\x83\x031\x91P9L\x11\xa7\xf2\xdcq4\xbf\xd2\xe1_\xbc\xc9\xda\x82C`\xc3\xc4\x7f\x1a2\x05\x8fn\xce\xc6\x06\xcd\xfc1\xe48\xfdm*\xd1u\xe7\xbb\xde\xf7\'\xe8\xc1\x9a&\xedW\x8f\n\xcb\x99\xef\x0f\xc1\xc7>ERd\xef8m\xdeU\xf7A\xe5\xa8\xa73\xd8\xa7\xe4\x80\xd5\x15\r\x14C2\x02\x17\x90\xfel\xc5\tK\x1f\x0f\xde7\tO\x91\xcd\xaf\x08\xb8b\x15A1\x99\xcdx\xf7\xf3\xd1\xb7\xdd\x0f\xff\xf2\xe3 u\xae!\x91rna\xb8\x01\xfa\x1a\x05\x83\xc2\xde!>\xa13\x02\xe1\xd7\x9cc\x89\xc8v\x8fY\x14\xbf\r\xcfOM\xd3\xbf\x10\x95\xf6F6\x9d\xf8w\xf5C\x04j5\xc4\xdeXwp\xac_\xdd\xa7\xc4\xfb\xe3\x0f\xa2\xee^\x960\x95D\xbb\xc5\xf6\xbe\x98z\xa9\xfa\x17s\x19Z\xde\xd4\xa8\x84+\x88\xc7\x91\xc5\x0b\xfaj\\\x85k\xc3\xc4N\x0bj\xd62\r\x92\xb2\xd2\x0f\xca\x11u\xeau\xc1-+\x0f\xab\xd9\x94H\x13}\x0f\xdc\xd9\x88{!)\xb5/\xa6(4.\xf0\xca\x04:p\xed&c\x8e?\x8b\xd1 \xe8q\xf6G\xde\xc9h\xb2 \xbd<\x01n\x8d\xea-j\xa0\x0e\xb4\x04;\xe2\xea\x00\x16\xa6\x1f\\\x84\xd0\xd3\x13\x17j^\xd1\xbb`\x9eaC\xde\xca`\xe2\x1a@r\x02E"\xe8 \x85\xc3z}9\xaf\xd6\x1b>\xa7n\x06\xa7\xb2\x92\xae)\xeb\\\x0f%g\x86c\x08\xcb\xda\xd3\xbf\xba\xb0z;q\x16\xa6:\xad.\xd7\x0c\x0f\x06\xa3\x08h\xaa\xec(\xea\xf9$@jc\xf9\x83\xe9\xac\x92\xc0I\xba:\x06!D\xf1\xa5i\xc59d\xeeR\xd6\xb6\xeb\xe1\xb5\x97\x9dS\xfa)\x14\x1a\\;\x97\xf0d\xc9C\x825\xee\xe9\xc3\x9ePkN\x0c%\xd1\xfb\xa1(\x14\x8d\xf7\x86g6\x9b)\x9a!\xe5\x03vz\xdeI\x1bZ\xb7\xaed\xb1\xd1\x91\xe6D\xabV\x83\x92M\x12\xde\x0e,\xbf\xf4\xa2\xaf\x0e]\xb9\xaf\xf3\xe6[q\x15\xed`6:b\xc6%S\xf8\x94\xc6[i\xf5V/\xcd\xf8\xde\xed?\t\xd6s\x04p\x8d\x03(7\xfb\x85(\xc1*\xab\n1\x8dCk\x08\xec \x9dB@\x85\xc2\xaaf\xacW\x92Fhk\x1c7\xb7\xe2V\x7f\x93\'\xeb\x15&}\xf6\x021:\x19*p5*\xe7Y:-\xbc\x85\xbf\xd2\xa1\xb7{\x9b\xf1a\xa6\xaa\xaa)\xd2\x1d\xd6\x12\xb0\x84\xfeTB\nvU\xc9X\xbf\xfaj\xb9\x1f\x97\x98\xcb8\x92\xe4\t\xddC\xca\xdc\xf6e/\x1e\xcc|\xaa\xcd\x04\xa2\x9f\x14\x1dO\xee\x13-$\x19a\x03\xb9\xf6=\xa4\x8c\x80\xc5\xc5Q^\xa3O)E\xac\xe3\x06t\x0c\x88\xbbQA\x0f\x97*\xae\xd9\x8a\xfe\xaa][RF\x1f&L9&?\t\xe8\xac%x\x82.;\xd7\xf9m\x1b\\s\xfb*\x15\x0bY\x97\x19!\x1e\xc9\x9d\xad\xa7xJT\xb9\x8bg\x95\x8d<}\x15q\xa4\x82X\xa4feX\xaa\x7f\x99d\xf1S\x95\xec\x0ez\x05\x9d\xfb\x05U\x81\xe0\xd0$\xcb\xc3\xaf~\xe5\xab[R\x12M\xefz\x9f\xd8\r$\x99tj\xe7k\x0fta\x0f\xb2\xc9\xf8e\xc0\xa63\x99e\x8d%\xaf\x04x/\x8e$\xca\x17\xbc\xc2\xae\xe8\x9e\xde\xc5;\xe8\x1a)\xef\xd9\xf3S\xa1\xb4\x107\x95\xa8\xad\x8e\x10\xc3\x81\x04\x18/\xb0L\xd1\x80S\x1e\xa2at\xdf.?K\xcf\x1a\xf7pe\x11lk?k\xa4\x89\xb81-2_0\x8e\xf9\xb4Y|m\x8c\xf3<\xa2\x0f\xef-[\xbf\xf9\xb2\x9d`\x92\x1a\x11\xf2\x94\xe8J\xc8\xf1\xab6_.\xf6W\xc4\xfe\x0f\x80As*e=\xa7nz\xb8\xcc\x80C^&\xc6\xeb\x92\x1b\x8e\xdc\x01.\x13\xac\xf1\xb5\x90\x9ef\xc5\xd2q\xa6\xb0\x08t\xff>_"!c\xc9\xe0\x96\x9c\xe4=4Y\xa9(A\xd7\xf7\xd2\xf03\x8c\xf5 \xff\x88\xdd\xd1\xb0d\xc3o\x08\x90f0\xdc\xe4;\xb2\xd4\x82m\x15\xb0\x86\x80\x93\x93\xffz\xc3\xfdd\xadb"\x0f+\xe7\x8cmd\xbf\xcd\x96\x13\t\x91\x1fg\xb3\x0b \xbf\xb07\xf8\x16\xe8\x9e\t.D\xb9yt\xcb.\xe0U\xf4\x8c\x0el}z\xa9\xae6\x8a\x9e\xd5\x87\xa8\xbb\x86\xaa \x93\x0c\x93+_\xc9\xa1\x16\x17\x92\xee\xb0\x19\xb8\xd6o\xb7\xe1\x99\xc0}\xb6}\xb0\x0c(\x05\x7f\xec\xf0{k\xfd\x95\xd4OK\x0et\x9c\xbf\xe3~\x95\xe4|?/q\xc6\x9d\x00\x14\xc2/4\xc8\xec\xe0f\x13p\xb8US\xea\xdeE\x8fU\x07s\xae\xc0\x8c\xf1\xe0T!\x06\x13Y\xcc\xd9k\x9e\xa5\xa1c\xc40\xb4\x07\xd6/\xc9\x89U\x03\xbb\xe1\xf6\xd6k\x82a\x9b2\xeb\x84\xd8\xa7\xe6I\xd7\xbf\x0c\x97\xcbQ\x1d\xe3\x1a\xad\x85s\xa4\x90y\xcd_Vq\xa29\xad\x90+J#\x1f\xf9)\x00\xd6\xa5*\x9c\x07\x19\xa8\xb7\x0c\xf1}\xca\xa4\xc3\xac}G9\xee\x95\xaa\xda\x85\x03\xb6\x8a\r3\xb5\x85\x8c\x92\x8f\x9c\x14\x85\xe1\xdb\xf6<P\xbf\xa4\x08}\xc3\x0b\xa7\xfbds\xf2\xe6\x82\xbdOW\x98\xc9\x98\xeb\xbe\xc9\x05SyA\x1c\xb7\xd45\x16\xe8ca )\xe6\x9c\xe9.\x14\xaf\x8fw\x99\xf3\x1d\x87\xaa\x02HQ\xd2\x81m#\tXW7kf\xab\x17/\xac4\xab\xdd\xe1\xec\x15\x19\xbf\x8e\xb9l\xf8"}>\xf1\xa0\xd9\x9e\xef\xc4\xeeIt[E\x9e\xf4\xd9\xcf\x86\x03\x97)\x93Zq\xe5\x1f\x19JB2j^Ni\xaf[\x82\xb0M\xc9\x84G\x9b\xb0\xc6\x0b\x10\xcd\xca\x90&\xcei/\xdf\x80\xef\x11\xddw\xa7\xf9vi>\xad\x90\xf8\xb3\xebK\xe6\xfb\xd1\xb0/qF\xf0{Nu\x9a\x95\xdbj\x84\x87\x91\x11\xc9=B+J\xf9\x95\x1c6\xe2\xc6o\x8e\x95\xc4\x92\xae\xe0z\xa5\xaeP@\x83J\x97[\xda\x88\xad\x07\xb61\x83y\xc8\xf3g\x95\xd6c0\xb5\xad\x03\xc1\x0bv\x12\x12\xfe+Y:\xb3\x80AJ\xac\xd8\xda\x13r\xd4\xe6\x84\xcd\x84\x90\x18\xda\xf8\x9b\xe8\xf0\xd4OR\xdd\xebJ\xb3\xe17y<\xf3\xc2;\xb8\x901\xder\x8f\xaflB\xb8\xcf@L}\x88,0\x83\xd9\x9d\xc6\xfb\xba\xc7\xf23Y\x85\x06\xaf\xa5RX\x9a\x13OU\xd9U\x034\x98\x06}\xe9\x1f\x01C\xa4\x02\x15.\x1c+f)g\x0eA(\xb7\xc1\xca4\x12ek\xc7|\xb3,\xdf\x04Y\xc2\xf5\x84T\x136\x9e\x93R\x8c\xa0\xcb\x99"\xd8\xe2\x9bE\xff\xa9L\xaf\xba\xa7\xfd\xbdo\xf3X\xee[#\x9b\xb3\x9e\xe5\xbd\xa9\x1e\'\x92\x94r\x93\xb9\xfe\xfa\xb0Q\x8ed\xcbA\xd9n\x9b_m&\xbc\xeb<\xa5[^-C\x12\xea\x8f\xc1\x87\xc7\xee\xeb\xacJ\xae\x9b\xc8n\x8d\xcbB\xe2b\xbf>\x8fA\xe9(\xe8P\x91\\\x0e!t\xdb\xe6V%\xe1&$\x9b\x873\x8cg\x8f\xc9\xf3\rU\x06\xc6y\x7f\xd6\xf6>\x82/\xe7\x9c\x8c2\xcd\x07}\xc2NtT\xaf\xb6\x98\xc8\xd2\xad1ei\r\xa1d\xeb\xc4o9\x11\x90\x81\\e.\xc8\n\xd4\xac\xc9\x869N\xd8\xd4<\xa5\xbb\xbb\x005U<fN\x0eiXt\x9e\xed\x90-\x12cI\x9d\xff\x06\xce\x19\xa3\xc4\xd2j\x91\x9bQ\xf4u\xc5Sl1C&\xe47\x1cLFePo\t\x15S\xa3\x92S\xb3[\x8f86\xac\x9c\xeb\xf7\xfc>R\x99\xa9\x08\xf6\xc1!fZ\xef5\x15\xc8(fZ\xe4\xdb\xba\xa8\x85\xbd\x14\x0e\x8ad\x8a\xe1\x82\xf93\xcc\xd8BwH\x85\x82\xc7\xc8\xef&}\xdd2kG\xbd!"p?\xa1R\xf4\x1dfo,\xddSa\xee\xa2\x08\xce\xa2\xfeS\x7fp\x0b\xa5h\x04\x0e\xd75\xe0\xe5(\xc9\xcc]\xf0\xe2j\xe6w_n\xb0\x1d\xeb\xe7:\xeb\xf4\x067\x05\xb9u\xff\xd9\x7f\x9b\x10\xbc\x11\xee\xfc&\xff\xac\x8f)\x04\xfe\x0c.\xc6\xde\xa3\x86I\xfeG\xce_\xa7}\xaf\xf8\xeeP /%\xcb=\x8bA\x96\xf6\x1e\xe0\xc1~\xeac0k\xaf\xf0\x99\xb8n\xf1\xbf\xc6w\xb1\x8fwmi\x0cN\xedi\xf23Q\xceKo\xd3\xb0n\xccB\x1b\xc9\xe5.\xc7&\xc7\xa3\xc9\x84\xea\xe4L\xd9\xc4;\xa3\x0f\xa7~g\x1a\xcf\xe6z\xaa\x1d\x14!p\xf6a\xab\xdaVb\xf9\xe2\xfd\xe6`\'Q\xd3\xf2\xcf6\xd2\x18P%c\xb8A{\x8a\x1c\x8dZ\x8b\x00\x8e.\xf3&\x1d\xde`v\xae\x8faO\xad\xf6\xeb\xd0z7w\x1eZF\xcf\xf7F\x05l\x191\x1a\x9cb>+\x13I\xbaK\x99\x0ei*\x7f\xc0\x87>\xfe\x983\xe5\x07L@\xba\xd2\\g\xc6\xb6\xe0\xde\x8c\xbbx\xd2I\x18\xac\x83\x97\xc5\xcf\x0c\xc2\xc5\x89o%\xcb\xc4(\xd9\x9a\x12\xbd\x0bw\xf5\xf0&l\x8d\x01\xbf\xda\xcf>"\xf8\x05\xef\x84\xc2\xe6\xaa\xca\xd6\x90\xb6\xe5\xabd^\x81\x01\xc2\x87 \x9a\x94M\xffp\xf3\xd2\x1f\xa8\x01\t\xa9`\xff\xa8]\xda\xee\x02= <\x9bJ\x1d|\x91\xc3V\xc0{\xf9\xab?@<\xfb\x06\x06\x12=3\xdb\xb1\x9c\x99\xe3\xf3\xaec\xcb{V)\x07\'S_\xac\x10i\nMv\xa9\xa5\xd0\x80Q\xee\xe1\xff\xe3$5\xf7{\x1f1"\x11\x95DE}"\x91\xaa\x13\xa6\xe5\x15\xae\xfd\x90\xb4\xfb\x12\xb8\xe9|\x9d\x94\xcf\x04\x9d\x8c\xb1\xec\xc0\x94\x06v\xce\x1bS\xa4\xc1\x87\x030\xb1\xaf\x1cb!.\x86\xef\x07\x14E_\xbb\xa6\xa7C~GL\x97{\x04A\xe8\x99\x8e\xbd>0&\xdaGD\xe0S\x07r\x8e)\x96\xcd\x18 \xf3P\x83\x7f\xe6\x17\x9f\x1a7\xc6\xc6\xb3\x1a\xcce_\x82`.\xe1\x10\x9alq\x1fR\t\xa0\xb6f\xa4",\x81PA\x88\xba\xb91:\xff4~Z\x8a\x18')
|
4
|
-
|
1
|
+
from hiddifypanel.models import *
|
2
|
+
import flask_babel,flask_babelex
|
3
|
+
|
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
|
8
|
+
from flask_bootstrap import SwitchField
|
9
|
+
from hiddifypanel.panel import hiddify
|
10
|
+
from flask_admin.base import expose
|
11
|
+
# from gettext import gettext as _
|
12
|
+
from wtforms.validators import Regexp,ValidationError
|
13
|
+
|
14
|
+
import re
|
15
|
+
from flask import render_template,current_app, Markup,redirect,url_for
|
16
|
+
from hiddifypanel.models import User,Domain,DomainType,StrConfig,ConfigEnum,get_hconfigs
|
17
|
+
from hiddifypanel.panel.database import db
|
18
|
+
from wtforms.fields import *
|
19
|
+
|
20
|
+
from hiddifypanel.panel.hiddify import flash
|
21
|
+
from flask_classful import FlaskView
|
22
|
+
|
23
|
+
class QuickSetup(FlaskView):
|
24
|
+
|
25
|
+
def index(self):
|
26
|
+
return render_template('quick_setup.html', lang_form=get_lang_form(), form=get_quick_setup_form(),ipv4=hiddify.get_ip(4),ipv6=hiddify.get_ip(6),admin_link=admin_link(),show_domain_info=True)
|
27
|
+
|
28
|
+
def post(self):
|
29
|
+
quick_form=get_quick_setup_form()
|
30
|
+
lang_form=get_lang_form()
|
31
|
+
if lang_form.lang_submit.data:
|
32
|
+
if lang_form.validate_on_submit():
|
33
|
+
StrConfig.query.filter(StrConfig.key==ConfigEnum.lang,StrConfig.child_id==0).first().value=lang_form.admin_lang.data
|
34
|
+
StrConfig.query.filter(StrConfig.key==ConfigEnum.admin_lang,StrConfig.child_id==0).first().value=lang_form.admin_lang.data
|
35
|
+
StrConfig.query.filter(StrConfig.key==ConfigEnum.country,StrConfig.child_id==0).first().value=lang_form.country.data
|
36
|
+
db.session.commit()
|
37
|
+
|
38
|
+
flask_babel.refresh()
|
39
|
+
flask_babelex.refresh()
|
40
|
+
# with flask_babel.force_locale(lang_form.admin_lang.data):
|
41
|
+
# flask_babel.refresh()
|
42
|
+
# flask_babelex.refresh()
|
43
|
+
flash((_('quicksetup.setlang.success')), 'success')
|
44
|
+
else:
|
45
|
+
flash((_('quicksetup.setlang.error')), 'danger')
|
46
|
+
|
47
|
+
return render_template('quick_setup.html', form=get_quick_setup_form(True),lang_form=get_lang_form(),admin_link=admin_link(),ipv4=hiddify.get_ip(4),ipv6=hiddify.get_ip(6),show_domain_info=False)
|
48
|
+
|
49
|
+
if quick_form.validate_on_submit():
|
50
|
+
sslip_dm=Domain.query.filter(Domain.domain==f'{hiddify.get_ip(4)}.sslip.io').delete()
|
51
|
+
db.session.add(Domain(domain=quick_form.domain.data.lower(),mode=DomainType.direct))
|
52
|
+
hiddify.bulk_register_configs([
|
53
|
+
{"key":ConfigEnum.telegram_enable,"value":quick_form.enable_telegram.data},
|
54
|
+
{"key":ConfigEnum.vmess_enable,"value":quick_form.enable_vmess.data},
|
55
|
+
{"key":ConfigEnum.firewall,"value":quick_form.enable_firewall.data},
|
56
|
+
{"key":ConfigEnum.block_iran_sites,"value":quick_form.block_iran_sites.data},
|
57
|
+
{"key":ConfigEnum.decoy_domain,"value":quick_form.decoy_domain.data}
|
58
|
+
])
|
59
|
+
|
60
|
+
|
61
|
+
db.session.commit()
|
62
|
+
# hiddify.flash_config_success()
|
63
|
+
proxy_path=hconfig(ConfigEnum.proxy_path)
|
64
|
+
# uuid=User.query.first().uuid
|
65
|
+
# userlink=f"<a class='btn btn-secondary share-link' target='_blank' href='https://{quick_form.domain.data}/{proxy_path}/{uuid}/'>{_('default user link')}</a>"
|
66
|
+
# flash((_('The default user link is %(link)s. To add or edit more users, please visit users from menu.',link=userlink)),'info')
|
67
|
+
|
68
|
+
from . import Actions
|
69
|
+
action=Actions()
|
70
|
+
return action.reinstall(domain_changed=True)
|
71
|
+
else:
|
72
|
+
flash(_('config.validation-error'), 'danger')
|
73
|
+
return render_template('quick_setup.html', form=quick_form,lang_form=get_lang_form(True),ipv4=hiddify.get_ip(4),ipv6=hiddify.get_ip(6),admin_link=admin_link() ,show_domain_info=False)
|
74
|
+
|
75
|
+
def get_lang_form(empty=False):
|
76
|
+
class LangForm(FlaskForm):
|
77
|
+
admin_lang=wtf.fields.SelectField(_("config.admin_lang.label"),choices=[("en",_("lang.en")),("fa",_("lang.fa"))],description=_("config.admin_lang.description"),default=hconfig(ConfigEnum.admin_lang))
|
78
|
+
# lang=wtf.fields.SelectField(_("config.lang.label"),choices=[("en",_("lang.en")),("fa",_("lang.fa"))],description=_("config.lang.description"),default=hconfig(ConfigEnum.lang))
|
79
|
+
country=wtf.fields.SelectField(_("config.country.label"),choices=[("ir",_("Iran")),("zh",_("China")),("other","Others")],description=_("config.country.description"),default=hconfig(ConfigEnum.country))
|
80
|
+
lang_submit=wtf.fields.SubmitField(_('Submit'))
|
81
|
+
|
82
|
+
return LangForm(None)if empty else LangForm()
|
83
|
+
def get_quick_setup_form(empty=False):
|
84
|
+
def get_used_domains():
|
85
|
+
configs=get_hconfigs()
|
86
|
+
domains=[]
|
87
|
+
for c in configs:
|
88
|
+
if "domain" in c:
|
89
|
+
domains.append(configs[c])
|
90
|
+
for d in Domain.query.all():
|
91
|
+
domains.append(d.domain)
|
92
|
+
return domains
|
93
|
+
class QuickSetupForm(FlaskForm):
|
94
|
+
domain_regex="^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$"
|
95
|
+
|
96
|
+
domain_validators=[wtf.validators.Regexp(domain_regex,re.IGNORECASE,_("config.Invalid domain")),
|
97
|
+
validate_domain,
|
98
|
+
wtf.validators.NoneOf([d.domain.lower() for d in Domain.query.all()],_("config.Domain already used")),
|
99
|
+
wtf.validators.NoneOf([c.value.lower() for c in StrConfig.query.all() if "fakedomain" in c.key and c.key!=ConfigEnum.decoy_domain],_("config.Domain already used"))
|
100
|
+
]
|
101
|
+
domain=wtf.fields.StringField(_("domain.domain"),domain_validators,description=_("domain.description"),render_kw={"class":"ltr", "pattern":domain_validators[0].regex.pattern,"title":domain_validators[0].message,"required":"","placeholder":"sub.domain.com"})
|
102
|
+
enable_telegram=SwitchField(_("config.telegram_enable.label"),description=_("config.telegram_enable.description"),default=hconfig(ConfigEnum.telegram_enable))
|
103
|
+
enable_firewall=SwitchField(_("config.firewall.label"),description=_("config.firewall.description"),default=hconfig(ConfigEnum.firewall))
|
104
|
+
block_iran_sites=SwitchField(_("config.block_iran_sites.label"),description=_("config.block_iran_sites.description"),default=hconfig(ConfigEnum.block_iran_sites))
|
105
|
+
enable_vmess=SwitchField(_("config.vmess_enable.label"),description=_("config.vmess_enable.description"),default=hconfig(ConfigEnum.vmess_enable))
|
106
|
+
decoy_domain=wtf.fields.StringField(_("config.decoy_domain.label"),description=_("config.decoy_domain.description"),default=hconfig(ConfigEnum.decoy_domain),validators=[wtf.validators.Regexp(domain_regex,re.IGNORECASE,_("config.Invalid domain")),hiddify.validate_domain_exist])
|
107
|
+
submit=wtf.fields.SubmitField(_('Submit'))
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
return QuickSetupForm(None) if empty else QuickSetupForm()
|
112
|
+
|
113
|
+
def validate_domain(form,field):
|
114
|
+
domain=field.data
|
115
|
+
dip=hiddify.get_domain_ip(domain)
|
116
|
+
if dip==None:
|
117
|
+
raise ValidationError(_("Domain can not be resolved! there is a problem in your domain"))
|
118
|
+
|
119
|
+
myip=hiddify.get_ip(4)
|
120
|
+
if dip and myip!=dip:
|
121
|
+
raise ValidationError(_("Domain (%(domain)s)-> IP=%(domain_ip)s is not matched with your ip=%(server_ip)s which is required in direct mode",server_ip=myip,domain_ip=dip,domain=domain))
|
122
|
+
def admin_link():
|
123
|
+
domains=get_panel_domains()
|
124
|
+
if len(domains):
|
125
|
+
return "https://"+domains[0].domain+hiddify.get_admin_path()
|
126
|
+
else:
|
127
|
+
return "https://"+hiddify.get_ip(4)+hiddify.get_admin_path()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
128
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|