hiddifypanel 3.0.0.dev64__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 (70) 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/websocket.py +9 -3
  32. hiddifypanel/panel/admin_2.py +33 -3
  33. hiddifypanel/panel/asset.py +17 -3
  34. hiddifypanel/panel/cf_api.py +35 -4
  35. hiddifypanel/panel/clean_ip.py +125 -3
  36. hiddifypanel/panel/cli.py +172 -3
  37. hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
  38. hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
  39. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
  40. hiddifypanel/panel/commercial/__init__.py +50 -4
  41. hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
  42. hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
  43. hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
  44. hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
  45. hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
  46. hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
  47. hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
  48. hiddifypanel/panel/common.py +98 -3
  49. hiddifypanel/panel/custom_widgets.py +71 -4
  50. hiddifypanel/panel/database.py +18 -3
  51. hiddifypanel/panel/hiddify.py +655 -4
  52. hiddifypanel/panel/hiddify_api.py +70 -3
  53. hiddifypanel/panel/init_db.py +393 -3
  54. hiddifypanel/panel/usage.py +85 -3
  55. hiddifypanel/panel/user/__init__.py +25 -4
  56. hiddifypanel/panel/user/link_maker.py +416 -3
  57. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  58. hiddifypanel/panel/user/user.py +233 -3
  59. hiddifypanel/static/css/custom.css +6 -0
  60. hiddifypanel/templates/500.html +1 -1
  61. hiddifypanel/xray_api.py +109 -3
  62. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
  63. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +67 -69
  64. hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
  65. hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
  66. pyarmor_runtime_000000/__init__.py +0 -4
  67. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  68. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
  69. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
  70. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,173 @@
