hiddifypanel 3.0.0.dev63__cp38-cp38-manylinux2014_x86_64.whl → 3.0.0.dev65__cp38-cp38-manylinux2014_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. hiddifypanel/Events.py +27 -4
  2. hiddifypanel/VERSION +1 -1
  3. hiddifypanel/VERSION.py +1 -3
  4. hiddifypanel/__init__.py +7 -3
  5. hiddifypanel/__main__.py +13 -3
  6. hiddifypanel/base.py +88 -3
  7. hiddifypanel/base2.py +40 -3
  8. hiddifypanel/models/__init__.py +10 -3
  9. hiddifypanel/models/child.py +26 -4
  10. hiddifypanel/models/config.py +105 -4
  11. hiddifypanel/models/config_enum.py +207 -4
  12. hiddifypanel/models/domain.py +106 -4
  13. hiddifypanel/models/proxy.py +55 -3
  14. hiddifypanel/models/usage.py +58 -3
  15. hiddifypanel/models/user.py +171 -3
  16. hiddifypanel/panel/__init__.py +7 -4
  17. hiddifypanel/panel/admin/Actions.py +170 -3
  18. hiddifypanel/panel/admin/Backup.py +80 -4
  19. hiddifypanel/panel/admin/ChildAdmin.py +122 -3
  20. hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
  21. hiddifypanel/panel/admin/Dashboard.py +70 -4
  22. hiddifypanel/panel/admin/DomainAdmin.py +195 -4
  23. hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
  24. hiddifypanel/panel/admin/QuickSetup.py +127 -4
  25. hiddifypanel/panel/admin/SettingAdmin.py +224 -3
  26. hiddifypanel/panel/admin/Terminal.py +51 -4
  27. hiddifypanel/panel/admin/UserAdmin.py +277 -4
  28. hiddifypanel/panel/admin/__init__.py +82 -4
  29. hiddifypanel/panel/admin/adminlte.py +13 -4
  30. hiddifypanel/panel/admin/commercial_info.py +23 -3
  31. hiddifypanel/panel/admin/templates/config.html +1 -1
  32. hiddifypanel/panel/admin/templates/proxy.html +2 -2
  33. hiddifypanel/panel/admin/websocket.py +9 -3
  34. hiddifypanel/panel/admin_2.py +33 -3
  35. hiddifypanel/panel/asset.py +17 -3
  36. hiddifypanel/panel/cf_api.py +35 -4
  37. hiddifypanel/panel/clean_ip.py +125 -3
  38. hiddifypanel/panel/cli.py +172 -3
  39. hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
  40. hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
  41. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
  42. hiddifypanel/panel/commercial/__init__.py +50 -4
  43. hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
  44. hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
  45. hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
  46. hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
  47. hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
  48. hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
  49. hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
  50. hiddifypanel/panel/common.py +98 -3
  51. hiddifypanel/panel/custom_widgets.py +71 -4
  52. hiddifypanel/panel/database.py +18 -3
  53. hiddifypanel/panel/hiddify.py +655 -4
  54. hiddifypanel/panel/hiddify_api.py +70 -3
  55. hiddifypanel/panel/init_db.py +393 -3
  56. hiddifypanel/panel/usage.py +85 -3
  57. hiddifypanel/panel/user/__init__.py +25 -4
  58. hiddifypanel/panel/user/link_maker.py +416 -3
  59. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  60. hiddifypanel/panel/user/user.py +233 -3
  61. hiddifypanel/static/css/custom.css +11 -0
  62. hiddifypanel/templates/500.html +1 -1
  63. hiddifypanel/xray_api.py +109 -3
  64. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
  65. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +69 -71
  66. hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
  67. hiddifypanel-3.0.0.dev63.dist-info/top_level.txt +0 -2
  68. pyarmor_runtime_000000/__init__.py +0 -4
  69. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  70. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
  71. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
  72. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,173 @@
