hiddifypanel 3.0.0.dev64__cp38-cp38-manylinux2014_x86_64.whl → 3.0.0.dev66__cp38-cp38-manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hiddifypanel/Events.py +27 -4
- hiddifypanel/VERSION +1 -1
- hiddifypanel/VERSION.py +1 -3
- hiddifypanel/__init__.py +7 -3
- hiddifypanel/__main__.py +13 -3
- hiddifypanel/base.py +88 -3
- hiddifypanel/base2.py +40 -3
- hiddifypanel/models/__init__.py +10 -3
- hiddifypanel/models/child.py +26 -4
- hiddifypanel/models/config.py +105 -4
- hiddifypanel/models/config_enum.py +207 -4
- hiddifypanel/models/domain.py +106 -4
- hiddifypanel/models/proxy.py +55 -3
- hiddifypanel/models/usage.py +58 -3
- hiddifypanel/models/user.py +171 -3
- hiddifypanel/panel/__init__.py +7 -4
- hiddifypanel/panel/admin/Actions.py +170 -3
- hiddifypanel/panel/admin/Backup.py +80 -4
- hiddifypanel/panel/admin/ChildAdmin.py +122 -3
- hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
- hiddifypanel/panel/admin/Dashboard.py +70 -4
- hiddifypanel/panel/admin/DomainAdmin.py +195 -4
- hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
- hiddifypanel/panel/admin/QuickSetup.py +127 -4
- hiddifypanel/panel/admin/SettingAdmin.py +224 -3
- hiddifypanel/panel/admin/Terminal.py +51 -4
- hiddifypanel/panel/admin/UserAdmin.py +277 -4
- hiddifypanel/panel/admin/__init__.py +82 -4
- hiddifypanel/panel/admin/adminlte.py +13 -4
- hiddifypanel/panel/admin/commercial_info.py +23 -3
- hiddifypanel/panel/admin/websocket.py +9 -3
- hiddifypanel/panel/admin_2.py +33 -3
- hiddifypanel/panel/asset.py +17 -3
- hiddifypanel/panel/cf_api.py +35 -4
- hiddifypanel/panel/clean_ip.py +125 -3
- hiddifypanel/panel/cli.py +172 -3
- hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
- hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
- hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
- hiddifypanel/panel/commercial/__init__.py +50 -4
- hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
- hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
- hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
- hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
- hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
- hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
- hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
- hiddifypanel/panel/common.py +98 -3
- hiddifypanel/panel/custom_widgets.py +71 -4
- hiddifypanel/panel/database.py +18 -3
- hiddifypanel/panel/hiddify.py +655 -4
- hiddifypanel/panel/hiddify_api.py +70 -3
- hiddifypanel/panel/init_db.py +393 -3
- hiddifypanel/panel/usage.py +85 -3
- hiddifypanel/panel/user/__init__.py +25 -4
- hiddifypanel/panel/user/link_maker.py +416 -3
- hiddifypanel/panel/user/templates/clash_config.yml +1 -0
- hiddifypanel/panel/user/templates/home/multi.html +1 -1
- hiddifypanel/panel/user/user.py +233 -3
- hiddifypanel/static/css/custom.css +6 -0
- hiddifypanel/templates/500.html +1 -1
- hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/en/LC_MESSAGES/messages.po +194 -190
- hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/fa/LC_MESSAGES/messages.po +123 -120
- hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/zh/LC_MESSAGES/messages.po +123 -121
- hiddifypanel/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/RECORD +74 -76
- hiddifypanel-3.0.0.dev66.dist-info/top_level.txt +1 -0
- hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
- pyarmor_runtime_000000/__init__.py +0 -4
- pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,130 @@
|
|
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\xf7\x1d\x00\x00\x12\t\x04\x00\x18\xbb\x10\xca!\x12?\x1c&\xbd\xdd3:\xde`\n\x00\x00\x00\x00\x00\x00\x00\x00\xd2?\xd8\xa6\x10z\x98-\x07W|k\x99U\x07d\x8f\xd8\xb2V\xa9\xfb\x8ep\xe3\n\x16\xf4<\xd9\xbd\x94\xcb\xfc\xed\x89!\xf8\xc0\x97\x00X~\xe2/9\x8dH\xe3\xa8U1\xbe\xc4$\xf3E\xbe\xf3\xfb\xfd>\x16:\x820\nU\x18#D&I\xdf\xa11p+\x01m\xf0\x16\n\x90\xe2\x89\x9fD\x8f-Ne\xc4\x9c\x81\x01\xbf\x1f\xcd&\xdd\x9f\xad\x95*\x99j\x9aB\x98\x07\xfe\x82^v\t\x89|\xe7*\xe9Z\xef\x01\xec\x1f\xd1x\x8b\x7f\xc2>\xcc\xc9\xa2\xe3\xfc%\xfcAu\xbb\xd8\xef\x8a)\x8e\x97Qa\x9b\x19;\x13m\x01W\xd5\xab\x19\xb3\x0c\xcd\x7f\x04\xac\xae\x96\x00<KI\xbe\xf0\xe0\xb7,c\x13H\xc9mG\x1e~)\xf3\xfb\xdb(2\x0e\x0f0\x10|\xfa\xe6\xd2\x0c"\r\xadi\xc8,e\x0b\xc9\xb8\x1a\xcb\xa8\xe9j\xb3\x06|\xa2\x05lFi L\xfc\xa1\x13\x06\x93\x9b\xde&\x03\xfd\x91\xa3)m6\xdb\x11}y/\x89\x1a\xa8\xfby\x98\x88\xfb\xa13\xe1%\x12r32:\x87V\x0b\x13\x90S\x98\xff\x8aa\x9d%\xac\x07v\x85%z\'>mxL\xdf\xd2)\x1eby\x19@\xba\xed4\x83\x1fL\xce\xb7c\xf0z\xb5}^\xaa(\xedq\x0c\x8d\xa8\x84\xa8\xea;_?\x1e\x9e\x10\xd2c\xefy\xfdH\xe3\x8b3\x80\xbc+R<\xf0\x88\x0f\x95B\xe1\xf7%\xa7q\x92\xd1\x88/\xd3\xb1\xe7QZ\xc5-\xa4\xf3\xaeU)\x1f\x18\xe2\x07\xd4\xd7\xc6o\xd6v\x02N\x8fg\x1c>*\xb4VF\x1eYybV\xf6Kd\xc6\xac\xc1e\xccu\xda\x8b\xba\x97QU \x1f\x04x\xca\xec\xa8\x04\xbd\x15!\x99TFqw\r\\\xe8jF\xb2\xe7\x83\x08\xae\x01c\n\x8c7\x8fu\x9f\x92\xc1\x95\xa4[R\x9bS+\xe1\x01\x93D\x94\x97\x13e[\xe7\x9c,q\xd20|Y\x1cH\xa1\xcb\x02@\xd3%\x9d?\x89\x9cG=\xbdPp\t\r\xbb6\'bb\x17\x10\xa4\xe6\x83\xe3\x9c\xd2\x01}k)\xf3\xcf\xfe\x80\xa4\xa5\xadC\xa5:\x91y\xf9R>6u\xf9\xe2\xc4\x0b\xa9qX\xfb>!\xe2\xa3\xfb\x0e\x9a\x04J\x96\xea\x9a\xb0\xfdc\xa8\xf2\xce\xd6\xe6B\xd3/\x04\n\x13`\xee\xcb\xfb\x8b\xb5\xbep\x14W4\xeb\xe0\xfe\x91\'\x88\xdb\xa6\xd2_\n\xc9CE\x1f\xa8O\x8e\x9a3P\xd0\x822^\x05\x81\x95\x96\xc3:/D \xb4\x0b%I\xdd\x9b\xb7\xa1\xde\xa5\x82g?p\xcc\x93+B\xe7\xb2\x08$\xea\xee\xe8O\x81\xf8o\x17&7\xe3\xa7%\x9bc\xd7\x8d\xa6\xdc\xa2\xcb\xe3\x16,&\x80\xe6\xf8\x88\xad\x02\xbb\x91\xe8d\xed\xc4\xfe\xc5e<Q\xc77/8\xfcK3\xb1\x08V\x1aA\x0b\x7fNF|p% \xad\xe9#\xfc\x06J\xa2\xda}v\xd5\xd8\xe7\xa1+\x19\xda\xabE\xa1\xc0N\xb1\x8df\x85\xe3TG\x8b\xb3\xaa!8\x96\xde\x00\xc6\x01\xf5\xd8\xa0\x13\x84\xaf3+\x8c\x85\xef\x85\xbe\xa9\xce\xc8\x7fR\x01}\xb6nl\t]\x8c\x19\xa8\xb0\xa1\x80\xcbu\x94hg\xd6\xa4\xe1o\xec>\xc8\xd6Ec\xe2\xbd/\xea\x08\xf5<17mo\x86=2Q\x88\x8aJ;\xf6\xd43\xa5\x8f\x87,\x0e\x94\xd6~d\xec\xf0c\xfa4\xcc\xb8\xd9\xbb\xd5\x87\x0f\ts\x87\xdde\x90\xdc\xc63\xe3\xdb\x08\xa9\xe3\xd2h\xc8\xcd\xfe\xe7\x82\xc9\xa3\x08+\xa6\xe5Ez\x101\x14Z\xe22f\x18\xacm]\xc6\xe4\xccA\xa5X\r\xac4\x81\xca:\x1b\xea# \xfd\xa2\xa1^\xcd#\xa3Y\xf3N\x8e\xd6P\xdf\xaat\x89\xf6\xebFM\xbb\xc8\xda>5\xb6\x83\xa1\xf0\x9a\xf3\x01\xd3C\xc1\xe2\x18\x05\xe3\x0e\xbd\x9fYk \xb0.\xf2\xebS\xf9M\x05\x9d\x9e\xc2.\xfd\xe9\xcd\x07CK\xb3yY\xb6\x00?\x97zt\xeaV9\xc5"TG \x18\x15\x0f\x8c\xe53\x88\x066\xcc=\xd4o0v!\x9ebz\\L\xe0\x90\x0c\xc1z\xebc\xad+\xe42\xe6\x08\x8f\xeb\x84\xc4I\x85\xa3\xbf\x02B\xf5\x16\xa8\xc9\xe2>Y\x08\xd4\xea\xe3\x07\xb3\xdc\xdc\xf2\x0e\xafKqc!\x18VN\x91\xf8\xe8\xeb\x97\x95)\xe5M\xda\xfc\xd8Ms\x8a\xf0j\xe1u\x80\x91-\xbf\xd3\xc9E\x16\xf0\r\xaa\x99\x8a\xd8\x99~\x0b_\xaf\xa9Y \xec\xd1\xbcC\xcb+\xc9BUFo\xb6\xae\x8fW\xaa\xe3l^\x8bM\xb2\xf5\x1e\x90\xc5\xd3>\x16\xea`\xc6ve0"4UT\x83\xee\xcb\xa8\xbe\xe6\xfd\xeenX\xb9\xb3-\\\xd1\xf5V\x84\x88\xc8o\x01\x13\xcf\x0b\xebV\xe3\xca\xbek\xcb\xc6k\x1b\xa3s\x80=dq\xe5*\x07\xdc\xa5E\x17\'\x97X1\xf1\xc3w\x0b\x0bx>s\'U\x0f\x84\x92~\x8d\xdds\x94\x03\xc6f\x91\x91L:\xf8\xd7\xca\x85w\xd5\x95G\xc1\xf0*\xed\x90\xde\xb9\x9eU\xa1[W\xd8\xcb\xb3\x0bW\xda\x92\xc21\xcb>\xa9\xf2\xdc\x05\xc9\xa2\x13\xe2\xf0\xechCE\xa4Tw\x15\x08`B\xdf\x96Rl:\x9e\xe3\x95<\x1e\xda\xfc\x83\xb8\xbd6#\x16$\xe9\xfd\xf3J\'\x96C\xf4\x12?\xf9\xb0Q\xee\xa5\xb9\xb9\x8a\xe4?C\xde\x02\xfeJ\xb9\x19\x00S\x0fE\x8aQ\x0b<\xde\x87*_\r\x1d\x1e\xadJW~\xc2\xad+-\x92\xa6\xd7\x9br\x7f\xc6\xef\xbeX\x9c/\xc6e\xderd\x83\x023\x08\xf3\x88\x817A$ \xc5VdZ\xcc\x94H^2}I\xaeNP\xd9M5m\xab\x00\xac\\j\xe10\xcc\xde\x8c\xd5>\xad\xf0Q\x18\x1d\xe6\xaad,B\x9c\xe7Y\xe3\xb73\xd3k\x96\xa4\xd4\'hNl\x99\x04#d\xe9\x11:D\x16\xdb\xf7\xcbw<2\xc8\x1c\x8e\x06\x12\xc7Xx\xd2]\x92\xf7rDb\'\xea\xc7\xd8Kkv[W\x07\xb3\x88\xea\xfc\x17t\xe1\x924\xe0b-\xfbMy\\\xdft\x05\\NN\xaf\x155\x86\xbfO\x8a\xb3\xd1\x84\xaa\x14\x96\x84\xa5\xb3IJ\xd5\xc9\xe7\xb9\r\xe2b\xcf\xe5E(19\xb2\x07"\xf3\xff\xce\xa3\t\x93\xbe\x0b3\x95\x9b\xe3\xdeG\x87\xfc\x06\x17i\x8cI\x16\x84\xfe\xd6\xb9l\xb5\x8f\xfd\xf5\xb8hE\xe7\x99\xed94\xb6uH\x1eZ2\x86\x83c# +X\x96\x07T\x9fs\xf2\xa3\x1d\x04\xd7\xbbv.\x9f\xa8\x99s\x89\x88n\xf9`\xdc\r\xad\x07\xed\x03\xee\xc1\xbe\xf5\x12S\xb8\x9e\xd3XX~.\x92\xd7\x19\t\xaeg\xb1Y\x9c3\xaa\xf8\xe2\xa9\xbe\xdd\xf9\x03\xc2ik~\xd1c\x17\x11\x85\xc4P\xae\xfc(\x13\xca\xb7O@\x0c\xf4\xde\xbd\xac?:\xe0\x89f\xa5\xe6\x96\x9dl\xdd]\xf9\x08L\xa6\xef\x0c\x90\xbe\xd3\x1f\x87\xb0/\xaf>\\\xba\x15\x93\xaa\xe7&=\x1f\x9a00\x9a\x9c\x9c\xfe\x01e|\x14\xf1\x80\xf8\x7f\xcc\x0b\x13s_\xc5\xae\x03l\x93j\x02m\x85\x16\xe1\x0e\xe3\x7f\xbd)\xbd\xf45U6\x9d\x993\xfc\xc0\\MP\xbe\xd8M\xffp\x92\x88{R\x17\xe3:\xb5\xc4\xba1\xd7\xd0p\xba+\xbdIR\xd80X\xb3^|b\xfa\xcb\xe5\xabu\xe6\x1cG\x9a\xae\xd0\xa7_\x19)\x11\xbf2\xc8\x99\xebds\x02f\xefAx6Z()qd\x04\xc7L\xf7\x95\xc9My\x9e\x92\xf4\xd0n\x98\xf1\x0c_V\xd9[\x96d\xf9\'ZS\x03\x7f\x0f\xbb\xa7\xe4Y\xa3\x941\xe6\x97\xd6\x89"\x12}\x03\xbc\x11\x91I\x8b\xc4;\xa7\xee\x16&\xd06\xba\xbc"\x8c\x13\xf8V\x1f=\x16\xbb\xeb\xc1\x8e\x86\x11\x992\xaas\x86V\xb4\xde\xd2\x7f\x9a\x1c\x80Z\x9d\xbc\xadQ\xc4\xa5\x1b&\xe3b\xe5\xd0\xfc;x\xb1]^v\x14R\x07V~\x83>\x14m\nY3\x1fjV\x9cX\x142\x00\xb4\x8aK\xa9\x95\xa3\x8b\x05\xda\xeb\xe7\xae\x0bG\xf4zT\xf2\xdd+HN\xc0/\xd85\xd2k\x85\x82\x01\x03,D\x15g\xe7\x14\x0e\xd5\xbd1\xa5\x95+]g\x9c\x03\xc2+\xe1\xf7\x1bm\xb7I\x05\x18\xd9\xcf/\xa9\x9c\x88\x9d\xc7@\x16\x80:\xec\xc6\xa0\xd7U{\xd8\x9a\xc1v)Z\xd5\x10C\xe5\xe4S\x13Y\xd9\xdb\x9cc\xe5\xf0\xa24\x9be><1\xf4G\xf7;\xc7`\xfe5\xe6\xf3\x9c\xb7\xce\xc4K&x\xd2\x1c\xf2A:\x9c\xb3=jm\x901\xde\xfc/#\xce>\xd0;\xfb\xd6\x14u\x9e\xbdld\xe1\xb0\xf1\xf2\x00\n\x83\xcf\xd1\x02\xb7%j\x9e\xfa\x14\x00\x9b\xf1H\xe3\xb5\xc8Ex\x1eN\xba\xf8\x94\xd4,\xf2v\xdf\x88\x19e.\x9fS`\x0e\x0e\xbb\xcf\xd5\x8ex\x1a\x81\xd8\xea\xba\xac\xb046\xb8\x86\xc1\x18\xb0\xc6\xc0T\xe4;\xe6\xd85\xe7\xf6?\t\'\x93ef\x04p\x0c0U]\x0f\x08m0u_zP\t\xa61\xacF\xa1\xa4X\x06f.\xf3\xd1\xa9\x1e\x98\x9e\x1a\xf1\x95\xd91/\xc4\x81\xeeK\xde\xd9\x8f\xe5\xef\\j\xf8\x93\xe3\xca2\xeb&\xda\xfa\x15\x04\x9b\xeb\xab\x7f\xee\xf6g\xcd\x01\xa1\xbd-\xd4.\x05\xd2q\xa9\x05\xfd\xa2\xb3\x8c\x10\xc2\xfa\xe9\n\xd3>\x0e5\x7f\xee\xfd\xc0h\x93-;\x85\xe4Q\xd5\xa6\xebR\xa4\x1fA\xd9\xe0lS\x15O7\xec\xe6+\xa3\xf4\xed\xa8_\xbc\x89\x1c\x80\xa0\x0b\x93\xef\x8a\xacj\xc6h\xb8#\x17\x17\x89\x8a\xa1\xfcz\xb9g\xcb\xb6\xd0\xecf\x95\xa5\xea\xed\x15\xb9H6\xfc\x10|\xd3\xa0D.\xebJ\xf1\'v\xbc\xe2\xa5\x1e\xe4\xb2\xfd\x0f\xcb\xca\x0eU\x03\xe9\xbf\x15\xb2e\xdb\xab~\xa0g\xd6\xeah\x92\xda\xa3?\xd9\xb7\xed\x19|\x9f\xb7U\x93\x1c\r\xb0\xbeP\r\xf0\x81\x02\x19\xfb\x1a\x8f\xb9Q\xa1\x01\x9f\xe2E\xfb\xad\xd9U\x03_Q\xf19k\xe2HZD\xf3\x8b\xdftq\xcd\x1e\xae\xe3\\7\xfdL%\xbbU&\xb2\xfb$\xca\xf2\xf3\x16\xd9q\x01\xa2\x006\x1e\x8aq\x9f\xe3p\xfb*H\x94q\xbc?\xf7\x85m\xc9\xefN:\xad\xfeG\x91O\x1a\xfaJ\xbf\x15\x98zwVSN\x9bXd{:G\xc9:\xda]\x02\xa3\xc2\xd6\x8d\xc1-%2q\x81L\xfb\x93\x0f\xc0y\xd0\x1eD\xfdr\x9dC)R1\x83\x82\xd8\xd1\t\xb6\x02Fw\xbe`\xeb\xa9\xaf\xe6\x92V|\xf0\x90*#\x82\x8eX\xd1\xf2C{A(\x8c\xbb\xc1z\x81\xc7\xbbt\x03\xe3\x1e\xb3=WtLe\x9b\xd1\x06\xe6\x95\xa3.@9\n\x1ff\xbbl\xd2i\x83\xff\xb3R@CHE\x86\x88\xc3u\xe8\x13\x8c\x8d\xd2zz\xbc9\xdcw\xab\x99\xc7,F\x89\xb2X\x8d\xac\xd1\\`\xd7P\x93B)\x8d\xa2(\xce\xa17\xb2\xfd\x01c\x95\xb7\xf0\x11\xc3\x0c\xf4i\x9f\xea\xb6\x18i\x07\xcc\x90\xb0E>\xc8z{W\x03I\xf0\x16\x1c6I\xf0pc\xdd\xb4\xa1\xf6[\xcd\xce\x88\xc0W\xbcA\xa4Ht\xf7b}v\xe6\x81T2\xd4r\xf8\xb9\x82M\x85tW\t\xe0\x0e\xcd\xd1Px\xff._\xd7]I\xb0\xf5\xce\x9bi\x14\xf0\x89\xe5\xd0\x94\x8fA-\x03X>Os\xc9\xc5C\xef\xe9EZ\xe5\xb9\x00\x199\xe9\x90\xc4\xc1\x86\x0f\x12\x1c\x85\xd1\x92\x8d_\x83<\\\x94+\xb4\xd4T`D\x08\x9eqK\xe0\xeb\xf1 \xffd^t):\xab\xec;\xf0\xa6p\xd9\xfc+l\xafa\xd08\xe0\x1c\xd6kT\x03\x00\xcd \xd0;\xa1|\x92\x99\xb7>\xa4+[Y\xc4Qy6\xdb\x0c8\x1c\x80\xffc\x9b\x96\x1ejd\xb7\x8d[vx4\x8f6{\x97D\xf4g\xea\xda9\x1e\xe9v\xd7\xd8.\x9e5y\xe7\x89/Q\xf5\xcd\x07|>TL\xdc\x05n9\xb6"C\xab\xfa\x07(Q\xcdy\xa7\x81Q\x08L6.a\x19\xdb[\xa3&v[\x1f\xbd\xb4{\xa9\xba\x0c+\xde\x8e\x16Z \xf0s\xc43z\xef0\xb3\xf9\x97\xdf\xcdr\xf9\x1e\x85\xd8\x06\xb8\xa6\xaa-9\xe2\x04\xde~m\x15 \x99\xb2\xd9\x00\xc3UfH\xad\x96B\x93jSL\x16\xe3\xdd\x18\xd6C\xf5z\x83f)\xd7\x8c\xbe\xc9\xa0dR\xc5\xdf\x13>\xae\xe0\xba>\xbc\xb36\x80J\x1b\xca^\x0f\xcb\xc6KW\x95AK\xddGp\x97\xea+W<\x1cOcd\xfe(\x9d\x83D\x0fm\xdfIW-Nu\x02v&\x82\x87\x90\xe9tR\xf1\xd81-6\xd2.\x8d\xfb\xbc\x1f\xddP\xb5#5\xbc\t=\xd0\x8b\r\xd9\xc5\xa0g"J\x9a\xacc\x04\xa7\xedG\x9b\xb6H\xae\x9d\xcc>\x90\x9d\x92\x16\xb1*V\xd8\xdf>\xb7\xa7J\xa97\xde\t}H\xd9\x04r*\x8c\x0b\x9c\xb8\xe8.:\x84\x98\xd1\x83\xfe\x83v\x8e9[E0\xc6\xa2|\xf41N\x0c\x91T\xce9ZJA\xdf\xe6-\x1b\xd1$8\xdb\xf3mC\x18\\\xffzl\x9a\xcd\xa0\xf2\xceL\x86\x8f\xa8\xef9\xee<\x112\xce\xb2\xf3\xab\xd3\xf2\x82\xb4H\x02\x8e\x1d\xe9n\x0f\xb8\x0c\x19\xf8\xb6v\xccC\xdb\xe1v\x9f\x1dwT\x9c\xd1\xe8&\xc8K\xd2G\x88\xf1\x81\x14\x00\x8a\xe0\x14r\x08\x82\x0c\xfd\x8esf@\xeak\xd2&\x1dl\xe5s\xfb\n\xbf>\xeeu\\\xa3h{2B\xfd\x9fXvbl;s\xc2\x80\x14a\xa2\xed\xe8p\x1a8s\xd25Cl\xbc;=\x8a\xaa\xba\xd2\xefT\xac\xd2\xe1\xd3\x1bR?\xdb\xc8\xafu\xae\x0b\xdbD\x1cAN\x95\x87s7\x812\xa4\xb7\x14oxC\x9a\xd7\x82-\'\x04w\xe5\xe2\xa8\xcf\xabBp\x18\n\xc89\x07\x81\x9c\xa0\xa3\x99j\x0b\xf3\x88:\x9b\xf5wbl\n2\xe8\xda.\xc2\xc9+r\xa0hi\x14\x05\xf45\xcfL\xf1\xfdi\xc3\xd6#\xb1t\xca) \x04\x818\x9e\x889\xce\x87\x94\xf0\xa1e\xab <\xe1"vy"\xb8\n/\x11{\xd0\xcd/\xb9oT1\xbbw\xa1\xbf\x1b\xe6\xaa\xdb$%\x9b\xb8\xee\xf3r\xb8\x9f\xbc\x99\x0e\x14\xfdG\x9c\x83\xeb\xd7\xa1\xaeL\x16M\xcb\xc9\xed\xa1\xb3U\xa2WQ\xbb7\xc0\x01\x13\x82\x8f\x86{\x15\x9bYqk\xb7\xe2\x9a)\x84{\x15T\xf7\xeb\xc7m\x83\xce\xfd\x07\xc5f)2\\\xef\xe3\x8a$c\x93\xe2+\x81\xd5Z\xae\x91<\x81\xe1y?\xdd\xc3\xca\xd1.\xa2!\x07\xe5\xf8/5O\xf7\xb4X\xb0<\xb7\xdf\xa5\x93\x9a\xbe\xbf\x8fW\xc4\x86P2\xb17E\xb2\x12\xc7\xd5\xc2\xe9Lq\x19LI\x84e;l\xeeo\x17\x1d!Z\xf5\xcffs\xa08\x1a\x18;\x93\xc5\xed5\xe6\xcd$\xf3\xf99\xb5\xec\xc4\x8e\xfe\x9a\xb3%\xa7\xb5\x8ar\x9aN\xd0\xcc\xf2w\xb5\xa0\xaa\xc0\xd6\xfc\xd8{`\xa0G\x06\xba\xa2\x93qYq\x08\x15#T\xb0H\xa5\x17gq}r\xe9\x92$RO\xf4\xa6\xf4\xbc\x9c])\xb87\xc0R2\x92\xbbrw1f\xbd)2\xb8\x85\x0c\x83KA\x8a\xa2$\x90{K\xc3\xcf6P\xde\x96\x7fP\xe0\xc2o\x19Q6\xc1>\xd7v\x94\xd4\xd1\x9a\x98b\\8\xc1u\x18\xce5\xe0\xa6\x92\xcf\xebIm\xdf\x01\xb6Y\xa3\xda\xe9{\xaa~\xb8\xbd\xe8\'\xe5Q\xfe\x04\xa6lb\xaa\xe4\xb4\xcf\x95\xee\xd6\xa00\x88\xbfLzrR\x9cj\x06N\xa9l\x06\x0b(\x03\xa0ll2\xf2\x8b\xbf\xd4#\x8c\xab\xcb\'\x9e\xb6\xaa\xa1-\xbf\xda\xa7\xdd:9\xd2\xba7\xf0U\x96r&6\xfb\x85\xfc)\xecS\xb7\xe0\xabX\xf4\xc0v\x88\xdf\x87\xc4g5\xa7\xa2\xaa\xac\x10U<\xde\xf5\xfd\xd8\n\xb8\xa2\n\xe7\xad\xc5\xc8-\xd2r\x02\x8f\xb4\x80%`\x17\xe4\x9e\xa9)\x9e\x98z8\x1d\xca\xdd\xc8\xdaTo\x9eL\xae\x7f\x1d\xc3\x95\xcd\r-\xe6\x81\xa1\x1f\xc49\x16\x9aoy\x02K\xeb?\x02\xa7\xeb\xe9k\x82#I7\xd3\xbaIq\x9c\xcf\xea$Yr!l\xd2\t\xa3!\xaa(\x03\x04V\xcf\xc3\x17\x90^t\x85aK\xa1\x7f\xa4;\xd1\xff\xdc\xcf\x81\xa4U\xce\xb7\xd8\x9ehc\xb3i\x8b=\xa1\xcc\xb3\x9a\x0b\xd7\xdf\xcf\x996\x9f&\x1b\xcd$`;\x81\x0b\xc6I\xc5\xa8?rf\xce\xbaN}\x92\x7f\x11\xbbf\xae\xdd\x86\x9f-\xe5\x06\xb9w\xe3_\xbdP\xe0\x18\r\xee\x11\xaa\xac"~\xc6\xd8\xcf4%w\xb6\xcby\xc8f\xbbw\x9d\xf6\xee^A\x87C\xc6z`\xbf^[\xa5\xf2I\x92{\xb0s\xd1\x9b\x19\x05\xdd}\xe8)\xe5\xaa\x8b\x8f\xa1\xd3\xd5\xefk\xbe}H!\xd6\xdf4V\xd8?\x08\x85\xe9\xa5X\x14\xee\x06\x05l\xbf\xab\xa9# \x98\xdcW"\xa8\xa1\t?\xabeO\xdd\xef\x97Qo\xe4[\x04y\x0b+{el\x96\xea\x7f\xd6)\xc8=\xe9\x1bE\xb1\x88?\xa6\xc5\x96\xb6\xf8\x14\xd3V\xa9j\xef\x00t\xef\xab|b\x83+\x02\xe6\xc1Q\x1d\x9d\xd5\xed\x19\xef\x81\x8f$\x95k\x8b\x8fv)\xda\xbb\xafj\xbd\x0c\xc1\xeb\xa1n\xfe\x04v\xb6\x12\r\xc0\x86C\x0f\xd0\x8b\x9ds\x86J\xad\xcf\x9dOdF\x97\xef\xcf\tM\xe2\xb2\xa3MN\xb7B$VhM\xe1\x93\xd7.\t1\xba`C\x8eX\x9b\x0bF\xa6\xb2\x0c\xee\xf9\xdauxg\x9fy{\x91\\\xc4\x99\x89J\xbb\x04\x98x\xf6\x91\xeb\x1c\x07\xe5\xd7mx\x01S\xdd\xb1\x06\x84\x18u Uy\xbb\xab\xefG\x07\xcc\xc8p\n(\x97\xbd\xc3\x1c(\xae\xb0\xb3\x86\xab}\xf2:\xd5[\xf0Y\xcaz\x0c\x04\xf82\xc2\xe8\xed\xd9\x8a\x1e\x07\xca[g\x8c\x15*\xa4\xc7\x0bk\xc5\x0b\x07\x07Gm\x0c0\x8en|\xbc\xe5\x15n\x95!\xcb\xe2\t\x94\xb4W\x95?$CZ1\xd9\xe4)\x16M\xc3JVdu\xd7\xc0\x95\xde\x9c-\x9f\xde)\x91>\xa2\xb0\xfaTC\x02\xfa\x9aQA\x14k7u\x1d\x13\xd5aOU\xce\xdft\xfb\xae0n\x93\r\xca\xf7\x89\x14=\xe6M\x00\x9a&U\xf5PA\xe4 #\x96-\xb0\x85\xa8\x90O\x9e\x92\n]\xc4\xa3\xf9\x1a"\x99\x9a\xbctP\xb8\x13fw`z~\xf2\xe3\xf0\xa9m*\xecGI\xd0\xd9Kt\xf01O?\x14f\xbd\x87,\xe7((\'=\xb9\x8a\xc4p`S\x1a\xa3^\xe8\x07\xa2Z\x1f\x01\xfcG\x98;\x93\x14\xf9\xd5\r\x0c\xed\x03U\xce\xad\xe8\xe6\x08g\xcc\x83\x0b\x8a\x95\xbd\x95j\xbb\\\xeb\x927\xaef\x1c\xbe\x1d\xb3\xcb\xba\xae\x92\xf8?\xd0\xf9\xbd|9w\xf9R!\xb8\x1c\xdd\xef\xe0,\xa5=\xbeh\x1b\x93\x94vK\x81\xe6Y\xa7\xf6q\xa4\x0f.BK\xd0D\x17\x92\x82\x11b\x99\xb4:\xdcD\x9d[0N\xcc\x82\xb2\xe4/\x88\x8cGHNx\xf1\xdd\x19\xc0\x8a\xc6\xafr\xa0\x04&\xed\xf08\xed/\x8d\xccF\x87J*\xca\xc4\xb4\xd1:\x1dKn\xe4>L\xf2\xbd\xb7\xcc\x1f\xb0\xc4\xaf\x8bd\xa7\xfaE\xe2\xc3\x13%8\xb4\x15\xf5\xff\xa4^2\xffh\xa7\xd9x;\xb4Z&q\xd4\xcd\xef\xcb&\xbdO]d\xf9\x81\xf1\x1e\xc8\xc0\xef\x12N)\xd1\xff\x1b\x91\x1a\x02\xa0)\x89\xb1\x9e\xc3^\xf0/\xc4\xd7\x82{\xady\xe7d\xfb\xc4\x96qv\n\xc0\x82\\\xber\xe2h\x00\xf7\x9e\\\x08>\xb7E\xf9l\x9cM\xaf\x93\xb6\xae\xe8_\x8bK)\xc6\x17\xeb@\xce\xf9^\xa3\x03\x9cb7w\x17\xa2\xd3\xdc\xb7\xca\xad\xe3K\xc9\xa8{\x84\x03\x90.\x10h\x12\x9aN\xb7Frm\xa1\xfe\xb8R\\\xde\xd0\n\xa5oI\xd3\xb1PP\xe3\xb5e5\x9b-\'\x81`\x1c\x1d/\x1eN\xae\xdd\x1e\x02,\x06\x91\xe5\x88m\xba\x0b\xc5u\x10\xf8\x8aq\xf2\x07\xc5\x8at\xa4W\xef\x8aV\xd1\xb5\x9b\xef\xb4?\xce\x9es\xb9\xca\xce\x85\x8f\x1aI_\x98J\xe35\x80d\\M\xcd\x917\xb9\x97\xeb\xb6\xea\xa5\xa3\xe5\x04\xa6\x03`7\xd8\xa0\x82\x94\x97\xe2\x17\x8em\x86q+\xca\x8c8r/\xdd\xb1\x00\xf2?C@H\xaa\xc9\xb8\xe3\x12&\xd0\x82\xaf\x14k\x08r\xac(/\x1amsD\xf3\xb6\xc4\xfa*\x0ciF\x91\xb4\xb7\x8b\x157#\xd6\xc3\x9b\xa6$\xf2xY\xc1_\x88*\xd9\x7fk]!7L\xcc]\xaa\x97\xa6e\xbe\xa9\xb3\x12\xfc7?J\xa1\x01\xe5=\x99\xe0\x89\xf2]k\xeb\xebO\xaa;\xe3\xed_\x03A\x07\xea\xf9a* \x8b*x\xadAq:\x16\x93\x0e\x17\x03`\xbb\xf1\x9dq\xfc\xe4\xfeB\x0c\xd3e\x19_9\x07R!\x9c)|-o4\x13\xd5\xc1\xdf\r\xcd)77\xd3\xb8\xe5\x99\xb67\x86\xd7\x19\xa5\xee\x8a\x97\x0f(gO\x87\xbf\x94?\xda\x04\x86\xf8\xf7\x01\xd6\x841\x01\xcf\xba\x92\x1c\xbcL\xd19\x1f_\xcf^\xe0\x8dj!=\xa9<\x05\x15\n\xa5\xe0\x1d\xb9x\xdd\x99=\x95H\x9d\n\x05\xd8\xf1\xfe\x9e\x92j\xfecUAj\x9d\xa1\xa83\xcduYu\xf8]\x1f\x98@:\xb6\xdfp\x8b\xd8\x02bQ\x90~9\x11h\x97\x16\xdaF\n\xa8\x99\xfb\xfdH\x8dCd6\xf2\x98\xe3+\xb0(\xf3\x1c\x01\xcf\xc2T\xb2\xefx\x1b\xcb,\xe8\xa5h\xc0\n\x05\xe7\x95\x16\xf95S\xd3\x08\x96w\xe2\x97W\xa4dA\xa3&\x9a\xbd\xb988\x15$\xa06G\x97\xda\\\xed\xc1\x89\xc54\xb5\x9fAk\xe6E\'H\xb4v\xcd\xa4:\xdc\xe6B\xea\x9fPr>D[\x86\x12\t\xc8E\'\x9e\x94\x97+f\x1b\xf8\xcb\x85\x92\xfb\x18\x042\xf8+V\xa9\xb7\xb9X\xc5\x9c\x9e\x81\x87\x19vw\xfc\x9c\x94`\xfe\xdf\xc4\xcc~\xe6\x14a@\x04\x94!\xa5c\x93A\xbe\x1f\x08\'J\x96\xff\xb5\xb1\x83\xb7\x193^\xb1\xdb\xb7\x03\x97a\xfeoy\xd3z\xec\xf1\xb9\xff\x8d@p9\xee=\xf0K\x8c\x05}\x0c\x80\x05\xdd*q\x91n\xd3\t\xad\xc2\x05YTD!\x0bw\xba\x0c\\\xd6\x9ct\x07\xd8\xaa\rg\xec\xab\xcb\x1d\xaak\xd0?\xb8\xbe\xd1\xff\xf9\x006\xa2\x03YfJx\xcfE7\x1as$\xf4\x926\xc7\xd7\xd3u\xff)\xc2rBm\xa3\x16g\x94\xfa\\[\x83-c\xaf\xc0\xd3`{~\x80\x13\xda6\x14\xc0#,\x9e@\xfe\xf4\xfc\xdd\xef\xa1%\xe0\x08\xebGT\xe2\x8d\x08Ch\x91W\x01<\x12\xa0\x12\x8b\x86`S\xd5\x0f\x85\x9d^\t\xf9)<\xab\xc3\xc6u\xc9\xe9\x89\x1a\xe23\t\xcf\xdf\xe0\x84\xf3T\xd5\x8d\xaa\xee\x0e~N\xfc\x1c\xb2\x0b\xf4\xc1\x97\x97\xcf(\xd0\x1b>>\x9c\xc7\x0ek\xeb\x15\xdf\xab\xbf\xce\x11\xff\x06\xc7\xea\x7f\x16\xe0\'\xbeP)\x1f\x93[8\x1bG\xd1\xb6\xb5|u\xae\xf5\x18\xa3\x8e&\xe0\xf4BM\nl\r\xf8\x86o\x12\x19\xa5\x844\x95bL\xf2\x03W\xa5\xa0\x9b\xcc\xa9X6#<\x9b\x98\xe2\x83\xcb\x19!Uz\xd9\xf1\x0c\xca\x02\x9e\x03\'\x00*\xbd\x8a\x89>(\x91-\\\x95\xe3\xe3Qv\x1a\x1dy\xe6\xc4vt?\xa1f\x92\x02z\xd0\xbc\xc8\xcfm\xb8?\xa2#\xe7sRg7\xace\x91%\x02\xc4\x98\xe2\xa7\x07\x9f\x8c\x1dRF\xd2\xc2\x0c\xa2\xd6H\xf1\x19\xe4Z\x12\xd6L\xe8,\xa7$ \xfc\x106\xf1e\xefD_B\x1fuK#\xa2\x82\x03\xe5 Pwb\xbfJ\xd2\x9e\x91\xc8\xa1T\xff\xcc]\x95\xdb6B\x81\x08r\xcfN\xef\t\xbdJ\xb3X"\xcc5\xab\xae\x1e\xab\x19h\xee\xd5\xfe\x05D"\x04T\x07\xfb\xf7\xe9(\x8a4r\xc6\x7f\xf5\xc1\x14\xb3.yp\xfc\x01\x9e\x19\x97\xeaK\xcc\x0e\xe3\xe4\x84\xf5yrh\xe89\x01\xefD\xa6aK\xabY\x8c\x8c7\x98\xff\xcd\x9d\x91<\xc2bi\xba\xee\xfdo\xa4\xda!\xe4"\x86\xaeeu\xf2\xa0\xad3\x05\xd15\xfbW\xc4p\x0cK\x8f\x16%\xf9\x0f\xdb\xa8*\xab\x12\x93\xb7\xc54]7\xcb\xcc\x91V"\x1d\xa7\x1f\xbe\xfe\xb0.\xf5\x06<l\x1e\x8c\xf0\xc3\xbeg=L^`\x85\x87F\xca*\xbd\xe9\x81\x9dKv\xfa(\'\xbb#\x8f\x0b\xf47s\xcc8$\x07^\t\xa7Q\x1eh\x92\\=\xfff;\xb2\xbb\xe4\x12R $\x84V\xf1\xed?P"\xc5\xc2\xc9\x07\xd6\xa2\xb2`\x85\xef.D\x0f\\\x0f\xd5\xcd\xed\xbe\xf5\xf6\xf5\xad\xf3Z\x8c\xe5\xe4R\xf1#\xdc\xbd-\xf4\x11-$\x9e>D\xe9\xc8\x1b\xdc\xa2\xdd^\x0c\\\x04\xc3\x0b\xb5\xe5\x1bI\xc0\xc5j\x87\xb5)\xd8\x99\xc3t[\xa08+\xa0 \t\x06O\x07^\xab,Jc\x8b\x95i"\xa7\xd4`\x8aM\x89_1\xc8\xfaFF\xc7hiT\xf2j\xe6\xfb\xf9\x16ge\x06G@g\xa9\x82\xee2\x8cg\xbc\xc6\x1a\xa8\x9e\r2z\xebd\x80b\xf1x\xc4\xcb\x1b\xdf:\xaf\xf6\'6\x12\xa4\'\xcbU\x1ey1\x178\xd3\xe1\xfd\x9f\x98&\x15>\x8f\x9e\x18\x93\xfa\xa7\xa0\xb9h\xad\xd8\xc0\xec\xed?\x01k\x16\x12\xd5\xc1\xeez\x9a\xae\xc1,\xdeW\xdd\xdb\x01\x05J\x80{\xc8\xf6\xb2+YOp\xb3\xb5\xae\xc3\x13\xf2\xa6\xbe\xf6L/\xe0,\xa5\x865\xed;v\x10\xd2s\x13\xe0\xdb\x94L\xd18Rz\x07\xdcJ\xa0\x19\x1a\xb4\xe9\xf6\xec\xb89\xe3b\xf5\x9c[\xdb\xea\x8f\'P\x01~\x12\x84\xfe\xebD}\x1f[\x99C\xbfB\xf7\xbf0\x14\xa0Z\xe74\xaa\x8b\xaf\xba1\x80\x1eTt\xefZO\x16\xd0\xa1\x00\xac\xba>7h\xf1\xf3\xa3i\xd0\xa6\xc8\xc9$\x0e_U\x07\x1f\r|/S\x87\x1f\x84\x1b\xad\xee\x13\x91\x0c4\x0b\xc5\xf4"\xd5F\x1dEL\x91\xa7\xe0\x8f\x19\xb8\xa9\xb4\xd1L\xd1\xf24\x0ePc\x17U\xba\xb7\xef\x98\xea\x04\xca\xf9M\x17\xc7\xd4\xf3\'~i\xb4\xd8\xdf\xee\xde)\xef\xbd~\x07\x8ey\x1a\xbcQ\xfe\x04W\x85>\xb0\xa4+\xd6a\x93\xd8\x82\x86)\xec\xf0\xe0\x93U\x83\xd7\x03\xf9\x19\xed\xbe\xa5N|\x91\xee\xe5\x87\xb0Y \xc0\x0f2,[w\x8e\x13\xb3ta\x11\x95\xa7\xaeJ\xa2\x9e\xad\x9f\r\xdbV\x10\xb80\xc6F\xe0c\x87\x1apB\xe4\xf1\x9fL\x8f\xf1\x06n\xa9E\x197\xd9\x06\xd2^\xeb\x1c\xea)\xe5\xa5\xdd\xa8\xc1 \xad\x0b\x17\x858>\xa5=\xde\xe2fR(\xc2\x13\xd0c\xb7\x8f\xdf\xf4\x16Q[Rme\xbb\xf8\xae&\x83\xeb\n\xedu\xbb\xd6\xb9W\x9e\x15\xf8\xfa\x01\x8e\xa6\x9d\xd0]\xf2\xc2\xaaJ%\x07\xbbq\xb0\xa4\xbb\x08\x04HAs\xf6k\x07>n\xfe\x8fL\xbfW\x97\xbdN\x82\xe6>h\xfa\x8b\x99\x11\xfcXS\x86?\x04\x19C\x99\xad\x80y\xf59\xd0j\x95\xd7F\x8c\x1e\x98aH\x16\xed\x10\x98\x0e\xfb\x95\xf5\xdd\xc1\xec\xa8q\x08\x0eDH\xce\xd6\x1c\xc7O\x85\x81{\x05=\xde\xda\xcb\xcf\xe6\xa5\xf4+\x88D]R\x15X\x92\xe0\xd26\x1dl;C\x88\x05\x19~\xe7~\r\xe9`EZ\xecIK\xe9\xf0\xc1\xa4\x13a31@*\xa8\xe0GG\x8dL\xb4"\x00\xf2\xc9T\xa0\xe7\xfe\xc4\xd3=J\xa0\x86\xb7Y\xb2o\x14=<\x11\x8ai\xf2%\x1f\x01e\xcf%59\xccQ25\x16F5b\x91(\x1dLw\x1f\xf8\xb4c@\xc4]2\'\x19>\x87A\xca6e\\\x85\x9c\xdby\xa3\xf9\xfcCZ\xd9\x11p\xf4\x83\x10\xe4I\x1f\x1b\x99X\x1e\x95\xb6\x13)\xbf\x00k$?\xaa\xe0\xc7\xd2\xc8\xc6\x1dH\x17\x9ayt\xd1\xa8\xf4%\x16\xf1o\xd5_\xec\x81<t\n\xd4J\xbb\xa1\xfe\x1e\xc8\x00\xe6U\xfe\xcb\xf1V\xbf\x9b=\xb7+\\\xa9\xaeh\xf6\xadr\xd5\x17dz#\x9a\x08\x03\xa3\xf8\x91M\xb2\xf6\xf9~\xc5P=\xe5\xdc\xc8i\xd8\xe2\xd7\xe78I\x00\xc9\x9a\xc9\xa7>&$3\xaa\x1e\xe3\xcbqs\xd6\x95\x9e\x8f&\xe9\\\xcc\xcdd\xac\x9bR\x84Ic\x99\xae\xdb\x7f]#\xa6/\xf7\xfcR0\x0b\x0c<\xec\xb2+\xb8R\'\xdf\x8088\x01\x05)T%\xddd61\xf8\x95\x15\xa7jZ+\xc3;s\xe8T~}\xf0\xd9\x91\x97?"\xda\xaapA\xd2+\x85\xc3\xe6\x93V\x96\xe7A\xdf\xc9\xc9\xd3\x984\x8997u\x15\x87f\xa2\'jt\xaee\xa9-At\xc7\xc1\xc4z\x8c6|kQ\x88\xd0\xd6\x8a\xb6Q\x01\xf5\xd7\x17\xd3R\x82\xf36A\xed\xb8\x1f\rT\xc3\xbe\\\x93\xe9\x97\x9b\xb3\xbd\x99\xc1x\x8b\xaap\xae\x13\xcd\x14`\xbd\xce\xfa\x7f2\xc0\x1eD\xdc\x0c\xebQa\xa2}0\xd6F?\x97Z\xa3=?\x97S\xb0w($6s\x19\xad)Y\x8e\x003\x0f\xa3Xg\x96\xec\xab\xb2\xb1\x1b\\\x1a\x02\xda*\xa2\x08\x9a\xb4\xf5\xdc1\xcc\xde}\xdb\x1d\t)\xb5-\x12\\\x04M\xc3\x87\xad\xb4\xa9\x8eF\x0f\xa4F\xb4\x7f\xc1\x11\xd5\xb7\xe8\xe6h\xda\xa4\xcet\x8e\x1e\xce\x0f\xac{\xb3[/K\xf8N\xd0J\x91\x06\x03\x02$\x85\x15\xab\xe8\xd1[\x83j\xd9\xc3/U\xee\xc4\x18\xa3\x1d\xc1a\xf5\xc1\xce)\xac\xae\xf1\xe8\xf5-b/\x94Zza\x02 \x8a5/>n\x19\x9a\x06p\x8f\xa8\xfa3\xa2\xd6b\xa7\x8e^\xf8\x93\x91\xd8\xa2R\xd6j\x9f\x9b\xc9\x87&\x89\xe7\x11\xa3\xfal\\!\xd7\xcf\xdf\xe8\x8f\xc9qQZ\x0b\x8e\x8e\x99\x1c\xbe\x9e\x83\xed\xd3A\xe4G\x15\xbam\xfa\x05\x80u\x9b\xb8_\x98\xaa\xddZi+\xd5\x87\x03[G\xea\xc8\xb9[\x97\x9c\x9cg\x7f\xd1\x9a\xd3X\xcd\xbb\xe2\xd2\xb0h!\x8c\xd0\xbdS\xad3\x8cK\xb8\xc0\x8e\x05\xf2^<\x93\xbb\xd0\xfe\x88\xb2\xf6\xfd\xb9\xed{\x9d\x18\x1b\xaa\xda\xfe\xedUx&\xfa\x13\x0c\xe0\x0c\xa3\x83\xc1\x83\xee\x07\xb8\x19\xc3\x9abe\x1c\x99\x80\x04)\x8d_Cfu\xaax;\x1e\x05\x84]\x07\xa4\xd4\xb6\x87\xbd\xcc\xbff\xa0\x81\x81a\xf7\x95\x00\x18\xed\xc9<Y\xfc\xaf\'\xdd\xb7Ou\t\xd0d\x02\xa2\xda\xc5G?\x93A-\x9dU\xe2\x92\xb2z\xacv\x91\xb22;E\xdf\xea\xe9\xe7sm\x9aR9\xd7?n\x03\xe7\xa6*\xdc\xc2\x86\xa8\x92o\xdc\x81\xa6,\xc4\xfb\xf6k\xdd)\xfbl+\x1a\xb1\xd6\xdf\xab\xc5+\x05\x03,\xb3\x1d\xc9\x91V\xb3\xc56\x18\x8f\xbd\xda|JLx\xcas\x19\xb9/\xa8\xd8\xb9\x01\xbe\x06v\x08\xac\xa1\xd3\xeax\xd1\x9e\x9f\xca\xfc\x138\xfe\xbf\x9c\xc1\xa4Z\x86\xc7\x0b/\xb9\xa9\xf5\xb9^\xb7\xf0X\xbbz\xbf\x07\x8d\xb1&\xff+\xe6Ls\xf0\xec\x13\x05j\x05\xbeT^P\xce\xa3\xd8\xf5\xbdA\xd4\xa5\x13wj\xc6>O}d\xcc\xdar\xd8\xcc4cwv7\xa6\xbdr\xa1\n\xe5\xf6\xea-\xbd\x90\xe19\x80\x11I\x8b\xdf\xf9\x948\x97\xefz7[x\xc2\x0f\x87"\xf74#c\x7f\xc7\x8c-\x95U\x16&j\x97\x9e"\x80\xb01\xe8w\xfd=@J\xe1\x84\xf2Ud\xaaMm;\xeb\x99\x81\xf2\xde\x81\xa2\x07\x08f\xc5\xec_\'\xa0w\xb1\xaf\xa7y\xed\x17\xf1\x92\x03\xc2\xaf\x92\xa8\x00\x959\xb0(;\x8e\xd6h\xa5\x05\xb3\x00\x8b\xed\x19Y\xec\xd4>\xd8P\r\xa2\x96\x02\x02\xa1\x06\xe8\xf0\xed\xccm\xd6\xc8X\xceZ\xe6{\x8e~\xd6\xe5d\xe3\x04#"6\xeb7\xa8a\xa9[\xe3\x17\xfd\xb8\xc1<\xac\x18\xfb\xae\xc3\x83~\x19\x89tU\xce_\x8a\xff\xed\xff2\n\xc5\x11\x07l\x16\xa3\x11\xbb1\x94(\xc3\xe5\xca\x1d\x1b\xfd\x84\xd2\x12\xea\x1b\x83\x98JQ\x10h\xe1\xec@\x93v\xa51\xd4\xa0$w[h\x8b\x1f\xeb\xd5\xb9F\x14\xc6G\xa1\x7f]\xb5\xa8D\xb9N\xc8\xab*\xf16b\x03\xd1\xe7\x87\x9f\xaa\xd5N\xc7#\xd2! \x198\x11;\xbb\x9e\x19\xa8\xf7%\xcf\x88\xc2Y\x8b\xd8\x86D\x11\x8eY\xba\xad\x98\xc4\xff\xa1\xbftR2\xcb\x92Si\x9aQ\xf2\x826\xde\x96v\x8e\x04W8K q\xe8\x04\xa41\xe6}\xee\x03\x0b\x9f\xaf.\xae\xef\xfb\xee\xa0\xb2\x0f\xe1 \xc3\xe7\xf7\x0b')
|
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\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x005"\x00\x00\x12\t\x04\x00\x9e\xde\x1a\x94\x17\xa4U?\xe0w\xc6ML\x84\xd5%\x00\x00\x00\x00\x00\x00\x00\x00\xad_\xa7,\x82\xe5\xfc\t\xa1K;\xaa\xcd\xf2\xb2\x9c>\x1a\xc8B\x1bs\xc5\xce,\x0b\x84\x07\xfe}\x9c\x15\xdb\x03Gb\x1b\xf390\x7f}\xa8\x0e\xd0J\xd7]&K\xcf\xac\x0e\xee\xda4\x05\'\x90\xee\xc7\xa0Y\xad\x89b#\xad\x1f\xb6&\xc2]\x07x\x987\xd1\\-m\xe41\xd7\xc2Ra\x8b\xfc\xad\xdby\xc9\xe0>V\x07 \xd7\xbb<\xa6 \xdb\x1f\'\x0f \xda\x80\xf0\xce\xe5\x08F~\xa3\xc7\\\x7fLO\xed&\x06k\xb4\xa0![\xfc1\xda\x89\xeaX\xf1\xcb.V\xc4\xffl(\x14\xa1\xa3[\xf5\xe6\xf4\xa4^\xddt\xd9<\x04h\x13a\x07\xd4\xe1\x9f\xd4\xa2l,\xab\x15f\x16}\xb4%\x0c\xcc\x95\xb4\xed\x14\x08AyI&\x98\r%\xa0P\x7f\x18t\x82\xf2<\x18\xf2tyi5D\x1b\xce\xfe\x8e.2\xa2\x93\\\xc3i\x03|\x90\xd9\xae&\x86\r#&\xa4*\x9d\x81;;\x89\xebSqy\x1d\x8a\x93H\xf3JB\xbaI\xe1[\xea\x8d\xd9\x16\xbc\xef\x1ey\xea\x97$c\xc1\x14\xf7\xe3\xf0\xdb\x9d\te^\xf2\xa8\xe5\x1d\xd3\x022\x19?\x03f\xa8\xeb\xc8\x9fT\x034\xden\xe4K\xc1\xd9O\x08\xcd\x92m\x0c\x89\xe1xMm\x9d*/\xdf\x91K\x10.\x9e\xfa\xc9\xb0\xc6\x95)\xe71@\x80A\xa3W\xcb\xac\xd1]\xe3\x93\xf13v\xb1\xdb\x01X>LI\xcf\xc5\xdd\x1aQ\x8f3\xef\xc2\x82\xa3\xc9\xc9\xeeb\x8d\xd3\xa8C\xed*\x1f%M\x17"~\x84F\x90\xad\xa8\xc2D\x01\x06\xb3\xca\xc2\xf1\x13\xc6C\x06\xca\x86.\xfa\xf2\xc3c\x91"PO\x97\x9bR\x92\xa5\xf9Z\xdf\x977\xfb\xdd\x7fQ\xaet\xd2\x95\xa7\x88\xfd\xc5\xe5\x1a<\x9f\x0b\x12\x19A\x16t\x8b-\xffX]\xac\x15(\xbc\xa1\x0b\x14\xb8\x9aW\xcf\xda\x0f\xeb\xdd\x0ci\xcfA\x12\x08\xef\x92\xf0T\x10\x92\xebb\x91\x8f\xfeWw@lG\xd0\x8a\x1f&\xcaK\xa8{\x136\xb7hb\x99\x0e`\xa5\x05\xa3B\xd1\xb9\xcf\x9b\xbduQF\x8a\x99\x1c\xb0(\xcc@\xe5[\xbe\xa8\xc8\xd5\x1d\xd1\x12n\xba\x10|\x94<T\x0f\x7f\xa3\x1a&\x12Q\x14su,\x08ms\xea\xf36\x10\nC\xfb\x95_\xb5\xf2\xf8\xec\xb8\xab\xfa\x86\x88\'\x08\xfcF<\xfb\xd6\xfbizyn\xe5\x8f\x8d\xe5\xcd\x81\x05\x06&\xa8O0\xffP\x9a\xa8\x87R-\xa3z\x0b\x05)\x8cTS\xd1\xfa\x14<\x05\xb8\xe1\x1e\x03\x85\xf7\x0bj\xd9\x8e\x96\xf1\xe1 \x9d\xf7\xed\x88?\xcd 3Mn\x85\xa8\x16BH\xd8\x1f\xd5=\x0fB\xf8v\x8a\x16\x909e)\xa8#r\xabIdw\xa3\x07J^\x00\x98\xafj\xf6\x99\xad\x84\xea\xd6\xa6\xdd^/\xde*d!S\xb1\x98\',\x9ez\x1dO\xda\xa4\xe8t\x8c\xe2\xd5\xbd\x7f\xf2}p$\xd4c\xfc\xb1s\x84\xe1Q\xbdT\xed\xec9\x07\xbe|\x18\xa9=\x897\x00\xfa\xa2\non\xd07X\xe8\x12KR`Z\xbf\x8e\xc3"&\x7f\xd5\x94\x87)?8\x89\x83\xdeG\xaa\xe9]\x9ax\xb5\xc09\x87Jnq/\xaf\x0c\x19\xa0\xe0\x81]\x12\xdd\xd5\xbc*\x93\xa6$\xdd\t\xc0G\xc4\xfbF\'\xb0j)\xf5pl\xe7\xef\x10p\x8ap\xc9\x02\x9dr\x19\xc6\x199$A2\x90v\xe8qt\xc0k\r\xa2G\xaf\x10\x02l\t\x88\xe5\xe2\x0c\x9723\xad\x86\xf3\xc0x\x83dvq\xac\x05.\x9f\xe5?\x15\xec\\\x0e&\xa3\xe7j\xf7n.\xf2?Q\x1b\xf97I\\TW\xf6\xd1g0\xc2\xf9ho\xcd\x05\x9c\x95\xfff\xfe\xf3lyrX\xf2\xc0`\xcd\x8ba6\x16\x08\xd3|\x1a$F}\xb9\x93x\xf4\xba\xed\xa4\x86\xcaS/\r\xc0h\xa7\x81\xe1\xf4ie\x1aV\xc0\x80Gq\x14\xc4c&\xd3\x8a\xbc2w\xb5\x0c\xbc\xfa\xaaR\x8f?\xa8N\x18s\xe0\xd2i\x0f\xcb,\xe1\x8bj#\x92\x99\x03\x061\xf2>EGXBj\xdfK?\xfe\x86\xfa\xd9\x84\xcc\x06}0\xc7\x8f\x17\xcdz-\xe2X\xec\xbcc\xdb\x8a\xb1\x10\x86\xfd-\xbc\xa6\x1b\xc7\xcd\xe3\xacj|kP\xd2\xa19c\xcd\xc4\x0e?\xcb\x8f\x1c\x14\xd4Vf\xad\x96{/&\x82\xeaS4\xe9\xf2w\xae\xa4C\x8a\xd3\x8d\t\x03r%\x1e\x8e\x1dN\x85ac\xba\x08;\xc7\x9a\xea\xe7/Ed\xfe8H\xefDP\xe9\xa1:\x99\x8dL\x0b\xd2\x05u\x97\xd0\xddj&T\xe9\xe0\xeb\xc3tu\xfad)\xc9\xebG\x9a#i\xac\x93L\xd1K\x9f\xc7\xa1\x14\xaaL\xda\x8fPP\xc9\xdfU)\x9a\x90\x8c\x08\xfd\xb6*\xaa2\x9fz$\x87\xa3\xf9\xff\xa4p\x9c\xe1\x10\xcfn_\x07\xf1u\x13,\x87\xbd\x02\xd8h\xa7i\xc5\xd0>|\x93\xb1(\x16\xd1a\x1ewK_\x91\x14\xd5<\xed\xf1\xb2g\x84\xb5\xd6\xa4\xe5\x13\x9a!{\x01C\x95k\x9d\xffeX\x9c#\xa5\x92*\x05\xb8\x94d\xa5\xae\xa2w\xee\x8c{\x0eJ\x83\x1f\xcd\xd5\t)%f\x0el\x8d7-\xd9o\x80EzTB\xbe\xdb\x19g%\x91\x08%\x99\xb45\x13V\x021\x0f\x8f7\xcbZ\xc3o\xe4\x07}O\x12<T\xc0>\xff\x0f\xb1x\xb9\xfeqw\xdf\x95Y\xf5=\x9b\xaf\xa0\xc5^b\x8a\x94D\xbc\xf62w\xa0\xcb\xaf\x80\x8fd5t\xdcg\xfe\xeb\xa0i\x1c\xd2\x91\x0b\xde\x03\x87K\xb9!#\xa3\xfd\xd0<\x10\xb93\x84I\xf5\x84"e\xa9\x181M\xfa\x17\xbaK.G\xe5\x84>\x88v\xae\x18;\x9dF\x16\x89\x92\xdas%\xc9\xaa\xc4\xca\xabzP\xc1T\xf3&g\xfc-^\x9eB\x04\xf2V\xfbL%\xa9k\xfe7\x80\xd9\xb4\x0e\xeb\xe8\x03J\xc9\x86vl\'eIp\xd1\xd5\x00\xabXQbd\xbfzLB\xebv\x19\x08\xbc\x17\xea*n\x91\x81\x07\xe8Y\xac\xa5!m3\xa7Z \xc5g\x19\xdb\xe5\xd5\x8b\x8a\xa3#\xab\x9b\xe1\x97\xb8\x90x\x9fW+`t\x1b\xc6\x12.F\xfa\xf11}hR-E\x1e\xe5\x10\xe9\xf9\xe7\x90[\xb9\xab"\xc7\xb0\xf7\x01\xe7\x84\x0c\x84\xc5W\x83kR\xd5h\xcc|`\xf8\xef\x8f\xff\xa6\x9f\x10\xfd\x19\xf2\x03\xb8\xd2\xed\x87\x8e\xf82\x8e\xfd\xaf\xa6\xe4\xf9\x19\x95\'q#\x96~\xeb\xf1\x81\xeb\xff\xbd\xa2\xde\xc4\x91\xa0\x142\xd9\xd9\x99d\xc2P\x90\x04\x9d\x19R\xb1\xd7\xb608\x0c\x80\x04\xad`I\x01\x80\x99\xcb\xce\x81\xf6\x8b\xfb\xa0\x0f\xd8\x8f\xebj\xa4q\xbe\x81\xd5\xaa\x86\xfa\x0e\xbd\x90F\xfc\x12?.\xab\xd9I>\xcf\xa1\xfa\xeb\xf0h\xe3\xff5\x04y\xc8\x1b7\xa1)\xaa\xc2\x823\xb9UJ\x8c\xee\xf8\x03G92]b\xcf\xc2ok\x10\xb8C\x041\x16x\x1e(\xe2\n\x07V\xea\x9b\x8135|\x0e\x1a\xfe\xcdK\xbb3\x0f,\x99\x14\xc5\x94@\x9e\xb4cY\x8f\x91\xec\x9av\xdb\x85\xab\xe8\xe8\xf5\xcb\x86\xe3\xaev\x19\xa3\xb6\xb9\x903\xdc0\x80^\xae\xa1A\x01e\x97;Z9\xfa\xfb\x1ai\xecao\x07\xd2\x08zF<h\x19Z\x9d}@#\x9fD\xbc\xddHq`\x84X\xf4\xf9\xd9\xf3c\xe0\xd5\xa1\x9e\xfa\xc3\xb1*\xb3\xc1l]\xdf9\x9e\xa3\x9d\xd5n\xeb"\xfa\xbe\x1c\xce\xffZ\x8d\r!\x91\x9d>\x9bWa\x97\xa5\x96\xf7\x93\xda\xe2n<\xcc\x15\t\x15LX5yJT2YJ\x8f:\xf7g\xab\x00\x85\xb3\x16\xc0\x8e}\xf5\xf3\xd3\xef\xfaNrP\x1eZ\xd1\x1b`\x883\x99f!\x98\x10\xb8H\xd8f[\xdf\xd6u?d%ZV\xd6\t\xe2\xb4{\xc3\x93\'\xa3Gw@\x17\xa9|\xa5*\xc7\x04\xed\xb1c\xfd\x89!L8\xd4\x0e\x089mL\xf0\x9eK\xe0\x9c\x13\x1a\xd2 I\xa7\'\xa2S\xa5\xe3p\x7f\xc9\xae\x03V\xd3\xd8\n\xf6\xbe\xdb\xac\x94\x14;J\xc1\xa3+\xaa\x07\xa7\xc9]\x17EV\x17v\xc0\xc3X\x16\x9c\xd5/\x8c\xda\x16\xf5\xc6\x90~\x03yV5-@k\xbeS\x16\xf7\xa1k\xf5z\x13\xa0\xc8\x1d\x02-_\xeb{\x9d\xc3\xda\x80q\x10\xfc\x7f3%\x1f\x1b\x97H7\xb9\x05\xf2\xc5\xeeA\x18^\xe6\x85\'\x9b]+r\x84h;G\x98\xb8\xa9Y\x89e\x03\xce\xa2B\xd8\xe5\xe9j\x12~\x85N3\x837\xb1b\x97\xeb\x13\xb3\x87\x15\x8dA?@\xfa7\xa8gk\xeb\'=R\xaa\x1d\x1eF\xbe\xc2\xcbI\xd4\x9a-:\x7f_\xad\xf6\x82\xb1\x96X\x9d\xc3C\xe7\x05\x18\xa3\xe8\xfcfP\xe2\x1cQ\xed\xa3\xaf\xbeF\xf8\x12_\xc5`Oe\x15\xe2\xa6\xc3\x9ew\xfbv\xe3\xf5\xde3 D\xa9u\xd47\x95\xc3b\xff\x00\xd3\xc1*\xa0a9%\n\x93\x00\xdf\x0bB\xd2\t\xd0\xe0\x7f\xc1\xc8\x89\xdae6\xc6\xa4\xf1I\xc0*ka\x88\x1e\xb1\x87\x97\x00a9\x95\xa62\xaf\xdf\xf6\xe7\xc5\xed~\x90\xc0\n\xc5\xba\xa9K\x8c\x1fkRU7]\x80\x9f\x8d =?T\x8e\xd2`\n\x13\x17\xbcKL\xb3\x97\xeb:Kq\xd5\x1f\xafN\xd8C\x11\x8b-\xc3\\\xa4\xf3\x983f\xcan,f\x0c\xf3Kg\x92\xd3\x1f\xdcM\xc8\xe0\xa7@\x06>.8\xb0R\x1cQ\x18,\xb9\x82\xc6\x17\xe0\xf7\xd2\xc4\xa0\x8e!0\x04\xa8A\xae\x12^\x89\x0eZ\x84\x91\xe3\xe4\xee\xe4f|\x10\r\x85\xff\x1d]\x89\xc7\xa3(y\xb7\xae\xf1\xde!\x03\xae\xa1\xf3\xa5\xd59e\xce\xfd\x84\xe3Q\xda\xff\xd2\xe8&\xc6\x03(g\xbco\xf1\x1a0\x07d\x91zQ\xf0d\x0fv\xdf\x8d\xe3\xf9\xf7\xeb7\xf2\x9c\x14*\xa7\xd7\x810\xd7|\xe8\x9b>>j:\xa4{\xbc\x02\'\x03\x9b]\xb8\xdc\x94\x08{\xb5\xbdZ\xce,\xfe\xe7\x8a\x88\x14\\\x02F\xdd{#\x8e\x05\xfaOd\x81\x9dg{9\xcbzm\xc5\xcb\x87<\xee\x07\xaeDG\x00`\xbb\xac&\xfa\x80\xdfr\xcd\x0c\xb3\x87\xc0\x19\x90\xb9\x97\xa1<n\xe2\xde\xa7F\xeb@\x1d\xbdl`\x87q\xa6\x1c\x9c\xea\x17\x0f\x80\xbc\n\x8b\x96G\n\x1fc\xf2)\x94.\x85J\xb5\xd1\x19\x93\xb4\xda\rg5\xb3\xb3\x99\xc7+\x85\xbe\x9bwQ\xcfk\x18t\x15\xc9h\xc83\xc0gvQ\xff\xe4O\xab{+38k\x1c\'\xb0\xab\x85\xcb\xae!\xa6\xc5\xbe?\x07\xcc\xf5\x82\xc29\xdd0]@\xad\xda\xdf\xb7e\xb4\x1c\xa7F\x06\x9c\xb1.\x00\x13\x0ev\r\x10P\x98\xa4x:t\r\xc0\x1e\xb5\xf1\x19z\xac\xfci\xac\x84\x11<\t\xb9\xc9l\xf9\xf8j\x0bj\x9f\xf5\x12g\xa1\xf9\xa2]P\xea\xf0\xa0\x1b\x0b\xb8\xd2\xdc\xb36:z_\xa3\x13\xaeoD\xe0*\xd5\xfd\x85\xd5\xfd\xa1\xb8\x97\xcb\xd4\t\xa0\xcaH\x11v%\x1e\x13xAc\x1f\xed\xd5\x99\n\xd2\xc6\xa9\xf1?\xaf\xc9X[\x87\xbc\xbe\xe8oR\xaa\xc5\xd9\xbfq/\xb3\x7f}\xee\xdcr\x10\x8dw+!k\x1e\xb1W\xc8\x97\xa7X\xcb?\xf0\xb8x\xa6,2\xa5S~\xb3j\x1bt\xb63)uD\xbd\xe5%U"\xca\xd9d}\xf2\nX\x0f\x8c\xd8\x82{\xa5\x16o\np\xcbwF\xe1\xce\xdbNn\x84\xa41\xc7\x8b\x82\xea\xe0\x96\x1b\xae\xf9\x9f2\x1e\xaeJ\xe2}>\xcb \x80<\x84\xa7p\xcbT\xc4^\x9a\xd4:X\t\x0f\xf8\x0e\xab\xe5\x1a\x00"\xf8MG\xc6U\xe4\xc0\x99\x1bU\x83\xb3\n,\x84\xfcw\xe1\xcb\x8b\xa0\x11p\xff\xbfc\xb2T\x12*\x85\xa3\x18\xea\xa0\xc9\x8ej\xab\xde\xde4=\xe5\x99`\xf8>\xf3\xba\x18\xb9\x1b\\9\xa1\x9f\x85\xa0%]O7\x13C\xac\x99\x83\xb7zOM\xdfb\xfd+x\xfd\xd0^@\x0f\x8dZ\x97\xdb\x83\xe2)\xd5d\x8cnH\xbb\x99\xc7\xc1\xdeJ\x1a\x82\x98\x14i\xaf\x1e\xd3e\x05.\xbf,\xa3K\xc6\xbaf%\x1e\'\x17`\xdb\xb6n\x1c\x03\xcfW7bi\xf7\xb2\x9e(\xd6\xb9\x89\xb2-gL<\xd0\xf4\xed\xe2\xa0\xb9\xcf\xca\xcb\xf4\x9dM\x17\x1c\xdat\xef3\xd6\xa0}\xbb\x1d\xb4\xc2\x9d\x89\xd0{\xf0\x94\xc7\x9e\xab\x14\x0c\x0ce\x86$X\x85\x8c7Kz\x1c\x9c\x1b\xcf0\xb9\xb5\xa5\x1b\xd8\xf8>r@j?J\xb9\x96B\x81\xd8E\xdc\xd2\xc5l\xd9\x17\x86\xe24\x04\x1a|3\x9a3j\xf0\x10\x1b\xd3\x14V\x18\xe0~(\x81\xdc\xf1\xc79{\xf9a8{\xd2d5C?~\x92,\xd2\x94B/|\xa9\xfaN\x02\xd0\xaa\xc31\xfe~au\x1d\xa5=r\xae\xb8\xce\x08N\x9drVl\xa0\x81\xffG\x98\x8c\xff6\xd8\xc1]W\xcc\x16\x108:\xf7\xd5\xcf\x82\xf0\x94\x8c\x95\xb1_FL\xf5\xa2x\x0cz\xc1j\x9a\x02\x0b\x19\xf0\x07\x14\x18\x95\xadc6.\x03\x8f\xab\xe0\xdel\xc1\x9a+\xab\xf3<`\xe0(\xae}\xddQMh\xad\xef\x0c\x82\x1d~8rs\x97\x04\x1c\xe8\xd9\x19\x90C]=v\x98\xd9(\xcd\x13f\xae\x9d\xce\xe1\xda\x87*\xa5Eqr\xd6nJ\xc3o\x97\x89\x00\x8d\x15\xb0Y\xdf[\x83\xc2\xbc!\xd6o\xcb\x98\x9c\xf17\xdb\x05\xf8\xf1\xeemgW\xcb\xaf\xce7@\x17\xb5\x14A\xb2\x8d\xc6\xbb\xca\xa7V~\x1d\x00\xe2r\xc4c\xf7AU\x88\xfe\xc4\xc3\xf7\x84$Q\xa5(\xc0\xc9\xbc!\x0b\x7f\xc8\t+*\xd6\xacb\x89M?\xf9\x14{`\x85\xcbG\xc8l\xf3[\xe3\xc6\xbe\xb1\x945w\x8d\x11\xec,\xbe\xeaO\x90]\xe5!\x89\x18\x12\xa4X\x032u;\xba\xa4\x1aW\xeb\xd8\xa94\xe0p\x9c\xbdR\xc1\x99\x1d\xa6\xf8\xb4g\x8c-\xc3pH\xf0\xdd\x9cd\x83\xe8\xf1IyuXa\x11\x1do\x10\xf7\x1a~\xe0CW\xdb\xeaq\xa3&\x83\x14b|\x9b\xbe\x9eQG\x1b\xa6_r\xa7\x8c\xf5\x8a\xa5\xdb\xf0\xc77\xafD\xd5?\xf7\x92W0\x9e\x1a\xf2/\xf8>3\xb7-\xd0\x0e\x91\x95\x82\xfe!\x02)\xc8\x8a\xef\x15\x81[\x8f\x7f\xa7^\x87\x83\xc7Q~Hnj\xeajY\xbe;\xdc\x8b m6\xad\x90\xee\xb7\x99\xed\xeb=n\x8b\xe0\xc6w\xecc\x84l\x95\xa9\x18\xbe\xa2\x95\xbd\xe3\xc2\x16\x82\x01\xf7\xf2 f#w\xb2\xf2\xf9mT\xa1\xd0\xd6u\x04\n\xa1\xa9\xa7>?b\xbc\xb7\x9dG\xa8\xc7\xe3\xcb\x98\x05\xd6\xca\xee\xe8\x04\xb1V\x96B\xdb\xa8l\xabw\x8c\x07\x04\xae\x1b\xf9f\xd7\xae\xea \x99\xc14\x06\xb5\n\xd6\x14\xf6\x13\x8b\xd4\x80,iE\nYq\xd2M3*\xe1\x81\xf2\x14\xd2D\xbc)\xb4\x90\xaa\x08\x823\x86\x16<\xea\x82\xb7\x12\x81\xc5\xc11\xad\x95\xd6Q\xa58\xb3L\x97\x90\xffk\x13\x80k>i\x17\xab\xba\xf6>C,x+/\xc2SF\x9a\xa6\xd0\x94\xc9.\x11\xc3\xe3\x03\x10>\xb4\x08a\x00\x18\xca(N\xf8b0=\x17|\x8f\x03\xc2S\n=\xbe7{e\xf4(w\xdaV\xbe]E\x0f\xe9 X\xe2C7]\xc60\x04\x86\xefr\xc8\xe7/\x8d\x17\x94WI\x9b]U7\x14\xa0\x04]2\xf4\x95\x97\xdd\xb7P2\x9cT\x99\x95B>X\xde\xacvf\x8b\x13\x1cG\x0f!`\xb6\xeaUmq\x8c\'~\x89\xba]\xa2\x97a~\xb2{\x86O=\xd4W\x9c\r\xf1\x9d\xd03\xc7\xc2\x10\xfa\xc5u\xaa\xdbI=+\x9f\xaa\x86\xb0\x9c\xd0]\x11\xb6\r\xc0\np\x98\n\xc44\xfcs\x7f\xc9\xbeCo!\x12\xf8\xf7]\x97\xba\xfb\xef\x8b\x18\x81\x1a$\x057i\xec\xe7\x17\xd1\x8c(\xe0\xe3\x08\xab\x828\x97\x95\x0b\xcb\x05\xedCv\xd6w\xf2Q\xbe)\x8ck\x90-~\xf01F\\\xban\xed\xa47\xfa\x04\x84A\xbc\xa6`\xa0%w\xd9\x04\xb6\x1b\x16:s\xc6\xaa\x0f^G\x9d\xb4\r\xe6s$&\x1e\xa0w15r\x9czt\x19O\x14\xac!p\x11y6p\xa9\xbd\x8a\x86\xec\xe4\x00289;\xf0\xaf\xd0%pp\xe7\x98\xe5\xb9\x1e9\x0c\xce\x81\xb4\x12z\xe2L\x8el\x86\\n\x0e3\xbf\x97\x1c{?\xc6\xf0\x14U \xcb\xb1\xad\xc8M-\xf0\xad)]cnV\xb3\x9c\x00"\x9b>\xf9\xb9(\x14\xed\xfb\xaa:\x94\xcf*\xb1*W\xecV\xc9M\x18 N\xce\x9c9\xd3z\xf0j\xb3p\xc0JZ9\x06-\x9c\xdf\xa1{+\xefI\x8d_)$\xa488\xce\xf2\xfd\x85K\x02\x8f\x1d\xc9}i\xc4d\x01P\xa0\x99\x1c\x92^2\xf6\x05hT]P\x8e\xa4U59\xcb>8\xd2\x0ec\xe3\xdd\xad\x9c\x9dy>\xbcMC\xe1>\xfb\xcf>\x9f^\xdd\xd2-\xcc\xf4\xcb\x1b\xb9j;k\xc2\xf5\\\xb31\xddi\xa4\xffx\x86\xee\x1a\xbe\r]\x9d\\\x0f:\x01\xef`\xed0^G-\x83\xcb\xb9h|*H\x7feX\xd2c\xfe_\xaa\xac1)\'D\xc9\xf1\xc8O"\x006\xab\x8c\xbe\xabh(\x08\x80E*8\xb2a\xaaN\xb5\xe1:\n\xd9\x9c\x96F\x12y\xf5Z\x90\xe0\xb0\xe8\x87A\xc1\xbb \x9e=\xb7\xc4 \xff8\xfcW?\xa1\xe3[3\xc4\xae\x8dk<\xf1\x17\xc3\xa2\xc4\xd0Eh]\xff\xd8\xedL\xf0\xd2\r1\xd1\xfa\x15abw\x8f`\xf7\x7f\xe3\xb9|\xf8T\xda\xb6\xd8\xd6\xc8\xab(\x0f\xf7\xe1\x8a\x06\x94\xdbm\xe9\xc8\xdf\xb3\x1d\xe1l\xfa2\xa0\x99PU\x8eN\xd9\xd6\x93\xfd\x8a\x83\xccP\xc0B\x81\x96\xbe\x0c\xe6#d\xcfml\xfe\xb3\xce3:\x9d\xa2\xab\xda\xff\x15\xad\xaf\xee\x00[\x82S;n\xf4\xa7\x13`\x82\xa3\x14\xd0\xa7\xc4\xc0\xea\xfb\xf6\xb7\xf5Nm\xe1\x0f\\\xc3\xaa\xbc\x15\xeb\xe8*G\xb5\xbc\x1c\xdc\xe0\xfa]\xa9\xd4Q\xf4W\xba\x9d\xaa\x8a\x9c\xcb\x1b>IBM\x0e\xcfB\x8bv\xa7\x01\x19x\xde\x07\xb6\xbd\xe7ec\x85\x01\xc1L\x8a>\x9cK\xb0Q`\x84\xa1\n\x11\xdf\x8c\x8f\x11\xf6\xb3\x95\xa8\xeb\xc9\x9a\xdf\xe4p\xa9\xfaG\xd7\x84\x02\xe3\x15\x02\x8c\xf9(|\xd5i6LX\xcf\x1e&\xb7\xc1]\xec\xcb\xee\xbd\xddB92\xb6rv\xe2\x02\xd4\xa4\x1e\x85B\x85\xd2\x82W\xdd6V\xc49Y\x93\x18\xe8h\xbc\x154\xfaT\x8d\xddyRk\x0e\xee\xdb-b\x9c#\x9e\x8b9z\xaa\xb2\x8a\x18\xf5\x9b}\xb9\xbbj\x9e!>&\x83H\xa1\xc6jcC\xc3R\xfb\xf9\xe2^\x80\x1fK\x97\xca\xe9L\x9d\x18\xa6\xd0\xbb\xe0\xcc0-\x15\xe6-\xbfcy\x9fx\xd1\x86\xb5\x1fo\x07\xe2\xe3\xa5\x89\x89\xd5\xc2s\xde\xcd\xea2\xf0\x16e2\x95\xe9\xa15=Y\xe0\xb6\x876}\x0c\xfdi\xa3\x01\x13\xe3lWCU\x18\x05E\xb4\xb2\xae\xcfC\x17Rd\x8ct\x145\xe1\x11\xb2d\x7f~CS\xb6\x8f\x14\xa9\xa1\xa39\xf9\xeca\xbcB\xd6QT\xae\x02\x99U\xd7\xa8*%\xfb\x0b\x85\x99\xa2\x91\x86WRZ\xf2wc\x81\xd2O\xe5\xcf\x1f\xf8W\xa2\n\xda\xca\x0b\x18\xd8\\B\xfc\x05_\x0cz\xfd\xec\xda\xc4#\xa7ic\xdb0\x9cM#\xb1\xae\x05\xfe\x81\xec\xc9\x8b\x81"\x00m\xc9\x14\xf8\xbf\x85q\x98\x11\t\xa7\x89F\t\xd0\xe7\xa7\x81L\xa7S\x1d\x87\x15i^\xde\x87\xc1O\xe0#\x85\\Q\xce9\xda\xa15\xe4\x05%\xccz\xf5\xbe\xb3\x1a\x11\xe4\x16\xb5sS!\xca[\xf7\xba#\x91.\xf5Ro\xc6\xbfw\xcbJ\xd6\xb8\xb1\xcd\x8d\xa7\x96\xa6\n\xbb\xe3\xd7\xc9\x06s\xc3x_\xc0\xce\x10L"\x14\x15\xf6\xf4\x11\xf5\xa8K\x96\x08Sd\xdd\xd9$\xd6M\xc64\\\xdd\xd4\x95\xc4\x19\xb7K\xbd\x00\x19.\x89j\xc1\xf3\x1e\xf6;} \x16\x04\xe9\xb15\xbf#5\xe6\x80)\xebOs\xe3S\xb7\x85\xbc\xcdk\xb9\xbb\x8a\xcf\xce\x1c\xf4\xda7u\x96%\xe9\x9brA\xbe\x8e\xfc\xb4\xc0]\x84?Y\xf7\xcd8R@y\x01S`iW\xf1\x9d\xff<\xfb#\xfb\xabHW\x7fB\xee\x8d\xb7\ro\xa2j\xfc\xaf\x85\x19P\xc1\xe2\r=\xc2D\xdb\xa2h\xf2x\xa8D\x92\xed<Li\x01\xf1g\x87\xb4\\\xcc\xda\x96YE\xfc~\xf7Sx\x08\xea\xcc\x9e\xc6\x8c\x88g;\xf3\xa6\xce\xad\x0f\xb0\xbc\x1cE\xbdG\xfdk\xd5.\xe0HOz0\xcc\x00\xcd\xd5\x92\x10\x95\x8b\x02\xd1\x93\xc5\x9b\xb3\xa6\x1b\xd8\x8f\xa2O\x9f\xe9\xf5\xf7\x80\xbdbH\xee\x93\xde\x88\xd3\xe7\xcf\x0f\xeb\xee\x81\x98\\\\\n\x1f\x83\x95\x05^\x88\xca\xc0XD\x16\'\x99\xe9"W5\xf5T"\xf2s\xd5\x9d\x0f\x8b\xa5\x93\x96\x92\xe2\xbbAV\x11[\xe1dc\xc7\xdc/\xc1\xe6\x81\xf5\x818\x1a\x9a\x0f\x1ac\xdb\x82\xd4\x03\x9c\x04\x9e\x83\xcf\x9a\x977\x14\xb1r\xab\x18{W\x9b\xfa\x87\xa3>\xe2\xbc\x97\x1a\xcc\xdf\xe7\x98\x01|\xaa\x90\xb3k^\xa0i\xf4\xcc\x0ev\xbfv\xf1\xb7\xcc4\xae\xfbj:\x80 \x88\xb9s:bT\x06\x04d\xd6\x04\xe9+\xc5+j\x7f\xea\x1a\xcc\x0e\x82\xec\xf0\xeb\x1a1\x0b|\xdf\xae\xcf-4\xaf\xd7\x07x\xa3\x88\xaej\xc43\xcd\xaf\x1cG\xda\xd8\xb5\xa1$y\xac\x0c\tB\xdd\xa2\xb18<\xc7/4\x8enN\xbb\x1dJV\x89\x94\x86l\x85\xdb\xe4]\xd8\xf6\x16q\xbdciU];X"\\\xcf\xcar\xa3x\xa5\xab:\xa7\x12/D\x8a\x03!\x0e\xfd\xb4*\x1a\xb7\xc6\x08\xf6\xa6\xb1!\xa6V\x87p\xc2\xbf\xba\xf9\x8b\x8b\x9d\xb91\xfb\x9d\xff\x06\x8fn\xafh\xd4\xf5\x89\xfd\xf1n\xd0\n\xdfT\xd6\xdd4\xb7\xb1;\xd0\xa3\xf69Q\x87\xd5j\xae2\xad\xde\xbc\xd9|\xb5\xba\xd1\x83\xad\xc7\x99\x9c\x80\xde\xbf\x0e\xedO%\xb9\xc01\x87\n.\xdb\xdc\x96N\xcf(\xda6k\x90\x15\xf2w\x83-\xb9\xab\x96\xee\xca\xe4\xe3\xfa\xc5o\x8cf\xba\xa5\xea\xbf\xfb\x87\xa9\x81\xd05\xc4\xc0\xab\x1e\x1f\xcfuZ8N\x9e\x9d-\x11\xb3]\x13\x00J\'v:\x8a\xe3`q\xf5U\x1b\x8b\x07\xce\x1c\xd7q`7y\x8d\x01\xbab\xcbd!\xfc%c\xe7b:\x11b\xecu\xa4*hxg<\x8a2\xda\x85\x84\x8ee\x85\x9d\xc2|\x83/\x15C`\x89\x8f\xfd\xf9t\xd9\x07\x8a\xb1\x057\xa6[Kl\x03\xbd\xdfk92(i\xbfB\x81b\x9f\xb5\x01\xc9s\xa5\xc86E\xba(\xcc\x1bzd\x13\xd5\xb9\xb0\xb4Ho/\xf9H\x07,\xda4\x1d\xa7M\xf3\xb5\x92\xcf\xc4\x97V{\xe2\xe2\x1e\x1e)g\xc72\xcaT\xa5\xbc\xf4\xde\x81.\x84\x8aL\xde\xc9\xc0\xd3[\xe2\x84V\xa1sP\xc3\x1f\xc9\t\xf2\x0c\xe2\x00.n#\xfap\x9cWi\x8f\xfb\x80\x81\x95\xd4\xcd||\xfd\x068\x94mk\xce\xe1\xb7\xdf(o8\xf8\x95Jb\xc0%+nWE:V\x1f\xef\xb1@\xe9\x9c\x113^\x03K|Y5\xba&\xccu\t?\xa5\x1cn\\\x93\xe8\xf1\x05\xcd\xb9<\x8a\x19\x8d\xed{\xae\xf6X_\xc9z\x8e\xfe%RK\x7f\xe9\xafQ\x02\x83\xb9:\xc3\x164\xd3\xd3=K\xa4\xf5\xdc\xb4j\xc6\xbc\x0b\xf1\xc7\xcb\x98\xbdo\xb21\xc2\xcev\xe0\r\xd4\xf1\xf0r\xf9y]\xb3\x89\xc6\xf5(\x13\x9f\nR\xb341=\x9eBR\x8do\x88\xf5u\x8f\xacdP\xe8\xc8\x83\xf3\x0bG\xb51`<\xba2\re\x13\xbf\x01X#iJ\x86B L^\x0f\x9b\xa9\xa4k\x16\xc4\xdc\x80[\xf4\xe2v\xed\x06\x9b\x05h\x82\xc9,0+\xae\x99\xdd!\x1ci\xb1bu\x83\xcb\x14\xe8\x81\x8e\xd0\xc4h\xdbs>\x97\x92\xed\xd5\xc3\xc2\xd2~\x88\xf8\xa8\xdc\x82eLMe\xa5\x9aZ\xec\xcbH\xdc"\x04m\xd9\x1a\xb3W~\xf5@+\x91z\xc8\x93\xa5\xb2\xfeW\xe9\xae\xa1\xa9\xcb\x0f\xa8\x05\xdd\x9a\x9cqOES\x1a\x06\x04)\xc1J\xe2\x1c\xc9\xc6.\x99t\xf6\xcf\xfa\xef\xd7(\x89%n\r\xc5\xbb\xb0\xd9+n\x14\xb2G\xb9<\xf7\xbf\xa2\xe5\x8f\xb8;"ut\x03\x17\x01`8\xc9\xf2\xd14kcy\x86\x10Q\x00\x84\xc2`\xf0\xa7\x83\x81\xd1\xbb\xfa\x8a\xdf\xf7>\x86\xd3Z\xc8\x9c\xfb\xe6\x81\xcc_\x10\xc7\xcd\n\x03IrgNL\xc2\x00k\rE\xdf\x00,\xad+:\x96\xaa\xa3\xcbV\x91\xfc\xe2\x19q"\x17\xf3\t\xe9 \x90P)Nl\x84\xa2\xabx\x97N\x96f\x1d\xf4{J\xa3\x9f\x80\x19\x9f\xf9\n\xae!#I\xb8\xf6\x08\x07\xb7\x1d\xd9\xc9\xe0L\x0c\xdd_\xe4\xae\xa0zh\x0e\x93\xc7\xd7\xb1W\xa4:\xef<p\x19C\xa5\x80\xeaj\'\x97\x9d\xf14"\xffX{\x1d\xc8\x8e{sl\x8e0\xa7\x92\x0c\xc7\x91\xf2\xda\x0e\xbf\xc8]\\\x8ef\xb3\xe6Y\xc55\x0cJD-J\xaa\xb7\x845\xa8a\xaar\xf6\x89\x85\x8c\x91-]\x9a\xa0Qa~\x19b\x94lK\xc9\xc1\xda~;\xcb\x1a\x0f\xdf\xab\xa8|\xd2\xde\xbdL\x8c\xd2\x00\x98\xbe\x87\x19m\x1a\xd2_q\x1c$\xe7f\xbd?\x03\xebK\x9f9\x84\xbf}\xb8c\xb3f\xd1\xf1t{V\x88S\xc2\x92\xac\x9b\x07\xb6|\xe64\xdb\xe5\xae\xcauD>\x13\x80e\xb6\xc6\t\xaffy,<A\x17\xb3}\x150\xbb?\xa7@%X\xf5_84J\x8c\x9f!\xb6\x04\x7f\x8d\xea4\xe3\x12\xec\xab\xef%\'K\xb0$\'\xcf44gVd=\x95\xa2\xda\xfe\x11\x07\xd0\x00\xf8[\xe6\xb9\x83\xeb\xf6\xbby\xd5\xc8fq\xde\x00(3?\x84ip)v\x98|\x87\x90M\xa7\xbf\xfa\xe5V\xcd\x03\xb3R\xeb\xe9sh\x8cA0\xc1[e\xdd@\xc7k\xb4p\xcdM\xbb\x12\xa44\x85\xbcP\x8cT`x\xcf[\xacn\x925\xe9\n\xd5~\xef\x08\x02\xb3\xe6 \xcf$\xbe\xddE=\x87*\x1a\xe7\xdfs\x00\x87\xf1\xfb\xec\xa4j!9(/\xec\\\x9e\x86x\x16\xbe\xd2 \xa1\x06\xb7\x0e8\xf5\xc7\xdd|\xe7|\xf4S\xd7\xc0T\x15\xd5tZn\x9eG\x0e\xa3\xd4r\x85\xd0\xb2f7>\xd0\xc2U\'\xae\xf3$:<R\xa4\xf51V\x11@\xc8\xbcj\x90\xaa:\xd5<\xa9\xa6u&\xf1\x8b\xac,\xca2<\xa3\x10\x89~\x14\xf1\x99\x07\xa4\x93)\r\xee\x06x\x8d\xf1i\xbb(\x7f\x96*\xda\xf9\xc9\xcf\x80Ci\xd2\x96L\x7f\xd8\xf0\xa5\x00>\x0f\x12\x97\xd4\xd7|\xc5\x1aOM\xdf\xabG\xcaN\x1c+W]\xd5\xe3\xcb\xd3h\xb9\xa4\x8a1\xa4\x1d\xae\xafI\x0b\xf7\x0b\x91m\xf4g\x049L\x98\xfa:?\x05K*\x83\xc3\x9f3\xe6Kz]\x12\x13\x9a`\xcc\x95\xacyM\x93tsLT\xdbR6\t\xf8\x93F\xe4\xe17\xbc,\x0b\xa8\x96\xada\xb9\xa9\xda\x1c\x93J\xd4\xf3\x15\xba0\x1b\xbbc\xb5\xbc\xa9;|\x9b\xe5\x90\x88M\x91\x11B\r\x12\xc2E\xa9\xe4F$ j\xdb\xd1\x95E(\x1f)\xfa\xedj\x18#\xbc\xe4\xdaP/\xba\xb4\x9b*v\xe3\xf6\xad\x14>SV4B\xe5\x98t\x0cc\x94C\xa0R\x0e\xb3!\xbav;\xf7\xe1\xbf\x8b\xfb\xd0\xdf\xe9R|C\x05\x7f\xb2h\x13\x07id1]\xb4\xca^3\xedk\x9dD.,\xc7\x06y\xa9um=\xd0\xce\xbe\xf5\xf9\xcdS\xa0\x1a]\xb5\x18BCH\xd3=\x90[\x85jW\x02{Y\x14\x10M\xc5\xcc\xd9\x0bP\xd2\xb2[\xf9\x03\x17h}\xc7\xde\xe6m\xa04\x95v\x80\xf2\x9f2\xe1\xe6\x84r\xa3\xbc\xebH\x1f\x8d\xe0\x9d\x9e\x9b\xf4\xeb\x9a\x1f\xab\x95\xedzf\xf2\x8e\xc2\xc6\x945\xd0\x8a\x19\xc0\xf9\xac\x81\x81\xd7\x1f\xde\xa6\x19\xe8\xb1\\4rm\xa4\xa9f9\xd1\x8d\x0e\x07\xa3\xaa\xd3V\xc5\x95\x89\x90\'5\xd1\xac`\x9bo\x13\xc8\x89\x170\xe0\x9a9\x89\xcc\xa9\x8b\xfe\xe8\xa1\x1eF\xbb\xd1y#X\xde\xfb\xd8\x88\x04\xff%\xa3\xc46\xd1\xfa\xa3\x08$\x1abC.-\xcc\x8c\xbf\xe2nPRt\x89!C\xad\xf0"\xe54\xdb\xed\xad\xde e\xff\xf9?\xa4T\x9c\xb7eV\xcc\x14\xfaUi\xad\xa0>\x9b%u\xa5\x17\xe9\xd6\xab\xb2\xbc\xdb\r!\x15\rU\xe8\xb0\x90\xad\xe3>D\x10\xcc@=\xb8\xf6\xc3\xc8\xb8\x0e\xbbo\xd3KI\x11h\xaf\x9eL,:\x91\xc8\x94 \xdfg;\x81O\xa3!\xcc\xbfi-\x97!/\x0cs\x9c\x87\xcc\n\xd3rq\t\xecT\xf2\x893\xa3{\x82\xd5Dq6.\x8e\x9f\x0f\xb6\xafv}\x93\xc0\xba\xd6\xf4)\xbe1\x11*3\x9c}\xff\x1c\x05\x81\xc4R\xae\xa3#y\xd1-\xc6\xf6\x98{eg\xe8\xc8BEU\xfd\xd6[\x07<\x11f\x8e\xe3c\xeb\x7f\xd2\x12dX\xda)%|\xfb\xa4\xea\x188\xe2\x85\xc5)\xfc\x96\xe6?\x06\x97\x85Ns\xf1\xa1\xc2\x99\xeb7\xa1\xdb\x00\x9a\x17\xb6\xee\x9f\xf5E\xfc\xc4\xf9h\xaf\x87x\x126I\x18\xd6[\xb4\x0co\x8a\xac\x036~\xe1P p\xec\x06Y\x8a.\xdd\xaf\x90\n\x16\x84b\xa7\x9d\x1a\xee\xf6\x9e\x15l`\xc9\xb8\xe9\x1d\x1a\xae?\xeb{\xb9\xfcQ\x03)(\xba\xbd\x03\xf7\xac\xad\xa0\xb3\xf6=\x90Y;\xcc\xc9\xce\xc6\x12eY\xb6\x03L\x98\xdf\x8d\x1c\xe9\xee\xa4\xfa\xbe<\xcd\xdf\xd1\xe6\xa6`#\x1e\xe5\xd7OC~~fc!G@h\x1dR\xb6\xe9T\x83\xe7\x06\x9b\xd2\x8eJ8GHx\xb4\x1c^\xe1\xb0bs\xdcM,\xfb\xc7\xd1P\x03\xf6\xc2d4\xf1\xb2\x157>t\xb8\xea:3\n\x88\x8f\xde\xc4\xdcK}\x88\x8dBh\xa0G\x81q\x9c.0\xb7pTDYX],xg\x08\x1a\xfe_\x99\xf5\x0b\x88\x02^4\x1emeB@F\rj\xba\xe2\x03\x1b\xca>~l+\x07{\xe83@?x\xdd5\x05\xcewP\xcf\x15\xfd\xb9\xd6\x1d\xb4\x0cL\xfbx`T\xf5\xf9\xc1\x15\xce\xa6\xd3yV\xe7\xed$\xe5gu[\x18\xa5RgGO\xbb\xc8\xa5\xe4\xf1+\x9ey\x02MA\xc1W\x02M=\x1e\x1a\xf2n*\xebSM\xc1\xd7Y\xae\xfcE\x94v\xa9TNT\xf4s\xe5\x17[\xc8*\x06\x90\x14\xda.\x1d\xca\xec\x01X[\x8f\xbf2{\xec\xda\xb7\xeee.#\xef\xfa\x05\x1c\xe6\x1d\xaf(|\xb0p\xc4\xa1\xf1[w%\xd9\x94(MV\xc5\xbb\x91\x85M?\xa5#`\xe4\xa0\xef\xf1\xb4\x04_S\'\x87v\x8a(`w\x180\x7f\xc8W4\x84H\x1d-n\xe8\xd5\x17\x8f\xa1\xcc=\xaf\xe8KQ\x9f\x17\xaa\x92\xd2:\x19\xb7\x16\xfa8\xf9\x1di2`<\x88\xc7\xfb\x9ak\xff\x9a\n\xc5\xb5D\xc0S\x8du\x02e/H\xca\xb4z9z\x05\xd9\x9f\xe2\x1e|9-\x9d\xc7\xc5C\xfc\x15_\\\xb2U\r\xfd\x02:\x84\xdf\xfd\xb7B"q\xfc\xc7>9C\x0eFi\xee\x8f:\n\x973\xd5\xdc\x1d\xbf\xa4|\x95}\xf5a\xe6\xb9\x1asg\x11d~\xfc=(\xe4Dxs\x190>\xf8\xf5\x9f\xd6\xcb;\x84\x90\x1e\xd60\x11tD\x8b\xac+\xe6\x95~\x01\xd7\x16\x9b~\x12\xaf\xae\x82\xcb\xa3>\x9d\x1b\xd8\x13\x8c&\xd0(\x19\xbb\xfc\x01\xa6\xb1x\xa1\xa3}~S\xd5a\x8c\xc3(l\x8d[u\xe8\x7f\x87\xe8\xa9y\x16\xf4\x08\xaf\x15\xdc\x98\xff\x02\x01\x90kG}\x8c\x8b\xc9\x98\xdd$s\x8b\xdaX\xaa\xd6\r\x10\x83\x1c\xee\xb9\x07\xfe{\x00\xb9p\xfe\xcc;\xbd\xaa`=\xc0\xb5Sqk0\xaa3\x1d\x16\xb7\xef\xea\xf5\xe9\xa6\x9e\xf3\x90\x0cr\xea\xf3\xfc\xdfM\x95\xe0\xd6G%\xf0\xf8\xc3\'\x18\xe1\xc2\x01<\x0f\xb0\xf1_-\xa3\xd7V\xeb=\x90\x1b\xeb\xf90fP/a\x8a/w\xbb\xc0\x07vtJ\tCi\x94\xc0\x9a\xf3\x19@7\xc2\x00\xf5&\xc2\x85\x8c\xe8\x99{)\xc2\x8a\xb3\x9c\x9e\xe8\xa8\xcc\x1c\xcd\xe7\xbf\xa4\x1e\x13\xd3\xec\xf4\xec5\xcd1y\xa82I\x18\xe8D|\xae\xd5\x1b;L\x89\xe8\xc5+\xd1p\xb5\xad\x83wZ\xe3\x8a\x9dm\xe7\x88\r_\r\x8d\x99\xddsa\x8d\x98<\xedx\xfd\x1d:Y\x86\x83\x95\xa7\xa4\xd7\xd2w63\x87 I\x00\xc9H\xa1\xee\xe8^\xe8K\tQ\xe168\xbc\x00\xd8\x9ah\x8f\x1f\xac\xc7\x0fF\x11\xdd{\n}\xb1#\xef\xe4\xab\xc6\x02\xc3c\xa6\xe1\x9a\x08`\x89,\x96\x9a\xf8\xad\xeff\xc6\x1a[M\x11\x07x`\xe0\x94T\x12\x12\x1eW}\xd2jn\xfb\xc1\x07\xf9\xe5\xfe\xc2c\x1eJE\x8e\xbf<\xe1KTn\xf8}*\xc2\xcaV\xa7\xf7\x12\xecr\x0e,\x19\xee/\x0b\x0b\x05B\xfdg\xa7\xb5\x19\xfa\xd1\x87&\x05M\xa6c\xc3\xd6\xc4\x9e\x85\xed\xb9\x9e\x15V\x1c\xea\xd8\xc9\x80Ts\x16\x99\x99V\xa7\x99\'O\xfbt\x022t\xc4\xd9\x89\x1a\xbe\xb2\xfe\xae\xc4\xc1\x94\xd4^\x13\x9a\r7Y\x18\x89\xcc\x8c\x1d\xb6u\xf3\t\x1e\xea\xfd`A\xa0w\xfc\xfb\x02\x05\xd8{^\xd3W\x17\x06\x13\xe79\xfb\xb8\xeb\x86\x96S\x9c\xca\xf9&\x10\x1c\xa5\x8d\xa7\x06\xc3\xf9\xb4\xd9\xa2\xaa\xfb&5\xff\xc7C~\xa84\x84{0$\xc6\x01\x07n$\x1d\xf5\xa7\xc7\xbf\xbc\'3^H1W\xb5t\x88wJ4\xf1,\xef58\xa2\xc27l\xc1r-\xa3\xc9\xf0*c9\xb4-\xc3\xe7U\x90\x9a}\xe7\xdd0\x83\xe3\x88\xf8\x91>\x13\x14\xeb\xe4\xad\xcd>H.\xbe\xacr\xa1\x04\\\x11@\xb8b1\xff\xfb\x1c\xe0\x9dQ\xae\xce\x18 K\xf8m\xbd\x9fd\x86\xa8R\xd5X\xbbw\xce\x8b\x9e\x13\xe3\x1dK.\xbe\x1b{p\x16-\xbe\xfd\x0cU\xed\xd6\x9b\xe3\xa0\xe8\x04"T\x87\x88\x96=\r\x8by?\xe5\x8eE\xf1\x00ePL^\x12\x93W\xf5y\xd1\x01,\xb2\xe2k\x8aT\x01\xb1\x8aC;[\xba\xc2\x16\xda>jaM\x83q\xc9\x16T\xa7\x97\x80=\xe7))Q\x96\xb2\x05\'J \xf5qO\xc9>\\\xefi\xea0\xb4\x86v\n)\x050\x98\x00/\x1a\x83\x84jt\x14\xf4\xa8\xcd\xe7l\xa8\xab\xdc$\xd15\x82\xaf\x90"v\xfd\xf7\x9a\xd6\xc9\xcf\xc6t\xf5\xb4\x8a\x07:\x97u(\x07\x9bg%\x92m\xbf\x81\x98@\xbcr\xa6\x9e\xd6Y\xd2/\xb8\xacj\x97u>\xd3\xb8\xfe_\x08]\x15\x16\x15{P\xd3|\x19$\x11m\x10\xeen\xafgDq\'oI\xd44)\x18\xb3m|\x01\x8bI\xe09\xdeo,\xbeA\xdcJ>\xd3!yJ\x13\x13d\x8c\\EK\x17\x00\x9b\'\xbc\x96\xf9\xe1H\xd2\xf0+R;\'\x07\xc9l\'\xaa\xa1$\xfb\x8d>\xecM\xcc\xf4\x9b%6\xe2\xcd\xcb\x18\xe3\x05\xff\x96\x8ad/\xfd\x96r\xb9Zg\x0c\x8c`E\xe0\x14u\xa6\xd4\xc8\xb2\x88\xb4i\xfaUo;\xa0\xc2\x8c{\x13\xb7+B6B~\xae0t\xf0\xad\x8e\xe8vG\x0b\xd2\x7f\xc3\xb9"\x8el\nZ\xf0Au\xb9\xa0\x19k\x1b6?S\xc69\xa8\xe8\xfb\xac~\xf3I_3Dh\x81\xef\x1a\xeb\x04\xa6\xce\x9b<\x02\nsG\xab\xf0s]\x03\x13\x87\x00.\xaa\x17-\xd3\xbc\xf9\xc9\x86\xdbb#L\x9f\x01oY\xecL\xf6MK\x1ek\x04\x0e\x94\x92\xe0\xbe\xc4\x89"\xda\xd8Sj\x06\x89\xf7\x9f\xd8\xbc\x84\r]\xc2\x02\xd9S\xdeJ\x82]\x99e\x10\xf4\xe8.\xfe]o\xfc\xa8\xd6+d\xcd\xdd\xd1\x1aAx\\\x8eI\x07\xfa\x86X \xa5\xb3\x16\x90g\xa3\xc2\x9bD\x9aK3\x7fg\xfb\x0f\xb2\xd4vS{\t\xdc\x97\xfb\x13\xb9\xa0\xfcx#\xc5|2\xe3$\xb1\xae\r\xacG7\xe1B| \x87U\xd3\xff$\xf2DI\x18\xa1f\xcd\xbb\xe4\xb7\xf6\xa1W$\xac`\x07\x14uWF|\xc7\xb0\x92\xd1\x08\xd4\xe9\xef\xb0\x8c{\xa2Bb^\x83\t\x1fq\xf4\xf1G\x97\xad\x05\xe3\x8f\x1bM\xbf\x18\x90b@\x17*:\xc88\xa4\xb7r\xea\xff*\xdd\x0c\x92\\W\x04\xe1\xddk#\xc3\x7f\x85\x00M\x11"\xc3\x85Zl\xaaX\xa3\xef4\x8e">\xe9\xfe\xc4\x04E\xa3Y$\xab\x7f\x8c\xd3\r\xfdGAwC\xe8\x00\xe6\x19C\xcea\x8d\xd8\xb3\x9ez\xa0#g1\xa6\x89\x1c\x99\x03\x9e\x06\xd1\x8c\x98?5\x10+\x9b\xd8.S`\x94\x1b\xe4\x1b\xecc<l\x02#\x141\xb6\xa8\xf8\x88?B.g\x82\xd1k\x9c\x0c#\x7f\xa0Zpq.\xef\x0f7\xd2J\xc9\xaf\xcc?\t\x00f>\x87\x97~e\x9e\xa9\xbbN\x15\x96\x91\x1a`')
|
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
|