hiddifypanel 3.0.0.dev63__cp39-cp39-manylinux2014_x86_64.whl → 3.0.0.dev65__cp39-cp39-manylinux2014_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. hiddifypanel/Events.py +27 -4
  2. hiddifypanel/VERSION +1 -1
  3. hiddifypanel/VERSION.py +1 -3
  4. hiddifypanel/__init__.py +7 -3
  5. hiddifypanel/__main__.py +13 -3
  6. hiddifypanel/base.py +88 -3
  7. hiddifypanel/base2.py +40 -3
  8. hiddifypanel/models/__init__.py +10 -3
  9. hiddifypanel/models/child.py +26 -4
  10. hiddifypanel/models/config.py +105 -4
  11. hiddifypanel/models/config_enum.py +207 -4
  12. hiddifypanel/models/domain.py +106 -4
  13. hiddifypanel/models/proxy.py +55 -3
  14. hiddifypanel/models/usage.py +58 -3
  15. hiddifypanel/models/user.py +171 -3
  16. hiddifypanel/panel/__init__.py +7 -4
  17. hiddifypanel/panel/admin/Actions.py +170 -3
  18. hiddifypanel/panel/admin/Backup.py +80 -4
  19. hiddifypanel/panel/admin/ChildAdmin.py +122 -3
  20. hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
  21. hiddifypanel/panel/admin/Dashboard.py +70 -4
  22. hiddifypanel/panel/admin/DomainAdmin.py +195 -4
  23. hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
  24. hiddifypanel/panel/admin/QuickSetup.py +127 -4
  25. hiddifypanel/panel/admin/SettingAdmin.py +224 -3
  26. hiddifypanel/panel/admin/Terminal.py +51 -4
  27. hiddifypanel/panel/admin/UserAdmin.py +277 -4
  28. hiddifypanel/panel/admin/__init__.py +82 -4
  29. hiddifypanel/panel/admin/adminlte.py +13 -4
  30. hiddifypanel/panel/admin/commercial_info.py +23 -3
  31. hiddifypanel/panel/admin/templates/config.html +1 -1
  32. hiddifypanel/panel/admin/templates/proxy.html +2 -2
  33. hiddifypanel/panel/admin/websocket.py +9 -3
  34. hiddifypanel/panel/admin_2.py +33 -3
  35. hiddifypanel/panel/asset.py +17 -3
  36. hiddifypanel/panel/cf_api.py +35 -4
  37. hiddifypanel/panel/clean_ip.py +125 -3
  38. hiddifypanel/panel/cli.py +172 -3
  39. hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
  40. hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
  41. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
  42. hiddifypanel/panel/commercial/__init__.py +50 -4
  43. hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
  44. hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
  45. hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
  46. hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
  47. hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
  48. hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
  49. hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
  50. hiddifypanel/panel/common.py +98 -3
  51. hiddifypanel/panel/custom_widgets.py +71 -4
  52. hiddifypanel/panel/database.py +18 -3
  53. hiddifypanel/panel/hiddify.py +655 -4
  54. hiddifypanel/panel/hiddify_api.py +70 -3
  55. hiddifypanel/panel/init_db.py +393 -3
  56. hiddifypanel/panel/usage.py +85 -3
  57. hiddifypanel/panel/user/__init__.py +25 -4
  58. hiddifypanel/panel/user/link_maker.py +416 -3
  59. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  60. hiddifypanel/panel/user/user.py +233 -3
  61. hiddifypanel/static/css/custom.css +11 -0
  62. hiddifypanel/templates/500.html +1 -1
  63. hiddifypanel/xray_api.py +109 -3
  64. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
  65. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +69 -71
  66. hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
  67. hiddifypanel-3.0.0.dev63.dist-info/top_level.txt +0 -2
  68. pyarmor_runtime_000000/__init__.py +0 -4
  69. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  70. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
  71. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
  72. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,226 @@