1
- # 2023-04-08T15:11:13.675411
2
- from pyarmor_runtime_000000 import __pyarmor__
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\x8f\x1d\x00\x00\x12\t\x04\x00\xae\x927\xb8Z\xdasU\xbd\x0ci\xbeU\xe6(J\x00\x00\x00\x00\x00\x00\x00\x00\xddX)\xee\xf3_^^\x87u\x1cu\xef\x13v\x80l+a\xdc5\xa1\x06\xc0\xc6\x13\t\x8c\'\xaeQ\xd8\xa6}\x80\x89$Q\xc9\xf7\x85_w\x88\x18\xc7\x18\\\x04~?\xb1\xa2)\x97\x12\xbc\xea\x0f\xb5f\x1d,\x17I\xe4t&\xec\x7f@\xc82\xe2\\\r\xfd\xe13\xc8\xe3\x04\xc1\x13\x83\xd2Je\x1c\x1b\xe4\x11=\xce\x8d\xd5>F\x1a\xd7\xa17"\xe7{\x0f\xf1\xaf\x0e9] \x8a\xb6\x92\x16\xd1Em\x19\xdc/\xa9.YK\xe7\x85\x9b\r\xf00\xf5M\xddkO\xe9\x05{_1\xa3C\xf8{\x9agx\x82i\x0b\xc2FGh#c\xcf8\x0eW\x12\x1b\xbe\xb4C\xd1\x95\x8f\xf4v\x9d\xf3\x7f\x13\x05\x90a\xc4\xa9s\x85\'\xa0.0\xeea\x89\x8d>\xb0b\xde\xb8\xd7\xf1\x87\xc4\xf2\xff\x10|Qx\x9e\xff\x9f\xfc*\x84D\xc8\x1b\xf2\xd6\x02\xa6*\x1c\xb8\xe9\xac\xa2j\x93(v\xe0\xe9PnB\xdc\xc8#*\x97\x8b\x8cZ\x87&\xd4\xa3\xe9\xe4\x97w23\xcfx\x1eD\xab\xcc\x94\xb6\x84\xa8\xd9\xc7\xba\x03\rI\xb3\x81\x1bc\xf5^\xb4\xc1\xb9\xa6\xd3\xddf\x96M\x19A\x17\xf5n\xe78\x10V\x14\x8c\x08I\x8a\x84x2.\xf57|\xdc)\x13K\xb7\xaa\x9a\xb7jEK\xae\x88=\x86\x1b\x86\xbf?\xa7SyuZ\xe5\x81*\xca5;\x98x\xe3\x99\n\xa1\xfe\x9e\xac\x17\xd8\xb5\xc9\xa9\x9d\xc0\x11\xacw\xb9\x04\xd0"a6\xe8\xb0\xb9\xbf\xc4\x0f\x08\x9bC\xac\x19\xa8\xb6h\xcc\xac\xe9I\xf4\x8d\xc7\x95\xe2\x13\xc9\x8dJb\xf4+\x0c\x1f533\xed\xda\xd2W\xabs\xb8\x8f\xa7V\xcb\xc45IF\xe1\x12\xdf\x07\xdc\x02\x98\x03\x11\xabm5\xaby\xfb\x15!s>\x1c\xf4\xf7\x15Q^\xcfZ\xbd\xb7\xa1\xb6\x89\xadN^\x05=\x14\xf2\xf5\x0e\xf29Zcd\xb0nS?\xcf\xd4]\x9b\xed\x19\xd3\xa4\x83\x90\x1b\xe6\x80\xe2R\x98\xcc\x12\x0cB\xd83&\x0e\xc6?\x8d\x93+=g\x89:\xa6TB\xe1\x87&~\xae:\xc8KF:\xc3\x16\xa6C\xa8\xfa\x80\xe3\x96\\\xd1\xd9\xc5\x8a\x00K\xe2\xda2K\xa8\xcd[\xc1\xbf\r\x00.\xa5A\xdb\xda\xc5\xf8\x0e\xdff\x8f\xc8\x04\x92fS\xe6\x14\xc9\xb1Q\xd0\xc28b\x9e\x1d\xa1\x93\xce\x0f\x10\xaf<OZNw\xc6\x7fx1\xaej#\xf9\xed[\xf3\xe6\x97\xe9~*.j!>\x19\x0bz+S*SS*8\x8cc+\xe9\xdd\x12C\x97\x14%4\xab\xc9.e\xad\xcb\xf4\x12\xb1\xd7\x87/\xfa\xaa\x0f\xa1J\x87\xa4\x1c\xa6\x0e\x9b\xcd\xfb{\xda\x8e\xa3\x85t\xeb\x83\xd3@\\\xb7 z\x8c\xc2Y\x0c\x17\x9a\xa1F\x0c\xb9\xf2!\x03\x8b\xb9,M\xf1\xce\x93"\xd2:\xd5\x12n\x11\xc3\xbb;\xdc9E\xa2\x00\x00U\xa5\xfd\xdaO\x9cO\xb2\xc8\x80Z\x10\t\x9b\x96\t\xa3\xc4\xa7\x1b\xd0\x9fa\x07\x05\xbd<Vu\x8b`\xde,\x11\x9d\xf9\xb0\xe3!Y\xc2cv)\xc0q\xaat^?L\xc5\x8cA\xad6F\xbb\xd6\x9e\xca\x9dc\x08\x12\xbci\xeb^\n\x13|JQ\x92\x0e^\x07`\x0e0\x05\x1a\xa30\x05\xf35L7\x8dt\x16!\xf5\xd9=U\xc1\x8d\x9c]\x92\xab\xa4wpF\x99?\xd4\x91Z;\xb3rZX\xc4\x81/\x1c.G\x81\xb8\x98\x1c\xd9\x94\xfe"g\x8a\xdf\x1cI~\xec\xfeV\xa1\x911\x9d\xa1zp."@\x8f\x8b\xbe\x1d\x1a\x8e\xb9y\x8b\xaa\xfd\xcb\xee\xc7\x85\xa2\x99\xaa\x00\x94\xadyK\n{\xfa\xec&\x83\xc7\x90Jm\xed\x13\xd9\xb6\xdb\x15)\x8e0\xd7S\x1an\xa3\xcf\xb1\xb54\xe9\x7f\xb2\xf0\xa7\xe2\xe9btV;H-\x8d\x93$G3\xef\x1c\xcf\x13\xd0\xf5\x03u\xb3\xfd\xad~\xc8/\x96\x9b\x92\xcb\xe9\xb3\xedq\xce\xed{\xf4|\x16<\xd1l\x0c\x89mr\xf6\x95ue\xf8~\x05\xd7\x10\xa6d\xb0\xcb#\x1b\xa8\x0e\x8f.\x8b\xe1\x1b\xb9"\x089\xbcCl\xec\xca\xbfj\xa0\xef}\x06\x11z\x04\t\x8e\xb3\x99\xa2D\x08\xa3\x95\x948F\x8b$\x15\xfd\xedYo\x06Vb\x9bH\x8e\xfd\xca?\xe2\xc0I>\xed\x97?\x14~\xe8h\x04q\x95\x17\xb2\xc1\xd1#9\x00\xe2p\xc1G.E\xc3\xd0\x1d)\x05<Y]\x1bBJv\x18H\xacxQ/\x1e\xbaWD\x88\x9d\xc6m\x02\xe7\xb8\xd6\x9b`V\xd4\x1d\xd3\xfe\x93\xf2\xfc\xcfc\x92\xf8\xf8\xbc.\xac\xa2h\xf9\x8f\'W\x04\xc9B\xa7\x0f\xd2\xd5t\xe9I\\V\x99\xea\xef\xa7Ci%A\x19\xc2\x8c\n\xf5S\xa2\xcd\x9b\xbeU\x83~\xbb\xef\x14>i\x00\xb4\x13>\xcc\x94~\xd3\xb2o\xcdO\xafO\x00\xcb\xe2\xbb5\xc3\x9f\x1c\xac\x08\xb3c\xe27\xe6\x03\xf1\xd6\xea1\xceSp\xe9D\xd7\xf1\xb1\x84\xe7\x00\x87(\xdfe\xae\xb6\xfc\x84\x99\xe1\xfat\xbbn\xc8\xca\xa19\xc5\xb1}\xf9\xbd\x12\x0b\x18\x14\xc1\x7f9\x95\x05}\xe6B\t\xe3\x0f\xbd\xaa\x1d\x17\xb1\xf5\xc2\xda\x17\xe7/\xf7r8\xce\xd9\xc8\xda$\xc8\xcaM\xa7Za\xac\xcf\xb9E\xc0%H\x19\x8b\xf3\x0f\xd5\xdcX\x12\xcez\xba\xad\xe4\xa2\xfd}(\xa8\xdf\xfap\xb3\x94\xd4\xbf\x91\xbd\xa6\xcb\xd1E\x90\t\xcd\x83\xf1f\x8a\xba\x80\xda\x81\x98v\xd3\xa2\x99;a\xe3=;\x84\xe06;z\\\x0c\xc2Nr\xed\xe6\x02\x90lC3\xe8\xef\x935\x1f\xe6\x0c@\x08\xb2\x9b\x07\xc81a\xcd\xecO\xf7F?\x98i\xe2\xbd|\x88\xa5\xba\x85Y\xa8\x1d\xf0\x91e\x85m\xbd\x08\n\xf5\x1f\x824\x81h\x816\x1c)\x05\x8c\xea\xd9=\x95\xf6\xa6\x0fl\xea\xa3\x08\x87\r\xc8g\xfa\x06\x90 \xc4\x04\xe6\xd1s\x186\xc1\x13\xf9B\xb0\xf2\xc9\xae\xe1\xda\xad\xadq?\xe0dF\xd5ShT\x00\xe6\xb6\xb4n\xc3\x1d\x03P\xa9\xba\r\xbd\x05\xf1\x91R=\rs\x99\x00\xc3\x85\xf8\x10\xf3\xc0\x87\x18\x14\x17\x90\x7f \x0fA\xf2\x14)&\xd6\xfd\xf5\x80A\xf1Y\xeaH\xeb\xb4z\x8d80\x99\xf8~\xe6\x0fk\xd2\xec5\xf8n\xd2\x88\x1awD@B\xa7f\xec\xa2\xbc\xd8\x19eh\xa27\xe9\xa3\x19\xef\xb8\x87\xc9\xe8i\x01Qx\x97\xa4\xc8\xa8\xb8\xd7\xec\xb6\xd4tiR!h\xf5W\xb3\xc6\x0c\xe8\x04\t\xef\xaf\xbe\xcf\xefn`\xf4\x8d\x02\xe1\x83o\xf3\xa4\xeck!2\x84\xd9\x13\xb1\xe5\xa1\x0c\x98\xd1\x8aZ\x00\xc0\x9b\xc3\xb2\x11\x12\xa4\xcf}F\x13\xcd\x91\x9f\x19\xb4\xba\x95\x12l.\x8fg\xaav\xd0\xac\x85\x95\x8d\x03MAh\xd9Oj\x10\x9f\x0c\x9c\xc8q\x1fO\xd0\xdf\xde\x86\x16\x04\xe36\x9e\x0e\xe1h\xa2\xbf ~\xef>\xcc\xf2\xd5\xa93\x8an\xec\xa1w\xc9\xc7u\x96+\x0b\xb8g\xad`\xd5\x97O3\xfb\xc3\xfc\xff\'\xdaO\x12c\xb0\xa2\xe4\xdf<!Z%\xdf\x19R\xe9\xba\xdd\xd1\x86uy\xd1Y\xd7\xb7\xebH!\xb1\x0cd\xfb3q7>LVwG\xaf\xf1\xb4;\x1d\xee\x97\xbe?\xfeO\x87\x17\xd2\x0f\xbf7\x83\xadr\x0e\xce\x14v[*\x02\xce@B\x82\xbe+\xf2\xbb\xdb\xb1\xfc\xd2\x81\xc0\xe2}\n\xdf\xb8\xeaE\xbb\xb3\x9d\x97\xbc\x90\xb3\x07O\x8bn\xbf"\xc9\x12\xbd\xfe2p\xdbqP\xf2c\x8dp\xcc\xf4\t[\xa8sL\xe3\x18,\x1e\x82w\x88\x872\xb1\x80\xb5\x1d\xd6w\x0c\xfaZ\xeb(\xce\x0c\\\xddt\xb7\x90f\x07\xa7\x15G\x89\x92\xc62e\x1b\xcfE"\xaeh\x00\x8e\x13\xda\x8aTm%\xb9\x0ck<\xaf*\x04\x8dHUn\x83\xb9R\xfa\x0f\xd8l\xea\x89@E\xf7\x8f\x1a]\xff\x90\xbb\xd6\x95\xa0\xef\x90\xfd\xed\x06\xa1_:V\x90%R\x9dCE\xfd2\x13\xb3Ktr8\xcc84\xb3\xc7\xd2;[Xo\xe8ET\xa9\xbc\x13\xec\xf1\xfd*\x1f\x0en.\x0e\xf3\xb3K\x0f\x85\xd5i\xee\x08\xc7=\xcb\x1cK\xfe\xf51\x08\xd5\xb5%\xbd(\x1eC\xfc\r\x14\x98\x85\'m%\xf0G|c\x977\xc0}\x90\x01\xf2W\xdd\x107IR\xfe\x1d\xce\x1c\x18\x816\xfd\x96\xf8\xabq\x8d,3\xb9\xb0mN?Cy\xdd\x0e5l\x9d%i\x03\t>\x1e\x19\xc7\xc7l`~\x88\x937\x97f\x1e\xf8\x11\x086\x1a\xeb\x0fRl\xc5\x1a\xb1\x8f\x97\x80\xe6T\xb3\xa12\r\xeb?\xe9\xf1\xc8R\x1c\xd3\xd5f\xdaO\xed\\\x85C\'\x04\xb6\x1d\xae\xffz\xa8 C:\xdc&\xef|\x0f\xb5;\xe3<\x1b\x0c>\x1d&\x81\xc7\x0c\xd0\xf9a\xc3\x0c \x96OC|?\x86O\xd2\x98L>Oz\xf65\x86\x9d\xa0\xee\x06vw\xff\x8c\xcb7\xfb\xbeB\xafgV6\x14\xabj%\x8a\xdc\x1a\x9fz\x1db\x14\xe8\x95\xa8za7\xfe#\xc9s\xce\xc5\xa1\xc6\x03<j\xe4:\xd1\x13\xbbuc\xfd-\x14\xf6b\xc9\xbcU$\x8d:\x03\x08\xbf\xb04\xf9%\xe5P\xea\xee\x8bt\x9b\xea \xce\xf7\xd1\xb8\x95\xde\xb2_Q\x14\x98\xb1\x04f5c\xbeAW\xc6\x82\x1a\xf6\x13Zq\x8c|\x937\xcf\xc5o\xe9\xb6D\x1d\xfbfS\x11\xb3\x02h\xf5\xdc&\xd2\xf2a\xcb{\x8cj\xda\x97\xf6\x01k<\xbd\xc1"i\x8d1-S\xad\x8b\x96\xc1\xb4\x9d\xcd\x05\x1d\x11l~\xf0\xa7\xf2>\xd0\xfb\xf7,f\x15t$\xb2\xbe\x83.z_\x9c\x00\x85\x9c\x01\n\x9aU\xcb~\x07g\x81\xeaT\x1e\x0c\xe6\xab\x8e\x99\xaeh\x04\x10\x81bx\x8bhZ\x80\x80\xd3\xc3\x18\xe1\xf8\xdf\x05\xce\xa1\x9c\x8bR\xfa+bf\x86\xb9\xd3\xb6\x7f\x93\x8eNr\xa3\x16;,}\x84\xc7\xf6R\xa3\x0f\x1f\xeb\x81\xcb\xaa(\xa1!\n\x02\x04i\x8a\x9a",\xb0|&\x9aW\x16\x16!\xe8\xd0\xbd\xbb\xd8E\x99e\t\xd3\xc3"M\x9dcVb/\xcdT\xbdl\xee\x08\x7f+\xc4\xe43\xd1\xd1\x87\xfd\xfcE\xc3s\xcf\xfb\xa7\xcf\x97D\xbb\xad\xd7\xcd\xe9\xb8\xe52Og\x14\x0e\xe8\xb9\x06\x15)zr\x82\xe9\x16\xf1\xf7\xea\xf7L\xb4\xcd\xf6\x0b\xae\x8eb;\xf69s\xde\t{MM\xf7\x9b\xe1\x1d\x94\xd8\xea:\xb3\x83\xd84\xf4\xe1}\x81\x99\x1c\xd7@\x9a0\xb4\xe0\x1e\xe6\xcc\xb0\x89\xae\xbb\xc9@\xda\xca\x9bL\x90\'@\xed\xae\x07}\x81K\x94\x11\x01\xf2\x0b\xb0u\x96\x18\xf5\xe8\x135\xd5\xdd\xab\x1c\xfab\x9f\x87E\xee^\x02R>\x95\xcd\x9e=wW\x93\x88[\xb8\x17\xed\xb0\xa7\xd2jf}\xb4\xc4\x88\xca\x8e 5\xf8pk\xaa\xd94-\xa1\xfa\x7fn\xe9\xcfU\xec\x9f3\xdb\xc2U\x16q\xde\xa3\x15w\xcb\xb1\xaf\x10\xe9(QKu\xd1\x8e\x0e`a\x80\xe5\x11\x99N\x99n2\xe5\xc9\x9a\xe3\xba\x94\x83K\x1dZ\xb9\xed\x14\xa7\t\xc6\x8dsH\x01C\\\xef\\\xe8\x00YA\x96\x06\xa9\xb7/\x15(\x8c\xa7\x1a\xb3`}K\xe1\xe6\xc2\x9b\xf1y\t\xb0_\xc9\xb0\xa5\xcb}\x9e\x91^\xe9\xd0,H\xa57V7f\xa2\xb2\xb8\x8f\x86\xcc\x1f\x18\x7fe?\xd3\xfa*(w@\x86-\x98#\xc7\x08\x12P\xffG4\x871\x7f\xe9l\xb4o\xa8#7#\xde\x18\x83\xb8\x18 ])!\x01\x86\x9bTs\x16}\xf4\x88S\x93\xa0\x82\xd63\xa7+\x8eB\xe0%>(\x83\xc0\xf4\x83\x9f\xc3uVg\x03T\x81\xaeg!\xd6\xe7\x86\xdd\x95\xbb\xa3\xe9P\x03\x9f$\xa4+h\xec\xcf\x00\x987\xa8S \xa9J\xaf\xae\r\x9f\x91\xdf\x035^G\x84\xdf\xfc\x05\x85\x01\x80R\xd1\xde4\x98R\xd8\xa8\xdd\x01<\x03\xa3\xf1\x92\xea\x13b\x86.t\xc3\x88\x86\xbe\x97,\x13#\xca-.\xcaH\x80{k\xbf\xd2t$3,\x7f\xa1\xb3F\xd8\xfb\x8e\x90\x97pD\xb7&K%\xf7\xc5\xdb\xa4\xf4\xc9c\x0b\xa95\xd6.\xc4\\\xe7\x18\xfa\xfb\xd5c2\xe3\x899\xfc\xf5\x93x\xd8\xff\x03c\x196i\xb0\xddo\x85\x8a\xcf\xe3\xf3\x17\x8a\xb4\x93b1\x82r\xebS\xbf\xed\xc0\xadU\xb7-\xedP\x92n\xfb\x00\xf9\r\xb7\xb5\x18s_\xe3\xf7\xb4TB\xf82\xde\x16\xa6\x99\x80\xd9\x93\xa0\x899p\xd5\xb9\xa8\xa3\xb5Of\x025vm\xd4\xc0\xcbm\x85\xda\x08)h\xd3\x9e<\xa7o\x08\xfb$\xcb\x92\xad\x06W v\xdfh!\xb7\x02\xd9\xfa\x01\xcaeF\x072\x02\x91\x8e\xf3\xa2\xe8|s\x1e\xe7\xc0so\x1c\xfc\x9c\x9f\x01\xf0\x9f\xdc\\\xbb<u?\xa5I\xd9\xdb\xf13\xfc\xcd[\x07O\xe0i\x1e\xf6.-mU\xd6\xf3\xd2\x0fDb7t)\xd3\xc6\xecplX\x05\xd8\xc2\xc0lP\xecv`\xeb\xf4\x9b\x07\xbd\xa0a|3\x00\xdbG\xe5\xef\x14\x92v\x0e\x85JB#\x9e\x19\x16\xa2HQ,\xc9\x0c\xa7\xa0\xd4\xdc\xd9k\xa9d\xe3\xfe!\xffk\xf1\x84\x06\xafb\xec8\xf9u\xe7w\n\xcf\xb4\x00&\xe3f\xf8\x1b\x02\xd3q\x8e?\x82\xc1#\xb4R\xe9\xdf)`\xfd)L\x02^;\x0f \x19\xa5\xaeXn)\xaf\x07\x86\xc6\x03\xa2\xb2\x84K\xfa\xbbm\xf0\xf9\x19\'&\xc3\xe0\xff\xeb\xe2\xf24\xc9x\xe7O\x08\xd6\x95`\x8d\xe6\xf9"\xe9\xa4\xe6\x8e+\xa2\xb9\xe2kdK\x92\xb69m$eL\xbbp\xc5\x11L\n\xd7j\xed@\x1f\x04\xec]C\x87^w\xf5\xde\xfd1u1\r*b\xc7\xd0\x05,\xcbq\xa7\x8b\x1c)p\x81\xeck\xbf\xc3\x9b\x19_\xcf\r\xdd\xeau\x95\xf2\xfao\x88m\x92\xd9\xba1\rj\xa8\xc1\xfeQN\xdb\xdd\x9doH\x01\x92\x1a\xf1U\xac7\xaeX\x8b\x97\xeey\x026\xbf8\x04\xf7"\x9f\xfcy\xc9\x1e8P\x87e|\x17\xcf(\x91\xd5\xff\x08\xe79\xda|\xf7`\x85\x1aF\xb1\x94a\xb7a\x89\x0c\xff\x8e\xa0\xc0\x8b q\xd6\xc8@S\x85\x95\xd7\xd4\x86\x89\xb7\xea\xf1\x84+N\x8d\xe8\xffp_\x0e\xa7J\x05Ed\xd2\xed\x87r\xbe_n:\xc2B\xf8\x86+]{F"\xd7V\x80CW\xa7J\xdc\xe0\x86\xbd\xf7\xf8\x81u\xd4\x7f\xd3\x03\xda\x1f\xcd\x18\xe6zW8\x88\x1f\n\x997C\x01\x12\x1e\x0e\x99\xceM\x17\x8c\xecW\xa5\x0b\xa0\x86\xb0j9\x8d\xd2O\xf7\xae\xc4\xab$\xbc\xe5\x83\xa1\x0bH\xf6\xa7\xb7\x8d\x01,\xbc(\x99\xa4\xa8\x96EE\xad\xcb\xbc)\xef\xffQ\x82L\xc12>\x0f?(\xdf\x81\xc8\xf0\\U\t\x07\x1e\xd3\x82\x1c\xf1\xf3\xa3Qx\x91\xf2\xe4Xm\xbd\x98L\x1f\xdf\x98\xb8"m|\xab\xfbs\x8c/S\xe96\x89\x81\xdb\xaf\xf2N\xf0\xa6\xabJ\x8a/\xf4G5\x8aH\xd2g\xb2\xe4\x04j(\xd9\x08\xa9\xbc\xeb\x7fC\xad\xc4n[\x1b\xc8\x96TV\xe4\xfa!j~\x88\xbe\xd26\x8bi$5\x93jy[?\x01\x11\x1f\xdb\x13\xd1\xde\x9eE\r\xfe*\rVE4\xe7\x95\x82\xcc\xbf\xa2\xf4\xb4\xc9Q\x95\xc2F\xa2;9\xfb\xe4\xb2\x8c\x04]v\xe0>-\xaf\x93[OZ\x9eC6\xe2Q\x93\xbf\x8es\xd4\x0eT\xc7o("\xf7$\xb2@\xdb\xf6\xc2,\xb6#5\xf2\x10\x81\xd9\x99\xcd\xca\xb0\x0c:?-^\xec\xc2\xffp\rl\x19N\xe9\t\xf0\r\xa0\x887z\x04\xc8\x01\xe2\xa4kl\x8a\x7f\x02\x0cIDx3 \xb8\xa0\xa2ef\x80\xc1%9\xc1W\xdf\x1b\xbf\xb6\x97\xb4%-Z*\xea)>\xa4\xccCN-2\xfe\nO\xd8\xc7h6c\xd0\xcc\xdc\xdb\xa0&#.]j\x9d\xa3K\xf3\xda&7\xe6\x1b\x17i;\xba\x15D@$\xe0O\x12\n\x1bX\x00R\x8f\x7f\x98Z\x8f}wJ{B~\xc0\xc2\xceQSJ\x80\xc0\xed\x84\xb3\xceUi\xf3\xa9\xedn\x7fA\x1c\xc2j+L\xe8)/\x9c\xb6\x9fVQ\xebr\xe4D\xea\xd3#\xc7\xb4&\xdd\x0f\xfd:\xd1\xb9%\xcf\xb0&\x18\xc3N.\x90nK=\x10E\xf8w\xffP\xcfj\xfb0\xa7"g\xd3uo\xb1\xa6jZ\xb1,\xca\xf7\x81\xca\x9c*\x86\xdfKV\xc0\xf9\xf8\xb4\xd1^q\xf2\x88\x1d*\xac>\n\xe7\xd9C\xd6e\xcb\xd1\xca\xc7\xe6R\xb2\xfb\x1b|r\x0f \x86\xa9e\x0eT\xac|\xed\xaf\xa5\xd3\x8a\x15^\x08\xebN\xe6\xf4\xa9\x95\xe7\xc1\xf0om\xf5\xed(S`\xa0\x8b\xe0p\r\x86}E\x9c\xb9\xf8\xd1\x84p#\xdf\x02\xdf</bRV~\x00Zx\xd6\xf9\x10\xc8\x99\xd7\xa7<j 5\xcf\x9a\x97\xec\x13\xad\t\xc2\x92~\x8dN\xa5\xa5\x90\x84DC]\xf2-NmZ\xd9\xb0]Q\xa9\xb0;\xbf~.%\xfa6\x86I8\x12\x0c\xb7N\xadi\x83\x88~\x1f\x15.\xf0\xfd\xf9J#i[\xdf\xf1\x88\xe7\x0cz2P\x98\x93\x86\x01\xd82\n\xc2\x9c\xff\x12,s\xf6\x8e\xd9\x18`\x7f\x04V}\x0c\xa717\xca(\xa1%\x08\xe6\xec[\x19P2\xcf\xc7\'\x98N\xe6\xc6\xb8\xc7\t\x0c\xd0\xde\xac\x87\xed\x0b\xe7`\xe8VO\xac\'\xaa%bn\xb5\x9aY\x92\x05?\xb2\xfe\xb0\xfe2\xc7\xf1P\xc6ZN&l\x7frX\x9f\xb5\x19\xe6c\x19\x82\xe4\x03Tp\xa5\x8d\xb2\xf7k7\x83\x93H\x8a\xf6\xf4HQ\xb8#Z\xeb\xb55c\xd8\xcd\xd70\xfb\xfb\xfe\x96$\xd6X\x94Nm\x85\xe3y,\xc2\xf5\x13\xa6\xb9\x90\xce\x19\x12Oo#`\xa2\x07\xafX\xd6\x81\xabc\xd3\xb2\xbcTA\xe22P\x8c!{\x93F*\xeah\xc2\xf0\xd1\x01\x82\xb9\x07}n\x03\x94\'\xbd\xbaX\'\x08\x06\x894^e\x96mR\x08\xf7=\x83\xab\r\x92t\x95\x19I8\xcf\x0b\xb2<pM\x0b\x8d=\xbc\x18\xdc\x19\xd3!\xc0\xeb<\xcd4\x9d1Q\xbd\x0f\x0b\x0b\xffp\x0e\xd5\x01\x88\xc8\xc8\x0804~\xd1\x04\xa19t\x82\r^\xb2\x01,\xd0\xdf\x80sD\xe0\x9c\xb5\x83\x14\xc7\xd2>.N\xf3\x94Bf$\xe8\x979{I\xe2YQp\xeaW!\xdaa;{\x87T\xbd\xd3\x8f\xdb\x03\xe6\xce\xf7J\x1b7\xa0\x82\xe1\xd64\xabV\xc5 x\x9b\x1a3\xc9\xe55\x0f\x9dIX\x9e\x98\xd0\n\xf1\xe5\xd2\xd4\x00\xa0\xc1fF\xa9\x12\x95\xaf\xa4\xef\xeaR\xa9\xa8\xb2\xdd\x8eam\xefG(\xbe\x1el0c\xfe\xc2)\xd1\xf8\xa2\x9c&\xf1\xefn\x942\xc3V\xbd:\xabC#BcA\x84R\xe1\xc1v\xe7\xbb\xa4\xa5>\xf1\xd5\xc4\xe5\xfb\x105\xed\xcf\xfcT\'!M\xc9\'\xe2\x17u\x82\xc7\x90Sv\x00$%\x05ii\xe6\xffu\x99\x085c\x03\xf4\x9c;RB\xf4_\x84\x1e2\xb8:\xdal\xb9\xb2\xcbg\xe4\xe6fr"\xb8IE\xb8\x01\x13j\xe4\x7f\x90\xde\x16\xef\xdao\x7f\x12D\xa1\x8d\xaa\xd2\x14\xe9M\xe6,\xf0\xdd\xb7}\xbf\x13d7\'\xb2\xec\xbb\xdc\xae\xdfN\x06%l\xa59\xd2:\xd5FC.\x98\xf99s;\x81\xf3\x11}\x0cV\xbd3k\xc8\xc3\xef\x9b\x88\x9e\x8b\x94n\xe8`\xf2\xd3\xde%\x1d\x1b\xbb81\x83\xdes\x1aL\x1d\xf8@\xa8\xa1\x99\xa6\xdb\xca\x12n\xa3\xd2+\xa6\xb9\xdb\xbc\xb0\xa0\x92\xe4\xc4\x86\x9c\x93\xe3\x04e\xf7\xbe\x94\xcb\xca3\xe0\x1a\x82u\x9e\xa1i^\xf0\xd1\x89\x1b\xa1\x968\x97\x85,O~Fp%=[\x94\xd8\xd4\x135\x96o+\x9cLL\xd4\xdf\xcei\xa5\xe7a\xd6-\xe3Wy\xf67p\xd4\xc6\xbe\x1c\xf1#tI}^\x81Q\xbb>x\x08\xfc\xb9\xd6|g\xae\xed\xb1M\xf8\n\xe9\xa9\xa9\xf5\xa0\xc0\x94b\x99\xfd_\x06\xad\x87\xc2\xf6\xd8\xe0r\xb0\xeb\xd12\xa7\x81 ^\x9e\x9d[\xb9\xc3\x17\x1c\x0c\xceA\x89\xb5d*\x9aD,\xd9\xee\x95\x9b\xa1)\xc01\x10\x7f\x11\xf3\x94\x93\x91xF5Q9\x88vj\xce\xc7\xf4<\xb0@Xw\xdd\x12\xda\x88\xc8\x98\xc9\x16\xa1\r\'\xabb]1Q9\x02\x9bI]\xa3@\x11\xdf\x9f}@&\xf0\xf2\xfa\xcc\xea\x83eO\xda\xba\xef6*\xf8\x9c\xd6\xadw\x1d\xad\xb2c\xda\x99\xa2\x14b=\xb9\xbaMN\r\xa9\xa5\xc6\xdc\'\xae{C\xa9\xbc\xb8!s`\x92\x1a\x892v\x1fz\x9c\nb\x8e6\xe8c\'\xd5\x02\x98\xb0\xc4\x12?U\x00\xbb\x8frk d\xcef\x14\x0b^\x9cO\xdd\x7f\xd4\xc0\xd2\x87\xf4*o\xaa\xfc\x88\xdcc\x1b\x03I<\x9c\x83\xea\xf0\xb8\xcdQ\x8f\xcb\xc8y\xdf\x11\xa2\x92hN16\xa1\xbb\xacx\xf2\xf1\xd4It\xb4\x82F\xec\x8d\xe6\x00\xba\x8a\x14\xbd3Jn\x88\x02\xaf\x00\xa5)q\xfb\xbdT\xec\xf9\\\xd0\xfe@\xc1A\xe42\xac\xc7\xd5;\xef?O\x12\x01\xa2\x1e\x0f\x99\xd6\xfazk\xe5\xd2Yj\xaf}\xfd\x14\x1fn7\x93\xf7\x193\xc4\xfd\xf0!\xb5\xed$\xf2\xe5X|\x00\xda\x981*\x8a\xeeO\x83\xe4z\x04<\xf4l\xe9\x8e\x13\xbe\xc3\x8fh\xdf\xe1]i\x12\xefV\x8c"@)O\xa1\x1e\xe6-\x9aF\xea\xd1\x96\x98\'\xf6\xa2\xd0\t\x90f\xb7(n\x1aj\xd7\x0f\x90\xcanWD\xe6\xc5\xbe\xf8I\x85q}\x80}\xa2\x82\xc7\t>\x08\x9a\x05\xeb{&\xbc\xb1\x0c\xc1\x15\xe1\x04\x07\xca\xff5"b\xd7\xb5\xc0\xb4U\xe1\x98\x9dxD\xbc>v\xb7Z\x8e\x93\xed\xdev\xf5\xec\x01\x03>8$\xdd9\xa3\xf5\x9f\xd6\xa0P\x08\xe59\xe9!a\xf7tEp\xbf\x83n\xff\xc7E\xb2ZKzn\xe4\xa1\xcd\xa6\xe4\x16\x9e\n4\x91\xe2\xab\x97\t\xf3\x11\xf1U\xf3\xb4.T\x87\r\x124:\xa69\xa4\xf8\x85\x9eI@\x91Z8\'\x1d\'\x1a\xc3\x073_IH\xfd\x91\xfe\x00\xc6z\x0f\xd4\xd4\xc2i\x90\xde\x07\x00\xd8\xd0\x1f\x95JM\xb9\x1a.\xc9\xbf\x82d\x13;\xef-\x01\xeeH\xda\xe0{T\xef\xedT\x97h\x08y\xd9\xe3\x9b\x97G\\[\xe2G\xc4\xd3o\x10\xb9]\nCDPD\x97\xd9\x94\x16\xc2\tb\xfd\x1e\xe5m5\x8bjJ\xd5\t\xa4U\xed\xdb\xea\xe9\xe1u\x90p<\xa2\x1d\x12\xe5\xcf\x85\xc5(z\xb5\xbfj\x7f\x92\x86\xf7\xc2u\xff.\xedMX\x12xZa\xdc\x88(\x98+\x07`@2\x0b\xe4\xcf\x1f\xf7&\xf2a\xea\x8c\xd6W\xfd{/\x1dX&\xfc\x01}\xb3\xb2/\x9c\xedk^\xa6D\x0eR\xb8\x83DA\xf3J\x93%y\x1c\x1b\xc9\xf0#D\x87&Y\xe2\x1d\xd8\xb0-;\xc3\x0f%Y\x83\x19\xe0\'U\x93Q;\xe7\x8f\xea-\xb6\x1f\x88\x04\x7fB|\x98\xdaU>\x18[V\xb5yr?\xeb\x88\xce\x93\xd9\xc0\xb3\x0e\x18h\xd5\x1a\x1d\xe2\xf0\x1c\xc0vk{\xa9S\x14\x11\xd0\x85\xef\x1eSssw\xa4)\xcf&\x90\xff\xf5P\xfcS&.\x92M\x88\xc4n\xc0\x7f\\\xee\x9e\x07\x13\x84Y\x0f\xfe\xe2\xafI\xf3T*\x1d\xf7\xef~;\xf4\xc49\x80A\xf3\xbc\x9d%\x12\xe2\'M\x1bD\xbd\\5\xa6\xcd\xd9\xee\x1c\xb7\xf8]v\x95\xa4W\xf4;\xbc\xab U\xbe\xa3\xaec^\xf1\xf2\x91<\x02\xfeP\xcar\'E\xb2\xc92\xdb\xee\x0c\x93\xb6\x05\x92\xd8z_:2\x98\xd8\xacr<\x88^\xd2:\xab\x9c\x7f6\x85\x14\xa2Y+\x83d\x0e\xa0\x8fV\xcc$\x1c\xfe\x89o]z\xb7\xf8\xb3\xd3o\x8as\r\xa3\xc9\x03z,\x8c\xe6\x1b\xc50\xca\x86\x96\x963\x95\x99"\xd0`\xc4\xc5\x10\xdb\xd0\x9c\x13i6\xf4r\x98VM\x9a\\m\xb8\xdbW\x90\xf3\x19\x98\x17\xd6\xbb\xfcF\xa3\xfcm\xb1\xd7{A\x1a\\\x1b\x1fh\xd9\xc3%!f\xb4\x9bf\x84\xcd\xb9O\x16\x9bQX\x17\x7f\xd2\xf9>`\xff\xf0\xad\x05\xa5#\xe7\x02\xa5\x1c\xfdN\xb5\xc3^\xd1\xc4\x9c\xf8\x9a\xcfT\xf0+\x058\x9c&\xf2\x18\x95H\xa1:\x12\x9ey\x96\xea\xa3\x7f\xdbB\x80h\xf0YV\xd8-b\xf2.LsvuJ\xf1\x92kd,B\x11\x1ad\x1b\xf1\x12\x97\xa4\x98\xd9b\xf8\xbeM\xf4\xbc\xf0\xc0\x84\xdb\x10l\r$K\x19\x8a\xe5zZ\xad\r\xdc\x99\x10\xe7\x05\xa2\\\x15\xbe\xc2\xbd\x16\x01\xae\xfd;\x89\x95\x0e\xbb\x10\r\xb1"\xe4\xb6\x94>r\x08\x02Kj,*\xd9\xc1\xbb\xef\xafA\x02\x01\xfd\r\xb1\x8f\x1f{\x12\x9a\x18U\xf3\x82<\xb9\xd5\x16^\xa9\x16)\x03;\xaej\x0c*\xc1\xcaY\x13\x00\xe2\xc3\x85\xfb\x89i\xf2\x14\xb5\xf4\x8e\x14\xbe"1\xc6~&\x08nXU\x0f\x94\x17\xe3\x1dX\x80\xf4\x82\x84\xfa\xc0\xee\xb1\xb1z]\xc6\xf8?D\x84#\x93\x91\xe9\xbc\x0c\x83I\xe2\x8eJ\xf0\xbe\x92\xb1 &9\n@\x7fm\xe4!-\xef \xff\xd3=\x1dxrQI\x8b\xf4\xa6\xbe\xcd\x82Y@\xa9\xa6i6=\xbb:Ka\x14\xb1\xa3\x13\xfdc9L0W\x9d7\xdb\x84\x03\xc4\x14\x08R\xdfYa\x19 \xa6%3\xe0\x93\xab\x05\xa5\xd4\xc0\xdc*\xd7\xf5o\xdb\x1c]\xf0\xf6\xab\xa2\xce\xc1\n\xc6z\xfcl\x1a\x93\x87\x0fm\xa1d\x18.\xecq\x04\x95N\xd5\xd6\xeb\x04\xac\xfc\xb8ROF\xe4Q\x93\x12\xcd\xc5\xfc\xb6\x0e\xfa\xf5n\xd8\xde\xdb\x0ef^4\xe1\xbfI\xc3*\x91Z\xa3\xfa\xb4\x8f+_\xcaZ\x9d\x84\xb7\x10\xaa \xca\xb6\xcc\x7f\xd6\xc9\xd6\r\xed|9\xde\xa9<\xa9\x85^\x9f\xaa>\x11jW\xb7\x81\xde\xa5\xff\xc4\xd0\x19\xe2\x01\x8d\xee\xe6\xe2\xf5yb\x92U\x83\xd6TM\x0c$?Qs\x93d"\x95\xa2\xea\n\xc1\xaa\xb9q\xb7\r\xa7{6\xbdV\xff\x1a\x82W\x97\xc2\x80\x02\x8c\trn\x06\xfa\x05d\x82\xd6\x9bT5\xed0jhL2\xa6=ly\xdb#\xe0l\x1e\x8a\x95\xc5i\xb6\xd7\xd3\xa9\xa7\x87\xf8\xe6\xb7cp\x9d\xcf\xefC\xd0\xa9\x9d\xaa\xcb\x91\x98\x00\xa3\xfc"\x8b\x16\xfb(\x95\xdf1\x04\xdc\x14(^\x14\xb7\xa2\xb1\xf1,\xda\'~A\xa7\xe6\xb1O\xb5\x0b\x82\xf2\xbe\x98\xd4\xccb\x9aAM\x7f\x8f\xed\x19?\x93S\x9b9\x98/\xea\x0b\xc8\xd5&\'\xaf\x94:\xeem\xf6(\xdd\x0b\xa7\xb0\x81\xbclS\x92h\x02\x1f/\x89\xf4\xa9\xc9N\xd8\xd6\xe0\x0bAc\x03\xf2]\x93\xa31w\x98\x00K\x87E\xc39&\xb0dE\n\xd4\xfel\xd6E\x89a\xf7\xf4\x1b\xcc]\x07\xf7\xf1\xe4Oa3\xeb\xe5\xaa\xbe\xa7\x17"\xdeV}\xd7*\x9d\xf9=\xce\x19r\xfe\xef\xac_\x87I&\x0f\xa2e\x91!\x89\xcc\x93\xc1L\x90{\xa6:\x7f^L\x8b\x8f\xf5\xb3)\xfbt\x139L\xa3\x93V\x04\xc3\x8e\xdcA[\xd5\n\xe4\xab\x91\x8d\x9e7\x90\xa2Y\xeb\xd8|p+J[\x9d\x0e\xcf\x88\x981hap\xf0`u\xf0e\x08.W\xabG\xb3\xa8*\x15~\x929\xf0^\x16\xa5\xcch\x87 \xb7\xa6\tYlCs%\xae\n?J\x7f?\x88\xf2\xe5-\xe9\xa6\x9d\xba\xf2\xa3 \xae[\x9d~\xf5pV\x99\x80\xedd.\x94\xdc\xc6\xbf3?\x7f\x03\x9a^\x82\xafg4\xef\x0c\x10\x85\xc7\xe9X\x85\x00\xf10+\x97^\xbbH\x89u\xbe\xf3.:uPP\x1e\xe1\xcc\xb1\x8a\xd2~r\xd1\xec\x19\xf5\x8e\x18\xd4\x06\xd9\x83\xd8\x89\xba@\xfe!B\xcedx\xde\xae{\xff\xba\xea\xf3\x9a\x0b\x82+r\xcel\xc0[\xfa\x9dc@\n\xb6XN1\xa8B&\n\xec.\x13c\xe2\xd1\xd4\xbf;(\xd3\xd8\xaa\x93\x83K\xfb\xc3<\x98gTtO\xa8\xb9\xcf[?y\x8bl\xd1\xd1\x8f\x9b(\x9a\xba5\xde\xaeD\xc8\x86>\x95\xbf\x88Y)7\xf5\x94(\x9f\x98\xb6A\x17,\xac\xa41\xb1Y\xb4\xbf\x07\xc7\xee\xd6\xd5\x04\xe9\xac2\xbff\xb2\xb1{\xac[\x84\xd9Tu\xe1/\x01\x08\x11\xbd\nk\xf3U\x7f\xdbX\tu+T2\x91\x99\xbb\x92No\xd4\x04\xe8\xf3K\xb5-\x92|QV\xdb\xff7\xa2\xb4t\xdaCj\xb8\x0b \x9c\xd0\x11\xa5\xd6d\x99n\xea\xa8\xcdo\xd8\xd7vV~\xb88=8\xf4\xd5\xbe\xad\'\xc1\x82E\xb7?\x8d\x8a\xbd\xd4\x810\xe3f\xc8,?\xf7a\xc1\xe7\x04\xa3\xce\xe2\x90.Z\xa5z \x11\x95\x1dk\xaf.M5\xc7\xf2\xcco<\x9b\x97\xa3\xe5\xda\xeb\xf9\xd82<Cf\x0fw9\x9a\x971\x13\xdd7\x0e\xa8\xe3\xdd\xf2z\xfa2\xde\xa4\x84\xad\xc0\xd7\x0c\xc77\xcb\x0eN\x90\xd7\x17\x03IM\x04B\xef\x10\xe7\xbc\xdb\xfe<}R\xee~\x99P\x95\x92\xb4%\x06\x86\xf0\x0e\xf9T\x06\xcd\xd6\xb0\x0bW\xc0" l\xcc\xf7\x9a\xafX\x14\xbfIES\x8e\x88\x9e\xdf;\x82!\x17\xcd9]\x84\x8c\x1f\xde\x1c\xf5Rdj\xee\xb9\xdf\x9e\x8ceR\xe0\xbb0U\xc7v\xb2/\x121NT(\xffe\x7f\x82]\xdb\x00.\xd2\xcd\xa6\x01O^\xeb\xc3\xa0\x80\x8e\x8c\xdc\xc1\xc3&?\xb9-\x88\xc5\r\xc4\\\xe3\x19\xda\x1a\xf6.\x98\x8d\xa1\xedt\xb3M\x8bO\x90\x9d\xbd\x0c\xfcH\xab\xcasV\xcb\x92\x87Kf\x94\x10r5B\xccg\xbc\x95I\xff\xb6\xd3\xbc\xbd@bz\xa6:\xae\xa1\xe8\xb3\x12u6\xd1K\x13\x8e\xe9\x14\xad2Z\x18\xb5\xb9\xbaH.\x84SM\xf3\x0c\xa1\xb5~\x9c~l\xa4\x94E\xb5\xdca2\x9f\xf4\xee$y\x9b\x8bh\xee1*~\xa2\xd0\n\x87\x8f+\x88\x9a\x02\xc0tu\xbaKC\xad\n.,#y\xad\xb3\xfb\x16\xa3\xf5\xe5\x12\x17\x9f,\x1f\x7fV\x82\xb01A\x8b\x1d\x94\xec\x05$\xdc\x05")\xc9iTO\xfay\x84Az\x95\x18\xd1\x80\xeb\xa1O\xd3\xe1E\xb9P\xa8\xd4\x15\xf9\r\x11\xea\x04\xd9\xe4\xa6mA\x0e\xe8\x85jK\xa1)r?\xe1\xf7\xcbI\xe6\xd8p\xa3y\xa1R \x8d\xa9\xae\xc8\x02\x96x/\xe7\xa5\x8c\xb1\xb6:c{\xbc\xa8\x93\x08Pg%\xf6$\x8aI\xbd\x16\xa7\xbc\xe0\xd9\xf2@\xaf7Ig\x97c\xe7\xad\xb6\xb1aW\xd2\x8el\xa6_\xbfP%<\xf2+\x81}\x03\xa8\xe8\xd4\x1d\x1d\x7f\t\xfb\x19\xdb\x98P\xca\xfcJ\xec\xb6{\xa7\x1f\xbcu\xc7\xc7{\x0e!\xfd&\x98\xe4\x02\xf1\xf5\xc7\xf9\xf4\x92\xce\xcch\x91\xb7\xf0\x91\x97\xd0J1?L`}\x06\xe3\xb4)?\xef.[F\x11\xf7\xf2i\x05\xe7\xf6\x00+\x86)\xdd\xc3!s$\xd849\x9fr\x0f\xf5V\x8e\xba\x06\xee\xc9\xf7=\x16\xf2@(\xb6\xfe\xae\xa7\x0e\xed\xbc\xf4\x12\xe3\xc8z\xbbz\xf4\xf0\xa0a\xf2\x0f\xd3az\xfd\x9a\xa3h^[\xb7w\n\x95\xfe\xb6\x10\n\x1b\xec\xef\x83\xc2\x1f\xb5\xca]\'p/\xfa\\!\xf1\x9d\xfc\x9bT\xe2/\xd6\x02\xa5\xdf\x8f=\xbf\xf0=UYyjfo\x9f\x97b!r\x8a\xa2Nk\x9e\xc8\xee\xbc\\\xaaE\xe4\xba{\xd7\x8bU\xac\xb5\x01\x9e\xdcyA\x0cbF\x94\xbe\xea\xc35,\xb2\xc4EU|rV\xd0r\xb5\xd0h\x9e\xa4\xe3\xeaa\xce\x97}\xd7\xef\x98\xd5\xdf\x91\x12\xfbnK\xfe\x99\xcf\x8c\xcd\xdetv0\xe3\xbc\xf7\xe1\x90\x89R\xd4\xae \xa1\xcf\xeb\x9dzDlK:\xa1\xf0\xbb\xf9\x15>B\x19\xd25\x12\xee\xdfWRi:\xb7\x88\xf6\xfe973\xd8\x1a\xdeFl\xf4;\xd3\x9f\xf0\xf8\\\xd6F\x1f\x10i\xaaJ~n\xc8;\xe5\x84\xe4V\'\xc4\xd5\xdf}N\xdf\x87\xff7{\xa2\x15\x157\xd4\x90\xb3\x1d\xbd\x05\xfd\x8b-=X\x98-\xd7R\xaaoq\xf3')
1
+ import datetime
2
+ import uuid as uuid_mod
3
+
4
+ from sqlalchemy_serializer import SerializerMixin
5
+ from dateutil import relativedelta
6
+ from hiddifypanel.panel.database import db
7
+ from enum import auto
8
+ from strenum import StrEnum
9
+
10
+
11
+ class UserMode(StrEnum):
12
+ """
13
+ The "UserMode" class is an enumeration that defines five possible modes: "no_reset", "monthly", "weekly",
14
+ "daily", and "disable". These modes represent different settings that can be applied to a user account,
15
+ such as the frequency at which data is reset or whether the account is currently disabled. The class is
16
+ implemented using the "StrEnum" base class and the "auto()" function to generate unique values for each mode.
17
+ """
18
+ no_reset = auto()
19
+ monthly = auto()
20
+ weekly = auto()
21
+ daily = auto()
22
+ disable = auto()
23
+
24
+
25
+ class User(db.Model, SerializerMixin):
26
+ """
27
+ This is a model class for a user in a database that includes columns for their ID, UUID, name, online status,
28
+ account expiration date, usage limit, package days, mode, start date, current usage, last reset time, and comment.
29
+ """
30
+ id = db.Column(db.Integer, primary_key=True, autoincrement=True)
31
+ uuid = db.Column(db.String(36), default=lambda: str(uuid_mod.uuid4()), nullable=False, unique=True)
32
+ name = db.Column(db.String(512), nullable=False)
33
+ last_online = db.Column(db.DateTime, nullable=False, default=datetime.datetime.min)
34
+ #removed
35
+ expiry_time = db.Column(db.Date, default=datetime.date.today() + relativedelta.relativedelta(months=6))
36
+ usage_limit_GB = db.Column(db.Numeric(6, 9, asdecimal=False), default=1000, nullable=False)
37
+ package_days = db.Column(db.Integer, default=90,nullable=False)
38
+ mode = db.Column(db.Enum(UserMode), default=UserMode.no_reset,nullable=False)
39
+ monthly = db.Column(db.Boolean, default=False)#removed
40
+ start_date = db.Column(db.Date, nullable=True)
41
+ current_usage_GB = db.Column(db.Numeric(6, 9, asdecimal=False), default=0, nullable=False)
42
+ last_reset_time = db.Column(db.Date, default=datetime.date.today())
43
+ comment = db.Column(db.String(512))
44
+ @property
45
+ def remaining_days(self):
46
+ return remaining_days(self)
47
+ @property
48
+ def is_active(self):
49
+ return is_user_active(self)
50
+
51
+ def is_user_active(u):
52
+ """
53
+ The "is_user_active" function checks if the input user object "u" is active by verifying if their mode is not
54
+ "disable", if their usage limit hasn't been exceeded, and if there are remaining days on their account. The
55
+ function returns a boolean value indicating whether the user is active or not.
56
+ """
57
+ is_active=True
58
+ if u.mode == UserMode.disable:
59
+ is_active= False
60
+ elif u.usage_limit_GB < u.current_usage_GB:
61
+ is_active= False
62
+ elif remaining_days(u) < 0:
63
+ is_active= False
64
+ return is_active
65
+
66
+
67
+ def remaining_days(u):
68
+ """
69
+ The "remaining_days" function calculates the number of days remaining for a user's account package based on the
70
+ current date and the user's start date. The function returns the remaining days as an integer value. If the start
71
+ date is not available, the function returns the total package days.
72
+ """
73
+ res=-1
74
+ if u.package_days is None:
75
+ res= -1
76
+ elif u.start_date:
77
+ # print(datetime.date.today(), u.start_date,u.package_days, u.package_days - (datetime.date.today() - u.start_date).days)
78
+ res=u.package_days - (datetime.date.today() - u.start_date).days
79
+ else:
80
+ # print("else",u.package_days )
81
+ res=u.package_days
82
+ return min(res,10000)
83
+
84
+
85
+ package_mode_dic = {
86
+ UserMode.daily: 1,
87
+ UserMode.weekly: 7,
88
+ UserMode.monthly: 30
89
+ }
90
+
91
+
92
+ def days_to_reset(user):
93
+ """
94
+ The "days_to_reset" function calculates the number of days until the user's data usage is reset, based on the
95
+ user's start date and mode of usage. The function returns the remaining days as an integer value. If the start
96
+ date is not available, the function returns the total days for the user's mode.
97
+ """
98
+ # print("start_date",user.start_date, "pack",package_mode_dic.get(user.mode,10000), "total",(datetime.date.today()-user.start_date).days)
99
+ # if user.mode==UserMode.daily:
100
+ # return 0
101
+ if user.start_date:
102
+ days=package_mode_dic.get(user.mode,10000)-(datetime.date.today()-user.start_date).days % package_mode_dic.get(user.mode,10000)
103
+ else:
104
+ days= package_mode_dic.get(user.mode,10000)
105
+ return max(-100000,min(days,100000))
106
+
107
+
108
+ def user_should_reset(user):
109
+ """
110
+ The "days_to_reset" function calculates the number of days until the user's data usage is reset, based on the
111
+ user's start date and mode of usage. The function returns the remaining days as an integer value. If the start
112
+ date is not available, the function returns the total days for the user's mode.
113
+ """
114
+ # print("start_date",user.start_date, "pack",package_mode_dic.get(user.mode,10000), "total",(datetime.date.today()-user.start_date).days)
115
+ # if user.mode==UserMode.daily:
116
+ # return 0
117
+ res=True
118
+ if not user.last_reset_time:
119
+ res=True
120
+ elif not user.start_date or (datetime.date.today()-user.last_reset_time).days==0:
121
+ res=False
122
+ else:
123
+ res=((datetime.date.today()-user.start_date).days % package_mode_dic.get(user.mode,10000))==0
124
+
125
+ return res
126
+
127
+
128
+ def user_by_uuid(uuid):
129
+ return User.query.filter(User.uuid==uuid).first()
130
+
131
+ def user_by_id(id):
132
+ return User.query.filter(User.id==id).first()
133
+
134
+
135
+
136
+ def add_or_update_user(commit=True,**user):
137
+ # if not is_valid():return
138
+ dbuser = User.query.filter(User.uuid == user['uuid']).first()
139
+
140
+ if not dbuser:
141
+ dbuser = User()
142
+ dbuser.uuid = user['uuid']
143
+ # if not is_valid():
144
+ # return
145
+ db.session.add(dbuser)
146
+
147
+ if user.get('expiry_time',''):
148
+ if user.get('last_reset_time',''):
149
+ last_reset_time = datetime.datetime.strptime(user['last_reset_time'], '%Y-%m-%d')
150
+ else:
151
+ last_reset_time = datetime.date.today()
152
+
153
+ expiry_time = datetime.datetime.strptime(user['expiry_time'], '%Y-%m-%d')
154
+ dbuser.start_date= last_reset_time
155
+ dbuser.package_days=(expiry_time-last_reset_time).days
156
+
157
+ elif 'package_days' in user:
158
+ dbuser.package_days=user['package_days']
159
+ if user.get('start_date',''):
160
+ dbuser.start_date=datetime.datetime.strptime(user['start_date'], '%Y-%m-%d')
161
+ else:
162
+ dbuser.start_date=None
163
+ dbuser.current_usage_GB = user['current_usage_GB']
164
+
165
+ dbuser.usage_limit_GB = user['usage_limit_GB']
166
+ dbuser.name = user['name']
167
+ dbuser.comment = user.get('comment', '')
168
+ dbuser.mode = user.get('mode', user.get('monthly', 'false') == 'true')
169
+ # dbuser.last_online=user.get('last_online','')
170
+ if commit:
171
+ db.session.commit()
4
172
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
173
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,8 @@
1
- # 2023-04-08T15:11:13.769608
2
- from pyarmor_runtime_000000 import __pyarmor__
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\xf5\x01\x00\x00\x12\t\x04\x001XnK:,\x19\xc3\xca?\x13k%\xa5\x8f\x8c\x00\x00\x00\x00\x00\x00\x00\x00\xb3?\xf4\xb6t\xc8\x94\xc0\xbf6\xb4x\x86\xd9\xd9\x10\xbe\x16\xcc\x08"\xe0&1\xc17\xfd\xcf\xfco\x12\x1b\x98\xd5R\xb1_\x86\xbb\xc1]6zD4\\\x05\xd7\x96\xa9\xc9\xcb\x84\x89\xa6\xdco\xbb:|6\x8a\x10\xc7\x1c\xc0\xeb\x10\xc5\x8e,\xf8\xee\xcd\xa4j\xfc\x80\'\xda\xa4e\xe5\xa4\x08\xa5\xcb\x8a8\xe4\x14\xcd\xcf\x1f\xd3\xbc\xedR\xf2\x03\x18\x13q\x11\x0b\xa2\xfd\xa3\x9ex"\x11.\x91\x91z\x9a_\xc79\x8d\xf4\x94\xbe\xcd\x06\xd1z\x80\xf4J\xc8C\xc1\x87\xcb\x82\xad\r\n\x1e_.\xf3y\x07!r\xd3\xfb\xdd\xf2L\xaf\xb6\x8a\xfbw0\x97\xc6\x88P\xd0\xa6$Yo\xfc\xc9w\xee\x93g\x1ad\xcf\x0f\x0c\xe7\xc9\xe6\xc3T\xf6\x0b\xfa:"\xd8luW\xb7\rjx?A\x15\xa0\xa2\x9bx\xb9\xb0Ao\xc2kh\x8c\xc8\xd2]v\x06.O(]\xa3\xce\xf4\xfa\xb1\xd6\x05\x9e\xc5\n\r\xd89\x17\xf1j\\\x88\xbb\xc8\xf0\x94ac\x0fJC\xde\x9e\xab7\x03%\xe8K6\xa8\xb3\xbf^_x\x07\xb1\xdcF\x8d\x9cI\x8c\xe4eZp[\x80\x00&\x06B\xcd~\xe5W\xd4V\xbeOy\x90\x06"k%VQ\xbfm\x996M\x13\x04\xd0\x85\xaa\xc6\x06\xc6\xbcd"\xdd\xc2 \xac\xabp\xc0\xd9PY\r_\xdf\xac\xf4r\x04\x9a\xab\x90\x1c\x87z\x99\xcdR\x9d9\x14\xef+\x8a3\x0c\xc4\xd9\xe5\xdeV.L\x97\x08\x00\x00M\x18b\x8a\x06@d<\x05\x1a\xb0\xdd\xb0\xe2\xb8\x10\x11\x92\t\xbe\xb1\xb6\x83\xf4q\x10\x1as\n\x8a`Q\xdf\xca\xac\x15\xd2\xe8^F\xcc\x02\x9b@!\x96j0\x8d\xcf/\xf97\x9dH\x97\xd1K^\x88\x1bD\x07\x82\x04t#\xea\xd2\xb3.iHqbb\xbaNw\xa0H~B{V\x94\x9a\xa3\x1d\xdb\xe9\x13\xe8\xe2\xce\xd6Y\x17)\xea\x8eR\xe8\x84\xce#5\xad\xddF\x84\n\xfc\x99,?\xcf\x06\xe1\xbcg\xfe\xb5\xd6\x00\x86\x10\xac\xc8=\xd8oh!p\xaf\x89\\o4\xd5\xc9\x04')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from . import user
2
+ from . import admin
3
+
4
+ from . import cli
5
+ from . import database
6
+ from . import common
7
+ from . import commercial#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
8
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,172 @@
1
- # 2023-04-08T15:11:14.133500
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00- \x00\x00\x12\t\x04\x00@\x94\x1b(equ$\r\xcf\x94\x06\xfe\xd5\xba;\x00\x00\x00\x00\x00\x00\x00\x00y\x15:+\xfe?\xb0\x1d\xd9bPT\xfa(\xd0\xbd>\xa1o\xf26t%\x94;4\x1e\x19a\xc7\x1c\xc2\xce$2\xcf3eXv\xb4\x85\x0c\xc0\x1e\xb6\x1f>\xbaF=\xab\x1c\x9b\xe0j\x1fW\xe7\xba\x1d\x1e\xe65\xb4\x8c\xa5\xe9X\xe8\xb3\x1e\x95N/\x11\xec%\xd6\xa14\x8b\xfb\xe0i\xda\xfc\xab\xfb\xd3w\xba\xb0R\x7f\x8d6\xacn\xdf%\x0e\x07\xb50\xed\xd90\x1a\x90\x08\x9c\x15\xafk1l8\xf6\xf1)~\xacJ\xa3/O\xec\x17\xd4\x03\x1d\xdd\xef\xe2\xbd\xe3\x97\xa3(\xc0>\xee\x81(\x1b\xe2GO+b<\x05\x89\xd4\x9e\xa7\xf5f\xe6x\rZ\xb2\xc2\xcd(`1/\xc3(9\xfaL\x1bY\xae\x17\':\xc3Z\xeea\x96_\x9c\xcd\xde\xa4\xb3Q\xfc\xc9\x8a\xc6q\xfa.\xd3 V\x16\xf1H\xe6\x983\xc5&k^\xa0\x04\n\x13\xc2\xe9o\n5t\xe5\xc3\xdb\xb3\x1d\x110C\x89\x05\xda\xcb\xbe\xfa\xb7e\raue\n\xc3\xc2\xb0!,\xf6j\x13[\x9f\xc8\xf1\xdf-\x8c\xc0b\x9b\x89h/\xf5\x9a\xf1\xbf\xf1\x99\xaf9\xcce^\xf3\xb1w\xde\x9b\x8d\xb8\t&\xff\xdb4\xc0\x1e4\x882\xb4l\xe1\xde\xa35"M\xd2\x91\x9a\x08\xde\xd8G\xc5\x07\xba\x98\x046\xb0\xfe8\x91\x92\x9axZ\x9fWAof\xb1\xec\xa5\x9f\x8e\xaa]>\r\x00s\xf3\x80Z\x12\x81\xc2\xfc\xe1\x9f\xac\xaa\x91\xf0\x0b\xe1\xebE!C\x9f\xfcP\xa6\xa9&0\xf6\x1b\xf0\x9b^\xa4\x8bF-\xa1\xf2N\x8d}n\xb1~*3r\n*j\x07\xda\xb2\x87\xdd\xd5\x16M\xe2\xa7z\x9e!\x84\xac7\x9bR\xc9+40$\x0e\xc1\xb2\xf7\xf9\xb1\xcf\xb4\xb3>\xf81\xbbO\xe5\xde\xd4\xfcV\xba\xb2\x85\x7f\xf8Eh\xb2\xef\x8e\x87\x85\x9b\xfav\xc7{\xb6Je\xf65\x8e@]P\x15T\x9d\xad\x1d\x12\xf4\x00=\xeb\xca\x1f(\x10F\tC_\r\xe7\x1a\xcd\xb0\xd6\x1c\xac\xcd\t\x1dJ(\x91\xa0m\r\xbc\x91\xdf\x0b\xf9\xb9\x9dz\xce|\xbcjV\x13\x14\xc8\xe6LN\x94\x10\xe2\x10\xdc\x16\xa7\x8a\xc1;\xab\xf0\xae>\x85\xbf\x9a1\x8dS\xfcR\x0c\xb9\xd0?\xac\x04\x81Q\xb4\xb0S\x80\x9df\xef3S-\xf3\xb2\xd7\xe3\xdeKMX\xc8T\xff\xd1"\xbe\xf0\xd1\xd4\xbdMx-\xd0y:\x7f\x88l\x02\xa1\xc5\'\xcf\x89\x00]\xa4\xab7\xb5#\xfcc\xde\x8e\x02{\x1d\xb2\xe9zM7y\xf8P\xf1\xe8\xd2\x16\xb6\x0f\x14k \xd8E\nd\x97\xa6\x8c\xfa\xa5\xaf\x9d\xc7n\x06l\xacO\xbb\xecm\\`\xbeC\xeb\x9120\xb7J$\xb6i\x18?\x15|\xfb\x9b\x96\xddR\x00Rarp\xfe\xc0\x91~C\xeb\x8e4=\x89\x89\xfe\xe0\xdc\xda\xab\xef\t\x18\xb6b]"77j43>"\xe9N_\x00?\xad\x8f\xb6ux\x7f\xcd\xec1B@\xe4Y\x9a\xfc\xe7N\xb6r\xd8aYl\xa80\xafmZ\x92\x01\xcc\x81\x136FV\xcfOJ\xc6\t\x88N\x84\x12\x07\x8d/\x9a\x06\xb0)\xddWkl\xa2\xf3\x00X\xba.\xa1\xc5\xf8\x1aGWpX2\x98\xbadI\t\xc8(Z.\x1e\xe8e\x94A\xe7\xa7 G\xd5\xbb)\x91q\xd6n?pB\x89\x15\xc7\xf8\xf4\x9c\x94\x9a\xf7\xe9\xce\xed\x16#\xfc"%\x12\xaf\xa5\xdd*\xa5\x196%VC\xa2\x9f\xf1:\x1c\xea+q}@\xc4o\x89\xb03x;\xda9\xef8\xf1QyE)\xd0\x1f\xba\x1d\x94y\x11\t\xa9L\xe0\xf6-\xa0Y\x94\xad;\x8b\xd9\x9f\xc5I\x83\xd5\x14\xad\xee\xd2\x02\xee$A\xbbO\xd2\xe3\xad\x8eDLk\x8f<P@\x13\xee\xd4\xb9(#\xa4+\xb6\x9e7\xfc\xa1d\x18\xaf\x14\xdc~"\xc6\xa8\xfe+\xfe*(_\xac36t\xf7\x05\x16fk\xd0U&\xb38\xabe\x9apw\xd0\xd3\x13\x05\xf7\xae\xd7\'r\xf6[\xbf>\x9f\x14\xc5\x92\xc6\x8cr\x10\x8f\xf4\x82\xa7u\xb18\xf2p8\xa6\x01%\xa8\x15\xaa\xb9\xad\x91+\xf3\n\x9bk\x81\xab\xd8p\xf6\x01#~*\xee3\xd8<\xd1\xbcWop\xf5\xae\xd5\xdbiF\xf1r\xbe\xd6\x9e\xf0\n&\x8a\x17\x83\xfdp\x0f\x11\xef\xd6\xaf\xe4\x9f*\xd4\xa5v\x01\x07\x88Y\x89\xfd\xaeK9\x95\xf8?47b\x8b\x0f\xca\xf1\xf1\xee\xc5\x10\x89\xf2\xa0C\xe0\xdd\x14(\xdc\x13\xefZ\xbe\xca\x81\xa65\x14d_\xd07\xa6\xa7u+n\x02$\xe9Dg\xe3n\xa3\xd6\xdc\xb0\x03\x01\nf\xf6\xf6\xd1USI\xd7\xae\xe7e\x00x\xad5\x1ez\xd3Z\x8e \xac\xd4B\x80\xe7s\x94I\x8aa;\xee\x14!.\xc1T\xa6g\x1b\xd3v0R\x9c\x1b\x97s\xa0@\xa6p\x7fh\x92N\x1d\xd4E\xd8\x8dv8O\xe0\xcb\xbd\xa9\xc2\x94\x1b8\xcdA\x92\xa1\xf5\x9cGDw=\x84\xce\x9dHe\x96|\x8d<\xf4\xe5\xa3\xbc\xb7\xcb\xe8\xf7\xac\x84\x9d\xde\x04\xcd\x86%\xb1\xc7\x14\x94\xdd\xe4v\xc4\x1cW\xe7\xa8B\xe47j\xad\x08\xe9\x94\xb27w\xf5\xa5\xf3\x15\xb8B5\x05uY=\xa3\x94\xff\x89Z\x97u\x90\xcd\x0b\x19\x9d3\x88\xe9a^ E%#\xba&\xe7\x0c\xd2g\xa5Nc-\xa3\xd1.k\x1a\x05\x1c\x9a)\xac:v\xb2\xb1S\xfc\xdf\xfa\xa1\xddWR\x7fv/i\x9f\x82\xdb\x05;q\xean\xd57\xf1\xcfY\\\xf2\x96\xda\xd8S\nTF?\xb0R\x1a\x00z}L\n\xf3\x10*\x12\x1c\x84\x01\x03cjo|n\xff\xd0\x12"rA54\xa6\x10x\xd0\x93\xae\x19\x7f\x93{\xc5\xc0\xaa\x96\xbdw\x1a\xc18\x9dt\xde:\x18P\xb1\xc8\x00\x9b$\xcf\xda`R\xed\x9d\x13\x0eu8\xe3\x02\xed\xa9E\xee\xb5\x18;\xa3-\xe6\xf6FU\x1dU\xb8\x164\x1c\x0f1`um4\x80\x04\x12\xe8\xb7U/\xf6+\xed\xc6(\xffI\x8c\xe0\xe9v\xc4\xaa\xa5\x90\x90e\xb6/R\xf1\xba\xeewvlf3S\x9e!\x1f,\xc4#X\xbd\x8d\xe2}\xa1\x89\xe6\xa8\rX\x9c\xbaCs\xd9\xc3\xf2t\x9dy1m\xcc\x1d\xf9\xaf\xffe\x05HxdB\xa4\x08\xedl\x1a\x84C\xf3\x8b\xa1!P\xae%x\x02\xce\x07r\xf4\xa8l\x13\xd5@\xb4&15\xc6t\x1c\x0fg\xb8e\xf7\xd5\xd1\xbb\x0b\xeb\x05\x19\xa1\xda\xc6\x84B\xfe3\x02\xb5#\x88\xc5\xd7\xb4\xe7s\xa0F\\\x82\xf3Q\x84iU[\x10\xec\x81\xc6\t<\x9a\x8d\xad\x13\x0b{\xcb\xae\x7f\xae\\\xe9\x17\x81\xc7\xdf\x00\xd3-\rB\\R\x14\xed\xd8\x96\x86\xde@\x0f\xa3\xe7\xb7\x9d\xaa\xd5*\xaf\xb6\xcf\x00-\xf9\xa1\':\x815\xfc\xe8;\x8e"K\xf8\x1bQ\xcd|\xdc`v\xfc\x9e\x97/~\xe2\xb0\x01\xd0 \xfd\xfdaWxp\xa3rn\x93\x9b\xb7Q\xb47\xe5\xb9\xbc\x07\xff\x90\xd6\x91FH>\xce\xd7\x92\x0f\xcd\xb8\xfe@Th\xb6t\xc0\x98E\xe5\x82E\xc8\xaf\xe0\xf7\x90?\xecC\xa5m*\xe36\xf0Y\xd5\x89\x86/{_\x9eo)\x97\xcf\x15\x1f\x9f\xd5\xd5/\x085\xd8[HNA\xe6%\x14\xa7]\xc0\xe3#\xcd\x8aq\xc3G\x05\xa0\x9ej\xf6g\xd3\xd4\xf4Wz\xe4\x16\x19\x83\xf2\x166\xa2\x89@\x80d]\x95\xfc\xf7\x89@s\xc9\xc6SB\xd5\x04 \n\x1c1\xc0W\x0c#\xe1&C\xb0n\x8b\x13\x14\xcfq\x0c\xe6_\x1a\xdd\x80\xacY?y[\x1f\x0fHX\x0c\xe8.\xbe\x84`\xda\xdf\x05\x96\x06\x19\xd5\x91\xd6v\xf9\xc1\xcb^"\x10g5\xf7\x8e\xc9\xb3\xa2\':\xe2\xd3\xeaa\xbb.\x8d(\xac}`L\xc5\xfc\xe6\xeb)X\xa6\x1a-\xccK\x84\x04\xda\x9c\x10\xf1Rx\x86~\x9c\x0ezq\x18\xbc\xd4\xf8\x8a#\xa4\xbd\x9c\x10\xf340>\xb4\xdf6\xcd\xfc\xbaq}\x12\x0b\xe9\xe5\xc2\xecoC\xe5m\xac\xa4w\x9e8\xf8\xd2N\x14\'\xde\x1f\x16z1\x99\xb1\xbd\x1aE\xe5\xfasf\x81X\x04\x1b\xeaz\x13\xf0\x90\xe9W\x94KdN\xee\x04\xaf\xa3\xf0\x00\xe4VbX\x03\x00\xd9\xf5\x1fF.\xe53\xb8\xf6\x9c\x84\xb9\x80\x88\x94\x12_|xPR\x07&\x0e\xf6<w|\xbey\x8a\xa2CBs\xd5\xf9\xef\xb2\xf8\xfa\xdf\xe6\x98\xbb\x92\x12\x7fN3\x19\xcb\x93\x94\xdf\x9b\xe0\x84\x9c\xdfm\xc9\xc1\x8d\x9c\xe8z\xd2m\x00\xc2\xcf\xe4r\xdf\x0e\xa72\x88kE\xdf}\xf0\x83\xf2V\x15\xc1\xcf\xc9\xbe\xea\xeb\x7f\'f.\xec\x8b\x98\x02\x89h/\x82e\x15Q\x07 EzF\x17\xd5\xe5\xc5\n\xea\xddr\x0bp\xa7>Y\x023J\xd9\x05q\xa5?\xdd\xc0\x7f\xa6\xab\xa3\xac)\x84\x99\x9d\xfd\xd3\xad\x90\xd8i\t\xcd\x14q\xfcQ\xde\x10\x86J\xc0\xbc\xa3\x8b\n\x1a\xf7\x00\xb2\xd5\xd9\xab\x11@%\xf4v\xdd\x8c(\x0f\xce\x1e\x13O\xaf8\x1a\x0f\xbc&6p\xf0\x1a*\xec\x7f; f\xb4\x89\xfa\xb8$\x88\x1c\x10\x89{43"\xe63\xa4\xcdd\xae8d\xcc\x1f\x8d\xd8\xdb\xdc\xea\xbb\xe5\x93O\x19\xf3b\xa8?=\xb1cgG0\xa5\xb5*\xe8\xdd\xf3\x9e\x15Y\xc4\xbb\xb2P\x03\xb6M\x83X}\x7f\xbb\xe2X\x8e\x9eu\xef\xb9\xc0\xf9vy\xb0\xf0\xf4*\x84lzm\xb7\xf1\xb3D\xeb\xf8\xbc\x9c\xcd*\xf6\x01\xb9\x01S\xfb\xacF\xd2\x12\x1c\xde\xd0=\x07\xe6C\xa2\xaa\x1c\x17\x1a\xa4\xa8&\x96`\xa1\xcc9\xd6\xc8G\x96\x87\x04\xaa\xa0\xa4\xb3L\xea\xd0D\xf3\xc47\x8e9\xdb\xde?Qd@V\xcd\xe9\x0e\xb1K9p\x93x}\xf2\x9cPQ\xd9\xdex\xee\x13#K\x89\t9\xee\xf3\x93@\xbe\xe6\x01\x02\xf4\x08;\x97~\xdb9\xde6\xad\x93B\xf7\tub\xd8\x12\xa7\x1b\xac\x96\xf6\xb66\xa8x\xa1\xe3c\\7F\x93\x1e\xc9\xa1\xc7\xa97\xb3\rT(\xac\xd4?\\\xe3\xc8\xe3(]\xbd\xb7\xebFr\x12\x05\xcd\xf1\x89.gR"\x1bW`\xcc\x84a\xbaj\xf0\xc9c\xc4\xf4\n\x84\x11;\xfa\xd2Ppx(\xaa\xb4\x12j\xcd%\xa8\xccXu\xf5/\x8a\xc23`\xdaw\x92\x88\x07\x93\xb3\xcfI\xccwWZR\xa4\x97\x96\x1a%9\xeah\xc3\x02\x10g\xdb\x93X\x8f\xd5\xa86\x1f\x9a\x9b\xf2H\x8e\x15\x8dmC\xbf-\x10\xccz\x9c\xcc]@\x7fB\x1f:\xef\xa8\x19j\xde\xaec\xd2\xa4]0;v=@kA\xa3\x15|\xa0\xfb%\xdar\xfd\xfbqA\xb5,KpCf\xbf\xda\xe9w\x0ff\xc7\xb7g\x908pH\xaf\xa8`\x0f\'o6\xe9\xad\xd9\xc0\t\x1e\x9b\xce\x7f\x12#R$\xe6\x8dQ{IMl.\x0c@\x9d{\xf4f_1\x9a\x0b<\n\x9e\xe68\x1c\xa0\xa1\x1f\x1c\xe8\xd5\x83\x98\x1b\x18\nd\xfd:\x02kIwgT\xae\x8e\xfcE\x86X\x93\x1ep#\xfbw\x87\xbd\x16\xd42\xc3W\x88Y\xba0\x14A(I\xfdyJ\\\x10\xfc<\x0f\xc2{otYYE\x02[{\x98\x1bH<W\x99\x97\xdd\xa2\x08\xcc\x10\x1eF\xbf\x8a;g\xf6<P\xbc`\x0f\x97\x13\x03 o\xb9X\x08\x97\x84\x0b6\x07\x7f"\x1dj\xaeI?B/%\'\x8e5y\x19%q\xf4\x9acT\xc9\x00\xf2q\xb0C\x87\xefe\xc6\xe2e\xec\xb2\xd7\xddG\xaaUL\xea\x82\xda\x00R\xc9\x99\x84\xe8\xdd\xa25=\x9e\x84\x8c4X\x94*\x94h\x90J\xb1\xd8}\xdb\x1f\xb9\x951\x99\x1b\xfb\x02\xae\xc6\xa1\xbb),T=\xed\xa3\xa4\x0f\x98|\x9e\x8c\xaf\xa0aEK E\xb3up\x8f\xb8\xb2\x92L\t\xe2\xb0M\x87X\x97\xfc\t\x9d\x07\x9ft\xee\xe7\xd7\x9e\x15\xe8\xa2"\x89\xe5\xdd3\x1bL7x\xd9_r\x9c:HX\xd0\x0f\xffW\x1b]\xe3\x1e\xd3\xf7DM\xe9\xcf\xfa\x94k\x06\x98\xac\x88B\xaf[\x8bV\xbc\x0b\xcc\x02\xa8p>\xfd\xef\xf4`\x95\x97\xeb\x97\xd5\x90vF-u\xefi\x113\xc4\x8bf\xb2Y^\xe1\xe6\xfa\xf7\x93\xba\x99\x05\xabZ^m\xa8\x08\x82\xf2\xde\xd2B/+\x95\xe3\x959k\xe5\xb2enN\xab\xa6\x9d\xd52\x85H\xba\x1a_\xf0.e\xfa\xa0-\xa6\xba\x99\x03a\xa90\xa5\xaf\x88\xed\xf0\x18\xe8u\xebCH5\xb3G\x8d\x84%\xdf\x05\xe0t\x14\\\x7f\x18\xa6\x87\x1a\xf6\xa3\xc8\x8c7L\xe50\xceik\x1c\x9f\xeb\xb0U>B.\xbe~ob\xf5\x11\xdb\x8af\xafL\x0f\xab\xd1\x8c\xd2\xe7\x9ah\x16l\x1dA\x86z^2\xc8]\xb3^\x87\xaf\x0c!D\xb0\x13\x94y\xaa%\xe1\x02S\xd1k\x87\xc71\xd1\xed:\xc0H\x03\xce\x8c=6U\xfd\xae\xe6\xe8DqJ\xbc&N.\x1b`\xaaV\x98\x93N/\xe3\x1b\xaaR\xfd\x84\xfb5"3\xb3\x9a\x89\xbe\xb3\xf7I\x990\x9d\x14nIlX\xbf\xa1\x85\xb2R\x95\x14`U\xdev[\x88\xde\xf3\x04\x92w\xf3\xc8y\x8d\xd9\xbd!x\x00m}\x86y\xcc*\xd7a\xf0\xe8SG\x88v.E\xcbw\xee\xf5%\x81g\xb5\xd7[\xe1\xc1\xc4\x08\xb5$\xb9\x9d\xc0\x14\xeb;\xce\xbb\x00\xc6\x9d\x89\xd9*\x93\x9f\xd7)wf]]\xea\xd3gz\xc3!H\x7f\xa0\xefPm^\x0f\xae\xcc \xb6\xde!\xf40\x11\x88\x16\x10\x90_D\x06>\xdcblUO\xb4mr1\xb7\x8d)\xc1\xcfos\x8fYD\xca\x0b\xd7\xcb1\x92\x92L\xc1\xa6\xf9\x95\xd3\xe1\x04\x98k\xff\xedu\x03\xea\x96\xbf\xbe4\xca[\x1bS\x81\xe8\x0f\x97\x91\xfd\x16\xde\xc3\xab0\xf1\xad\x9f\x0f\x90\x8d\xf1\xebKwd2j\xb2\x9f\xc7\x9b\x98(\xe9\xc0\x8a\x9f\xac \x1ai\x1b>\xa1+\x89\x87I\xd1\xa4.\x8c\xeezx?~\xef\xd7\x05\xec7X\x15H\x14\x1c\xee\xe2\x0b?!\x04\x1a~eLQ\xf3H\xf53D8\xe4\x0c\xe2#VC\x0c\x9bn\x93\x12d&\x8c"GD\x12\xc0\xaf\xc0\xef\xa0\x12\xbbyJ\x85\xc4t\x04\xb9\x18\x03\xc8\n]p\xeb#9\xd1\xb1\x08\x9b\x16&\'NL:\x91\x88d5\xdd\xccy\xd6\xec\xdat\x8fE\xe6\xb2|\xa8[\xb4\x8d\xe6\xf6\xa4\xbfe\t\xaa\x7f3P\xdbnI1o_\x95\x9d\xc35\xbf\xadhA>\xba\x85\xa3\xd7\x9c\xc6\x92$\xf7qWHr\xcc\xac\xbe\xce\x1e\x0f\xcdM\x14\xbf\x9a\x83\xde\x93\xc93g;\xb7\x81\xd3\x00n\xbb\xbe\xa8{U\xe2a#\x97>+\x99k\xe4\xf4+m\xc1a\x19\x1a\xecU\x8d\x98Q8\x14\xf3\x14\x0c\xc4<\xdf\xa1]_\xd5\xce\xaa\x9b\xcd\xf1n\x87]\xbcT\xe5\xd6\xb2\xe1,tg\xb7\xac\xc9j\x1a\xdf\x18\x8fD\xbf\xb7\x8b5\xaf0\xfb\x08.je\x11\x90\x16wzK\x86ID\x89BTB\xe0\xab\r"\x9d\x91#\xb40\x8a)\xe6\xa1Y\xf2/QInq\xf5\x18\x89\xef\xc8\xa5L\xd9\xce\xb5\x9an\xb5|\\\xcbK\xff\xc1\xcc\x03\x9f\xe8\xc1\xa6\xfc\xaa\x8e\xf4=\x87H\x95\xf2\x14\xc4\x9clh1\x83\xcb\xb0\x99Fw%\xb3u\xb7\xac\x98\x960\xe3\xf3\x1a\xa2\xb6\xb31\x9f\x0f\xe2#\xbc!\x94\xd8\xb1\x92\x8f\xbb\x94\xbbp%.p\r\xeck\x98\xdb\xc2\xc1\xf5*\xf2\xe3\x9c\xb4\xbcl\x8app\x08\xe2\x01\'\x85UQ\xe8\xb4Z\x81\xa7\xa2\xea\t@\'\xbe\xe8J\xf6\'\xb6v\x8ax\xa1f\xaa\x14\r\xa8\xdci8\x06\xa5\x02\\"\x9b\xa1R\xcd/\xaa\xce\x8d7\x1d\xaf-u\xaf\xe4\x90\xb0\x14\xc0\xb4\xca7\xa5\x85\xae\xe4\x93\x81h\x1a\xa8\xd2\xba[\xa5\xd4\xfe!K\xe9\xb8y\xf7*T^O\x95\x8f[\xdd\x13\xdb\x89\xb6\xceL\x92)\x12\xecjOP\xc7a\xa0\xe5\x92\x15v\xb2qE\xeew\xc2p\x119\xcd\x03\xc2\\\xfdPR\'X\xc0\x1d\xe5\xa2\x1f\xdf\xfb\xa7\xf8\xd3\xf2\x13\xcf\xe2s \x16J\xec\xb0FP\x1cX\xec\xaf\x17D\xf3\x19\x14\xd7\x93\x1fi-c\x7f\xdb\xdd:`0+\x92\x8d0BZ\xb5\xc3I\xb6\xb9\x93\x08\xa5\x9c\\G\x06tl\xacI\x9e|"1\xb7Po\xffj 96u\xa8\xef\x11\xb2wG\xee\x06\xfcE\xae\xe3\x08{m\xdb\x02w\xe2Lw\x94G\xdc\xb5\xb1g\r\xe8fd\x0b\x90\x0e\x06\xe1w\xcdu\xc1\xee\xbf\x19@\xb8\xe8e4%E\xf6\xbe\x99\xd2\x18_9\xb0\x8c\x88\x87\xee3I[\xc6\xa1q\x97v5q\xd8j\xcb\x84J\x0f\x01w\xed\xa4SjZ\x12\xdc\x17\xb0x\x83\xd4\x04\xb6{\x9f\x18\x8d\xc6\x89\xb9\x13\xa8V\x18s\xe3\xf56*3\x81c\xcb4\xe5\x0f\x9e\x84\xe7)\x8c\\?\xde"i\xdaO\xff\xa1N\xab\x05H\xe5\x82N<\xa0\x07\xca\xcdE\xc7\xc1\xeb7Q\x98\x8dC\xf5\x06v\xa9\x17\xd4\xe5J\xc04\x80\xcd\xea\xe4\x12\x9c\xeb\xb4.\xe3x\xa2/\xd2\x1aE}\xad5sr\xb0-\xb0#9\xc7\x80m\x1bI\x95gt\xfb\x10\x08a\x10\x86\xa0\xf2\xf0\x9e\xf3cg7W3\xbch!d\xc5G\xa1\xfbB\x98c\xa6\x0f\xf8N\x06\xc1\x17<,{\xdf\xd5\x1a\xeajM\xc3\xa9t2rK(WI\\\xd3\xb6\x86\xc3?-\x81\xd17HH\xdc\xc4i!~\n\x9e\x02\x89z\xd1x\xd8\xba\xb4\x1c+\x0e\xb52a\xfa\xa6\xc45\x9b\xfc1\xb7\x8bs\xba\x19rj#,\xa7\x9a\xe4!\x93\x02Y\xdf\xf9\x90\xad\x13J\xe1+\'\xc9\xcd\xa5\xd7\xec\xb0\x19\xa0\xcf8\xd9\x86\xb5\xc1AY\x8d\xb8\xd5\x86\xd5\x08\xac:6\xaf\\\x18\xec\xef\x8a:\x9c\xdb`\xb0\xb6\x98\x99\x08\xef 8\x01\x973\xd0\x9c\x066\xa0g=KO\x134/\x8aN\xed\x97I\\\xe0\xcf\x00I\r\x83\xd6\xfd+rS\x89\xc76\x1a\xec\x03\x92>5\xd0r\x10\x98\xdcL\x8c\xc6\xd8Z\xb1\xcee\xdf\xfb/\x84\xb1f]\xc2\xd9f\xc6\x0cW\x86\x7f\xf8\x05o\xe6S\x97\xfe\x04\xc3\xf9=\xcb\xffv\x92\x19\xb5 o8\xa3=\x9f\xa3o\xfa\x1d\x92\x14\xec\xa0\x02T\xe4\x1d}\xae_\xea\xed\x0e\xe4@z\xf5\xd7\xf4m\x19`Vx\xb0\xb0\x9e\n\x00\xe2\xe8\xe8\xb5(\x1ab\xccj\x13\xce\x1e\x9fl\x8eR\xcf\xa8T\xdf\xa4\x9f\'\xcd\xb3\xb5\xfe9E\x89\xdf\x02\xeeW\xee4\x99\xd2\xa8\xc3\x92\xc0\xae\x9e\xcb\xed\xc4\x9f\x9f\xa5\xa4\xb4ak\xbb\x14\x1azn0n\xeb\xd0qB\xce\xd6z\xcbI\xec\x08IA\x0f6\x8f\x17br4\xfd\x1d@$\x06\xcfU\xc2`\t\x9a\xc2\xe6\x805\xf4\r\x15\x16\xbao\x96\xbbSi\xe53\x9d\xf3\xde$\xdcg\xb2,%\xe5l\x9f/\x034\xabx\xbf\x9b\xe1;\xf8z\xd8\xce2\x1b\xaeC\x07\xf1"\x15\xac\xe0\xc5~\xca\x1d{\xb0\x8c\x05\xa4\xe5\xe0\x95\xaas\xbbC(E\x93e\xf2D\xdc\xd3\xdc\x89\xfd\x10\x122>e\xff\xfc\x17\xac\xf8cJ\xb2E_\xa8\x9f\xf0\xaa\x1a\xddVEjE\xcd\x80$\x18\xc1\xb7m\xf33\x02\x90]\x88\xfc\xc9\x14e\xbd\x81\xc3ui\xb6\xa3*1jOu8Pes$\xe2\x9al\xe7\x8b=W9\x07\x8b\x93\x88\x93\xb0\xad\xabU\xd7#\xfe\x85S\xe6\xed\xf9\x05\xde\xcfV\x89\xa1C\xe0\x1f4%P\x15\xbc\x03\x9d{Rl\x83\xd2\xbc\x85Vu\xa2\xdb_Q\x9d\xb0\xacZ\x04\x9f/\xc7\x92\x8e\xcc\xae\x90\xf7\xb4\xea\x15\x06?\xd6f\x8fZ\x0f\x12uV\x94\xcc\xb4\xb2G\xe5\xfa7\xd7\x8d\xa6\xcb\xd7\xc2?>5\xa8\xe6m+9rY~\x1f\xfe\xa9r\x96\xbd8RW\x92\xde{EX=?1\nX\x05vI\xe3\x03\x97\xc1\x1c%b\xbaR#\xdb\xd0\r\xc3\t\xaf\x18\xdah$\x07\x1c)\xd4\xafT\xfe\x0e#\xbcn\xb6\x98,\xaa0\x98\x08\xef\x87f\x1f$\xcc\xec<HrX\x9b\x90]\x97\xa4\xd3\x8d\xf9\xfcV,\xb3VY\xe0\x89\xb7-(\xc7.\xbf*\x1c\x17VR\xf5\xb9\x9az{\x0f\xaf\x17\xaaG\xf2\x1e\x92\\\xa9~.\xe3\xfc D\x8bk\xd9u\xbb=\xc8\x16z\xac\x8aAV0\xe9;\xb7=\xdd\xc1=\x1d(\xf9\x8a#\x10x\x19\x85\xe31\xde\x06wW\xd0.D\xee\x96\xa7\xe8\xb8K\x05h\xcc\xca\x95\x94\xb3\xf5pN\x1b\x05\xa3a\xb0\xa4\xc7\x13cFO\xd7\x81\xa39\xcaI#\x121z\x85\x04\xc9n4\x86*n\x83\xe0\xbc\xe2\x8c\xa1\xe2\x9d#\x199t\'\xac\xff\xb3\x96@+\n\xf9\x9e\xfb\x06$\x8f\xeb\x95\xef\xd8\xbb[S\x05`\xa6\x1b\x91o$v\x0f\x0eN\xe2\xb6\x15\xe8[/\xe1\xd8L3\x01\xae`\xa5\xe9s\xf5$\xb8!\x19\xa3\xf5\xbd\xa0\x05\x97AW\xe5\x14B\xe7\xd1MJ\xabdO\xcb\tO\x87\xaf\xfaq*\xfdcH\x11\xaa)!u\x8b\xc2\x97=|v^m;\xde\xd0\x83N\xaa\x10\xc2uM\xef\xda\xd4\xe4A\xbe\xe6\xd0Sb[H\xa8\x87\xab? \x9d|o[P[\x17Z\xa9h\xe5\x8bik\xe4\x8f\xb9;\'\xcd\x0bA\xc9\xf9\x1b\xbc\x8c|?e\xe3\x80\x18\x87G\x1a\xa1\x08\xbf\x1cJ\xe02AC\xc3\xb3i\r\x85\x0b\xf2\x93\x8dZA\x15"\x93M{\x02\xe6\xf80y\xd9\x16<\x82\xf8\xcee\x90\r,{\x81\xfc\x0fXh\xac\xf6\xbd\xeb=V\x96J\xe9f\r\x1b\x91u\xeb\xa2\xa1w}\xd0\x80\x8a\x1f\xa1\x19\x84\x04\x14\xfb\x99\x1d\xb2G\xa0Y\x9b\xa7\xf8\x9e\x01\xfft~\x93\xc4\xbe\xd8\xf0Y8\xec\xc7bhF\xf8\x1e\x8b\xc7?\x9deSR\x01s\xfa\x99T4]\xbd\xef\x9c\x1f\xd9z\x81i\xd1\x80+T"\x857\x8d&I"{\xc5{\x11\xc64JF\xc5v%\x1d\xa5\xfc\x17-\xeaX\x06\x01\xea\xc0\xd1\x8bn\x152\xc2%\x8d)f7\xeec\x06\x08\xb9\xf3|Z\xcd\xe1f[R\xe0\x8b0\xdf\xe5\xe7p7\x04\'\xcf\x9b\xdcV\x86\xc7Rz\x0b\x83d)\x92\xc2A\xfa\x9d\xbc\x11\xe2\x8e&\xd2\xb0 \xb2\xb9\x1c\x1bK\xb6\xb84SN\\8\x0b{\t\x94rl\x0bf|\xeda\xf4g\x1b1\x13\x02m\x9e\x15\xfeU\xed:\'I\x13@`\x88\x80\xdb\xf2E\n\x847\xfb9\x00<\xceD\xce\xcc\t\x05\x0c\x18\x95:\xd19\xa8\xac\xe3\xfdjI\xcfLf\x05\x99sM(\xa3$\xac\x05\xd9\x1ds!\xc50\x8d\xf7\x94\xe1\xc0\x1cRMn`y\nb\x8f\x00\xf2)B\xc7\xd27K\x9d\xbb\xc0fA\xbd\xbe\xf0\x9bM\xfb\x15\xcc\x06\xd7\xaaX\x14 \xd9\xd7]\xd9I\x8bS\xfb\x91C`*\xa6\xb5t*s\xa0\x1b\t\xa7\xf6\xd5l\xb57l\x99\xf9h\xc0&\xa6H\xc0\x9f\x9f\x15\x8e9 \x1c\xf5\xfcJ\x88\xc0Uz\x8a\'`\x8c\x15H\x92\xda\x1e8@\t\xce:\xca\x01\xf0\x7f\x1f\x16\x08\x813|\xaf\xaeP\xca\x92"\xc1\x14A\xa7\xb4\xe9\x1b\xeb\x84\xfc\xe0"ml\x9ah"\x1f\xb5\xb0\xda\xdf\x8aU\x1e\x146ao\x19\xf1x\xe5\x1cOqL\xab\xa4\xc5\xf5^\xe0\x94\xd5bf\x8e~\xe4\xafkL\x18\x18\xa0\xfbM\x00\xca\x87[\x8a\xee\x00\xd9\x1e\x00\xc9\xe9\x0c\x15\xa3\x17\x85\x1c\x9a\xc8&\xe5\xcb-\x80bw\xed\x94A\xfb\x87\xc9M\xa7PL\x991\x1b*\xca\xa9\xa0\xcd\xa4\xaa4\xe5\xd6\xd8@Yn4\xc1\xbcp\x96\xbeo\x89\xc2J7#\xb7\xed\xed\x82"]\xfdHu\x1f\xf3U\x9d\x13\x93\xda\xf2"Z\x18\xa8\xee\xd4\x16\xba\xf9s\xde\xb7\x02yb(\xca\xe3]\x0fq \xbcV\x80\xf2p\xf3\x18vkd\x8eX/\xed\x91I\x90\xc1E0~\xe7c\xe7\x9a\xb7\xbd>\xa7}\xc4Z^\xecO\r,w\x97\xfe\x95e\x932\xde \xffgbt\xc8x\xd9\xb2\xc7UR\xc5\xcd&\xc8j\x95C\xe2[\xa8\xd2*\xf0\xd5\xdd+\xf1k\x0b\x81\x1a<\xf5\x8e\xa7\xad\x171\x05b\xc8\xd9\xea2\x96\xe73\x08\xfab_\x10\xb4R\x80\xe0\xcd\x03[$kh\xa94h\x8f\x9f\xfeE\x8bZ#\xe8,\xbb\x8e\xa2\x9f\xeeWx\x7f\xc7\x94=\'{\x1bI\xe8\x86>\xcd0\xdb\x80\xd9\x1am\xe3\t:51/\x91\x16\x13=\xc5\x01Q\xa0\xbf<\xce)\xbb\xd2\xd2\xfe\x0fN\x04\xaeH\xb4\xd5\x04j\x90\x92g\x03\xf2%\xb83\xd6J\xd1\x96b \xcd \xa6\n\x97\xf9\x9f\xbf\x94\x15\xe8\x05\xc1\x8bO\xce\nvt\x870\xed\x1d6\x04a\xe1t2`)\xb8\xb0\x16Z\xddzF\x16\x19\xac}M)\xdb\x84\x83\xc8\xdala\x82\xe8\x1f\x91\xfd)\x82:\x00\xfeDU.\xa6\xc9K\xaeo\xa0j\x00\xe8\xe1\xef,F"\xa2\x08v1P\xec\t\x9c\x9b\xcd(\xaa8X,}+&\xd6\xfb\x04\x1b\xfb\xf9\xf9?j\x14\xd8\xcd0*\xbe9[\x1f\xf7p\x92\x14-\t\xdb\xb4\x9fK\xdd{\xaa\xaa\xb6\x93\xdbWCc\xf6\xada\xc482\xa8\x8e\xcc\xc00d\xdamgU\x07\x9a\x15\x9d\xe1Wl\xa7]\xc9g\xe4o\x8a.\xf3\x87\x11\x02d\x18\xec\xc3\xc2*\x8a\xa3F\xbcP\x84{,q\x89M\xab\xdd\xe5_!\x83\xab5\x87` \x90}G\x91~\xf3\x90v\xbc:\xda\x8f\xa9A\xb1@\x91\xaa\xd8\x7f\x84\x89\xd6@\xa0w\x93\xd1\r\x1e\x1d\x88\xa1\xb9\xaaZ8\xff\xe60?\x8e\xb3c\x06B\x8c\x8a\xb5\x80\x03\xdc(\xb7\xe7\x1d+\xa1+p\x08\x9b\xcd\xc3\x11Lpv\x17;\xc8\xbb0g#\xfa\xd9\xd0n\xa9\x0eV\x8c\x89<\xdb\xffb\xdc#\xf7\x9b\xf9\xb3\x00\xe1\xde\x0bs=\xd7\xb1`1Eq\xda\x98<\x1f\xda\xee\x8b\x8dN^\xbf\x15\x17\xdd\xe6\xa4\xf4\x90\x8a\xf8\x9a!\\\x8dO&\xd0\xce\xb6\xba\x08\xad\xd5\xb7>\xbb\xfc,\x98\xc0\xaaM\tX&o.*\x91\xd6\x0b\x0cIKS{\x97+G\x8fx\xcb\xc4\x89A\x82\xe8!\xc5\x82\\\xf6\n\xe1\xb9P\xe9\xec\xe1\xbb\x0f\xcc\xbe\x96\xf0x=\xd5\xfe\xa1,~\x0b:\xbd\xb5\x11X3\xf2\xdc\x18\xb1\xc1eC\xb5\xa7\xbfpV\'\xac\xf9\x10t\xbf\x1f\xe6L\x97\xf4\xaeT\xe5P\x16\xa7~\xa9\xeaK\xb7\xf9\xa3\xf2$\xa9\xf8\xceC\x83S\t\x1fQ\x1aB\xafv\xbe\x1e\x9d\xc7\x98\xbeQ\xce\xbc\xdc\xf8\xf3\x94\xbe|\xae\xf0\x0e\x8b\xef5\xe7\xd1j\x8a\x19:\x13\x86\x140!\x04\x86?\x157\xf9 \x17\x95$\xed\xa8\x1cI\xdd>d\xb1\xc2\xe3GL\xacv[\n\xc1\x9a\x84\xbbH8\xc2\x9dIx\x1f\x81\xb5\xd1\xad\x07\xf1u\x05x\xce\x1b\xa0\xa8\xbf\x82@\x0b1\xf0\xce\xd4\xcc!\xd7\x11\xf49\x90F\xe1\xd0\xc3\xa2\xde\x08\xc7\xa5D\xda\x1aY(\xce\x9dP\xf8\xd7O\xb1\xdf\x9e\xa1v\xe6Y0V~$\xd1\x9f]\xb7\xe5\xc2\xcat\x96\xd0P\xb9#\x9d\xcbrcl\xefKM\xce\xb9\xceS.\x16MdC{\xa5\xe8\t\x8e\xaa\xba\x8alH\xca\x93B\xa2\x08\xeec\xa6\xd8\xe2\x1f\xfe>\x16\x8f\xe6%\xb2W\x96\xfcQ\xc6\x803\'J\xb5S\x93\x03q:\xa4zg\x0e\xcbdLG\xf4P\xf2\xf1\xcb\xd6\xfa\xa9U\xe8ZsQ\'\xf8\x03\xa3\xb0\xa1\x7f\xda\x8b\x87\xb7\xf4\xa2\x93\xc6:n`l\xcd1\xbd\xf4a\\\xa0X\xd7\x1d\xa6\xcaD\xbb#\xbc\xae\x98>hQ\xf4\xe6\x9eT\xea\xf8\x12\xbc\xb9%\xa4\x1e\xfd,\x1e\xde\xf9\xeeaV\xcdM\xce\xd1\xba_\xf6h\xb2\xcb\xe0\xa8\xc8r_F\xf5\xd0V\x93\x91~9N\xbc@&\x19\xb3,\xc8\xbdK\xfe]\xbfi\xcd\x1b3\x05\x19\xe5\xc7\xfbnR\x02Q\xdet#\xc8Z\xf2\xd7G\x97\xf4\x07\xa3\xbc\x00\xb42~\x0f\x0f4#\xaf\xda>\xba2\x9e\xb1\x82\xa6$\xd2zRi_\xae\x97\xa1\x04>\xd8r9\x84\xef\xc0\x8a\x10\xd9\x8d\x19q}\xbc\x8a\x9bw\xec\x1e\x11\x14(5\x99\xfc\x8f\x19\xc8\xfe\xf1\x03Z\x91\x85=\x7f\x9b\xdbk+\xc7\xca\x15H\xfe\xe0\xcdB$\x04q\x16^\x1e\xff\xce2\x8e\xd7\xcc\xc8a\x16\xa6\x8b\x1a\xb5\xfb\x0e8\xfd2\xd1\x11\xfb\x1a\xc8\x07\x8d1\xfe\xb0\x84\xff\xbcf\xd4h\xd9\x88\xeb_\xa5\x1d\xc9J\x05&\x9d\x01u;\x89z\x89E\xd3\xd0\x85L\xb1Po:/\xd5db\xe6>v\xb7O\xb4\xe5\\\x02\x8b\xe2\xe92Uu\xf7\xba\x98K\x8d\xf4R\xc8\xd0\x8f\xecc\x89MD\xc6\x14\x1e\xbcs#\xe5\x98\x89\xd2\x95\xd1\xc2,\x9df$\xe7\xfc\xe4[\x1e!\x9c\xca\x87\xd4\x02O\x01\xb8fh,\x958GU(Xw~bq\x94"kj\xd1\xa6\x17.\x8aJ\x9ed.*Kl\xf5\xcb\x98u\xf9\xb3\x88\xbbG\x0b\xcc\x13B)\xad\x18\xfd]b\xca\xe5\xabK\xe8j\xf7\xe3\t\xa1\xfe\xeeO-\xb9\xeb\x93\xb0\'\xde^\x08\xcfE\xfbW\xb8\x02=\xe2A\xbb\xeat\x8a\xd4\xb7\xcb\xd7\xf2\x1a\xcat\x84\xc5\x8d\xae*j_@y0\xb1e\xdc\x85\x1aiW\xb2\x9d\x99\x9f`L\x19CH\xd5\xc2\xb0\x9d\x84]\xa8Z\r\xd5|\xad%\xe2y\xa6\xa8~\xd4\xbf\x95\x82=\xf8\x9d\xeb\xb3\xbe5\xeb\xfc\x9c\xaf\x9a\xa5\x99,\x11m\xf8\x07\x07\xe2\xadh\xfc\xa8F\xb4\xb6\xdd\x89\x99\xb1\xd8~\x17\x14\x88M\xd1\xa3K\x89\xbb\xb1=`&b?*\xfdRBn@Q\x08\x03\xc9\xb3p\xd81Ku\x08\xf4\x9dp+B\x88\x1a)\x90\xc0JYl\xe8\x97\xdd#uH\xe3\x02\xdc#\xc6\xdf=\xfd\x94\x8b\x1fIO\xc81\x8f\x96\x1b\x10\xc8`<\xed\x94~\x9b\x1c\x19\x8aW\x987\xb3\x0e\x96\xbc\xb44R[\xbd\xab\x04V\xb7>\xe9\xdc\xaa\xc3\x95\xd5>\x89e\xcb\x95\xa8\xc2\xd8\xce\x0c\xe9\xc9\x19\xec\xaa\xa7\xf0\xd0&o\xb37BNl\x17\x9e>\xfeW\xe7\x8a\xc72~+\xd1\xc9<\xc65\x86=l\xba7\xfcW\xe5{\x12\x16\xf0\xfa\x9d\x1c*\x04\n\xc5,\xfd\x87\xa8\xa1\xa1lVfj\xa3\xf3\xf8\x00\xfd\xd4\xf8Ww\xd7\x88\x0e#\xf8&\x94\x07\x0c\xbf\xfa\x0cfV\x84\xac\xd3\xcb\xa2Do\xf0\x14\xdcAu\xb6\xda}\x17\x12\xbd|Iw3\xff\xc9\x9bI\xc9\x17\xb1D\x9f\xf2\x88\xac?\xbd\x02\x8a\xbc\xaa\xd3\xec-p\x02\x0c\x9dy}\x1cdf\xa2i7\xc2\xfb\x89\xf0\x8f\x93hp\x87|{\x12\x06\x1c\x0e\x1d~c\'\xa3/w\xf4\xf95\xdf\xaf\x1e\x8d\xc6w\xcd1\x0e\xd1\xc1\xfea\x06W\xd6\x15\xfe;\n\xf3\xa4\xef\xeb\x0e\xb9Y\x86\x06\xaf-\xe8\xdb\xd5\xc3\xc0\xf6\x94W7\x93\xfee\xfb\xb2\xc8\x975\xc5\xd0D\xaap\x1e\xdea\x91T\xe4\x14\xfeL\xa9\xcd\x7f$S+\xe7\x8a\xc9\xee,\xa2"\xf4L\xaaS\xf4k&\xad\x1e\x8b)h\x10,Q\x7f\x98\x1b\x08\xfe3)\xd3@\xa1X\xc2\x02v\xa8/I\xd3\x9e\xe4\xf1\xf1\x879#\xec\xfdiNKS\xb1\x1a\\d\xe4u\x10H\xa0+\xeb\xa6\xfa\xc2\xde\x00\xdb\x06\xb5WE\x97\r\xf0\x95\x97\x7f\x102\xb4\xdc\xe2\xbd=D\xed\xab\xba\x8dJ{q[f\xbc\xab\xd1\x1f\xd1\xc5l\xd2\xeb\xc19D\x1e\x8a9\xf9V*\x00M\xad@N\x9a\x8e\xfb\xb2\xb1\xc2\xb9H|\xdc,\x80\xba\xf0N\xa8\x8aB\xb2\xc1\xe7\xeb\x85\x92\xeb:\x9b\xbe\xbf\x15\x1f5\xcc\x8e\xf9\xd255\xce\xeb T#\xd4\xd7r\x82\xe72*\xcd\xfe\x97\xde\xb0\xadgl\x10l\x0e\xfd>\xd7\xfd7\x14\x1fy@#z\x03s\xd9}koe\xfa\xf6\xd6\x9e07\xdb\xed\xe2\xe8x\x02\x89\xc1z\xa4\xca\xc1U5\xfdX"\xff-\x18=\xcb\xd1\xcd\x8f\x0f\xa2!\x8ar<;\xa2\xef\xdd\xd2K@\xf7\x12\xb9\xf6Tc\xbe\xea\xb7\xf1\xcc\xff\xb6x\x9c\xcd\x93\xc0\x89v\x8a\xe7\xdbV\xf5\xbd;t\xcb>\xcbf\xa3\x9c\xd9\x19\xdf\xd9\xb5<5t\xbfC\xac\x90\x8c4\\\xba\x18\x7f\xda\x8c\x9e\xf4\x80\xe7\x18(z\xf4C\x115\xea{\xc9\xd9\n\xd3(\x00\x83\xfa\xca\x02q:\x88\xf0G\xf6z\x05\xfegM\xf1\x8bbS\x99\xda\xa6\x7fk\xba\x8e\xa7\xefb\x98\x1f\xb6Cuy\x8f\xfc/\xf4\xe7\x08A\x83\x84\xee\x89\xed\x824\xf9\x0c\xcc\xaa\x91kh\x1b\xb0o\x0c\xe9\x96\xb5\x12%V\x06\xf6\xcc\x89fPd?\xd5\xb5\xa2L\xd2\xafx\x10\x89\xbd\\/\xbc\xef\x8e\x0b[\xb2B\xfc\x05\x12\xf7\x0f\xda\x16h\x17\xb8\x1e\xc6\xa1_o\x00\x82\xc8\xceZ\xe1\x11{\xfao\x91M\xdc\x01I\x94\xf1\x91V~\x1d\x08\xb5V\x9b\xe1\x95\xadk\xc131\x8d\x82\'\xb5%\xdd\xd2\x10SZ|y\xb7)\x8d\xa9B?M!*P0^\xfd\x9b\x92\xdc\xdb\xde\r\x91\x95j`\xd12\xe4\xd7\xfeL\xb6\x81|\xfb\x8b\x1fD1\xb6w\xe4U4^\xfdQ\x196\x02\xc5~\xf1\xf1|\xf9O\x91^\x90\xb3\xefM\x13\xb3\xf5\xed\xbf\xce\xd9\x14\x10;\xe4\xc5\x80$\x91Q,I\x9b\xc7\xe6 \x01\x0b\xecp\xd2\x1b(\xc9\x95\x07\\f\x93\x08\x08\x9a\x1e\xbe\x92\x00bU\x89u\xc9\x13\xac\xb3w\xfcxM\xb8\xc7e\xb6\x8a!\\\xda\xab\x8e\xc6H\xc5\x90}\x82\xaai\xda]!7wn\xb5\xfe\x1c\xbf>v\xbex\xb3\xb0g\x9dH\x03R\x93\x94Yn\x17\x1dX\xdcF\xefU!M[~\x91\xa8\x0c\xfb\xa8!1\x14I\x97 \xaf]\xef\xfd\xdf\xc9\xab\xcf\x98\xdcsL\xb2\xcd\x98\xbe\x13\x80\x01\xea\xd5\x9dPZq\r;\xa1\x1b\xcf\xc56m\xb5Z@6{\xfc>\xf4A\xd4\x8e\xbcE\xcd\xaf\x1d\xb6\x1f\xf2\xcd\xef\x13C\xe4%\x11Hb\xd7l\xbfI\xc7\xc2`\x17\x88\xd75\x7f\xda\xea8c\x95DgF\x91y_\x1a\x95\xeb\x98j\xa7\x16\xa8\xda\xe6;=\x9c\xe8\xbd7\x98l\x18v\xa2\x8e\xb8\xb0k\xd8\xe9+\r\x8c\x05\x10\xc7M\xfe4\xb6\xda\xeb\xfc`\x05\xd1\xcbJM\x00.C\xf0\x8e\xe3\x0e-\x17C\xa1}\xc6o\xd0\x9cl!\xee\xc0\xef\xd30r\x0f\x15s\xe3\xba!l\xba$\x9c3\xf7\n\xf1k{\x8c\xa1P%\xa0\x88\xdc\xaa\xb3)4C+\xd8,\\\x86\x1a"E\xafX\x07\xa3\xe7\xd8\xa2+\t\xbeh\xa9\xe1Vs\x16N"')
1
+ #!/usr/bin/env python3
2
+ import pprint
3
+ from flask_babelex import gettext as _
4
+ import pathlib
5
+ from hiddifypanel.models import *
6
+
7
+ from datetime import datetime,timedelta,date
8
+ import os,sys
9
+ import json
10
+ import urllib.request
11
+ import subprocess
12
+ import re
13
+ from hiddifypanel.panel import hiddify,usage
14
+ from hiddifypanel.panel import hiddify_api
15
+ from flask import current_app,render_template,request,Response,Markup,url_for
16
+ from hiddifypanel.panel.hiddify import flash
17
+
18
+ from flask_classful import FlaskView,route
19
+
20
+ class Actions(FlaskView):
21
+
22
+ def index(self):
23
+ return render_template('index.html')
24
+
25
+ def reverselog(self,logfile):
26
+ if logfile==None:return self.viewlogs()
27
+ config_dir=current_app.config['HIDDIFY_CONFIG_PATH']
28
+
29
+ with open(f'{config_dir}/log/system/{logfile}') as f:
30
+ lines=[line for line in f]
31
+ logs="".join(lines[::-1])
32
+ # resp= Response()
33
+ # resp.mimetype="text/plain"
34
+ out=f'<pre style="background-color:black; color:white;padding:10px">{logs}</pre>'
35
+ if len(lines)>5 and "----Finished!---" in "".join(lines[-min(10,len(lines)):]):
36
+ out=f"<a href='#' target='_blank'><div style='background-color:#b1eab1; padding: 10px;border: solid;'>Finished! For scrolling the log click here.</div></a>{out}"
37
+
38
+
39
+
40
+ return out
41
+
42
+
43
+
44
+
45
+ def viewlogs(self):
46
+ config_dir=current_app.config['HIDDIFY_CONFIG_PATH']
47
+ res=[]
48
+ for filename in sorted(os.listdir(f'{config_dir}/log/system/')):
49
+ res.append(f"<a href='{url_for('admin.Actions:reverselog',logfile=filename)}'>{filename}</a>")
50
+ return Markup("<br>".join(res))
51
+
52
+ @route('apply_configs', methods=['POST'])
53
+ def apply_configs(self):
54
+ return self.reinstall(False)
55
+
56
+ @route('reset', methods=['POST'])
57
+ def reset(self):
58
+ status=self.status()
59
+ flash(_("rebooting system may takes time please wait"),'info')
60
+ subprocess.Popen(f"reboot",start_new_session=True)
61
+ return status
62
+
63
+ @route('reinstall', methods=['POST'])
64
+ def reinstall(self,complete_install=True,domain_changed=False):
65
+ if int(hconfig(ConfigEnum.db_version))<9:
66
+ return ("Please update your panel before this action.")
67
+ if hconfig(ConfigEnum.parent_panel):
68
+ try:
69
+ hiddify_api.sync_child_to_parent()
70
+ except e as Exception:
71
+ flash (_('can not sync child with parent panel')+" "+e)
72
+
73
+
74
+ domain_changed=request.args.get("domain_changed",str(domain_changed)).lower()=="true"
75
+ complete_install=request.args.get("complete_install",str(complete_install)).lower()=="true"
76
+ if domain_changed:
77
+ flash((_('Your domains changed. Please do not forget to copy admin links, otherwise you can not access to the panel anymore.')),'info')
78
+ # flash(f'complete_install={complete_install} domain_changed={domain_changed} ', 'info')
79
+ # return render_template("result.html")
80
+ config=current_app.config
81
+ hiddify.add_temporary_access()
82
+ file="install.sh" if complete_install else "apply_configs.sh"
83
+ try:
84
+ server_ip=urllib.request.urlopen('https://v4.ident.me/').read().decode('utf8')
85
+ except:
86
+ server_ip="server_ip"
87
+
88
+ # subprocess.Popen(f"{config_dir}/update.sh",env=my_env,cwd=f"{config_dir}")
89
+ # os.system(f'cd {config_dir};{env} ./install.sh &')
90
+ # rc = subprocess.call(f"cd {config_dir};./{file} & disown",shell=True)
91
+
92
+ admin_secret=hconfig(ConfigEnum.admin_secret)
93
+ proxy_path=hconfig(ConfigEnum.proxy_path)
94
+ admin_links=f"<h5 >{_('Admin Links')}</h5><ul>"
95
+ admin_links+=f"<li><span class='badge badge-danger'>{_('Not Secure')}</span>: <a class='badge ltr share-link' href='http://{server_ip}/{proxy_path}/{admin_secret}/admin/'>http://{server_ip}/{proxy_path}/{admin_secret}/admin/</a></li>"
96
+ domains=get_panel_domains()
97
+ # domains=[*domains,f'{server_ip}.sslip.io']
98
+ for d in domains:
99
+ link=f'https://{d}/{proxy_path}/{admin_secret}/admin/'
100
+ admin_links+=f"<li><a target='_blank' class='badge ltr' href='{link}'>{link}</a></li>"
101
+
102
+ resp= render_template("result.html",
103
+ out_type="info",
104
+ out_msg=_("Success! Please wait around 4 minutes to make sure everything is updated. During this time, please save your proxy links which are:")+
105
+ admin_links,
106
+ log_path=(f"https://{domains[0]}" if domain_changed else "")+f"/{proxy_path}/{admin_secret}/admin/actions/reverselog/0-install.log/"
107
+
108
+ )
109
+
110
+ subprocess.Popen(f"{config['HIDDIFY_CONFIG_PATH']}/{file}",cwd=f"{config['HIDDIFY_CONFIG_PATH']}",start_new_session=True)
111
+ import time
112
+ time.sleep(1)
113
+ return resp
114
+
115
+
116
+
117
+ def status(self):
118
+ # hiddify.add_temporary_access()
119
+ config=current_app.config
120
+ # configs=read_configs()
121
+ # subprocess.Popen(f"{config_dir}/update.sh",env=my_env,cwd=f"{config_dir}")
122
+ # os.system(f'cd {config_dir};{env} ./install.sh &')
123
+ # rc = subprocess.call(f"cd {config_dir};./{file} & disown",shell=True)
124
+ from urllib.parse import urlparse
125
+ admin_secret=hconfig(ConfigEnum.admin_secret)
126
+ o = urlparse(request.base_url)
127
+ domain=o.hostname
128
+ subprocess.Popen(f"{config['HIDDIFY_CONFIG_PATH']}/status.sh",cwd=f"{config['HIDDIFY_CONFIG_PATH']}",start_new_session=True)
129
+
130
+ return render_template("result.html",
131
+ out_type="info",
132
+ out_msg=_("see the log in the bellow screen"),
133
+ log_path=url_for("admin.Actions:reverselog",logfile=f"status.log")
134
+ )
135
+
136
+
137
+
138
+ @route('update', methods=['POST'])
139
+ def update(self):
140
+ hiddify.add_temporary_access()
141
+ config=current_app.config
142
+ cwd = os.getcwd()
143
+
144
+ # os.chdir(config_dir)
145
+ # rc = subprocess.call(f"./install.sh &",shell=True)
146
+ # rc = subprocess.call(f"cd {config_dir};./update.sh & disown",shell=True)
147
+ # os.system(f'cd {config_dir};./update.sh &')
148
+
149
+
150
+ subprocess.Popen(f"{config['HIDDIFY_CONFIG_PATH']}/update.sh",cwd=f"{config['HIDDIFY_CONFIG_PATH']}",start_new_session=True)
151
+ return render_template("result.html",
152
+ out_type="success",
153
+ out_msg=_("Success! Please wait around 5 minutes to make sure everything is updated."),
154
+ log_path=url_for("admin.Actions:reverselog",logfile=f"update.log")
155
+ )
156
+
157
+
158
+
159
+
160
+
161
+ def update_usage(self):
162
+
163
+
164
+ import json
165
+
166
+ return render_template("result.html",
167
+ out_type="info",
168
+ out_msg=f'<pre class="ltr">{json.dumps(usage.update_local_usage(),indent=2)}</pre>',
169
+ log_path=None
170
+ )
4
171
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
172
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,81 @@
1
- # 2023-04-08T15:11:14.114123
2
- from pyarmor_runtime_000000 import __pyarmor__
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\x001\x12\x00\x00\x12\t\x04\x00\xdfY\x90s\x9eJ\xe9\xde\xac\xc1OG\x12\x1e\xc4@\x00\x00\x00\x00\x00\x00\x00\x00yYK(X;\xe8\x8d\x0cJ\x9b\xac\xf9\xc3\\\xe0\r\\;\x8e\x17\xaeF\x94\xba+\x96=:\x90H\xc2\xfa\xae\x8e\xdci\x16\x08E\x07\x93\x8e\xb4\xa7\xb8j\x16\x91\xb7<x\x82y\xb6\xd7k\xd8,R~\x92s\xbb\n\xed<`iB\xfb\xaa\x039}\x967n$\x1d.E\xffIL\x91~\xb3\xado\x92\x88\xa8\xdb4C\x98\xf1H\xaa\xba2\xd5\x8cr*\xf7`\xadu\xfbm\xa11\x9b!\x97^5\x8c\n\xab\x95Na\x94\xc4\xf7\x86\x86y\x83-K\x8bC\xee\x96]I\xabt\x9c\xf8K\xbbj\xeb1\xdf0\x0f\xcf\xa6\xb4\xaeC\xcfMf\xd5\xce|=\xc4\n\xd5{\xbf%Y\xe8G\xc3\x81\x90z\xd7\xfdt\x16\x84\xe2\xc3^8J\xb1\xde\x02\x83\xbc\xbfu\x0b\xba\x06\x9a\x9d\x16\xc5\x8c\x06P\xf4\x15\xcafq\x13Q\xcd\x12\x15\x9eW\xe0\xb5F\xf7=\x95\xc6N\x08\x89LE\x0fu\xeb\xe4u\xb7PD\xad@\xc8\x1d\xcc\x0e\x7f\xb8\xe5\x9f;\xdf\xdb\x8a\xc2t\x9a\x02\xb61cs\xe6\xe0R\xe5\xe2\x88\xe3Z\xd9\x0e\x05\xe8\x93`\x12\x95\xa9gIW\xe2r"\xcc\xf1\\`\x0b\x13\xc2N\xec;\x98b\xbe\xa9~\xae\rG\xf3\xcai\xeb\xb4\xfc5\xa8\xe5\xfb\xd9\xd3\xccwK\x1b\xa9_R2\xf9_\x08|\xaa\xd3\xf1\x92\xb7\xd1\xefw\x06\xc5\xbd\'\xa8\xa2c\xd4\xd0[\x8d\xe4\xe6\xa8\x9b\x86a\x13r3\x8c\xb3\x8f\x9aC\'\x1eW\xe2\xdb\x0b]\x87\xc5Phl\xba\xf1:7\x1c\x8f\xbb\xa4hC\xa4\xe2\xd1\xa5YC\xda\xa9]{Zu\xd1\xda\xc4\xb0\x99s\x17\x81\x1236\xc2\xc2\x89\x90!H\xf5\x03\xc4\x1a\x19g\xb8\x7f}\xa0\xc2n\xf1\x9f\xdb8X[<\x16;\xb5\xb3\xd2\xc8\xe8\xea\xe0\xaaX\x9avy\x11`\x1ev\xba\xddf\xff\xa8\xecU}\xe5X\xb5f\x1e\x98\x92$\xd1\x04\xd7p}\xc2\xa6&\x11\xc2-\x01u\xedJ9\x9eBnK\x0fP\xa2\xea\xedt\x8c\xa9\x886/\x10\xad\x1d\xd6i\n\x0c\x01\xe4\x82\x1e2\xa1G\x85=\x8b\x89\xca#\xbe\xd8o\xff\x9asji\xa0\x80\xf8\xcb\xf4\x82\xc0\x00\x94r\xcd\xbc\xaf\xbc6\xba\x0c\xb7\x83Kb\x02qaA\xc6\xefb\xca\x84_\xe1\xb7\xbb\xdfz..f\xd7n8\x16\xe0h\xf7\x01\xe1\xadJ\x8d\x9a\xbf\xf39\x14YC\x99\x18EX\xd7K\xd07\x1fj\r\x91\xa4K\xd2\x9e\xcea\xc8\x03\x89\xec\xbf\x98p\xe2t\xf30\x7f\x88\xfa\xbd\x1d\xbbY4\xd3\x1f\xfd1\xc3\x88\x16U1gLY\xf3Q\xf5wm$\x9e\xed\x99\xee\x02\n\x87y\x9dD`\xdcnn5\x0cPCo\xf7]\x81\xd0\'\x1b\x96Qf&\xd7:\xc7\x9a\x88\xbf;o\x15\xcc\xe0\xf2)-J@\xf0\xbbr\xb7@\xaf\xe2~\x98\x0f\xfe\x95\xaf+\x9a"$,?\xe3=\xe9\x1eg\xa4\xff2\x11D\x9a<\xa2\x8e\x86$\xbb\xed\xf3]+\xf2\x83\xc6W\x94\xc1\x85k\xaa\x9c\r\xbd\n\x8f\x11\x08\x8d\xd6_\xde\x80t\xc8\xce\xe3\x08tX\xdc\xebS\x81\x85\xd8SP \xd3\xed\x1d\x94\x15h7\xee\x80\xa0\r\xe0(f;\x06\xc7k\xc5q\xe4k\x14\xf8d\xcd\x9f`y\xd4\xaf\xe7F{\xf4p{\x9eO\xd1:R\xcdN\x83\xaa\xeb\x1fN(!\xc2\x9c\x9d\x84\xf7\x07\x99\x80B-Q\x00Q\xbcg\xbf\xf9\x00Q\x05w`\xa840\x85\x96\x10\xf5\xce\x9e\xfd\xd4\xf2\x04[\x9f\x0b\xa4yf-n\x17\x9c\t\xb0\xc7\x98\xbd\xe8UP\xf1V\xf0\x8fz\x9e7\xfb\xf6\xfcQ+\x9aE\xc4fO/7\x1e\xfc@\xf5^dk\x8e\x80\x9a\n\xb5\xbc>$:\\\xbf\xbe]\xe6\x19\xa6\xe6)\xe5_nJ\x1d\xc2+\x83\xce\xd9\x9d\xafYkC\x9c\xc21LE;\x983\xe3\x9c\xea\xdf\xb8\xe1\x9f\x9c\xb8\xe9\x9b\xfc\xc1\xda\x8c\xf3\xe0\xc94\x8f\x83h=R\x89f\x86\xf5\x14\x9e\xb0\xb2\x91\xcdi\xbbD\x80\xbc\x04\xd7\xb4\x08\xaf\xe4\x82\xad\xb1\xab$\xd4\x97\xba\xe2\xcb\x1c>\xc5\xd1P\xf0\xbf*\xd2a\xda\xa7,\x18\x10a\xd4U\x1f\xd3\xa5z9\x86\x01\x1f\xc7\xd8\xba\x06\xe8\x87\xc3\x95\xe1\xe87\xb0\'\r\x1d)\xab\x8f\xb9\xe9C\xf2\xe3\xfd@\xbaNz\xd2\x06#\xb7a\xa2\xfa\x02\xd2\x17 Z\x98\xf8\x13IZ\x02v\x0e\xca7x\xbb\xd7A\xad*\xa5o\xf0\x05\x82"\x16\\\xc8\xee|\t=\xe1\xef\xedy\x86wKU\x97\xeac\xb3(\xbd0EXX\xc2\x1b`c`\x9f\x92\xf5\x1a\xa2%=5\xeb\xfc\xf7ve\r\xe7\xfb\x81\xc7\\\xaeiTav\x9e0\xfd\xe3\x94\xa2\xeb\x02\xdb\x8a\x04u\x15d\xb8\xa1\xd5 \x0b\xeb\x84\xdaa\x1e\xa5\xbeko\x9b\xdf\xb4\x19;4\xe5M\xaf\x85[\xed\xf6\xe3\x00z\xb3Z\x0e\nU\xc7J&\\J\x8dd;\xa9f)\xdc/\xf5\x99\xb9\xa1\x8d\x1b\xd0\x99Y\xe1;\x90\x01\xf7\xbbk\n\x18\xc4\x91V:\xc7T\x9eZ\xcf\xbdK+\x19\xe2\x01Tz_\xf4\xdf\x8d\t\x1e\xc2\xf4\x0e`\x9a\xf6=l\x85\xe1\xcd@Q\xaa\x90\x9f\xa3\xf5\x03\x89\xd2\xc0\x9c-\x9b\x1c\xc7$a\xa1\x11\xb0\xce\x07\x1d\x07\xb4^\x02h\xdb\xba~\x01W\t9\x91d\xda\xa9(\xa7*\x0fq\x15o\xa8\x03p\x93(lHS\xd7\xee1xe\xa6y\xe6\xfc\x1d\xf6;5Khr\xf2\xab\x07\xf6\x1a5\xfe\x84q\x01\xfe\x86F&<\x0e\x91\x8f\xa3\xdf\xb6J\x8eH\xf7\xcbL\xbcE\xa3\xb1\xcc\xf0\xe2\x9ab\xbd\xf7<6\xe2\x17#\xc8$2\xf8\x8bY\x9d\xcbF\xdc\x10\xb0<\x8d[s\x88\x08\xb9\xe0\x9e\xe9\xf4\x05Ko\xcc,\xdc\xe5\x82\xa1c\xdd\xb0e\xfdR\x9f\xdd\x81\x9d\x88u\xc5\x13\x08\x99K\xe4\x14t\xa9[\xe1\xe9\x99s9\\_\xbc\xef\x15\x96A\xd9\xd0\xa6;\x01\x80\xc8Q\x81\xae\x7f\xfd\xa3}\x86>\xc4\x0cs\xf3\xb02\x1d(\xedA\xfb)\xd7\x0e\x89JF\x10\xd4\xd1\x8e\xef=\x82=\x1c\x8b4\xc7k\xb5\xa2\x80\xb9\xc2;9Ss\x84N\xbf\x1f\xf5\xa5\xfe\xd6\x18*\xd7\x08?t\xb7F\x0b\x04C\xca1\xee[\xba\xcd\xbe\x85\xce\xecV\xae\xdd\xcaq\xde>\xf5\x04C\'\xdb5\xdft:\xb7US\xb2\x01\xce^\xb0\xbc\x1f\x80{\xfb\x02\xba,\x11,$b\x0c\x8dE\x10\x9c\xc5O\n\xf5\x01\x0fS\xf2\x01\xc5\xd0\xe5\xdbN\xe7w\x80\xf2i,#\xb7[\xf4P\xe7\x93\xb0|N\x80TAtW\\\xf0\x96K\xc1NB\xa5\xb9\xd5\x12\xe5\x1cY\x19%5\xc6,\x90\xf5\x16\x90zQ[q\xc8\x0b\x11\xf5,\xf1\xc4\x04[l\x99H)\xc5\x1b\xc2\x08\x93\xd8\xa4E<f\x92E`\xbd\x06h\x15\xc1\xe3\x1f\x08\xd3R\xc4LB\xf6\x85\xeb\x00\x1c\xd7l\xa2\x98\x9e\xb0\xed\xd1)\xee\xc6\x16\xa55\x90#\x8e\x87\x0f\x8cg\n\xe2\x91Zh\x9f.\x03_\xdf\x00}\xe5\xea\x9d[Xo\x8e\xb4\xbe\xf2\x103k\xb4\x11\xf3\xb0\xbdt%z\x98\xcf1\x1f\xd37\x0cM\xe3\x18h;\xf8\x16I\xce\xed\xc8\xdd\x14\x85%\xc0\x9b\xcb\x11\xea/Kz\xce\x11\x90\x93\xf0\xedF\xfe8\xad KH?\x99\xfd`\xca\x13\xd8i\xeb\xde\x08F/\x88c\xff:\x91\xfb\xba\xb0`\xb7A\xb6\x07\xb7[\r.Z\xc1\xbe`\x84\xf3y\xcfB\t*\x85`\x14\x8d\x14\x0c\x86\xe7m\x8b\x90mC\x1d\xa9\xadr\x03\xba1\xef\xf5\xf2S\xf2\xb0\x86\x18!\xe2\r\x04\xef\xf1\x8f\xdb\xc0\ri\x10<M_\\gh\x8e^b\xf3\x8bK"\x95\\\xeb\x1c\x83A\xc0\xaf\x99\xbc\xb2\xb5\x93\xb4\x85V\xfe\xceh\xca\x11\x82\xee\n\xc0X@\xc4\xf6\x11\xf7)\x9f\x83\xb9\xfa.\x01\xfb\xdbh\x8f\x03\xb5\xd5\x07H\x9c\xf95R\xbe\xd0\xec\xd3\xaf\x13\xc6\x93\xf9/\x07\xd8\x91\x12\xc4\xe4\xb2(\xe5h\x94\x8f\xba\xb5\xf7>\x05\xb2\xa7]\xc5E\x8a\x05O*OT\xa2\xc8\xf66\xc3\xbe\x94\x13\xbf7z\xb35]\xe2\x92.\xbe[^\xab\xb5?\xb3\xc1\x1a$\xb0v\xdf\xe7\xab\xea\xce\x91X\xb41\x05>\xdc l`\x1b} \xcckS\xc8\xe0\x19Uu\x1f\n;\x00\xb9\xdb\x86\xbcSl3I9\xe9q\xa2\x0e\xda%\x14\xcbL3!\xee\x89\xb4=\xd7k\x17\\\x8a\xd7P\xbd,\xea\xe4<\xe5!Z\xec\x83\xee\xc8\x8b\x16\x1c\xa4\x03\xac\x1d\x17\x8c\x1b\x00J\xc4\xf6Lf\xa3DZ\x93p^\xbb\xfa Ot7\x8f+\x8a\xc2\xfaG=!S\xf09\xc0>\xa1\x9eNYH?X2@#\x88\x84\x0eQb\xf7\xa6 \xf1\xa5mh~\xaf3\x16\xe8\xd6\x90\xa0\r\xeej"\x16#~\x95\x9f\x11\xd9\xe6\x90\x9e\xc5\x83\x1a.s\xa6p\x89\xef?\xfe\x92W\x85P\x89\x0f\xbae7W\xf5\x08PU\xc6\x89\x88\x99\x1f\xb2\x1a\xde\xb9\x80Nf\'\x10O\xe6 \x08E\xe9\x07\x12S\xacQ/.\x19\x13X\xc6,\xed e\x12\x14`cR\xf25\xfd*`\xfb\x04\xabV[\x01\xbdA\xaf\xc3\x0b\x8cRm\xa7\n\x08\xb4\x12\xc7!\xc1\x85\xd0k\xd9\x82\xd9\xa3\xeco\x1a\xf0\x11\xa2\xda;\xfe\xfa\xde\xba[\x06\x0e*\x8f\xc50\x9a\x9b\xb8\xe5\xe3)\xddo"\xb5L\x01}\xe1\xdc\xf5%\xe8\xcb\xb1g.%\xc1\xc1\xbdJ\xc8\xe8*M\xa6\xd2\xa4"\xcc\x9f\xd1\x93\xf8\xa9D2\xe7\x05Z\xfcW\x17[i\x03\x81\x9e~\xb3]\xea\xa8+t\xd9\x93{2\x06\x8c\xa4e\x05}\x05\xa8\x83,\xbd\xee\x7f\x13\xdc\x19-D\xd1E\x1bx\xaf\xc6\x10\xdf\x143\xb9H\x8b\xac\xa7\tEja\r\xd6\x1d\x0ey$N\x02\xc8\x94q\xf5\x17b\xa54L s\x13\xb2\x14p\xe6\xbf\x02C\xb9\xd7\xbb\xeco\xcdq\xec\xbf\xcb\x03\xa7\xdc\x98\xeaV}\\\xb1nh"\xa4\xd4\x8c\xd9\x12\x819\xbe\xd3"\x0cm`\x99\xc7\xb6\x80\xf7N!\x07LR\x1a\xa0(cw\x87=F\xc1\x7fc\xc9=\xf9\n<j+\xab+,\xcd\xb3\xa4\xf8<U\xf0&R\x03=n\xf4\xbeL\x9eC\xe8\x94piq2/\xb8\xa2O\xfcQ\xe8W(\xa5\x94\xab\xaa\x9cEF,v\xdbu\xa01J\xfc\x8f}\xfeD\xe3\xd3%\xa8\xadf\x0e^\n<C\xd6\xab\t\xa5\xdd5-\x1d&\xa0x\x82g^\xfav\xae\xf7L\x8a\x15\xc2\n\xf9\xc7\xacJT\xbc\x99_\x0f\x9d\xe7\xc8m\xbc2\x99\x1e\xedO\xede)|E\xd5#66\xcd\xd9\xa6\xdc6/\xbb\t\xa4\xe7\x97\x1e7\xc9@\xf85\x84\x81\\j\xe2v3-ll\x0fr\n\x94\x0f.W\x07\xdbIy`z\xde?\x9f\xf8\x99\xf2y\n\x17\xef=\xba\xf69\xc4oM\x01\xa8\xcc\xa1\xb7\x90\xceR4\xce\x17\xbc$\xe4\x99\x89O\xda\xbcl\x03@\xca\x85`(\xb8F\xde\xc1\xb5\x1c\x89t\xbeQc\x97H\xf5\x12\xafe\xff\xda\xe0i\xaf\xa1l\xbf\x04\xf3\xec\xce\xec\x14\xbf\xb3\x1a\xa5\x87B\xc5\xd8H\xe8\x89\xb6\x14q.\xfc\x1e6p\xb2^\xaa\x91\x1a\xd8\xd6\x9d\x87\xa8>\x1e\xee\x18\x01\x1dK\x92H\xd5\n]d2\x8e\x12\xcf\x86\x11mG\x15\xea\x19\xf1\xb7\xec\xf4^\xf1\x8a\xf41\r\xeb\xe7~@\xa83\x8c\xb9\xf2o\x85\xaf\x10T\xdc\xd2\x12\x19+\x14\xd0\xce\xb8\x19n\x97\x84\xe2\x83h\xf5\xafG\x0f\xac\xbc\xf6B\xa8\x1a\xf91\xe8\xcf^\xe6D\xdb\xa5\xe6\xce>D\x16\x01C\x17\x0c\xa6\xe6E\xf7"\xfc\xa2\xd8\xf2hZ+r\x16\xc4\x07\xfb\xde;\xae\x9f\xee\x06\x12\xe9\x08\xe6+\xcd\xb0\xd9\x1ch\xe6!\xd2\xb7\xb3hb\xbc\x05\x98=\x84w\x05\x81\xda\xea~\xd1!P`\xa7\xbc\xcd\x85UB\x1b\xb6r\x1b{\x8a\xe6\xe0`$\x9a\xb0\xb8V\xce\x80P\x14\x94\xa2\x8b\xcb\x9f\xe5\x13[jln\xd2O\xe5n\xb6\xda\xd6\xd4\x00\xe6.!\x91\xc0\x16\x1d3\x04*\xf7\xa1D\x0f\xbffzV\x88\xb4\xb2\xa1\x90\xf4H Q\xb7O\xb2\x88\xca\x1f\xd6\xd2V\xa1\xe1j\x1fs\xfaabX;\xe3\xa4\xd7sv\x00\xd67\x1e\x90lk\x8f\x99<\xab\xff\xde\x98\x1b \xa8\xf5+b\xd5\xb4\x9a?~\xf8\x1c\x8e\x1a\xf7\x83\xd2^M2\x08\x91\rT\xa0\xb2\xf7\x9e1*\x89h\xdc\xe4m<\xb0\xaf\x0480S@\x9b\x9b\x159\r\x07\xf2\xb2\xf8\xd7\x93\xf7t\x98M\xa3P\t\xf4\xf7\x12\xc3\x1b\xd1y\x8e}g\x12\xb2\xc0\xc5Q\xf7\x18\xc7Qs\x1ey\xa9\x8d\x01J\xcc0Q\xc4Do\xfb\xbe\x92\xd4b\xaf`\xb9\xf1\x10H\xc7G\xb7ntj\xbe\xe9\xdd\x9bB5\x02\xc7\xed\x91P6\xefw\'R%\x93\x12\xbf\x174DTo\xe5\x1b\x9d~u\xcbTd\x85\xfc\xff,\xcd\xf9\x1e\nBn?\x92d\xf0\xd1\x9c\xb4j\x9c\xf4\xaa\xdd\x16\xa4\xee\x97\xb7=,\xbd\xb5HQ\xcb\xfb\xd7\x82\x8b-\xfe\xd3?\xbd\xeb\xadw\xd2\x94%\x0cw\xb54\x12\x96\xd48\xef\x0ej@\xe7O\xb5\x08\x1e\xf8_x\xd3\x06q\xf5/\xdb@\x98=\xe3\x94\xc6\x80n\x99[\t\xfe\x14\xf9\x89\x1a\xddU\xe4\t\x95p,d\x82\xdf\xbf\x1d\xd5\xd6\x15^\xb3\x04fT0\x81\xe1\xfc\xd5\xc5o%\xaf\x92\x91\xdb7\xdcSa\xed\\x\xe4)\x93\x9a\x02\x87\xd9x\xea\x99\xfb\xb0\x82\xcc\xc9\xb3\xe6\xc1\xe56O\xc4\xd8\x9b\xab\xc0\x9b/r\'g\xc2\xf7=Y\xaa\xd2\x81\xeb\x02{\xb9#\x87\\a\xa1\xf9\xcc\xf8\x9ao\xa2 ,\xdbL\xe0U\xa0\x86\xb9X}\xcf\xaa\xf6\xf8\x1aLpGP;\xf7\xda5:\xcb\x9f\x13\xf7\xf4}*\x1bs\xec\x1b\xe5H\xab\xea-\xd6\xeaN\xe8\t\xbae\xa4\x1fe\x8fD\x99\xdd\xd9\xed\x88F\xfc\xfe`\x80\x08\x12T\x1e\x0b\xe8\xc0\x11\xf0fX\xc7\x15\xc8\x12\xb1\xec\x80m\xc9+\x86\x96\xc3\xbcee\xfc<\xe4\xcf/:\xf8\x1b~\xdb\x91\xcb\x00]\xb1h\xc9r\xdba\x06K\x1f\xaa\xdbWN\x8a9I;)\x0f1\x94\xd5/<\xe6\x80B\xe3\x7f\x1b\xe0\xfeG;v\xd7\x12\x91\xd5\x14\xf2<\x00\x15\xb1\xc9s\x15\xff\xbe\x1at\x93\xc8\xaf)m}\xbe\xf2Z\xbch\xee#R\x8a9\x05V\x963\xe1 \xa2\xfe\xbfz\xcd$\xc1\xf4k\xfc\xb2z_\xc7\x01\xe3\xad\xbes\xc4\xb9\'\'\xfa\xda\x00\xe4\\#;\xb8\xc1\x16+\xd4\x0c\xc2\x89g\xd9\xc6\xf5z4\x86\xb7\x04h\xa5\xc0\n\x89J\xfe\xbbr\xa3T\xee\x17Tj\x8fa\xcc\xd1\xd1D\xef9\x08\xdc\xdf\x04Bj[\x070\xc3\xb3\x07^]\x17\xab\xd7HE\xf8\xe9\t\xdb\xd7\x06T\xb3G\x10pV\xb7b\x13\xfft\x9b\xbb\xa2\xe0~\xb2\x94\x88\xb7\xcaO\xa1-um:\xfb\x9c\xc5`\xbf\xf5\x91\xb7\xc9\xf3\xbd\xc7*\x7f\xc2\x92]\xd7\x9a-C\x8by\xc8\xe9\xa6\x86LV\x0c\xad\x10\xc3\x96\xcaj\x01\xa3\x18\x06=\t\xad\x9c|R\x99\xe4Y\x8b,\xaf+\x170\xe54\xa1\x87\xef\xc7\xe0\xe3)!\r\x80\xaf\x8e\xe5X\xcb\\\xf8\xce\x94\xae\xf9Rn\x14Z\x89_\x08\xda\xfc\xe4MA\xbaR\xd0\t\xac\x9dF\x1d\x7f\x95O\x19\xf6%l\xdeg\'\xe9>m\xbb\xf2\x90[\x14\x96\x02\xb1Z\xd0ZCo\x16\x9f`\x89\xa9\xe7\xab\xfa\xbb\x0f\xa1\xca\x0f\xa1r\xa3\xb5\x15d\xcb\x08\xeb\x87\x868\xc1\xc8\t\x05SwY\xbc\xd9\x1b\xf1\xda=\xb0Z\x88\x8dfS\x04\x95\xf9\xa9\xc8p\xaf\xc7\xec*~\xa9\xcc\x84\xf1\xd8\xe2o\xdd\xa3\xd8\x12\x15\x0f\x163)nDU\x8d\xe1\xb5\x96\x04\xf5\x91\x9e 2\x9f\xdb\xb9\x13e\x8a\x07\x81\x06j\xa5\x10\x95}47W\x94\xf6\x9e*\xf7o\x9aC/I\xc5T\xaa^;\xf4\x18ih\x96[\xc6\xa7\x908\xcd\xd7\x8c9\x03#}\xc2\xff\x1a\xa0\x14\x96\rT\x91L;\x95\x00[\xfe8\xdb\xf6\xf4\xc3\xf3\x84\xd0 \xd60\x82\n\xa8lS\xb7b\x8eB\x7fT-\xf8\xf5{4./\x1f\x14~\x9d\xc6q\xd8\xd5\xf4WQBJ/\x08\xd9S\\\xe1\xe3-v#_\x8b\xe1\xec\x8e\x83\xdb\x00\x11\xa5*\x7fb\x80\x82\x95sy/\x95\x91\x93l\x85\xaa\xffU\xea\x16\x0b`\xfe\x18\xdd\x1b\x06\xbaQ\xa8\xe9\xcb\x0b3\xda\xc0\x1ep\x1be\x12\xdf\xadG\xd2\x94B\x1c\x82g\x801s.>%\xce\xb6%\xeeQ\r\x88\xbe!\xb97\xed\xa8a[\x1cv\x8c&\xc8\x9c\x04\x1d_\x0e\x04O*\n\xd5\x9b\n\xa1\x94\x87v\x06!\xe2\xbc>\x88w\x87\xbapQ\x06\x96\x19=h;\x0f\x0c\xc9_=\xe7K-R\t\xa4\xe9=o]\xcf1\x89Y0\x99%\x03;dv\x7fd\xa47\x95\xc5#g4\x13\xc3%W\xa9\xe1\x9f\x04\xcd\x92\x95\x1d\x96&\xf4\x8dd\xe7\x15/\x1b\xf9,\x1b\xe3\x1by_\xaf\xbd\xde\xe5)\xbe\x12:U^Ph\xae\xf4\x01%t\x1a\xe1L\xaf\x00y\xedF\xcf!%\x86\x16\xd1\x0c%wg\x87\xc5x\xb6\xc9%\x1bd0e\xb7N:\'n\xd9h{\x85\x83%\x10\x99\x8b\x07\xf6\x1f.\xb8q\xb4=\xa6\x9a\xc9\xec\x04k\xcfq\x82t\xc10\xa9\x82\xff\x7fkbR6\xb8C\x19\xd8\x82\xefg\xab2,\x9b\x83\xd8\xad_v\xc9W\x87\xf2\x90\x8bH\x0f\x1e\x8dZ\xf1\xa6\xa3;\xd8\x8am\xbb>\xc9\x13&\xedi6\xc4\xb4\x9c\xa7\xc9\xfe\xdav\\1-\x95\xe4\x98\x8f\xd8\xa8\xdd-\xe7\xbc\xbb\xa2\x8a\x1b\xccW\xa5\r>\xce\xfe\x0e\x94\xed\x91|b\x08\xb2\xbe\x8a\x0ePm\xd9\xc7\xa0\x8eds\x90\xebv\x83\xa3q\xc2x4\x0c\xd5\xf5\t:\x9d\x82kI\xc6\xfd\x1c\xc4L\xbe\xa5<\xcf-2D)\x9b\xb0\x19\xbd\x80Qp*f\xdf\xb8\x0f\x9fi#\x94\xabx\xba<\x06\xe2^\xc4e\x01\x9b\xbd\x86\xda}\xd7\x11I<\xcf\xf3\x91\x86\x02\xdb\xb6M\xe3\x85\xa1\x1e\xfa\xf9\x0b\xa1e\x00s\xb3/dZ\xdc\x08d\xcb\x1d\xc1\x0b\x14\xff\xbc\x9f\xabYU\xb1=K\xc4\x07x\xad\x03\x9fg\xdd\x1b#\nF4\xa3\x0fW\xbezqBC\xff\xb9\x1d\x88\x95\xa3z<3w3\x17\xc1$\x98\xa2\'\x00\xbc\x08\xb3\xd0\xe2K]5\xdf\x1ds\x02#\xfbE\\\x01Ab!0\x0e\x9e\xffF\x0b\x88\xbefW\x8e\x96Z\xfc\xcc\x87N\xd2$:\xe3i"\x1eP\x104%\xfck\x08]bPv\xee\xf2\xcbY\xabg\x1a<\x00\xafUY5\xab\xcc\xf1\x96\xf6\xb1\xef\x96\xf3\xc7\xa2\xbc\xd2\xbal"\xe5B\x11c\xa9\xee\xff\xcb\xc3V\xa6\xa0\xa4\xb8\x85\xa1\x8b\x0f\xca\xfd\x9e;\xf7\x0fU\xa9{/\x8a\x16\x1e\xbc\x91\xfb\xfb,c\x1dh>\xd0Q\xe9Q)\x1f\xab\x90\xb8\xf5\x13\xb6\x14\xca\xba\x10\x1e\xff\xb1\x02\x8dvno2\xdc\xd4\x8cM\xb3\xd1S\xf7_\xb6\x1b\xc6\xc5\xc9\x1aq\xf6\xa1u\xbf\xa46\x1b\xb5_\xe3\xb03\xfc\x97y\x1e\x10\x89\xcd\x93\xccoC\xf7\xc6\xc6q9\xe3V\x88g1\xe2%\xf4%\x12\xc5B\xe5\xa2\xea\xa1\x9cG\x18!p\x1a\xc6\x8b~A\x85\xbd9z\xf3\xfeT\x02\xff\xe7\x87S\x1e\x8f\'\xfd\xc8Xm\x07\xa7\xd1\xc7\xbd\xbb\xf5\xb1h1W\xb3\xb0g\x99\xd8\xc1\x05d\xda\xbc_\xa3')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ #!/usr/bin/env python3
2
+ from urllib.parse import urlparse
3
+
4
+ from hiddifypanel.panel.database import db
5
+ import uuid
6
+ from flask_babelex import gettext as _
7
+ from flask_bootstrap import SwitchField
8
+ # from flask_babelex import gettext as _
9
+ import wtforms as wtf
10
+ from flask_wtf import FlaskForm
11
+ import pathlib
12
+ from hiddifypanel.models import *
13
+ from hiddifypanel.panel import hiddify
14
+ from datetime import datetime,timedelta,date
15
+ import os,sys
16
+ import json
17
+ import urllib.request
18
+ import subprocess
19
+ import re
20
+ from hiddifypanel.panel import hiddify
21
+ from flask import current_app,render_template,request,Response,Markup,url_for,jsonify
22
+ from hiddifypanel.panel.hiddify import flash
23
+ from flask_wtf.file import FileField, FileRequired
24
+ import json
25
+
26
+ from flask_classful import FlaskView,route
27
+
28
+ class Backup(FlaskView):
29
+
30
+ def index(self):
31
+ return render_template('backup.html',restore_form=get_restore_form())
32
+
33
+ @route("/backupfile")
34
+ def backupfile(self):
35
+ response= jsonify(
36
+ hiddify.dump_db_to_dict()
37
+ )
38
+ o = urlparse(request.base_url)
39
+ domain=o.hostname
40
+ response.headers.add('Content-disposition', f'attachment; filename=hiddify-{domain}-{datetime.now()}.json');
41
+
42
+ return response
43
+
44
+
45
+ def post(self):
46
+ restore_form=get_restore_form()
47
+
48
+ if restore_form.validate_on_submit():
49
+ file=restore_form.restore_file.data
50
+ json_data=json.load(file)
51
+
52
+ hiddify.set_db_from_json(json_data,
53
+ set_users=restore_form.enable_user_restore.data,
54
+ set_domains=restore_form.enable_domain_restore.data,
55
+ set_settings=restore_form.enable_config_restore.data,
56
+ override_unique_id=False,
57
+ override_child_id=None
58
+ )
59
+
60
+ from flask_babel import refresh; refresh()
61
+ from . import Actions
62
+ action=Actions()
63
+ return action.reinstall(complete_install=True,domain_changed=True)
64
+ # hiddify.flash_config_success(full_install=True)
65
+ else:
66
+ flash(_('Config file is incorrect'))
67
+ return render_template('backup.html',restore_form=restore_form)
68
+
69
+
70
+ def get_restore_form(empty=False):
71
+ class RestoreForm(FlaskForm):
72
+ restore_file=FileField(_("Restore File"),description=_("Restore File Description"),validators=[FileRequired()])
73
+ enable_config_restore=SwitchField(_("Restore Settings"),description=_("Restore Settings description"),default=False)
74
+ enable_user_restore=SwitchField(_("Restore Users"),description=_("Restore Users description"),default=False)
75
+ enable_domain_restore=SwitchField(_("Restore Domain"),description=_("Restore Domain description"),default=False)
76
+ submit=wtf.fields.SubmitField(_('Submit'))
77
+
78
+
79
+
80
+ return RestoreForm(None) if empty else RestoreForm()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
81
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product