hiddifypanel 3.0.0.dev64__cp310-cp310-manylinux2014_x86_64.whl → 3.0.0.dev65__cp310-cp310-manylinux2014_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,278 @@
1
- # 2023-04-08T16:23:32.133846
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00x1\x00\x00\x12\t\x04\x00\xd1\xa2\x1c\xf5c@R\xeb\x0f\xbe\x8e\xdd\x93\x82\xb8\xf7\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x0f\xc9v\x05\xe8XqT\xde\x9e6\x7f\x12\xc4\xd1\xb5\xcb\xac\x87\xc0\x8bu\xc7\x95\xf8\x1dhG\xbf9\xa2\xf0v\xe7\xb1jv\xeeeS)^\xb7\x15H\x08j1\x1b\x045\xe4\xed7nJ\x1a\xc6\x01H\xba\x04\xcc\xd9\xbb\xca)Y\xeb6\xe3\xb9"\x1a\xc4WR\xaf\xf4\xd85\x1b,\xfc\xaa\xf1^j\xac\xcdo\xaa\x92\x02\x15\x89\x1c\xce\xb1\x8fT\xb8yO\x02\xbep\xdc\x13hq\xb0\x8b\xb8\xb7\xfa\xf6\x06*q\xfb\xda?\xf8~\xe6&\n\x17=:v\xf0\xdamX\x1d\x8f\xe7k\x91\xd7\x81\xef\xf5\xca48f([\xa9\xf8x\x9d2\xb5R\x8f\x11\xf7\x8ag\xfd$\xaf[M\x02\x18\xcd{\x98\x18\x15M\xe9\xd6{\xa3\xa6`\xfd\x9c\xb3\x7f\xc1\x9d,\xea\xd8j\x1bI\xb0\x9e\xdc\x1e\t:~l=>\x88\xb2~\xafp\xdc_\xe5A\x12\x12\x86\xd5\xe0\xebH\x80\'\x8b\xda\xadX\xe2\xfe\xd3\xa9\xc8\x7f\xfd\x1a\x19\xab\x10bo\xd9\xd0\xd0b\x08\xee\x17\xac\\j\xe6v\x8fl\x1eF\xb9 \xee\xa9i\x88MBF\xe4\x01\xda"\n8q\x90\xca\xca\xb67B\x13\x0fB\xc5\x0f\xad)\x17\xe5\xbb\xceW+<\xa8\x0c\x96\x1c\xceg\x8c\x92\xcb]Ygx\xa8AF\x897\x8f\xedMg\xbc\xc2\xf7W\x97im\xc4x\xa14\x01\xd4\x145Y4\xcc\xd8\xd6\xa9\x95@\x04^K\x9ee\xb3@\xf7\xbd\x92t\x01[cJ\x16\xe6\x17qh\xd9\xd0a\xe9\xd5F-\xa8\x850Y\xdc7;*|$\xb0qZ\x0c\xaf\xaa\x8bz\x11t\x85\x85Q\xe7\xe5\x03e\xca\xf3p\xf4\x178db;\x0e\x15qU\xf8\xf4\xce\xa0\xdaH7XG-q\xeb\x9a\xd6\xf3\x01\x8a\x87\x9bW\x1b\xd8\x9a\x93:\xe1\x0e\xa12v\xce\xec\r\xf5\xd5\xfa\x8a\xab\x16J\xdfQT?\x91M\x97\x94L\x06\xd0y\xbc\xfb^\x19$/\x97;\x9fi\xfd\xce\xf1;\x01\xa8T\xb2\xef\xc4\x08\x07l\x98\x17pN\xb9\xc9\xc5\xf9\xdb\xae\xb2\x14\xbd\xe4\x02A\xa6\xff\t\x01\xf1D\xd5\xfd,#j/\xcf\x0e=\xbb\x04\xb7\x7f\x89\x0e\xdb|V\x88\xe4&\xce\r\xd4\xe5\x0e\x8f6\x89_\xf4\x0f!<D\x85\xbbk"\xc7\x02\x9e\x1c\xb3\xea\x7f\xb4\xdc\r\x97\x87\x91\xba\xfb6>\xc1\x9eIJ\xcc\x1dmw\x81\t\xe9d\x87mm\x1e\x98\x92\x00<\x98\xc5o\x05\x9a\xf9N\x9d\xb5U\xe1\xed\x16C\x9f\x0e\xafR\x9d\xa7\xe4\xeb\x11\x8f]\xc9\xc3\xf5\xa5v\x07N\xf8\x07\x07\x95)\\\xc2\xba\xa4\x16\x8c\rK\x81\xbe\x0b\xbearQ\x9b\xadux\'OL\xf1G\x8f\xda\x8f\xf7+\x9d![\xcd\xbe\xa2BiL0\x14\xe8\xe1\x92\xa4\xb6\xcc+&\xc3\xbc\x8f\xc6\x85\xc9u]\x93\xfc\'\xc1\xc2\xbe\xd7H\x91\x89\x0f7NE\xa9\xbc4\xaf\x93\xfdv8)\xed/\x1eM\x05F\xca\xfa\xfb\x83\xe5\xb1y>\xfa\xcd^+uF\x9d\xeb{\x8e\xd0\x94\x19em\x8a\x9e\xb1zW\xc0\x8c\xd7\xb7\x9d\xd9\xec\xabaSm\xb77\xb9\xe3k\x18F:\x88\xac\xb4k\xda\xc4b\xdc6\xdd>\x8f2\xa7\x00$\x01\xfdN^09\x00"\xcd\xdd\x04&\'k\x9ag]t\xdb\xaeP&\xcb.\x07\n\x89\x97\x9d\xed\xf7*\x0cS{]\x18i\xcd1F\x9dG\xa45&-B\xed "\xcb\x00[\xd4\xbb\xdb\x94\x01\x1fBp\x8a\xfe\xd2\xaf\x9e`\xcf\x86\xa7\x98/\x81\xbc\xb3\x9d\x9e\xfa\xa3,\x07c\x8b\x9aJ\xbc\xad\x99/|\x80\xb0\x12\xc7\xb9\t\x16F\xb4\xadJ\xd7\x92\x04<\xdac3\xc4\x13\xb3\xe0\xc5t\x05u\xa0\xb6/+\xea\x02\xefj\xe4\xd6\xe4{\xb1x\x17\x04\xed\xc4\xfa\xae\xdd\rL\\\x1a<\xc2P\xe6~\xcd\x87#\x9d\x0bz\xf9\t\xe9|S\xb1-\xe2\xfa\x91jz\x87\x12\xf8\xde\xed\xe6\xd7\xa6%\xeb\xd5\x01(M\xf0my\x13\x80\xd6\x9b,\xaeP5\xef\xf7\x84\xd9\xce\xd7\xdf\x0e\x00\xffk\xc8\x0c\xceD\xed\x8f7\x18\xf5\xcd\xc0\xe8\x0b$\x16E\xe1\r\x9a\x97[\x0b\xeb$^1[\xc1G\x0be|\xee\xc8\xc7S<\xf8~kC\xb0G\xc6(\x07<\x96`\xc4|x\xc5\x88"\x1bv\x11\x9a\xc5\x94\x90\xd5[X\x1b\xbb\xd4;`\xa0\x14\x80\xf0\xc99o\xfc\xc1\xabi\xf4x9^\xac\xa5\xc9G\xd84\xccl\xee\xbf^\xcdA\xdcw e(q\xa7O\x00\x15\x13\xa7<\xddL\xe2\x89\x85\x9a\xa6\x05\xcb\xd5Z\xfckM\xf3\xe3\xfc\x1c\x1d9\xbeN\xcdzb2p\x99c\xdd\x96\xc3\x9bl\xe6\xd7\xd1\xe6\x19\xad\x9bi\x06\xef\xe8\xed\xf6\xc5\xdd\x10\x91\xcf\x97\x9b`\xf0\xf4\x1e\xaa\\.>d\tv\x90m\xa4\x93Z\x1d0J\xc3\xf1&\x1c\x0e\xc3\x1b&\xce\x8es\xe1\xd7\xe0\xf0[T\x9a\xb77oz.\xa7n@\x16\xe3\xd8\x81\x86^AU\x11\x19\xb1\xb4\xf6\xce\x17p\x96A\r\x93\x925\x90\x96z\xc6\x81\\\xce\xe1\xc41\x93\xdd\x0fq2\xf3\n\x12\x05\xd0\x0cR\x80\x95\xfd\xc6B\xe9\xdd7[W\xb1\xdb\x9a\xb1l\r\xf8\xae\xa8o\xd6\x82\x13\xe5-\x18\xc0\xd7N\xfb\xe5\xc5\x0bO\xc0kT\xf6U\xa9{S\x9b\xde\x1f\xe5\xb9$\x07x\xbc!P\xbdf\x00\xb5\xdd \x8b\x00\xea\x13\xe0/\xc52\x1dE6\xf7f@\xbbZ\xfbra\x90\xe6\xbb\x8b\xf4o\x9dl\xdd\n\x17\xd1\xb5\xcc\xd3\x14\xadVx\x87\x93\xe06\xb8\x82y\x12F\xe2\xa9@P\x80\xef\xb5\x19\x83\x04\x06\x7f\xf1\xa7\x15\xb3n\x8c!\x18\xca[dX\xf8_\xda\xdb\x9d\x7f\xab\x0c\xf5\xf0$\xb1\xe8\xdfT\x0f\xc0\xd3\x1d\xfc$\x07\x16\xa2\xc9\x04x\xe9\xc2\x07\xd3:\xdf\xc4`F\x1a\xf8u,\x97P\xa2\xed\xdb\x1a\xa7\xff~\x96\x90\xfc\x1c#\x15\x08\xca\x96\x005|\x1d\x070\x90\xd6;\xc9sgV\xbf\x8e^9\x8eE\x0c\xec\xa9\xa9Q7{8k\xfc\xacr\x9d\x9a\xd2\xf3\xde\xb7\xa5\x0c%\x05\xa2H\xfb\xa8a\x10-\xeb\xaf\xa9D\xbei\xdeFj\xa8c%\xce\xc3\xb1+\x05r\xce\xc0\x8f\x83\x88|B\x93\x7f9\x8e\xb8=\x96\x85\x8f\xd7\xd0\xd9k\x87\x02V\xfc\xc5\xf1D\xe8~\xf3\x01\x96\r/;r\xa0>\xbd\x90d4\xean\xbd\xb4\x177>\xa9\xae\x1cney}a{\xcd<\xe9\rI\x1c\xbc\xd3\xc0\x96\xb8\x88\x00\xa1\xe63\xa7\xa2\xccm\t\r\xe0\xad^\xc7d\t\xc9R\xfc\x9a\xc1\x91\xa9U\xc0E=\xb4\xeb +\xdbt\xaa#*\xda\xa8\xd1-\xf7z\xb4e\x8c\xb6\x946\xd9\xfa\x0015\x90\xe3}"\r\x03v\xd9`\x9aV\xcf\x8a\x9ch\xfa\xff\\NA)\xf6\xcb\xee\x85\xc3\xea\x0c\xb1\x89uQ\xa281\x83<\xc6Mm\xe2v\xbb\x82.\xd8dC\xfc\xde\xa5,\xdd\x84\xa4\xa7\xd64\x83\x9eNDf\xff<Wrr\xf7\x1e\xa7=\xf2\x0f\xbb\x07(\x99n\xe5\x01\xbf~\x92\xa3\xc4\xdf\xd3\x00ZG\x8b*D\xf1\x90k\xcc\xe9 ZK\xa9\x01\xedwP\x923\x17\x89\x82\xbd\x05\xd4\xc5pK\xed\xd6-\xc3e\xba\x99\xe1\xc62\x16\x940\xe7\xe5{\x07\r\x7f${9\xfb\xdd_FN\x82@\xcc\xe8#\x19\xbcK\xd9\xc4\xc7\xa8\xc9+^\x91\xbb\x86x\xc8\xc2\xa6\x86\xe7q\x15\xb48\xd3f\xadEx \xdb\xba8v\x8bP\x13\xec\xb4oX>\x075\x06l\xc3\xec\xd4\xab\x1e\xbb\x17c\x12\xf2X\x8f,\x99c3R\xf8\xd6\x85\xf1\xb6,\xcd\xcb\x92\x12I\xee\xad\x95\x95\x86\x1aa\tl\x03\x13\xe3\xd7FK[\xd3bk\x8c\xd3\xfe0\x87^\xdc/\xf1\r\xa1 \x03K\x93\x94\x87\xf1amR[I\x9d?\x06\xd5V\x86$\xbe\xf9\xec\x97\xab>\xba)O\xfd\xa0\x85\x0c\xa7\xdciV\xa9)\xf4\x1e?\xea\xfe\xfc\x96>\x04IF\xc9\x06TN\x0b\x13\xd6\xbbb\xff\x9aA=3\xc5Qk/j\xb9\x13\xb8*\x0c\x19\x02\x1a\xfd\xdd\xbddV\xc4\xb2\xd2\x0eX\\\x06=\xef\xa5\xb6\x18\t\xdd\xca\xee\xde\xdc*\xcf.\xf7\xbb\xd1@/\xcc\xfd"\xdc\x00\xbdE\xb51\xe5\xd7\xb3\x08\x05\xe5P\x9c\xda_n\xc2\x17\xb1\xcb;\x9em\xab\xd6S\xbb\xf4\xe5\xdb^\xbb\xbeKHq\xa6\xbb\xe1J\xaaW\xfa\'\x9e\x8cAAU\x94\x9dCT\x934Z\x0e\xdf\t\x00\x1e/BJ\xec;\xb2\xb6\x1ca\xd8 \x86\x9d\x83\r\xe6\n\xc2\xd1=\x99b\xe2\x97\x11\xc7\xb2\t\xd5n\xbb!\xe8\xe66)z\xfd\xa6yC\xd0\xf5R\'\xcb07\xad\x0b\x83\xda\x12\x85b\xb4\xf0\x93\x19NF\x8aU\xe7\xa8\xfd\xc9\xfaI\x04D\xca\xa3\xbaa\x146@M.{\xa2\x1c\xc3\xa3\xb8\xbdb\xf5\x7f\xaf\xe3\xac`\x89\xeb<\xec\xd1\x15\x84\x06\xbc\xcf\x11\x94W\x1c\xfb\x0e\xba\x8c$o4\xe0\xc76\xbf\xdf\xee\x82)6Z\xb9_[\xb85\xa4\xbcz\xeb.\xdf\xc9\x0c\xe5\xdbU\xfc\xd4bA\xc5\xa1"\xa5\x08\x18\xee\x88\xbd\xb7\xb05]N]\xaa\x9f\xaasvK\xec\xdcS\xa4\xf3j\x9a\xf0\x16_\x92%\x003\xf8v\x05\xdf\xb3\xadsj\xe9uz-\x8e!7\xaa\xb2\x9cO"=*:;Fu\x04\x80\xb5\'`f\xa2\x0b\x8di\xde\xe3\x0b\xe8>XK\xe0\x9aW \xd8\xe8\x1d\x9b\xac\xd3\x1f\x0b\x0cC\x84v(\xf4\xa35\x0f\x80\x07\x8c1\xf4\xd0\x92:\xfetX\xf5<\xa3\x9ev\xba\xa9&\x1f\x10\x88\xc2\x7f\xda\xf2\xd4W_\xa5\xb1\xbe\xd2\xe5\x80<\xa1c\xf0\x9d\x1a\xca\x16+\xe4\xae\xac\xf7\xfe\x96\xde\xab\x82u\x1f\xa7\'\x8a\x83Y\xe9k\x7f\x1e\xf2\x1f\xbc\xf6\xd6\x8c\x86\x92\xf0\xf2\x13\xd2\xbaY\x0f\x07\x1b\xe4\xd7\x87\xc6\x94\xee\x18]1\xa2\xd8M`\x9ay\xa5\x91\x0f;X\r\xd9\x98\xef\xb6\xbepX\x13\x00)\xef\xfc\x88c\xeb\xde\x84e\x99\x1f\xdb\xdf4\xda\xec\xae"\xce\xae\xfa\xcb\x9e\xe1\x96Y#\xa2F[\xb4k\xb9+o\x9c\xbd\xe7rU\x90\xae\xfb\x9b\x01\x1f\xc7\xda\x90UW\x8d\xf0\xae\x1753 df\xa53\xa8\xcb\xfc\x8b\x13\xd7\xf0\x89\x05\x17X\x1d\xa1\xe4\xf1\x13\x8f\x14\xdfJ\x91\x08m\xe4\x92C\xc4\x1f\xb4\xb7\x98\xa4\x8a\xde\xf7t6\x94\x8e\xee\x1c\xf7\xf7\x83\xdc\x97\x86\xf4\xf0,:\x84\x1f\xd9hRQ\x9f\xcf<\xd8&\xc4\xcb\xce\r\x9fe\xe3\xcc\x18#F\xbexl\xe0\r\xbbh\xa2\n\xde\n\x16\xe2\x08Y"\xa8\xf9\x93\xd8v\x0bP\xf7\xdd\x83.v\'\x95U\xddn\xdc\xec\x01\xaeOw/Q\x8bVz\x04`\x11\xa7&w\x1eX\xdb\x89R\x92\xe3\xb8Q45\x04rZ\xaa\x82\x0fe{0\xd3|\x8c\xe2\x11N\x96&\x17\x9b\xad\x1bQ$\x96~\x89\xa7\x8cn\x0e4\x93g\xf4\xd3^\x08\x1f\xc5d\xf7\x0e\xd3\xe7D\xd7\x16\xfcJTP\xbc\x91\x08@%\xea\x88\xf1sf\xbb\xdd<\xd8\x10\xbb\x9fO+\x07\x047\xcbXC\xb7+By!\xd0o\xf7\xa9\xb2@\x10.\x8c\x9c\x99\xa5\xf9\xb4\xe4\xda)\xd2\xcf\xc1\xc0S\xca\xf5C\x1es\x9eMe4\xb2I\xa9\xf4\xa1\xb8\x17\x8a\xdce\xcb_~\xec\xed\xdbS\xd8:\x82Q#\xefA\xf6|)\x1b!\x0f)\xa3\xdc\xaa\x00\xb4\x12\x96\xe8\xbd\nX\x86Ml\xfcc\x1bu-\x16D\xedvH\xb7\xfe=\xe9\xe9#]\x95\x9en\xc0\xfc\\\xc4\xd5\xac\x9a-\x94\xc6\xe2J\x8a\xd7y\x97f7\x06\x9c\xc8\x0f\xee\xe4\xe4-\xac\xba\x8d{\xd3\x1f\x86W\xbb\xa6o\x9c\xd8\xcf\xcaj\x16\xa6\xa6,\xa4\x99\xa5\xc3i[\xe6\\\\[fW\x8ca\x89\r\xbcAl\x16_-\tc\x06}\xa6Q_\xdeL\xb2\xf1\xe12\x1c\x17\xed,O\xde\x8dk\xd7\xd4P2}\xb5a%\xa7\x05\xa20\x80 o\xda\xe7*p\xe5\xd2\x10\x18\x16\xc1\xa9M\xcf\xff\x1b\x9ej\xc6\x0c9\x03\x9a\xfa\xb9o\x103\x8d\xb6m\x877\xd8\x88\x9bkC\xb4\xc0WGED\xe7\xa6S\xc6X\x05\xde\xee\\\xb4\xf6\xed\x0e$}m|B\xf1\x8f\xb0\xbb\t\x1b\xc5y\xc5\x13\x98\x9d\x95#\x91?\xea*\xad}\x04n\x12}l\xf20=`x\xd1\xd7\xa5\xa9\x1d>\x8cZp\xe7\xd2\x02\xe6>\xc5 \xfa\xc7m4\x16\'a\xd0\n\x10YM\xaf\xc9\xb3VE\xcd\xe8\x16y\xb9\xf6\xf2\xf8\xf5\x16W\x94\x08\x12\x88\xee\x08\x10y\x9f\x1b\xc5\xfa\xe6\x8a\x96\xfah*\xb6\x15n?\x8a\xe8|<\t^\x14PQ\xec\xa5\xfc[\xec=\x0ck\x8a/\x92\xc5b\x85\x98\xeb\xb9Y\xb8\x98[i\xc3x\xb1\xa2?%{Hfk\xedM\xfb\xe8\xbe\xaaiid\xae\xa4\xde\xed3\x1f\xa23\xbe\xa1\x18\x0e\xaeb).A0&d\x87T\x16\xfcw\xbc\xafS\xeb*\x05\x94\xcd\xa5*|\xb9sH\r\xccB<\xea\xcfnm;e?P\xe2\x8dEy\xd0\xed\xeb{nhe\xa3\xbd;Cs@}\x8c\xc9\x8cg\xc8\xd7\x94r/\xe2\xff\xd0\x8eH-.\xce\xebP9\xa1\xa6\xa8\x98\x98}J\xfe>\xaa\xfd\xc2yV\x93]D\x07\xb0\xe6j\x94|UM\xb1;\xc5\xf7\xce\x88j\x8a<\x07\xa7\xe3\xdel|l\x1df\xf8\xfe!\xbfdf\xe5\xd7K:\xb9\xf4\xb4f\xee\x1ft\nF\xae\xbaI7\xc2\xc4z\xc6 \xbc4]\xb8\xa41\xaa4\x8f\xf8\xc2\x88\xb4\x02\x9e\xa6\xdfN}|\x8b\x9f\xdaN\xcc\xad?gE\xae\x06me-3\x91\xd8\xd8\xc0r\xf3\xdf`\x9abq\xd6\x94\x0fB\xc5-#\xc3hp\x93C\xe0\xe2\x99\x01\xa6g\xc0\xaf\xa7: \xc4\x8d\x0f\x04\x14\xf6\xd8\x02\xb9\x16\x91\x1bW\xde\r\xe2\xe3\xe2$\xd5E\x02\x1f;\xd0\xc8\x93\x10\xb6ry4\x0e\xdb\xe5C\x12@\x12v\xa9\xd7Z\xe4\x8a=}\xe1c\xbb\\k8\xec^\x82\x07\xd0$\xe3\xad\xe8\xc4\x05{\xbeDN\xe5\x89\xecM\xf6W\xef\n\xf3\x0e\xc9th?\xfa\xacr\xe5\xc2\x92\x1d\xe6\xf5b\xe6fJ\xe4\xc4t\x10\xa37~N\xeb\x1d/qx\xc2b~\x1a\x02\x9cB\xdd\x8bDW\x95K\xf9\xb7!\x1c\x7f\xae\x1d/\xd3\xff\xed2\xd4)\xef\x0b\xa8)\x9eU\x89p[\x1a\xd5\x0e\xf4\x18(\xd9\n\xbdP).\x7f\x98\xd2\xc5\xc3\x1b\x07\xac\xd4\n\x83\xa2\xa8\xbbl&\xebH\xa9{\xee5I\xa0\xb9vA\x87\\\x1c\x933\xddw\xe3g\x99\xdd\xd0\xe3_\xd6\xf3;{-\x0en\x9a?\xa8\x83^\x1b\xd0\xacI\xba\xfe\x1f\'\xc5\xd5\xdc\x9c\x8fR\x0fUYm[2\xe9\xb6\x0f\x96\x12\xed+\x1bY;\xd7\x97~\x90\x88@l\xe0l\x99\x86o_\xf5\xe3\x10\x07+\xa8e\xf3\xf3\xa2\xc2s\xb8\x8e.4\xcae\xef\x97_\xf3\xd4\x12+\xe1\xbb\xdcF\xa7e\xdd\xfd\x03o\x15\x93Q\\\x97?\x92\xbcj1*P7/\x12j\r\x12\x0b\xab}_*C\x11_\xa7\xf4\x14Dj\xb6J\xaa\x15\x8f\xf8\xfdS\x90\xa2$}\x88\xe9\xbd\xb6\x92\xe1)t\xea\x0b\x85\x02\xb4\x86\t\xa8+\x9b\xd9sD\xd7\x95=t\xfa%!\x93\x0b\x8e~\xadx{<-\xc3\x84O+\xe46\xcb\x1a\xe1\xe6\xf1\x08.S\x0e\x0e\xf9hV\xc4\xfc\xa8\x12\xb1E\x9e@<9=\xc2\xe2g\xcao%\x9f}\xbb\xc9Zt\xd4\xc3\x05\x97fb\xbbc\xbc\xdaB\x88~\xb7\x81P\xb1\x92\xafR\xefo\xd1\xd3t\xf6\x83p\xa9\x85B`\x95\xbcY\x1d\x08\xb5\xf98\x86\xc7\xc2\t\xf1\x97\xc2t\x05\x05K"\xc5Z\x17F\x8b\xea\xe5\x0f\x95r\x96,1\xae2AxPg%\xc7-\xee\xd9\xb8\xe0\xe5\xdf\xcc\xa8\xcc\xd7\xe4\xaaa\xd3\xdeh\x8e\xb5\xe15\xb9tpn}/\xe8SB\xf8Z\x19\xad>\x19\xf0\xbfvj\x1a\x1a\xe1p;\xef\xe9./R\xe86\x8b\x96\x98\xb3\xd7\x87\xbe(S\xeb[\xd3\x17\x89\xc2\xe1\xb1\x16v\x17H\x81\xaf\xac\n\xe9\xff\xda3^\xbb\xf3Fh[@%\xbb\xcd\x87\xb7\x9f\x1aFY\xdc\xcaJ(\x0eH(\xb5n\xb3\xca\nd\xd0\x04\x02\x19\xb4SL\xcbH\x8b3\x83]\x14o\xd3\xa9\xd8\x99b\xabXN\xf2\xf4\xe5\xbc\x14\xdd\x14-\xe5\xe0\xb2a\x05\x03\xb4Y#\x1c|AE\xdb\xa3\xa0_\x07\xb8Y\x88\xecO\x88c/\xe3`\xf4\x12)\x1b\xc5\xa6h}3\xae\xca\xa8\x15csy\xa52\xba\xe1\x9a\x8b\xcfx\xfc\xef\xe2" \xea|S\xe8R2\xea]i\xfa\xb5RMvw5\x85v\x0b\x109c\x19\xdb\xe0\xcd\xf5\xb3\x89\xba\x05\xf5\xb1\x99b\x1c\xdf\xa1\xf2\x03*\xd4l7\xdbiu\x9f\xe5\x1a=\xf7\x93\x8d+\xf0\xdb\xdd\x06Fo\xa8_\xb3\x97\x1d\x04NT\x99\xf2\xb6\xeb\x0bO\x1c@\xf0up\x7f\xe1\xfet\x01\x96v\x06J\xe4\xea~\xa9f\x95\xdf\xf6\xb7\x12`\x9b\xfd\x8c\xday.\xea\xb0\x82\x86\xa0\xef/\xc5\xab\xd1zg/\xfaU\xae\x1b\xeb!\xa3\xbe \\\x9a6\x1f\x9eX\xfc\xc95\x04a.&0\xba7\xf7v\x11\x99v\xd8\xbca\xd1?\xac\x8f\xafm\xe7\\\x84\x1am\xd1D\xd0h\xebr\x97\xd2\xde\x1b\x11\xe4\xb7\x9bV-\xec0\x84\xb8\xbb\xe7\x98Q\xbf\x94\xc8\x05\xba\x93t\xe0\xa7\x08\xdd$ \x1fO\xd2P1\x0eP V@\x1d\x15\t\xbclBi\x83.\xc3N\x05\x9e\xb3\xdc\xd8=\xc8\x05A\x06\x990z\x9c(\xdce`\t\xee\xd3c]_\xd87\xa8\xd0_\x17\xd1SM\xeb\x91\xf195x\x80\xd9&gkO37\xa7\xa14\xdd\xfe\xbc\x83\xcd\x87\xa8\xecf\x83\x15B\xe1\xab\xbc\'MT\xbb\xa7t\x19\xb3\x8b{\r\xc0V\x1c\xae\x8fq\x7f!e,X2\xcf\x8f\xbd\xb0-\xfe\xca\x9bQ>\xe5^1N^\xfbg\xdd\x02\x00r\xfd\x86\x16k\x0cv\xe11<A\x11\x1b\xf5\xe4\x9f\xf4\xb5\x8dUS;\xdd\xe6$5{\xff\xe7NY.\xefK\xe0\x00\xe54\xf0\xe1\xae\xa7\xfdL\x1f\xe3x\x07\xed\x97\xa6>\x99n 1\x90\xbf\xc3\xa1\x0f\xe0z\x07\xffY\x08\x80\x9a\xba\x8a\x9bH\x8d\xac\x95x}\xbb \xdcP\x17\xe9\tQ:0$#\t6\xb1\xe5a%\xa4\xbd\x85\x01\xcep\\\xc0g\x9d\xbe\x08\xd4Z\xef\xc8;}\xa3+K\xf8\x04\xd3T\x11\xc6\xf7\x0b\xcb\x1b\x82Kx7\x99X\x05\xb2kA\x94\x16\x86\xcdSV\x13x\xacX~\xd2\x00n`\xedR\x11\xae\xdcK\xb8\x01\xc0\xc2\x9d|.\xab[\xf0\x10\x81F]\xe2D\x1f\'K\x11Hx(\x96\xf2\x1d\xef\xa8gT\x9e\xd8\xaf8+\xb9g+I\xc5\t\xa5\xc00\xfa\xb5D\xba\x1dr&K\xeb\xdaR\x81\x9a|\x82\x8a+\x884\xea\xe9e 0\x01X\x87\n\x8bv\x1d\xd0\xa9\xb5\xbfjc,B\xcdd\xc7\xfe\xadrm.\xd9\x02\x86\xbb\x9d\xbf\x08\x1c^-\x80\xcd\x14\x83C\xba\xdfs\xab\x021\xd9S$\xd7\x0c\xae\xef\xa5\xd9/R\x98\x0b\xd3$\xad\x1e\xfe\xb9\xb51\xc5\'\x80\x0e\xefO\t\x02X\xa9^\xb71\xe3)\x1b%\x08\x08\xa0\x7f<\xd9l\x7f\x82A\xd14:\x03r\xd3\xcao\x07\x83\x9a&=\xdc\xff\xd3S\x99\xdaSiY\x0bZ\x8e\xeb\xde42\xbd,\xf9\xb2j\x831\x19[\xe6\x02/d\x0fP\x03\x87W\x96\xc9\x8dw\x06\x1f\xc6\x9dfu\xf1\x1fj\x08\xe4\xdb\xbd\x02o\x0ef/\xaa\xb4\x8eL\xfb\xd2+!\xec3\x87Gd4\xadyg-\x8e$\xee\xe6\xef\xc9\xe2\t\x11\xde\xb9\rZQ$\xa2\x11\x93J\xee\xbd\xd1,\xc3E^5\x1c?\xc9_H\xea\xd9\xad\xe6\xc7\xec\xa2\x10\xd5\xe5\xc2\xe7\x87\xa5~w\xa8\xc0AT^D\xbeX\xa7\xb0\x08[\xdf\xe6\x1d\x04\x13$e\xb4\x00du\x95aP\xcc\xde{IS\xeb\xdfd\x1aV\xb7\xb2u\xe0%;\xe8~~\x1c\x87\x80\xef\xc13\xa7Yt\x1b1\x04\x91y0x\xb3\x12\xcf%3\xdd\xed\xe0\xef\x9a\x9d&(\xaf{whM\xd8\xba\xed\x83\xb2\xaf\xba\xbd\xc1j\xd6#@S\xa9\x1e\x9d\r\x0b|\x0b\xeby8\xdd\x04Fd]E\x8e\xf3aLDW\xcc\xfb\xf6\x15\xa7;\xfe\x89\x0bN\xfa\x10\xee\xa6\xa8\xa8\x1e;ah\x86\x17\xdd\xedzO\x02|[lXw\x1a\xc8\n$\x00\x91\xba$\xe9\xa8\xdd\xa7\xb9=\xa2\x8a\xab\x95\xe4\xcb\x14\xe7jh\xd3\xd8\xac^\xc8\xd5r\xec\xf5\xde\xbb\xe1\x08\xc1\xe9kB\r~\xd0\x9b\x85\xc2\xb2\xca\x0c\x87\xa2\xf0\xecD\xb5/\nG\xaaU@\x13d\n\xa0\xe0\xb0\xefR\x8e\xa4\xa5\xa2\xa4\xc4\xa1\xe0\xc9\x97\xb2\xd5[\xd9#\xd5#\xc1\x0b\xe3\xf4\xcc\x89cqB\xd3\x9b\xdc\\\x84\xce\xc3\xea%\x1a/\xe8\x95\x1f\xd1dbB%?\xf3I\xc8\x88\x90\xfcq\x85\x8d\x10\xa8\xc2\xd5\x80\x9a<\xfd\xff\x91\xcf(Qz\x03\xe4T\'\xda\r\xde\x92\x8e\x16vg\xfb\xfa{T:\xabS`/\rx\x07q:\x81p\xab\xc4$w\xb2\xae\x86T\x05\xf60a\xae\xcd\xda:=:\x1b\x8f\xd7\xfc\xfa#\x11Cg\x9b\x14\xcf\xdf/\x1bv\xba\xad\x98\x0e3\xc7\xc3\xe1\xb8\x0b\x83m\x08\xa2\xb3\xcd8\xa4y\xa0\x921\xcd\x12\xa44\xb9\xc2\x97\t*\xeb\n\x7f*r@\xec\xcc4\xc4u\x94v[\xbf{\x92\xc0m&\xd7\x1c\x14@\xe1x\xe0\x92*jY\x17\xe3\x80\xfb\x0fZ\xe0\x02=\xe1t\xb3\xf4\xc9\x89\xe86\x03r\x170\xe8\xef\xa5p\x8c\xffz\x0bU(G\x95M\xcd\xed\xa0\xa9D1\x99)\xc5\xa13\x8fI\x98\x95\xcf\x82O\x0b\nG\xdbHv\x81n\x8cl\xec4;\xf1y\x05\xfbW\xbc!\x1c\xcf\x16#\xb2\x9e>M\xb4gz\xd1\xdc0i\xf3B\xcf\x18\xf7>VM\xbb<9yIq\x1a\x1eM 5B\\\xba\xef\x16en N\xa9\xd3w\xfe\xbb\x96\xa2\x9b\x14A\x1f?\xcd\xf1\xef\x15\xb3\xb7\xfe\xc6\x1c\xa09d\xa8O8\x82\x94\xd9(C\xe1\xc6\x1f\xfe\xc3\xe5\x85@@\xa3\xda%sp\xbb\x93\x18\xa5\xb1\xc2\x07\x0e\xbaZ\xca\xdeoo\x90W\x87\x0e\x03\xc9\x96z\x07\x10\xaa\x90\xb2(\'eD^\x01\x96\xf3\xe7C\xa1\xdbso\x0b\xd4\x83v\xf1\xe9Y\xe4\xc7f\xc5\x06\x88\xb1\xb4\x18u:\x89\x07\x1c\xe5J>\x03;3\xe4\x13\x80\xe0\xc7[\xeb$<\x96/\xf5\xed:$\x1d\x187\x01}\xf5\x7f\x8c\xcf\xe5q]\xf8\x14\xb1s\xe5N\x1b\x0be\xb3M\xe5\xac\xf9o\xa2a;\x05(Xl]\xb2\xe6R#\xd0\xc0\x9cx\xaat\xc9\xb0}\xdf\xbd\xa2\x15\xa0d\xf3(\xd2\x0e\xa9\xd0T\xeaj\xee\x0c\xb4\xc0\x9an\xba\x90@\xbd\xa0\xff{\xa7}Q\xf6\x9aUp\x19\xb4\xfe\xe0\x1f\xca\xdf\xa2\xe8A\x10\xe6;\x01\xd5\xcdDr`\xca\xbfM\x83\xe7\xa8\xbb>0\xcf$\x8an<\xf3<H2C\x9eA\xfcA-\xbf\xc4\x81\x89\xe4\xf1\x98\xea\xc6:\x10\xb8\x0c\x84\x87>\x08W\xa9!?\xb2\xee\xaar4W,\x8e3&\xd2\xde\x99\x90a\x9d\xfb\x8f\xe1h\xe2\x83\xb1XW4\xef]\x90\x19\xf7\x84b\xa6p"\xe6\xb1\x81\'\x90\xd9\x1f\x8a\xfeg\x849\x96B\x14wfo\x01\xbbK\xd9\xa2\x1f\x9a\xd7sn\xc8\xda]\x94l\x105\x8c\xae>;YVi*\xf1\xea\xaa\xec\x0b2\x94?\x0f\x12\xa1\xa0\xf3\xc5\x0e\x96XA\xed\xa4\xbe\xaa\xf1_\x1e\x0b`\x8a\x8ct\xe3\xb4k\xaa|B\x82h\xf6pF\xa7\xd5\xb5bk\xaf\x84V\x1c\x1fV\xb8\xdb:\x82\x91Pwf\x83Z\xaa\xe2\xda>)\xfel\x7f Q\xb1_oF)JU\x88\x7fv\xea\xced\xef\xce\xb5\xef\xd1\xb6Fu\xacjZ\xb9\xf5h\xf0\x8f.\xff9\xfe6\xc7\xef%R\xb0U\x82\x1f\xef\xc7:\xd9)\x80\x98\xf5\xa0\xfc\'\xd3(\x03(\xa4:\xc2n\xc6GO\xf7\n\xbd\xb4\xc5\xec\xde\xd8>\x0c\r\xd2\xc4\xca \x90V\xd3\xe0\xf3\x0c}Zm\x8dmc\x10\xa7`\xde\x1c\xa0\xdc(\xa5s\xa6\x92R\x97\x06\xe7/\xebL\xc5\xd3\xf4\xadl\xbbA-\xd9\x93+\xb3\xa0\x14\xd8\xfc\xd3H\xc5\xb2\xf7-\xc0\x9eg\x83n\x97\xd5\x0egL\xe1|=s\xdc\x99N\xe4\xd8+\xe8[\x00y\xe9\xdb\xa8\xf4\xe9\xc5t\x01\xb5\xe9k_\xf1\x8a6\xdfw\x12\xef*@\x06\xc3\xf4f\xf5\x0f\xbd\xf5VP-\xd1\xe4w6l\xbf9\xa0\xaa\xc0\xbcn\xf0FQ)|Y\xb23d\xdc\xb7\xc5Rz\xd6\xbc\x03\xa2\xb6\x03\xa1}\xa9=\x9dm6\xc2\x8e!\x02\xe7\x01n\xb2\xcc\xb0\xb6\xd1\x93\xae\xe6\xd9\xa6l\x8f\xce\x1c\x1c\xb0\xa8\x11\xa4\x98\xf4\x10\xb6\x1f\x18\x9a\x17\x96"\x01\x92\x96\x15LB7\x0288\x0c\xac\xb6\xc8P\x8f\xa6C\x81Jc\xda\xf3<\x9c\xf2m0\x91N\x18\xc2\xc5\xb8\x1fM\x7f\x8aQ\xeb\x10o3\xe9\xb6\x82^Sx\xe0\x1b\xc3y\xaa\xd6RKjb\x9c\xbd\xfa\xa8#$\xc9}Tg\x0er\x12\x00a\xde\x95\xa5T\xd8/\xbd\x12RR\x00\xe5v\xdd1Q/\xea\x0f=\x8ehg\xccs\x93\xf9G\xe7e\x93\xd1g\x8b-\x8c\xdf\x1a\x1e\xf6a\x1e\xc0\xfb\x91b\xef\xc7\x88\x06b<\x81[=.j\xf9Q%\x12d/\x91\x1b((\x9aw\xf7=\xeeT\xd3\x9b\xb0\xb1\x83\x9d\xde\xf0\xe3L\x0b\xd9\x1e\xb1\xf1\x18\xbc\x03Q\x03\xc0\x9f\xe7\xd7\x04\x89-\xef\xbd\xd47\xa31?.Z\xa1S\x14L\xb1\xcb9\xde\xfe \x13L9\xd7m\xff@\xfd\x9c\x85[d/\xc8L0\xdd\xf0\x95!\x02Z\xce\xb7\xe7\xf2|"\x1b\x8b\x13E\xcb\xa3\x01$\x8d\xf5Q\xa6\xa2\xd6\x96\xcd)\xcaPt\xee\xa3\xf9W\xb2\x19\x1f\xfaWH\xec\xa6\x84"\xbe|9\xdf\x99\x9b\xf9\xbd\x8c\xb8\xa5^Vw\x10\xb86\xd0\xc3\x8b\xa4\xc3\x17\xe1\xef\xe8\xcc\xbe\x95\x91\x87\xc8\xe7\x8e\xa9\xc7\xf0\x10\x7f\xc8\xe20U\xd2\x9e\x9fgQ\xdc\x87\xccBp\xec\xd5\x82\x9ey\xc8+\xaa.\xddp\xca\x9aD\x1c\x8b\xd2g\x13\x874\xb5\xbdX\xf2\x8e-R\x95<\xb4\xdf\xa8?\xab\xca\xaflpf\x14a\x8ea\xb52\x11\x9c\xcb\x11f\xfc\x892\xa0\x03\x11\xc6\\\x8f~\xb8\xc4\x18b\xca\xd6\x1d#\x1a\xff<\xeb\xde\xd1n\x17\x0c\x97\xf2y\xd9\x0b\xaf XYLdGd\x0f\x03\xda\x11\xe1\xbc\xfe\x12\xe8)\xfdU\x892\xb8_\xf7\xaa\x07\x06)40[l\x89\x92\xbdT\x8d\xf3\xb1+]\xad\xf6\xba-\x0ekmx\xfc\xfa\xea\xb4\xc9`~\xa9u\xb9+m\x1c\xcf\xd7Yz\xc1l\xd84\xed\x00\xa7\x98&\x11ax\x94y\xdf\x9d\x87\xa1\xdc\xee\xd5\x1f\xcf\xbf\xfb\xf4\xaf\xbd\xe2[\xd4\xe8$z\xfc\xaf\x0b\x98,\xd2\x15\xf7`H(\xa0\xca\xd9x\xa0\xf6\x8f?\xe4\xfb\xbb\xdc\x81l\x0e\x0c#\xfe\x9b\x84$#if\r\x06hQL\x8dB\xb6y/\x1c\x89\x8b\xbek9]\xba\xa5\xfe5\x87\xb3\x1e4A\x08Xq\xd3V(\xff\x86\x00\x11\xb6h\x92\xfc\xdd\xcaZ\xe8\x95\xb6B\xd8=-\xac\xb7\t\x8b\xddH\xeaD*\x9e!\xd7z\xffIr\x8f\x86)\x00{\xbb\x0b\xebrV,\r\xf8Y\xb1\x8b\xe3\x9a\xa8!7\xb8\x19\xb8\r\xd1/\xd91\x84\xe7\xae\xb3V^w\xb2-\xc8\xd4K8\tdt1\xc9\x89\x10U\x9c\xe9\xe4\xc1\xab\xc5\xf9:*\xa0\xab\xae\xa22n\x81\x97\xe1\xd1\xca6\x0f\x15\xc1:\xf7\xda\xdf\xdc\xcd\xc4\xaa@\xaed@\xb8\x8f<\xde\xa9\xab\xd9\x96\xf7\x84Z\xc9}\x9d\xb4\x82\x81\r\xaf\xab\xe7\xf2"\xca!\xe0[\xea\xc0\x9fH\x86\xd0?\xf9\xa9\xdf\xf1{\xe6@\xba\xea\x14\xef\xf3#\x8du\x9a\xday#v\x84ueu\xfe\xf4j\xdb\xc2[n\x82>\xa0\x80\xe6\xfe\xb6\xb2\xdcG\x87Gn\xeen0s\xa6\x90\x12\x86\x16\x95-\xef2m<\x86*\xb5@n\xe0fy\x8f\xbb}\xcc\x9cR\x149\x84J\xc5\xf8\xe7x\x9c\xc4\x7f"\xc4\xb2\xecz\x0fXJ\r\x80\x0f\xfa\'\xae>FZ-\t\xb4\x11\xbdu-La\xfe<\x1b\xb3HU\r\xd8\xd1\x8as^\x05\x9f\xa9X\xd5\x18Q\xa7\xe9\xe0\xf7h\x04\xa9 \x9d\xbd\x80\x03\x97\xb2_\xd4s)\xc8Z\xc2\xa38,\xd12\x93\xe6\xb4\xf6\xf0&\xd5\xcd\xf7\xdb,\xe0\xbd\xe2\x11s`\x06\xa8\x07@\x8d\xea\xaf\xfb\xa9<\xef\xc2\xbb\xe2\xc7e6,}\rq\xfb\x82\x06\x99\xb2{\xf5\'\xac\xd0M\xb1K\xd6\xe1\n[i$\xdb;\xe0\xa0\x10A\x89\xebc]g\x90\x8b\xacV\x0f0\x1an<Y<\x854_$\xc3\t*\xc5ze9P\xd2J]\xd4\xf0\xd6\xa2y\xd4]\x1eS:\nDe\x8e\xbd\xc9\x15\xbc\xfd\xcf&\xf57\x01\xf7\xbd|;\x85\xbf\xe7 \x91\\l\xe7\x8d:\xeb\x19\xb4\xb8\xf1\x95\x155n\x01\x8f\x95b\x97\x81\x8d\xfdZd\x11\xe1hwU\xce\r2\x91\x95\xacL\x07+\xed\xd0\x15&\x99\xf4u\x07c\xda\x16\xd8\xd9%$\x8a\x8a\x8f\xa7\x17\xb6G\xd3P*\x17_?\x0c}F\xbeI\xf4\xf6\xc1\xfb\r1f\xaaU,w\xfc\x08]:\xb8\xd1\xf4I/\xd4\xff\x81\xf7n\xa5\xe5\xee\xd1\xe6\xfd\x10\xaaw\xed\xf4\x82bCO\xfa\x10\xaf=c\xdb\xb5\x01\x176\xa0\xef\xff3k\xd4\xcf>\xf3\xa5\n&(\xa4.\xed\xfc?\xfc\x03\x97\x99p\x0ch75\xe4j\xc71\xec\xd0v\xb3\x11\x87\xd8K\xa3e"J\x13J\xcbwP\xf0?4\x91\x03C&\xf2o\xa6\xd2l\xd0\xdb\x81\x94W\xb1|\x92S\xe3@\x17\x96\x9b\x16/.ys\x92+D\xfa7\xab\x88\xee\x88\xbejI\xa0\xa1KDQ\xe4<\xbb\xa0D\xd3\x9a\xef@\r\xcc\x9c;G4o\x12&m\xa8\x97\x898\x1a`\x1cM\xd5\x1bLS\xaf)\xd5\x8b\xa8C\xaa\xdf\x9f)\x8e\x84\xacM\xd9\x84\xe8YA\xc3\x0f\x80\x9b61\xedl\xcd[\xce\x80#3~\xe8\x86\x91\xc1\xc4h\x8aI\xb6X\xef\x86\xb7\x036l\xa2\x05?\x1f\x19q}7\xad\xde\xda\xd6i\xfc\xd1%J\x92l\xacq\x8c\xc6r\xe1\xc1M\xdfV\xd1:q>\xe8\x9fX\x18\xbe\xd1\xef b\xa0\xaf\x04\xd3\xe6\xf8\xcf\xd4\x9ae\x96C\xeb\x84\x11\x82\xac\xd9\x9dc 79\xce\x10\x87v\xdb\r\x1cS\x9d\xab\xeaa\xa3S\x8a\x81\x98\xa7TB>\xf0\xe3\xdfWp3k\xe1\x80\x97\x9eNs\x17\xe7\x04\x85\x0by\xb5\x8dm\x89|J\x8c\x8c9\x04r\x0e\x15\xb0R\xc0\xe57IMU\xef\xbdrp_\xe2C`\xfe\xd1^\xccs\xb0\xce\xc6\xc4\x19\xa5\xca\xe7R\xf3\xf4\xde\xe6p\x8e*0\xe7\xb8"\x15\xb8\xfc\x13i\xa8\xd1]\xd9\x13\xac\xf0\xe6O\xcb\xb4d&\x0c\x0eAA\x89\xea 6\x1d\xdbR\xf3\xd8\xfb\xaf\xa7\x17>\x8b\x94\xbf&0\x8e\x81a\xf3\xc3\x03t\x06\xe78g\xa4\xb2\xaa\x1baU\xd6)\xce\x0b\x84\tDp\x8d\\\x10\x94\xfdy\x8f!\xc5\x8c\xfb\xb9\x8b\x88\x8c\x16\x13Ib\xbd\x93x\x016\xd7\xf37{\xc1_\xc9\xb9\xf5\x01t~\x97#F\x10+\x07\x10\x81\x8eW\x04\xf9\xf0r\xf5G\x80\xc1W\x08d\xa5(\x07?\\\x8e\xe5\'\xa9\x88\xcf\xfb\x18\xd9\xda<\xec\x01\xd4Z\xed\xd6\xc9\xec\xd9\x06\xad\x90\xc00+c\xdd\x91\xf9\x9b\x17\xda\xaa"\xec\xc7\x9e,\xad\xb5\x82YNJ\xf9\xc0\x85\x92x\xbe\xc6\x87\xd9A\xfcf\xc9\x8b\xe5\x14\x16\xa6{T$\x03@O\x02\xc2\xf5\x1e\xf8\x0e<\x01S\xa4\xa1\xe9d\x19N\x9f,\x94.>a"6\x0c\x8e[\xa9\x96P\xceG\x1a\xd9@\\\x02\xfe\x18P\xfb\x17\xba\x1f\xe4\xbfR4]y\x0cC\x07 -\'\x91\xe0n\xec5x\x14\x8a\\x\x96"\xf5\x89\xee\x86\x1c\x08H$Xp\xc6\x92N\xbc\xb0\x0cu\xcaK+\x8e\xf3\x17:\x1e)\x93\xb5\xe3\xccs^\xc1\xdf\x83\x95>-\xc3\xfc\xbb\t+\xe2~\x1f\xca\x1b3\x91\x97\xcf\xdc\xfa2\xc9/\xfd&lW\x0b\xb3\xff\xcd\x8e[\x1d\xa6\xfa\xdc\xa9Bx@\x91xS\xff\xfcZ\x94\xa8\xc4\x9a\x06\x8b\xd6\x11^2\xa4\x05\xaa\xef\xbe\xc6l\xbe\xef\x99Y\xd0\x8em_\xa0n\xdf\x19\xf8IJ\x196\xf9\xdf4\x13\xad?xN\x99\xa9\ty\xda,\x05\xb4\xb6\xd9\xcb=<\xf7"\xae\xd1\xbd\x89\xb0\xed\xbe\xd43"\x95\xff5\xb0\x8a\xb8~\xb7d\xff\x8b\xdb\x04p\xc7B\xbc\xc3\xb5>Q\r\xd0\xa9\xfe\x1cg\x88G\xc3\xbd%e\x9cX\xf1s\x10N@\x7f\x0f\x7f\xd6\x91\x08\x0b9\xa5\nH\xe9\xb9<(\xc8\xb9\x11\x12\x92\xc3\xfa\xe3Y\x84\xf1\xcd\x1e\xb65\x9bTwX\xba\x15\xd9.\xbf\x85\x0e\x1c\x92B\n5\xfbk\xb42\xb3Q\x18B^\xdd;\x7f\xa8\x8d\xe3\xd2K\xb8f\xf0\x8e\\z\xf4\xfc\r\xda\x9c:!\x9a\xf0E`lJ\\\xfc/\xf6\xe8\xba\x95\xc1{\x95\xa3\xa6x+\xb6\xfcB\x87\x92\xe3\x82tcjb\xce\xa3\xea\xb3\x9c(\x91Kw\x05\xd2)\xae\xb1\xd1\xfcz\x8b\x18b\x0b\x1cv\xff\xf4@\xc6\xc3\xa0-\x019\x980\x04\xea\x06\x03\x98~!`\xd0e\xb3\x150\xf8\x1e\xaa\xb8G\xb7Eo\xaejg \xaf\xdf\']5\x05\x8b\xf6_\x0b\xa5\x9a\x82\xed\xb0\xedW/\x93\xd5 \xb1\x18\xd1\xd4Q\x00\x8f\xaa2#\x99\x0e\xfd\xe8W`\xd6L(f,\x1c\x92\x19`,%e0\xcc@2rf\x93LC\x8a\xa5?s\xd9\x14\xfa7B\x7f\xda\xf6Nut\xa2m\xfc\x11\xf5:UUz\x10\x87h\x95\x89\xcb\x8d\xe0\x96R\x86\x9a8Mlq\x9d\x02\xc1\xd2\xf6J\xd2(\x15\xb9PHg\xe2\xa2,PI \xa6\xfd\x04\x15\xce\xdd^&-2LD\x83P\xd9\x82\xf1-`%\x95~\x12{\x05cx\xd9&i\xaf\x1b\x9b\xc6J\x11\xbb\x89\xfaN\x11\xc5\xbe\xb8\xebG\xc0L\xdb\xb2d$\xa3\xbfP\xf5\x81\x11\x86\xd0\x8d\xbf\xe2\xcf\xe8FYMu\x95\x86J\x1a\xd2\xb3\xf6v\xa0S`a\x1d$\xaa$\xc9\x15\x84F\x9cb\xe7*\x10c&{\xa5\x8c[;\xb8\x1f\xa5\xa1\xd1\xaa/\xb5\xceb\xc7\xf3~\\\xc6h#\xcf\x08\x9c\xe5\x80\x162\xf5\xd7w\xd9\xf1?\xa7\x94hHj\xc0+\x92\xbe\x181o\xf5\xe2\r\xf9\x87\xc8p\x00A\xf8\xaa^\xc1\x9f\xf8\xc6\xd4\x91\x1a\xdc^\x03Z\xfb\xf4.\xc3\x85|z\xe6\xfc\xbev\xde\xea\x1a-\x9cN\'\xbac\x0e\xa7\xbf\x86\x15\xeeZ\xc6\x0e4ol\x03c\xb0\xe3{\xa3\xf4K\xa2<\xef\x94len25\xef\x97B}`\x93\xae\n\x8e\xb5\xc5Y\xea\x8813\x05\xcd\xff\xeb"\xfek$\xa8\xba\xbc\xe7\xa9\x08+\xeeQ\x1f\xb8\xe8P5\x9a\x9c~E\x80_>\xe1\x14\xef\x1e\x9c.\xb0\x05%\xfc.v\xb5\xb7\xc3\xb4+\x87/h\x018\x04+\xa3}\xff9/G.,\x03\xe89\x0b\x82\xdc\xc2(\xcb\x0f\xa2y38\xf17E\x92:g\x13\x0e\xf9k\x91\x80\r\x0f\x91?\xe2\x18\x96@?\x03v\xc7\xaa\xfd\xa0\r\x19\x98\xa7yC\xd1"2(\xc2 \xd7\xe1\x92\xa8\xeb\x06\xe7j\x8b\x89\x95\xde\x92\xe3Ya\x16A\xb4\x81\x99#\xf7\xf8\x0c[\x04Q[\xe4\xa71_\x05\x10\xdb\x92\xbf\x9f\xbdw\xac\x12\xf8s.\r \xa8\x15\x84\xaf08\x8d\x17\x07\xaf\xd1\x87\xb6\x89\xa8\xf7n\'U\x02\xbc\'\x03\xcb\xf5x\x7f\x86L>wEg\xda\xad\xb6\xf0S2p\xa6)\xb6H\xa3\x85\xfc\xd5]\xe0F\xd0\x8f\xf1\xfb\xe8\xcf+\xd3w\xc1\x1b\xeeD\x00\x06\'9\x16\\\x8d\xd4\xc2f0q\xa9B\xd7p\x11\x91l\xadr\xcb\xbd\xa3E\x14\xc6\xf2\xc4\t\xe5\xedc\x87\xb4 V\xb06AMb\x8a\x0c\x80\xab\xf8mW\xb3!\xe8\x80\x04A\xd7\x1f\x08\x13\x02\xa2\xeaw\xc0\xad\x04"i\xbd\x11|\xad\x7f\xe07\xf0\x1f\xf3\x1f\xae\xaa6\x94\xeb\xb8!n\xbf\xb5\xf7\x10x\xdf\x0c\xdb\x91}Q\xfbM\xc5?\x0c\xe7_\x1e\x94\xd5\xfck\xa3\x93B\xc8\x91gy\xc3@\xd9R)\xbe\x86{\x1c\x00yU\xed\xb9\n\xac\x18\xa2^$\xdcO~8\xe5\x80\x86"6m\x9da\xf4\x1e\x80u"\xed}-S\x8d\x86,\xb2\xc0\xdf\xf4\xbd\xa28jy\'\x88]\xc1\x9b\x9f6\xa1+n\xd5g\x94\xc18\x80\xa1\xc4\xb7\xcd\xc9\x80?\xdf\x8b\x02>?;\x9e\nH;\x05e\x08\x9b\x8a\xe9\x91q\x0c\xf9\xeb\x84\xd5\x10J\x1f\x81\x88\x8c\n\xaf\xba\xfd"Y\x84\x13M\x1bk{k\xdat>\x0f\x92E`\x06\xc9Cm\xd4\x9a\x93\xbc\xef\xe9\x8am\x8c^,\xa9B\x1d\xe6\xd8\x8b\x9b\xd6\xa4R\x8d\xdc;\xea9\xba!\xe9\xfb\x12\xf7\x9aD\xf6\x07z\xf3\x93\xc9\xd1\x9c\xae\xaae\xbe\xfd\xb8\x8f\xe0e\x9f\xb7J\xef\xed\x17\x076\xa9\xa1\x13\xb3\x1dE\x12hn52\xdcTKz\x1b\x112\xfa\xcb\x0f7\x9e\xba\xb9Ytm\xd5\x10\x92\x94ft\xf0\xb6\xe7+\xc8\x08\x0c!\x8b?&\x07+$\xc8\xa4\xfa\xf0\xd0\x13\xa74&\xf8\xe3\xa7\xc7\x07\xc64O\xd1M\xb3\x81 \xc3\xafzP\xf0=\x12\xc1\xa1\x12\x0fu\xc6\xe0\xa2\xc6nq\x8f>\xf1\x89J\xf1\xf0\x90\xf4U\xa9\xaf\xd2\xd6\xcds\xa5\x9b\x94C\x0e\x06\t\xe2W:\xca75\xdb\xb6\x81\xd2\n\xba9G\x02B\x83\xad\xa7\xf3AQ\xe3\xc4\xdfV\x87\x8c?\xb3+\xcc\xa9\xde\x96at}\x81\xb8-C,\x9cK\xe0\xa55.AG\x97\rEK\x93\xaa\xae\x85\xd8\xad\x0e\x8d\xda\x80\x9a7\xb8\xb07\xdf\xe1\xe1\xd7\xbbT\xdbVb\xa4\x98\xe7\xce\r\x88\xd7\xa28or\xf4h,A\\}\x13@\x16u\x9b[\x03\xa4\xc5\xb6g\x18x\xca\x12\xbe9*\xda[\x97t\x1a$H\x1c\xbc\x01\xbaF\xd6\xd5)\xfd\'\x14_\xc9)\xd4`\xd8\xf1\xf1\xfc\xe8\x1c\xc8\x96\x17\x07\x9a\xf6\xdeTbp(\x96\x8e\xe4\xc1{\x0f\xd1\xaeA\x96\x80\xc3\x16V\x92\xb8\t\xa3\xc1\xaa\xa3b\x81K\xfb+!_\xc1s\xba\xf8\x95\xd5J\xeb\xd9\x10+\xa0\xf7@\xf5\xf3\x90@x\x8boo\xdeP\x11\xday\x18\xa54\x81\xeeC\xbfT\xe9\x89\xafo\xf0\xf4W\xd8\xb8\x99\x84\xf5\x94\xf8\x87\xaf\x16\xb1L\x8bp\xccP\xf4\xa4\x9b\x95\x7f%\xc7\x0eRr\xaa`K\xf2\x91\xae\x85\xd9\xbe\x9ag\x83p\x81o\x1c\x8d\x8d\x96n\xe1Gy\xf3k\x83\x19\xc0\xed\r\xe1\xe5Wtl\x1bJU?q\xb9\xf2\xc3\x0e\x97\xfa\x1f\xdce\xc9\x11H\x954\xe3\x0c\xd2P\x1d\xdf\xe2\xae"W\x04\xb6$cG\x97\xdf\xf7\xee\x83\xbf?\xd1\xab6w\xfd\xcbj\xc9\x03E\x99\xca\x8e\xfd\xfcsd\xd8\xa2l\xf9\xbe\xac\x98\xc6\x82\xec\x18U\xc7\x8f}\x97\x16\x90Cu\xc0\xf8\x8a\xbejo\x12\xb7\x85\x08\xed\x8fB\x18\xcfr}D^,\xa0!\x1b\xa1\xd7G\xd1$vL\x9f)\x1f\xd5\x82\x8a\xc5\x81=\x82d\\\x9f\xd6\x01\x81`E5H5\x88\x0e\x10\xfc\x0e\xea\x977\x1d\xde\x1b\x96MD\xf3|9\xd2\t\x1cP\x1c\xec\x80\xa4\x9d$x\x1f\xef\xcaA\x99\xbe\xa5\x17b\xc5\x84\xbe\xd3\xfc\xb5\xe0\x93Fw\xe5\x19\xeb\x0c\xcd/\rA\x87\xc6\xe3\xb2\xf4\x03\xcd\xc6s\xe9\xca\xd5E\xce\xfe\x93\x13\xec\xb1\xa2\x7fN\x80)\xed\xde\xeb\x9e?\xde\x1a\x06\xdc\xb2\xe0HAn\xecN\x8bl\xacQ\x92\x15\xb9y\xbb\xbc\xaa\xedV\x81\x01S\xc8\x1cLoz\xc8}\xcd\xbc\xd9\x1a\xb33\xf5\x9c\xe8\xb2\xafL<1\xc52\xd2(\x06\xcc\xaf\x10P\xc7\xa9?/\xae2\x03P\xc4\xbf\x92\x86N\x84\x8f\xdd\xc5\xb6In\x1f2`\x90\xa0\xa1\xd5\xb4)Vg$\x1bj%\xb2\xc2\x1eT\xea\xd9\xd2\xfd\xf8\xff\xb2%\x0f\xcb\xc9\x04\xd4\xaa\x91\x0c\x0f]\x82&p\xa75\xb8\xe6T\xd1\xcd\xf3\xc9\xd6\xc1\x18\x93\x9c\xfa\xfa^\xf1\x7f\x8co,\x1f\x19kt2\xa6rl\xbf\xeb\x8a\x12#\x9bW,\x99\xd9\x98\xfe\xd3)r\x99\xb2tS&F=\xa1=\x92Y\xe9\xe7\x7f\xbb\xbc\xca\xefn\xb2\xd5@\xd5\xfb.\xf8\x84\xcb\x1a\x96\x81k\x06=\xe3\x1b"\xf0\x1c\xbe\x87\xf4\xd98\xea\x944\x8eh-\xc3\xa2\xc5\x1b\n\xdf(\xd9L\xa5]\xc3t\xcd^\x0c\xeb\xa8\xb5\x9f\x99\xc3h\xaa\xd4\xdb{\xccs\x1as\xa0\x8eG|Y\xb0=>\x81\xa0\xcfH\x1b\xed\x8e\xc0\xe3\xa0L^>)\t\xf3C\xb2\xf5\x93\x95\xfcm\x03\x16\xf2\xc3\x8c;\xeeXx\xfc`\t<\x99p=\xc8\xb5\x05\xf0 K\xf4\xd6w\xe77\x98bE\n\xd1\x93\x92Q -\xa71\xe0\x9bb\x98\xb4F\x1c&\xfcZ_9\x1e\xbeG\x8f\xc9^\xf3EL\xbc\xad\xd2\xa5T=\x1d\x88x\xea\xe0\x9b\xfcm\tM\xdee/XO\x1fN\xd3\xf5\x13\x1a\xc8K\xf82I\xb0T:\x8b\xf0\xca32\xad\xbb\xc4%D\xd7\x9b\xd7\xb6\xbb\xfc\x10\xe6\xad\xa6\x91\xff\x19\x801\x07\xf9\x90\n\x80\xfaN\xb3\xfd\xb4\x90\\\xe8\xa8\'\xad\x91*\xbd~\xdf\xdd\x99\x9bN\xd3\xd5\xe7\xf0\xe1\xef\xda\xc9\x9d\x91]\x0f1\xa4\xdb\x10}\x13q\xa1\x89,\x99\xff]\xf9\xc8\xcbyJ\xbeU\xcea/I/\xa9\x085uBE~\xb0\xde8\x92\xd6\xe7\xc7UA\xf1G\x84\xae\xa8\xb6\xbd\xed\x06\xf4\xe4\xeav\x0c\xa7\x19@S\x99\xd8\xdd\x041K\xdf\xb1\xd6\x15>\x7f\x94\x92f\xaa\x90mo\xa6\x85<V"4W~i\x10\x9e\x00\\\x0c\x86\xef\xfd\xd2\x1fB\xdbo\x1a6\\\x9b:\xab\x152\x1c>-\n\xf5\xe1n@\xb1\x165g\xad\xdf`\xf1\xe6k%\xfb\x00\x9b\xcc\xe17\xd4J\xc3\xb5\xa4\xa6\xe7\x0f`\x08\x7f\xac\x11Ah/K\x85\xc7O\xaaMZ\xb7\x1c7\xf4\x19%^\xd9.\xb4\xbep,\x9f\'\xc3\xe6+!\xdd\x16 \xab\xb9/\xd8\xba\xb2\xcdgU\xad]\xd1%\x1fXu\xca7/\xabu\x9b=\xa6\xf0\x80\xab\xcb\xb4-\xb7\t(\xee\xe9C\tEQ\xdbS\xa9\xc5\xf3"y\x18\xa2\xa8\xe4\xe1\x9e\x04\xcfp\x81 g\xef\x90@\x1fq\x10y\xaa\xd2\xf9\x07\x8c-\xf3\x1b,\x86T\xf1\x85\x95\x85YQ=\x11\xae\x8d\xc4\xf5\xaf\xc5F\xb8\xfd \xc4<@<\x85-h\x7fV9\xf5\'\x17\xebD\x0b\xa4~\x0f\xb0\x9c\xfeu\x82z\xac\x18\x0e\xf52\xc0\xc2^\x05{7\xe5\xaa#\xa3\xe4\x84\xa4&},`@\xb9\xfc\x86\xdb\xd0\x84\x86\x0fS\xcd\xeb\xd2u_\xfc\x99L-\xd5-&B\xa7I\x8b\xc62\x12\xb1=7#\xdf\xf9\x99\x08$\xd3\xaf41Z(\xab;(A\xdf>\xb4+{\xb02\x11D\xa7]\xfd\xd2\xb8\x8av\xc4n\xe5\x91\xec\xdd\xcdg\xc1%\x8b(\x0f\xf1\xcd{l\x97\xab\x1a5s\xb3\x03\xcd\xc5m\xb3\x1d\xc7\xfc\x1fq\xf0\'w\xdb\x0e\xe4\xa6]\xe6/S|1\xd8\x1cw\x850\x90\x11\\g\x07z\xbeu\xd7j)\xf6\x7f7\xcd\xf2|\xbe*\x95\xad\xdb\xc9\x12$\xe8\xbf\xde~\xaf\xd2=\x9c\x88\x1f\xba\xba\xc8Z\xf0\xd2\x84C\xaf\xc9-\xa1;\x1f\xab\x06?BO{Gy\x90HU\xdf\x8f\xae\xfb\xaa\xbe\xab\x01\xa2t\xb0\x90\x12\xc7\x10\x00\x92@\xb4\xde\xc3\x86\xb8\x1b\x97P.X\xd4\xdd?\xb1\xadz\x8b\xa3\x9b\x82\xedY\xa7/\xfa*Au\xb4\xcb\x9f_\xdeV\xe85\xf4GLN\x8cA\xa1\xf6\xe60\xc8\x95\x17*\xed\x08KF\x8e\x02%m\xc3(\xe28P\xf1\x07\x88L\xc6k\xd1d\x1c\x06d\x8b\xf1\xb6`t\x8e$n\xa1\xde \xb1\x10\xe9\xc6]aE\xf3\xf7\x07\x94oT\'\xa0G<\xb3\xa3I%PH\x9bq\xa6M)|VM\xbe\xc9\x93Nc\xcb\xd7\xeef\x0c\x17/\x0b\x0e\xdeR\x9e@>)\xeb\xd0\xf2\xfe\x10\x81\xa4\x03j\xf0Nt\xbd=>I\x0f\xa6-\xe8 \x15o\xe9\xd72\xe6o\xc0ee4\xf5`\xf9}\x92V\x1f\x85f\x03\x7fCJ\x05\xd4\xf3\xb3\x9f{6\x0b\x13\xdf\xee.R\x05\xd9\xe0!\xb7\x85\x16E\x14\xb2\xef\xd5\x05\x16C\xba\xdd\xb5E\xf9R\x1a\xa9\x04\x1e\x83\xac\xd8\xad\x07q#\xb34\xd9\xa2\xb8!\xb0\x12\xec\x1a\xa3(\xbe\xdfC\xe0qN\\2\x15\xa2\xea\x07D\x13\xf7\xbf\x1c\x19\xeeL\xfe\xc6\x83\xa7\x8e\x8e\xe4\xa06\xd3g\x81\x89\xc5:w\x1f\x97\x16\xf8P\x98\xa6\x03|\\\x83\x8aAx\x83\x1d\xbcw\xd5\x98H\x15\xde,\x15\xb3\xe8\xb3{\xb0\x0cP\x0b\xc0\xf8\xf5\n\xe4\x1ac\xf1\x18\x10Y\t\xef>\xc9RXy\x8fX\xde\xa6\xee\xb1\xc9\xcb\xb2\xb4\x1d\xa7\xed\xba\xd2\'K\xd3\x00\xf8a\xc9>\x7f\x84R\xa0\xa6K_\xb7`[\xb6X*.\x1d8U1/R\xa8^\xe5Qm\x07\xa4\xe5\x84r\xb4"\x80\xc6\xd2V\xfd%\xad\x0b]QZu\x82v\x92N\xce\x8fT\xe3\xf5\xa8\xa5\xf3:J\xca9\xe3\n@f\xd4\x8e\xf8\x91\xcer\xa3\xca\xaf\xeaG\x02|\x9c#\x0e4\xf9c\x05\xbbF\xd9C\xdd\xb7\xaeQHS\x11\x137-\xb9\x93\r\xd5\x1a\x8d{\x83~\x01G\xd9M\x88\xf8\x11\x0cW\xc5c\xb9\xd2\x8d\x0c\xfc\xd0\xf7\xe7@n\xff\x0c\xca\xe5c\x1c\xdd\xeba\x17\xc6\xfcX3\xce\xea\xdey\xdf\x05\xb4\xc1\x14>\xabqX\x10l\xbcj\x1cc\x15\x86\xd6\x7f%b\xbb\xf2\xb4\xe9ViB\t\xddb\x8a3+\xb2\xeb\x02\xb3\xdf\xfb?\x86\xa3\x9b\t\xf1\xfe\xf9\x01wB\xda\x95\xda\x9f\xd2\xc6\xf9\x1f \xa4\x8aC\xect\xc2\x9dU\x83[\x14\x8aR\xc3\xe5\x9f\xd3\xebPhr\xdeY0|j\xef\x94\x0f\xd0\xaa\xa1J\xbd&\xf4\xc1\xf5`\xdbQ\xae\n\xa4j\xc0\xc6\xf6C5\x89\xe8j4\xc7>{\x88:l\x9f9v\xbd\x82\xdd#\xa0\x8e\xae\x160\xe9\xf1\xc8\xd9%J\'\xab\x99\xb1z\x07\x03L\xac\x0c\x04]\x7f%\xb5\xf8%T\xa4\xc6\xbeXi\xdc\xe8\xc9\n\x7f\xd3W\xc4\xf8\xcd\xff\xd4\xb82\rB2\xe0\x14\xfe\x13%O7\xb5PT\xb9\xdf\x1b4gr\x05\x8c\xff\xb5a~\xcb\xa7JV\xf8\xb9\xb1_M\xca\r\x1c\x0b\x06W\x82\xfc\xe5G\xde\x1d\xe7\x81\x8d\x15\x7f\xd5\x92\xc8\x80\xaa\xd7\x9fC\x05\x0b\xdc.\x8174\xbd\xac\xc5S\xd1\x9fY\xe7Jl\x9e^\x1c\xf9m1O\x9a-\x0b\x95\xb1iN\xec~\xcf\xb8V\xb0\x07Jh&\x80v\'\x89@\t\xff@6#\x97l\xd4)T\xf4 E\xd6P\xab\xc49\xcc\xbf\xe8\xd6t\x0c\xeb$\xfe\x87\xb4\xc8\x1aX\x07k\x89\xd2\xa3\xc8\xda\xae\xc3\xa6\x9a5\x9e\xfc\xa2\xff\xbcd\x02\xe7\x1b\x94a\x0e5~\x9e\xaab<\x85\xc5\xb1\xca\xb3\xd12\xbe\r\x8d\\s}\xf2\xf9|7W\x08\xc8%\x97B\x9b\xdb(rE\'\x99\x958\xe6\xbc\x05$\x99e\xb2O\xd9U\xe2\x9csdL\x05f.[\x7f)\xbd+\x0e\xf3\xfe\x0c=\xa9\xa1\x15Kfb\x1f"\xa6\xe3XRd\xed\xed\x1d\xf80j#0\xca\x03mv\x14\x15\xd5\x8f\x0f\xe7\xe35\xa9DU\xcd\xd1\xc7\xb8\xdc\xea\\$\xf78KD\xeb\xe8\xe1\xcc\xebR\x9a/\xc1E\xceL3\x08\x81\xe0\xf5\x9fu\x8e\xafGQ3\x13l\x05R=\x01\xff\xdf\xaa|XO\x8a\x9f\xb5\xa11j\xa1v=\xf3}C\xe3\x02\xfc\x90k\x06O&\x0e\xfa\x89\xa7i\xcb\x18*\x8f\x1c\x8f\xcb\xda\xf3}o\xfa\x12P*\xe3V\xeeL/\x8cE\xc4\xb3X\x01\x8f.>\x08\xe9\x04\xac4\xa3\xc0@\xe4\xc5vt\x1bv(g\xf88\x86\x8d\xce\x1b{\x0b\xd5\xe4\xe3\x08\x0b^\x8b\'!\xcbLm\xc2\x91\xb7\xd9u\x8a}$\xdd\x05\x04i\x82$S<@\xd7\xf7?n\r\x81\x17m!\xda8bC\xef\x9a\x8b\ta2\xaf\xf98g\x9cB\x1f5\x84zV\xe6`k\xae:\x04L$fL\xe53Ez\xbd\xce\x01\xc3@\xe0J\xe6\xb71\x06X\xd4\xe0\xe6\x8c\x8ev`\xe56\x95\x1f\x07\x96\xee\xf5O\xcc\x8d\xe1d\x1b,\x13\x8f\x8b\x12\x02O\x99f\x99p\xf44US\x8f\xbb\xcbX\xef\xd1\xb1\x16\xfcS\x98\x93\x97\xbc\x98I\xe9\t\x1f\x0fV\'\xb9\x11h\xb7v\x828\x97\x0b\xc4\x93O7\x9f\xd3\x13%\x1d#mA\x02;3\x00\x8b\xf9U\x11\xd4\x87{\x10>\xdc\xf5$\xba\xf3\x17ig\xdc\xb6\xa9\x14\x91\xef5\xae\x949\x12\x7f\x00ls`\xb7\x95\x9dlj\x04\xafw\xb4TM\xc9\x0e\xae\x02fu\x04\x19R\xc7\xea\\\x10\x06;\xf6(\xe6\x17ae\xdb\xc6\x87\xf1\x00\x80\xc8\xc6P\x91\x8c~MX5\xe3\xcaX\xc0/\x8e\x16\xef\xda\xf7\xfayf\xd8\x05\x93\x0e\x0b\xef\xad\x81\x96 \xb6\x9d\x19\xf1a\xc2\xd7\x88\xf8\xa9\xd0YR\x1b;(J\xc68&\xe2\r\xb3\x83X\xcb\xe6\x03<\xee\x18\x13\xc1\x00k\x1ab+g\\@A\xf0\x02ho0K\xe5\xfe\xea\xc8e\x95>\xfdC\xb4\xbb\x7f\xf0\xae\xe5\xd6d\xcf\xd0%O\x99\xfet\x8d\x99\x9a(\xa5\x81\x04\xd8{g\xb8\x99\xc6\xa4"\xe9\xda{uI\x85\x98W\xa9\x95;\xf1\xfaS\xc3{\x1a0\'\x11\xa3\xb6\x05Zz\x96n\x89\x99\xee\xe7r\xf2`D\x81\x88\xcf\x85?\xf7L\xd9\x8b\xc5~\xad\xbc\x19ilK\xab\x8d\xa2\xdd\xb6f\xcf\xa66M\xa6\x12%\x97o\\\xc5w\xcf\xa9\xc1\x8c\xb5d\xb7\t\xb0\x9e\xb2\xbf\xc1\x80\x83h\x00O\xc1\xe3s7p?JF\xea\xf6P\x83\xab<\xb4\x8c\x86V\r&\x8a\x1e\x83R~\x01\n\x1c\xbePZ+(\x8d\xaf\xf8\x83|\xf1\nj.\xe9EQd\xef\xbe\x01\xdd\x1bhn\x82\xbe\xee\xe6\x00R\x8c;\xb1\x96\xf0\x0c\x1fN2\xb4\xb2\x12\xf2L\x81\xff\x1e\xde\x02\x97A7[w\xbb\x9a\xabs\xd9\x9b_t\xe6\x9f\xa1%/\x8c\xed,\xd0T\x12\xcd\xe9;D\x1f\x06\xda\xe1x\x1bH\xe0\xefs\xfc\x80 \xe0e6\x19\xb90k\x8f\xe4\xea\xe4\xf1\x7f*\x05\x85\xec\xf2G\x99\xd8<\x0fS2\xc6\x97\x8bC[*\x16\x1d\x91|\x98\xa9\xe8\x87;\xd2KU\xf69\r\xe08\xf1A\xda\xca\xd2\xe8=\x14\x87\xd5\x15\xe6\xff\x9a\xaf\x0c\xbc%M]\nX\xa2\xb3\x8d\x11%\x1fl\xde\x99\x95@\x0f\x07:\n\xcd\xa9\xb5\xeb\xb5\x87\xa7\xc3\xef\xc5\x95S\xb2k\x8e\x15\x03{\x8cc0\x99\x98Q\xe8|\xa3\r\xdaG\xe55T\x95\x85h\xbb\x07\x05\xfa\x85\\\xb3\xce\xc5\x81(9(\x85zp\xd1\x1e\xf5\x8cXs\x8an\xef\x9a\xf2On\xc3\xd94\xce\xc4\xbcH\x03\xd2\x84\xda[\x8fW\x97\xf6\x1bc\t\x12\xb7\xc4\xb6->\x8c\x80\x03Yj\xcb\\\xd1\xfc\xfd\xf3\xd4h\x93`\xd4\xbe\x07\xe9&E&B\x19-\x1c\xe4\xc0s\xb1\x0e\xb2\xf0\x86\xc5\xe7\x9f\x90\x8f&\nL]\x0f\x05\x85\xb6\x14?\xd3\\v\xa3\xe9v\x86\\\xb0$\x08\xc1\xc3\xae\xac\x13\x8ch\xf5\xb8\x8c\xba/\x06/Y\xcesV\x8eA\xbf\xfcW\r\x1b\x86\xb1\x90\x03\xc2\xc0\xd6s\x17\x02\xe2\xcd"g\xf3F\xb9%\x0e\x8d\x90Z$\x95Ak\x173H\xb0.V#~\rh\xe8_\xbe\xe0I\xfcUQ\xc0\xf8\xc5J__J\xf0\xd0\x98\xc4y\xd8\x85\xf0\x11\xa4w\xf6\xa8\xcc\r\xd6\xe8\xca\x96*\x89\xd1^\xbf\x07\xdc\xdaw|^\xe6\xb4\xfe\x8ef\'y\xc3\xfe\xf9\xbb"\xf6(\xe8>J\xc6\x81F\x90~\xa3\xc3$\xc7\xb8~\x93E\xe5\xf6\x8aq0iL\xf8*\xc8`\x12\xe0\x81\xdf\x01\xd6\xea\x9c\xfd\x14\x08H\x05\x9d\xc4\xd2\x86\r\x8a\xf2y\x85\xc5m}\x8a\xdd\xd1pr6e\xce\x03\x93\xd0\xfcrf\xf6\xec\xb4\xea\xbe_\xfa\xa8=\x9b\x1c\xc3k`\x14\xa8\xcf\x15 R\x07\x9d|\x8d\xeb\xd32\xa4\xe8\xfd\xea\xf3`Ai\xf1\xba\x84w\x8e1P\xb2\x04\xad\xe5\x17l\x97\xa1\xa4\x98\xf9`b\x8e\x14j\xfa\xc0\xec}v\xf2\xf1Ya\xd3_\x01^\xf2\xceC_\r\xcb\xad\xc0\xe09\xf7Tf\xe6!\xcb!\xac]")\x19X\xe3\xc69)\x13\x03V\xa7c\x0e\xc3\xca\xad|\x98\xde\xa6b;\x02\xc3\xea8\x9d9H\xf0\x05)8\x16@\xe8%\xe4@5Fq.O9\r\xc3k\xa14X\xbe\x0bn\x9f\xdc\xdcb\xaf#\x9b\xdcn!')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from flask_admin.contrib import sqla
2
+ from hiddifypanel.panel.database import db
3
+ import datetime
4
+ from hiddifypanel.models import *
5
+ from flask import Markup,g
6
+ from wtforms.validators import Regexp,ValidationError
7
+ import re,uuid
8
+ from hiddifypanel import xray_api
9
+ from .adminlte import AdminLTEModelView
10
+ # from gettext import gettext as _
11
+ from flask_babelex import gettext as __
12
+ from flask_babelex import lazy_gettext as _
13
+
14
+
15
+
16
+ from hiddifypanel.panel import hiddify,custom_widgets
17
+ from hiddifypanel.panel.hiddify import flash
18
+ from wtforms.fields import StringField
19
+ from flask_bootstrap import SwitchField
20
+ class UserAdmin(AdminLTEModelView):
21
+ column_sortable_list=["name","current_usage_GB",'mode',"remaining_days","comment",'last_online',"uuid",'remaining_days']
22
+ column_searchable_list=[("uuid"),"name"]
23
+ column_list = ["name","UserLinks","current_usage_GB","remaining_days","comment",'last_online','mode',"uuid"]
24
+ form_extra_fields = {
25
+ 'reset_days': SwitchField(_("Reset package days")),
26
+ 'reset_usage': SwitchField(_("Reset package usage")),
27
+ 'disable_user': SwitchField(_("Disable User"))
28
+ }
29
+ list_template = 'model/user_list.html'
30
+ form_excluded_columns=['monthly','last_online','expiry_time','last_reset_time','current_usage_GB','start_date']
31
+ page_size=50
32
+ # edit_modal=True
33
+ # create_modal=True
34
+ # column_display_pk = True
35
+ # can_export = True
36
+ # form_overrides = dict(monthly=SwitchField)
37
+ form_overrides = dict(start_date=custom_widgets.DaysLeftField)
38
+
39
+ # form_overrides = dict(expiry_time=custom_widgets.DaysLeftField,last_reset_time=custom_widgets.LastResetField)
40
+ form_widget_args={
41
+ 'current_usage_GB':{'min':'0'} ,
42
+ 'usage_limit_GB':{'min':'0'} ,
43
+
44
+ }
45
+ form_args = {
46
+ 'uuid': {
47
+ 'validators': [Regexp(r'^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$',message=__("Should be a valid uuid"))]
48
+ # 'label': 'First Name',
49
+ # 'validators': [required()]
50
+ }
51
+ # ,
52
+ # 'expiry_time':{
53
+ # "":'%Y-%m-%d'
54
+ # }
55
+ }
56
+ # column_labels={'uuid':_("user.UUID")}
57
+ # column_filters=["uuid","name","usage_limit_GB",'monthly',"current_usage_GB","start_date"]
58
+
59
+ column_labels={
60
+ "Actions":_("actions"),
61
+ "name": _("user.name"),
62
+ "UserLinks":_("user.user_links"),
63
+ "usage_limit_GB":_("user.usage_limit_GB"),
64
+ "monthly":_("Reset every month"),
65
+ "mode":_("Mode"),
66
+ "current_usage_GB":_("user.current_usage_GB"),
67
+ "start_date":_("Start Date"),
68
+ "remaining_days":_("user.expiry_time"),
69
+ "last_reset_time":_("user.last_reset_time"),
70
+ "uuid":_("user.UUID"),
71
+ "comment":_("Note"),
72
+ 'last_online':_('Last Online'),
73
+ "package_days":_('Package Days'),
74
+
75
+ }
76
+ # can_set_page_size=True
77
+
78
+ def search_placeholder(self):
79
+ return f"{_('search')} {_('user.UUID')} {_('user.name')}"
80
+ # def get_column_name(self,field):
81
+ # return "x"
82
+ # return column_labels[field]
83
+ column_descriptions = dict(
84
+ # name=_'just for remembering',
85
+ # usage_limit_GB="in GB",
86
+ # current_usage_GB="in GB"
87
+ comment=_("Add some text that is only visible to you."),
88
+ mode=_("Define the user mode. Should the usage reset every month?"),
89
+ last_reset_time=_("If monthly is enabled, the usage will be reset after 30 days from this date."),
90
+ start_date=_("From when the user package will be started? Empty for start from first connection"),
91
+ package_days=_("How many days this package should be available?")
92
+ )
93
+ # column_editable_list=["usage_limit_GB","current_usage_GB","expiry_time"]
94
+ # form_extra_fields={
95
+ # 'uuid': {'label_name':"D"}
96
+
97
+ # }
98
+
99
+ # can_edit = False
100
+ # def on_model_change(self, form, model, is_created):
101
+ # model.password = generate_password_hash(model.password)
102
+
103
+
104
+ def _name_formatter(view, context, model, name):
105
+ proxy_path=hconfig(ConfigEnum.proxy_path)
106
+ if hconfig(ConfigEnum.is_parent):
107
+ from hiddifypanel.panel.commercial import ParentDomain
108
+ d=ParentDomain.query.first()
109
+ else:
110
+ d=Domain.query.filter(Domain.mode!=DomainType.fake).first()
111
+ if d:
112
+ link=f"<a target='_blank' href='https://{d.domain}/{proxy_path}/{model.uuid}/#{model.name}'>{model.name} <i class='fa-solid fa-arrow-up-right-from-square'></i></a>"
113
+ if model.is_active:
114
+ link= '<i class="fa-solid fa-circle-check text-success"></i> '+link
115
+ else:
116
+ link= '<i class="fa-solid fa-circle-xmark text-danger"></i> '+link
117
+ return Markup(link)
118
+ else:
119
+ return model.name
120
+ def _ul_formatter(view, context, model, name):
121
+ if hconfig(ConfigEnum.is_parent):
122
+ from hiddifypanel.panel.commercial import ParentDomain
123
+ domains=ParentDomain.query.all()
124
+ else:
125
+ domains=Domain.query.filter(Domain.mode!=DomainType.fake).all()
126
+ return Markup(" ".join([hiddify.get_user_link(model.uuid,d,'new',model.name) for d in domains]))
127
+
128
+ def _uuid_formatter(view, context, model, name):
129
+ return Markup(f"<span>{model.uuid}</span>")
130
+ # def _usage_formatter(view, context, model, name):
131
+ # return round(model.current_usage_GB,3)
132
+
133
+ def _usage_formatter(view, context, model, name):
134
+ u= round(model.current_usage_GB,3)
135
+ t=round(model.usage_limit_GB,3)
136
+ rate=round(u*100/(t+0.000001))
137
+ state= "danger" if u>=t else ('warning' if rate>80 else 'success')
138
+ color= "#ff7e7e" if u>=t else ('#ffc107' if rate>80 else '#9ee150')
139
+ return Markup(f"""
140
+ <div class="progress progress-lg position-relative" style="min-width: 100px;">
141
+ <div class="progress-bar progress-bar-striped" role="progressbar" style="width: {rate}%;background-color: {color};" aria-valuenow="{rate}" aria-valuemin="0" aria-valuemax="100"></div>
142
+ <span class='badge position-absolute' style="left:auto;right:auto;width: 100%;font-size:1em">{u} {_('user.home.usage.from')} {t} GB</span>
143
+
144
+ </div>
145
+ """)
146
+
147
+ def _expire_formatter(view, context, model, name):
148
+ remaining=remaining_days(model)
149
+
150
+ diff=datetime.timedelta(days=remaining)
151
+
152
+ state='success' if diff.days>7 else ('warning' if diff.days>0 else 'danger')
153
+ formated=hiddify.format_timedelta(diff)
154
+ return Markup(f"<span class='badge badge-{state}'>{'*' if not model.start_date else ''} {formated} </span>")
155
+ # return Markup(f"<span class='badge ltr badge-}'>{days}</span> "+_('days'))
156
+
157
+ def _online_formatter(view, context, model, name):
158
+ if not model.last_online:
159
+ return Markup("-")
160
+ diff=model.last_online-datetime.datetime.now()
161
+
162
+ if diff.days<-1000:
163
+ return Markup("-")
164
+
165
+ state="danger" if diff.days<-3 else ("success" if diff.days>=-1 else "warning")
166
+ return Markup(f"<span class='badge badge-{state}'>{hiddify.format_timedelta(diff,granularity='min')}</span>")
167
+
168
+
169
+ # return Markup(f"<span class='badge ltr badge-{'success' if days>7 else ('warning' if days>0 else 'danger') }'>{days}</span> "+_('days'))
170
+
171
+ column_formatters = {
172
+ 'name': _name_formatter,
173
+ 'UserLinks': _ul_formatter,
174
+ 'uuid': _uuid_formatter,
175
+ 'current_usage_GB': _usage_formatter,
176
+ "remaining_days":_expire_formatter,
177
+ 'last_online':_online_formatter
178
+ }
179
+ def on_model_delete(self, model):
180
+ if len(User.query.all())<=1:
181
+ raise ValidationError(f"at least one user should exist")
182
+ xray_api.remove_client(model.uuid)
183
+ # hiddify.flash_config_success()
184
+
185
+
186
+
187
+ # def is_accessible(self):
188
+ # return g.is_admin
189
+ def on_form_prefill(self, form, id=None):
190
+ print("================",form._obj.start_date)
191
+ if form._obj.start_date is None:
192
+ msg= _("Package not started yet.")
193
+ # form.reset['class']="d-none"
194
+ delattr(form,'reset_days')
195
+ delattr(form,'reset_usage')
196
+ # delattr(form,'disable_user')
197
+ else:
198
+ remaining=remaining_days(form._obj)
199
+ msg= _("Remaining: ")+ hiddify.format_timedelta(datetime.timedelta(days=remaining))
200
+ form.reset_days.label.text+=f" ({msg})"
201
+ usr_usage=f" ({_('user.home.usage.title')} {round(form._obj.current_usage_GB,3)}GB)"
202
+ form.reset_usage.label.text+=usr_usage
203
+ form.usage_limit_GB.label.text+=usr_usage
204
+
205
+ if form._obj.mode==UserMode.disable:
206
+ delattr(form,'disable_user')
207
+ # form.disable_user.data=form._obj.mode==UserMode.disable
208
+ form.package_days.label.text+=f" ({msg})"
209
+
210
+ def get_edit_form(self):
211
+ form = super().get_edit_form()
212
+ # print(form.__dict__)
213
+ # user=User.query.filter(User.uuid==form.uuid).first()
214
+ # if user and user.start_date:
215
+ # form.reset = SwitchField("Reset")
216
+ return form
217
+ def on_model_change(self, form, model, is_created):
218
+ if len(User.query.all())%4==0:
219
+ flash(('<div id="show-modal-donation"></div>'), ' d-none')
220
+ if not re.match("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", model.uuid):
221
+ raise ValidationError('Invalid UUID e.g.,'+ str(uuid.uuid4()))
222
+
223
+ if form.reset_usage.data:
224
+ model.current_usage_GB=0
225
+ if form.disable_user.data:
226
+ model.mode=UserMode.disable
227
+ if form.reset_days.data:
228
+ model.start_date=None
229
+ model.package_days=min(model.package_days,10000)
230
+ old_user=user_by_id(model.id)
231
+ if old_user and old_user.uuid!=model.uuid:
232
+ xray_api.remove_client(old_user.uuid)
233
+
234
+ # model.expiry_time=datetime.date.today()+datetime.timedelta(days=model.expiry_time)
235
+
236
+
237
+ # if model.current_usage_GB < model.usage_limit_GB:
238
+ # xray_api.add_client(model.uuid)
239
+ # else:
240
+ # xray_api.remove_client(model.uuid)
241
+ # hiddify.flash_config_success()
242
+ # def is_accessible(self):
243
+ # return is_valid()
244
+
245
+ def after_model_change(self,form, model, is_created):
246
+ hiddify.quick_apply_users()
247
+ def after_model_delete(self,model):
248
+ xray_api.remove_client(model.uuid)
249
+ hiddify.quick_apply_users()
250
+
251
+ def get_list(self, page, sort_column, sort_desc, search, filters,*args, **kwargs):
252
+ res=None
253
+ print('aaa',args, kwargs)
254
+ if 'remaining_days' == sort_column:
255
+ query = self.session.query(self.model)
256
+ count = query.count()
257
+ data = query.all()
258
+ data=sorted(data,key=lambda p: p.remaining_days,reverse=sort_desc)
259
+ res=count,data
260
+ else:
261
+ res=super().get_list(page, sort_column, sort_desc, search, filters,*args, **kwargs)
262
+ return res
263
+
264
+ # Override the default get_list method to use the custom sort function
265
+ query = self.session.query(self.model)
266
+ if self._sortable_columns:
267
+ print("sor",self._sortable_columns['remaining_days'])
268
+ for column, direction in self._get_default_order():
269
+ # if column == 'remaining_days':
270
+ # # Use the custom sort function for 'remaining_days'
271
+ # query = query.order_by(self.model.remaining_days.asc() if direction == 'asc' else self.model.remaining_days.desc())
272
+ # else:
273
+ # Use the default sort function for other columns
274
+ query = query.order_by(getattr(self.model, column).asc() if direction == 'asc' else getattr(self.model, column).desc())
275
+ count = query.count()
276
+ data = query.all()
277
+ return count, data#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
278
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,83 @@
1
- # 2023-04-08T16:23:32.088746
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xd2\n\x00\x00\x12\t\x04\x00\x08\xe6h\xc3\xe2\xf2\xa7\x98nT\x1b\xcc-\xb8@6\x00\x00\x00\x00\x00\x00\x00\x00b\x0fb{\xc9D_F\x85\xfe \xdf\x81\xfa?\ne\x95\xa4r\xa5\xb9\'\x12\xd6\x8b\xbe\xe6\xd0}\xafVU\xd2\x15\xca\x03\xf4\xadz\xbc\x857\x16n_\n\xd4y\x07\xcd\xee\xbc$\n\xfd\x18\xb2\xe5\xb8\xacR\x91\xef\xa9\xc8\xeb\xd5\x81\x9c\x04\xb2tQ\xd7L\xc3\x14\'\xbd[\x0b\xb3B\x1a\x83\x10\x96\xd0\xc9M\xed\x8fx\x07\xe0\xedQ[\x07qGv\x86\x17\xba\xf9\xaa\x96G[\xb2{9\xcd\x11H\xa5\'\xca\x8bu\n\xe2\xb7\xfe\x19\xb7\xaa\xfe~\xa6\xe4\x9aG\xa8owPn\x03\xa94\x15\xeepi\x10\xdb\x06\x1e\x92S\xfe!\xaf\xd5\xd5\xa5\\\x96\x13\xc8\xe2\x94\xf1\x1d4\x0c\xfc|\x0b]\xbby\x9f&\xc2\xac\xf5\x96$#\xd7n\xc0P\xa2p\x16\x1a\xbc\xf2\x89Py\x16S\xa4M\x18\'\x013DG\xa7\x1ea\xb8\x06\xd9\x10Xx\xb3\xb4\x84\x16\x94\xcb@\xc0\xa0/\xdf\x16\xe7\xcb\x07\x8a\t\x17C\xd8\xdf\x9b%\x9a^\x92\r\xb8\xaa\x84\xef|\x018\xfeG\xd0\x14\\\xea\x90\x99 \xa3\xca\x00@\x93i0\x04\x04tGn\xba3\xac\xebV\x82\xfd\x87\xaa\t\xccN#t\xcc\x01"u\x1a\x10w\xb4XD\xf7Q\xb0\x1b\xec\xee\x03\x13\x9aQ\xb2\xdd\xf61];\x85\xe3\x08\x8b\xe0\xa8\xdb\xf1\xf6i\xcd\xb6\xbf]N>t\xc6\xca\x83~\x050\xef\xbd\xf1\xe2\x926\xcf\xc0\xfe\x9c\xde\xdeS\x86imN\x9e\x92\xaemy\xc4\xb1\n\x91\xe3K\x91y\xc0\xcf\xe2\x11\xbe\xbaE\x16\x9f\xed\xa1L\xb3$ET\xc1\x00\x9d\x10Hem<\xaf\xe8T\x9f\nj\x12\xf8\r\x1a\x8c\xaf`\xa6\x12z\xd0\x86\xcc\xfeK\x7fK}d\x0f\xd7\x12I>\xb3H\x00Phoy\xc1e\xc8x\xe9\x9a\x80\xf2\xd7\xbb\xce,\xa9\xaf\xc4\xc9\xce\xfax\x84j\r>j\xcd\x9f\xfe\xec\x19y\x10\xb0\x13\xc5\x0e\x08\x91\xd9\xab\xe7\xdck\xfe\xbfz9\x01\x93 \xa2\x8fL\xae73\x9cy\x0f\x15\x80\xc0\xc1\xbf\x95\x9c U\xdc4T\xce\xd8.7\x92\x9bIf\xb1\xfd\xc4\x94\x19\x8d\xbek\rO\xb7IXc\x80c\xfe\x9c\xfda"\xe6LrZ\xbe\xcd\x00\xa8\x96*k\x9f\xeb\xda~Y5O\xb7\xdfG7\x90\xf0\xcb \x90\x08\xd0-\xc3\xa2\xfa\xd7eda~\x97\xba\n\r4h,R\x16\xbaw\xfd\xa8\x97\xc6\x06\xe6}n\x16;\xa9\xe9\xe5\x8b\xd1N\xdcvtGN\xbd\x16\\\x15\xb5wR+m\xfd\xf7\x07\xa0Z\x82]\x91\x0b9\xeb\xcb\xb5<I\xa9SpR\x85\xbfxG["^\xf9H\xac+!\x83C\xe77I\x81\xf5\xb4\xd0\xa7!B\xd3.\xadJob\xd8\xb0pb\xdf\x853c\xe0\xb1\x08\xe7B9\xd1\xd3pE%~\x865>x\r\x86t\x0bS\x1a\x01.\xf4\xc4\xc3\xdb\xaf\xfe|\xd9\xc5\xdc\xe2>>N\xd3\x19\xc90!\xab\xb7t\x0e\x1d\x95^s\xe6K\xe1h\x89"\x03f{\xeb?\x14\x0f\xf7\x12pn\x02\x98\xd1\xdec\xa7u\xabO\x85J\x94*y~\xe4kF\x04\x98K\x03\\2^C]\xb2\xbf?\x1fE\xa23\x8c\x19.\x1c\xd0H$\xde\'K\xa4\xb5\n6\xf29\x10\xd4\xf5\x98A\xb6pJ\xfbq,D\xeb&\x99\xdf\x9d:w\x0f\x1e9\xead\xc1\x18~\xf0\xac\x13\xfa\x19\x10\xc7\xeb\xe3m\xf1\xa7h-\x1aW\x90\xa8$#\'\xd0\x83NZ\xe9`\xc3\xae\xee\x0c\x0cN3~\xdbJ\xe3Bi4\xe6\x0c\x86\xddJ/\x9b\xcd\xff\x0b\xb8\x9az#\xc1]RH\xe5`\x03\xcf\x01t\x9e\xa8\xc7\x160\xa3\xcd\xd7MH\xd0~\x11\xb0\xd1h\xe0A\xb3\xcd?mc\x00l\xbd\xa5\x9c\x83\xa8kg\xf2*\x103E`\x1e\xdf\xcd#\xb3c\xb9q\xd72J\x95\x99}*\xf0y\xcfp\x0c\xdf$\xe9\xa7I\xa5\xc9\r}\x03gn\xa2\x94\x0b\x1b\x8d\xe1\xc26[R\x93V[\xc9\x07\xf2\xf7s\xc6Q\xf1>\xc1r\xaf\xbc\x020\xa1\x12\x83e_\x07\x12\x19\x91\xbc\xf8\xee\x1a\x06z\xb7nx\xc3\x03\x95\n}\xb8\xa0\xf3\xb4\x9b\xda\xbd\xe4\xb2EQ)d\xe3\xfe\x9cXb\x8cop\x16\xf0\r\x8a\xde*\x8ah\xd1\x89\x0c\x8d\x13\x06\xdfV\xce\x00\xc29JY\xb7\x13\xe0\xa2\xce\xfaF\n\xd0\x07\x87\xa5\xecn\x88*hG\x1e\x9e\xbf\x12\x00\t\x9a\x8f\x17\xe4\xa9K\x8a\xd3\xcb\x9by\x03\xe6p\xe2_}\x9c8\xe1\xe1O/\xd2\x8eWR\x0c\x87\xa6r\xd9\xa5:\xfd\xcf\xcd\xf5\xae}\xd1\x18,d\xe4\xd1\x91(\n\xceC\xaf\x18S\xb9\x11=a\xc7\xd4[\x83U\xcb\xe8aX\x8b\x97\xda\x9dB\xebt\x08\xdfa\xadg\x86\x88B\xa3O\x13\xa4%\xbfJg4{"t+4SO\xf7\x06\x01\xb2\xca\xc9;>K\xf0w\xbe\x9d&\xe3WM\xb01\x04H\xe0\xcc\xc1\xecQ\xb7\xbe\x04\xe7d\xebw\x9afNs\xec\xb3,4BG2\xb1}\x10\x04b\xbc\x8e\xa1\x1b\xab=}\x9e\xc3x0\xff-\xeb\x02\x9e\t\x94\x15\x03\xa0g\x12\xe8p}\x86\x19\x01\x85\xc7\xfa\xc9\x13\xe8\xf4\x85\x99\xbdIi\xd8U\xacc"\xf1Y\x97\x85\x14eN\xf43\xee0s\x12\n\xfc\xe3\xef\x15\x9a\xdb\xf9\xbf\xf2\xdd\x0f\xba\xa1X\xac\x04xO\xdf\xc8+v\xbe\xee\xdb\xdb\x9dy\xf3\xd6\xae\xa6\x86\xdc\xe0\x8a\x81\x99\xf3g\xb5F\xa6t%fb\xd1\xf9*\xe9\xae\xa7\xd4\x1c O>}\x82\xee#\xfb\xdb\x90\xef\xea\x83\xb9\xa8\xe7]\xc6\xae\x1b\x1ec\x9a\x83)\x0f,nq\x85\x82\xf5=\x81\x0b\x14\x1b\x10\xc3\x95\xa4N\xf1\xa6z\xa4Rd\xfb\x9bntkP\xd3(\x14\x18\xe5\n\xff \xdb\xe8p\x11.Wdd\xbc\xcc\xc5\xdeLh\x04\x9eD\xae\xd6\xc7\xd2\x7f\xe7D\xbek[\x9f\x8dI\t\xca#\xe5\x81J\xaf\xb5L\x80\x04\x84i=;\xf5\x13h\xe23\x1d0\x85\x1c3\x02)8\xc9\xe7B\xef\xaa6Z\x10\xdb\xbf/{\xf3:2\x8d\xd8\xe3\x98\xb3?\x99M\t\xe5F\x04E\xa8w\x98E\n\x7f\x90\xda\xd5(\xe1\x99\x98\x99\xf9\x15\xca\x8cy\xee\x1e/z\xbe0 B\xfa\xeb\xc8X\x86\r\x7f6)NS\x05\x15\x8d\x8b\xd9Z\x92\xe4\x1cO\xa0\x14\x9dl\x97\x97)}\xa3wK\xc4\xfd\xf3y\xeb\x88_\xdc\x99\xc9\x10P\n\x90%O\xca\xd6d\x02\xb1\xdcw[)\x92v\xd9\x84f\x8d\x86\x11\x111\xd2k\xf2E\xd9\x94\x86H\x9b\xa8\xc7\xe6\xecP\xe6Q\xcd\xc3^\x19\xd2Ea<\xd6%$(\xdd\xa4G\x11O\xce\x08/\x17\xe0\xca\xee\x95\x02\x83\xc6\xa8\xc6t\xe5d-?W\xdd{;M\x9e\x1a\xef\xa8\xecT\x1b\xdd\xff\x1c\x80\x9a\xed\r\xd7)\x1f\x99\xfaV\x11\xcc\xacd\xa7%]D\x8d\xc9\x16\xb2\x86\x85m\xbf\xbd\x00\xac\x0c+o\x04N\xc1a\xd7\x9bO=\x07T\xbd\xcc\x1d\x85\xc2\xa3\xdf\x9a+\x14\x98W\x890\xe6\xfd`\xca\xb9\xd1\xc5"x\xf4\xaa=\xc2\x95\xf9\x0c\xbc!7\x8b\xd0\xac\xb5J\xbb\xa1]\x11\x01\x1e\x9eh\x80\x0eJ~a(\x02\x97\xe8\xe0s\xc39*h@\x8b\xe9Ty\x9bq\x9b\xfah\xf44I\xb4vr\x81\x05\xf3g\xd0\xd4\xe6\x0fn\xf6\x87\xd2\n\xd3\xc31\xec\x91Y\x18KcE\x07\xc1\x93\xbdE\x8f=\xef\x7f\xe9z\xc8\x08\x9f\\\x8d?\x00\xbc0\xda\x8b\x0b\xd82p\r\xd3\x81\x96\xf5\xc1B\x97\xfd\xe9\x8f\xad\x95\xa3\xfb\xfa\xef\xe5\x0fBw\xae\xcdK4\x1d\xb8\xa0>\x07\xbbWp~\xe3\xdd\xbc\x82\xc8_l\x1ef\xfa`R\x0e\\p36\xbe\x8aA\x027\xe9\xc5\x93\xd3\xb8\xb5\x00\x00]\xdcd\xa7\x9bq_\xa2\xaaT\xb2d*\x87\xc8\xb2\xe1YJ\x04\xce\x03\xd2Gca\xd0\xfb\xa3m\xaaO\xff\xb7\xf9\x89\x00\x0c\xf8|\x06\x94d3\x13Y(\x9c\xca\x90\xdd\xa8{\xbd,\xae$\xf5\x87\xe9\xfc\x9f)\xda\xb51\xb1t.\xa9F.\xaa\x0c\x0co\x11\xe8M<6>\xf6\x04`\x0e&hgi\x16\x9b\xb7\x00\xa1\xac\xe3\xaf\xb8\xa7\xac+4\xb8\xe3f\xe8\xbe\x7f\x9a-\xc2p\xfb\xe1\x04\xd1\xb6\xb1m+\xc9\x99=\xb8I\x0c\xd1\x7f\xf3#\xfe\x08V\xa7R\x9eLVB\x917\xa9+\x9a\x08\xce[\xcd\xd5/\x8c\x07\xd6\x00.p9">\xb1\x88\x95!\x0f5\x1a"\xe9\xcb\x1f\\\xbe\x800\x0b\xa6y7\xf4\x0e\xce\xf2\xe6)*@\xb4\x01d\x14\xcc\xb8H\xce\n\xf0\xa4\x1d\x95\xa0/\r\xd1\xa9\xdd\x03$\xe4^\t\x06\x83\x1d\x8atzr\x93Vcr\xde\x89\xcf{\x8b\xfbP\x88\xd8\x02T\x83\xe9\x90\xa9\xdeS\xa9\xdf\x9e\x15\xc6\x08\x9bbtNY\x1b\x8c\xdc\xa2$\xb5\x1a\xff\x86\x8aa\x0b\xf9!}\xbb\xe5\xde"\x01r\xd6 \x03\xce\tue\x1d`\xf3\x18C\x83c\xf2\x1d\xb7^\x84)(\x06\xaco\xf9\xad\xba\x18n\x12\x00u:\xc1\xcd\x00\x9f\xa6)\x91U\xc0\xf0\n\x96\xa6\xf7\xd5\x90\xcb\x1c\x1eT5Y\xc5M\xeb\x8ad\xc2j\n\x807\x18\x9f|\x04\x8c\x82\xa3\xae\xb1g\xca\xc9\xf4\xd9\x18t\xcf\x13\x1f\xfb\xa0\x9b\xd0\x95\x95\x1f.\x94>\xb6\xf0\xc8C\x8ca\xb3EC\x93Dr~0p\x97\xd8R\xd1&\xe6\x8f\x99\x05\xcb\x84\x1e\xb9c\xa9\xe8\xbb\x08\xf5<\xa0\xc6\xb3\xe5z\xc0\xcc\xd6\xe0\x813N6\xdeu\x11\xb4s\xbc\n\xe2\x1b\xa1\xc0_\xc4%\xab\xbf7r\t\xd6\xc4J\xff\x9c]\x92)r\xda\x10\xa1\xa6\xe7\xc8\x1a\xe7\x15\xf0\xecVWB\x12+\x9am\x8a\xa3e\xb2\x8d\xc5\x13\xdd\x90\xd0_\x8b\x07ze\x9c\xce\xc6\x1a\xe1\xbao=\xe6!\x1fR\xc0\xbec\xe5\x08\x91\xe3-\xb3\x03\xcd\x0e\x95\x8d\xbf\xa1\x10\xd4\xa4\x8a\xdf\x98M\x9a#\x06m;mR\xd4]M\xc6g\xea\xf4\x1co\x04\xeb\x05\xbd6\xe5\xb6\xdc(I|\xcf8#\x80\xfb\xd0\x7ft\x03\xb6\x8f\xa6\xdfo\xaa\xb3\xfd\xd7\xe2\x83\xe5\xd1\x0c|L\x80Y\xad\xffc\xda\xbd\t\xd9\x0e\xf5s\xe4\xeb\xec\xe1\xc2\xae\x97\x07K\xb0\xb6\x07\x94\x1f\x92\x01\xb8=+\xd6R\xfe\r\x8f\xea\xfa\xebY[`\x147\xc4\xd9IF\x9dd\xda\xa2\x84\x8e\xcdn\x03\x1br\x7fa\x1c&7k\xf8\xc6\x91>\x88}P[B\x93po\x88+\xba\xf8\xc8\x0evU\xc8s\xe9\x95\xbb\xed\xe6\xb8M\xe0\x89\xf4\xff\xac\xd8r\xc7]BA\x854\x92\xa4\xae\xa9\xa2\xc6Z\x16j\xa5C\x18kw\xb7vY`1\xdf\'07\x86\xda\xfd\x85\x80\xedw\x02\xd7wAo\x00[L\xb5\xb2\x88~\x0f\xf9G \xc8X\xda\x7f*\x88;88\xd9\xfbK\xe8\xacRs\xa8\xa1q\xba/\xb4K\x81\xf3\xed\n\x03\x8f\x07B\x9e3\xf0\xcb\xcb\xd6\x94\x10o\x14I\xadEs\x9apRn2\xb8\xef\'\xc5\x05\x8d\xd7p\xed;/\xbf\xa5OQ\xa7\xf0\xb4^\xcckc\x18?\xf9\xe9\xc1+\xfc|\x01^\xbe`\x94\xc1\xe32IM\x80aF(\x112\xff,,\xfd\xac}z\xb9\xb3\'\xce\xee\xb1Xe\x083\n;(\xf8\x16\xd7\xd6\xbb\xc6\xb4\x8cy\xee3\xdc\xcc\xae\x8b\n\xf9i\xbeb\xe9\xa3\x8d\x99\x18\x8d\xcb\x82\x9e\xdax\xc5\xa3:\xa2\xbeo\xfb4>i\xe8b\xacBw\xe0\xfda\x1a\xf5\xc6M84J\xc9\xc6ir[R\xd0\x07\xaf\xab\xd0L\xfa\x92\xcf\xc8\xc9^\xad\x9a\x1b9\x13\xe7"')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from flask import Blueprint,url_for,request,jsonify,g,redirect
2
+ from flask_admin import Admin
3
+ from hiddifypanel import Events
4
+ # from flask_sockets import Sockets
5
+
6
+ from .SettingAdmin import SettingAdmin
7
+ from .DomainAdmin import DomainAdmin
8
+ from .ConfigAdmin import ConfigAdmin
9
+ from .commercial_info import CommercialInfo
10
+ from .ProxyAdmin import ProxyAdmin
11
+
12
+ from .Actions import Actions
13
+ from .Backup import Backup
14
+ from .QuickSetup import QuickSetup
15
+ from hiddifypanel.models import StrConfig,ConfigEnum
16
+ # from .resources import ProductItemResource, ProductResource
17
+ from hiddifypanel.panel.database import db
18
+ from hiddifypanel.models import *
19
+ from .Dashboard import Dashboard
20
+
21
+ from flask_admin.menu import MenuLink
22
+
23
+ import uuid
24
+ from flask_adminlte3 import AdminLTE3
25
+ flask_bp = Blueprint("flask", __name__, url_prefix=f"/<proxy_path>/<user_secret>/",template_folder="templates")
26
+ admin_bp = Blueprint("admin", __name__, url_prefix=f"/<proxy_path>/<user_secret>/admin/",template_folder="templates")
27
+ flaskadmin = Admin(endpoint="admin",base_template='flaskadmin-layout.html')
28
+ # from extensions import socketio
29
+
30
+
31
+ def init_app(app):
32
+
33
+ from .UserAdmin import UserAdmin
34
+ # admin_secret=StrConfig.query.filter(StrConfig.key==ConfigEnum.admin_secret).first()
35
+ #
36
+ # return
37
+ # admin = Admin(endpoint="admin",index_view=Dashboard(),base_template='lte-master.html',static_url_path="/static/")
38
+ flaskadmin.template_mode = "bootstrap4"
39
+ flaskadmin.init_app(flask_bp)
40
+ adminlte=AdminLTE3()
41
+ adminlte.init_app(app)
42
+
43
+ Events.admin_prehook.notify(flaskadmin=flaskadmin,admin_bp=admin_bp)
44
+
45
+
46
+ @app.route('/<proxy_path>/<user_secret>/admin')
47
+ def auto_route():
48
+ return redirect(request.url.replace("http://","https://")+"/")
49
+
50
+
51
+ # flaskadmin.init_app(app)
52
+
53
+ flaskadmin.add_view(UserAdmin(User, db.session))
54
+ flaskadmin.add_view(DomainAdmin(Domain, db.session))
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+ SettingAdmin.register(admin_bp)
63
+ ProxyAdmin.register(admin_bp)
64
+ Actions.register(admin_bp)
65
+ CommercialInfo.register(admin_bp)
66
+
67
+ QuickSetup.register(admin_bp)
68
+ Backup.register(admin_bp)
69
+ Dashboard.register(admin_bp,route_base="/")
70
+
71
+
72
+ # admin_bp.add_url_rule('/admin/quicksetup/',endpoint="quicksetup",view_func=QuickSetup.index,methods=["GET"])
73
+ # admin_bp.add_url_rule('/admin/quicksetup/',endpoint="quicksetup-save", view_func=QuickSetup.save,methods=["POST"])
74
+
75
+
76
+ app.add_url_rule("/<proxy_path>/<user_secret>/admin/static/<filename>/",endpoint="admin.static")# fix bug in admin with blueprint
77
+
78
+
79
+
80
+ flask_bp.debug=True
81
+ app.register_blueprint(admin_bp)
82
+ app.register_blueprint(flask_bp)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
83
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,14 @@
1
- # 2023-04-08T16:23:32.092716
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xd2\x04\x00\x00\x12\t\x04\x00^\\X\xa6\xfb\xa8/0\x05\x90\x1b\x1a\xf9(\xf4\xc1\x00\x00\x00\x00\x00\x00\x00\x00\xae\xb1d\\\xb2lW\x85z4\xed\xfdn\x17\xef\xbdG\xe6\xf7\x1b\xd0u\xab\x11\\\x10\xc1q\xfdt\x98\xe3\xf6h\x94\xca~O?\x8d\xd2\xf1\xf3\xc0\xa7\r\x14Fr\xa8n\xec,\xb5\rR4:Ou\xa5\x95\xd2\x92\x07\xc8kY\xf5\xab\xe6\xa5cA\x9f\x8c\xf2\xc2\x9a\xe7\x9c\xb0Q\x1d\xd1\x16#\xa11x,\x1d6b\xfa\xb7\xa4\x84\x98\xdd\xb1uTM\x1fj\xf7\x1b(\xff\xd4T\xbb\xf7\x8c\x8a\xa87\x9cN^\xcd\xf7\x93\xb5|{\xc9{A\xa8{\x83#\xe2\xe9\xe7\x92\xabj\xc8\xb3q/98,\xf26LI\x96\xeb9\x05\xee\xdf_"\xa2\xf1s\xe0D\xd2\xe8\xbb\x86,\x88^\xa5\xda\xb6\xb5\xaf\x92\x19\xbc\xd4\xd8\x18\x81\xf9I\xfb\xb6\x89!Ji\xb0CNu\x8ac\xa2\xac\xf2\xfdg\xb4\xeeYX\xad\xec\x80%C\x92\xbdk=\xb4~s3r\xd7\x9f\xebRKz\xab\xebi\xe5\xbb^\xee\xd7\x94\xbb\xef\xb9zG\x92+F6U-\xccWvSX\xcc]\x0cQ\xf0i\x17\xee)!rI\x11\xf0\xee{jf\xe9\xb6oJ\x06L\xca\x1c"\xb1\xc5u\xef\xaa\xb7\xf5i\xa2\xf1\x83\xdf(W\xf1A"\x83$\xd4\xc7G\x9d\xed\x84\x99\xa5r},\xcaj\x046\xc0\xf8\xaf\x11\xa7\xf5?\x1e!\x87!\x9a/WM\x07\xf6}\xb0D\xc2\xd2\xbf\x0c\x8f\t\xd6J\xf5\x034\x95\x165\xfd\x01\xa0\xc8\xd2\xd0\xfa\xa5\xe6\x19\x16/\xe9\xdc9\x8d\xd3\x9a\x95\x8fb\xee\x18\x1eX~\x13\xe1c\xc3V\xb6\nr\x82w\xe0\xef\x10\xe8Pr\'\xf98\xe1\x878\xb8\x1e\x99\x9d\xf87\x04\xf3\xb2\x03Z\x88\xc2\xd4\xd3\x95\x15ZhEx\xdde\xc0\xe7\x12\xbaZ\x00Q\xe0\xed\xcf,\xff\x846\xe9T(\x1d\x06\x14\xf1\x93\xe5f\x97\xdf\xd7\x9d\x8a\xa4\xe2\x01\x9b \xc5_\x8fJ\x1d\xad\x08\x7f>A:x\x99\x832\x97\x89\xf0_^\x1fn\xb8\xca>\\,\xcaw\xb5\x14c\xb0\xad\xa9l\xaf\xb8\xdb\xdf\x02\xe1\xc3>\x0c\x15\xd6\x19\xed\xfb\xef.\xa6\x98.\xb1\x81u\xc32\xf2\x94\x0f\xe1\xdd\xe7\x89\xe0\xb3\xb7\xf8\xd3\xa4/o\x13\x93@ TP\xdf\xd6mD\xf1/\xf5U_\x1e\x9d\xecL\xb2\x19[\xecT)\x9a\xa7:\xa7\xc7\x98\x86,\xf1R)K\xc4\xcc\x01)\xa1s\x11B\xef\x1b\\\r\xe7\xbc\x0f\xfb\x16\x0b\xc3\xfc\x80\xedD\x8b\xc3\x81\xbf\x95\xbdr\xac\xab\x82\xc6\xcc\x9a\x0ft(\xabT7\x8aKJ\x1f\x9a\xf0"\x05t\xb5h\xe3\xc6\x04\xce\x8ac$\xb7A=\xeb\xf5O\x92\x8bhd\n\x7f\xf1\x8dE\xba)\x08y\xb2\x98\x89\x96\xe8hf\x9c&`\xb7z\x121\xa81\\\r\x15c\xdbZ\xfa\xf0\xab\xa6VW\xc5w]\xddI\xc7sK\xd7\x9a\x00A\x8dml\x9d\xc1\xa7\x8d\x16\xec\xeb\x11N\xb2\xb1~\x12\x1f\xb2\xa1\xfa&\xf6:\x93=\x83\xe3M\xe4\xe9\xf0\x0c\xd2\xe3M\x18\xe6uc#\x07\x91\xb6\xa4\xbb\x85\xf1k\xdf\x0cf\x0el\xe7\xee\x92\xc2\xd5/-[S\x8b!FQ\x8c\x86\x87J9\x9a\xba\\n\xfa\xb7\x0f<-\xd3@\x14\xf7\xa0,\xfe\x86o7\xb6Q\xd4\xcb\xd12\xe5l\xf7h3B|\xbb\x9aT\x1a\x18G@q\xf0X\x106#\xf5\xc7\x17\x1d\x7f\xbe\n\x84d[-\x01\xa5\xe1\xb2#\xd5#\xcf\xab\x9a\n\x8d\xbe\xbd\xc2YxE.\xca\x93\x92\x8f\x03\xd2pa\xe7\x8f5\x87b\x05\xe6upL\xbaN\x1cU<\xf1\x03\xcd\xc6\xb9,\xef\x8egh\x87S+A\x10\xcf\x01\xfd\xfdC\xa0\x98z\x0c>\x13 \xda1\xc7\xa2\xd5O\xbc\xffC\x14cG\xe8\x05\x02F$\x9fI\xf2\xf1\x94o/\x17h\x18\xc1*\xb8Y\xdb\xd1_\x98O\x1e\xdf\x107\xb7p\t\xeb\xbc\xedHxA\x1a\x86\xd2\x17\x02\xa4\x82\xe9\x9f\xf5\x08\xd1\xf5\xec\xddu\x19\x9b\xeaT\xa8\xf1\xacV6\xe0\x99\xe1\xfa{~\xdd\xa9\xce\x8a\xb3\x95P>\x84$\x1d\x16\xffy\x88\xc6\xddL\xb7\x02\xb7#<\nL"\xa0\x99!\xc3W$\xe3\rd\x8d\x93\xd9\x93\x0b\xfe\r\xc9\xf7\xf1e0\xcc\xe3\xef\x99\x0b\x8a\xfe.)\x90\x99\xc9\x19M\xd9s\x0e!l\xf7~E\x1b\xac\x06`;\x0fz+\xcd\x95\x94\xaa\xbbp\xadz@J\xa2I|\xfd\x1b\x04X\xbc\x8d\xba\xabpLi"VX$\x9e\x945B\xd5%;Z~f3G`\x10\x95\xb4\xe7\xfbV\x90{\xde]m\xae\x02\x1e\xe8I\xe2W\xe0\t7*z\xad+^\x936\xdfn#}\x89w\xc7np\x07XHU\x94\x80\xb3r\xfe\x9bY\xe9\xe1~\x98\xbc_\\}\x13\xcf\xc3\xcdzw\xba\xa0\xb3\x07\xa4v\xe2!=\xd9M\xa8\xef\xd5\xbeB\xffu\x13\x84\x95lQ)\xf7)9/fb&\xbb\xd1\x81a\x9e&:Z\xb5\xb8.\xba-\xc1QX@\xb3\xff\xc0\xff\xf4\x90\xa6\xa8 \x9a\xe4&\xfe\x88o`"\x00\x9f\xfd\xc9\x12\xfd\x95\xd9\xeao\x07*E\x91\x0bB"\x0c\xff\x10\xb9\xfa\xcd\x82)\xbe\xb8v_\xd4T')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from flask_admin.contrib.sqla import ModelView
2
+ from flask_admin.form import SecureForm
3
+ class AdminLTEModelView(ModelView):
4
+ list_template = 'hiddify-flask-admin/list.html'
5
+ create_template = 'flask-admin/model/create.html'
6
+ edit_template = 'flask-admin/model/edit.html'
7
+ details_template = 'flask-admin/model/details.html'
8
+
9
+ create_modal_template = 'flask-admin/model/modals/create.html'
10
+ edit_modal_template = 'flask-admin/model/modals/edit.html'
11
+ details_modal_template = 'flask-admin/model/modals/details.html'
12
+
13
+ # form_base_class = SecureForm#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
14
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,25 @@
1
- # 2023-04-08T16:23:32.188487
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xca\x06\x00\x00\x12\t\x04\x00]\x9e\xdd\x9a\xba\xab\xe5\xa2\x13\x0f\x1c\xf9\xa3\xf0\rL\x00\x00\x00\x00\x00\x00\x00\x00\xb7^k\x92<\x05:\xb2\xedX\xdf\xb0\xd9\x89t\xa1A\x98an\x19\xb1\xfbN\'\xee\x0c\x1b\xd8j\xdb\xc7\xc2Bn\xf5\x0b\x9c1\xc9\x14\xd6u\x9f?\xd8\xc4\xeaEd\xde\xec\xcew\xd8\xfez\xc8\xa9AW!\x89\x17{F\xaaP\x9d\xb1\xe2\xc0?\xf4q\xd9jqv\xf3\xf2\x18i\x81\xe7\x08\x17<x\xc3\xad\x01\n\xdd\x8e\xf2\xb5\x03\xd8\x83<\xf4\x13\x1f\x86L\x038Ik\x19R0*\x8a\xc7S\xe1\xabY\xcdF\xf7\xeeN\xb0\xaf2\x0e\x9f\xb6Nx#\x08P\t\xf9\xd5\xde\xf6]\xbb\xee\x9a\x9d\xa2)b\\O\x8d\xe8\xf0\xa9\xa6\xee}\xc8w\xed\xeb\xe8\xeeG!v\xf0A\xac\x92\xb5\xedZp\xbb\xa9\xf5v\xad\x05\xfa\xeb\xaf\xe1\xab\xf3r\x17\xbf\n\xb4\xc1e\x80x\xa08\x04Ld\x06\xd4\xa0/\xde\xa0\xbcJC\x99\xbc\xd6\xccE\x9cg\x87\x80<Ni\x040f\xdb\x93\x00\x0e\x8d<\x00L\x98\x94\xf4%\x92\xe6\xa7`\x04\xd0\x9d>\x9b;\xa8\x1fP\x05C_c2\x94\x9d2\xaba\xce\xd7\x0b\xd2%\xf7\xbd\x8c\x13)\x98\x00\xd5\x81`j{\xfconx\xbb\x80\x83\xcc\xb6\x16y\xd2\x07\x8c\x1a<\xdfp\xb2\\\x8b\x9d1\xc4\x07jgGfa\xe4\x8f\\\x95\xc3\xcf\x9a\xbc\xd7R\xe6\xf5\xd8\xa3\xc2\xa0\xf2\xbe\x9c\xf0J!\xd1\xf2D\xa4\xc5\xbe\xd9\xa9\x0c\xfb\x86\x94O%\x9f\xc3\x99\x01\x7f\xc5 \xb7\xa0\xae\xb7\xb1\xa5\xea~\xe2w\x85\xaeX#N\x9a\xaeE0W\'\xda\xe3S\x00O&\xfd\xe2\xd5jM\xc7_\x0e\x82\xc7\xedT\xea\xfenX\x99\x06\xab\xf7\xa2 x\xbc\xc2\x01\xe1\xef0\xaf.\xdc\xcc\x00\x06[\x1c\xb0N+\xff\xcc\xab\xc1xk\xdb\xda\xe7\x80\x85\x80\\}\r\xf7\x8a\xdb\xab\x19=\x04\x9c}\xf4k\xf3W\xa5\xa1Qy\xef\xe3\x89\xdd\xeb$,8\x1b2?9Z\xca\x85D\xde\xa4\x9eP\xb2)\x88\xd1D\xf2\x99"n\xfc$\x03>\xb3\x05\xb9\x1e\xfc\x15F\xb0\x1f\xe78G\x04$t\x949\x81Zv\xe4\x98\xc1T\xd8\x83E\xbb\xa7C\xc9\x8d\xcf\x8a<\xc0\x9a\x07\x9c\x94fP\x02\xa0\x99\xf1_[\x99\x8eA\xd4\x8b\x88V\xa4\x9a\x88C\x8f\xe7\xba\xfa\x96\x18\xcf\xfb\xc8\xa9\x83a#\xd6 ,\x88\x1f\x95\xe8\xc3\xaa\xbcn\xa2:\x0e\xca(\xd3\x04\x19\xec\rLQa\xe7o\x11\xa2\xb2\x14\xadIW\xf2pC\xe5R\x1f\xc8M\x00N\x02\r=Q\xac\xffe\x8fE\xaf\xb9\xe0\xc3\xacx:\xfce\xeeh\xd4\xaf{\x11\x10\xd3\xac9\xd0\x1b\x0b\x9d\'\x83\x06o\x1a\xa1\xb5\xdf\xa6\x0c\x87\x92\xee\x9b\xca\x07\xdc\x9f\xf6\x99E\xee!?`\x08\xf666\x1d0\xf45\xdctg\xda\xab\x06C\xf1\x92z\x90\xfa\xa1\n\xfc\xae\xbeT\n(]\x8d\xed\xa4\xca\x8d\xfc\xbf\x14\x86|&[\x8a\x11%\x18\x14\xf4\x18\x8b\'g\x9eg\xd0/9\x92\xf1\xb9\x12\xca\x02\x97\xda\x02\xbfv/\x9d\x99U\xfe\x98\x9a\x87YpUQ(\xc49\xe9\xf9\x18\x0b\x84\xa5\xaf\xc8\xfdh\x800Ct\xff\'\x1e;E\xcf\xfd%vSp2\x12\x90\xaeh\xb9G\xdbW\xe74\x18\x8ev$\xc9m&q\xca\x86\xecb\xb4\xc43\x91\xef\x04\xf8\x98\xbb\xf0_\x86\x93(\xf47v\xc6\x0e-vF{VO\x1d\xf2\x9bt<\x004\xec\xa7\xba\xb2D\x96dh\xd5\x07\x9at\xe3k>-\xddb\x0bF\'\xb6sU0\xfa\xb4~\x94.\xb1\xd4\xb7\xce\xc3\xed\xef\xef5I\x96\x05\xa0\x13M7\x92E\xbaj\x95\xdf\x02\xc4~\x12\xbe\xe8\xde;%3\xa6\x9a%\x9b7\x9b\xae\x95s\xed\x9d#\x1c\xd9\xe9\xde\xf0q\xf9\x8fw9\xeem\xb2;P\xd4D[\xb3y1\xb5\xf6\xa7\x9fSiD\xcas|\xe0>\xc0\xa9\x91\x1a)\xc3\x89 \xd7\xdc\xdf\xefu\xc9\xf1x\xb2H\x83\xeeU\x06\xce\x89\xbfS\x84\xdb5Q_B\x1f\xdf\x1d\xa4Vr\x90\xa7\x10\xce\xc9K\x0cZ-\xf3T\xf7\x88 j\x0b48-\x0e}<\x8a?7\x8f\xe4Cr\xc2n\xff\xd3\x9e,\x1f\xd6\xe6h?\xdb\x95m\xb0\xb5\xef\xfcG\x8d\x81\r\x11\x86\xb1\x8a\xf9\xeb\x82\xe0\xa3\xb0\x07\x85V\xa6\xbd\xf8/K\xe0a\xda\\Y\x84EFK\xfdC\xd0\x04\n\x95\xa3\x9a\x8a\xc2AA4[\xb5x\x97w\x8d\xfc\x81M*\xb6\xeeE\xd9\xb2<\xef\t\'Z\x93\xe4\xb4s?7\'\x0e\xb1\x06p\xaa\x08\xd3\xb1Z\xa7\x18\xfa\x0e\xd5\\\xa8h\x0e\x86-\xf2&\xa3\x1e\x8b\x1a9\xb0\x10\xbe\xf267\xdd\xde43\x91p\x92\x89~\\\xff\xa6\xfaP\xcb\xfc\xa3!\xfdFh\x0f\xa9\x98\xf48w&,\xb3\xdf.\x02\x14\xe2(`7#\x84Ts7\xc7V\x8a\x1c\xca5@\x19\x15k\x94E\xcd\xf3+\x7fn\xf1\xbf4\xed"\xb2\xa3"0h\x87x\x8d\xb6\xdf*6\xd3\xd8\xe8}\x02\xf89\xe1\x02\x08\x08}\xed\xf3F<\xcf\x81\x11\xc0h\x91\x17\xc6\xb1\x10eq\x0e\xc0\r\x0e\xa3\x8a\xc8:/|\xb6\xc6J<\x0f\x0b9\xe2m\x9f\x8b\xfcY\x17?\xf0\xa6\xf4\r\x87\x8fcfz\xe6\x15\x82\x0fe*\x1a\x8bB\xfeG\x1bM\xca\x18\x1f\xac\xd0\xca\xfe\xfb\xb1:3s\xf3\xd4\xe1Ak\x95\x8d\x86\xce\xc5\xce\xfe\xbb3\x07(\x07\t\xb8\xfd\x00Q\xad\xfe\x86\x0c\x16\xc2|\xee6v\x1f(\xa0v\x1b\xe8/\xbd\xab2J4\x9a\xe0F\xcb\x96#\xb9_\xe3\xbb\x9f\x86S\x1f\xdc\xc6\xac0l\x91\xb9\xad\x0b\xfd\xe8,_]\x95D\n7\x94\xd0\x006+\xa4)\x91\x1cF\xcc\x82\x82i\xcc\xef\xac\x04\x86C\xf1\x10i\xde\xe81g\x97\x90\xc3X\xcf#\'\x96:]\x19\xaeP\x8c\xb8\x07\x86\xdc\xd3:\xe9.\\\xdc\x01a\xdb\x19\x11\xbd)\xdc/\xe6\x175\xaeOEq\x91\x06\xf9aW\x8e\x04\xd7\xa3\r3\x9f$\x1eU\xa5\x96|[\xcd\xc9k\xb7\x12L.\xb1\xe40;\x19\x996\xa9O\r\x8bA\xd2\xbf\x92u\x9dH\x1e\x8fsJ\xa4\'\xfa\xea\xda\xc3\x14\xee\xb8\xc9\xf3\xc1\x10\x7f\xf7\x17\x7fTn\xffMC\xa3A:u\xbb\xec\xcap|Q\xb5\x85pf\x90\xac\x01*2/c@\xfb#\xcb\xe4\x03\x19\x07\n@{\x94\xc2\xf0\xcf\x8f\xc1\x95Y\x93\xcb\xe9\xa6\xb68B0k[7\x1bs\xa0b\xb9\x9a\xb4/e\x96\x00\x13\xc6\xd2\xed\xbbF\xac\xa9{hI\xa2\x18\xed\xb2\x87\x08\x00\'Rp?\xb68\xf6\xf9%\xa5\x9fQ`\xc2\x0b\xfc\xd0G\x9a\xd1\xaco\x82\xe2\x8e\xf4\xe4\xff\xec\x08I\t{-y_?\x14\xdfG\xa2\xb8"\xae\xf3)P\x06\xc4ef\xccH\xc4\xbc\x1c1\xb3\xbb8H\x95\xf4\xfcm#8l\xd4\xbb\x82\xfdSg\xb0\xad\x83z\x07@q\xe2\xb3\xea\xce\x96\x98U"\x9cU\xcfrB\xa0\x8b$\xca\x11D\xbc$\x84\xc7:\xa2\x13\n\x86\x87\xe6\xeak\xa2\xcer\x18\xc6P\x85\xa5\x87\x19 \xba\n\x84\x83\xd2\xc9\x07\xfdp\xb8\xb0\x08\xa1\xe6\x16da\xb3\xc0\xfb\xdb\x94$Q\x06&\xac\xe0\xdf]\x06)\xbf\xba\xf4/,\x8c\x13\xf6\xea(\'5B')
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 CommercialInfo(FlaskView):
21
+
22
+ def index(self):
23
+ return render_template('commercial_info.html')
4
24
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
25
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,11 @@
1
- # 2023-04-08T16:23:32.165303
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x98\x00\x00\x00\x12\t\x04\x00\x8e\xa7\xd6\xfd\xb5\x95\x1b\x99_N]\x9c\xbe\xa9\xa8w\x00\x00\x00\x00\x00\x00\x00\x00\xbe\xc9[d\xe9\x98\xc3SG0u\x90\x05\xd0A\x1d\xa4c\xda\rui\x1b\x1bK\xbe\x96y\xfc\x89\xb2\x8a\xaau\xd7\xda\x06\xcaD\xe9r8\xf9\xbb\xbcJ\xfc\x06\x9d\x92\xc3\xa3\x08\xad\x9a\xa3\xb9\xedp\x00_\xe0\x8a\xcc7-2\x19\x96\x8dt\xc3\x84\xa1\xfb*\xe0\xcb\\\xd5DL \x99\x08&"\x7fu\xda\xc8\x12\xcb7\x8f\xb8\xbef\xff\x81\xeey\xbc\x9f\xad\xb9\xe7\x1b\x84\x83w\x91\x90\x922\xd1|\xb0\x84\xa73\xa7\x04\x07\xfd\x93\xd5K\xfe\x9c\x0b\xb5\x07\x95jP\xa2\xa6\xa4\xa3\xcco\xbe\x00\xc19dG\xf3?N\xca')
1
+
2
+
3
+ # from flask_socketio import SocketIO
4
+
5
+ # socketio = SocketIO()
6
+
7
+
8
+ # def __init__(app):
9
+ # socketio.__init__(app)
4
10
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
11
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,35 @@
1
- # 2023-04-08T16:23:31.412074
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x80\x07\x00\x00\x12\t\x04\x00\x89\xc4\x9c\xf0IXN\xa0L\x92|U^\xdeo\xa2\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x1a\xc5\xb3\x8aI\\\xe3_\x02\x815M\xb2~7\xb4\xba]\xbeG\xfd\xd5\x8e9\xd7\xb5\xf7;\xed\x9d\x9e\xceS[\xb9\x81\xb7\x14UaX^jA\xc7\xad\x04\x01\xd4\x1b\x1c\x02\x11\xcd\xf3-\xba(\x9e\xd4\xa4\x95\xe8\xe4\xa7K\xb5,n\xd7e:\xa0\r\xfc\xf9\xb9W\xa0OZ\x1f\x86){iPq\xaa\xacH\xe3\xe3\x0f\x8cF\xb7\x9d\x8e_f\x81\x80\xff\xb7|Ui\xf7\xa9\xc1\xcb:V\xc7\xb1\xc6\xbff\xeeJ\x18\xfe\xf5\x98\xe4\xc3\x16\xe4R\xbaeNh\x19\x15^8Z\xc7\x81\xaa\xd8\xbeSn$\xea*\xf8|9\xdcL\x16i\xf8\xe4\x8d\x0c\xccfWhu\xf7~y"\x94\xcf\x02\x8b\xed2C\xc7\xb6\xcd\xa4`\xc4\x1a\x15\xccP3u\xa3,&R\x16Q\x1b*\x0b\xd60|\x89l\x01\x9cl\x96\xa9%\xe6Hp\xd9\x9b\x95$\xb5\xd9\x10\xb5\xce\xc9\xd4\x02\x0fIwqu^\xdc\x7f\xcc\x89\x89\x9ctR\xa7\xf5\x93\xc2\xbaV_\xe0%X\x1a\xb8\xba\x87u9\xb4\xbb4\xccF=@\xdf\x0b\x81z\x17b\x08\x84z\x0c.\xbb\xac\\\x15d\x01hC\xf5N\xd0/\xf7\xf6N\xcb\xb6\x14\xd6&i\xd6:q\xfdf,\xd7\x86O\x00L\xfb\xa6\xf7\xd2\xe8\x13\xa2 \xcf\x98\x90\x1f\\r/\xb3S|\xdd\x9f\xdc\xb7\x1e\xd1\xbdY\xfdh\xc9\xe0t<\xbb\x13\xa4u_L\xe1f\x02\xf9i\xfa\xe2\x7f\xbd\xac\x8b\xf5\x01\xdcC\xaf\xf1\xafV\xbe\xd9,\xd5T\x90]+${\xcam\xcc\x84\xb8\'Ro\x91UEROJ\xdf\x1eb\x821\xa4\xab~?\xed\x1b\x04\xd0\xf3\x83\xa8\xd5&\x9a\x90\xc8\xc1\xc1\xf2?\xb7"}B>\x891\x8f\x17\x00\x1fm\x1c)\xc7/\xef\xdb\xeb\xec\xdb\xf9\xa8\xc1/\xa9F\xf8\xe8\x11p(\xc7\xae\x1e\xa2\xce\xc6\xafa=\x9c\xdc|y\xd0\x18`x\x1b\xcd\x17n\xb2\x07\xb7u\xb1@\xa0\xc8S\xf2QI\xff\x8d\xad\x02fM*\xef\xe8i\xd6\x95\xf8\x0f\r\xab\xee=9*\xfc_\xa6\xc7O\\H!\xc0\xd4\x1b\xbbH"zYo\xfayC\x10\xb01j\x14\x87\xbe\xd6\x82\x89"\x0b\xcc2\x03)S\x03e\x16\x82\xf8\xbb\xceD\xfb\x9d\xfb\rJO\xd9d\xa7Y\xffs\x9f\x19PH\xd6I\xf0Q%\xe1\xe6V\xccd\xb1\xa1I!\x15\x84\x99lb\xa5\xf6\xbea\xfb0\xb5k\x0b\x19J\x00\xa2\xb3A\xa6\xe6\xab\x11\'\xad.\x19=\x01\x1b\x8cB\xc6\x1c\xb5\xd2\x0f\xb0\x8e\x13\xb4\xd8\xed\xa3\xe5\t\x11\x8a\xc2\xcc\xaf\x0c0N\xf3\xbb\xf5\xf6\xf8\x98\x83\xd7\xc4\xad\xc7\x9c\xbc\xa9\x1d\x0f\x0e?-\xb7\xa3\xd2\xf3-\xbd#\x12g\xff\x8f\x00p\x90\x97i\xeb\xb3G\x10\xe8\x9d\x0e\xe7\xd5D\x84\x1aT(\x10\xe9\xd8\x93\xf3P\xd8\xa2\'\xc8\xd534\xdd%\x95\xf3xv\xc9\x89\xd5\xad\xff\xf7H\xbe\xbb&\xac\x82{\xe2\xe3\x04x!E\x14{\xe0\xda6\xdd\x14=\xe0F)\xc5\xbd6k\xe6S\x9f|\x86\x8c^\x86\x13:%\x00`\xf0\xafu"\xeb\xb7\xf3\xd2\xdbwL\xdb\r\xd6\x08\xb3\x9d/\xefc\xbf\xaf\x87\xf7\xc0\xd9z\xc6\xa2/\xaa\xa0\xbe\xab\xa1\xf9\x8c\x9a\xb6\xca\xcf\x11\x1b\xc5\xf0\xb4\xafSr\xb1 g\x1a_U60\xe1\x05*\xc7\xd7\xd8n\x18\xf2\x95w\xbf\x05\xb4Z\x85\x84G$\xb7\x8a\xc6;\xdd\x9bT\xdb\xe95\xfa/~qhK\x11L?\xa3\xa1\xd0\xb9\xd3\x00+\xbb\xc7W\xde\xe6{o \xac\xebv\x1e\x16\xc8\xe6\xeaQ#\x14\xe8\xf6\n\x88\x96\x14\x1d\xb5]&4\xb1GDM\x19\x8ay\x14JX.\x0f\x07,{&\x87\xef\x16\xce\xf2\x851.M|\x81R>\x16\xac\xf8\xae\x80\xa7\xbf_;x\xf0*w\xd9\xdba\xb6\xcb\xbbe\x02\xce\x9e\xc4\x87\xd9\x05a\xe2\xa9\x0fHu\xb2\x83q\xbf\xc1\xafbzc\x7f\xd8\x07im\xb6\xda\xb6\x14\x8b?S\x98\xa8V\xf0d\xab\xc5<\x13\xce\xdd\xdf\xc5\x0b\xf7}\xea!\xb2\x83\xdc#\\\x99\x14\x1b\xf5\xecvj\x06\x80\x94\xb8H\xf5\x8aN\x16\x03\x9e\x9d\xd0/\xcd\x9fJ[\x94\xcd\xaa\x11#,B_g\xf9\x044\xe4\xc1q\xdehj\x07RaF\xf8\xba\xd8=2\x10\x82=\xcdl/\xf1i\xe3e\x00\x11H\xd9+J\x95\xbe\xec\xb8RH\xf9\xfc\x19<\xe63\x94\x07D\xb3\x96\x99M2\xd2 \x83\xe8 \xf9y\x9e\x06z\x7f\xc0kNS\x904x\xf47\xdfO\xc6\x8c\xa0;\x12\x9b\xb4\xf9\x02P\x9e\x0f!s\t\x82\xf5\xb4og\xd7\xe5\xf5@\xdb\xfa\x01\xb04WT\xf4\x96\x0f\xa4\xc5\n\xcf\x01G\x1a_^/\xd0\xb9\x81/\x9e\x83\xc3\xf1\xaed\xebr\x06\xca\x02\'-\x9e\x0b\xc0\xa2a@\x9c`\x95\x85\x9d8L\xc9\xc9\xff\x10f2\x97\xd6Dj\xb0\xf60$\xb5\xc4\xb7$\x95\xef\x91\x8f\xdc5\x82\xfe\xe4~\x89\x98\xea\xb0\x9c\x9f\x96< \x8ae\xc5\x92\x9b\x8a\x1b\xc7U\xefX\x1b<KU4(1\x03X\xd0\xac\xcb\xc7*\xda\xd7\xc0)BH*oZ}\x17\xdb\xd2\xd9\xd2\xd2\xf3\x98\xe2\xff8=\x97&\xceu\xe9\xd3\x83\x8c\n*L\x1a\xb0\x9a\xb6\xc5\x15\xfc\xd9\xc32\x91$k\xd7H\xa3j\xf0\x87\x1d\x0f\xd4m\xddzW\xa5be\xa6\xb6\x96\x05\xa2\xb3\x1cq\xed\xc5m\x08\xa6\xffK\xd7\x0fF\xf1t\x0bP\xfb\'(\xee\xb1\xe6S`\xc3!\xfe\xa6\xcb\xa1X2\x97\xaeWLQr\xf2\xe0V\x13\xcf\xce~\xf9\xde\xa1\x84P;q \xf1\xa6\x89\x9c\xf3\xcd\xe8y\x12v\xab\x19\xa0\xe7L6%\x1bZ\xb4T\x05\xb8eQC4\xe2\xa9O{h.\x87\x8az\xd0u\x07\xbeq\x13\xdfd\xf8\xc1\xd6\' \xc3\x00\x9eI\xc7\x85\xd6\xdel\x15\xf5\x0c~<\xa9\x10\x86\x18\x80Z\xd8\xee\xcf\xec\x95W5\\\xc5|ss<\xf3\x1b\xd88[\xba\xb9\xb6H\xba\xcb\xb3x\xcc\xaf\xc6\xa9dQ.;\xc8\'\xc7\x94\xaf\x10\xc0\x86V\x7f&\xc2\x11\xfbt\x90CV<(\x8d+\xaeI\xbe\x94\x94\x85\xb6\x9bg9\xd1\xb0CB3}\xc1V\xc0\x9d\x1f&|\x1ff\xa7p#0\x8e\x9e\x1e\xd4EQ\xe0\xe8\xdaRX\xea\x05\xec\xc1\x1a\x1fp\xebC\x15\x00\x9d.\xc7Z\xa6l\x06R~\xc3\xc8\x93\xc2s\xed\x0f\xba5_\xaf\xf1\xae(\x0bn+\x93V\xce{\x8c\xfe`\xf1 \xb4r\x83\x8f\xc4\xa5\xd3\xe5\xc3\xf3\xe2\xfd\xaaK\x10\xa9U/\xdaRz\x0bc\xc0\xdb3\xaa\xf9\xf0_\x06\xe3\xa2\xfd\xdc<\t2PC\x9a/b\xbao\xa4<\xb5\xaa,1\x06\x1e\x85\xf0w\xf53\xa9f\xf3\x97C\x96\xf4X\x0b\xda\'\xebUD\xe63\x9a\xf9\xc2\xfdn\x11t\xe4\x0b2.{\xe7r<\x15<1\xb0:=\x14\x03\x88\xc5m\xdfq\x83\x9c:\xb5\x93\xe0\x8b\xc5\x11\'3;\xb2\xf9\x05w\xefS\x98/\x8f\xc3\xfe\x91\x8c\xbb\xb8\xfdf\x18\x18^+\xc7\xcf\xcf\x9fS\x15\xb91\x8eV\xc4\x81D\xb9-L\xa5D<<\x96\xf0\xaeG>\xfc\xff\xd1%mFH\x1c\xf7\xd4\xa1\xd9\xac\xb4;O)\xa6\x93\xbbk3a\xc1\x89\x15y\x14\xa7\x18pV\x8b\x82\xf4\x8c\xc5\x90\xe7\xfb\x04\xc1^\x8e\xf1|3\xb2q\xc0\xeb\x88\xf8t\x9e\x8b\xa4\xd4\xfc\x0c\xb2{m!i&\xd5\xb0\x1b%!\x1a\x96\x14n3`\xa6\xd7-k\x96\x99_\xc4\xfd\xcd\xb69B,\\\xba\xae\xdf\x92,\xcc\xb8\xa6\x8d\x10\xd9\x12\x07\xa6[\x85;\x9aq\x01\xd9\xdc\xd5\xae9\xceO(\xf7\x8a:\xdd#\xd0@\'\xc1\x86\xa0L-\xaf!\xab\x1b\xda\xcbf\x1d}Gbv\xe8\xd1\xb9~\xfb\xdb\x88\x1e\x05^F\xdf\xe4\n*\x80;\x81Wys\x8f\x11\xab_\xac\xc9\x99d\x94k\xe9\x15\x1c\x05\xd9\x91\xf6\xdd|\xc6\x07\xbeKY\xd3Xw*\xe0B\x1f\xf8N\x10\x1bN\n\x0c')
1
+ from flask_admin import Admin
2
+ from flask_admin.base import AdminIndexView
3
+ from flask_admin.contrib import sqla
4
+ # from flask_simplelogin import login_required
5
+ from werkzeug.security import generate_password_hash
6
+
7
+ from hiddifypanel.panel.database import db
8
+ from hiddifypanel.models import User
9
+
10
+ # Proteck admin with login / Monkey Patch
11
+ # AdminIndexView._handle_view = login_required(AdminIndexView._handle_view)
12
+ # sqla.ModelView._handle_view = login_requiredsqla.ModelView._handle_view)
13
+ admin = Admin()
14
+
15
+
16
+ class UserAdmin(sqla.ModelView):
17
+ column_list = ["username"]
18
+ can_edit = False
19
+
20
+ def on_model_change(self, form, model, is_created):
21
+ model.password = generate_password_hash(model.password)
22
+
23
+
24
+ def init_app(app):
25
+ # admin.name = app.config.HIDDIFY_CONFIG_PATH
26
+ admin.template_mode = app.config.FLASK_ADMIN_TEMPLATE_MODE
27
+ admin.init_app(app)
28
+
29
+ # Add admin page for Product
30
+ # admin.add_view(sqla.ModelView(Product, db.session))
31
+
32
+ # Add admin page for User
33
+ admin.add_view(UserAdmin(User, db.session))
4
34
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
35
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,19 @@
1
- # 2023-04-08T16:23:31.551786
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xd9\x07\x00\x00\x12\t\x04\x00l\xe8\xa6\xdd\xa5\x8a\xa1\xf2\x9e\xbeR \xaeof6\x00\x00\x00\x00\x00\x00\x00\x00.\xf9|X\xd9;\x1fy\xd5\xdfx\x91\xc2\tg\x06\x9f)\x1f\x9c6Z\xba%\xa2\xbc\x0fE\xa75T\xad\x10f\x8b\xfa8\x0b!\x8c\xa3Q\xa1\xad\xf6\x83 \x9ek\xaa\x94\x97\xd7\xa9\x9b\x8eu#\'\xb81\xd7\xd8\xb3\xb2\xf6\xb6_\x19\xa1\xed{\xf9\xc8\x14\xa4\x8e\xd0\xc2\x81Y\xfc\xb3#\xefB\x9d\xed\x97\x1d\xfb6+\x17b\xbb\xc3\xc9Xj3&\xb7#\'\x13G\x0bbA\xfe\x02\x14Y\xe5I\xe3\xdc\x92hJ\x8f\xa4\xf5\xe7c\x91G\xb0\xa7\x01\xa7\xd9h;FPu\xf2=7\xa4\xddT\xb8\xf9\xfa\x08S\x1b<s[\x7fS\x9b\x8c\xa1\xb4F\xc43\\CP\xa8\x89\x87a\x8ece#\r\xe5\xe3%4\x9d{\xe8\x0e\xa6\xafl8~W\xe7\x8f\xac\x0f\'\xa1.48\xbd\xd3\xb7{k\xd0\x9aBu\xd6\xc6\xd7\xcf|\xda%\x9d\xc6\xfe\xbb0\xb1\x18\x01\xa3\xa0&\xb4\x83\xd0\xf8\xd3\x0f\xa12\xa5JN;\xb1\xcbD \x8d\xe2\xb8\xd3\x00E\r^g\xeb\xea\x95D\x10\xf5\xebW5\x802\xd8./\xab\xed~q}\xdb\x8321\x9a\xfeM4k\xff\xf6cx\xb2\x13\xd0\xed\x8c\xa5(\xda\xf0\x02I\xcf\xebI\xe7\x86a.\x1aK\x1e\x1f\x03\xcc\x1d\x86\xefU\xf9\x1e|\xc4<\xb0\x04\xdaUi.\xb7\xf2\xda\xdb\x15\x87O\xf2 \xd24\xb1[4\x18*\x82t\xe0\x17\xe3\x99\xd3\xb3\x19\xfb\x10]\xee+m&\xf2\x8e\xdcX\xc8\x93g\x89\x86`y\xac\x9d3\x9d\x00\xdf \x08\xcf\x1a\xe2\x8c\xabn\xb7\xc4\x03\xc6W\xa6(\x95\xca\xe4\xd2y\x07\x05\t/*\xfd;}\x94\xef\xee\x99\xac\xa9[\xdc\xe7\x1b!\x13A\xf0\x97\x1dB]\x18\x1a\x84\x89&Iy\xcd\t\x18\xb1\x80\x11\xac\x7f\x82!g\x85\'<\xa8\xec\x95\x07\xe9\x03\xae\xa4\x1f\xb7\x8b\x92S\x0b\x89\x8cr/O\xc4Q.\x1e\xe1\x10\xce1\x9b\xcdA-\x07{\xdc\xc7\x9f\x1e\x84\xc9[\x8d\xa0\xcf\xb1\xee\x16?\xb0\xf5\xe0\x97\xab\xc7\x0e\xaf\xa5\xf7\x8f\xe6s\xcc\x81\x96\x8am\xc5s\x0b\xea\xe7\x903\x995\x96\xb4\xe5\xbf\xbdM\xbc\xa5\xf7\xb5@\xb0n\x1b\xcf\x1b\xdafF\xc7\xfd\x87\xf1\xaf\xcdTu\xb9\xab\xb2\x19rY\xcf\xcdb\xcf\x13\xdd\x84C2V\x1e\\\xca\xa4\xb7K\x0c\xc0&\xf0D\xe1\xd7\xb1\xe3X\xb6\x1d\xfc\x7f]6\x1e\xe7z"&\xa7:\x00F\x90\x86\x16{\xc3 F\xc6\xd2T\xa1\x10\xde5"\xc5\xb5\x1f\x95\xc4\xd2\xa7I\xe3\xaa\xbd\x19\xc2\x14S\xec\xdc\xf1\x05h\x8f5\x13\xae\x97\x7f9vm\xe3\x17\xac\xe6)\x87\xc8;\x80\xbf\xa7\xa9?\xec\xf6\xbcTI\xfak}\xb8\x9b\xb4\xd8\x8dP\x13(\x97H\xe5\xbcPg\xe7`\xac\x89\xeb\xee=\x94DX\x0eF6\x86d\xd1\x9e\xe7\xcc\xef8]\x9a\xbb\xf0\'\x9e\x8e\xafN\x94\xa9\x05Kg\x88\\\xa4\xe6\x9c\\BI\xba\x82\x1b\xcaa\x95\xb4\xa9oc\xa5\x1cc\x89\xcf\xb1W`W;\xc0#\xe2r\x98\x83\xcc\xfe\xde\x9d\xe6\xda\xf7\xf6\xbe\xfa\x8ct\x94\xf0\x93\xe3\xdf #\xbc\xdf\xa0\x832g\xb6\x06}T\x0f\x99\xf2\xaa7\x0c\x05r\n\xa9\x1f! \x94i\x07\x8b|4z\x13\xccx"t\xd2 \xe3U\xfc9\x8ev\xb1\x19t\x8c~\x1e\xef\\,\xc2\xb7Cy\x11\x1eB#\xcc\x81{\xcc\xdfP\xd4m\xff\x87\x91\xeb\xdf\xdd\xfb\xc0Nk\x8f\x98\xa3\xd9Il\xaf#\xf0\x86v\x04"\xe9_D\xd4\x0cZp\xce\xebE\xa9m\x97;\xc5\xe5\xfbZ\'\xe6s\x0f\x16A\xa6\xc8m-e\x04u\xf7\xbfY\x88\xd1\xa2~\x0c8\xd0\xf0\x0b\x9e\xdd\xd2\x92\x80\xc2\x0c\xb3\x03M\xdc\xbfb^\xe6`\xb7s\xe3\xa4\xd0\xf8\x17F\xfc\xeb\x10m\x1d\xf3Yg\x8d=r\xaa\x90\x9c\x07\x86:\x82\xe6\xe1\xf6\x05n\x12\x1b\xbd\xefh\x16\xf4\x01\x04\xe9y\xb3P\x1b\xb0\x1c^j\xb1\xa0V\xa66\xf3\xc9(?n\xb3\xa6\x05X\r\xd7\xd6\xacU\nb\x88F\xdc\x11\xa6\xd86\x02\xc6\x13:C\xea/\xe6\xbd\x10\x1f\x19\xa2\xef\x14\xf1\x1f\xee\xa1\x0f)F~\x06\x0bk\xde\xc30\x7f\xaf]\xbd\xb7"R\xa6\xb2e\xb0\x9e\xd4\x837\x88\x01\x8cR\xbc\xe0\xb4\xc9\xe3Z(\xe5\x92&u\xedR\xccK\x8cE\x19u)\xa5\xd2DlH6Hn\xa4\xd1\x11K\xcc$\xddI\xc5\xc05q\xc8\x85G\x1ebdv\x00\xda>\xb6\xedU\x99\xbc2\xf1\x0e\xf4L\x86\xbfP\xad\xc0ui)t\x8c\x86\xc6\x84\x97\x89\x00\xa0\xcd\n\x14Z\xde\xdb\xb2\xd6\xe2\x95\x04\x8d\xd9\x1d\xfb_\x95\xb4\xa2G\x02+M\xe5\xf3)m\x07\xf8u\xd3\x06\xa5CP\xabZ\xd6\x051\xdc\x1f+\xb6\xab\xe6k BB\x9f\xb6\x9f\x96CX$\x89R\x05\x1cy_A%\xc87\x7f(\x92\x95\xaf\x81k\xe2\xad\x8a\x00\x8c\xff\x9aKy#yV2\xdd\x84f\xa1i\xdda\xa0\xb8\xcb\x16\x01\x84\xcf\xa3!\xfa5\xbf0\x9a\x1f\xe1\xf6~\x96\x12\x82f,\x8ec/\x90v\xd6\xf5+\xd7\x17n2\x89C\x04\x88\x84\xc6\t\x96\xfcxN\x84\xbc\x86\xbc8\x7f\x8c/\x93\x8d\x9eb\xf4N\xf9\xa4\x92\xa2n\x9f?\xc4\xbd9\x8a\x10\x98\xe0:Ci3\x94\xc3z\xccI\x17\xdb\xb9@`/\xd8\xcf\xfd\xcf\x1e\xc3\x1f\r\xad\xc8\xc4\xb4p\x9e\xb8\x17\xee\xd0\xcd\x98:\x99\xfb#G\x0b\x94\x98\x0f\xed\xc9\x1af\xa6\xa1sJ\x8b\x89p\xd2\\\xa8\xe9\xb9TyE\x1c\xab\xd9\xe1\x90\x87h\x8c\xd9\x81\xbb@U\xd5\xd1\xfb!\xfb\x85D*2\x17\xcf\x0b\xed\x87\xa1\x85\xe0\x17|\x99\x9f\xd7\x8a\n\xf5!(\x98NFB\xb7\xff\xccI]\xa5\xb7\x13\x0f\x1b\xbe\xfdn\xbe\x99\r\xbei\xba\xb1\xd5\xcb\x1cK\xe2\x18uy\xd8m\x9a.\x01S\x08\xa6a#-X&\x04\xbe:\x11H\x9d\xb7\x9b\xea\xa0\xd6\x95^\xef\x92\x12C\xbena@/D\'\xd7?\xd2\xdf\xc1\xcdX\xceu.\xbdQc\x0b8&cz\xc2k\xf8M\xdc\x9d\xda\xca\x16M\x9c.\xc2\x8c\\\xc3"^T\xe3\x9c9gQ@\x05\xc8\xac\xee\xfaVPf\x7f\x98\xa6\xfa\xbeW\xa68\xc1\xc5\xd6M>\xb6\x0ca\xdbt\xa0Wkk+\x93VP\xcf\xf0\xeb\xaa\xa9;>e\x9ed\x9f1iQ\xfd\xe4\x93\x9e\xdde\x8b>\xe978x{\x08K@C\xfc\xb6\xe0h.W\xcbr^\xac\x865\xedX\x0e%\x8dR\xac[N\xf0\xa1"\x03\x89\xcc\x1f\x8e\xde\x17\xc4\xabb;?\x01(e]3\xbc\x94?\x84f\xbe\xac\xd61\x08dm\xbe\xa0\xe9\x90i3\x1a\x06.1\x8a&\xde%\x0cE\xdc\x1f,\x1c\xe0y\xe2(\xa6\x92\x0c\x86\xffW\xde\xf9\x04e\xcdoLwzA3\x83\xca\xa1gv\x95\xab}\x89\xdc9\x1f\xf8y\xa2RU\xf2\xbf\xeex\xd5sJ\xf2\x1d\x1bS\x9b\x1a\xab}\xcfK\xe3\xc4\xd8g\xc5\x9d\xf5S\x88T+\x9c\xb1\xa0\xff8w\x04\xc5\xa3\x1e\xe8\xed)\x07\xfa\xad%a\xf3\x0b\xe0\'1\xcc\xf7\x90\xac\x1cz\xbah\x16\xad\x90<1\x1b"X\xa7\xe2^\x9c#K\x87`\nc-\xe8\x96\x1a)V7\x07\x16/4v\xa8\x07\xef\xcf\xca\xae\x11\x03A=+\xbc8AD\xf6Q\xc0 \x91\x12QR\xc7\x0b\x07E\xd3\xc6A\x93*`\xeb\xc5\xb7R-\x0eg\x12\x98\xd0\x97\xa4[\xf1\xb5\x86\x01x\x1c\x1b\xcf\xfe\xa0\xa2j\x8d6=Q\x12\x85\xc5\xbbU\xb9\xe3\x804z|\xbd\xcd\x8f\xe0\xdd\xba8\xbb\xd3y)\x9b*H\xf3y6\xa1}5\xe9\xfa\xbf\xf0Y\x89\xa4f~\xfa\xa83\x9f\xac\x86\xd73ar-"u\xe7\xb1\xafL\x18\xdf#\x9ae\xfb\xfc\xe2\x99\xa6x\x8e\t\xf3\xf1/kr\xa5(i^\x95\x10\x08\xb9\xd6)\x92\xff\x06\x96\xbc_\xc7-u\x8d\x05\xc6$\x17\x8a =\x1a\x1d\xa8N}\x9e\t\xb1\xb5\x13"\x83\x00J?\xc4\x91\xe6\x0b\x99\x9cX\x9a3\xd1j\xb1\xab\x14\x07\xc9\'\xe0%\x87%n\x94}\xee\xcb\x81\xabv\x01f\xe2\xda\x7f\xb4rs\xc0\x17\x9d\x05\xc4\xf8;O\'\xe2(\xfc\x13\x08q\xd4\xec\xee\r\x9c\x1a\x8a\x99\x1dl\xbeX\x9f\xa4HR\xd3\x86\xcfQc\xe86\x18\x02 \xe3')
1
+ from flask import g, send_from_directory, url_for
2
+
3
+
4
+ def send_static(path):
5
+ return send_from_directory('static/assets', path)
6
+
7
+
8
+ def init_app(app):
9
+ @app.url_defaults
10
+ def add_asset(endpoint, values):
11
+ def get_asset(path):
12
+ return url_for('asset', proxy_path=g.proxy_path, path=path)
13
+ g.asset_url = get_asset
14
+
15
+ app.add_url_rule('/<proxy_path>/asset/<path:path>',
16
+ 'asset', view_func=send_static)
17
+ pass
4
18
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
19
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product