1
- # 2023-04-08T15:11:21.540648
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xfb)\x00\x00\x12\t\x04\x00\tM\xec~\x8b\x98\xfc\xb7.=L:\xd8\'=\x07\x00\x00\x00\x00\x00\x00\x00\x00\xd5\x9b\xc9\xda\xff\xe7xl0T\xb6q!\x03\xea\xe6\xde\xba\'C\xde\xbd\xc5\xa5\tI\x9c\xc5{\xae\x01@<"\xa8\x88\xb0_q}\x87\x1c\x85\x14^\xf2\xedu\x063\x0e\xf3\xeb\x1b\x0f.\xbewu0G\xbeVS\xa8\x87\xdd\xa3\xf7\xbdl?\x8d\xa8IG\xa7\x86\xed\xc8\x85\x8az@N\x0e\xe2\xb2\xeb\xe1\xa0\xd0\xca2v\xcc\x91\xc46\\\x97\x10<\x00\x84\x15\x88\x85\x1a\xc1\x91\x94F\xae\xa4\xc1\xa7\xc0\xce\xb0\xc3\xa8a$\x18\xd2\xc0\xaf\xfa\xa1I\xcc\xa4\xef*:M\xd3\xccM\xe68\xf7\x15P\xb1\xe7\x17pZ\x9f\x9e\xfc\xe1\x82]\'&\x81\xc3\xcb4\x92\xa0\xac\x999\xe9\xae,\xa0\n\xdb\xd4\xfb+\x86\xdbr\xb2\xfa\x1fks\r\x19\xc5w\xc3Y\x7fL\xbf \xe6\xbfB\xae\xd8.\xebV\xacA#^\x82\n\xc1d0\x8av\xc3\xc49\x98\x08\xc0\x98H~\x16\xf5\xc1\xcd\xd1\xa9\x18\x8c\xb7|1\x9c\xac\x0b/T\xeaO\xdd\x97\xd7\x90\\\xaf\xc7\xc2s\x98#\x19\x88\xacL\x17\xf2\x0f\x02Tn\xc4\xc3\xc7!\x94\xb2\xbcX\xe4\xd3\xa0\xb3\xcae\xa8Ph\xf2\x0cv`\xcd1\\\xac\xe9\xb7\xbe\x88\xa6\xfaM\xf5\xc7^\xd5C9:\xc5\\\xc0(\x12Av=\xa1\xc3\x98:\xdc\xf2\xc0\x13]\xca#\xbe\x02\xc2V1\xf8F^\xcd\xf8\xaf\xdfk\xf2\xd1\xac\xefJA\xe3\xce|\xa0\xff\xbf\x11\x98ZY\xe1\xfb\x85\x8a\xb3dh\t\x97l\x0b\xa9\xfb\x1f\x17\x96\x00 \xf40\x1c\xe5\xc9\r\x84\xba\xd3tUYAN\'\x0c\xf45!.\x1b\x11{?\xd5\xe8\x93\xb4t4\'\x86\xac\x15+\x80$\xb3h\x14\x98\xe2\xebg\xbb\xecN\xb6\xb2c\xf0\xd9EP/\xbe^\xf9\xe2\xdb7/\x81Ip\x8b\xf5\xb2\x13\xa5"\xd4\x9f\x8d\x89F\xb2\x13\r<C!\x03\x13&O,\xe2\xb7\xa1\xa9\x17\x1f=\xa7\xb6q\x97\x83_\x08mA\xdf\x96\x95\xe1\xbfG\xa4\x95\x82\x0c\x07\xff\x93\xdf\xd9\xaa&\x0el\xead\x99?\xf8\xf2+F2\xa8\x9a%\x03b\xf9J\x87@@C\xd7\xe0\xfe\x1b\xba,\xad[b\xb9\x94\x1dg\xb0\xa9,\xdf@\xa5\xc7\xcd\x1a<\xd7\xcd\xb5d\xc5j{\xc8\xb4\xe2\xb4,n\xca\xd1Sk\x8d\xc9g\x87\xc4\xe7?\x9emB\xee\x90\xb1G\x9aU\r\x05\xf9U\xdc\xbd)d\x9d\xc1\xd7\xaf\xb4*KP\x9b\xc5\xe6\x11\xe9\x03)*B+\xbdz\x92\x16\xabJ\xebw\x05\xc8\xec4\xca\x02\xc6f\xe0\xbe\xaa\x8a\x147\xbd\xd3\'\xf3\xc1m\xd5\'(\xa6\xa6\x1f6\xc4\xd6\xb2V \xae\xfe\xcd~~P\xda\x04\x9c\xeae\'\xd4>u:\xe5\xf7\x81q\xe5\xfb\xa6+|\xda3\xfc8\x9e\xf5\x90\xa2\xd9\xfd\x1b\x88k\xe6\xce\x87\x0f\x91\xe7#\xe1\xf4\x05\x04`\x8e\xf5h\xbf\xa7Q\x92h\x7fz/u\x0e\xc7.\x16\xc4\x07\xe6\xd5\xa9{\x8b\x90\xad\xf5\xb6\xe3\xce\x9cO\x03\x94A_\x97\x1e8\x80\xc9\x13\x97\xff\xa5\xa8\xa1\xdcL\n\x16\xeb\xc4(\xdd\xf2_\xb3\n\xa4\xc5\xfd$\xe2\xce>_(\xed\x1d\x1e\x9e&\x15q\x14\xaf\x11-T\xb3V\xfb\x01\xe0\xc0\x84\x9f\xb7\x18\xbc\xd8m\x1a\xa2\x8b\xcaC\xbb\xd3\xf0?S6K@\x1c\xd5}\xed0\xc2\xdc\xd8\\|;\x13\r1\x01\xf1\xbb\xe0[^\xe0\xb4\x02\xc4]\x06\x0f T\xf6\x86c\xb7\xcbP\xc4\x13\x85\xf5\xaf\x03\x0fo\x0b\xbf\xfb|\xfb{\n\x8c4*\xfa\xf4A&\xc6\r\x83\xb1[H\xf7\x0es\xd7 >"\x96\xe7\xc0\x88\x18\xa9=\xdb\x91\xc9\x14\tuh9\x98\x1b\xd0\xfb\xf2.\x02\xe5\x83S\xf6\x91\xff\xff\x0c,v\xc0j\xf5\xff\xf2\xe8\xa0\xf7\x14\xe1a\xa7t\xf8\xfb<\x88f\x16\xb40=\xd3\x02\x88Z>k\xf4\xad$\xc7Z\xcb\xa2\xff.\xc3\xb2\x17\xec[\x02|\xf5\xd4\x05\xd5dX\xbb\xee\x7f\xcft[\xb9\x94\xdc\xfb\x0fVqL\xde]\x08R\x01JO~\xd3)\xfd\x05\x19\xc3:n\xa2{\x84\x18\x01\xca\x0fN\xce\xb6\xcb\x9d\x041L\xf71\xd60<6v\xce@\xdbd\x86d\xf7\xb7f\xf5Q\x96\x05\x04\x92\x7f_\xfd\xb7O\xe8\x1a#w\xbdi\xcfa\xf0\x1d>^\x99P\x84\x10\xbc\xe8\xd9\xae\xec\x1bA8\xfb\xa7_\xe4\xde\xde\xd2\x91\xcc\xe2p\xc68C6\xecP\xb3\x83\xa4\xba\xa1\xe0\xdb\x80\x0c\xc4\x9f\x82& \x83V\xc7\x16\x90\x16\xf7\xf0\x82{\xa0.\x13\xb8\x80\x14J\x9b\x1aF:\xd1\x1d\x1eP,\xa2\xccG9\xeb\xb6\xd7\x06)fs=\x87\xcf>\xb4\xa3\xc7l\x9c\xff;\x1c\xa6wn5\xe1\xdf\x19v\xc0G\x08\xba2O#\xf4\xb4\x07\xa7\xb3(\xfb\xbe\x9b\xc4\x17\xebC\x1f\xc4\x82D\x1buUV!\xe0\x8c\x07\x85\xd0\xf8t\xfc\xd4\xdc\x10\xab\x8a\xff\x99\x18\x0b\x87Ws(z\x82\xbe^\x87G\xa4\xda\x95\xdfS\x9a\xea\xec\xc7zh\xe5\x92;<\x08 A\xd2\x9261\x81\r\xa9\xa4\xb4\xc7\x90\xa3\x9b\xee\xfcX\x0c\xe5z\xea\xba`\x97\x92\x8d\xdbPl\xd5v\xa8|\x1f\xee\xf5\x10\x8d\x0f\x08j\xacO\x94\xc1\x12\n\x7f\xe0\x15\x83v\xdfC)EM\xe0\xc3/\xe4K\xe9#\xdc\xe6q\x02\x90j6P\xf7\x11g4\n\xb2V\x9eW~\x944\xa7x\xb7Y\xd6\xb0\x93\xcaY\xf7\x93F\x15V\x90\xa0\x15\x8a\x87$X~\x9b\x91\xb3]\xe6\x18]\x98s|\xaf\x83\x9d\\\xd4/\x83\x94ld\x93\x12\xf7*\xd1\x7f\xc5\xd0\xa7\x14?\xb3M\xdc&\xf7l\xa6h\x02\x04\x10\x7f\xc7\xc3\x1d\xec\xc3q\xe8\xb3\xc9\xc3\xe9\x0f\xdd\xc4\xffIlCN\x82\x9ak\xc5\xbe_I\xee\xde.\xc1*\x19\xc4c[\xa1\xf7I\xfc;\xbb\xf3\xdbR\x1a\x9ee\xd5kxm\x7fsf\x80\xb5\x03\xcb\xdfZ\xb8fe\x8e\xdd\xc6#\x1c\x81\xfc\x82z\xb0\x01\nO\xa0\xc7\xf0\x8e\xad<\xdej\x82\x01b\xad\xacb\x1bc\xcd\\\xc5\xeeYo\x10\x9d~NR\x94U\xec\xba/\x00\xd7\xaa\xa3_\xee\x1f\xae\xb0\xe6o\x0b\xac\xcalQT\x99Dr\xed\tO%4\xf9\x10\xcb\x99\xea$\xbd\xab\xd7\x0ep*,2\xc2FdJ\x7fw\x14\xc1\x14U\xdei\xabSoz[\xac\x19yu\x8a\xb3\x91\xe1A"$Y\xd4$\xc5|\xbb\xb6\xb2\xaa\x03\xa1\xae\x1bg\xb0\xbeMn\x15\x16F\xc6\x97\xa9\x83\xb6\xeb(U\xbcAWX\xdc\xacb\xe2x\xf4\x95L\xef\xf9D\x9e\xff\xcej$\xfb\xfe\xe4pIx\xffz\x91\xbe\xbf\xfeq\xe4\xa3\xc0\x04\x0c\xe0\x13\xe9\xd9\x8d\x88\xd1\xcb\xe9\x90\x98\x95\xc4d\r\xf3@y3SVfu\xa2/\'Z\xd7M\x059\x12\xa2\x9b\xfd\x8a\xe1\x1e\x95\x94\xbf\x02\xea\xd9kFAU\x9c\xb7\xcd\xb1\xfe\x82\xde%\x9a\xd814\xea\x9eh\xda\x95d\xd6epY\x06=\xe4\x00\x93\x16e[\xa6\xd7Q\xb0\xbe`\x97o1\xdd\xc5\xb7X\xb6\x97\xeb\x94\xee\xf0\x8f"\xec*\xcd\x9f\xff\x86\xcfF\x1a\xad\xf0\xff\x1d\n\xaf&i\x10\xb57\xf3\xb2\xb7G\xbb\x8ez 4f\x9ff\x12\xc7v%;\xf9\x88\x1b\xe6P\xc9\xbf\x91\\\x14\n\xe4Al$a\xc1\x1d\x1fYq\xd3\xec9\xa5\x1b+\x9f\x12\x0b\x89j\x16\xc8\xe8}\xbbC\x02\xa0\x88\xd8^|\xfa\x92\x8f\x06\xbd\xd3\xfc\x19\xe3\xf3\xf8X\xfc\x81\xb9\xa6\x9a\xbd\x86]A\xba\xf8\xc3\xb7\xa32\xfa\xed*\xa1\x05\xf4\xd8\xea\xee\xa1\xe3&\x87Q\xa6[\xb5\x18\xed\x86s\xebqM\xab\xc0\r\xab\xcf\x13\xfd\xe5p\xa2j\xf2k\x1e\x1eS\xad\xfel\x04mvF\xacb/\x0b9K\xe6\x9eh\x11\xc0\x19\xf6\t\xbd\xbd\xa6\x1e\x97\x1e;\x98L\xe2\xc7\x1fl\xf6\xf9\x05\xe5\xe9\x1a\x1e\xe4@\xa5\xf0\xa1\xb6\xf4cL&\xf2+\xcf\xab\xc6\xadI\xe2\xfe\xe3\xb7\xde\x11\xe2B\xd6\x16\xf8$\xbdSL \xff\'g\x9d\xa2u!\xf3!\xfb\xad}*\xc3\xbf\x05\xa4\x16\x11aen\x15\x96]Q@\xb1j\xd0\xd1\r\xd1m\x04\xee\xd4\xf8\xba<z\xdd\x88\x85\xdc\nP\x8f\x82\xdf\xb4f\x89\xcfG\x9d\xcfX\xca\xfe\x0c\x84\xd3o|\xa7\xa7\xba\xa0J yc\x1b\x94b\xdb\xb7R\xd3\x9a\x19\xec\x95\x984\x7fS\xa2\xfci\x1dq\xafU\x04\x08\x83\xcb\x83\x0f\xc0<\xf5\xdbW\xef10\xe8\xb6\x85@_E\x1a\xd3/\xab\x81~\x02\x9al\xa5\xa6\x93\x13\xac\x89\x05\x94[\x00\n\xb3:91\x0e\x1cY\xf6@\xbaS\xb3\xc3\x1djsa\xee\xb6\x01\x8e\x9a\x86\x9e\xd2\xd1\xc0\xd6\x93K\xd8\\ \xb2\xc1\xd5!\xdf\xd8\xfd\xb3\x1b,\x06j\x87\x8a\xc0\x9eG\xc9\x150~\x96\xf7n\xba\x9e\x9f\x18\xfd\xf2\x97\xb6f\xaa\xe0]\xe8\xf5\x80\xaf0\xf38\xd8\xb5z\xed\x05l\xdd\xe5\xc8\x87\x8d\xc5\x03p\xd0\xc4\x19\xdc\xcc\xe8\x9e\x1c\xdf\x80\xd4\xec\x80\x00\x93x>Q\x12\xa5W\xc0\xfe\xe1\x85\xcaO\xa6\x8c\xb4}=\x83\xc6h\xc1\x14\x99|\x1eX+i\x1b\xc4eN\x1f\xd7\x18\x12\x88\x02z\xf2\xda\x91\xb8\x8c\x95\x87\xe2\xd6\x83\xe3\xbdV\xad3\xb0\x15\xa6\x1b\x98\xa6n7\xcd\x8c+\xb9\x8d\x11\xec\x82\xa1^]+\x02h\x0f\x94.[=Z\x95s\x1d)\x9c\x10^\x87]\x1a|\xce\xca\xbd\xfd\xa5\x84k\x1aqS?\xe8A\x04\x15\x8c\x19\xda\x1d\xcb&J\xc0\x9b=\x02\x96\xe0\x1a\xf0\xf2\t\xf6\xfdB\x17?\x07\xa1\xb4\xe2P\xa4\x04\x9c<\x12`{\xfcya\xd3\x8fhJ\x90\x06\x1f\x81\xa7\x19\xb5\xca\x984T\xb6u\x7f#\xb9N\xac\tT\x8e\xa4Z6\x9byw<\x9dt\x1cw\xcd\xd8\xec\xedZ\xc2H\xf3z\xbd\xc2\x16\xccN\x06\x06k\x99\xc9$\x91\xbe\x83A7\x17\xdd\xba\x1cb\xd1\xbb\x93\x92&\x87I\xf7\x93\x97dl\x8d\xe4=\x08\x9fs\xeb\xd4\')#\x80\xb7{\x01\x1f\xee_%\x17W\xdeY\xde\x11\x11\x8d\xc6\xb9\x84\xc9w\xd4\x83\x0f\xa5S\xbb\xfe\xa3\xbev\xde<\xa8\x12\xf3\x1e`\xcf\xcc8o\tD\x8d4\xd1\xe9\xd2\x1d\xb5\xa4\xf1\xfe\x95\x89\x9ee\x14wu\xb8\xd0c\t\x18\x15\x99\x08\x18{\x8aM\x07O\t\xd0\xbe\x97)ns\xc6\x06\x9e\xd4\x11\xcb\xa0\x1a\x0cs\x83j\x95\x8b^\xceebdI\xc2I\xab0\xac\xbf\x0c\x92\x07\rY\xef\x8dJ\xe0\xf3c\xe7^\xfa\x92{#0\xf8\xc2\n\xca\xe3~|\xcb\x04PI\x87nyY\xce\x08k\x9b\x95a\xfd5u\x05"k|\xe5\xa6\xb2\xfdg\xc5\x0e\x04\xa9\xe7\xc7M\xc2\x02\xeb<^l\xc7\x97\x10\x92un\xe6\xda\xa3\xc5\x84N\xe1%o\xb6s\xaa$\x9b\xe2\xfdzt\x99\x8a\xc5\xeao\x83tz\xeauG8]\xb2\xdc\xef\xc0\xea\x19\x1a\x87\x1e\x80\xbf>\xf1,!\x8e\x0b\xdb\xc6\xcc\x8c\x81\xd6\xd7\x9dP\xaa|\x00\x13J\xb9\x8d\x99\x10@H\x9f\xd4s\xc5\x1d\xc6\x82\xb1[\xc4.,\xddbZ\xb9\xfa5\x9a\xb1\x15\xc4\xf6\xda\x80\xe9^\xec.\x8bk\xf5m\xc8X\x0b0\xa7\x1e\x8bh\xd5\xf9\x01\xfb\xbb\xbdF\xd6\xcc\xd5C\xfd(\xf87\x9eQ\x7f@\x02\x91\xb87\x83\x81\xab\xa74\xa2\x0b&\x0b\xa2\ni\xa9\xfb\xde\x9bf\xb3\xbf\xec\x83\x15kQF\xd0\xbb;\xe9\x05/i\x0eN\'\xd0wE\xbdg\xcb\x9eaV&\xe00O\xfa5\xaf\xf2A\xbbIk\x8f8e\xe2\x914\xdb\x98)h\xa2<\x0f\xf9\xf8\xe91L\x7f\x08\xa4l\x10\x98a\x0f\x1b_\xb6;\x86\xd2\xc4\x1f\xa2\xd3\xd6g\xd6\xa9\x07\x02\x93\xad?\xb7\xc1\\+\x90?c\x9e|\xf2\xce7\xec\xc7\xd7\xb6\xf5\xaeK1\x94\xb9:\xf2\xafF\x16\xaa\x80Kg\xed\x02*J\x01\xe0$\x89\xfa\x94\xb8\xec\x08\xe3\x8e\xff\xe9k\x0e\x17\r\xf8\xde\x16T\xff2\x1a\x85\x8e=\x10\xab\x8c\xcd=\xc4\xf9d\xe5\xfe3!\xf0\x1c\xaah2\t\xf3t`\xf1\xe9\xd1.\x92\x98\x07vL\xcd7r6\x18:\xf5\x84x2\x85\xbe\xf3\x8b[\xe5\x85\xf0l\xb30%\xa9\xd3\xd5\x15s\x1a>v\xb0j\xbc\x9bd\xe7\xf9\xef\x83k\t\xefXZYQ\x9bR\xf9\xa5?jYJ\x8a\xa9\x0eQ@u\x00\xae\x89D\xe9a\xa4\x9f\xa8\'\x05_\xce\xc4\x9a\xabUDx\xb0\xf1\x92\xb5\xfc\xa2u\xdc%\xd6gq\xaer\xdf\xc6\x97\xd3];\xa0\n[W\xef\xb2\x08\x17\xfe\x9a\xef\x16\x9e\xff9\x9e\'\x1d$\xac6?O\xa4\xc7:\xd2V\x0b\xd0\x07\x141D\x06\x98\xb5\x0e\xb6z-\xb7L\xb8\x07~c\x82\x11~ZQ-3\xf1\x1c\xe0p\xa1\xb5S|\xbfe\xad\xe5\xd1\xebB\xcb\x18f\xc5%\xda\xf74\xac\xd3\xba\xcc\xc3;0\xaac\xa5)@\x88\x9f\r\xb3%\xa7\x0fzB\xe0\x91s{#\xdb[w\x0b\xc0\xc2\xe05\x93\xca\x8d\xc2Tr\xed\x83\x95@\xa87\x0c\xf0;\xaa\x05\xd8\x00\xf2\x88\x03Q\xab&N)\\\xd2\xa9[\xa8\xa0s*\xda\xf7\xa6y\xacK@A\xed\xb3\xf4\xb3\xfb\xedS\xe5\xf4r\xef\x96\xb8;\x8c\x1e)(\x92\xa7~8\x1boN\x99\x0e\xfc\x1d\x157d;\xf5\x8d\xa4\xc0\x03X]\xbe\x90`\xd3D\x03\x04\x920\x18\xf6"\xd6\xfb\x986\x0e4\x11\xa2\x0b\x92j\x8f\x037\xa4*!\x02\xb99\x93\x00d\x81\xf4\xd3\xf2\xe9{\xd6\xb8&B3F\xfa\xe2\x05\xb7\x04B\x1fN$g]\xd7\xca\xf7a\x83\xca\xa0\x08\x07\xf1\x8f=H\x7f\xfa\xf3\xca\x95\x84\x9d\xf2\n\x90A\xa2\xfd\x0fB\x1b\x03\xe3z\xb1\xeaE\xd4\xc4\x15\xef|\xad\\\x1d\xdb\xddk\xa39GB\x06q\xbd\x0e\x15\xe2\x03\xd3\xd3\x8a\x08X;\x88\xdc2-U\xa9\x9b\xa1z\xeb\xa6q\xf4\xa1 <\x94\x12D\xc3vUP}\xba\x04\x11\x93{\xf7\x80\xa0y\xf0l\x8bu\xe5\xaf{\x0e\x8a\xa0\x86\x15\x02Q\x85 5L>*%\x13\nX\x86\xea\xabbQ\xa3\x1b\xaaF:y\xf3\xcc]\xf9\xf5\x18\x85\nF\xda+\x16e\xff\xb1\xba\xca|\xc6\x1c\x06\x89\xe9\xdeXw_Z\xfaV\xe8\x0e\x1f\xad\x8a\xfe\xdd\x80H\xd1\xbf\xf6V{\x1d\xd3\x80\x87[\xaf{\xabJ\xa2}A\xb7\xb6\x8e\x84k\x81\xa7G\xce+\xb5\xb3D\xc2\xb8\x99\x98\xc3(\xe2\x13\x89\xff\x97\xc4\x1f6\xe6\xf9\xcd\xba\xe4\x1d#V.\xdaw\x11\x8b_\x852\xe7\x98`\x9c\xbe\x03\xe6\xd7b\xb8_3\xe6\x1aN\xc6\xfeBI\xad\x93 x\xfe>\x01\x10a\xb84\x9c\xba\xf7\xfc\xa9\xb3h\xd1\xb9\x1au2\xde\xc1\x18Q\xc4AM\xf9T.~\xa2|(w\xe9BK\xc4\xc8=\xb1s\xfe\r\x80~\xf4\x9b\xb1\n\x9a\x93\t\xec0\xd6\xb2\xbd\x12\xf7\x844O\x89\n\xef\xb1\xd4\xfd\x90Q\xb8\xdf\xf9}Q\xd32\xfc\x03\xea\xa9\t\xec:\x94\x05\xacv\xb4\xc1w\xd9.\x1ey;\xa8\x7fY*]\x98\xf0U%\xc6\xf4A)\x8arW\x8ac\xee\x19\xff\xd7d\xf2\x83><O\x98\x95/\x02\xe6\x04\xc8\x8c\xf7{=\xd3\x99\xd7\x0bq\xe6^\x94[\xac\n\x05\x0c\xec1k\xfb\xb7\xf0\xee{g\xa71\xb3|,\x82\xe0\xccQO\x18m\xb7\xd2p.\xbc:\xe4\xbd\xb5\x15\xd3\xd3\x90\xaa9\xe6\xa0hkw\x8d(\xcb\xdb\xa91\xd5\x0e\xed\x16U\xc9]\x8fW\xef\xf2$`\x04\x98\xb0h\t\xfa\xad\x1b\xf7\x1c04\x86\xd6\xc4\x1e\xbav\xad\xb2\xd3\x0f\xef\xe0\xa3\xb5\x10+A\x86\xd2\x93\x84(g\xa9\x9b\xfa?\xc6\x97\xd3%S\x02\x85\xf0]\x18\xa2\xd6\xc8\x15\'\xa7\xbb\x86KtRA_c\xa2Kw\xbcj\xf3\xaf!G\x8d\x91s\xeb\xd0XwQ\x03s^\xe2\xd3\xf5(\x7f\x9c\x9b\xf1 \xf4\xa6w\x10f\xceP.\x15\xbc[\xaf\xa5\xdd]\nl\\\xcep\x13E\x9d\xe5\x00\x947v\x97\xfb\x19\xf9\xf8\x81\xe169\x9f\xdb.\xe1\x12\x9e\xa9\xf4\xb4\xc7a\xc6\xec\xed\x19\x18\x16\xbc\x12Kyi\xdb\xa40\xd0\x98\x98\x1d\xa7\xdc\xbd\xdb6r\xdd\xa6?{\x9c\x11\x00\x7fC?A\x00U\xd9\x84\xad\xca\xf4\xea\xef\xb7b\xd61\xe4S\xf5\xef"\x0f\xf7L\xe3\xe3\x96s\xdc\xd2\x84\x06^\'\x01\xe5\xbb:\xce\x12\x97\t\\\x9e\xcd\x9b\xd5B .X\x8by\xc8H\x8c\xd0\x16\xd6\xc6\xac\xdd\xa0\x93\x1b{Z`\x9c\xb2\x8cB\xecKu\x06\xa5\x8e5\xc7.L\x85\xbfR\xe0\xdeg\x86\x0e\x04\xc6_]\xb4\xffc\x93\x85\xaf\xb5\xc6f\x8d\xb9\x00\xbc\xf0O\x10\xd7\x13\x8f\x12iLF\xdd\xcb\xce\x91\ta\xef\xc7\xe1 \x08\x9b\x13\xd1\xbc\x10\x03+I\xfck\x93\xa5\x9c\xc5V\xf4\\\x83[\x8c\x06!u\x0bO-h\xf9"\'\xa5\xd9\xc1\x8a\xb6w\x1a=\x9f\xdbN2(\x10\xacQ\xbb0bXb\x08M \x83\xebn\x91\xdb^\xa1\xf0i\xdd\x97\x98\x0f\x1cX\\\xb6\x98\x05\x03\x8cYp\xad\x0e\x86\x9f\xeb\xac\xea2\xe7-<d\xbb2\x11\xd0\xcf\xdc\xb2\xc0$\xe0\x97\x93\xca\xbb\x00;\x93\xea\x0c\\\xaf#\xda\xa4\xc2\x01\x9c\x9b\xe8\x0b\x05x\xb9:\x9bLw\xff\x9b\xb0\xf7\xac\xb93?\xa8j\xf6x\xf0:\xbc\x94\xd6!\x01\xbd\xedR\x86\xbc\xc3\xf8\x13\xe8\xb8\x1e\xcc6\x10\x915\x85\xe1\xcb\xc6{\x01\xa5\x06\x9d\xe5\xee\nQ\x1d\x18\x1b\xf1\xd15iz\x94\x86a\x89T\x18\x1fW\xf5\xa6\x12\x1c\x83\xda\x01\xd7\x15`\xdd\xfb\xd0\xbf\xe4j\x9ap\x080\x1b\xe91dtk\xeerc\x9a_\xfbQ*4E\xf3\x0f\xbc\xb3\x92\x0f#\xe7\xa7Q\xf8e\xf2\xca\xb5\x80\xa7d\xbd$F3\xc7\xc1\xa6J]\xc5\xaak\xcb\xec\xf2\x8b\x93~S\xc440\x0cM\xfd\x02yMEE\xc3\xc8X\xf9\xf1\x17\x9c\xc7\xcc\xae`\xf6\x97_\x87\x9c\xb8\xde\x99\xbbZk|\xe9z\x9ad9\x9a\x11\x8dy\xd5\xd1]{r\xf5\x8b97\xfcl\x16\x9d\xe4\x96b&\x8b\x17Kh\x80K\xe4&\xdf\xb0\xf8 \xfa\x10\xbd\xec\x9c8\t\xf5\xab\x13\x1ei\x8d\x11\xa6\x00\x1f\r7\xcc|%\x9d\xab#\x04\xed_i\x18\x08\x9e\xc8\x82\x14\xebm*\xc7\x92R\xd1\x8d\xb1\xc5Q\xfc\xf0\x92\x87\xe1\xf0\\Ga\x04\x03\xc3\x87\x92\x0b~\xb0\xcbg\xe3\x8b\xda\x03\xefu\xfb=\x0f\xb3%M\xc0\x895\x86\x13W\xb2S~\x82\x88\xe6\xab\xe5E\x066\xd8\x9f\x02N\xc7y\xf8\xf4t\t\xf9H\xdc\xd6\xadN7\xac~\x98]\xdd&\x8d]\x94s\xd0\xa1\xbc\xfe2\x83\x1f\xf3U\xf8tit\x1c.\x13%\x98[\x1b\xb1\xf1\x83j3k\xfc\x00Wk\xf0W\xaf\xd7D\x8aO9/\x8f>\xc5~\xacF\x0bO\xac\xe1\xed\xf8s\xe9P\x10\x9c\xc5\xf8\xb2\xb5\xf8P\xab\x15\r\x95:(&\x84\xbe\xa2\xce\x14\\\xda6\x7f\xcb\xddt:\xc7\xc5\xffM~R8\xbaH*\xe6^\xde\xc9\xb45\xd7j\xd1T\xda\xb9\x14\xea,p\xc6\xfe\xb9sv\xd2VD#b\xa2\xc9H$:\x86\xdb\xc2N\x85\t8\x07Y\x08=\xa9\x9d\xf0zr\xce&gw1\x1a,~\xd9)\xfa\x8e\x025\xa9\x04\xbb\x16\xfe\xce\xe7\xc8\x0fK\x8e7z\x85\xe9\x19`\xa5e\xf0\xefO\x84\x9f\x17\x0fr\xb4\x1cS\x9e\xeb\xf2g\x98\xe6\te5&\xe5>#+\xc7+<X\xbd8\x8c\x05\xf3\xa8V\x88\x7fF\x8b\xe9\xca\xe7\x98\xee|\xc1\x89\x91O\xc8BX\x8aN\xae\xb9D\x06\x18\xe6\n\x1e@\x17*7<\r\x9a\x8b\xde"\xe77$\xe6:[~E_\xf4\xc13\x9e\x8f\'bTR\x1dc4\x9f\t\x1f[m]\x97G!\xcc\xf3H\xf2\x80\xc3x\x86h\xc8>\x19\xc2R\xf6\xb6!\x94J\xbe\xb5\xaa\xb9\xf3oH\xef\xf0\x91\\9\xe1e\xbcI\xab\x1a\xda\xbeN\xa8u\xde\xc6y]y&\xebp\xad\xf7\xb9\x1c\xfa\xff_\x91\xf8\xe5\x1d\xbf\x08d=\x9c\xf2\xb4\x8c\xda\xaf\x13\xda\xad\xbfV\x16Z\xcf\xf8\x86\x9e\x9ff\xd0~\x14M\x05!4vY\x01\xe7\x93\xc4\x85\xe0MA\xf5\xa8\xdf\xbb\xc8)\xac\x8fAq)!?=\xd9\x92\x1e\xb4\xe1\xe1|\xa7l\x8e\xff\x1d\x08\xf8\xb8V\xb3s\xdcx\x1f\xcd\xdb\xcbp\x99Jl\xe9\x1d\x97|8\x17\\\xd0\x1c\xaf\xfc\xf0\xc0\xbd\xda?\xd1,\xb7#\xf8\xb9\xe6\xe3G\xcch&\x8b\xf9\xb6%:\x83\xf5\\%e\xac\x0c\xbf\x18m\xd3\xcc\xe0\x80\xac\xc0\x87\x14\xba\x8c\x8b\x8e\xcd\tY*\xe4\xb0\x99\xbe\xa6\x17\x809\xde\xa8rE\xb3\xcd\xf9)\x8b(X\x12\xef\x8e\xaf\xb8\xd3__7\x9c\x0b\x7f\xcd=\x88#\xe5-\xc0j\xf7+\xc8\x8e\x8b\xfc}^[h\x9f\x15E\xdcD(veR\xfbqzmX\xc3VCV\x9d\xa7\xa4\xfe\'\xa8\x87\xe0\xea\xee&\x95\x96\x8c\xeaw\x8f\xc2LmA \x9du8$\xben\xa9W\xe0yr]\xa5\x8d:\xe7\xe9\xc1\xfc\xd1t\x08\xb8\xdc\x9d\x90\x0f\xd6Qv\xfb\xd5\xc7k\xe5\xb90}^lG\xe4\xc2\x1a&\xab\x8d\xe8\xe8\xe6\xd5\xad\x98\x0c\x1bT\xdbJ0\x8b\xfb\xc4YO\x9aE\xb2!/e\xae\x1cS\x9e\x94\x93\xe0uK\xe3\xce\xd8g\xb9\xfa>f \xa7\xcf\xae\xb6\xd6y\x82\x18\xe9\x83\xac\x9f\x07*\xd1\xbf\x95\\=K\xdea_\x06Q.\x80E\xe0\xbb\xcc\x1a\x02\x99\x9bF\xb4\x8e\x0b\x82\x8dN|\x10\xf4\x0c\xecx\xb7\x13o\xd9\x9d\xf3cU\xf8\xa0s\xb4)\xe9Q\x99\xc4\x1c\xca\xbc\xb4\xa6\xfbx\xf1\xfdU\xb8\xcf.\x95\'\xd4\xbb\x04e7\xc9\r\x08\x7f\xaf\x02\xf4Xv\xc5F\x97\x18u\xba\xdf\xb8)\x16#K\x00\xd3\x18\x0euX\xb86\xd9\xf9\xf5\x06\x0c\x10i\x11\x1d\x80\x90q\x89\x1d\xc6\xae\xa4\r\x99)0"\x1eZ\x90\x9cGi\xa4\xf2\xe5;\x8b\xfe3\xf7\x90\x87\xaf\xec\xcbV\x17\x9bx\xbd\x170M\x9a\x993\xf8\x98r@\xb2\xab\x13*\x9bB\x90x\xbc>}\xd9\x19\xf1\xf93\xff\x05\x12\x07\xddw\x0b\xaa\x11\x86\n\xbf\xa7{\xc8#\x18m\xca\x98\xcc\xf6\xed\xf2~\x1d\xa7s\x9cS\xe6\x19\xf0\xea5`\x10\xc6\xd8G\xe0\xdc/K1\xfe\xf3q\xe4l\xb2\xf6.\'\xbe,?\x0eB\xfc\xf7u\xfc\xba\xdcNF\x80j\xc0l!\x82\xcc\xf1Y\n\xe3x -\xfa\xe10\xf9\xdd\x1c\x03\xeckn^d\ri\xa5\xf2\xd0FE\x8c\x08\x13I$\xc8\xe3%\xa8\xac\xc1\xecw\x08&k\xdbA\xb5\x807\x1e\xa5b\xc8\xc4\xbb]\x86\xf5\x89\x86\xfe\x1c\xf1\x03\x9e\x1d\xbd\xe1\x01\xcc\x8a\xb1\xf1o\xde\x91\xba\xc6v\xf5\xf9\xb1\x9e&\xd6e\x06\xca\xf9\x80_\xd5\x000\xcdc/\xb2\xbb5N?a\x18\x15mM\xa9\x8bS\x9b\xd3\x84\x18\x89>Gv\xd7q>{@\x92mG\xa0\xb3\xa2\xef\x0e\xe2\xa5\xab\x84O\x147\x81\x9e\x92\x0bU\xc8\xaa\x80\xb9\xf2<*^"0\x86\x1fZ$\xcd{\xcb\xfa\xf97\xec\x18O\x1b0\xfc.\xdaE\xf7\xc3\xfa\xfdL5\x07\xa5p-\xfd\x8d\x05r\xf0In!\x12\x87\x08\x18Dm\xbc\x89\xe4\xad\t\xbb.\xc2Z\xbeaR\xa4\xdb\x16ww\x04\xf8\xe0\xee\xdfD_\xa7.1<\x00\x96\xf2\xf4f@\x0ccv2\xe7\xe7\xbbz\x11N\x92LS\xdc\xf0\xebI\x00\xa1\xb9A\x9d`\x83c\x1c]\xd2Z\x9d\xa2\xd0p\xd6uP\xef\x84\x0e\xeat$\xf0\xedH\xc83I\x1c\xfd5\xbb\x0f\xb3\xb3X>6\xd5\xea\xbe=i\\\x18\xea\xd5\x8d\xe8\x14\xa6\x1d\xda\xbd\x84\xc7\xb1\xeac\x8f\xb9>\xb5(\x19o\xd6\xd0Ry\x93\xb3\x08\xd7\xccR\xe5\tp\xba\xf8g&\xcdq\xaf+p\x9a\xf2\xadS\xd7z\xe6\x07\xca\x88\x8a\xdf,\xd06\xb1\xf4\x8a\xc1\xf5\x18K\x9d\xdc"\x1b_oA:x1\xb8\xe4\x06\xcf\xcd\x0bg\x06\xa5\x9fa\xeb\xf2O$\x97\x89\x15Vg\x9a\xb8\xfa\xab\xe7<\xe4\xa5 z\x1b\x1b\xc8\xdc`\xd6s\t\xdf\x07\xe1\x11S\xf8/\x96\x13).\x8b\xdd\xa9\x8c\xfd\x9aE\xfe\x89\xb3\x87\xab FN\x10\xdd\xb0\x18<\xb3\xcf\x83h\xc2\xdd=mb\xd0\\/\x8dJ8\x07\xa2\xec\x0fw}\x039\x0ea\x7f\xca\xa52b\x15HQ\xa7\xa2\x1a\x83\xf5\xf9\xc0!\xcb-\xef\x90~\x0b\x18vxyy\xce\xbf\xdf\xf6\'zv\x15\x9a\xef\xed2\xbc\xe21\x01.=\xccf\xf5,\xf7\xfe\x9a\xfa\x00\x8d\x83\xfaL\x0c\x8f\xdb\x06\x18os\xad\x02\x1cQ82\x88\x1f\xa8\x80\r\xa97\xb3\x0c\xd9P\x88\xc4\x01\xa4\t\x9e\x06g\x90l@\x8f\xba\xd6HV\x18<\xe2c\xfb)T\x1c\x8b\xc4\x81\xb0A\x19\xfb\x8a\xa0\xaf_.\xe7Zk9*T\xe0\xc9R\x12r\x04,\xc6\x817\xfe\t\xc8\x05\xb9\xc1\xffP\xd4\xc0R\x8av\xd6\x86;,j1\xb4\'\x17\xc3N\x1a\xf9\xbae]l\xe1ZDh\xdb\x95,F&\xb7\xb4-\xda\xab\x16\xc9\xfd-\xd9y\x98\x82@\xad\xacH\xcf\xa0Zv\x8b9\x86"\x18\x8fu\xe0\xbf*\x05[\x89E\xa4\xf2Ah\xb7&\xf0\x1c\xa9G\x1e\xd1W=\x88\x83<S\xe9\xab\xbf\xed\xf9\xd6\xa7\x9c\xfd\xe7\xb6R\xc9\xb5Y\xa1\xbd\x1e\xb9/\xabB\x14\xb2\xd6pb\x87\x91f\x00\x00\x00\x0c\xef\x12\nt\x02r&>H\xbb\xa7\xf0\xa7\x81\xc1\xbbG8\xbf\xbc\x19\xa5\xba\xdd8\x8f\xab\xe9w?\xd9\xc5\x929\x16\xc6\xcc\x97\x080\xa9=\xb3\xcb\xa1\xd8j]\x91I$\xf2\xe0 \xb7\xe4\x1c\x88\xb3\x12\xce\xdb\xf3\xb2[\xc3\x9c\x15\xa5\xd3\xa2\xb3^6\x01\xbd\xe8\x9e\xbf\xa5\xef\x91\xe6\xcf\x1b\xb4\xf6\r`\xd0\xb7\x153\xa8n\x98\x92@$q\xea\xfe\xef\xa4q\xdc\xd1\xb5\x10\xcc\xe5;\xb0\xa0\x9e\xc3@^\x0f\xfc\xbf}\xa9\xaa1\x1f\x16_(&~\xbd\xe5[\xf3\xfb\x07+\xb6\xa8\x17bh\xa1\xe4\xec\xe0\x9c\x11oIpI_\x9d~\xec\xc4\x979\xfe\x8cm\x12?\x9c\xb4\x079\xf3\xac\xe4(>x\x9d~oc\tt\x05\x18\n\xe0\x89\r\x85\xb37Sg\x81\xed\xb4l\x02X=&Ak\xe1\xa3\n\xad\x9a\x18\xa0>\xff\xbfA>[]i\xb1d\xe3\n\tEN\x0b\x90U\xce$\x11]\x84\xd5]\x93\xe1\xc7\xe5\x84\x0c\r\xbc\xfbP\xf5\xa9glx\xa1\xc8\n\x98\x8ax\x88\xf5\xbb\x8dF\x84\x8e\xcb\xd5\xd5 \t\xacG\x86\xf9\x07\x0cl3\x9a{\xc6\xf6\xd1;\x1eK\xfd\xd2m\x80\xc2\x17LUaOs\xcf\x9a\xe4\xe8HL\xee[\x1d\x99q\xd8\xbe\xb3\x8bSM\xc0"\xff\x92n\xe6\xb4\xd5I\xd1+O\xa3\x17\x1cw\xfbo\xfc\x87+:u\x02\xb2\xd4F+\x0e\x97\xbb\x98\xf7\x1c\xd7\x91g\xb2\xd4\x05@LT3l\t\x10\xd6\xa2\x1b\xad\\\xf6U\xff H\x19\x8f\xe4\x93\x94M\tW\xbf\x84\xd6\x06\xf1\xc9\xb3\x01\x11\xa9\x12\xa3\xfc*\xda}@\x93\x17\xc2\x99I\xe4\xc5\xcd\x18\x01\xa3Y\x8b@\xaeYi\xb53\x82\x18\x05\x16\xa7\x8c4&R\x12\xf9\x19\xd4\xfc\xd9/\xd0\x84\xd0%u\xef?Y\xbcA\x10W\xa8\xb2\xdc\xeck\nHT\x06\x06\xcd\x84\xc3\xcf\x10x\xc3PQ4\xec\xa8\x8b\r\xdd\x8d\xdc(\xb9\x97\xa3=\xd6A0b\xddo\x80#\\\xbdQq\xef\xa7\xd3\xdc6\xf9zQ\xa0\xbc\x03W(`\xa7\xa7\x1f\xb1\xdb\xfa\x1f\x86A\xa1\xcd,\xf9W\xa3\xaf\x86\xc0A-\xc3\xd6\xc9\xe2\x9a\xcb\x93\xc9k>5\'\xe8\xcd\xd2z\xe7\x8d%a$@\x14\\\xd2Bb\xe2\x8e\x8f\xff\xf8\xebqo\x9cd\x08\xf5\xaeF\x81\xdb\xfb\x9dt\xbb\xdd\xeb\xbc\xde\\\x91\xc6\x86\x9b\x11\x92\x16n\x17W\xc1\x96\xd0u\xb3\x85@\xa6o7\xbc\xb9\xd8m?\xf6\r\x1d\xceB<@1\x1e\x1d$o\xcb\xa1\xa3\xe5\x05\xee\xbe\xfa=a\x8eJ*\xf3_\xd8\x03f\xf3y\xc7\x10D\xe4\x0f`f\x16!\xc9\x8a\xf0\xb7\xbe\x1d\xb1\xe6\xeb\xa0\xfe\xce\x11\x1cc\xc4\xda$j)\xc2\xb4\xccu\xa6\x13\xa8\xa1\xc2\xa0\x8f\x84\x07\x89\xeb(\xf0\xdd\xba\xe4nh\xb96\x9c\x18\x90\xe2{\xbam\x90\xfc\x1a\x9c\x1f\x15\xe5u\x85\xe6\xc3\xeb\x00\xe1W\x10o\xfb\xfc\x1d(u\xfch\xdem\x92y\x80b\xfa_/\x84\xe0Y\xbbz\x7fi\xcd\xec\xe5\x9d\x05\x08\xf9\x1f\xd4\xb4t\xc0OoSH\'\xba\xff\xea:\xf3>\x01\x94\xb9c\x8fV/\xf0\t\xf64\x89\x0f\x90T\x84*\x0f-\x7f\xcd\x0c$\x83\xbd\xc1\x96E\xec\xf4U\xd8!L\xa54<$Q_r\xdfy_.(@\xedi\x9dS\xfb\xff\xdf\xd2\x1f\xe7\xcf\xd3\xb8\x88\x87\xed\xfd\x0f\xea^\xf5`\xd8\xda\xc2\xecc\x9civy\xfd\x87!I\xb0N\x8bk\x7fxP\x88\xa8\xc7\x06\xb59\x0e\xf6\xc7\xcb)\xfc\xdf4\xb8W\x14&7%o\x98e[\x9c\x1a!\'\x8ctv\xff)\xeeA\xfd\xaa4\x14\x02lu\xa0\x83\xc7\xff\'&C\xe7\xab\t\x16\xf4\x0fKs\x07\xd9\xc7m\x84\xdf_F\xac\xbb\x1f\xaf\x8c[\xd6Ls:\x88d\xed,\xa0}*$!\xf1p3!P^\xd6\x1aMed\xb0\xea\xae\x9f\xe4\xe6\xd6f\xf08V!\x92\xf4\x0b0\xa9\xf8\x95\x0e:4 \xbc8%W\x85\xdfY\xf51\xa4\xe3\xa3\xb2\x96\xb6\xdd\xaas\x85:dL\xb8\xabX\xf1\xb2\xf25\x88\x8b=\x19o\xce\xa6\xccS}\x1f\xb3\xe4\x18^\x85\x12\r\xe93@\x14\xd1\xaci\xcd\x8b\x00"\xf0e0\x8e\xd8\xc4\xbb+\xe2\xd6\xb9D\xbe\xcb\x1b"B\x9d\x8dG\xf4+\xb6\xd8\xe85\xf40y\x88\xe8\xa1(<}\x9cB\xf1\x8a\xc46\xcd1\xa92\xfcA\xbaY\x83\xc5]X\xe7\x9cd\xa7\x81\x95.\x03-\x1e\x1e\xbe\xba\xd16\xb8\xe5\x9aP\x89\x18 \xf6\xf4\xbd\x1cH\xd0uE\xb6\xa0\x0f\xb9\xde&\x15\xaf\xaa\xf5M\xd5\xd4b\xd8\x80\xba\x0b\x90\xfd\xd2^\xa6~\x14jhp\x8cW\xdc=\xee\xc1q\xd2\x19\xa2\xa0\xfe(\xfd\xb9\xffk6\xb47\xca%c\xc6\xd8|E\x00u\xd6\xcb\xae~\xcb\xe5%\x7f\xf4\xe5,^>\xd6djBY\x92\xd6\x96(\x8d\xaa\xbd\xd6\x04\x04R\xba\xbf[U\xaf\xd6W\x9f\x9d\xeb\xc4\xad\n\xbc\xac\x01\xf2[\x0f\x08DT~\xe5\xf7g*\xb2N\xdf\x00\x96\xb4\xc5\xd36M\xf2\x1f\xdf\xee\x0c\x9fn\xd3\xe7\x1a\x0cw\xc9\xf6]\x853\xb0\xd6\xa5\x94\xfeV8\x18~m\xac+`\x82e\xd4\x01\x0e\xb9\xbb\x9a9?\xa6\x87\x1eI\xb6\nb\xb9\x92\x9b\xad\xaa\x84\xf0\xfdF__A?\xe9\xfd\x00O\xb4\xdfa\x98\x00D\xe1\xd43\xd0\xdcyY<\x1f\xe5l3\xecd\xbb\xde\x97\xf2\xa8\xa5W\x10{G\x01\x87\xe52\xd7Fw\xd3\x90\x10\xdf{\x89\xe3r\xa1\x87\xa2Q\x13\x7f\xc1\xc7,\xd7\x86\xa5\xb8=U\xfd\x97\x8f\xa4\x07G\x85\x82r\xbaskzUB\x1b\xeb\xc2\xdd\xa6\xf0\xff\xca7}\xf0\x95\x931y\xb5\x9b\xe0\\\x8a\x108\xe8\xe1\xd3\xe5\x1b\xad\xfc\x99\x1d\x1d\xf5L\xd82Ok\x13Cy"\x1f`\x80\x85\xef\x0f\x9f\x00\x1cr\xef\xfd\xb5\x948\x9b\xa6+\x9c\xe5\xd1\xc5\xc1\xa3p,\xbc3*\xf9\xde\x06EU>\x00$\\n%\r<\xec\x1cJz\xfc\xd0\x9a\xa9\x9c}j\x0c\x1fa\xd8]\x04k\x01GZ\x16\xb7"p\x9b\x1b\x80nDoZ0\x80et\x8be\xd7\xed\x9e\x85v9g\xb37\x05\xe7\x0b~*\xd1d\x15\xafz\x89\xf8\x0c\xbfY\xc7\xe0\x0f[p\x1e\xdfea/\xa0SfS\xaf\x8f\x9f\x17-\\#\x17I\xa7E\nwi\xee\xff(f4\xc5\xed\xbd\xe1\xb2\x0f\xe1Q\x01Q\xbe\x89m\xd4a\xc2,\x9c(\xc4[X\xb3\xd3h\x801\xc6\xc6\xa3\xb5>\xc0\xff\xd5\xcd\xad\xb8\x16\xe3\x8c\x95~\x93\xc0\x89\xeb\xbf8\xe2v\x9d\xfaJ\xf5Z\xc4BP\x1c\xaf\x9a\xb5-Y\xf2\x18`\x1dN\n\xe5\xba\x92\xa4^^q!\x118\x82\xe7\xcc\xc6\xd2\t\x8b\x04x\xda~}\x04\xc1T:\x94\x88O\x81\xdd\\tz\xd3\xd9\x1f\xfa\x11\xc8\xe24t\x035s\xa71\xb5\x9ap\xcb2\x9e\x9f\xd1\xd5\x97\x95\x16\xe0\xfc\x96.\x9c\x1f\x85\x90\xb3\xee4lg\xbc\xeb\xceCl\xd0@r\x83\x96\xa7\xd8Y\xe7\t\n\xbbO\xd3M}e@\xc5\x8e\xf5\x08\x91\xaf\xc9\xf2Yn%\xd2P?is9~\xd3\xf6\x94\xe2\x05"?\xd2\xa1\xed\xdc\xc9E\x13\xcdS\xc2MY\x1b\xe6\xf0\n\xf8\xee\x1f\xb8~u\xcb\xee\xb8\x9f\x94E\xfa\xdb\x15\xde\xc2\xd3\x93o~\xd2\x82[{\x84\xe6\x98\xc3\xd1\xcd\xf9\x1ag\xbb\x90XK\x0c\xf4\x18\xc1h\x89d\xbb\x82\x92\xa8(\xd6.\xcbLX\x1f\x08\x9eL\x87\xf4z\x05\x02\xbc[\x9c\xcbz\xc5\x9dW<\xc5\x19># \x94\xbb\xfb\xb9.\xe6\xa2\xe2\x00\x88\xdcaA\xb8\xd18I\x12\xba\xa9\x8e\xd1\xd3\xaa\xc01#\xbc\x0c\xcf\xe0Kr)\x128\xae\xed\xfb\x9b\x88\xaap\xf4D\xf5\x0ecN?\x86\xbd\xa8\xeda,\xcc\x84\xff\xce(n7n;\xac\xcfu_\xe7W\xd3xDN{\'\xea\xcb,4\x96\x85\x15\n\xfeod\xc1\x16\x12\x1c\x12\x94:\xd5<\xe6\xd5b\x17B\x9a\x88\x96S\xcb;\x0c\xd4\xe7|r\xdes\xd0\xcc\x0cT\x9d\xd4ho\xe0\xda\x11\xb5N\xb4\xa3\x8f\xae\x1c%\x97H\x81\xcc\xbd`7\x9f\xdd\xff\xd2\x15\xa0\xd70\'-[5\r.\x84.\xd4j]\xf2Y\xdd\xc1w\t\xa9w\xd9\x1c\xe7 f\xfa\x9dl\x14*\xcf\xed\xb9\xb2r\x93\xbd\xfe\xad\xbf\xaf\x9f\xed\x8d\xafG\x99\xe6\xec\xd1\x01J\xa5,+\xe2\xbc\xfc\x124\x9d\xd9\x0b\xd58\xdc\xb3\xa3\x1c\xbe>\x8e\xcf\xf4 \x13\xc0<x\xa4|UFE\x9e3\xa47\xee\x1e\x06N\xb0\x82\xa9\xea8\xb9O\xb9\xdfO\x8e\xd6\x18\xd9\xaas\x90\xcfJ\x93\x7fQ\xbfcB\xbc\x85ZmF\xb5.\x12TEr\x02|:\xb5\x1b\xfe|\x8e\x8fF\xcbU(}\xc2,w!\x0f\xda\x9fR\xfc"\';\x16\x94\xd0\n\xe0\xbeC\xc2?\x94cL\xe98D{\xa8\x8c\nN\x8d\xaeQ\x9c=\rk\x1b\xa7h\xa1X\xea\x95\x1at?YF\x18\xdeD\xe8\xa6\x08x\xe4\xf8\xed\x98\xe2\xae\x8f\xaaV\x80\x8aP\xa1[\xfd\x13\xfff\\G\xba\x8f\x18\xce#*+Z\xbb\x87\xbfrg\xdbPUz\xeb,kJu\xb9\x96\x86\xa0\xf3[\x04\xfeq\xdaRzR<\x0c\x88\xb0D\x9esSH\x8do\x91fR\xa6\x11\xda\x94q\x84\x0c\xc7\xc7\xf3\xab\x10Z\xcd\xff\x1dZ\x12\xe8\x8b\xe1\xe0\x021\xf5C\xad\xe2|\xe0\xcf\xb2@\xe7\xac\xab\xc1\xafe?P\xf1\xb8d\xe6\x0eUV\x06\xd5e)\xb6\xfb\xb7\x91\x1e\x91\x98\x97\xce\tCL\x9e}{=\x130u7\xe8*\xcb(\rk\x9a:\xcf\xdb\xddW\x1b\x17\xcdNpdx\x80b\n\x83+\xf5\\\xbf\xb0\xd1\xb0\x80@\xddq\xdd\xc7\x82\xbdU\xa4\xe1\xd5\x17f\x81\xe3\xdd\x9e ~?1O\xcd\xf1O\x16\x91\x7f\x19\txK\xf2\x15Z<\xd4j\xb3ZH{2\x97\x13hjW\xd3\xdd\xd3\x8c\x7f\x0c\xd5a3\xde9E\xb2\xb2\x9a\xd62\xe5)\x92c\xd2Z\xc2N\xb7\x19\x9b\x8e\x0e\'.\x8d\xc3\xafEy\xb8F\x1cq\xa5\xcc\xfd\xe6\xc6\xe2\xfdGcxQ+\xe8\xecu6+\xa7w\r\xd08\xda\xc3H%\x1c(\xbb\x19\xd6J\x98\xbd\xf9#T\xa57G\x98\xca5@M!\xa1\x03f\xa6}2hr\xaa\xc5\x82\xed\x113\xe5\x06\x83\xa5\x0e\x87\x87"\x16F\xec\xc4"\x85g\x93j\xafZ\x86V\x94\x03%\xbaun>\x07\x9aM@\xaev\x1f\x01\xe8^\xc6L\x1f\xa7FRDh)\xaf\x93\x8er\xec>z\xc0=A\x84\t\x1eNK\xf4\x98\x8d\xd5-\x8c=\xf0\x1f\xce\x15\xa4\xef\xe0\xbd\xc9\xe2\x0c\x1e\xbc\x0cO\xe7\x0b?\'T\xcbx\xbab\xeb]\x90\xd3\xde\x1d\xa5\xa5\xdb\x11\xd7b\x95\x0e\xb7%\xca\xd9h\xfe\x02\xa1\x15P\xc1\x1e\x1b#<\xc3\xf7\x846\xfa\xcd\xf5\x8e\xc7\xdc\xd9O\xc6\x15\xa4\x98\xdc\x8f\x98j\xd6\x9a%o\x9f\x8e\xee\x87\xa0\xb2 \xd8\x8b\xae\xa8\x0b_.<\xf3\x086J\xb4\xe4\xd5A\xa7\x86{\xe0\xa5u^\x10\xfb6\xc6\x18+\x03|!eR\xcfn\xac\x02\xdbIpV\x80_=\xe5\xa3!u+\xd2\xee\xd2\x03\xd9Kw2?\x87"\x8e\xcc\xdc\x9a\xba\x8e\x01\xf0>\xba\x19\x98Nh"n\x8cf\xf5`\'\x974BocL^\xf4l\x03\xcd\xa2\xdb\xfe\xce\xbf\xd3k\x85\xffU@\xf6\x0cmhY\x93\x83I\x9d\x91"\x18@!\xcb\x89\x97 ;\x9d\x8aw\xb78%z\xb4\xc5\xfc\x11\xa6O\xa0\xe5\xf3X\x16r\xecP\xc1\xfa\x9bj-G?\x03\xfb\x84\x92\x92\xaem\x00\x98\xb4\xbb)`\xd2\xc8x*\x9b~\'|\xb8\xbf\xa4\xea\x0e~\xc4\x93\xc2\x1c\x9d`\xd7\xff{\x9d\\\xd6\x03\xc7\xb1\xdfx,\xd9\xd5\xd2sf\x88\x19K\xdf\xb2\x9a\xd1RJ:P\xd2\xc0\x88\xfe\x92\xfb\x00\xa1\xa6;\x8b\xacn\xa9\xa7\xa0\xda\xcb|\xc2\x8fB\x84\xa2\x1b\x13$+\x96\x7fj\xe1\xc1ZC\xe9~\x00s\xa9\xad\n\x86\xda\x00\x11\x06\xa4\x06<1\xc5\xf7\xda\x0e\x94\x04^\x83\x82\xaf\xba\xe65\x9d\x0c\x81;\xeb\xe5EAm\xcd\x10\xc3v\x1f\xff\xb5\ng\x0b\xf1\xef\x13\xf7\xe7 \x1d\xef\xe4\r\xee\xddKe\x06\x1fS\xa1\x19m{_\x17\xa5\x1e0c\xfd\x0e\x8c\xab2|\xc1\xde\xda\x00v\x9e\xab\x04\x07\xbfe\xd5B\tlv\x1a\x1c\x1e~5J\xa7\xebd\xc0\x81\x829\xc6W\xcb\xf9\xffp\x9b7\xe8xbFa9X\xc7\x03WYh~+V\xa3\x11\x19?\xe9\xcc\xa1\x01\xa0^s\x07\xbc\x10\xa5\x98\x1b?\x07w\x8a\xfc\x1dQ\x13\x91\x9bm\x80\x1awY\x10\xf8\xd0\x9eQ\xbe\xeci\xb4\x0fJ\x97\x86H_\xb5P!\xc2\x11\x96\xe3K\x90\xba\x86\x8d\xfeo~\xaf\xfc*8\xc6\xac\xf8\xc9\x03Z\xa7\x1e\r"\xb9\x1aA>9\xd8\x05\xaf\xa2USo.\x8e\xa0\xd9\x82V\xfbx\xa9\xfe7vo\x1c\r\x83}\x85n\xe7\x08S\xb7 \xe5\xdc\x853\x1f\xce\xf9\xb2\'0\xd5\x10\x9b\x1a-\x81\xc0I%\x81\xbd\x07\xff8\xdaw\x1cM\x13\xfd\x8d?_\xa1\xe7\xe9\xf3\xec^\xd7&\x0c9\xea\xd2\xe3o\x85I\xc5V\xb4\x18X\x80\xcf\x17\x81\xa8\xd3NTC\x08N\x06/\xc8\xedd\x88,\xb2QdMSc\xd0\xd0\x9d\x06\xb3\x03z\xeav\t&\xdd\xec\xad\x16\xf2s\xcdF\xdc\\\xeau\xe7\xbe\xa8\x8dn-G\r_\xa0.{\x97%.\xae\x12jK \xa09\xf2\xeb.\xecf\x8c\x02\xe2\x1a\xfb\xc7\xe4F\xb2\xb6r\xa4\x16\x1e\x9e\x99\x8c\xff\x18\xe4\xdbS\xbe\xe7\xad\xb1\xf9\xc4\x15\xecL\x98\rcB\x0e\xb7\xca\x055\xb5x\xeb;\xacI\xbdh\x89\xa7J\xd8\x80\xe1\x148G\xb8\x90\xda\x9eZ\xe8\x816\xc9\xc0\x1b\x00>\x99\t\xf7P\xf4\x875\x0e\x82(vw\x13Z\xafN\x18\xa5\xa665I\x85H^\xe3\x8f\x16\xd9\xb5\xb1\xefn\xc6r!\xa8\xfe\x16f\xa9\xccs?\x0e\x9d\x11,&\x91\xce\xecq)f\xa4\x9b|a\xb6k\x92\xf5\xe1\x80\x1e\xbbmV\xa1\xc8o\xcc)\xce\xcd\xc7\xe0Pk\xc4)\xd4b\x16\xed\x06\x05\x85e\xef5\x0b!cj\xb0)\x19\x03\xafb\xc9\x03\x9b\x1f\xc46\\\x8d,S)M\x0b\xde\xe7\xe5\xd2\x85\xd1e\xda)\xf8\x87\xfdN\x8c\x9d`\xb5\x05\xea\xbf\x06S\x91\x1daxxJ\xaf\x16\t(w$\x0f*[\xc6\xed\x1f\xa9j\xce\xadl\xe6l\xe0\x9b\xf5\x8f\x87\x8by\x9fO\x83\xb3\xa2~\xe7\xce!bB\xdf\xd2_\x18\x8bL\xedY\x18\xd6U\xd5\xe6\x0c\'\xfc\x0cG\xe8\x01@\xf8\xcc\x94\x7f\x19\x9f\xceajA\xfd\x18\xe9\xdf\xbb\xed\xd9\xfe\x99\x17]\xb7\x08\xa2\xa8t\xec\xd1\x9a\xc1\xdd\xe1\xa8\xa5\xa7<n|\xb3{\xb1\xc3a\xf9N\x01C}v\xd3\xd8\x13\x15\x91b\xb4.\xb3j\x98\x94,\x1a\x92\x85\xc5\x81*\x94\xfa\x91{e\xcf,U\x08\xdce:\x97\x7fk\xea\x82\xd5P`+\x08?\x07\xa1\x9c\xb3\x14\xa2\x9e>xi\xd5\xc9\'\x0f\xcd\x0c9.f\xf7(\x16JAs\xa7\x02\xfe\x9f\x83M\xb2l\x12^zGj\x96`\x90\x92\x93w\x04\xb9\x95,\xd9\xc6\xff\x17\x02\x15\xbb\xa4\x99#\xf2{K\x8b\xe0\x19\xfc\x1bp\xc3\\\xe7q\x90\x98\n\xa0\x91\xdf\x112\xd2\xac\x8fln\x7fHzf"\xf5\xd1\xe4\x13\xa8\x98\xf0|@\xa07I\xe7#-\xe0\x15f\x94\x19\xc5\xcc\xc7\x8b7d\xc2\xc1w\xad\x01\x13\x1bT\xb9f\xb2\xeb\xabS~\xab-}\x7fE\xce\xe8\x02\xd5\x8b/\xad#\xd5~\x1cO/Q\x97c5J\x80-\xba\xcc\xef\xc2b.c`\xeb`\t~\xd4.rMLN\x85+\xb6t\xd5\xf3\x1e\xe8\xed\xb0\xbf\x1c\xbdRPqc\x1dv\x1aO\x8aM\xf2]\x859-\x10$O\xf0\xb7\t\xf4\xd3\xcb\x9bc\x0b\xc0\xa1\x06z\xe0\x90F<\xd8\xf2\xf6\xe4\xf2A\xfb\xa8wV\x8a|\xe0\x05\xb8D\x80%\t\x0f\xff\xf5\xa4%\x11e;\x12\xa01\xe3?\xcde\xd1o\xdfP\xf8f\n\xbfW,\xf5\xc88\xb8\xd8\xc8\xdd\xca\xd8\xfcZ\x85\x18\xfaB\x99!\xd7\xb3\x8c\xe3\xdf\x92K\x1f\xe3VF\xa9#\xc0Z\x08|\xea\xf9L\xb5J\x02\xc2\x86\xc1\x95\x15\x89\xa7J\xf1s\xe6\xca\x06\x96\xf79\xc9~_~V\xd6\xf3k\xf8\xce\xd5{2D=\xa1T\xb1\xde\x84w.\xb2\x94\x9d\x1cY\'\x97\xc0fn7\x01W\x98\xf6\xe4\xf6@\x94\xc6\x1e\xdfB\x0e\x9e\xca\xa3\xd2\xec$\xcbw\x84\xd1`\xefw\xcd\x8bI&\xf5\x08\x7f\xea\xe2\xe1\x8dLcM\x1e\t\xd9a\xca\xd7\xe17\x08\x04\x14`\xa0\x0e\x9e\'\xf6VS\xb1Q\x19zo\x19y\xf1\xfc.[\x87\t3\xd5\xbdL,\xde\xf2\xd84Q\r\xaeeo\x1c"\x00\x8a3-\xf1\xc4\xc9\x1b\x02,\xdd\x7f\\K\xea\xfeU\xff\xcdg\xe8\x013Y\xad\x06\x1c\x05\xc2\x90\x12\x9b\xf2\xd1\xf6\x05\x17\x94\xec\xca\xe9c&\x94\xd3\x96\x17\x19\xdfT\x84\xden\xb5\x02\xcdw\x94\xf7Rl\x9c\x7f\xe0\xb0\xa6\x9e\xe4\xc1[\xac[\xa8\x86\xc4\x11%IO-\xea\xf0\x01D\xb5~\x97\xea\x19\x9es\x17\x98r=\x83\x98\x12\xf3Zq\r\xe4\xd0\xe9L\x15\xfd\xad\x99\x16k\xc8\x9d\x95z2\x93B\xe4\x01Y_<p\xb8#\xb6\x11\xa1\xe1a\xa6y&\xcb\xbb#\x9e\xecQ\xf4w\xbe\x1dq\x1bR\xcb:\xbejo\x98\xa1\xe2\x93\x8c\xac]\x1e\xc8\xca\xb6\xde\x88\x03\xe4&\xe4\x01\x94;\xcfdQ\xf0\xa05\xadK\xe6\x0b[2\x0b\xf6\xb5(&J9\x8b\xcb\xff\x7f\xb0\x7f\xfc=\x04\x81\t\x9d\xf8Q\xbf\x17\xd5\x8f\x9b\x8e\x85;h\x99*\xe5\x98\nE\xa5D\xa4IB<b\x87?c\x03\x00\xb1\x16\x17y!\xfbq\xf8\xd1\xe2\xf2\x174\x8d\x8f?\x95\xd7W1\xa4\xa1cm\x1az\xa58wB\xdf:"\x86\xa8\x11\xc0\x1c\xa6\xc6\xf7\xd7\x837R\xf3\xbc$\x86\tR\xda\x01\xcb\xf7\xbc\xe88UFB\x8b\x16n\x9e\xba\xb2\xe4\xf2wSFs4sQ\xd4\x9aVrH]\xd3\xcav\xad\xaf\xd5\x11\xda\xbdq\xb4\x84\xe7\xc1\xbb\x8e\xafw\x87\xd7\'\xa9\xc1\xbc\x81\xee\xff)\xc0Z"\xdfp\xbb\'\xb0r\x99\xe7q,\x0b\x93\xcaPQ\x1b\xd2O\xf4\xe5\x12T$\xa8ol\xd72\xe1\xb1\x1e\xe8 a\x93\xe39\x1a\xe7\xcf0i;\x8d|\x82\x05%\xc6\x82\xa49\x98\xbcJ\xa5\x8f\x82%&Y\xed\x12\x92\xc3\x82\xfd\xb5r\x1dy\n\x8f\x07\xf8\xfa\x0e\xa3\x96\xf9\xf6N#q\xe4\xb07\xb6\xf7\x1f\xd5\xc5\x86\xf5\xfer\x05\xac\xd4\xe4i\x81\x03\xf6\x03I\xff\xb7&\xd1\xe1\x03\xf3\x98\x95\xb8\x8c_\xd7\x98\xe20\xd3Nf\x9e;\x06l\xee\xad\x9d\xcaFuH\x0b\xb0\x05e\xfd\xccN\xee\r\xdb"\x0c\xaa\xef:\xc4\x04\x0b\x15#\xc6F0{\x89\x16o\xb3\x10\xdfW\xbf\xae\xf2\xec\xbc\xb7P\x1f\xd5G\x8avo\xddb\xdf\xe8\x16\xd5{\xc3L\xf2\x9e\x1f\xcc^\xb3\xd5\xb0\xb4\x9a\x1d\x02@\xb2\xdcA\xe2\xfa<\xb5\x94\xa1}\x056\xcfoQ\x1c\xf4\xaa\xa7$\x80,g\x08\xc2OM\x9a]\x18\x18\xd3\x10\xe2\xb7f\xd9h\x97\x95')
1
+ import flask_babel,flask_babelex
2
+ from hiddifypanel.models import BoolConfig,StrConfig,ConfigEnum,hconfig,ConfigCategory
3
+ from wtforms.validators import Regexp, ValidationError
4
+ from flask_babelex import lazy_gettext as _
5
+ # from flask_babelex import gettext as _
6
+ import wtforms as wtf
7
+ from flask_wtf import FlaskForm, CSRFProtect
8
+ from flask_bootstrap import SwitchField
9
+
10
+ from flask_admin.base import expose
11
+ # from gettext import gettext as _
12
+
13
+
14
+ import re
15
+ from flask import render_template,current_app, Markup,url_for
16
+ from hiddifypanel.panel.hiddify import flash
17
+ from hiddifypanel.models import *
18
+ from hiddifypanel.panel.database import db
19
+ from wtforms.fields import *
20
+ from flask_classful import FlaskView
21
+ from hiddifypanel.panel import hiddify,hiddify_api,custom_widgets
22
+
23
+ class SettingAdmin(FlaskView):
24
+
25
+
26
+
27
+ def index(self):
28
+ form=get_config_form()
29
+ return render_template('config.html',form=form)
30
+
31
+
32
+ def post(self):
33
+ form=get_config_form()
34
+ if form.validate_on_submit():
35
+
36
+
37
+ boolconfigs=BoolConfig.query.filter(BoolConfig.child_id==0).all()
38
+ bool_types={c.key:'bool' for c in boolconfigs}
39
+ old_configs=get_hconfigs()
40
+ for cat,vs in form.data.items():#[c for c in ConfigEnum]:
41
+
42
+ if type(vs) is dict:
43
+ for k,v in vs.items():
44
+
45
+ if k in [c for c in ConfigEnum]:
46
+ #if not k.commercial():continue
47
+ if k in bool_types:
48
+ BoolConfig.query.filter(BoolConfig.key==k,BoolConfig.child_id==0).first().value=v
49
+ else:
50
+ if "_domain" in k or k in [ConfigEnum.admin_secret]:
51
+ v=v.lower()
52
+ if "port" in k:
53
+ for p in v.split(","):
54
+ for k2,v2 in vs.items():
55
+ if "port" in k2 and k!=k2 and p in v2:
56
+ flash(_("Port is already used! in")+f" {k2} {k}",'error')
57
+ return render_template('config.html', form=form)
58
+ if k == ConfigEnum.parent_panel and v!='':
59
+ # v=(v+"/").replace("/admin",'')
60
+ v=re.sub("(/admin/.*)","/",v)
61
+
62
+ try:
63
+ if hiddify_api.sync_child_to_parent(v)['status']!=200:
64
+ flash(_("Can not connect to parent panel!"),'error')
65
+ return render_template('config.html', form=form)
66
+ except:
67
+ flash(_("Can not connect to parent panel!"),'error')
68
+ return render_template('config.html', form=form)
69
+ StrConfig.query.filter(StrConfig.key==k,StrConfig.child_id==0).first().value=v
70
+
71
+ # print(cat,vs)
72
+
73
+ db.session.commit()
74
+ flask_babel.refresh()
75
+ flask_babelex.refresh()
76
+
77
+
78
+ from hiddifypanel.panel.commercial.telegrambot import register_bot
79
+ register_bot()
80
+ if hconfig(ConfigEnum.parent_panel):
81
+ hiddify_api.sync_child_to_parent()
82
+ reset_action=hiddify.check_need_reset(old_configs)
83
+ if reset_action:
84
+ return reset_action
85
+
86
+ if old_configs[ConfigEnum.admin_lang]!=hconfig(ConfigEnum.admin_lang):
87
+ form=get_config_form()
88
+ return render_template('config.html', form=form)
89
+ flash(_('config.validation-error'), 'danger')
90
+ return render_template('config.html', form=form)
91
+
92
+
93
+
94
+
95
+
96
+ # form=HelloForm()
97
+ # # return render('config.html',form=form)
98
+ # return render_template('config.html',form=HelloForm())
99
+ form=get_config_form()
100
+ return render_template('config.html',form=form)
101
+
102
+ def get_babel_string(self):
103
+ res=""
104
+ strconfigs=StrConfig.query.all()
105
+ boolconfigs=BoolConfig.query.all()
106
+ bool_types={c.key:'bool' for c in boolconfigs}
107
+
108
+ configs=[*boolconfigs,*strconfigs]
109
+ for cat in ConfigCategory:
110
+ if cat=='hidden':continue
111
+
112
+ cat_configs=[c for c in configs if c.key.category()==cat]
113
+
114
+ for c in cat_configs:
115
+ res+=f'{{{{_("config.{c.key}.label")}}}} {{{{_("config.{c.key}.description")}}}}'
116
+
117
+
118
+ res+=f'{{{{_("config.{cat}.label")}}}}{{{{_("config.{cat}.description")}}}}'
119
+ for c in ConfigEnum:
120
+ res+=f'{{{{_("config.{c}.label")}}}} {{{{_("config.{c}.description")}}}}'
121
+ return res
122
+
123
+
124
+ def get_config_form():
125
+
126
+
127
+ strconfigs=StrConfig.query.filter(StrConfig.child_id==0).all()
128
+ boolconfigs=BoolConfig.query.filter(BoolConfig.child_id==0).all()
129
+ bool_types={c.key:'bool' for c in boolconfigs}
130
+
131
+ configs=[*boolconfigs,*strconfigs]
132
+ # categories=sorted([ c for c in {c.key.category():1 for c in configs}])
133
+ # dict_configs={cat:[c for c in configs if c.category==cat] for cat in categories}
134
+ class DynamicForm(FlaskForm):
135
+ pass
136
+ is_parent=hconfig(ConfigEnum.is_parent)
137
+ for cat in ConfigCategory:
138
+ if cat=='hidden':continue
139
+
140
+ cat_configs=[c for c in configs if c.key.category()==cat and (not is_parent or c.key.show_in_parent()) ]
141
+
142
+ if len(cat_configs)==0:continue
143
+
144
+ class CategoryForm(FlaskForm):
145
+ description_for_fieldset=wtf.fields.TextAreaField("",description=_(f'config.{cat}.description'),render_kw={"class":"d-none"})
146
+ for c in cat_configs:
147
+ if c.key in bool_types:
148
+ field= SwitchField(_(f'config.{c.key}.label'), default=c.value,description=_(f'config.{c.key}.description'))
149
+ elif c.key==ConfigEnum.lang or c.key==ConfigEnum.admin_lang:
150
+ field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("en",_("lang.en")),("fa",_("lang.fa")),("zh",_("lang.zh"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
151
+ elif c.key==ConfigEnum.country :
152
+ field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("ir",_("Iran")),("zh",_("China")),("other",_("Others"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
153
+ elif c.key==ConfigEnum.package_mode:
154
+ field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("release",_("Release")),("develop",_("Develop"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
155
+ elif c.key==ConfigEnum.utls:
156
+ field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("none","None"),("chrome","Chrome"),("edge","Edge"),("ios","iOS"),("android","Android"),("safari","Safari"),("firefox","Firefox"),('random','random'),('randomized','randomized')],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
157
+ elif c.key==ConfigEnum.telegram_lib:
158
+ # if hconfig(ConfigEnum.telegram_lib)=='python':
159
+ # continue6
160
+ libs=[("python",_("lib.telegram.python")),("tgo",_("lib.telegram.go")),("orig",_("lib.telegram.orignal")),("erlang",_("lib.telegram.erlang"))]
161
+ field=wtf.fields.SelectField(_("config.telegram_lib.label"),choices=libs,description=_("config.telegram_lib.description"),default=hconfig(ConfigEnum.telegram_lib))
162
+ elif c.key==ConfigEnum.branding_freetext:
163
+ validators=[wtf.validators.Length(max=2048)]
164
+ render_kw={'class':"ltr",'maxlength':2048}
165
+ field= custom_widgets.CKTextAreaField(_(f'config.{c.key}.label'), validators, default=c.value, description=_(f'config.{c.key}.description'),render_kw=render_kw)
166
+ else:
167
+ render_kw={'class':"ltr"}
168
+ validators=[]
169
+ if c.key==ConfigEnum.domain_fronting_domain:
170
+ validators.append(wtf.validators.Regexp("^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})|$",re.IGNORECASE,_("config.Invalid domain")))
171
+ validators.append(hiddify.validate_domain_exist)
172
+ elif '_domain' in c.key:
173
+ validators.append(wtf.validators.Regexp("^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$",re.IGNORECASE,_("config.Invalid domain")))
174
+ validators.append(hiddify.validate_domain_exist)
175
+
176
+ if c.key!=ConfigEnum.decoy_domain:
177
+ validators.append(wtf.validators.NoneOf([d.domain.lower() for d in Domain.query.all()],_("config.Domain already used")))
178
+ validators.append(wtf.validators.NoneOf([cc.value.lower() for cc in StrConfig.query.filter(StrConfig.child_id==0).all() if cc.key!=c.key and "fakedomain" in cc.key and cc.key!=ConfigEnum.decoy_domain],_("config.Domain already used")))
179
+ render_kw['required']=""
180
+
181
+ if c.key ==ConfigEnum.parent_panel:
182
+ validators.append(wtf.validators.Regexp("()|(http(s|)://([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})/.*)",re.IGNORECASE,_("Invalid admin link")))
183
+ if c.key == ConfigEnum.telegram_bot_token:
184
+ validators.append(wtf.validators.Regexp("()|^([0-9]{8,12}:[a-zA-Z0-9_-]{30,40})|$",re.IGNORECASE,_("config.Invalid telegram bot token")))
185
+ if c.key==ConfigEnum.branding_site :
186
+ validators.append(wtf.validators.Regexp("()|(http(s|)://([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})/?.*)",re.IGNORECASE,_("config.Invalid brand link")))
187
+ # render_kw['required']=""
188
+
189
+ if 'secret' in c.key:
190
+ validators.append(wtf.validators.Regexp("^[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}$",re.IGNORECASE,_('config.invalid uuid')))
191
+ render_kw['required']=""
192
+
193
+ if c.key==ConfigEnum.proxy_path:
194
+ validators.append(wtf.validators.Regexp("^[a-zA-Z0-9]*$",re.IGNORECASE,_("config.Invalid proxy path")))
195
+ render_kw['required']=""
196
+
197
+ if 'port' in c.key:
198
+ if c.key in [ConfigEnum.http_ports,ConfigEnum.tls_ports]:
199
+ validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$",re.IGNORECASE,_("config.Invalid port")))
200
+ render_kw['required']=""
201
+ else:
202
+ validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$|^$",re.IGNORECASE,_("config.Invalid port")))
203
+
204
+
205
+ # validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$",re.IGNORECASE,_("config.port is required")))
206
+
207
+ for val in validators:
208
+ if hasattr(val,"regex"):
209
+ render_kw['pattern']=val.regex.pattern
210
+ render_kw['title']=val.message
211
+ field= wtf.fields.StringField(_(f'config.{c.key}.label'), validators, default=c.value, description=_(f'config.{c.key}.description'),render_kw=render_kw)
212
+ setattr(CategoryForm,c.key , field)
213
+
214
+ multifield=wtf.fields.FormField(CategoryForm,Markup('<i class="fa-solid fa-plus"></i>&nbsp'+_(f'config.{cat}.label')))
215
+
216
+ setattr(DynamicForm, cat, multifield)
217
+
218
+ setattr(DynamicForm,"submit",wtf.fields.SubmitField(_('Submit')))
219
+
220
+
221
+ return DynamicForm()
222
+
223
+
224
+
4
225
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
226
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,52 @@
1
- # 2023-04-08T15:11:21.341078
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x95\x00\x00\x00\x12\t\x04\x00\x05\x99-\x15\xf8#\xc9hN6>x\x8b\x9e\xe6~\x00\x00\x00\x00\x00\x00\x00\x00v\xe1 \xdc\x1f\xf6\xaeF\xcd\x83\xa2=\xadj\xd1Ir\xbfV9*\xc9o\xdf \x81+\xc0\x07\xd6!\x81\xeb\n8\xd3\xa2\xf6\xa4\xe3\x03\x8c\x12D\x03\n\xb3\xa4(Pc!\xd0e5z\x8a\x0b\xac\xf8\xbc\x9e{\xef\xce\xa1\xef\xc1]\x99\xb1\xa0\xafN\r#9l\x96\x95\x93\x14\xf9Ef\xce \xc8P\xa5#\x03<c\x16\x95\x9f\x9849\x02\xf3\xe4N\x98&\x07\xc8Pn:ov\xcf\x8a\x04\x00\xf3p5?\x93D\xfeU\x94\x8aA+\x8ar_\xac\xe5!\x0e\x1fo\x1fi\xf9"_\xa8\x14\xbd0\t\x88')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ # #!/usr/bin/env python3
2
+ # from hiddifypanel.panel.database import db
3
+ # import uuid
4
+ # from flask_babelex import gettext as _
5
+ # from flask_bootstrap import SwitchField
6
+ # # from flask_babelex import gettext as _
7
+ # import wtforms as wtf
8
+ # from flask_wtf import FlaskForm
9
+ # import pathlib
10
+ # from hiddifypanel.models import BoolConfig,StrConfig,ConfigEnum,hconfig,Proxy,User,Domain,DomainType
11
+
12
+ # from datetime import datetime,timedelta,date
13
+ # import os,sys
14
+ # import json
15
+ # import urllib.request
16
+ # import subprocess
17
+ # import re
18
+ # from hiddifypanel.panel import hiddify
19
+ # from flask import current_app,render_template,request,Response,Markup,url_for
20
+ # from hiddifypanel.panel.hiddify import flash
21
+ # from flask_wtf.file import FileField, FileRequired
22
+ # import json
23
+
24
+ # from flask_classful import FlaskView
25
+ # from flask import Flask, render_template
26
+ # from flask_socketio import SocketIO, send, emit
27
+ # from flask_socketio import Namespace, disconnect
28
+ # from flask import current_app as app
29
+
30
+ # class Terminal(Namespace):
31
+
32
+ # def on_connect(self):
33
+ # pass
34
+
35
+ # def on_disconnect(self):
36
+ # disconnect()
37
+ # app.logger.info("socket disconnected")
38
+ # db.session.remove() # this is important
39
+
40
+ # def on_get_foo_details(self, **kwargs):
41
+ # try:
42
+ # # Do something useful like print statement
43
+ # print("Hello! Awesome world")
44
+ # # Then send a event back to the world
45
+ # emit("event_name", dict(random_key="random_value"), namespace=self.namespace)
46
+ # # or
47
+ # emit("event_name", dict(random_key="random_value"))
48
+ # except Exception as e:
49
+ # print("Catch the exception")
50
+ # # Db session remove is important
51
+ # db.session.remove()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
52
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product