1
- # 2023-04-08T16:23:20.003983
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\n\xcc\x0c\xcd\x82>\xc8iv\xce\x99/\xf3\x8e\xfc\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x98\x1e\x19A>\x07x\x0c\x801\xa0\xcf\xff\xb3\xaa\xdf\xb8bD\xfa<19 \xc29\xf2P\xfb\xcd\x03\x84\x90\xaa~\x8ao\xf2\xef\xa8 \x1f\xf1\xae\r\xdb\xb2q\\\xa0yZ\xbe<\x92n\xbc\x11Mg\x7f\x80Sk\xbbG\xc4=!\xe3\x1f\x97\r+\n\xc2\x8c\x1a\xa0\xdc\x86\xac#%i\x9d\x17\\\xce]\xf3\x80\x0c\x95<\x04V\xc0\xca\x03?z3\x8e4{\xd4\x9a\x94\xa9\xe8\xd9\xb2\xe9\xa4R\xb8F\xa3l\xde\x08\xd2b\x1bB\x9e>\x961\x91\x0e?\xe8\x97\xa7\x9d\xae^\xfd\xe5\x01\x92\x82;m\x0e!\xf2.\x9e\xe0Hk\xf6\'f\x01\xcc\xd1\xb6m/\x96\xa6\x0f\x91[$\xba\xd9\x8c\xc2\xff\xd6b\x10{\xe0\xe6\x9bS3\xe8\x13%-\xba\xbaf\xa5\x96\x8b;\x1f\xd9\xb3U\x0e\xf1\x08[.J\xfb\xa4\xda\xd6(_\x88\x06~\x0b\xf9\xfe\xdcq\x1eU\xfd\xb3\x8c=\xf1\xd1\xf6\xc1bH\xbe\xfa\x90V*\xbaa\r\xb0\xecI\xd4o\x95\x01B\xf6\x9d\x92\x82^^N\n\xdc\x95\x03$\x14\xd4\xbd\x0f\x8d.[Q\xf32\x15\x9d@\xed\xca\xe7r\xff-J\x03\x9d\xa6B\xb2\xc1}\xed\xcf\xf2\xf8\xf5I\xd7\xdal\xaf\x80\xedM\xe9\xd4=\xed\xdf\xca\x8d\x012\xa5\xd4\xb7\xd8\xf9\xe00\x15\xdb.\xff\xdc\xf8\xfc\xc7[\xd6\x13\xc8~v\xee_\x14\x1a\x8c\x10C~\xd5\xc5M\x8e>a\xdf\x82\xfd\xb2\xde\xf6\xc8\xaf\xcb\x9b\xef2\x15J\x03\xea\xb9\xa2/\xc9\xb9\x9b\xed5\x01Ji\r[\xb7\x1f);z\xc3\xfcA$\xaaH-\xc6\xc0\x19_\xbfg\xfbl\x11\x1fI\xa3\xa1\x0bo1\xd3\x113\x86\x81\xd1Y\xa8?\xaf\xe6\xfb\x00v1>\x166\xd7\xf2q\x92\x94\x95\xd5\xb5]GrW\xf6Vd\xcc\xa6\xd2{=\xdd\x93n\xb4\xa8r\xaf8\xd5\x00\xdfhZ\x18\xa1\xf1\xcc2\x1c\x8a\x05#\x18\xf4\xafq\x18\xbf/\x89\xd1::r\xe5\x02>\x12US\x8f7\x9c\x93\t\xfb\x1e\xcev\xad\x1a\xe7\xc0\xaf\x91<\x15\t\xa3\x0f\xe2\xadN\xf9\x96\xf6\xfb\x11\x90+\xa7V\xacN\xa6\xdc\\\\v\x95&\x8b\xda\x04_\x97\xf9<\x88)\xb5\xb7\xb2\xd6}\xf6/\xe2\xb86\xf4\xce\x93\x15d/\x06\xea\xf7\xfdd#$\xf6=\t\t\x81\x132\xe9\xcf:\xd1\xbd\xd9\x82\x1c\x94\xef\x17\x82\xcf\x9b\xc5_Lt\xa1\x97<\x990>E\x05\xa7\xa6j\xde8\xd6\xb5\xea\xd3\x1c\xb2\x85\xd2|\x98J}\xec\xd4\n\xbbh\x06Mp\xef=\xb7"\x18\x81\xaa\xdd\r\xae8\xad\x18\xbbCT[\xde\xa2\x1f0Q\xbb\xdb/\xe0\x07\xc3?8\x0e\xc6#$\xd5L\x9c\xd0\xff\xd3u%*k\x01\x96\x07\xc4\xc9\xec \xa7\x04\xf4R\xdcp[\x7f\x8e\xebE\xd1\x11\xa2\xe2w\xc8l(\xa8?\xe2\xbb\xbd?Ft4\xbdS\xb9\x8aX\x0f\x12\xc2Q\x82\x1f\xdexN\xa9?fz\xc5n s\xbe\xfe\\\xd4\xc8\xd7%d\xa7\x88\xf9\xaeI\x0b\x9d\xc2\x06u6\xcb\xe41b\xebE3\x8a#o\x88\xf2\x06\x914t_\xc1~\xd9w\xb2bX\x85\xcc\xc6\xcf\xba\x84\x1e\xe0/X\xf1\xd1Dl\x10\xff\x00\xcd\xeb@v\xdc\x02k\xaa\x91.\xf8\xfe\xb7\xb8$j\x12i\x85!`\x1c\x8e{c\x9a 5\x01\x04 \xe1\xa0\x86\x08\xfb\xdb~\xab \xec\xae\xc8\t\x7f\x06\xc1F\xe7.y\xa0\x9c\x95O\x04c\x04\x88\x878\x0f\x0b\xcd#8\x8a\x8fr\nB\x9a\x8c\x80\x06A0\xa7\xe4\xc6ah\x9e\xc1\x14\xe6+\xb7\xa0\xe9\xddg\x82\xe3\xb1F\xa5\xe7{\x1am\xc4|\xb8\x85\x91\x93l\x03p\x8f\xf9|\xdf\x87Op\x893\xc6No\xabT\x88\xd9\x00\x16X}\x97\xa7\xa3\xeb*\xcd}\x06_C\x03\xbd<\x95\xc7rQ3u.\xdf\xe7\xb4\xb50\xb4h{*\x02NGx\xf3[Y\x96\xc1,\x03c$\xa2\xb4;j\x1f\x17\x94\x14=\xda\xc3\x07\xcd\xf8"iz\xa4\x96MfoM\x1b\xba6\xf1\x1b\x1c\xd1*\x8cyuXQ\x8a2U\xfe\xbfC\x9f\x9b\xdd\xf7\'YO\xc5A\xd5*~W\x90\xa4\x90r\xcc\xba=\xa4\xc6\xf4uy\xf1)ZnC\xc9\xff\x19\xec\x9e\xc1:\xaf6\xb7\x1d\xc7\xd2Gs\x05-2\xb7#\x9d\xc5\x90<\xa9\xb9\xebl\xc6\x84f\'\xfb.\x94\x91yD\x9c`\xcbh\xac\xd9\x1e\x08\xe9\xe0\xc5\xc0\x00\xff+\xbe2j\xc7\xd6\x04\xc7=(B\xbb\x89v\x91S\x9b\x88\x11\xa26L\xd5\xec\xe4\x1d2\xd0S\x80I\x04\x0b\t\xaf#P\xeb\xe8h\xc9[\xa5H\xfcrjj\xfc\xba\x0fHg_TA[\xbe\xad\xbe\xaa=\x93\xd2;\xacy\x8a\xdf\xfcz\x81\xa8\xa1#\xb8$\x9d\xd5\xde*Op\x0b\x97\xbf\x06\x83]\x8aV\xd21\xc0\xa8\xba\xd9y\x815\x9d\xb5\xea\xe9\xd7\x8a\xc1\xef\x1a@\xac\x15">\xc0!\xc9\xe7\xfd\xc1{\xe7\x14\x17\xe4\x82\xca\x0e\xa1\xc0\x10\xbe\x07\x9a\xcf\xe8\xf3Ms\x9b\x13\t\x89V\x14\xffC\xde\xe6\xdb\x11\xf6\xd9G\x83F\xd4\xa1K\xc0\xb2{\xc8\x04\xb6\xdf\xd1_>ehm\xbd]\xb5\xdb\xee\xe5\x9cOa\x99*9\x83\xc0D\xa8]\xd8\xe45\x944\xad\x1ai\xbc7\xc1\x833\x05\x83\x99\xdf\xd1W\x03\x16%\xd3\x0cT\xe0\xc6g\xe4y\x1b\xa5E\xf3\x08\x1c\x8c\xe6\xef\xce\xbf\x87\xfd\xd6 \xa3\xean@WQ\x81QL\xd5\xb6\xc1D\xfa\x9e\x1aK\xf4\xc1\x88W\x1aR\x87\xbd\x01\x9e\x91\'\xe5\xaf\xb2\x9b\xed\xdb\xf9\xcb\x03\xa6\xfav\x92&/\xb4\xb2\x95\x94\xf7\x9a\x1e@\x14\xdf+\xbc\xcb\x12+\x1b\xa6t\xe5\x92l\x8bR\x01\x90\x8ao\x9c\x08_\x06}\xed\xd4\xbc\x18\x0c\t\xaa\xd8\xf6\xee> \x14~\xcb \xed\xb7\xed\x19\x05\x8d\xf5\xc8K\xc0\xfa\xef\x0f*\x89\x82\xcb\x0b\xe8m\x93\x1a|#py\x8a\xe3E\xd4<*\x9e\xe1@\xf3\xadZ\xc5I\x01^Zod\x03\xd4\x878&\xc7\xa6\x98\xcb\x126 \x96;5@\xf2xap.\xd5(8&\xf3\xbaO\xbc\xd8\x18Q%\x9e\x89\xfePD]\xf1pZ\x85o\r\x06\xb7d\xc0yM\x17 W\x11 \x9c$\xbf\xdeoQ\xa7\x17\xc0\xc6\x96t\x17\x01\xc9KZiO ?\xa5\x8c\x17[\xcd\xb4\xbe\xee\xb2F\xe0\xbf\xe3%\xd6\x1a;\xe5\xee\xd03\xe0\x8a\xea1\xb3\x01\xc0\xffT\xab\xa5\xe5\x1e\xeez\xfb@\xce\xcd\x07\x19\xda\x07\x1eM\xa5\xacA\xec\xe0\x10\\ \xa3\x8dc\xcfIX\xef,\x98\x9b"\xfe_\xe8\xe5\x07\xa2ARx\xbfEn\xd4\xa3\xf9\x19\xce\xd4\xfb\xe1B\x00wC|\xee\xac\xb5\xd7s0\xaf\x19\xfd\x9d\xc0\x89\xb6\xd4\x0f\x16G\xceD\xa9}\'\xdb\x1d\xe4\x85\xae\xb4\xac}$\x1c\xe7\x14\xc7w\x8b\x12\xf3i:\xa2gE\xfc\x02I9C\xa4\x1f\xce\xed\x8fU;d\x84&\xd4\xb1\x0f\x14 ^\xfa\x08\x98\x07\x90\xc9\x1ek6u5\xf2\xf1\x14{\x11\xafq\x0c\x0e\xcf\x10\x8e\xf63{\xda\xef\x12J\xf9]9\x0f\xa4\xb5\x88\x11(\xbe\xd9\x8f\xbe\xa3\x91K3B\x88\xc5\xac`\xf8(\x98\x1es}c=\'\\\x04\xe4\xe3\x8a\xa1\x8c\xcd\xdd\\\x12Q\x1f\r)\x86q*\xd4t\x1f\xd6\x07\x18/\xa8\x84#\x91\xb4\n\\;\xa7j\xcedM\xe5\x94\xde\x18\xcf\xfe\x8a>\x13$\x86OB\x19r\x06-V\xe3\xa0nVK\xc1<2\xfc\xceQ\x1a\x96t\xec\xc9\xdb\xe0\x1a\x1d\xdc\x9e\x8b\xd5\xbd\xe3\x0c%\xc4s\x99P&\xcf\xc76q\xf8\xdd\x06\x7f\xd3\xaf \x8d/\x83\x80|\xef\x08\td\xa8<\x0c\x1c\xee\x1d\x95p\n\x0e\xff\x8fnM>\x9b:\xc9\x83\xe3#\xe0\xb6}\x14\xdfLD\x82^\xa4\xe6\x94Qn\xdb\x8d\r\xbe\x8fi\xba\x81\xa5\x7f%A\xc0\x8b\xb4/[,\xc4\x96\xd4D\xa12\xcf-\xd3\x7fxq\x10q\x1bq\xaf\xa8\x92\xad\xc4\xcfw\xa8\x977v\xdd\xcd\xee\xdb\'\xf5(\xb7\x92\x91\xfd\x07\xd0H\x0c\x9d\x15x\x11Q\xde\xf37\x80\xa6\xf8\x11B\x86G/ib\xd8\x90\x1e\xfc\x19\x92\xe2\x93Y\xa4+J\x95dw$\xef+\x0c\xecl\xe8\x12i\xa8\xca\x80N\x81P\x7f/\xcd!\x14\x93_C\xdd\xda\xeb9G\x94\xfa\x7f;E\x99{d\xe7\x16\x05\xda\xa0\x11p\x86j\xfc8\x16\xe9:E\xf4u\xa1\xd4\xe5{\x96\xf4g\xf1*|c\x04!\xc4\x98\xa9\xc8\xfd_\xec\x13\\\x8f\xfd\xf5\xe5\x19\xfe:8\xf3\xc88\xe5\x12\t\xe4\x9b]ys\xe9\x8a(E\x8a\xd7\x08\x9e\xc5\x9b\t\x82\xa1\xea\xb5)\x91\xc3\x0eJ\xe7\xa8\xc9\xf0\xc0z\x15\x8b\xfb\x85\xb0V\xcb\x0ef;nl\xd5>\xb9\xc91\xe1\xd8\x05L\x19\xfc\x85\xf0o\'\x0f\x1c\x00\xc3\x1eu\x00"\xa7W\x87\xf5X\xe1\xdc\x95Q\'/\xb5\xfd0\xe4QL\x03F\xbf96\xf8\x84/\x8d\xdd\x83w*x\x84,1Dzk\xed\xac\xba\xe6\xca\x94\x8f\x8f"\xa0\xf9\xe3\xd3>W[\xdb.\x9e\x0f-\xed\x14\x9b\xd4rg[\x8b5W\tw\xc7b5\xea\xc1\xe3\xd2\x13z\xca\x8d\xa0\x07k\x85\xed\xd7\xbb?$\x1c\xa4\x96\xb8\x0b\xa0\xe3Lk\n%:\x85\x08\xc3\x1b\xb0M\xb5h\xdcM\x158&\xe4l\x93{\xf9*\x1d\xef \xea"88\xfaF-\x08u\x8b\x13x\x0cE9\xd0e\x98\x19\xb8\xb7\x82\xa6<\xed\x82\xd8m\xf7\xdd)F\xd4\xcb\xd1\x8c\xb4E5&\xa4\x1bV\xef\xd6\x02\xbb\xbc\x91\x06{\xec\t1_8\xf3\xe4\x1a\x08\xe8_\xebY\xe4\xdc\xad\xd9\x9e3\xe0\xc2\xd8{\x98\xc8v\xf49he9\xd4\x03>\xb1VU\x18\xee`\x87vH\xc0\xadFZ\xbb*\xbd*^7\xaeQ\x16\xc5I?r\x87\x93W\xff/-\x0c\xe6\xf1\x85\xd6b\x8e\x13<Q\x15\xf8\xc1\xc8\xd9Y\x00\x94\xd3:\xca\x06\x0f\xa1l\x80\x89K\xe6\xb4\xe3h\xc1\x13\xfc\x82I\xbf\xc47z\xc5ac\x96\x81\xb1\xa4\xb1\xf4\xb6\xbc<TM\x168b\x1a\xf6s\x92\x99e\xb3O\xb0\x7f\x00\xbcw5\x1cXb\xa2:\x925\xa3\xdc\xfc?Gj\xdb\xa9%\xe1\x8eS\x95\x05\xa0\xe1\xe6\x93\xd8]\x08\xd8u\xa2M\xd7\x94\x9a\xbd\xb1Z{\xae\x9d\xd8\xf6\x7f\xe9\xebp\xd9\xa4\xd07j\xa50.\x01]\xc2\x81%m\x1cp\xe7\xdbu7\x97<\x93\x8c\x81t\xc2P0\x86H\xffH\xdeu"\xa5\xb7\x82\x8a\x97\x02=c\xdc\x14[\xec\x85\xd0$\xcc\x92\xae\t\x84}\xbaD\xcd\xb1\x89&\x83\x95\xb7\xcbw\xb2\x1e2\xcck:\x7f\xb1\xc4\xe4F\x96lx\x13<t\xc1\x07HX\'w4\x06\xd6\xa7U\xd1\x95\xa9\xab\x9a\xc2_o\x95\xd9$\x86o?\xe5\xe4\xad\xc4\xfey\xbbqID\xe0^M\xb8\xb4\xb2\xd5\xef\x13pR_\xe9\x19\xf23\xeb\xe3\x9f\x0e\xb3|\xcc#\xbf\xc108Xx\x9c\xca\xb7|\xd1l|\xa2\xc7\x10FX\xfc\x0c4\x10\xd0\\\xe6\xc1.\xd7\xe1%\xda\xb7\x1d`\\~\xd5\xae\xfd\xbe\x16M\xa6%\xe6W\x19IX\x11)\xba\xb6\xe7\xa5\x07\t\xbb\x80o\'\x19h\xc3\t\x08\x80\xbf\xf20\xb8A=\x02\xea>\xfar\xbe\x90\x03f\xc0i\xacZ\xbf\xf0\xe9\x16\x03\xc7\xd2z\xb8\x1e\xe9,\x19/\xa6i\x15\xa8\xa8\x13\xd0\x9eYx%3\xb0\xa8}R\x1c\x0cLIT$\x88\xca{~f\x96\x05k\xb5\xc3d\xf9%\xbd\xa7\xbe\x8dtA\xaa\xfd\xc4\xeeb=s\xa3\xf7^Hu^\xca\xc0R3A\x9f\xf4\xde#\x9bRe\xfaU\x80\xf3\x010\xfe\x8c#\xc5\xaa\x15\x95\x06\xb0y\xbc\xc7\x18\xa1r\xcf\xd3\xb0\x06T\xc7\x92Z\x89M>=\x1c\xa1\x87\xec\x84\xb8)\x8fk%\xda\xea\xcc\x9c\xb2\x1c\x93\x98%\x85y\x98l_\xfb*\xd6z\x0c\xac\x88\xd0\x91\x16\xc7\xecw\xe1/-\xed;\xbf(\xf6\xb1W\xb3h\x9c\xc6\\m\x1e\xb9Z_\xf6\xb9\xdfr\x1f\n\x1aWn\xc5\xc9\x8e\xf3\x9b\xa5%\xb7\x07\\kQ\xcbz\xdd\xef\x0c\x81\x0f5\x9dti\x9b\xfe\xdc+\x91\x96\x0e\xfdr)ekGi[\x8c\x14\x7f\x03A\xc3\xc6d\'\xa2V_("\xbd\x802p\xc5w5\x0f;=\xbc\xd4:\xb5\xb5\xe5_oU\xaf\x15a\xa8\x0c1\x1d9\xaa\xa5\xdd<\x8b\xcaJ;\xd7\xd41im\x82\xd3\xa3U\xf1\xe6wM\xed,k8J8%7*\x15\xbb\xfaRu)u\xd3\x85\xe5\xbf\xf6\x97\xc3\\_\xc7W\xfa\xc4\xb7\xcf,\x9c0\xc7\x11J@\x03\x9e\x96\xfe\x90\xf4\xa0q/\xf9\xb1\x8c\xa0\x86\xab\\\xda\xb28_u\x9f\xed\x9ap.\xc1\xb9\xd9\x9e\xa3\x9b\xd9nJ\x90\xc0H\x17\xaf\x9e\xc38\xfeS\x8fh\x9c\x04\xc8\xce\xd2\x90f{i\xf7]S{\xb0\xb7{\x96\x88\x80CrluUb\xe3\x9f\x105\xb9\x98\xa2\xe8\xbarI\xf2W\xbb\xb5\xf0[\x16\rk\xcf\x96\xe4\x9db\xeeO\xa3Fq9U\xd9\x12\xea\xcd\x14\xf1\xecJ/\xb9^\xc4h\\(\x8aD\xc9\xae\xb8\x8d)\x8c\xec\x89\xd2\xb3\xe7\xe1\xd3tY"\xc5\x1f\xcbT\n\xd6\xf1uW\xae\x89\xda\xe2\xd8\xadt\xd2\xd3\x1c\x17\xf0%P\x06y\x1c/\xf8T\x00\x9c\x8e7\xbd\xcd;\xdb\xb3W X\xe1\x87;\x86\n\x84)$,\xe0iBxr\xe9=\xf3l\n1\x96\xf2\xabg\xc4"\x10\xcfy\xa0\xfbB\tCoyo\xf7\xa5\xa6Gi\xf1-\x87\xda\xd1\xcf\xcf\x01\xa0\x1f1m\xaf\x9c\xf1\xeb\xcf\xacj\x0f\xe2\xab\xf9\xf3\xad\xe5\x18EQ\x9f\x82\x07zU\xc8\x19S\x13,\xe0\xeef^\xbe\x86\x8cR\x19=\x88\x88\xeeR@l\x83\xa5\xc5\x98\x99\x19\x10\xd5\x83G\xf0,-2\xa5Y\xf8\xa9W\r3\xd8PW\xc0\xe1~`\xa2\x1eb\xb6uc)\xa3\xaa?3%\xa5T\x89"d;>\xbc\x8e\'x\x80\x12\xd9\xec\xe3O\xb0\x94\x9am\x03\xecr\xcbZ\xb2KwT\xdf\xf1\xde\xcf\xbb-\xa8u\xda.8\xe1\xa8\xf0\xb1\x0e\x10\xa8?\x96\xc1\xac\x93\x18\x95\xb0\xd2\xf9\xeeZE\x8d\xccmr7\xf1\xb8\x84\x84r\xa4E\xe4*\x85\xed#\xf6\x19jDVE\x8b\'\x81\xff\x86\xa7\\\xab8)IUs\xa2\xb0\x92\xe4\xe8\xdd"<\x7f\xbd\xf5\xc2\x0e\xd7<\xdd\xbc\x14\xb3g\xe5\x13/G\x1a\xce\xb6\xc4\xa2h\xf0?\xc0?\x99y\x13<\x88\xb0i\x80\xa8\xdbM\xab\xb4\x96\xad\xeb\x96\xe2\x80[O\xd8\x7f\x018 {g}\x9e\xda\x01\x8d\xff\x96,\x1a\xdb\x06\x1a\x16\xa1T\xe7\x86\xe8\xb2\x07M%m\xfc\x00\xaf\xf8s\x8c\xa9\xa2\xf3\xe5:K\x84\x08\x94I\xe7\xab\x10m3\x0e\xb43J\x0c\x076\xdb\x93I\x0b\t\xa7&8\x06s\x02\xda\xe3\x8c\xa7tE\xf1DE\x8c\xcb\x9c\xcb\x00\xa7\xbe\xc6D:\x00\xf9\x1f\xb6o\x9a\xa4\x8f\xdb\x00\xf1\xc2\x17\x89\xd1\xc8\xfcX\n\xc1SZ\x01g\xcen}\xa5\xc8\xd8\x0c?\xef\xe3\xceGH\xc0\xbfR\xf3,\x11&\xb9\xe1j\x00\xea\x01F%_7\xbf\xdb\x80\x1e3TX\xa3\x11\xeb\x0cw\xb2\x15V\x02Ss\t\xb6^\xd2\x04Q\xe1\xf9\xc8\xd2b\xbfoSH\xbf\'\xa8&\x91\xf0\xdb\xa0q\xb1\x1b\x9dc`O=\x9a\x89\xf4\x96\x8c=\x14\xce\xa0\x1f\xdb\xac\x07\xb4\xa1\xdd\xe1\xc9\t[\x80)\x00\xcc\xdbDW\xbc\x06\x9e\xd4t\xee\xf5\xf5\xce!~:\xef\xa2q"\xe7\xcc\xf0\xac\x85\xb5&\xe3d\xcf\xb96\xef\x851]u^\xd4H\x1e(\xa2y\xc9\x90\x13M\xc6\xed\xe1;\xcf_\xbb\xe1\xa4\xf2\xfb:\x10\xb7w\xd7\xec\xbc\xf8\xe5\x8aH_\xed\xfd4\xe2\x8c\x10\x18O\xab\x81\xa3\x93\xa1\xef\x8b\x9a\xb1\x1c\xc4\xa6\xdd\xfc\x18[=r\xdaoB|\x9cZ\xd2\xb7\xed\xfb9\xdb4%16\xcf\x98\xf2\x02\xfd\x83\xf2\x7fj\xde\xfc\xb1\x8c#&\xdf\xff\xe6.<\x10\x0f\x81"p[\xcd\x90\x93\xd6\x1b\x1d\x91\xf2;,\x81>\x04\x96\xaf\x8b\x8f\x9f\x9d\xcf\xc5\xec\x19\xe4\xe47\xc5Z\x96f=M\x8b\xb3\x10\xb9\xecD\xd5\xecm\x89Z\x98N\xea\x0e);\xe4\x80\xc2\x1a\x9f\xd5\xf9*\xb6\xe1\x06|Q\xac\xfb\xc5+\xfa\xcdu\xe4\xb9\xd2\xe8l\x16\x8a\xb9M\x81\x8c\xafU\xd9\x9a\x12\x83\x15\x16\xcf,,\xa1\xcf\xea\xd1\xa2:\xee\xbd\xea\xb2E\xea+%\x81\xce\x08\xa2B,\x1eW\x1a\x82\xfa\xaa_\xc4\xe6\xc3\xda=\xbbE}\xebe\x04T\xe4\xd5_<\xb0\x16\xbb\x84d\x0c\xd7M-(\x05\\\xe1 \xaf\x1c!9\xe3c\xf3|\xce\xcc\xebb\x01\xbf\xe5\x9b\x1a}\xe1\xd87\xdd\x94!`\xb4\xcb\x10\xf5\xfe\xd5\x1b\x03\xdf\x9e\xe5\x8c\xeb\xb8\xce\x89\xc2\x00\xe4\xfb\xcc\xa2\x7f"\xbf7\xbe\xc7!\x8a}8\xd5\xc9j\xc4\x92\xc2*\x0b{\xbb-h\xa4\x91\xe4\xeb\x9d\xf3\xda\x9c\xf2\xd47??B\xdd\xc1\xe1\xf7\xd1\x12\xf3;,\xd6\x8b\xa6\xc0bRT\x9d\xb2\xfaiWY+*\x930\xf1\x08\xfc\x114>xx\xe5\x87\xba\xb1\xf0\x17\xa2\xa4:\xc3&\xd8\xc0\xa9\xaeK\xd9\x89\xd3\x0bx!\x82\x9du\xb8\xa4\x02\xf8\xa0i\x97\x03Z\xc2\xa9\x12\x0e\x1fG\xb7\xf6C\x8f\xbbGi\x00\x1a6\xfbvH~\x88\xceUWlD\xc1\x03p\xd9\xb0EC\xe1\x9by\xb2\xa5.l\xbb\x10\xf9\x13\x11\x99%\x02\x89?y8\xae;\xa8\xc6\xa4\xcc\x89\x1dG\xd5\x04:\xa5k1"#\x88d3\x81@\xddF\x8d\x9c\xe1i\xeb\xd7+\xe2\xbdV\x00\x0e\xa4\xd6\x05\xeb\xb5\xeb\x14\xe2\xeb#7C\x1fY\x9f^`c\xf2\xe3\xf3\xe5\x89\xa5?\xb5\x9cn%{\xe7\xf9\xec\x86\x14e\x81/\'<\xda\xac\x93AH)\x15\t\xb5\xb4M\x9f\xfb\xb49a^\xa5NU\x8c\x1f\x1f\xb3i\xbf\xedR\x95\x90\xba\x86J\xecM\xda\xfd\xc9\xa1?\xfc\x1c\x8c\n\xf9p\xed\xd4_[\xd1\xed\xe9\xff\xa5\xc5\x83\x1e?\xc3\xd5f\xe6\xb6=."1D\xa3\x01\xc1f6b\xd2v\xe3\x84\x9cf\xfc\x9c\xf3\xd5j\x01\x9f\xf1\xad\xae\xf0\x8e\xa7:5\x12\xf4@H\xc9\x9e\x02\xf6\xd6\x86\x13"\xfa\xb5j\x8aj\xc3.wV\xdd\x11D&\xcf\xb8\xfa\xa1h\xa0\xff\x12\x0f\xe5\xff\x89h\x97\xeff\xc7\x91f\x18\xb1XL\xf2\xc1{\xc6#\xa1\xb4\xfa\xf7-\xc9[\xff\xc1.\xb3\xb5\t!\xfe5nBv"<U\x89\xe9\xcb\xd37\xaf\xfa\xb2{\xcc\xd5\xa1U_U`\x95V\x08\xab\xe1\xac\xea)\xf0w\xb5\xa8\xa8\x8f\xd2\x8c\xea\x0cs\xa3\xdeN\xb1\xdbf\xbe\xe4\xe9\xf3]\xb3\x12\x05\x9c^\xd3u\xe5\xc8lc\x10\xdb\xaa\xf27\xae\x9f\x82\xfaCV.\x13\xc0\xdb\x9dO\xbe:;5A\xec\x89\xcc\xc2ydx\xfc\xa9\xe16\x16 La\xbbm\x14d\xdd#\xd1\x96\x0b\xbc\xe1$\x8a\xfb\x1d\xc6Pt/\x8a\x0c\xba\x87\x13W\xf4(\x8b^\x87\x89\x84v7Q8:\xb4\xb9\x1b\xe4D4\xc9b\xc8O\xa69c\x1f\xdfi\xbaq\xe55\xf8\x9b,\xe5\xcd\x9b#\x8af\xaaFFU\x02\x99c\xc7\x871\x13U\xec\x12fXBtVQv\xd7\xd4\xaeSYJW\x8fy\xc3O\xb2\x1c\xd3\x187\xb0\xc1/\xb4\x97\xb5\x84\x84^\x86\xc6\x8e\xeb\xb0\xc4\xd9D\x1a\xe9$}\xb7\x14\xc0H\xdaJs\x0e\xd2\x83\xa3\xf7\xbf\x9f\x90P{k\x8bs\x06\xa1\xfb\x02\r%/\xa0\x18\xcf\xd1\xc3u\x9aK\x16\x11\x89\x1bD\xae\x9f\xcc\x83\xd2e\x98\xec@\xf2\xb7\xfaC\xb1\xaa\xb1\x90b\xbd\xa9\xfc@M\x96\x1bv\xe25\xb7\xf0\xef\xf8\xc0\xfb\xf4\xab\xe5F}\xfa\xe8\xa45\xde\x99{\x19\xdd_\xce\xe8\x87\x18\xe2H\xd8\x1d\xc5\xa0\x85\x1d\x04?\xdf\xdd\xf4M\x1b\x16\x15\x9c\x90\xcf\x07\x90\xa6\xed\x08\xb0\xc5\x0c\xf0*\xe6\xc0\x02\xc7 v\xd3\x17h\xc5F\x9a\xfa\r\x88\xd6f:\xeb9\x9c\x9c%L90\xf3g\x16\xc1r\x8e\x01\xa0\xcd\n\x98\xfbM\\\x05\x84O\xaa\xc6\xe2\x8d]L\x0c\xaeQHcE\xa3!\xaa\xf3\x90\xc8\xf1\xa6\x97\n\xbb\xff\xd0K\xf6rx\xb5\xf9P\xf7\xfd\n4[\x1eU\x9d\x11\xd2(\x15\x02\xc9\xe2x\xd6\x1d\x8ay\xb3\xe0\xa7\xbc\xfc5\xf33Jc\x91\xffgC\xe0)\xbf\x0c\xa6\xdb\xb4\xac\x97X\x08\x7f=p6H!\xd8\xd5\x14\xd1\x11\x1d\x92T]t<\x14j\xe5\xc0V\x13\x00\xca\x13I/\x98\xd6\xc7$\xee+\x0b\x12\xdd\xb8[\xc6\x99\x86&\x92\xaeV\x82\xf6\xa4\xc9\x1cg\xc9\xde\x8a\xda\xc7\xcc\xff\x81+L\xcc\n\x9b\xd0^\xf4~_\x1e\x08\xedHN\xbd89\xb8-\xfbY\x7f~*"q\xacF\xa0\x8fX{U\xe5\xc2>m\xf3,I\xe3\xa2\xff\xfc\xba\xa1\x04\xb4\x16\xc2,JHm\x0e\x07\xf4\xaf:\x0f9\xe6\xf0\xbe8\xd0\xcd.\xb7g\xcc\x84\xbd\xe4\x0c\x98([TI\x0b\xc2\xc9(\xde`\x1d>U\x1dX\xf3Nv(\xa8\xcf\x10}AQ\xf3\x8d\xc0\xaa)&79\xfc\xc1\xa6Q\xae\xc1\\\xb1\xe2H\xbdOz\x97.\xa7\xa6x60\xb4\xd0\x7f\xc6\xa3\x921\x03\x03m1\x88&^\xecP\xa1D\xdb\xb8o\\\xee\xe6\xadX$\x06dV\xb1\xe8?\x95\xa3\xc1\xf5\x9b`\x88\x82\xc6\xdf\x12m\xe8]\x94\x9f\xb5\xee\xeaE\xd3,\xc0\xb6\xb1\xc1\xe6\x87\xa3\x96\xdcH\xb8\'Ro\x84\xe9\xb2\xc8\xd8c\xd6\xbd\xafC\xf1\xdd[[\xb5P\xc9\xd2O\x9e\xd7\xb7\x08\xcd\x81\xe0\x10f\x03\xb1\xfcm\x04\x1e\x12\tB\x01\xa2\xb3\xe6p\x16YX:\xc45\x88%\x0f\x16\xa3ty\xfc\x15u\x87\x0b4\xbc\x80\x85Be\x89\xfaU"\x94\xff\xca\xaa\xef\xe0b(>\xf4lN\xf3\x97i\xbc4\xca\x9f\xc6\xaa@\xad\x17g\xd6~Od$\xb6\xac"\x05%\xe6\xcc\xab\xca\x1d\xdby\xfb\xe7.K8\x08\xdd\xfa7+#\xf5t,\x9e_\xe6M\xbaM\x89\xf3{\xc7\x1dA\xde\xee%\x9b\x8dv\x90\xa3\xd7\xc7\xd5\x96\x9a\xa6\x83[\x16\xec\r\x02\xcf\xe5K\x94W\x12\x02\xaa<dcu\xec|P?\x88pe%\x14\x10\xd4\xa3\xf7\xd1\xd6\x8e\xc5\xdf\xee9#\xef\'\x15\x1cGS\n\xb9eh\xd3\'?\xfd>\x8b\xb7g09\xd8U\x85\x95\xeb\xff\x14\xd5kU\t\x97\xb8\xf6\x90\xef\xd4\xb00o\xf9\xee\xc3\x96\xff\xe8\x88"\xaen\x0f\xdd\xae\x18:8\xf2\x90%\x16\xf6\xa9\xa125\x18uK\x83\xea\x89b\xb8\xdc\xabv.i\x97\xba\xba\x9f\xa4\x84\x02.g\x92\xf5\x9f\x14f\xbbEG9\xbd\xff\xca{I\x02\x8f\xf9\xb2I\xff\xe8\xb6\xf6\xdbd\tg\x05\xab\xe3\xc6\xe7:\xd9\xf5\xeeD\x00\x14\xbc\n\xe0K\x7f\x9e\x86\x8c\x83\xbc:\xd5\xef8\x83\x884\x81KV4\xd4\x9b\xf7\xe3(l\x90\xd7\x0fK\xa0=\xe6p\xb6\xcb\xa9A\x88\xae\t\xa9\xa83\x01\xfaQ\xa5*n\xf9K\x8b\xd0\x9cG\x89l\xf7\xa6\x05g+\xa53=e\xe83=\xbc\x03\x14\xdd\x88\x0f\xf2?F\x9b\xac\xe8\xa2Di\xa9\xc9\xc62.\x01\xc0\xebt\xb3\x86\xc0m\xb5\xb6\xdekx\xcc\'\x87%\xda\x9e,\xd2\xb0\xfaX:\xb4\x19d\xbfu8\x8fI\xb3\xea\xb5\x7f\xab\x11\xb2\xb4J\xdfP\xc3_\xb2XTJ2\xcc$2\xc6\xf6\xe7\x86z\xb5\xe2\x95.?\xe9\x7f\xcd\xa5\xa1\xa0f\xa7\x1cf6\xee\x16\xb6\xea\xd5\xffz\xba\x86\xc5~\xf1\xf1\xc8BC\x14\x93\x8d\r;\xd7,\xb8$g\xaa\xe5\x97nL \x8a[ \x00\xb7\xc1\x02\\\xa3\xf9\xc9\x88n\xeb\x03\xb5\x13\xd9\xda\\\x05\xbb9\x12n\xde\x0c\xf3n"\xb8\xfc\xd7G\xa3\x8e"\xc2\xbfu\xd6\xd2!\xff\x17,\x16C\xe8\x98L\x97\xd2\xa1;\xc88`\xf9\xd9\x11\xcc.\xe6\x91%^{\x9d\xb4X\xe4\xcfV\x07\xfex\xbdC\x1a\x19\x90\xcf\xb2MT\xee\x90\xfa\xb9\x7f\x92\x1a\x87\xeb\x14\xb4\xe2\xe0T\x89\x0f\x1b\x83:t\xea\x84\xc9\x170\xf3\x08\xfd\xd7\xb4\xb8\xd0\xe8#\xb5h\xfab\xed\xaaEA\x88V\x895uJ\xed<\x1f\x12\x8e\x1d\xbf%7\xfe[<\xda\x86%\xafe%\x8aR\xd3\xb8\'\x8ak4\xc9\x9f\x95\x00\x98\xdd\x12\xe2,\x1a\n6A<\xec\xe5\xdcM\x8e\xc9\xe7p;\x94Q:\x15y^\x980\x8b\xe2X\x98\xd8\x0b\xb9k5nJ\xb5\xe6w\xd2-y\t\x91\xe0\xefXYjj&\xca\xd2\x12$\xbaJA>\xc5q8\xcd\xfc\t\x96\x91&d\x1e\xc6V\xfd\x13\xce\x1c\xe1B\xb6\x1a\xc8\x1d\x0e\xcfIaP2\xe8\x1eO\xfe\x9c\x95\x0b\xd6\xbd\x7fO3\xe5\xb3\xdf\xbd\x92\x84\t=\'[{j}CT\xc4C\xe6\x109\xde\xd9R\x80\xc4\xe3F]\xc0\x85\x1d\xfd1\x02\xe8\x11\xdc1|\xe7\xb4Z\x03\xb8\xbb\x008i!!\xf8qL\xaf\xc2\xa3\xcb\x18I\xb7\xfc>\x02!\xf5j\x11\xbci\xc5\xbfct\x15\x86\x1b7n\x9dT\xef\xe10\x13 6E\xac\xa9d\x08\x84\x85\xd2\xbc^\x17-\x15V\xad\x03\x82t\xaf\xfc\xb5\xfa\xd7\x0c\xe7\xd9\x04\xbb\xf1\xda\xe2\xc0g\xb8\xb1>\r\x00\xadL\x91y\n\x076\x1d\x0f\x19\xed\x1a\xf6\x838zH\x1f\xb5VV\xa6j\x0c_gOU\xcf5\xd2@^\x07\x99\x02;S\xf1\xe7\xfb\xcb\xbaB\x8f\xc1\x90\xb6\xcb\x92\xec\x1f\xb6\xe4pi\xa3\x887\xab\xb5F\xa5#B\x84\xba\x11\xa6|\xf7\xa9\x1a3\xa3\xbe=,\xc3\x98\xd8F|?\x84\xbe;\xf1\x1a\x14%P\x1d\xf7\x00A\xcck\xb4r\x10\x00\xd8\xc3\x93\xec\xc9\x0bq\x02\xe7I\xe1QN\xf7\x16(\xa0\xef\xa3\xfe)\x16\x00\x9f\xa2;/\x19g\xb9\x0b\xbc\xba\x07<@&\xad\xac\xd7\xca\xed3$k\xb6\xc4P\xda\xdb}\x80d\x1d\xbbW\x1b\x06-6a#\xb1x\x16[?T\xbf\x8d\xec\xeb\xf0\xd8\xa6h\xa7=\x15o\xb1\xa6\xe6ur&\xfb\xc6"O\xb5\xab\xc8t\xdeY\x01\xab@b\x9a\x1e\x82\xd4q\x03\x88LG\n\\\xd3Iq\xee\\\xbd\xad\xd46n\x80+\x9bP\x99\xd5\xb1\x1eSk\xbd\xacl\xae\xbb6\x85\xba2\x87@B:tX\x08^\x8b\xd0\x19\xd4\x1d\x9d49\xa7\xf0:zd\xe5\xa4v\xb8\x1d-G\x0b\xcc\xbcGFY\x87\x94\x186(9\xc5\xd6\xc5\x92\x01\xde\xb2(\x8c\xe0\xc5\xeb\xf4<\xde)\xec\xd8h\r:\x8d`\xfe\xcdP<c\xf5\x0b\xdb!5M\x87\xc4\xe2\xdb\xbd\xd7o\xb2\xbb%\xea\x0f\xe1\xc5\xb27\x19\xcc;Vu\xcd\xf1\x06\t\tQ\xd4\xc7s\xb9\xc5j \xcaT\xf3_@\xf4:\x9e\x0b\\%/{\x97\\\xe3\x9c\x94\x15\xf5gY\xd8\xca\xaa\xac6F\xee\x81\xdf\xfe+>\rK\x06\xd8\x80C\xdf\x81\xd2\\\xd8D-\xbd_\x96\x81wa\x91\xf3\x87NW\x19!\x0b\xd4}r\xe9F\x81\xaf\x97g~\xca\xa2d\xea1cGz\xac\x93\x9dh\xba\x9b\xca}E\xde--\xfc\x8cql\xdf\xac\x91-\xfb\x8b2\x9d\x98\xa4Q\xa5af\xd8t\xf4\x8f\xc4\xbd\x8cF\x8e\xef\x98zk\xa9e\xe1)\xf6\x93\xdb\xeb\'\xd1Bs=Y8\x13to\xd2\n\xe5_\x01\xc8\xd9!}\x8cb\x92ri\xc9Z\xf7]\xfas\xc6~\xde?S\x8e\xd9\'\xc8\xa6()\xa0<Pi\x80gha\x19\xcf\xd4\xba\xa8Z\xd9g\x03\xe9\xc2\xf0\xbb\xa4\x95\xf1\xde\x83\xd1\x16\x1f\x9dAu\xdaN]N\x05\x05\xa2\xbc\x97u\x93\x08u\x07\xcaG\x03\x15\x0f\x0bejn&\x06m4N\xb3p<\xebg_\x12\xcfV\xe2\x04\xbe\x90\x12\xa8\x94\xe0\xc1\xd2\xfc\xb6\x03:\xf5MK\xfa\xc3\xae\'i\xdc<\xe0=\x959\xb4\xcf\xben\xb4\xc4\xa9O\x196\xf4\xc3%p\x04B\xbdt\x0f7\xa21\x80\xc0x[ \x06?\xd8\x15\xc8\xb3\xe5_\x99\x91\xd0\x8c\xa6L\xb6L\xea\xc3\xd7\x1e5\x9c\x82\x15\xa5\x15"\x86\xba8k\xf4\xb8\x92\x82\x16\x81\xe3\x17!\x1d0\xfc\x9a6=\xa5!\xfa\t\x90[m\x1b<\xbc\x8b_4\x08\xc2\xc2\xa9n8\x9e\xe5\x1d\xad\xdb\x14bu\xfd\xb1\xb0\xde\x96\xf4|\xf0\xae\x94\x0c\x05nm\xb9\x15\x0c\xe4_\xdem\xf5\rQ)=\xdd4\xf2[g\x8a*Sd.\x89XRR3\x92\xe50\xbdZ\xe2s\x05\x8a\xcb\x83\xd5\xdb//M%\x94\xcd\xb4f\xb6)4\xdb&Z.?\xac-K \x97\x9cEs3\xc9\x88cj\xbf\'e\x80OgT\xef\x0b\x1b\xb3xb\xb0\x19\x8ay\x14\xd1r\x1eI\xdc\x99\x02^\xf2\x88D\xd0\xc4\x84\xac:\xaa\xf8\x11C\xc4\xc4\xaf*q\xc1\x19r\xed\x91\xc3\x8d\x02v\x98/\x03c\x9f\xaat\xd8K\x1f\xea4\x1a\x04\xe66\xa8"d\x9f\x901\xf2{\x9b/9\xb2\x8d\x8e\xa9\xb3\x18>E\xa8\xcb\x87\x9c]\xf8\x9e\xd0\xe2\x1e\xc1^\xd5\xffDs\x13\x9b\xca\'\xd5\xd4(\xdb\xbd\xfd4"\xa3\xd8\xd7\xce\x1a_\xce\x1c\xc3+\xf7\xdc\xa1\xc1\xc5j\xe3h\xa3J\x15\x8en\xa0K\xddV\xccL\x07!\t\xbd.D\xe3\xe7\xfa\xb1\xab\x1b\x1aR*\xe8\xcc\x10\x8dn\xf9\xe3\xf9(\x81\xaf\x89\xe7\x0f"\xd2\x1c\x7fy\x90\xf4h\x1c\xeed\xb0Es\x10\x98\xac\n\xf3P\xb4i\xa8\x11\x12\xc9upB\x82^>\x8f\xff\x03\x18=\xc8\xd3\\m\xc9Y\x12V\xcf\x07\x8e\x1c[\xa2$~\x04.+\xd3?\xf9$h\xfe\x94{\x8e%/.\x9c06[\xe4\x86\xef9\xccO~)\xd4\xba\x87\xf7\xa3\xf7\xc7\x1e%\x8ez{\x07DqBa\x0b\xa1\x99VD\xf0\xb0\xfe^\xa0w\xda\xa3\xf3\xcf\xd2@!\x8d\x1b9L\x11\xca;\x81\xf2\xf0\xd9b\x023\xfb\x0eJjSW5\x98kOG`=\x00\xb7\xde\xb6\xdb\xbc2$\xab\xc5/\xdd\xfb\x93\x88\xdfrQ-\xf5\xec(\x85$2\xb4\xef\x18\xa8\'\x80\x8d\xa2f\xcbK(\x83p\x0b\x8eS\xbd\xe3\xfa=}i\x8d#\x9c\xf9\xee\x8eF\xe4\x83\xe6w\xc1#\xde8_\x87\x87B\x9eC\xa5\x07G\x00?\x1e\x8c\xc5\x87IIU\x04\xa33\xf0\xecF\xc6\xcf:t\xa9\x18\x93=.;~L\xb9\xfe[(s\x87>\x17\xf56\xdc\x1b1\xaa\x03\xc9c\x9d=\x95?\xeeyD\xccKZ\x18\xb8W4\x9f4o\xe9P\x8b\xfcD\x81E\xef\x8a\xa1&\x10\xcfo\xa1\xbe3\x9d\x0e\x04\xcf\xac\x03\x87X^\x06s3SO\x1ad!\x9c\rr\xb7\x0b\x1e\x85\xf2/dyi\x11?|\x92!\xdeF\x1eP\xe9\xa1\x83D$\xc7\xa3\xdbk\xa4`\xef\x1b\xe7@\x81\xe5,\xc8\xb1\xb5J\xd5@\x84\xe5\xbf>\xbaB\x06D.\xc8\xaeE\x01\xcf4h\xda1W\xb4\x87\xde\x96\xbb\x07\xf5\xd9\xfa\xa5\xe3|\xd9\x7f\xf8\xc6!\xd3\xfa\x0c\x9d\xa6\xfa\xf5\x85\xefQ\xa8\x19$\xafD\xe3\xe6\xf0*\xfaK\xca\x1fOH \xae5i\x9bH\xd8*\x8f\xba\x8bJL,M\x7f\x84\xd9\xf5\x02(z\xb9&ou\x9c$$\x9fa\xd1\xbc\xd1\xd7\x0c\x8b\xbf#\x00\xf0A3\xf3\xe4ow\x02\x07\x07P\x0b\xd4\xf9,\xaf{f\x0cef\x03\x7fD\xd3eY\x1d\xd9\xa5h\xbd\xa0\x84C,\x9bp\xb3c\x9c\xab\x08\r+U\xde\x81J\x80\xd0N\x7f\xf8Q\x85\xddlC;6z\x83\x1f\x1d')
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-08T16:23:20.093934
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\x00\x8e\x1eG\xa8\xc31\x1d\x82&n\xa6\'\xfb\xd2\x84\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x9b\xe6\xf2\xcc4\xb2F\x92F\x04\xc3k\xda\x817\x04\xa9b\xe4\x0b\xaf\xd7\x8b\xdb\x11\x97\xfa\xa2\x86\x85\x0e7\x80\xe0g\xa1\xdc\x8d\x92\xda\x88MA(\x10Lb\xd6\x0b\x94\x8b\x07\x91\x126y;\xa8~J\xfa\xf2\x89\xd7\xaa\xdbq\xe7\xbc\x04\xe2\xd9\x943]\xff\x8eZ\xd2w\x04h-B\xa7\xc5P<4\xf9\x9f\x81\xc9\xed!\x1c\xa7mu\x0bL\x019<\xa5\x9d,6\xeaa\xf88:\x03&fT\x0c\x9b\xcc\xc2\x99\xef\xcbS\x1a\xceijK/\x1a\xee\xf9\xd0\xabOC\x05!\xcb\x1ajO\x13>\x1b\xbcE\x03\x98\xd5J\x01\x0b\xd4i\xa5/P\xc4Cd\x1e\xb9)\xbf\xe9\x01\xd0\xe5\x81\x89@\xc3\xf9-\xff\x85\xc0\xf5\xdb\xc3m\xb5*L\xed\xff6\x85&L\xe1\xd9S\x02\xfe\x8b\xf7\xdd\x14\xe7\x93\x82f%|I\x1dT\xe5Y\xc6\x17"\x02\xed\xad\xe9\xad\x88\xc8\x9e\xc4\x9c\x9f,\x9bQ\xbc3I\x9bA\xbc?B\'[\xc5Q\x1e\xfc\xf9\x0b\xf0\x1a\xf7]\xd1\xb5\xca\xec\xc7)\xd8\xd8<\xf8\x8e4&\xc2ZVU4\xb5y\x1d\x88\xbc}\x05\xb5\xbe\x8eJ4\xba\xb59Y\xdcb\xbd\xa7\xa8xzd|\x95\xfb\x04\x8f\x81;\xcc\x9c\\\xf3\xae\x7f\x97a\xfa\x8b\x9a\xe6\xf2\xd3\x7f\x01\x8c=\x8e\x92\x80\xc57\x02\x19v\xb7\x15\xe4/\xc0\xd5L\xdeu\xe7\x1eQ"\x04\xfc\x15\xb3\x876\x86LR\xceMv\x8eq]\xf5\x1a\x89\n\x1c\xb0A\xe1\xd2n\x08r\xc6\xb1\xe5\x84\x8eT\x03\xb3\x92a4l\x98\x9a\xde\xcaK`\xa3aFl8\xfb\x9bn\x82\x8a:\xe1WJ\x0b\x0e\x94\x05\x10Z\x18\xf9v#`/\xae\xab\xf9O-\x8b\xf5\xbee\x06\xcc:\x08\xc8\xa5\x10q\xd0\xfbP|\xa9\xed\x0b\x11"\x1b\'\xda\xcd\xc5\x8d\xaa0\x18`;\x1a\xe6 \xff\xe98\xda\x19of\xad\xfbe/H\xde\xd7\xee\x08\xb7\xefTZ\xd3v\xe3\x93n\xaf:\xb1\x0f0j\x13\xb6e~s\xa5\xae\xcdg\xb3\'J\xd2\xc9\x99w\xa7d:\xc4c')
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-08T16:23:20.443249
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\xea\xc4\x85\x96\xfc\xd7\x0e\x1f\x86\x18y\x80\x8f\x12\xdc\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x03\xdd\t\x92\x07e\xa8^\xed\xc6\xb0\x13\xdf\x90A\xef\xccjt\xb89\xe0e+\xd5<N\xf3J-\x19\xfb\x8b\n"\xd4\x11m\xfe\x88\xd5\x8dF\xa7\x122\x91\xe5\x07\xe6\x9e\xd1G\x0f\xd7t\xc6\x81Og6H\x0e\xf0Ku\xf6&!\xb2\x87\x0c\xdb\x82]F\xc6\xc5j\xe8\xb3\xad1\xe2\xf4\xa2\xef\xcc\x19\x0c\x0c\x0c\xcf\xb1\xb0s\xc4\x1d2\xc7\xfc\xb7\xac\x13w6\x0f\xa8v\xcb\xb9O\x1f\xc0=\x19*\x1ap\xbeZ\xa3\xc0\xc6\xa5\x82\x89\xd0r\x91^\x16\x9b#\x00\x1eh\xdb\x96uF\xaecp\xab\x10\xda\xafOv\xa6Q\xfcF\xe1q\x97\nD\x8c\xe0\x1d\x10\xe6\x8b\xa1\x15!\x9b\x1d<\xcd\xc3\xb6\xb7\x18i\xb1\xd8\x98F\xd9\xab\x99\x1f\n\'R\xa2\x06`\xb9\x13\xee\xf7\xd8\xe8j@\xd2\xe3\xca\x1c\x8c\x8dS\xb0O\x92\xd6\x13\t?\xb0r%\t\x8d\x01\xfdV\x0f4\x03\xfc5r\x87\xed\xefA\xc1\xe6Pt\x95\xe7\xcbg\x81,W/\xe4\x869\xca\x81\x8d\x82\\^\t\x00\x97\x19\xee\xcb\x1e\x9c5\xcd\xcb:\\\r$-\xe1x\x03\xf6\xdc\x04C\xda[\xabL\x0b@L##\x81\x80\x86\xbe\x05\n/V\xa35\xba\x00\x89\x1c\x90\x0b\xe5\x00D\xa5Q\xf2\x06\x01\x95K&\x1e\xe2\xb1\x0b\xdc\xc0\xe2&y!\xb16*89\x1dhg\xc3\x1fHr,\xac\xb5\x94\x81\xcaqe\xe4\x99\x91\xd9\x86\xf4\xd7\xfe?\x1c\xb9\xb8\xfc\xd8\xc8\xc7\x02\'5E}h\xbc\x10Fz\xf2XF\xaa\xfe\xaa\x9e\x9d~\xa8o\x9bZa\xce\x13\x0b\xadQCw9\x8f\\\x85\xde\xf4\x0cx9\xc6\x12\xfce\xbflH\x83\x87\x15+\xb4\x12\xb3\x0b\xd37@\x16\x14:\xbc\xe5T}\xfaX\x9c\xde\xceU\xf2l\xd3\xfd\x8c\x06\xdb\x06\xd6\xec\x07\xd8u\xce\xcb\xd0\x90\xb3\xbb\x8d\xae\xdc)\xa9\xe0iv\xac\xdf19\x94\x9c\x02\x88l\x82\x1c;\x99\xa4I+k,\xeb\xdb\xdcxY\x88\x1e\xed\xa0R\x9c`{{\xa7\x8f\x03\xbd-\xc8\x88)j\xbf;\x9e\x8c\xd0_\xfeW\xf79\xdd\xfe5p\xb0\xf0\'=\x1dN/Y\x18\x9b\xacI#t\xe1\xda\x17?\xf2b\xfe \x93\x16+,\xc4q\xbf=;\xb4\x9cI\x9c]_\x87R\x0b~u7/Y\xcb\xb0\xd5\xda\x00\xaa\x99\xf5,\x9b\x0eH\xe4\xe6XV\x0e\x1a\'6\x0cA\x07U\xe6\xba\x014\x8a\xba\xe7\xefs\xcd\x8d\xfb)\xe8GY\xa8!\xd3]\xa26Ok\x12\xe4a\xbf\xbe\xb1\xa2[/\xe9\x98\xf8\x89_\r\x81\x94\xf15D\xf5\xfa1\xa7%\xe9c\xce\xbe,\xd4\xc5\x87\xd3\x1d\xfe\x9d\x90\xc7\xc0UH\xe8}\x84\xf3\xbd\x80\xdf\t\xdd\x9f\xdd\xc3\x82\xb7c\xb1\xd6\x9e$\xe5"3\xda\x9c/\x87\xff\x14\x89zK\xb4\xa6o"\xe1\xb8\xd7\x92\x99\x05~\xaf\xb8\x91\xccn*\xfe\x1e\x08c\x1f\xf4g\xf2Ww\xef\xd7\x1d-\xacC\xd9\xff\xbd\xca#**P\xc0x\xd3\x0e%\xd4B\xfbg\x8f\x19o\x0c\xbe\x02\x82\xc6\xdehvS\xb4\xe31O\xa3k\t~\x94u\x02\xf2Cf\xe0\xd4\xb2\x1c\x0b\x99\xe3\xb9\x14\r(\x9d`\xa3j_\x12\xaeV\xb7\x0f\xf9)\xc4\xba\x8f\xbd\x13\xc5\xf7\xbfI\xcf\x1d\xe4\xe6O\xb6\xb4F\xda\x11C\xcb\x8f\x0f\xc5F\xc3\xd4\n[Lt\xbb[n\xd9\xc4\x1c\x86q\x9cNW\xbb\x83\xd7\x104\x8a`Z\x19\x98(\xdf\xbf\xe6h\xcf\x869\xcdt\x06Wh\x88\x1d\xde\xd7\xcc\x11)^\x96\xb8\xd4\x1c\xcb\x87\x1dA\x9f\x055p\x04<\x075\xb2\xeaV\x0e\xcf1\x9ah\xd8\x9a\xc9_\xc7\x0e\xfa\x0c\x84\x98w\x12\x929\x1c\x84U\x14dp\x0fU\xcd\x9e2\r\xe8\xfc\xe8\xcaHh\x12\xa6\xb6r\xcb\x9f\xcd\x10(\xa2y\xe2\xab+fJb:\xb7\x0bs&\xdf\x10\xbe\t[\xe1\x15\xa8\xd4M\x0b\xccO\x07V\xb8\x10,\x9c\xce{^\xc8\x10\xf9\xa1\x06\xd3\xfeg\xabw\xdb6\xb6\xb9\xd3\xf0\xad\xc1\xa2\x87;S\x8f\xfd{\tx\x81\xbdL\x8e|B\xeb#\x1b\x94\xf9\xb27\xb5\xca\xc6:\xcb#\xd7r\xa7wa\x86\xfb\x0bR\xa6F\x95#\x1d\x0c\xe2\'s\x96\x1a\xb4\x12\x16q\xf3\xa9\xe8%\x00v\x03\xa8a\xc4PsW\xb28\xd9j\xdb\xb3\x14\xee\xa8\xb5a\xc9\x91\x07U\xffwr\x1e>\x11;d\xafd\x98\\\x17\x1b.\xb0s\xd0\xb0t\x11\x97eD\xc5\x93\x89+G\x00L}\xb1\xe2P\xb8T\xc9\xb9\xa6\x16\x0cR\xf72J\xa3E\x08Z\xb5\xab\x18\x94Yj^\xb3;\xd6\xda\x95\xd2\xfe\xbf;U\xe2\xc9\xe3\xe4kfd+y)\xf8)AZ\xf3<\xf4\xc6\xc2\xaeg\xc0R.s6\x06K\xb3\x90\xc0\x87\xca[\x15D\xc6s\x16\xb8CW\x82\x0be\xaa\xadJL\x1c\x84\x8cx\xe7\x01$u\xc6\xe2\xd1\xd2\x9e\x8e\x9b6N\xf2fb\xeb\xf0\xde\x0b\x1c\x82\xb2\x89&L!\x96\x1a{\xd4\xb6P\xf1\x91fP\x94\xa1\xfcy8\x87\xa6i\xc9\x0c\xab\x8e\'\x03\xf5\xb5.5\x84\xb5f0\xf4\xb9\xb3*\x9ey\xaf\xa3\xb4\x80\xa3\xf4C\xa1C\x9d\x19\x96\x82\xb0\r\xa1\xbeT\xd5Q\xcc\x94\x96rG\xba\xf4p\x7f\xc8\xd5\x98\xe2\x1eQ\xd4G\x7f)\xb0\xd3b/\x82\xbc\x80\t\x07jm\xa9\xc9`\xff\x14gf}\xe7%\x00W\xd5qo\xe4\x18j\xd8\xbc\x08%\x1f\xf2]#\xb9\xc0\xf5\xffH\ne\xb5\x91\xf3\xf3r\x03\x1d\x90\xba\xe694\x02\xfb\x9b\xe1\x1e\x8bK\x7f,\xfe\xc1N\x83\xad\x8a\xc3\xeanN\x06\xc7\x9e\xfb3\xac\x87\xe7\x96\x87\xaa\xd8iJ-\x90z1\xdc\xc3\xc2\x08\xc7\xf7N\xcanE\xe3M7\x18\xe0R\x7f%\xf7\x03\x8b\'S%+\x96\x9a\xab\n\x8d+\x11\x92X\xa8(F\xdd\x02)\x9c\xa7\xe0\xa2+=&\xed\xcf\xa8\xa9\xb4\xa1CS\xd1\xe2\x94\x15\x9f\xd6h\x1b\xbd+\xa0lR-\xa1K\xed\xdb\x00\xed4mP*Y\xac\xa6oJSq\xb4g\xf6_`/\xe8t\xd0?\xcb\xe6}I\xfa|u\xea\x9a\xe4r1c\xdf&\n_\xcaW\xda"-\x94\xe6Q\x9e\xe1\x02\xe8R\xad\xccX\x1et\xf9\x05.\x8c\xa2\xd8\xeb\t7\x05\'\r\xe6N\xcd\xb6\xcd\rV\x0bX\xdb\xb4\xb0\xb8\x05\x0f\x8e\xdc\\\xd0\xc0\xe5\xcd\xae\xbe\xf1k\xce\x84\xa0s\x16\x81\xc1\x08\xaa\xffl\xd2\xc53:_\x8dm\xa3\x19\x0c\xb0\x10\xd9\xe0\x95Z\xcf0\x994\xa9\x18\x1cI\x88\x98<\x08\x9d)/\xde\x9e\x98\xb2\xd3\xd1\xf8\xb1\xf9\xca_\xc0\n\x0e1+S[\x91Z<\x1e\x85GFS\x0f\xa9\x18BR\xb9GF\x91\xcb\xed\x05\xee\xe8\x80\x0cOz\\\xb4\xfbf\xd4\xa8\xef\xbd\x14\xb1\x19\xd0\tCY\xe3\xf8P\xe68\x83Z\x9d\xe45WR\x1et\xff\xa3R\x16? \xbf\x1do\xf2\xb3\x8f\xc6\xbba\xd5\xcd\xd4\xffY|\x06\x84p\x84t\xbb\xe6k\xa5\xfbW\xb4e\x84\xdfq\x8b\xab\xef\x08W\x81m\x92\x8aG\x16\x96\xb1~[2\xb8\xb9Fgj\x1a\x1c\xd9\x87\xae\x1d\xeb\x88>\x94\x00\x95\xfa\xa6\x90\x10\x01*\xb7\xdf\x1b\x94~\xdb\xc0\x87Uk}\x85M\x1b\x12 \x81\x89\x18\x0b\xc9MC"\x88K\x0f+\xd7\x915\xc7\xce\xa4;$\x19p\x1f\xb8\xb7\x1d[\xe9\x04\xc0\x04p\xee\x9aV\xa0\xb7\xcd\xa0\x08\xc4\x86\x87\x08u\x88\xb3a+`\xa0\x8a\xecz\x11`e\xc38!J\xdc\x9f 1\x90\x99\x8f+\xc5\xdaW,x\x8e\x1b\x10\x80\xb3{\x86\xafh\x8e\xdf\xdf\xbb\xa7\xda\xa5\xe6\x0fm\xf4\x05\x92\xef\xfd>~\r\xb0\xf4SsC\x9dYk\xe7\xa4\xceVr?\xe2\x1d\x13x\xe0e\xf4\x85\x00@\x82\x8f\xfc:\x0e\x85P\xf2VSF\xaf\xbb*\xee\xefE.D\x8b\x86\x03f\xe2b:<\xebL\x86"aa\n8EN\x90\x18\xd3J\xba\x01\xf1\xd1k,\x97O6\xba \x07\x16Y\xc4\xac|-\x0b\xc4C\x96i\xcfMd\xa2,qm\xfd\xa3\xfe\xf5N\xf2eh\x06\xb7F\x00d\x9b\xabwRn\xbf1\x90\x04Dx\xe5\xb6\x088\x96\x9a5NR\xb2\x95e\xadb\xc2C\x187Y\xee\x07\xb38\xce\xb0$\xd0\xb3\xa7\x8eb"X\x99\xe82b\x90\xc1\xc51]\x1dG\xd0lg\xd1\xe1\x01\xc0r\xfe\xba\x1d?b(S\xe5"\xb6\xaeK\x13\x9c\xf7\xe9\xc1WV\xc4\xecL\x08\xfco\xa5(x\x1d\x04\xb3\x9a\xc5>\x8a]\x98\\\x02o\xea\xa0H\xbc?oO\x9c\xd2\x7f\xf0\xf4\xdaRp\x16\xa1F\xbd\xb4\xf4\x83\x10W\n\xd5\xcc\xeb\xdd\xdb\x80\x94F\xf9\xa3\xb86\'U\xef\xe5(\x15\x84\xbaNb\xdcJ\xb0\xe7\xbb\x03\xf4b*&\x0c\x1d\x9b\x04\x9a:\x15\xdb\xe0\x92>\x0f\xa4\xb4\x02\xdfD\xa3\x0c\xadN\xd8\x92\x0f\xfa\xc7Z\x87\x0c\xfa&=\xf4\x1c\xebYV\x05Mss\xd2\xe8`\xc6\xda/\xc9\x8a:\x15\x05\xf70H\x11\x19t\x83\xeb\xb1v\x1b\x7f\x07\xb8\x88Mk\xd5\x8a\xbc\xb7\xf5\x80\xb3v\x9a\x0b*\xb3l\xdc\xb5\x96I\x91\x84\x1e\xef\xf5`\xdf\xb7;\xe2\x04\xfb\x0b\r\x1a\x8d\xdb\xcd\x19:\x81T\xda\xc99\xf4\xe2\t\x92"\x8dm+H\xeaFk\x98\x8e:\xbe\x0e\xf9\x13\xf4n\xc2\xdaZ\xd0-\x95[<\x7f\xf3\x08E\x96\xcc\x14U\xa2D7\xc8\xc8\xe9\n(\xe11\xbc\x88\x96S<\x07\x04Ie\xb2$\xc4<\x02\x1d\x17u\xc5\x19 \n\xe0\x8c\xc2\x89:A\xf5p\xaeT\x93\x8f\x86I\x02/\xc1\xfe\x96\xdbg\xdf>\x0bp/\x11\x069\xb82\xeb\xd3\x05\xca\xb3Q b\xb8!\xe5\xf2zyn\x826\xaa\r"\xd4\xa0\x8b\x13\xd1)\xda\x14\x8a\xf5b\x84\xfe\x0b8R\x82\xe0\xc0\x0fj\xd9b[1\xf4\x91[F^jC\x04R\xb3\x14\xb0D\x18\x03\xa28\x12;] ?\x84\xef^YB\x9d\x9e\xac\x16py\xfb\xf0/\xd1\x13\xa0\r:D\xa8\xeb\xe5\xba\xb4I\x07\xd1\xce\'\x90C9\x92\x87 \xec\xa7Qs\xde9\xc48\x0fY\xa2T]\x0c%%\xf8n\xf7s\x984\xf9\xcf\xd1\xb2Is`\xd8\x1d\xad\x04\xb1S>\x84\xda\x12\xe0xw\xf9r\x13Xb\xf9?}<^n;\xady-#\x91[c>p\xf9\xc2\xde\xeb\x95]\x1e\xff\x16\xc9\xf5\xafc\x10~\xf7XOs\x05\xaa\xe8,d*\xcc!\x00^\xe2\xc8\xb8\r\xa4)t\x99\xf4\xf5\x84\xc5N\x8b]\xd9*\x86ym\x99\xba\tZw\x81\xd1b\xa1;\xd4;\xf7\xd3Y\'\x8a\x98D\xdb\xa6\x01\xca8\x9dj\xd4\xa1E\x10(\ty\xc5\xd8:dk\x07\x0e\xb8S\xdc\xdcH\xbe\xe1\x1e\x1da\xd8\x8a)/I\x17\',\x89\xc0\x85\x0c[\x94\xc7\x1ag\x01-\t\xf8\xfd\xb5\xf2\'R\x06\x11 \xe9b\xbf$\xe5\x08Th\xe2LmK\xd55\x08x*\xfd5K@$?\xb3\xed\x81\xbcqG\x16\xfe\xec\xf3\xd2\xa6\x87\xef\x8f\x11\xc8\x99\xdcx\x0b\xc8K\xde\xd9~T(m\xff\x1d\x9b\\\xa8\x18ev\xf8\x02w\n\x9f\xc9\x89\x04\x1f\x908\xa4\xcb\xa5\xa5h(jS\x98nD"\xe3\xf91\x90\xb20kU6\xcb\x9e\x930\xed1\xcb\xa3\x92\xe2\xb6\xa4\xc1=\xbd\xd4\xa8\xd7\xe66\xb5\x82\x88\x08\xd1\xb4\xaaZ!\x18\xfd>\xe8\x11X\x8d%M\xc7i\x9b\x9c\x7f\x07\xcc\xdd\x02s\xe2\xd8q\xbc\xfb\x88\n>\x08Gc\x08\x81\xd1:C\xd9\xb1\x05=\xf2\x07f`J\x88\xd3|\xf3\xdb[\x92\xbc\x1cH\xdf\xde\xc5\x1f\xc2:\xed\xe7*V\x10\x07\x9a\xee\x7f\xb1\xf4\x10+GI\xa1\xf8+\n\x12]k\xa9\xdc\x90enn\x83BTP\xd3\x1c\x9c\xcc\xba\x9a<\xe7\xdf\xc3\xe7\rEhS\x93\x04\xba\x04\xf6I\x97\xca\x05\xe4\x8c,\xd0\xe9\xd8\xabU\xeaRSd\xdb\x87\xfe\x000\xfa{\xe99\xc9\xc6\x1f*t\xb0 \r\xb9dQQ\xdf\x1c\xaca\x92\xe7\xee\xa5\x8d\xc8\xee\x92e\xe1\x9c\xe0\xf0\xd2_\xfa\xd4\xef\x86\'/\xce[\xa4}hZc\x94\xe9\xe9\x84\xf1}s\xfe!\xe7\xfa\xe8\x8d\xc5\xdc\xc3\xcd\xfb\xfa\xb6.\t%\x0e\x9c\x16s\x9e\xaf_\xd4\xf0\xa4\x08\xb7\xf93\r\x14\x10\xdd\xffNf\xd8L|\x89\xa7\xb6\x9f\x9e\xb4\xe4\x8f\x1d\x97\xbbu\x89\xa8O!\xd0_\x04h\xeeQ\xe6\xb3.\xe0\xdd\xd7\rb\xdf\x007\x80!\xe6\x17\xd8\xc1T\xb7\x17N\xdb@\xed\'\x8b\xfc\xa8\xb6I\xa4~\x8d\xdf\x12xNpe\xe1\xf0R~\xfaz\x93Z\xdc{\xdd&\x8aL\xa9\xc2?\x15\xe6\xdb\xbc\xf7\xf1\x9c\x83a\xdb\xfc\x92\xc7Z\xc7Bc\x84Pv\xeeh\x1d\x95\x97k\x9c>\xc3\xed\x15\x1c\xedVt\xef8\xe3\xe8\xea\x07o\x92-\xf4\xdc\x9a\x95(h\xba\x99\x11H\x08\x9e\xeb\x18O\xa5\xb5\xb4\x82\x16\x18E6\xaa\xe6`\x05b\x85\xec\xdb\xa6\xc3\xeb\xb8X\xd0\xb8\x9e\xfbd\x82\xdf\xa0\xae\x93\xcb\t\x83H\xbc\xc9C\xc3\x81=y\x9e\xbc\x8aA\x0f\xe3`\xf9\x8b\xb5(\x07\xe8\x82)\xf0\x19\xa0\xfa\xf7\x97y\x05>\x9f\xd2\x06\xf3\x17Yn\xa7:\xa8\xb1gN\x00\xe2r\xcd\xb8\xbf5\xae\xdf\xa9\x9eQJ\x1eS\x80;x\xe3*\xbf\x06\xfe\x80<]u\x83\xa8\x10\xd5\xea\x17_i?\x11\x933\x18r\xe0\xd4\xfa\xba\x93\xa6\xc9\xb7\x8bB\xad\xe5!\xfe\xcc\x9b\xde\xa3\x02[9n\xce\x1e\xb9\xa6pWY\xa7\x15\x19\xa0\x87\x06\xc9@\x1f_-\xdfS\xe0\xb2ZR%\xe3\x9a\xa3y\xf4Mh>\tP\r\x1du\x15\x03\xf9Il\xc4f\x16\xb8\xe3\xf5\xf3M\xa2lm:\xac\xf4\xa4\x83B \x81K\xa3\xe7\xd8\xb5\\=$\xa9\xfe\x89\xa1\xf1@\x1a\x98\x1f10\xa5\xd6x\xa3\xea\x89\x91Q\xe2\x934\xd1\xceF`D\xabB\x98\x15\xa3{\x80\xe4\xfa\xe0A\x7f\x80\xe2\xcf\xe7\xe1\x91*\xbe\x1e\x188\xf9\x97<P@0\xb2\xfc\xad\xa3y&\xab\r\xb7\xdfT\xc8[\xc6d\xad\x9f\xfd\xf0\xd9I\xda\x92\xb5\xcb\x91^P\x05\xbf\x17j\x99\xa8\x9d:&i\n\xb9\xf3\x1a]\xef\xb3u\x86\xd1\xf6\xedaH\xe0\x86\x88f\x82\xbf\x00~\xdb\xa3\xe0\n\xc6\xb5\x8e\x02\xccy\xb2;\x0f\x002f;,\x8b\xdf\x17\xeah\xeb\xc6C\xac\x8d0{`\x10s\xf1\x10\x01epFk\x91\x96\xb2\xa8_B\x97\xc2\x8d\xfbn\x14$\xe61\xfdx\xaen\x18d6\xf8F\x85q\xf3\x8ayh.\xb5\xf0Z\xae]\x17 \xde\xae\x98\xdd\x18\xaa\xa4\xbb\xe8\x10+^<0"\x93n\xa6\xdc\xe3=\xeb\x17\xdb\x86\xd3\x8d\xc6\x7f>z\xda\x0eB\x88]\x18F9\xb7\xb3\x0f\xcb\x18.iE\xa9Gti\xae\x99\x9d\xb2]\x9c\xbd\xe2\x04`\x11\xa4=(\x88K\xe4\x89\x1c\xea\xfd\xf2\xd4\xef\xec\xe4\xba\x91\xab\x0b\x96\xcc\xba\xb3K\xbf\x0f\xb5\xb1+\xb3\x08zn\xdd\xc5\x15&g\xa6\xa7?B\xff\x93\x10\x9cD\x97\xfb\xf4\xcb;m\xe1&\xb0\x04Q\x13{\'\xd7f\xf7\xb0A6\x89 \x1aa\x1c\x85.\'\xd6\xfao\x03\xec\xba\x9d\x0ec\x8f5*\xc53[^n\xa4\x1f\x94\xbf\xf8/\xe8\xb2\xd3\xc9\x13\xe4\xc1\x922M-\x1aA\x85\xd4\xeb\xf8\x98\xdfK\rVy\xbeMZ\x14\xdf\xb1\xf7\x98\\\xb6@:!\xc7\xf4T\x02\xe3\x01\x903\xc3\xe2\x9d\xfd\xad\xcd\xaa\xb1\x91\xda\x0c\x0b\xf4<\x98\xeb\xac\xd0\x07\x85\xdcF\xa5\x84\x9ad,\xef\x12\x93\\\x9dGa\xc9U\xa0\xday<G\x0eK\xc3\n\xfb\x9dN;\x07\xf85c\xb0\xb5\xd0\x82\x84\x01\x8f(-\xb7?\xa8\xc7d|e\x94\x1c\xc5"!,\xf2\xe0"c\xf0?\x92\x12\xf2I\xdb\xd3\x84\xf3H\x9d\\\x8e\xedm\x13\x02\xbc\x9eq\xbe\xca\xee\x93\xc4\xa9Fg\xaf\xb3\xa3\xc2\xfa\x8c\x1f\x8c\x86\x9f\xf3\x91\xa6\xf7\xff\xaa@\x12"\xbf \xb0xPW\xddB%f_\xc6h\x9bGx1\xdf\x9d\x00\xa2\x1c\x9dB\x9b7Bed~\xbe\xbe\x80\xa0\xde\x93\\5d-w\x94w\xea\xc8)y\xa5\xd0_\x81X\xd3/}\xe8\xa4\x88`\xaeY\xe5]W\xc4\xd1A~\xfb@\xbc}O\x96\xd0]\xdc\x1d\x04\xf9\xa8\xc8\xb1U\xd0\x1aq\xd1)Bm\xd3\xef}\xf3\x9a\xe9\x9dh\x08~X\xc7\x00{\x95.\x16\xbd7\xaf\x1e\xe63\xd1Q\x90+\x9c\xces\xaeHw\xba\xa2jh\xd2\xf6\xbd<\xa8\xab\x05\xe4\x83\x02k\x0c\xb5\xaf%D\xff\x8f.dM\x13x\x14\x9f]I\xcc\x8bI\xb1\xa6\xfdlD-(\xc3(WH_\xac\xa5\x03^\x16X.\x88gj\xd5\xec\x8c\xfb\x87\xb4\xbfpI\xd9\x90\x88/\xe6\xb4\xcb4\xb6o\xa7?\x07\t\xc9`\xceK\xbc\x87\xaa;\xaf\xe8\x14\xee\xb1\xda\xb1^r\xfb\x9e\xe3G\x17d\xd3>\x17\xc9:\x81\xf0\xca\x86KWv\x8dTZ;\x07eCBz\xc1\x99=\xaeb@\x80\xf8\x97Zx2|\xf5\xad\x16\xf1W\xad\n\xb2\x162-Aa\xff_\xd4\xac\xa5\x8a\xaa\xec\x7fc\x1dR~x\xa4p\x83\xf1\xab@\x9alt|\xce\xef\xb3O\x98\x1f\x82\xba[\xb6(h\x81\r\x87\xfcy\xdb\xa7\x06\xbd\xe25N\xaa\rFCcEFNuI\xb8\xee1\xe9\xd3j\xb0\xf10\xcbL\xb8\x8f\xed\xdb#\xd2\xbd\x88\x07Pe\xfa\x16\x1e\xb0\xb6\x07\xde\xbc\xe0 \x1e\xb5O\x8b\n#\xfe\x0c\xf8\x96\x85\x14,l\xbbWz9\xc9\xa3\xd0w\x8e\x16\xdb7\x15\x1a\xb1H\x10\xabN\x1c>\xfa\xac\x18\x811\x12\xa0\x997\xd6=^\xedLN\xa1|\xec\xe4\xcf;\xdd\xac\xc7\xdd\xddy\x9e\xcb\xedLU?\xbckr\xa7\xf9\xd4\xef\x1f<\xe5\x8e\xd6\x82\xd6\xc5\xa8\xc4\xe9\x1b\xca*QCf4\x0b\xf3\xeaH\x85\xb3\xc2R\xeb\xa92tRu!\x82\x85\x0b\xcf*wd\xd9\x01\x97i\xf7N\x05\xce\x02R\xc5,\x98\xd9\x85\x81/\xb9\xb8n\x12?{L\xc6\x01\x1a\x87!+o\x8f2\xb5\x10\x15\xd8\xf9\x1b\x18\xaf{\x0cs\xb3\xc2\xd8\x01Qk~?W\xabx\xf8\x7f\xf7\xc9.\xe7\xf8F\xf0\xb7\xe4\x1bW\x8c\xb3.(\xd4\xfaZ\x8d\x96{\xe3O\x9a\xab\xb4\x8bK\xff\xa2\x18\xf8\x91\x97\xe4\x94\x9e\xa4\xa1\x9a\x89\xc2\xdf#\xe0?9j\x8b\x19\x0b7\xd9\xc3\xc1\xb7\xe8\xb7\x12\xf0W\xa7?\xf23\x8b2U\xba5f\xf8\xcc\x1c\xafb\xd4+SYnFd\x90q2\x14)+{\xa0|\x80\x10\x81\x9aC\x8b\xbau)L\xb4\xbdi-B\xdaW%8\xcd\x1a\xa7\xc7wNw9cy\x82\x86\xbd\xd3.\xaf\xcc\x95\xd9\x13Q\xfb\xe2\xc9\xa6\x99,w\xf3o\xcf\x10\x9c\'D!N\x92:\x1d\x1a-\x98\x9a\xcfe\x03Iiz^\x0c0\x95\x1c\xc03\x04\x08\xff\xc4?9-\xec#\xcan\xa9-a\xc6\xe3Uc8K\x9c\xfa\xf0\xf8\xce\x84t\x87yl\xde\xcb\x14S\xd7\xe2\xb0\xaa\xab-\x966\xab\xa5y\xf3g\xeeT\t\x17\x85\xe9!\xbaI\xb2\xdd\xc0\xb9\x19{\xf6U\x05\x8d\xb1\xfa\x11u\x96S\x00\xd8\xb4\xac\xb1\xd7\x1cEN\xf0bp\r\x8d\xa7\x0ee_H\xee\x07@\xc3\x9b2k\xa3\x92:\x076f\xed\xc5\xbb\xd0\xa9\x8d\x86\n\xa9\xed\x7f2\x1a\nv\x1b\xab/\x8a\xeb>W\xa7\xa9\\\\8z\x15\xc0\xa5\xfbqp\xca\xe8M\x7fK\xb0\xe4PI\xdd_\xd9\xa8\xd2\xa0\xd4-\x05\x91\xad\xa7\xaa\x1a\xb3\x1b\x02r\xd91\xcaTJB^b\xb5RA\xab\xdcL\'\xde\xd7F;\x92\xdeF\xfeZB\x869\x99\x8a>\xcc\xa3\x1b\\\r\x1am\x0c\xf0\xc9`\xe0j\x1e\x90[\xf8\xfd|0!\x0b\t\x16\xc6\xb3RC\x82R?>\xd5\xfd\xc3B\x19\xd5\x93U\\W\xdb\x0f\xc3\xb4\xba\x87\'\x87\xebG\x80\xd1\x0e\xc5_\xd4\xbd\xce\x8c\x82\x00\xea\t\x0e\xfd\x81r\xb3P\xb38\xec\xa2\xda\xb6\xe8\x9c):i\xb7!N$\x02Q\x83e\x8d\x1f^\xea\xbd\x87|\x17\x8d2\x98\x8a\xb5\xa3L\x0e!3`D\xf6J\xe4\xd1Iy[9\x11\xec\x02\x9e\x02\x81s\xfb\x81[\xdf\xb1\xbb\x16\xc7\xe4\xae*\x04ma+%\x94\xa6\x18\x94\xb1\x12\x99\xf3\xf1aMBw\x95-\xc6\x01p\xd9\xba\xa5\xdf+\xe5\xaf\xbce\xcc\xc9\xb2[\xd1\xe4\xf3\xaf\xd1[ =}\xbc2O*\x98\xddY\xf1\xf3\x90\x1d|r\x98#\x97%0J\xae\xa1g\xd0\xc5:$l\xb0&\xa3\x94Hb\x03\x06&\xac\xee\xeb\xedSU\xcf\x90\x99\x13\xbc\x82=\xf4\xe3;U4\x0b\xdaA\xaf\x12]\xe4\xaa\xb8\xa1\x9ay\xde\xa2u\x80\x05\xa4\xc0\x00\x1b\xb0\xa7i\xee\x1cLfq\x8f\xf0|\x0c\xd0\xd7L\x9a\x9a\x81P1\x0e\xfb\x15\xd0\x95\\\xc8\xb1\x06\xbd%g\x94\x0c\xff\xe5\xc2\xddZQT\xfd\xeb\xf6\x0cD\xae\xd3\x83\x18]\x16\x90;\x07\xb5`4\xf7\x1c\xcb\xa8R\xb4\x0c\x88\x11\xb2"V\xbb\xb4\xf0n\xd0w#*y\x97\xc9asS\x190\x1d$\x80w\xa3\xda6|\xeb_\x12\x84\x9e\x11]\xfb\x15\x19M<\xdd\x96\xc8\xc0\xb9@\xd8M\xddzP:8\xab\xefK\xe1\xd7\xcc4\xab\xe1\xdf\x8e z\x12+1\xdfn\xcf\xe6\x94b:\x04E\xd4\xa6\\$)\xf2w\x13\xc9\xeeM3C\x8e\x82\xf6\xdfSP\x95\xe6\xa5\x1eH\x15\r\x1bB\t\xdec\xe17\xb0}\xcd\x95I\xef\xd8\x84\x06\xb06\xb6\x19\xfa\xb3as\xe1I\x87#\x10\x97\xfd\xcc\xcc7\x99\xf1\x83Y)3\'y2\x81\xec/\xb9\xa1(\x04\xb9\x9f\x01\x96X`\x16\xady\x11\xd8RC\xf8\xe3\x1b_^Dy\x10(\x17-1O\xdc\xd5\xdd\xa9\xd3\x9bi\xee\xb7\x896\xde\x00C\xe9%\xf6}\xfe\x19\xb0\xcc\x1d3\x19\xa1\xe7C\x0efX\xf8V\t\xb1\xf4\xaa\xc6:\xdb\xd2\x9f\xbc\x13\'\xe88\x17w\xa84\xe9T\xab\xdd\xedx\xefwC\xe0\xad\xae\x11F\x0c\x16y\xdfR\x8d\x9f\x1a\xe7\x9cP\x83\x98\xdd\xaa\xfb*5\x87b\x87yHx\xb0K\x1e\x92F\r\xfb\xe0\x0e\x94\x8b\xa8Y\xdc\xba\x17A.\xd0\x9e\xf7u[U>\xe0\t"3\xee\x9c\x1f\xe2*\xc3E.\xf1\xfc\x18\xf7\x86\x06\x1f~r\xa5\n^i\xf3\xc6%\xbe\xdd\xef0\xfaq\xf1qPP\xc6\x82\xff\x93\x1d\x0cNNt\x05\xe4d\t\xe7\rLo\xc6\xdc\x0e\xb2\x8f\xfan[\xb0\xf0>\xbb`O\nd\xa5\xaf=f\xb7~\x9e\xe1yH\x10\xec>\x97D!\x19HQ\x1d7\x82\x13\xc8\x16\xa9i\xc2Jd\xec\xdd\xd6\xbd\xf7\xadG\xea\x89\xcb\xcdU\xa0\x11\x12\xd1\x12|m\xcf\x80@P]\x98}N.|M\xd5\xb03\xe9\x1d[\x93\x1cP6\xb9t\xce!\x80CAjb\xd5\xc5ql^`\x8a(o\xe24\xf7&\xc9\xe1;Za\xc2\xd1\x04K\x9c7]u\x9cI\x19\x8aO3\xcc\x0fa\xf7\x9c\x92c\x9bl\x9e\xdcMj\xc3\xcf\x80`7\x80X\x1b+E-\xf9\xacYHx\xbelw]\xe3]\x177\xc4l\x06\n\xceC\xc0d\xc8\xb4F\x87z\x9e\t\xbb\x07\x92\xfeC!\x14\xbf \xf5\xcd\x03\xc2F1\xf3\xe5N\xcds]u\xf1$\xf7\xdc\xd5\xb19w\xd3\x05$G\x06d\xf6\xf1\x01q\x85\xe8!C\xfe@\x88.f\x84K\xe8m\x92\xf7n\xbc\x98b\xfd9\x19\xfb\x96\xb1\xaf\x98a\x81\x08\xd8\x1a`(\xc4F-\x9d\x1c\xe4\xe1\xfe\xcbE\xdd\xc2_\xc2|\xd5\xbc\x9c?\xd4\x82k\xb0\xe8Z\xc6N\xe6\xde{\xda\x8e\xbd\xe9/\xe5x/t\x92V\xa8\r\xa8\xe5\xedm,q\xac\xe4rm\xd9\x18\x8d\xd9\x04\xe9\x96:\x10\x12JQ}\xe2\xe0\xc3\x04X\xfa\x9ftI5\x12\x89\x7f\xf3\xbc\x00q\xed\x11\xd1\xd45\x84\x8c\xd2\x07\x06\xb5\x9c\xee3z0|Mb<\x94!\xc0>\xf7$\xe46H\xdf\xc0\xb9h\x18\x00\x9d|\xac!\x0f<\xb2\x82A\xe0$\xbc.6\xbbE\x84\x96Na\xc4\x85f\xba\x1f\xd5\xac\xed\x8aHi\xf3\x8e\xa6H\xd5\xffr\xedq\xef\x08\x0b\xc6\xf6\xafd\xd7\x9eJ}\x18\x8c%\xf7\xac\x8d\x16\xa0\xb3\x7f\xd0\x99ps\x94\xca\xa4T\xcc\rc\x92\xab<\x9b\xb2\x0b\x89\x8c\x85E\xfe\xcf3< H\x1d)\x86Aj\xc6\x7fs`\xe9\x8f\xf3\xc1]4\xdfo\xd69\xff\xeb\xe3(\xd6\xed\x0f\xbar\xe8\xe1\xfd\xd0N\xdd\xa6{i\xad"\xf7\xa9\xfd\x9a\x8a\xe5\x15F\xfe\xb60\x13\x10<\xfa\xa4\x1d\'\x0ff\x1a\xe0\xa1\x8e\x82-h\xb3\xf0K\xec\x91\x8f\xe2H\xf3\x91\xda\xb7<NX\xf8\x00\xf4\xbf\nVbq\xccR\x89\xa2\x99\xdeZ\xb4\xe7\xe2\xac\x1b\xfe\xcaX\xe9\x9aN\x9b\xa2\x83\xac\x17\x04\x08!\xf4\xe6\x98\x8a\xda\x8fc5\xb3j\xb8\x84\xffv\xa1\x1f\xf6\xc0OW\x1d\x0e\x99\xb8\xf5#o\xc2\x1a&\'S3FF\n\xf9;\xd6\xe7\xee.\x82\xa6\xa8\xbc\xddH\xd7\xcc\x0e\xccl\x9d=uzR\x89\t\x02\xf6\xf5)a\xbb\xbf\x9fYi\x08w\t,\x1e\x95q\x9b\xe7\xae$\xbcy\xf7\xd0\xec\xdc\xe4O+\x01\x9e;#\x14t\xd8\xa3k\xf4\x12\xdeRNq\xf4\xdd=u\xfbB\x1d\xb7\xf2\xe9\xcc\x1e\x93\x03\xe0M\xbc\x97C\x1b\x1a|\xf1\x99\x9a\x9c~\x8b\x1b\xd0\xc1B\x9a\xb7\x87c\xddm\x9e\xba8X"S\xd1\xbf\xbc\xe1#\x9az[.\xb1\x8dSD\xd4q\xd3\xe3\\\x8e\n>\x07\x0c[\x1c]\x17l:[\xf4\x0bU\x82\tMO\x040^^\x8e\xcc\x1e@\x106\x84\xadm\xf3{\x86zh\x0c4\xf4\x9cKS\x11\xbe\xc4\xbc\xfe\x14G\x0c\x1d\x12\x14\x84z\xd0\x9b\xbfw\x9c\x0b\x82\xf4\x8c"]e)\xc2\nC,\x8c\x9d4\xae}\xc6B\xf9D\xd3] L.\xa3\x0f#T\xe7*d\xeaM\xea\x19\xc3\xfc\x819=~\xa6@\xfcFn\xebA Y\x0f}\xaa\x19\r\xffM\xbc\xd08V\x95\xf8$a }\xac\xc44V\x98\xecN7\xab\x05\tZ\x1crQS\xc8I\xee\xa0\xb7:\xa5\xe0sc\xb4\x11\x94\xef\x08$P~\xa3\xcf\xe6\xb6\xfeN?\xf1\x89B\x10\x91?1\xbd\x96V\x01[\xe4,\xf7\x97\xb0\xd7d\xc3\x96_\xa8\xea|9\x1e\xfa1\xf1\xdbq\x9c\xe7f#H\xd8\x81W\xac\xe7\'>c,\xfc\xed\x90\xa0\xba\x9a\xf5\x01\x8f\x9a\tK\xc6\x90\x17\\\x8bH\x1d\x95-\xfe\xc9\xe1\xd7\xd67$J~T\xb3\\\xe9,3?U\x8c\xf6\x97D\xf5v6\xfc\x95\xbb\xb9\x1e\xa5\x14\xf8^m\x8d9\xf7R\xbbs\xa16OG\x8c7`\xee"\xdd\xb3A\x1a\x96\x92\xd4\x03\x04=\xd6m>\xe2\xfdwY\x95\xff?\xa7\xb7\xd1\xc1\x1cg\xb7O\xf7\x86\x92_Z\xe8\xa4\x91\x98go\x9aZypG|\xc9\x05\x86\x13\xdf\xf8\xe9=d\xb6\xaekL\xeeNA\xcf\x11\xde3s.E;\xa4X\x9c6\xa0L\xcah\xb1&\x8b\xfd\xd1\x16U\xee\x18C\xe1\x8d\x8c\x01\xda\x03\xfb\xd4\x97\xf3\xdf\x98X\xe7\xd3\xc1\x05\x17\xef\x12\xdc\xf5\xd3\\\xe2h\x93\xb8\x13N\x9c\xb68x\xb2\xf6\xdd\xba\xf0\xb2\xeb\xb2\xb0\x16\xba+u4q\xf0\x04P\xed\x1c\x02\xd7j\xff\xf0\xd8\xc0_s\x17!C\x92\xe1\xe0\xad\xac+\xec\xc3\xa7E\xa7\xb7[bKb$U\xee\'\xbb-\x1a\xf0\xcdxkok\xf7\xaa&\x16\x1f/\xa0\x15@\x00\x95\xcb~\xaa\x9d\x14\xc9Y\xe5\x8a\xce&\xab\xd2]\xfc\xaa\xca\x00V~\xb0h)<v!n\xbe\xb7\x00\xf5\xfe\xa5vG)\xd5\xed|\x15e\x13";l\x1e+\xd8\xbf\xc8D\x05\xdb\tYg\x9a\x1f\xd4~\xd6\x13[\xc6\x94\x80\xc1\x8d\xb8\x04\xcb \xb8\xb0\xae\x87\xde\xf4\xccS~\x103\xa3\xc4P?\xc3!&\xb1sl\xcfVh\t\x17LCL\x9a\x83\'\xb2\x94\xd1\x8dA\x9b\xf4\xc1\x02\xaeS\xf9\xa5U\xc1O4b\xf2\xfe\xa8\x83\xc4\x18\x1a\x1cQ\xd3R\xe3m\xa3\xa5\xd4\xefO\x0b\xb8\x92\xda[l\x00&\x00\xc4\xafT\xe4\x95\x0fh8\xeb\xb5/=\xad\xfaG)c\xf4`\x7f \xa9\xc5\xed\xf5\x98\xe2\xea\xc5\xe0\xe6\x12qq\x105[5\x97ZV\x91\xf3T\xa7\xc5\x08\xd3I\xf8]V\xd1E\x8a\xf2\xf6D;\x1a\xfb+\x11jj\x83u!\xbcM\x19O\xfe\x8a@\x89\xc4\to\xeaf7\x04\x0b`\x84\xb9\x96\x9a\xaa\xe4\x1co\xd1;\xf7\xef\xfc\xf13\x1dx\x93\xcc\xb8t\xc5\xbc\xb7\xa7vM\x11\'kFD\xf5\xe0\xc0\x0f\x01\r5\x99)\xef\xf2N\xe6h\x84\x83\xd8\x13\x1f\x84qM\xa9\xdf\xba\xee!\xe16\xf8\x1b\xf5\xdb\x90\xff\x98x\xdf\x9d\xe3\xe3\xf9\x7f\xbb\x07\x99f\xa7\x87\xdb6\xaa\xe2C8\x99\x12sT\xfc\x88\x98\xde\x87$M\x9f\xe0\x81\t^:B\xcff*(D^\xf6&aR\xf4j\x1de\xfc\xc73\xd0d2?\x97\xbc\xdf7\xdeJ\xa7w\x90i<6\x04;\xd6\x93\x84\x1c\x075\xab\x16<\x05\\\xfe\x83\xc3\xb9\x0f\xf2\xb5<\xe7\xa2w\xae5\xcdHxU\x0b\x90\xef\xff\x19\xec\x96\x1d&F\x0f\xde2@\xceD\xfc\x93\x8aU\xd0\xaao\xc8D\xf0o9\xea\xc4<H\x04S\x0c\x01\x81s}\xa5\xb9\x9c\xa84\xf0\xd9r\xa1\xc0\x9f\xb8\xa9\xe6\xdf\x92=q\x95h\x16\xe7]\x11\xf3\xd2\xf5P\xc02ql\xce\x00Z\xc79\x16"\x8bi\xd4\x05\x180\x82_\xb1\xe4\xd7\xd9\'2\xe5\t/\xfeo\x0f\xf2\xa4\x9c\xf1\xecLA\xe8\x91\x04&\x97\x00\xb45r\xad8Q\xd0\x92\xda\x18\xa4c@\x06\xc8\xa7kBb\x05\xc9\xb2\xad0E\xa3\x9d\x17B\xb6\xd1\x0eD\x90\xe3l\x8a\xbe\x95\x14c\x85\xa2b\xa1\xce\xe9\x91{\xd3[\x03\xe5\xa9\x12\xb3ic\xa9\xd2\xbc3/R\x0e\x00\xc7-3\xbd\xbb\xed\xc3P\x1d\xa2[\xa8\x8d\xdf\xdf\xbb\xcaXiz\x82@\xeeKf\xd02\xf8\x8c\xe4\xb1\xf7\x99\xb8\x0ba\xef:&\x00\xa7.\xa3.D\x83e\xd8 T\x96.A8\xb0D\x0f\xb4a\xc0\x96>\xee\xd8\x06zrL\xc5@;\xdf6^U\x0e\xad\x96>4\x8d\xd4m\xb5z\xca\x02\x18\x89W\x0e\xf1-\x1e\xa4\x8a\x94+A\x08\xf7\xd0h!\x8f\xa5]t\xef\x00\xe8(\x02\t\xffry\xb1Z\xd4\xbf\xdb\x1e|\xde\x82\xe2Oca\xa4\x9af\xca\n\x8f\x9d\xeeql\xbb\xac-\xd5*+\x85G5\x9f\xdd\xa1F\x14\xe7\x99\x1f\x14\x8e|\x9fL\xd0\x9b\xae\xe7W\x1cR\xaeQP\x1e\'\x82\xad"w\xcf\xd86\xaf\xa7\xfa\x8d\xb8\xb2\x1d\xcb>&\x00\x93\x89\xea\x11\xfc\x07\xd4\xb3\xec\xc3J\xa9N\xf5\x90\xa0\xa5{e\x9d\x03\x04\xdd\xbb\x15*\x1cM\xa1\xa8\x9a\xefW\xa6\x89\x06\xe8\xb4\t\xcc\xe4\x02\x88\xa2jX)8\x86\xb4\xd9\xb7\xa3z\xc0\xf4[\xb3\x98\x82\x14\x97\x96\n\x90\x93\xd1jM\xbb\xb9z\xabl\xee{^\xad}\xfc\xf4\xc2\xf1>\'\xe1\x98\x93\x8c724\xa7\x16\xb5\xf04H\xd7\'G\xeb\xf6/\xb4\xfb\xd6\xd8\x85(\xabF\xf8\x15\xe9v\x82s\x88h\x93J\xea\x91D\xb6\xaf\xc7&\x1b\x14m|\x81K\xd0\x1b\x86>_M\xb5\xe0Z\xc3\xf1\xd9\xe7\x0e\xd8\xde\xee\xce`\xb1\xa7>\xbb\xbb\xb5\x05)\x86\xc3\xd6\x0c\x9c?BE\xb1&?\xa2\x0f\xf2\xc0%\xe4\xb0\xa16\xf8](\x92\x08\xc0\xe3\x05\xcc\x06\xa2eW\xf5\x06\xc6\x1f\xcd\x0fZ\xb9g\'\x83)Lz\xaa\xb2m\x84^x\x8c7;%\x9e\xb1\xae8"\xa9\xf44\x89W\x19\xce\x8a\xf1\xb4\xd5\xdfF\xf1\x98=41h;\x1a\x83\xd3Fx\x89\x8c\x824~\xfc\xeb\xb3\x15F\xc5\x91{\x00\xa5\xac\x94O\\\x06$\xb7v\xbd\x02\xdf\xea\xe7\xd4M8\x95\xb0\x15\x17\xad7\xd7\xd8\xa7\x8e\x99\x03\x9b\xd3\xf0\x9a\xa4\x19\x97\xff\xd45\xe1\x87\xb5\x88?\x11q8\xa6j\x08\x16\xf4\xe9\x95\xb5YD9\xc5\xc7\x9a4h\x1du)\x97?\x86\x87\xf4w\xcb+\x1f\xdd\xa7\xdfk\xeec|}\\\xfcZda\xf8F\xc4a\xc4\xb5\xe9\xc5!\xd45\x07k\xbd\xb0"\x96"\x80\xc7\xfc\xden\x01\t2\t\xbcF\xeb\x85\x10\xe7\x19\x01\xfa\xaa-\xee\xa4\x91\xfc\x1a\xb9~\xa7\xd7\xa8-g\x8b\xe1\xa4\xee\xc4\xbfQ|\nv\x84\x8c\x02\xec\x1b\xa0rN\x8d\xd6\x8e\xa8\x1e"\x9fy\xd1RJX\xb5,@\xf7\x12\x1d^\xd2\xa7\xff\xf9\x86\xb3\xae\x07\x84:K"\xeeS\xbf\xba\xb5\xe1I\xe4\xd9H\xb2\x96p\xd6A\xffm\xbb\xe7e\xdea\x19\xe8\x0b\xd3I\xffz\xc5~\x9b\xbdP\x1c(\xd7N9\x03\xd1\xe5\x99Z\x952\xfc4\x81lH\xcf\x8d\x05lt\xe6\xd9UM\xe7A\xb5I+9\xedv\x8f\xea\xfe\x1e4\xe0\x984P\x0eJ\xa4U\xeekC\x15:\xe8\xc7\xed\xe8\x07\xd6\x96\xd0\xf3\xd4\xd0\xfd]\xaap\x9eP\x12\xa3\x0e\xb1\x8d\x94\xd6S_c\xcb\xa2\xdd\xc1n\x8d\x08`\xe7\xaa\xdfm[\xf8\xd9\x16P\xb2\xb0.\x1e\x17\x8e\xe4xw\x9d\xc7\xc5\xb2&\x07\x1f8\xbcE\x15\xbb\xec\xa8\x06\xf6\x93\x1f"\x93\xd97\xe8\x1b9\xd8\xe1j,\xd7\'\xeeXN\x0b\xa3\x04\x0e\x85\x01\x81\x0b\x15N\x15\xf0\x13\xb4@\xc5\x06\xfd\xc4{\x0c\xcdW\xb2\xef\xfd\xf6;}\xb5E\xa1\x7f^^?3n\x95\x16T\x0f*_Z[\xe71\xb6^\xcf\x1aI\x18\xe1\xd1X\x1c6\xce!\xbd\x8f\x12#\xac3\xc1\xf2\xafU\xf4\x89=\xe6\x972o\x02\x08\xcb\xb0S\n\x15\x00\x1e\xb1T\xc8\xa9\x84\x1b\xe5\x98\xe9c\x86k\x99\xf7\xaf\xcfru\xdf)\xe9\xb4\xa7\xecI]\xf65\xb55\xf8S\xb5\xf6\xabb\x88\x94\x13~EE00U=a\x7f\xf2fy\x8f]\x96\x19~9\xf3\xdbMn\xaaY\r\xc42\xf3t\x0b\xfd\xe8\x95G1\x12aa]K7\xbc*\xa6\xf11K;\xb7\x07\xfbFN\x02K\xf2K\xc0\xf4\x1c\xde\n\xeb\x00\'H\x80\xd1\xc7\xb3T\x1d\x93\x9b\xe9%~\x8au\xc2\xa9d\xd0\x88\xa0\x06\xb3\x8fPy\xf1\x0f')
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-08T16:23:20.424565
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\xe4\xf5\x8a\x0c\x0c\x14_"\xef\xb0\xf5\x1f\xdek\xdc\xe0\x00\x00\x00\x00\x00\x00\x00\x00c\xdc\xcct\x0b\x1d\xff^\x0f\xfbT~\x88\xfb\xd9\t\x0e\xed4J,\x8f\x0b\xb1_\xc7\x1e\xe7\x0fE\x11\x8f7t\xe0\xde\x81fj\x0bZ\xba\xfc\t\xa6\xe1_\xd4\x18A{p\xe3\xc4\x84j\xd9\x16\xe7\x14\x88\xfbXe\x9a\x90k\x88I&\x07\xeb\xc4;\x94k\x8b$\xbenb\xba\xd6g\xbd\x17Np\x81D\xaf>w*8\xa2R\x8c\xcfl\xd4\xfd\x0b-\xf5\x16V\xc8\xdb\x06\nEh\xa3\xf0\x7f\xb8\xbb0\xff5\xcfcm\xc5\xaf\x044<I\x1fq#V\xe1\xd4I\xb0\xa5\xdb\xcd<I\xba\xebH\xef!K\xa3\xe1V\x12\x87\'2\xacJO\xf7\xd6\xed,\xe4\x16\x8c\x18\xc3V\xcc3\x99\xf7\n\x0f\x8bI<L^\xbb\xe0\xaen\xa3k\xe1}w\xbdH\xd4>\xa0\x1f\xb4\xee/\xedG\xa1\x96\xb1\xd3\x89?\xdd\x147\x1fm\xb4\x86\x84Zv\xfc\xfcZ\xe5R\x84\x12;\xacAG\xbb\xee\x88\xc6\x16\xd5f\xe6\xd1\x03\x91#;\xab\x02\x17\xb54L\x08\x97\x9dYP\x9b6\xc5u\x03O$u\x9d\x92\xb6\x81K=\xc4\xd57/v\x92.\xfa\xe0\xa1\xdf\xd9bq(\x9e\x90\xb4\xe4\xcf{~B\x9b<L\xb7\x91\xc5]\xb08\xfc\xa6\xd9\xdf\x1b\x0b\xb7\x0c\xe1/ \\\x11z\x08\xe1\xf6D\x99\x83\xa5\x95\x96\x1a\x06\x84\xeb\x87\x9ddEtK\xbb3\xac\xcd\xa2\xd96\x1fK\x8f~;~S\xa1\\"mt\xd7\x1f\xed\xdf\xe6Ta\r\x03\x82\xfd\x9f\xc2\xbcZ\xfaf\xa2Yk\xb0\xf4\xaa\x88$\xcc\xe8q\x19@\xd7\x00\xe8`|\xdd\x0b\x0f\xd4\xde\xf5\xc7\xbd\xdf\x90\xe6\xcdpL\xbb\xe9\xe5S\xa6\x12\x11id\x05\x8bZO\xb7F\xc5\xb3\x94\xa9\xed\xbag\x96\x08\xc2\xcf?\x06\xd7\xb4\xda\xcf8]7r\x0e\xe2\xd5k\xcd\'\x8a\xe8\x0e2\xf5u\x0c\xfc\x99\xaf\xa7\xf7\x93$\xe9\xab(\xfcE\xc1nj\xcd\x97y\x84o\xba\xe3\xd9`%K\x06\xc2\xa8\xae\x16U\x15\xe6\x12\xbe~\x833\xf1X\xe6\xb2\xbb\xf0,\xcb\xe3\xd2\xf0_h;0 \x87\x86\x13\xb8S\\\x93pP\x82\xc5PubX\x0e\xc5[\x1e\xf3\xbe]\xa9\x07\x16\x1cP\xcdB\xbfj\x02Q0~\xe4\xec\x99+\xfc4\xcc(\xe9Y\xf2\x83K\x16\x9e\x88\xff\xf7\xbb\xe3<\x81\x06\xb8\xb6\xfe\\\xea\xf04\xe2\xa5\xbe1\xf3\xea\x8c\xc4\xd2F\xc9\xcb\xb7\x8al\x82\raJ\xb7R/\xf8\xa7V[\xc4\x0eT\x0bQ\xb9\x06\xc4M\x1b\xd4\xc6\x88\xfdg\xe9\xd7U\xf5\xcf\xe0\x03\x1dv\x85\xf7\x05\x17f5\xff\xc8\xae\xd9\xb4\xf0[S\x90\xe8\x1c%\xfb\x92\':\xd9\x1b\x1d\xba6"\xd1\x8bZ\xc9\x92\xe9\x84\x90\x91\xc8u\x97\xb31y\xdfQ+\xc0\xb5\x08;\xb1X\x86|\x99\xe2Zi8\x05\x95na\xfd\xa9v\xca\xc9\x0e9\xd4\xf0q\xffRtB\xcc\x07\x90\x1dJ\x00\xa3\x1e\x99\xd3\xe0\xbf\xf3\x17\xceD\x8dw\x97z\xeb\xecy\xa7\x82\xc9\xfe\x14\xcc\xed\xe1\xc1\xf1\xab\xdbXp\xdbR\x0b\xa8\x0e\xa8\xed\xd5\xae\x07\xce)\x02\x94\xf1/Z6\x8f?\xcc\xaah\xe19U\x9f\xecN\x8c\xb3\xd26\xeb \xadZ\xef5\x9eKZ\xf5v\xb8\x87D\x04\x92\xd9\x02r\xe5j\xc9\xcfW\x82\xf1D\xb3\xad\xbe\xaf&\xed4\x89\xff\xcd\x93\x81\xd4\xe2\x08\x15\xe6*\x14\x07A\xc46#B\xc3\xb2\xe2Ej\x07\xac\xaa\xf52\xca?\xdey\x9d\xba;\xad\x1f\xa4T\xa1\xb1u\x80\xfa\x8a\x04\x0cp\x87\xcf\x89\xd0\xcakP\xf1\xac\xaa0S\xfe\x97\xc4l\'VU|\x8f\xde\x00Ab\xd5\xbd\xf2\x16O\xf1\xc5\xf7\xfc8\xa4\xb1\x9b\x8bo\x84\x8eFvr\xa1\xce\x92\xecWC\xd2\x91\xffx\x1e\x10Gm\xff\xd1\xa9\n)2U\xe3\xbcT\x1d\x07B\xa5|Q\x00\x1aqs\x07\x01\x8c\xe2\xf9n0\xb9|\xbe\xec+\xb1\xb6{\xc5c\xbe\xb3.e\xa2\x7f-;\xd2\xb8~\x8af\xe9*\x04?P\xf4%\xbd\x94\x15*U\x15\xaa\xfe\xb2m\xcd\x10;\xc0\x04\xdd\xff3\xef\x7fo\xb5\xf8ip\x14\xca\xbf\xd2\xc3\x977\xaa\x93\xfe\xb3\xd5\x0b\x0c\xe0\xe8Y\xcb\x1dI\x8f\xf6\xccm\xa7\xf0\xb5\xff\x86\x94\xf3#\xc0\xd3\xb7\xf9\xb4\xde\xc3\x8b\x90\x85q\\WS&\xf0\x13\x02\xbe\x03(29\x03\xbe85\xa5\xf0Vgfw\xa1ihr5\xfd\x0f\x08bi\'n\xa8V\xdd\x0f\x8d\xc3H\xa1\xfan\xa7 \xa9\x95\x90\xc7\xb4F\xa6\xec\xc3\xa0\x08QJ\xad\xb3\xe7\xcc\x04\x00\x83\x13\x1c!\xe1l\xfb\x18-\x8a\xc0\xa6\x87\xd2\xeb\x8d\x86\x7f\xb3\xb1\xcd\xbf\xe3\xc9\x02\xf6\xae\x05KV\x81\xec\xc0\xb7\xe4\x84\xef\x18\xc2\xc5U\xd0\xd8S\x8f9/\xa3\xdf\x9b\n\x81\xb1\xed\xb9\x1b\xebP\x8d\xfd,\n\xce\xc7\x00!g\xbd\xc2\x82\xec\x94\xb5\x0b\xcc\x7f\xb4\x8ckR\xc9\xfd+\xf7\xc9\x82\x90\x14n]\xe7\x10\xf7\x85f\x01\x9c\x02\x98Q\xf9\xe2.\x84\xed\xca\x01\xbd\xe9U\x1fh\xdf\xd9\xa5\x02\xf3^\xfb\x04o\x8e\xe6+l2[\x1dk>\xf6\xe0\xd0\xb2"\x98\xabe\xfe\x12Y\xb7\x0e\xebY\xd3\xda@X\x01G:\xf1\x83\xcdC9\x8a\xd4\xa0Mf_\xba9T=L\x0e\x81\xbd\xbf\xadc(\xe6\xe3\x9e\xad?./\xd9\xb5\xba\x1fR\xf7<\x10(hM\xae\x14V\xcf!\xadd\x01/\xd37\xd7\x99\xd4\xb5`\x8f\xe54e\xb7\x8b\x16\xc2\xa6\x1b\xe8$x\xffo\x1b\\\xab\x15\xa0\x9d-\xcd\xaf\xc1\x94YSG\xe3U\xd0\xc6\xb9\xaf\x87\xd5/f\xe8\xa2\'\xcb\xaa\x12\xa3\x03\xcb;\xb9\xb2\x93\xc1\xfb\x1f\xec\x9d#\xe2\xaav3\xc3\xbdC\xf6\xd7\xa71\x92U\xa0h\xe9\x9dw\xcf+\xf5\xc4\x99\xf7\xe5\xd5B\xec\x96\xd2\xc9k\x88"\xc5\xf6:v(t\xc7\xb9Z|\x14\x02Ok\xe6+n\x83\xfcd\xcb\xe0/\xadq\xc4\x90\xe3\xaa\xbe\xaa\xeb\xd4U\xf0\x06\xd3\x1e+\xe8S\xb5\xd9\x92\x1d9Y\xd0\x1e\x10\xf9ub\x02$\x1c\xa4\xd0\x9b\xdf\xb3\xbb\xff\xc1Q\x188\xa3\xe6\x1d\xf9\xa4\xbb\xb3e\xd2@\x80\x8f\xae\x93\xc41H\xe1\xd7\xba{P\x1d\xee\x95\x1d2\xad|\xf8\x1f\xc9\x08L\xcbkv\xbb\xa2\xe0\xd9\xa1\xf4\xcfK\x1df\x08\t]bc\x1c\x06{\x8fs\x80\xc5\xdb\x94\x97\xd6\xb9(\x8dl\x85*\xce1\x13;\xf6\t\xc6\xe3^\x16\xafY[S\x16\xc0\x82\xb0\x02\xbb\xd8\xe3L\xeb\xc6\x84G\x89\xa5\xc9[H\r\xf1G\xb3}\xae\r\x0b\x1b\x1a\x0c\x18KY\x03a\xad\xc7\xd6$\x0b\x9a\xc3,\xb5\xc2dwQ\xf9\xe0\x1d<\xbc~\x1d\x00t=\xd8\xe9c\x1d\x06\'[@\xa0m\xa9\x0cPb.\x00\x05G\x1b\xd2\x1f>\x04\xaf\xb0\xa4E%\xdc\xeb\x15\xe9\x7f\xea\xf8\x8c\x17.\xeb\x11\x03\x9e\xd4\xc4\xa8X\xd7\x1b \xaf \xdf\x8c\xf6\r\xe07\xa0=\xbb3\xcd\xbc\xe0\xa4\x80\x81\xd0\xd9\xcd\x80m\xd0\x94\xef\xcb\xde~s\x13\xa0e\x99s\xf9\x88\x13\x10\x80c\x1e\xa7\x85bF\r\xc8\xcc\xea\x0f\xecT\xda\x1a\x07\xf4\xb7?\xc4\x82\xe8?\xf8}\xb6&\xa9\x04R\xd4WH\x96=`\xb8\xa2\xc4\xd7N#O\x9aE\x13a\xc9E\xe4\x8c\xe5k\xba\xff\xaa}\x93\xa3\xf2\x01\x1c\xae)<\xad4\xec\xf4\xa8\xcc\xb9\xf6;\x08(\xa5]\xc3\xeb3C\x86$b,\xed\x89\x99\x87sR\x9e\xc6\x8b\x8f&\xd8[\x8d\xe2o|\x1c\x16\xb3\x02\x1f\xca>\xd74\xd7\x9c\x16\xe1\xeb\x8c|=\x049&[\x9d\xe6\x18X\xe2P\x06\xd74\xa1\xed\xf6\ny\xf9\x87\x19\xe0\xaa+M\xaa4\x1dI\xd0\x89l^NQ\xa4\xf3\xc0\x07i+\xff8\x9a\xb0Q\xc8\xff3\xba2!\x1d_IP\x17q\x82\x04\x1aj\x85\xcfv\x81\x9cA8B`\xb7U\xf8\xf9w\x1b\x056s\x9f\x15!!\xe4\x1e~_\xf4\xf1\xd4\x03\xc5\xb0\x8d\x91\xd2\xe8\xb0\xceD\x1e\xad\'\x01\xaa\x82\x90\x82\xd3\xdc\xfa\xca\xba\x8f-7t\x82\xda\x87o\xcd\xae\x9b9\xe0_\x9c{\x0e\x93\x98\'%\x08\x93Zw\x90t\x07\xcaS\xb2\xc2!1\x16Gk\x84\t\t\xd1\x97@\xfe\xf9\x15i\x7f\x9b\xfeq[1\x9dC~U\xaa\xa1&\xf1\xd9\xa0\xcc\x80\x08\xb2\xf6L\xd6\xa5\x84\xa4z-\xe2\x8c\xdbC\xb6\xd8\x15\xf4R]\xb8\x95Jy\x05:*\xa8\x04)U\xcd\xf4\x9fL\xc8`h\x80\xd7\xeaf+\xb5!/\xb6\xe8\xb4\xb3\xe4\xc2\x08\xa8~\xb5\xa80?\x85\xfe\xff\x0c\xf4E{\x0eFq\\\xe1b\xf3\x08\x8d\xf1<\xf5F\xd4\xf4fgN8\xc4ZT\x9d\xc4\x08\x91\xaf\x8f4\xd3\x88q\x7f8pF\xc8\xef\xb5\x8ca:\x06\xaf\x99\xcc\xe5\xcb\xf0\xf0$\t\xbe\x86\xb6&7\xa7a\x1bO\xaf\xb5\xa9L\xe1}{7\x99\x12\tu\xa0\xa6\x86\xeec\xfd\rx\x8dP~*\xa7\x19MA\xb8\xedg\xf7\xf6\x11\xea\xa6\x9e\x8f\x9c6f\xcf\x83\xb9\xfc\x0erk\x96N\xf0DT\x00\xa2\x1e\xa0i\x98\x86\x17\xfajw\xde\xc9\xa6\x18\xab\xec2\xda\x06\x07:3\xc6\x1eh/\xaa\xc7N\x93\xd5\xbabZ\xa1\xb70o\x92\xd6\xea\x84 \xd8\x10L\xedh\x18\xce_\x86\xcc\x1b\x0c\xb2|\x98\xebz\xba\xcc\x0fC\xf1\xf6\xcf\xfe:e\x9d\xb8\xbcE\xdfa;\xa8\xcf\xf28\x9b\xcf\x1b\xed\xf3l\xf2\xe4\x84\x10\xb6\xd8iTo\x06\xa6\xf4\x0b\xa7\xb6\x98\xdb-\xe2\xb0\x8a\x85\x0e\xa5\xe9\xb6\x96\xbc\xb6\xf0\xbc\xca]\xd13\xce\r\x11?\xa6[\x84\xcc\xcb*\x01M\xb4\xce\x05\xab\x99\xa2E\xff4*\xe60\x040\xc7\xfb\xb9"\xc4i,\xe4\xacyET\xdb\xdf\xb2\x12\xe4g\xdeA\x15\x03\xe3\xeb\x88\xf8M\x12\xa0\xb3\xfb\x11\xb8r\x81d>\xbe\xa3<|\xdf\x8d\xd9y\xb6!q\'\x8a\x1f1p\xcfX\x88|\xe8\xef\xf6\xd7\xbd\x1a\xfct\xa3m\x92\\I\xb5\x9f\xac\xa18,\xe5*\xc2\x1a`\xf0J\xf8W\ns\x81\xcb\x0b<g\xb5W\xf1\x85\xcb\xf0d\xbd\x1aY\x0e\xa4\xb7\x9d\x8c\x18S\x0e\xa2\xf3A^\x02S\x8e\xfb\x91\xacO\xd9\xf3\x91\x97\xad5H\xca=)\x17\xaf\x91\x9d\xd9g3\x8f\xad\x0eSq\x9fj=\xef\x8a}oJ\xe0\xf9\xcd\xcag1\xe7t*\xa0F\x0f\xa5\xe7\x87\x0e&\x08\x0b$>v\'d\xef=\x9d\x9b\xe4\xbb\xfd\r\x9c\xee\x07\xa2\x891\x8fm\xbf\x9c\x07\x80d%\xf2\xc6\x89V\xf3o\xbb\xb0\xe7\x18O\x88vs\xfeCN\x85?n\x8f\xddU\xf1Rq\xd1\xd7[v\x8dp\xb8\x8fD\x1c\xdb_\\,Z\x9ff:\xea\x9aC/\xe3\xc9\xe1\xa2\xfax"\x1by\xec\xd2GQk\xd2+\xdbST\xe6-.\x84\x11n\xf9\xa7\x88@\xb4\xdavV\x99\x98^\x10\xfe[=\xb2.\xb2\x96\'fIo\xc6\xbcF\xf6)I7\xdf\xf7\xd4;\x0b\xd4\x1c\xf2\xd5\xda\xeb$_\xdc\xad\xda\xbf\xdd|\xdd\x05Z\xfd\xb5\xe3*\xa6\xa9u\xf1\x95I\xe4\xb9\\\x0c\xa3\r\xaf\xb7\xf7\x96\x96\xea\xcd\xa3{\xc6\xcf\x1f\xd2\xe3\x0b\x86>\x06\xbc\x13\xb3\x13\xe3\xc6i\xa3\xdf9\x8b\xe8\xfe\xcb\xf9\xc58\x9c\x82\xbf\xf9\xee\x8f\x8e\xc3\xaf\x048\x7f\xa0\xc0\xd1\xc1\xb0\x10D,\xbe\xd3\xc7\xe4\xd7#y/\xefP\x9a\x1a0\x93/Wh%_\xb0\xf9\x1d\xe2\x9f\xe7Bja\xe9\xbb\x80&\x04\x1a\xa1\x08\x86\x9aw\xcd\xbd\x0ev\xef\x08\xc5y,\x19J\xa6\x00\x96\xdd\x1b\x106(_\xe2=b,\x11\x94M\t\xe3\x93\xfc\xbe\x0b\xcc"\x1f\xff\xedzW\xef\xea_\xbd\xdbvpl\x89\xdd\xaf*\xcf\xbd\xb3V3{\xb2\x00\x8e\x15\x92f\xddrM\xa0\xdd\x8e\x13n\x8czc\x89nm\x1b\xd9E@\xc6"\x8b\xc1Ug ?\x82\xa5\xa2\xda\x04\xaf\x8e\nV2}\xc9/e5\x859\xd0\xdf\xa2\xae\x85\x01\xb92\n\x12\xfc^l\xac\xfb`\x06\x13\x8e#\x16;m\xf4Y\x07Q\x13\x94\xf3\xca\xdcG\xbag\xe0\xa2za\xb2\x0e\x84\x88K\x7f\xa5H\\\xc0\n\xf9[ZZ\x83\xa5@^5`\xa2\x89K\x8b\xa9\x87\xc43\x0eJt\r\x9bI\xfc\xb7Y#\xdd\x0f\xd0o\xd5\xd72\xab\xcf/\xde\x97|\\\xb0\xdf\x05A`\x00\xa0\xea\xefB\x87\x98\xdd\x86\xfc}\x0brB\xa5,\xde\x85J\xb9\x8f9\xc9\x17\x94\xf3\xec%dD\x133P\x8d\xd7\xa6\x9d\xb4E~\x93m\xf1\xfd\xdb\x81\xab\x95\x15$\xe38\x14\xd6\xc7\xaeGgd:\\\x88\xbf\xd8\xb9m\xc3<\x1c`\x0f\x01\xe9\xb3\x96\xeb\x8e\xe0\r\x0c\xfa{\x0f\xfc\xc6r\x95\x13qJN\xcc\r\x8dz\xdcV\xf2\x01@\xca\x80v\xb7,C[\x07\xd6\xa6BoS\x7f\xf4\xf1\xbd\x15\tX~\x06W\xab\xa8i\x1ed}7\x81\xe9\xf0\x84\x85\x9a{N\x8f\xd6\xd9/wz\xb6\x91H\xdb\xcfZ\xcd` \x1f5\xb0@\x16\xf8\xb1\xac\x05\xfb\xf1*H\xf1\x8e\xfd\x9b<_\xdf\xa8\xd0%k\xb7C\x11\xca\x90\xb3%\x85\x02\xfc\xec\x87\x7f\x8f\xe5\x8d\xfe\xf3\x84\xf6\\r\x18dj\x1b\x90\xea\x8b\x8a\xa3\xc0!\x05\x882\xa2g\xbb\x7f\xaf\xc6.\x0b\xf6lla\xea\xf3\xab\xf5\xf5=\xf4\xde\xb5\x9c\x92\x10\x04p\xe9p!\xf89\x1e\xf1\x00\xea\xa2j\x97|\xf7\xd0kE\xe0\x00c\x86\x98YK\xe6V\x9cg\xf4\x17T+c\x93\x02\x92eC\xdd\xf4\x00}\xdb\x87\x1a\xcb\xbcG3\xe2\xf6R\xa2\x8b\xf6\x92\xf4vj\xc3\xd1\x0f\xf7%\xfe\xd9\xeb\xb5\xd3\xd9\xcd\xa1H7\xcc\x83K\\\xb0\xd0\xaf:\xcch\x88\xe6E7~S\x96K\xb1\xfde\xb5\xf9Z1\x14\xd7X\x11S\ni\x9b\xbe\xe0\xe4<\x8c\x86\x13\xe1\xadr&\xed\xcb\x17\x87\x89&\x9dda\x1b\x7fB\xb5T`jc\x1f+\x9e\xc4z\xaal\\yZj\x17SZ\xbcx\xc3D%\xe4\xc5y\xf7\xd6-\x83\r\xa5\x86\x82bf\x9b\x84\x1dw\xa9\xfc\x14\xd3y\x0e0_"\xf32\x83K)\x06\x85\r\xe0\xc0\xb2\x0e\xa2d\x17\x032\xc9\xc4\x04(\x88dW}\x7f\xb7\xa0\x8c\x9b\rUyj\xd7\xe6\xba\x0bQ^\xdb\x8eg@ja\x00\x02\xa6\xf3\xb5\x8bpGy0O\xe8MM\xee\x9e\xcc\x19\x1f"=+DB8\xb8nK7hF,0\xfa\xb6\x19\xbd\x1c&\xd5\x92\x1b\x7f`\x19\xc4\xe3\xcb/\xa3\x86\x0e\x17\xf0\xf3\xb6\x8e\x10r~\xb9\xfc\xf0\xd1\xb3(\xb6c\x06#}\xf4\x87.I\x93\xb9\xfd\xd5e\xbdm\x91!}@C\xcdDf\xac\xf2o\xd2\xb83\xbc@\x94\x19]\x86\xd68\'u\xf3\xb7a9\xadl\xb0w\xc8\xef\xfa\xf1\xbb\xe5\xa9\x83\x04gWqh\x98<\xc0\x9d\xc1j\xdbZR\xc4!O\xefz\x01\xca+\xa6[\x9f\x8e\xdb\xc9\xed\xceRC\xaa\x10\xd3\x86\x96>8G\xa3\xa3\xfe]\x10%z\xa7\\x\xa5\x80g\x0b\x8d\x1b7\xd3\xcf\xbc`\xfe\xec\x9b@\r\xa8\xc8F$$8\xb6f,x\x9aM*\x8c\xb9g\xc9\x8a\xf6\xca\x06g\\\x83\xadI\xaa\xbc\xd6+LVC\xbf\xe0\x99Z\x1a\xf7\xa4 \x08\x15\xb6\x8en\xa8\xa7g\xc18\x80\'`\xe6\x00`6K\xbaWKe\x96p\xb9\x95\x9e\xaa\xc0^\x81_r\x07"\xb1\xd9v\x0f\xbaKZy!\xb7\xf6\x05"IQ\x9e\x9dV\xa8\xe6\xbe\xf6 \x124\xd2^7ry\x1a6R\xbdhh\\r\x04\x95\xbf\x9e\x01\xef";\xa4<z\xaa\xe6u\xcf\x9aLd\xf0\xa9\x9e\x881P9\xa2\x13"-\t\x92\x1a<:\xf0\xe4\r\xda.\xb5\xfd\xf2_\xe4\xbc\xeb4\xa9\t\xcb!\x89\xfe\xca\x86\x86<\x81)\xe2\xe8\xd4\xb9\xc8f\xfd4\x80\x8aM)\xac\xccs3\x9b?rE\x89\xf5\xd2\xfc=\xa4\x9eo8~\xfc\x8d\xae\xf2\xe8\xee\xd5\xed\x82D\x93h)\xc7n\xe7]\xae<\xb1__>\x0f\x02\x1aV\xe6\xb9C\xd0\xa9\x1eO\x7f\x1aG\xd1l\x96#=~\xfb\x1e\xd9\xe0\xbc\x91\x18\xbbW\xf2\xca\xf3\xabu\x8f\xe9\x9et\xb5\x90\x0f\xa2\x07\n\xf8\xcf\x01\x16\xf9g\xfb\xaa7h\x0eW)\xc4L\x9e\xa2ia\xb9\xf7]#\xe4\x00\xaez\xe4O\xaf\xdc\xe2F5!\xbfN\xb5q\x9d\xf6\xf9S\x16\x8e\xdf\xda\xde\xde\x16aG\xc7#\xc0\x12\x8c\xbb\xf6{\xd5\xb9\'[Oi\x07\xec\x02J\xf9.\xe9\xb2\xf3M\xbd)\xad\x18\xd5\xf3\xd2@\xdd\xe8\x9e^\xf5\xe8\x03%\xfe?\xd0p\x1c\x94J \x87\x85\x98\xb3 \xa7\x99{\xb3\x19FIR\x90\xda\xfb\x0bC\x0b#g\xe2H\xe0\'\x97oJ,}:2\x9b\xa3\x00\xd0yF\xc2\x9a\t\xdeS\x98\xa7u-l\x19\x9a{\x18\x16\xac\x92\x91\xbe\xb3V\xba\xdd6n\xfa\xdbD\xda\xd8\x8d\x83;\xf0N-\x9b\x1a\xd5\x8c\x06\xfe\x0e\xd5\t\x1f\x1a\x83"\x88y7~(\x18q\x8aX\xd2\xec#\xa0\x80\x94V\x88\x9fz\x0b\xb2\x94&?0\xc0\xeb\x9d\xc7\xe5\xc3\xbb\x13\xa8\x8fL\xb4\xf6;\xef\xbe\xc2\xd2\x85f\xf1\x8d\xb0\xc7Y\xba{0\xb39F\xe4\x0e\xe0\xa1pY\x89\x7fM\\x5\t\xe8h\x9e\xc89\xf7#\x9e]\x02\xec\x1f\x99\xcd\td\xc1\x9fh\x02\x02`\xc8\x92\r\x1d\x85^xh\xaaV\xd9\x04w\'G\xcb\x05\x97\xde\xf2C\x9e\x95dn-\x87Q\xa4\x8e\xfc\xf3\xa7\xe4\x9e\x00lQ^\xeb\xfbZ\x014\xe5\x82Z\xb2\xccE\x00\xca\x19?!HC\xe9\xa40\'\x86C\xcb\x8d[{\x06d\x16;b\xd9:\xe7\x8e\x84\x0bf\xfb\xc2\x03_5\xd2\xf1\xa1\xd9\xec\x92K*\xd2\xda\xfb\xf9\x1f\n\xfd\x9b\xeaR7,\xc486-\xc3\x0f\xa4\xca\x85\x94\xd1\x9d4-H\x15\xb9\x9eK\x9c7\xd2\xb3\x18\x97\xd8x_7\x86\xe6\xbc\xd6W\xed\xd1\xce\xd0\xd5\xb3\x9a\xf3\xf1\x98yVN\x8b\xe7N\xb9\x91?h\x0e\xeb\xbarI\xe8\xcf\xa8\xfb\xb6\xb5\xb5<\xddQ\x9bT\x96\x92Ej\tr\xe4<\xc1\xaeI~5qS\xa4{\xb1\xb4\xd2\x93\xc7\xdbF^\x98Um\\\x07\x90\xa9\xf6\x93\xd7\xee*\xbd=\x1ca\x1c\xe6\x8b\x8b\x03\xda\xeen\xc4/\x13\x1d\xad\x05\x08V\xba\x06\xe1\xbd\x8e\xd2\xe2\xa1F\xbb\xf4\x18\xf4\xc9\xaah(\xfe\xdcXzy\xf7\x19\x9a@\xba\x87\xda\xd2\xff\xc9d\xd2w\xcf\nB\x01D\xd7\x18\xbc\xa7v}qJVsFT\xa9A\xc79{q\xb0m\xf9,\xf6I`3-\xc3K\xc4J.*\x1f17\xdfk\xd5\t\xce1\x98\xcb\xb7!\x8a\x9c\r\xa3\xc2\xf13\x9d\x97\xcd\xfd\xd6\x16U\xea-T2\xb5l\xdc\xa0\xa7\xf5+#bYXno\'\xa6\xa9\x1c.$\xbe\xb2V\xfb\xb2\xcd\x0c\x17\xb6L1\x06 \xad\xe1\x88\xfd\xce/\xc2$$]b\x906f\xbc\xf8c\x05l4\xc8x\xa7\xa6\xac\x90\xc7\xa5\xa7\x1f|\x0e\xfe{a7\xddrh\xb6\xa6\xae\x14\x87F\xa2 \xb3`\xe87\xf8ER\x94\xb7\x8f\r\xda\xc7Y\x10\x8e\xc8\xb0\x8d\xbf\xd1T9\x1a\xd8\xa5\xd7J\x0bat\xff*a\x85k\x107\xf6k\xcd\xcab\t%t\x80\x95\xd6\'\xf3<S\xe686\xae@ch\xf8jt\xe9(\x0f\x13FA\xc8\xaa\xc8\x00\xcf\x1c}T\x88\x8b\xe3\x02\x8ft1$')
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