rubyfox-server 2.13.6.1 → 2.16.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (575) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -1
  3. data/README.md +19 -0
  4. data/lib/rubyfox/server/cli.rb +39 -5
  5. data/lib/rubyfox/server/data/config/UploadsLock.txt +1 -1
  6. data/lib/rubyfox/server/data/config/admin/admintool.xml +1 -0
  7. data/lib/rubyfox/server/data/config/admin/descriptors/config_room.txt +97 -43
  8. data/lib/rubyfox/server/data/config/admin/descriptors/config_server.txt +307 -93
  9. data/lib/rubyfox/server/data/config/admin/descriptors/config_zone.txt +311 -95
  10. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_game.txt +5 -5
  11. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_mmo.txt +6 -6
  12. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_room.txt +69 -44
  13. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_user.txt +55 -43
  14. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_zone.txt +81 -36
  15. data/lib/rubyfox/server/data/config/admin/gmc/gmc.py +55 -18
  16. data/lib/rubyfox/server/data/config/admin/icons/Analytics.png +0 -0
  17. data/lib/rubyfox/server/data/config/admin/icons/Analytics.svg +1 -0
  18. data/lib/rubyfox/server/data/config/admin/icons/BanManager.png +0 -0
  19. data/lib/rubyfox/server/data/config/admin/icons/BanManager.svg +1 -0
  20. data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.png +0 -0
  21. data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.svg +1 -0
  22. data/lib/rubyfox/server/data/config/admin/icons/Console.png +0 -0
  23. data/lib/rubyfox/server/data/config/admin/icons/Console.svg +9 -0
  24. data/lib/rubyfox/server/data/config/admin/icons/Dashboard.png +0 -0
  25. data/lib/rubyfox/server/data/config/admin/icons/Dashboard.svg +1 -0
  26. data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.png +0 -0
  27. data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.svg +1 -0
  28. data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.png +0 -0
  29. data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.svg +1 -0
  30. data/lib/rubyfox/server/data/config/admin/icons/LogViewer.png +0 -0
  31. data/lib/rubyfox/server/data/config/admin/icons/LogViewer.svg +1 -0
  32. data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.png +0 -0
  33. data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.svg +1 -0
  34. data/lib/rubyfox/server/data/config/admin/icons/ServletManager.svg +1 -0
  35. data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.png +0 -0
  36. data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.svg +1 -0
  37. data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.png +0 -0
  38. data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.svg +1 -0
  39. data/lib/rubyfox/server/data/config/core.xml +2 -2
  40. data/lib/rubyfox/server/data/config/log4j.properties +7 -7
  41. data/lib/rubyfox/server/data/config/server.xml +9 -10
  42. data/lib/rubyfox/server/data/config/wordsFile.txt +0 -2
  43. data/lib/rubyfox/server/data/data/GeoLite2-Country.mmdb +0 -0
  44. data/lib/rubyfox/server/data/{config → data/buddylists/BasicExamples}/.keep +0 -0
  45. data/lib/rubyfox/server/data/data/{buddylists → uploads}/.keep +0 -0
  46. data/lib/rubyfox/server/data/lib/BlueBox.war +0 -0
  47. data/lib/rubyfox/server/data/lib/apache-tomcat/LICENSE +1061 -0
  48. data/lib/rubyfox/server/data/lib/apache-tomcat/NOTICE +68 -0
  49. data/lib/rubyfox/server/data/lib/apache-tomcat/README.md +79 -0
  50. data/lib/rubyfox/server/data/lib/apache-tomcat/RELEASE-NOTES +174 -0
  51. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/bootstrap.jar +0 -0
  52. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina-tasks.xml +39 -0
  53. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.bat +386 -0
  54. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.sh +689 -0
  55. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/ciphers.bat +58 -0
  56. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/ciphers.sh +60 -0
  57. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon-native.tar.gz +0 -0
  58. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon.jar +0 -0
  59. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/configtest.bat +58 -0
  60. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/configtest.sh +60 -0
  61. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/daemon.sh +293 -0
  62. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/digest.bat +58 -0
  63. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/digest.sh +60 -0
  64. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/makebase.bat +114 -0
  65. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/makebase.sh +115 -0
  66. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/setclasspath.bat +94 -0
  67. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/setclasspath.sh +98 -0
  68. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/shutdown.bat +58 -0
  69. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/shutdown.sh +60 -0
  70. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/startup.bat +58 -0
  71. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/startup.sh +60 -0
  72. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-juli.jar +0 -0
  73. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-native.tar.gz +0 -0
  74. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tool-wrapper.bat +110 -0
  75. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tool-wrapper.sh +153 -0
  76. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/version.bat +58 -0
  77. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/version.sh +60 -0
  78. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/Catalina/localhost/rewrite.config +1 -0
  79. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.policy +260 -0
  80. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.properties +206 -0
  81. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/context.xml +31 -0
  82. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/jaspic-providers.xml +23 -0
  83. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/jaspic-providers.xsd +53 -0
  84. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/keystore.jks +0 -0
  85. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/logging.properties +79 -0
  86. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/server.xml +161 -0
  87. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/tomcat-users.xml +41 -0
  88. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/tomcat-users.xsd +59 -0
  89. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/web.xml +4733 -0
  90. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/annotations-api.jar +0 -0
  91. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ant.jar +0 -0
  92. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ha.jar +0 -0
  93. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ssi.jar +0 -0
  94. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-storeconfig.jar +0 -0
  95. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-tribes.jar +0 -0
  96. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina.jar +0 -0
  97. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/ecj-4.15.jar +0 -0
  98. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/el-api.jar +0 -0
  99. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper-el.jar +0 -0
  100. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper.jar +0 -0
  101. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jaspic-api.jar +0 -0
  102. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jsp-api.jar +0 -0
  103. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/servlet-api.jar +0 -0
  104. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/sfs2x-ws-helper.jar +0 -0
  105. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-api.jar +0 -0
  106. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-coyote.jar +0 -0
  107. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-dbcp.jar +0 -0
  108. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-cs.jar +0 -0
  109. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-de.jar +0 -0
  110. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-es.jar +0 -0
  111. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-fr.jar +0 -0
  112. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ja.jar +0 -0
  113. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ko.jar +0 -0
  114. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-pt-BR.jar +0 -0
  115. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ru.jar +0 -0
  116. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-zh-CN.jar +0 -0
  117. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jdbc.jar +0 -0
  118. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jni.jar +0 -0
  119. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util-scan.jar +0 -0
  120. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util.jar +0 -0
  121. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-websocket.jar +0 -0
  122. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/websocket-api.jar +0 -0
  123. data/lib/rubyfox/server/data/{extensions → lib/apache-tomcat/logs}/.keep +0 -0
  124. data/lib/rubyfox/server/data/lib/{jetty/lib/ext/.donotdelete → apache-tomcat/temp/safeToDelete.tmp} +0 -0
  125. data/lib/rubyfox/server/data/lib/{jetty/resources → apache-tomcat/work}/.keep +0 -0
  126. data/lib/rubyfox/server/data/lib/commons-collections-3.2.2.jar +0 -0
  127. data/lib/rubyfox/server/data/lib/commons-compress-1.19.jar +0 -0
  128. data/lib/rubyfox/server/data/lib/js/LibApi.js +48 -181
  129. data/lib/rubyfox/server/data/lib/sfs2x-admin.jar +0 -0
  130. data/lib/rubyfox/server/data/lib/sfs2x-core.jar +0 -0
  131. data/lib/rubyfox/server/data/lib/sfs2x-lib.jar +0 -0
  132. data/lib/rubyfox/server/data/lib/sfs2x-util.jar +0 -0
  133. data/lib/rubyfox/server/data/lib/sfs2x.jar +0 -0
  134. data/lib/rubyfox/server/data/sfs2x-service +6 -6
  135. data/lib/rubyfox/server/data/sfs2x-service.vmoptions +1 -1
  136. data/lib/rubyfox/server/data/sfs2x.sh +1 -1
  137. data/lib/rubyfox/server/data/www/BlueBox.war +0 -0
  138. data/lib/rubyfox/server/data/www/HelloServlet/index.jsp +1 -1
  139. data/lib/rubyfox/server/data/www/{root → ROOT}/_css_/default.css +0 -0
  140. data/lib/rubyfox/server/data/www/{root → ROOT}/_css_/reset.css +0 -0
  141. data/lib/rubyfox/server/data/www/{root → ROOT}/_images_/background_gradient.png +0 -0
  142. data/lib/rubyfox/server/data/www/{root → ROOT}/_images_/background_logo.png +0 -0
  143. data/lib/rubyfox/server/data/www/{root → ROOT}/_images_/favicon.png +0 -0
  144. data/lib/rubyfox/server/data/www/{root → ROOT}/_images_/logo_smartfoxserver.png +0 -0
  145. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/_changes-to-default-themes_.txt +15 -0
  146. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/bootstrap.min.css +7 -0
  147. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/custom-bootstrap.min.css +1 -0
  148. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/css/all.min.css +5 -0
  149. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.eot +0 -0
  150. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.svg +3459 -0
  151. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  152. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.woff +0 -0
  153. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  154. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.eot +0 -0
  155. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.svg +803 -0
  156. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  157. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.woff +0 -0
  158. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  159. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.eot +0 -0
  160. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.svg +4527 -0
  161. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  162. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.woff +0 -0
  163. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  164. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fonts.css +175 -0
  165. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/jquery.scrolling-tabs.min.css +8 -0
  166. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/kendo.custom-bootstrap-v4.css +15280 -0
  167. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/reset.css +54 -0
  168. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/style.css +1428 -0
  169. data/lib/rubyfox/server/data/www/ROOT/admin/assets/data/countries.geo.json +178 -0
  170. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.otf +0 -0
  171. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.ttf +0 -0
  172. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.woff +0 -0
  173. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.woff2 +0 -0
  174. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300.ttf +0 -0
  175. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300.woff +0 -0
  176. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300.woff2 +0 -0
  177. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300italic.ttf +0 -0
  178. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300italic.woff +0 -0
  179. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300italic.woff2 +0 -0
  180. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600.ttf +0 -0
  181. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600.woff +0 -0
  182. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600.woff2 +0 -0
  183. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600italic.ttf +0 -0
  184. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600italic.woff +0 -0
  185. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600italic.woff2 +0 -0
  186. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700.ttf +0 -0
  187. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700.woff +0 -0
  188. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700.woff2 +0 -0
  189. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700italic.ttf +0 -0
  190. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700italic.woff +0 -0
  191. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700italic.woff2 +0 -0
  192. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800.ttf +0 -0
  193. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800.woff +0 -0
  194. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800.woff2 +0 -0
  195. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800italic.ttf +0 -0
  196. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800italic.woff +0 -0
  197. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800italic.woff2 +0 -0
  198. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-italic.ttf +0 -0
  199. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-italic.woff +0 -0
  200. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-italic.woff2 +0 -0
  201. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-regular.ttf +0 -0
  202. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-regular.woff +0 -0
  203. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-regular.woff2 +0 -0
  204. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.ttf +0 -0
  205. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.woff +0 -0
  206. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.woff2 +0 -0
  207. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.ttf +0 -0
  208. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.woff +0 -0
  209. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.woff2 +0 -0
  210. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/compare.png +0 -0
  211. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsChart.png +0 -0
  212. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsCompare.png +0 -0
  213. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsFilter.png +0 -0
  214. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsMap.png +0 -0
  215. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsTable.png +0 -0
  216. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyChart.png +0 -0
  217. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyCompare.png +0 -0
  218. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyFilter.png +0 -0
  219. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyTable.png +0 -0
  220. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/apple-touch-icon-180x180.png +0 -0
  221. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-16x16.png +0 -0
  222. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-32x32.png +0 -0
  223. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-64x64.png +0 -0
  224. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/logo.png +0 -0
  225. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/application.bundle.js +2208 -0
  226. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-0.bundle.js +7662 -0
  227. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-1.bundle.js +929 -0
  228. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-10.bundle.js +766 -0
  229. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-11.bundle.js +71 -0
  230. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12.bundle.js +1184 -0
  231. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12~module-13~module-9.bundle.js +2618 -0
  232. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-13.bundle.js +3315 -0
  233. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-3.bundle.js +280 -0
  234. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-4.bundle.js +1122 -0
  235. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-5.bundle.js +2624 -0
  236. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-6.bundle.js +801 -0
  237. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-7.bundle.js +607 -0
  238. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-8.bundle.js +1221 -0
  239. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-9.bundle.js +847 -0
  240. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-0.bundle.js +3240 -0
  241. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-0~module-1~module-13~module-4~module-5~module-7~module-8.bundle.js +17357 -0
  242. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-9.bundle.js +807 -0
  243. data/lib/rubyfox/server/data/{lib/jetty/webapps → www/ROOT/admin/assets/js/custom-modules}/.keep +0 -0
  244. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/bootstrap.min.js +7 -0
  245. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/jquery-3.3.1.min.js +2 -0
  246. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/jquery.scrolling-tabs.min.js +8 -0
  247. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/js.cookie.min.js +8 -0
  248. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/kendo.all.min.js +136 -0
  249. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/popper.min.js +5 -0
  250. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/sfs2x-api-1.7.15.js +8 -0
  251. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/versions-readme.txt +16 -0
  252. data/lib/rubyfox/server/data/www/ROOT/admin/index.html +244 -0
  253. data/lib/rubyfox/server/data/www/ROOT/admin/manifest.json +25 -0
  254. data/lib/rubyfox/server/data/www/ROOT/admin/modules/analytics.html +328 -0
  255. data/lib/rubyfox/server/data/www/ROOT/admin/modules/ban-manager.html +160 -0
  256. data/lib/rubyfox/server/data/www/ROOT/admin/modules/blue-box-monitor.html +37 -0
  257. data/lib/rubyfox/server/data/www/ROOT/admin/modules/console.html +135 -0
  258. data/lib/rubyfox/server/data/www/ROOT/admin/modules/dashboard.html +368 -0
  259. data/lib/rubyfox/server/data/www/ROOT/admin/modules/extension-manager.html +98 -0
  260. data/lib/rubyfox/server/data/www/ROOT/admin/modules/license-manager.html +117 -0
  261. data/lib/rubyfox/server/data/www/ROOT/admin/modules/log-viewer.html +194 -0
  262. data/lib/rubyfox/server/data/www/ROOT/admin/modules/server-configurator.html +55 -0
  263. data/lib/rubyfox/server/data/www/ROOT/admin/modules/servlet-manager.html +98 -0
  264. data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-configurator.html +62 -0
  265. data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-monitor.html +346 -0
  266. data/lib/rubyfox/server/data/www/{root → ROOT}/crossdomain.xml +0 -0
  267. data/lib/rubyfox/server/data/www/{root → ROOT}/examples/index.html +0 -0
  268. data/lib/rubyfox/server/data/www/{root → ROOT}/favicon.ico +0 -0
  269. data/lib/rubyfox/server/data/www/{root → ROOT}/favicon.png +0 -0
  270. data/lib/rubyfox/server/data/www/{root → ROOT}/index.html +0 -0
  271. data/lib/rubyfox/server/data/www/host-manager/META-INF/context.xml +24 -0
  272. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/jsp/401.jsp +71 -0
  273. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/jsp/403.jsp +90 -0
  274. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/jsp/404.jsp +62 -0
  275. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/web.xml +131 -0
  276. data/lib/rubyfox/server/data/www/host-manager/images/asf-logo.svg +226 -0
  277. data/lib/rubyfox/server/data/www/host-manager/images/tomcat.gif +0 -0
  278. data/lib/rubyfox/server/data/www/host-manager/index.jsp +18 -0
  279. data/lib/rubyfox/server/data/www/host-manager/manager.xml +26 -0
  280. data/lib/rubyfox/server/data/{logs → www/logsBackup}/.keep +0 -0
  281. data/lib/rubyfox/server/data/www/manager/META-INF/context.xml +24 -0
  282. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/401.jsp +80 -0
  283. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/403.jsp +100 -0
  284. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/404.jsp +63 -0
  285. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorCerts.jsp +92 -0
  286. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorCiphers.jsp +92 -0
  287. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorTrustedCerts.jsp +92 -0
  288. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/sessionDetail.jsp +197 -0
  289. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/sessionsList.jsp +170 -0
  290. data/lib/rubyfox/server/data/www/manager/WEB-INF/web.xml +195 -0
  291. data/lib/rubyfox/server/data/www/manager/images/asf-logo.svg +226 -0
  292. data/lib/rubyfox/server/data/www/manager/images/tomcat.gif +0 -0
  293. data/lib/rubyfox/server/data/www/manager/index.jsp +18 -0
  294. data/lib/rubyfox/server/data/www/manager/status.xsd +84 -0
  295. data/lib/rubyfox/server/data/www/manager/xform.xsl +125 -0
  296. data/lib/rubyfox/server/version.rb +1 -1
  297. metadata +256 -299
  298. data/lib/rubyfox/server/data/config/ExtensionManagerLock.txt +0 -2
  299. data/lib/rubyfox/server/data/lib/Lib/reindex$py.class +0 -0
  300. data/lib/rubyfox/server/data/lib/jetty/VERSION.txt +0 -9320
  301. data/lib/rubyfox/server/data/lib/jetty/etc/README.spnego +0 -62
  302. data/lib/rubyfox/server/data/lib/jetty/etc/jamon.xml +0 -32
  303. data/lib/rubyfox/server/data/lib/jetty/etc/jdbcRealm.properties +0 -72
  304. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-alpn.xml +0 -32
  305. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-annotations.xml +0 -20
  306. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-cdi.xml +0 -19
  307. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-debug.xml +0 -36
  308. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-debuglog.xml +0 -25
  309. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-deploy.xml +0 -76
  310. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gcloud-memcached-sessions.xml +0 -27
  311. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gcloud-session-idmgr.xml +0 -19
  312. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gcloud-sessions.xml +0 -27
  313. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gzip.xml +0 -67
  314. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http-forwarded.xml +0 -17
  315. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http.xml +0 -47
  316. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http2.xml +0 -26
  317. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http2c.xml +0 -18
  318. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-https.xml +0 -29
  319. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-infinispan.xml +0 -39
  320. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-ipaccess.xml +0 -28
  321. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jaas.xml +0 -16
  322. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jdbc-sessions.xml +0 -34
  323. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jmx-remote.xml +0 -40
  324. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jmx.xml +0 -32
  325. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-logging.xml +0 -36
  326. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-lowresources.xml +0 -22
  327. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-monitor.xml +0 -30
  328. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-nosql.xml +0 -19
  329. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-plus.xml +0 -26
  330. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-proxy-protocol-ssl.xml +0 -10
  331. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-proxy-protocol.xml +0 -10
  332. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-proxy.xml +0 -35
  333. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-requestlog.xml +0 -30
  334. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-rewrite-customizer.xml +0 -17
  335. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-rewrite.xml +0 -31
  336. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-setuid.xml +0 -30
  337. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-spring.xml +0 -61
  338. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-ssl-context.xml +0 -29
  339. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-ssl.xml +0 -58
  340. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-started.xml +0 -15
  341. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-stats.xml +0 -18
  342. data/lib/rubyfox/server/data/lib/jetty/etc/jetty.conf +0 -12
  343. data/lib/rubyfox/server/data/lib/jetty/etc/jetty.xml +0 -195
  344. data/lib/rubyfox/server/data/lib/jetty/etc/jminix.xml +0 -12
  345. data/lib/rubyfox/server/data/lib/jetty/etc/jolokia.xml +0 -16
  346. data/lib/rubyfox/server/data/lib/jetty/etc/keystore +0 -0
  347. data/lib/rubyfox/server/data/lib/jetty/etc/krb5.ini +0 -23
  348. data/lib/rubyfox/server/data/lib/jetty/etc/rewrite-compactpath.xml +0 -10
  349. data/lib/rubyfox/server/data/lib/jetty/etc/spnego.conf +0 -19
  350. data/lib/rubyfox/server/data/lib/jetty/etc/spnego.properties +0 -1
  351. data/lib/rubyfox/server/data/lib/jetty/etc/webdefault.xml +0 -539
  352. data/lib/rubyfox/server/data/lib/jetty/lib/asm-5.0.1.jar +0 -0
  353. data/lib/rubyfox/server/data/lib/jetty/lib/asm-commons-5.0.1.jar +0 -0
  354. data/lib/rubyfox/server/data/lib/jetty/lib/fcgi/fcgi-client-9.3.11.v20160721.jar +0 -0
  355. data/lib/rubyfox/server/data/lib/jetty/lib/fcgi/fcgi-server-9.3.11.v20160721.jar +0 -0
  356. data/lib/rubyfox/server/data/lib/jetty/lib/http2-common-9.3.11.v20160721.jar +0 -0
  357. data/lib/rubyfox/server/data/lib/jetty/lib/http2-hpack-9.3.11.v20160721.jar +0 -0
  358. data/lib/rubyfox/server/data/lib/jetty/lib/http2-server-9.3.11.v20160721.jar +0 -0
  359. data/lib/rubyfox/server/data/lib/jetty/lib/jaspi/javax.security.auth.message-1.0.0.v201108011116.jar +0 -0
  360. data/lib/rubyfox/server/data/lib/jetty/lib/javax-websocket-client-impl-9.3.11.v20160721.jar +0 -0
  361. data/lib/rubyfox/server/data/lib/jetty/lib/javax-websocket-server-impl-9.3.11.v20160721.jar +0 -0
  362. data/lib/rubyfox/server/data/lib/jetty/lib/javax.annotation-api-1.2.jar +0 -0
  363. data/lib/rubyfox/server/data/lib/jetty/lib/javax.websocket-api-1.0.jar +0 -0
  364. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-alpn-server-9.3.11.v20160721.jar +0 -0
  365. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-annotations-9.3.11.v20160721.jar +0 -0
  366. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-client-9.3.11.v20160721.jar +0 -0
  367. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-continuation-9.3.11.v20160721.jar +0 -0
  368. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-deploy-9.3.11.v20160721.jar +0 -0
  369. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-gcloud-memcached-session-manager-9.3.11.v20160721.jar +0 -0
  370. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-gcloud-session-manager-9.3.11.v20160721.jar +0 -0
  371. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-http-9.3.11.v20160721.jar +0 -0
  372. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-infinispan-9.3.11.v20160721.jar +0 -0
  373. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-io-9.3.11.v20160721.jar +0 -0
  374. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jaas-9.3.11.v20160721.jar +0 -0
  375. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jaspi-9.3.11.v20160721.jar +0 -0
  376. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jmx-9.3.11.v20160721.jar +0 -0
  377. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jndi-9.3.11.v20160721.jar +0 -0
  378. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-nosql-9.3.11.v20160721.jar +0 -0
  379. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-plus-9.3.11.v20160721.jar +0 -0
  380. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-proxy-9.3.11.v20160721.jar +0 -0
  381. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-quickstart-9.3.11.v20160721.jar +0 -0
  382. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-rewrite-9.3.11.v20160721.jar +0 -0
  383. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-schemas-3.1.jar +0 -0
  384. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-security-9.3.11.v20160721.jar +0 -0
  385. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-server-9.3.11.v20160721.jar +0 -0
  386. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-servlet-9.3.11.v20160721.jar +0 -0
  387. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-servlets-9.3.11.v20160721.jar +0 -0
  388. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-util-9.3.11.v20160721.jar +0 -0
  389. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-webapp-9.3.11.v20160721.jar +0 -0
  390. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-xml-9.3.11.v20160721.jar +0 -0
  391. data/lib/rubyfox/server/data/lib/jetty/lib/jndi/javax.mail.glassfish-1.4.1.v201005082020.jar +0 -0
  392. data/lib/rubyfox/server/data/lib/jetty/lib/jndi/javax.transaction-api-1.2.jar +0 -0
  393. data/lib/rubyfox/server/data/lib/jetty/lib/monitor/jetty-monitor-9.3.11.v20160721.jar +0 -0
  394. data/lib/rubyfox/server/data/lib/jetty/lib/org.apache.taglibs.taglibs-standard-impl-1.2.5.jar +0 -0
  395. data/lib/rubyfox/server/data/lib/jetty/lib/org.apache.taglibs.taglibs-standard-spec-1.2.5.jar +0 -0
  396. data/lib/rubyfox/server/data/lib/jetty/lib/org.eclipse.jdt.core.compiler.ecj-4.4.2.jar +0 -0
  397. data/lib/rubyfox/server/data/lib/jetty/lib/org.eclipse.jetty.apache-jsp-9.3.11.v20160721.jar +0 -0
  398. data/lib/rubyfox/server/data/lib/jetty/lib/org.mortbay.jasper.apache-el-8.0.33.jar +0 -0
  399. data/lib/rubyfox/server/data/lib/jetty/lib/org.mortbay.jasper.apache-jsp-8.0.33.jar +0 -0
  400. data/lib/rubyfox/server/data/lib/jetty/lib/servlet-api-3.1.jar +0 -0
  401. data/lib/rubyfox/server/data/lib/jetty/lib/setuid/jetty-setuid-java-1.0.3.jar +0 -0
  402. data/lib/rubyfox/server/data/lib/jetty/lib/setuid/libsetuid-linux.so +0 -0
  403. data/lib/rubyfox/server/data/lib/jetty/lib/setuid/libsetuid-osx.so +0 -0
  404. data/lib/rubyfox/server/data/lib/jetty/lib/spring/jetty-spring-9.3.11.v20160721.jar +0 -0
  405. data/lib/rubyfox/server/data/lib/jetty/lib/start.jar +0 -0
  406. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-api-9.3.11.v20160721.jar +0 -0
  407. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-client-9.3.11.v20160721.jar +0 -0
  408. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-common-9.3.11h.v20160721.jar +0 -0
  409. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-server-9.3.11.v20160721.jar +0 -0
  410. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-servlet-9.3.11.v20160721.jar +0 -0
  411. data/lib/rubyfox/server/data/lib/jetty/license-eplv10-aslv20.html +0 -576
  412. data/lib/rubyfox/server/data/lib/jetty/modules/.donotdelete +0 -0
  413. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0.mod +0 -8
  414. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_05.mod +0 -8
  415. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_101.mod +0 -8
  416. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_102.mod +0 -8
  417. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_11.mod +0 -8
  418. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_20.mod +0 -8
  419. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_25.mod +0 -8
  420. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_31.mod +0 -8
  421. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_40.mod +0 -8
  422. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_45.mod +0 -8
  423. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_51.mod +0 -8
  424. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_60.mod +0 -8
  425. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_65.mod +0 -8
  426. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_66.mod +0 -8
  427. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_71.mod +0 -8
  428. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_72.mod +0 -8
  429. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_73.mod +0 -8
  430. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_74.mod +0 -8
  431. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_77.mod +0 -8
  432. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_91.mod +0 -8
  433. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_92.mod +0 -8
  434. data/lib/rubyfox/server/data/lib/jetty/modules/alpn.mod +0 -53
  435. data/lib/rubyfox/server/data/lib/jetty/modules/annotations.mod +0 -17
  436. data/lib/rubyfox/server/data/lib/jetty/modules/apache-jsp.mod +0 -10
  437. data/lib/rubyfox/server/data/lib/jetty/modules/apache-jstl.mod +0 -9
  438. data/lib/rubyfox/server/data/lib/jetty/modules/cdi.mod +0 -39
  439. data/lib/rubyfox/server/data/lib/jetty/modules/client.mod +0 -6
  440. data/lib/rubyfox/server/data/lib/jetty/modules/continuation.mod +0 -6
  441. data/lib/rubyfox/server/data/lib/jetty/modules/debug.mod +0 -29
  442. data/lib/rubyfox/server/data/lib/jetty/modules/debuglog.mod +0 -25
  443. data/lib/rubyfox/server/data/lib/jetty/modules/deploy.mod +0 -31
  444. data/lib/rubyfox/server/data/lib/jetty/modules/ext.mod +0 -11
  445. data/lib/rubyfox/server/data/lib/jetty/modules/fcgi.mod +0 -15
  446. data/lib/rubyfox/server/data/lib/jetty/modules/gcloud-memcached-sessions.mod +0 -26
  447. data/lib/rubyfox/server/data/lib/jetty/modules/gcloud-session-idmgr.mod +0 -63
  448. data/lib/rubyfox/server/data/lib/jetty/modules/gcloud-sessions.mod +0 -11
  449. data/lib/rubyfox/server/data/lib/jetty/modules/gzip.mod +0 -23
  450. data/lib/rubyfox/server/data/lib/jetty/modules/hawtio.mod +0 -28
  451. data/lib/rubyfox/server/data/lib/jetty/modules/home-base-warning.mod +0 -7
  452. data/lib/rubyfox/server/data/lib/jetty/modules/http-forwarded.mod +0 -20
  453. data/lib/rubyfox/server/data/lib/jetty/modules/http.mod +0 -39
  454. data/lib/rubyfox/server/data/lib/jetty/modules/http2.mod +0 -20
  455. data/lib/rubyfox/server/data/lib/jetty/modules/http2c.mod +0 -22
  456. data/lib/rubyfox/server/data/lib/jetty/modules/https.mod +0 -14
  457. data/lib/rubyfox/server/data/lib/jetty/modules/infinispan.mod +0 -33
  458. data/lib/rubyfox/server/data/lib/jetty/modules/ipaccess.mod +0 -9
  459. data/lib/rubyfox/server/data/lib/jetty/modules/jaas.mod +0 -17
  460. data/lib/rubyfox/server/data/lib/jetty/modules/jamon.mod +0 -31
  461. data/lib/rubyfox/server/data/lib/jetty/modules/jaspi.mod +0 -10
  462. data/lib/rubyfox/server/data/lib/jetty/modules/jdbc-sessions.mod +0 -27
  463. data/lib/rubyfox/server/data/lib/jetty/modules/jminix.mod +0 -41
  464. data/lib/rubyfox/server/data/lib/jetty/modules/jmx-remote.mod +0 -16
  465. data/lib/rubyfox/server/data/lib/jetty/modules/jmx.mod +0 -13
  466. data/lib/rubyfox/server/data/lib/jetty/modules/jndi.mod +0 -11
  467. data/lib/rubyfox/server/data/lib/jetty/modules/jolokia.mod +0 -19
  468. data/lib/rubyfox/server/data/lib/jetty/modules/jsp.mod +0 -9
  469. data/lib/rubyfox/server/data/lib/jetty/modules/jstl.mod +0 -8
  470. data/lib/rubyfox/server/data/lib/jetty/modules/jvm.mod +0 -22
  471. data/lib/rubyfox/server/data/lib/jetty/modules/logging.mod +0 -36
  472. data/lib/rubyfox/server/data/lib/jetty/modules/lowresources.mod +0 -28
  473. data/lib/rubyfox/server/data/lib/jetty/modules/monitor.mod +0 -13
  474. data/lib/rubyfox/server/data/lib/jetty/modules/nosql.mod +0 -31
  475. data/lib/rubyfox/server/data/lib/jetty/modules/plus.mod +0 -15
  476. data/lib/rubyfox/server/data/lib/jetty/modules/proxy-protocol-ssl.mod +0 -9
  477. data/lib/rubyfox/server/data/lib/jetty/modules/proxy-protocol.mod +0 -9
  478. data/lib/rubyfox/server/data/lib/jetty/modules/proxy.mod +0 -22
  479. data/lib/rubyfox/server/data/lib/jetty/modules/quickstart.mod +0 -11
  480. data/lib/rubyfox/server/data/lib/jetty/modules/requestlog.mod +0 -40
  481. data/lib/rubyfox/server/data/lib/jetty/modules/resources.mod +0 -10
  482. data/lib/rubyfox/server/data/lib/jetty/modules/rewrite-compactpath.mod +0 -10
  483. data/lib/rubyfox/server/data/lib/jetty/modules/rewrite-customizer.mod +0 -24
  484. data/lib/rubyfox/server/data/lib/jetty/modules/rewrite.mod +0 -23
  485. data/lib/rubyfox/server/data/lib/jetty/modules/security.mod +0 -9
  486. data/lib/rubyfox/server/data/lib/jetty/modules/server.mod +0 -79
  487. data/lib/rubyfox/server/data/lib/jetty/modules/servlet.mod +0 -9
  488. data/lib/rubyfox/server/data/lib/jetty/modules/servlets.mod +0 -11
  489. data/lib/rubyfox/server/data/lib/jetty/modules/setuid.mod +0 -19
  490. data/lib/rubyfox/server/data/lib/jetty/modules/spring.mod +0 -17
  491. data/lib/rubyfox/server/data/lib/jetty/modules/ssl.mod +0 -97
  492. data/lib/rubyfox/server/data/lib/jetty/modules/stats.mod +0 -9
  493. data/lib/rubyfox/server/data/lib/jetty/modules/webapp.mod +0 -10
  494. data/lib/rubyfox/server/data/lib/jetty/modules/websocket.mod +0 -12
  495. data/lib/rubyfox/server/data/lib/jetty/notice.html +0 -111
  496. data/lib/rubyfox/server/data/lib/jetty/start.d/README.TXT +0 -24
  497. data/lib/rubyfox/server/data/lib/jetty/start.d/http.ini +0 -7
  498. data/lib/rubyfox/server/data/lib/jetty/start.d/https.ini +0 -10
  499. data/lib/rubyfox/server/data/lib/jetty/start.d/ssl.ini +0 -19
  500. data/lib/rubyfox/server/data/lib/jetty/start.ini +0 -83
  501. data/lib/rubyfox/server/data/www/.keep +0 -0
  502. data/lib/rubyfox/server/data/www/HelloServlet/META-INF/context.xml +0 -2
  503. data/lib/rubyfox/server/data/www/PyServletExample/MyModule$py.class +0 -0
  504. data/lib/rubyfox/server/data/www/PyServletExample/MyModule.py +0 -5
  505. data/lib/rubyfox/server/data/www/PyServletExample/WEB-INF/web.xml +0 -37
  506. data/lib/rubyfox/server/data/www/PyServletExample/errors/404.htm +0 -20
  507. data/lib/rubyfox/server/data/www/PyServletExample/index.py +0 -42
  508. data/lib/rubyfox/server/data/www/root/admin/.keep +0 -0
  509. data/lib/rubyfox/server/data/www/root/admin/AdminTool.swf +0 -0
  510. data/lib/rubyfox/server/data/www/root/admin/ReleaseNotes.txt +0 -201
  511. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/adobeFlashPlayer.png +0 -0
  512. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/advanced.png +0 -0
  513. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/analytics.png +0 -0
  514. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/banManager.png +0 -0
  515. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bannedIPs.png +0 -0
  516. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bannedUsernames.png +0 -0
  517. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bookmarks.png +0 -0
  518. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bootLog.png +0 -0
  519. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/buddyList.png +0 -0
  520. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/buddyProperties.png +0 -0
  521. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/connection.png +0 -0
  522. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/databaseManager.png +0 -0
  523. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/floodFilter.png +0 -0
  524. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/gameSettings.png +0 -0
  525. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/general.png +0 -0
  526. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/globalServerStatus.png +0 -0
  527. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/hTML5WebSockets.png +0 -0
  528. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/iPDiscovery.png +0 -0
  529. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/iPFilter.png +0 -0
  530. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/jVMSettings.png +0 -0
  531. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/logsDownload.png +0 -0
  532. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/mMOSettings.png +0 -0
  533. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/mailer.png +0 -0
  534. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/permissionsAndEvents.png +0 -0
  535. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/privilegeManager.png +0 -0
  536. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/remoteAdmin.png +0 -0
  537. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomExtension.png +0 -0
  538. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomVariables.png +0 -0
  539. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomsAndGroups.png +0 -0
  540. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeLog.png +0 -0
  541. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeRoomSettings.png +0 -0
  542. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeUserSettings.png +0 -0
  543. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeZoneSettings.png +0 -0
  544. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsApplication.png +0 -0
  545. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsDemographics.png +0 -0
  546. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsExceptions.png +0 -0
  547. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsOverview.png +0 -0
  548. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsTechnology.png +0 -0
  549. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/systemQueueStatus.png +0 -0
  550. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/threadPools.png +0 -0
  551. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/userManagement.png +0 -0
  552. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/userVariables.png +0 -0
  553. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/webServer.png +0 -0
  554. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/wordsFilter.png +0 -0
  555. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/zoneExtension.png +0 -0
  556. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/zoneTraffic.png +0 -0
  557. data/lib/rubyfox/server/data/www/root/admin/expressInstall.swf +0 -0
  558. data/lib/rubyfox/server/data/www/root/admin/index.html +0 -124
  559. data/lib/rubyfox/server/data/www/root/admin/modules/Analytics.swf +0 -0
  560. data/lib/rubyfox/server/data/www/root/admin/modules/BanManager.swf +0 -0
  561. data/lib/rubyfox/server/data/www/root/admin/modules/BlueBoxMonitor.swf +0 -0
  562. data/lib/rubyfox/server/data/www/root/admin/modules/Console.swf +0 -0
  563. data/lib/rubyfox/server/data/www/root/admin/modules/Dashboard.swf +0 -0
  564. data/lib/rubyfox/server/data/www/root/admin/modules/ExtensionManager.swf +0 -0
  565. data/lib/rubyfox/server/data/www/root/admin/modules/LicenseManager.swf +0 -0
  566. data/lib/rubyfox/server/data/www/root/admin/modules/LogViewer.swf +0 -0
  567. data/lib/rubyfox/server/data/www/root/admin/modules/ServerConfigurator.swf +0 -0
  568. data/lib/rubyfox/server/data/www/root/admin/modules/ServletManager.swf +0 -0
  569. data/lib/rubyfox/server/data/www/root/admin/modules/ZoneConfigurator.swf +0 -0
  570. data/lib/rubyfox/server/data/www/root/admin/modules/ZoneMonitor.swf +0 -0
  571. data/lib/rubyfox/server/data/www/root/admin/swfobject.js +0 -4
  572. data/lib/rubyfox/server/data/www/root/examples/.keep +0 -0
  573. data/lib/rubyfox/server/data/www/sfs2x-ws.war +0 -0
  574. data/lib/rubyfox/server/data/www/sfs2x-ws.xml +0 -30
  575. data/lib/rubyfox/server/data/zones/BasicExamples.zone.xml +0 -147
@@ -0,0 +1,766 @@
1
+ /*! (c) gotoAndPlay | All rights reserved */
2
+ (window["webpackJsonpapplication"] = window["webpackJsonpapplication"] || []).push([["module-10"],{
3
+
4
+ /***/ "./src/managers/file-datasource-manager.js":
5
+ /*!*************************************************!*\
6
+ !*** ./src/managers/file-datasource-manager.js ***!
7
+ \*************************************************/
8
+ /*! exports provided: FileDataSourceManager */
9
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
10
+
11
+ "use strict";
12
+ __webpack_require__.r(__webpack_exports__);
13
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FileDataSourceManager", function() { return FileDataSourceManager; });
14
+ class FileDataSourceManager
15
+ {
16
+ constructor(libFolder, protectedFolders, fileSeparator)
17
+ {
18
+ this._protectedFolders = protectedFolders; // Folders which can't be deleted (but their content can)
19
+ this._libFolder = libFolder;
20
+ this._fileSeparator = fileSeparator;
21
+ }
22
+
23
+ get dataSource()
24
+ {
25
+ return this._dataSource;
26
+ }
27
+
28
+ init()
29
+ {
30
+ this._dataSource = new kendo.data.TreeListDataSource({
31
+ data: [],
32
+ schema: {
33
+ model: {
34
+ id: 'id',
35
+ parentId: 'parentId',
36
+ expanded: false
37
+ }
38
+ },
39
+ sort: { field: 'name', dir: 'asc' }
40
+ });
41
+ }
42
+
43
+ addFile(fileObj, parentLevel = null)
44
+ {
45
+ let file = {};
46
+
47
+ file.name = fileObj.getUtfString('name');
48
+ file.isDir = fileObj.getBool('isDir');
49
+ file.lastMod = fileObj.getLong('lastMod');
50
+ file.isLib = (file.isDir && file.name == this._libFolder);
51
+ file.isProtected = (file.isDir && this._protectedFolders.indexOf(file.name) > -1);
52
+ file.size = 0;
53
+
54
+ if (parentLevel == null)
55
+ file.level = 0;
56
+ else
57
+ file.level = parentLevel + 1;
58
+
59
+ if (fileObj.containsKey('parent'))
60
+ {
61
+ file.parentId = fileObj.getUtfString('parent');
62
+ file.id = file.parentId + this._fileSeparator + file.name;
63
+ }
64
+ else
65
+ {
66
+ file.parentId = null;
67
+ file.id = file.name;
68
+ }
69
+
70
+ // Add child files
71
+ if (file.isDir)
72
+ {
73
+ let filesArr = fileObj.getSFSArray('files');
74
+
75
+ for (let i = 0; i < filesArr.size(); i++)
76
+ file.size += this.addFile(filesArr.getSFSObject(i), file.level);
77
+ }
78
+ else
79
+ file.size = fileObj.getLong('size');
80
+
81
+ // Add file to data source
82
+ this._dataSource.add(file);
83
+
84
+ // Return file size
85
+ return file.size;
86
+ }
87
+
88
+ removeFile(id)
89
+ {
90
+ let fileItem = this._dataSource.get(id);
91
+
92
+ if (fileItem)
93
+ {
94
+ if (fileItem.parentId)
95
+ {
96
+ // Subtract old size from parent size
97
+ let parentItem = this._dataSource.get(fileItem.parentId);
98
+ this._updateParentSize(parentItem, -fileItem.size);
99
+ }
100
+
101
+ this._dataSource.remove(fileItem);
102
+
103
+ // Return parent item
104
+ if (fileItem.parentId)
105
+ return this._dataSource.get(fileItem.parentId);
106
+ }
107
+ }
108
+
109
+ getFileById(id)
110
+ {
111
+ return this._dataSource.get(id);
112
+ }
113
+
114
+ addFileToParent(fileObj, parentId)
115
+ {
116
+ let parentItem = this._dataSource.get(parentId);
117
+
118
+ if (parentItem != null && parentItem.isDir)
119
+ {
120
+ const fileId = parentId + this._fileSeparator + fileObj.getUtfString('name');
121
+ let fileItem = this._dataSource.get(fileId);
122
+
123
+ if (fileItem != null)
124
+ {
125
+ // Subtract old size from parent size
126
+ this._updateParentSize(parentItem, -fileItem.size);
127
+
128
+ // Update existing item
129
+ fileItem.name = fileObj.getUtfString('name');
130
+ fileItem.lastMod = fileObj.getLong('lastMod');
131
+ fileItem.size = fileObj.getLong('size');
132
+ }
133
+ else
134
+ {
135
+ // Add new item
136
+ this.addFile(fileObj, parentItem.level);
137
+ }
138
+
139
+ // Update parent item size
140
+ this._updateParentSize(parentItem, fileObj.getLong('size'));
141
+
142
+ return fileId;
143
+ }
144
+ else
145
+ throw new Error(`An unexpected error occurred while adding file '${fileObj.getUtfString('name')}' (target: ${parentId}).`);
146
+ }
147
+
148
+ _updateParentSize(parentItem, value)
149
+ {
150
+ parentItem.size += value;
151
+
152
+ if (parentItem.parentId)
153
+ {
154
+ let grandParent = this._dataSource.get(parentItem.parentId);
155
+ this._updateParentSize(grandParent, value);
156
+ }
157
+ }
158
+ }
159
+
160
+
161
+ /***/ }),
162
+
163
+ /***/ "./src/modules/servlet-manager.js":
164
+ /*!****************************************!*\
165
+ !*** ./src/modules/servlet-manager.js ***!
166
+ \****************************************/
167
+ /*! exports provided: default */
168
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
169
+
170
+ "use strict";
171
+ __webpack_require__.r(__webpack_exports__);
172
+ /* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ServletManager; });
173
+ /* harmony import */ var _base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base-module */ "./src/modules/base-module.js");
174
+ /* harmony import */ var _managers_file_datasource_manager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../managers/file-datasource-manager */ "./src/managers/file-datasource-manager.js");
175
+ /* harmony import */ var _utils_utilities__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/utilities */ "./src/utils/utilities.js");
176
+
177
+
178
+
179
+
180
+ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
181
+ {
182
+ constructor()
183
+ {
184
+ super('servletMan');
185
+
186
+ // Outgoing requests
187
+ this.REQ_INIT = 'init';
188
+ this.REQ_GET_SERVLETS = 'getServlets';
189
+ this.REQ_CREATE_FOLDER = 'createFolder';
190
+ this.REQ_DELETE_FILES = 'deleteSrvltFiles';
191
+
192
+ // Incoming responses
193
+ this.RESP_LOCKED = 'lock';
194
+ this.RESP_INIT = 'init';
195
+ this.RESP_SERVLETS = 'servlets';
196
+ this.RESP_FILE_ADDED = 'fileAdded';
197
+ this.RESP_FILES_DELETED = 'filesDeleted';
198
+ this.RESP_ERROR = 'error';
199
+ }
200
+
201
+ //------------------------------------
202
+ // COMMON MODULE INTERFACE METHODS
203
+ // This members are used by the main controller
204
+ // to communicate with the module's controller.
205
+ //------------------------------------
206
+
207
+ initialize(idData, shellController)
208
+ {
209
+ // Call super method
210
+ super.initialize(idData, shellController);
211
+
212
+ // Initialize progress bar
213
+ $('#svm-progressBar').kendoProgressBar({
214
+ min: 0,
215
+ max: 100,
216
+ value: false,
217
+ type: 'value',
218
+ animation: {
219
+ duration: 400
220
+ }
221
+ });
222
+
223
+ // Add listeners to buttons
224
+ $('#svm-retryBt').on('click', $.proxy(this._onRetryClick, this));
225
+ $('#svm-refreshBt').on('click', $.proxy(this._onRefreshClick, this));
226
+
227
+ // Initialize files list
228
+ this._filesList = $('#svm-fileList').kendoTreeList({
229
+ dataSource: [],
230
+ resizable: true,
231
+ selectable: true,
232
+ columns: [
233
+ {
234
+ field: 'name',
235
+ title: 'Name',
236
+ template: kendo.template(`
237
+ <div >
238
+ # if (isDir) { #
239
+ # if (expanded) { #
240
+ <i class="fas fa-folder-open"></i>
241
+ # } else { #
242
+ <i class="fas fa-folder"></i>
243
+ # } #
244
+ # } else { #
245
+ <i class="far fa-file"></i>
246
+ # } #
247
+
248
+ #: name #
249
+
250
+ </div>
251
+ <div class="file-controls flex-grow-1 text-right" data-item-id="#:id#">
252
+ # if (isDir) { #
253
+ <button type="button" class="k-button k-primary my-1 create-folder-bt"><i class="fas fa-folder-plus"></i></button>
254
+ <button type="button" class="k-button k-primary my-1 upload-files-bt"><i class="fas fa-file-upload"></i></button>
255
+ # } #
256
+
257
+ # if (level > 0 && !isProtected) { #
258
+ <button type="button" class="k-button k-primary my-1 remove-file-bt"><i class="fas fa-minus-circle"></i></button>
259
+ # } #
260
+ </div>
261
+ `),
262
+ },
263
+ {
264
+ field: 'size',
265
+ title: 'Size',
266
+ template: function(dataItem) {
267
+ dataItem.bytesToSize = _utils_utilities__WEBPACK_IMPORTED_MODULE_2__["bytesToSize"]; // Pass bytesToSize utility function to template
268
+ return kendo.template(`
269
+ #: bytesToSize(size, 2, 'KB') #
270
+ `)(dataItem);
271
+ },
272
+ width: 120,
273
+ minScreenWidth: 576
274
+ },
275
+ {
276
+ field: 'lastMod',
277
+ title: 'Last Modified',
278
+ template: kendo.template(`
279
+ #: kendo.toString(new Date(lastMod), 'dd MMM yyyy HH:mm:ss') #
280
+ `),
281
+ width: 200,
282
+ minScreenWidth: 768
283
+ },
284
+ ],
285
+ change: $.proxy(this._onFileSelectedChange, this)
286
+ }).data('kendoTreeList');
287
+
288
+ //-------------------------------------------
289
+
290
+ // Add listeners to catch control button clicks on rows
291
+ $('#svm-fileList').on('click', '.create-folder-bt', $.proxy(this._showAddFolderModalClick, this));
292
+ $('#svm-fileList').on('click', '.upload-files-bt', $.proxy(this._showUploadFilesModalClick, this));
293
+ $('#svm-fileList').on('click', '.remove-file-bt', $.proxy(this._onRemoveFileClick, this));
294
+
295
+ //-------------------------------------------
296
+
297
+ // Initialize "add folder" modal
298
+ this._addFolderModal = $('#svm-addFolderModal');
299
+ this._addFolderModal.modal({
300
+ backdrop: 'static',
301
+ keyboard: false,
302
+ show: false
303
+ });
304
+
305
+ // Add listener to modal hide event
306
+ this._addFolderModal.on('hidden.bs.modal', $.proxy(this._onAddFolderModalHidden, this));
307
+
308
+ // Add listener to Add button click
309
+ $('#svm-addFolderBt').on('click', $.proxy(this._onAddFolderClick, this));
310
+
311
+ // Initialize kendo validation on folder name form
312
+ this._addFolderValidator = $('#svm-addFolderForm').kendoValidator({}).data('kendoValidator');
313
+
314
+ //-------------------------------------------
315
+
316
+ // Initialize "upload files" modal
317
+ this._uploadFilesModal = $('#svm-uploadModal');
318
+ this._uploadFilesModal.modal({
319
+ backdrop: 'static',
320
+ keyboard: false,
321
+ show: false
322
+ });
323
+
324
+ // Initialize kendo uploader
325
+ this._uploader = $('#svm-uploader').kendoUpload({
326
+ multiple: true,
327
+ async: {
328
+ saveUrl: 'http://localhost', // This will be changed later in _onUploadStart method
329
+ autoUpload: true,
330
+ },
331
+ directoryDrop: true,
332
+ upload: $.proxy(this._onUploadStart, this),
333
+ complete: $.proxy(this._onUploadEnd, this),
334
+ localization: {
335
+ select: 'Select files...'
336
+ }
337
+ }).data('kendoUpload');
338
+
339
+ // Add listener to Upload button click
340
+ $('#svm-clearFilesBt').on('click', $.proxy(this._onClearFilesClick, this));
341
+
342
+ //-------------------------------------------
343
+
344
+ // Send initialization request
345
+ this.sendExtensionRequest(this.REQ_INIT);
346
+ }
347
+
348
+ destroy()
349
+ {
350
+ // Call super method
351
+ super.destroy();
352
+
353
+ $('#svm-retryBt').off('click');
354
+ $('#svm-refreshBt').off('click');
355
+
356
+ $('#svm-fileList').off('click');
357
+
358
+ this._addFolderModal.off('hidden.bs.modal');
359
+ this._addFolderModal.modal('dispose');
360
+ $('#svm-addFolderBt').off('click');
361
+
362
+ this._uploadFilesModal.modal('dispose');
363
+ $('#svm-clearFilesBt').off('click');
364
+ }
365
+
366
+ onExtensionCommand(command, data)
367
+ {
368
+ // Module can be enabled (no locking file exists)
369
+ if (command == this.RESP_INIT)
370
+ {
371
+ // Retrieve file separator
372
+ this._fileSeparator = data.getUtfString('sep');
373
+
374
+ // Create file data source manager
375
+ this._fileManager = new _managers_file_datasource_manager__WEBPACK_IMPORTED_MODULE_1__["FileDataSourceManager"](null, [], this._fileSeparator);
376
+
377
+ // Retrieve HTTP port to be used for files uploading
378
+ const uploadHttpPort = data.getInt('httpPort');
379
+
380
+ // Retrieve module id sent by the server (required because multiple modules use file uploading service)
381
+ const uploadModuleId = data.getUtfString('modId');
382
+
383
+ // Set file uploading target configuration
384
+ this._uploadTargetConfig = {
385
+ sessionToken: this.smartFox.sessionToken,
386
+ host: this.smartFox.config.host,
387
+ httpPort: uploadHttpPort,
388
+ moduleId: uploadModuleId,
389
+ };
390
+
391
+ // Request Servlet files data to server instance
392
+ this._refreshDataList();
393
+ }
394
+
395
+ /*
396
+ * This response is returned if the file UploadsLock.txt exists in the /config folder of the server.
397
+ * This is an additional security measure to avoid unwanted files to be uploaded by malicius users accessing the server
398
+ * with the default credentials, in case they have not been changed by the administrator after the installation.
399
+ * The file must be removed manually before accessing the Servlet Manager module for the first time
400
+ */
401
+ else if (command == this.RESP_LOCKED)
402
+ {
403
+ // Show warning
404
+ this._switchView('svm-locked');
405
+ }
406
+
407
+ // Servlet folders and files
408
+ else if (command == this.RESP_SERVLETS)
409
+ {
410
+ // Retrieve Servlets file list
411
+ let servletsObj = data.getSFSObject('servlets');
412
+
413
+ // Initialize manager
414
+ this._fileManager.init();
415
+
416
+ // Add list to manager
417
+ this._fileManager.addFile(servletsObj);
418
+
419
+ // Set TreeList data source
420
+ this._filesList.setDataSource(this._fileManager.dataSource);
421
+
422
+ // Expand first level
423
+ this._filesList.expand($('#svm-fileList tbody>tr:eq(0)'));
424
+
425
+ // Enable interface
426
+ this._enableInterface(true);
427
+
428
+ // Show module's main view
429
+ this._switchView('svm-main');
430
+ }
431
+
432
+ // An error occurred while managing servlet files
433
+ else if (command == this.RESP_ERROR)
434
+ {
435
+ // Hide add folder modal
436
+ this._addFolderModal.modal('hide');
437
+
438
+ // Re-enable interface
439
+ this._enableInterface(true);
440
+
441
+ // Show an alert
442
+ this.shellCtrl.showSimpleAlert(data.getUtfString('error'));
443
+ }
444
+
445
+ // Servlet folder or file added
446
+ else if (command == this.RESP_FILE_ADDED)
447
+ {
448
+ // Get name of the user who added the file/folder
449
+ const requester = data.getUtfString('user');
450
+
451
+ // Get the object representing the file/folder being added
452
+ const fileObj = data.getSFSObject('file');
453
+
454
+ // Get the target folder where the new file/folder should be added
455
+ const parentPath = data.getUtfString('parent');
456
+
457
+ // Get the flag notifying this was a file upload
458
+ const isUpload = data.getBool('isUpload');
459
+
460
+ try
461
+ {
462
+ // Add/update item on data source
463
+ const filePath = this._fileManager.addFileToParent(fileObj, parentPath);
464
+
465
+ // Refresh view
466
+ this._filesList.refresh();
467
+
468
+ if (requester == this.smartFox.mySelf.name)
469
+ {
470
+ // Expand parent
471
+ this._filesList.expand($(`#svm-fileList .file-controls[data-item-id="${parentPath}"]`).closest('tr'));
472
+
473
+ if (!isUpload)
474
+ {
475
+ // Hide modal
476
+ this._addFolderModal.modal('hide');
477
+
478
+ // Select upload file
479
+ this._filesList.select($(`#svm-fileList .file-controls[data-item-id="${filePath}"]`).closest('tr'));
480
+ }
481
+
482
+ // Update selection
483
+ this._onFileSelectedChange();
484
+ }
485
+ else
486
+ {
487
+ // Display notification
488
+ if (!isUpload)
489
+ this.shellCtrl.showNotification(`Folder created`, `Administrator ${requester} created folder: <strong>${filePath}</strong>`);
490
+ else
491
+ this.shellCtrl.showNotification(`File uploaded`, `Administrator ${requester} uploaded file: <strong>${filePath}</strong>`);
492
+ }
493
+ }
494
+ catch (e)
495
+ {
496
+ // This should not happen... data source is corrupted?
497
+ if (requester == this.smartFox.mySelf.name)
498
+ this.shellCtrl.showSimpleAlert(e.message, true);
499
+ }
500
+
501
+ // Enable interface
502
+ this._enableInterface(true);
503
+ }
504
+
505
+ // Servlet files deleted
506
+ else if (command == this.RESP_FILES_DELETED)
507
+ {
508
+ // Get name of the user who deleted the file/s
509
+ const requester = data.getUtfString('user');
510
+
511
+ // Get the list of deleted files
512
+ let files = data.getSFSArray('files');
513
+
514
+ let filesArr = [];
515
+
516
+ // Update data source
517
+ for (let j = 0; j < files.size(); j++)
518
+ {
519
+ let path = files.getUtfString(j);
520
+ filesArr.push(path);
521
+
522
+ //------------------------
523
+
524
+ // Remove item from data source; parent item is returned
525
+ let parentItem = this._fileManager.removeFile(path);
526
+
527
+ // Collapse parent if the last of its children was deleted
528
+ if (parentItem && !parentItem.hasChildren)
529
+ this._filesList.collapse($(`#svm-fileList .file-controls[data-item-id="${parentItem.id}"]`).closest('tr'));
530
+ }
531
+
532
+ if (requester == this.smartFox.mySelf.name)
533
+ {
534
+ // Display notification
535
+ this.shellCtrl.showNotification(`${this._selectedItem.isDir ? 'Folder' : 'File'} deleted`, `${this._selectedItem.isDir ? 'Folder' : 'File'} '${this._selectedItem.name}' deleted successfully`);
536
+
537
+ this._selectedItem = null;
538
+
539
+ this._enableInterface(true);
540
+ }
541
+ else
542
+ {
543
+ // Display notification
544
+ this.shellCtrl.showNotification(`File deleted`, `Administrator ${requester} deleted the following file${filesArr.length > 1 ? 's' : ''}: <strong>${filesArr.join('<br> ')}</strong>`);
545
+ }
546
+
547
+ // Reset selection
548
+ this._onFileSelectedChange();
549
+ }
550
+
551
+ // else if ()
552
+ }
553
+
554
+ //---------------------------------
555
+ // UI EVENT LISTENERS
556
+ //---------------------------------
557
+
558
+ _onRetryClick()
559
+ {
560
+ this._switchView('svm-init');
561
+
562
+ // Re-send initialization request
563
+ this.sendExtensionRequest(this.REQ_INIT);
564
+ }
565
+
566
+ _onRefreshClick()
567
+ {
568
+ this._filesList.clearSelection();
569
+ this._refreshDataList();
570
+ }
571
+
572
+ _onFileSelectedChange()
573
+ {
574
+ // Hide control buttons on currently selected item
575
+ if (this._selectedItem)
576
+ $(`#svm-fileList .file-controls[data-item-id="${this._selectedItem.id}"]`).hide();
577
+
578
+ // Get selected item
579
+ let selectedRows = this._filesList.select();
580
+
581
+ if (selectedRows.length > 0)
582
+ {
583
+ // Save ref. to selected item
584
+ this._selectedItem = this._filesList.dataItem(selectedRows[0]);
585
+
586
+ // Show control buttons on new selected item
587
+ $(`#svm-fileList .file-controls[data-item-id="${this._selectedItem.id}"]`).show();
588
+ }
589
+ else
590
+ this._selectedItem = null;
591
+ }
592
+
593
+ _showAddFolderModalClick()
594
+ {
595
+ if (this._selectedItem && this._selectedItem.isDir)
596
+ {
597
+ this._addFolderModal.modal('show');
598
+ $('#svm-folderNameIn').focus();
599
+ }
600
+ }
601
+
602
+ _onAddFolderClick()
603
+ {
604
+ // The parent folder could have been deleted while user is still typing the name of the new child folder
605
+ if (!this._selectedItem)
606
+ {
607
+ this._addFolderModal.modal('hide');
608
+ this.shellCtrl.showSimpleAlert('Unable to create folder; the parent folder doesn\'t exist.');
609
+ return;
610
+ }
611
+
612
+ if (this._addFolderValidator.validate())
613
+ {
614
+ // Disable modal interface
615
+ this._enableAddFolderModal(false);
616
+
617
+ let data = new SFS2X.SFSObject();
618
+ data.putUtfString('folder', this._selectedItem.id + this._fileSeparator + $('#svm-folderNameIn').val());
619
+
620
+ // Send request to server
621
+ this.sendExtensionRequest(this.REQ_CREATE_FOLDER, data);
622
+ }
623
+ }
624
+
625
+ _onAddFolderModalHidden()
626
+ {
627
+ $('#svm-folderNameIn').val('');
628
+ this._resetAddFolderValidation();
629
+
630
+ // Enable modal interface
631
+ this._enableAddFolderModal(true);
632
+ }
633
+
634
+ _showUploadFilesModalClick()
635
+ {
636
+ if (this._selectedItem)
637
+ this._uploadFilesModal.modal('show');
638
+ }
639
+
640
+ _onClearFilesClick()
641
+ {
642
+ this._uploader.clearAllFiles();
643
+ }
644
+
645
+ _onUploadStart(e)
646
+ {
647
+ // Disable clear button
648
+ $('#svm-clearFilesBt').attr('disabled', true);
649
+
650
+ // Set destination url
651
+ const url = 'http://' + this._uploadTargetConfig.host + ':' + this._uploadTargetConfig.httpPort + '/BlueBox/SFS2XFileUpload?sessHashId=' + this._uploadTargetConfig.sessionToken;
652
+
653
+ e.sender.options.async.saveUrl = url;
654
+
655
+ // Set payload
656
+ const params = new FormData();
657
+ params.append('__module', this._uploadTargetConfig.moduleId);
658
+ params.append('__target', this._selectedItem.id);
659
+
660
+ for (let f = 0; f < e.files.length; f++)
661
+ params.append('files[]', e.files[f].rawFile);
662
+
663
+ e.formData = params;
664
+ }
665
+
666
+ _onUploadEnd(e)
667
+ {
668
+ // Enable clear button
669
+ $('#svm-clearFilesBt').attr('disabled', false);
670
+ }
671
+
672
+ _onFilesUploadEnd(response)
673
+ {
674
+ // Nothing to do: we have to wait the upload process completion to be signaled by the server through the dedicated Extension response
675
+
676
+ //=================================================================
677
+
678
+ // TODO Should we handle this response in some way? For some unknown reason we always get ok=false and status=0
679
+ // console.log(response)
680
+ // console.log(response.ok)
681
+ // console.log(response.status)
682
+ }
683
+
684
+ _onRemoveFileClick()
685
+ {
686
+ if (this._selectedItem)
687
+ this.shellCtrl.showConfirmWarning(`Are you sure you want to delete the selected ${this._selectedItem.isDir ? 'folder' : 'file'}?<br><br>Path: <strong>${this._selectedItem.id}</strong>`, $.proxy(this._onRemoveFileConfirm, this));
688
+ }
689
+
690
+ _onRemoveFileConfirm()
691
+ {
692
+ // Disable interface
693
+ this._enableInterface(false);
694
+
695
+ // Request Servlet files removal
696
+ // NOTE: for compatibility with older AdminTool, the file to be deleted is sent
697
+ // in an array of strings, even if we can't delete more than 1 file at once in this AdminTool
698
+
699
+ let files = new SFS2X.SFSArray();
700
+ files.addUtfString(this._selectedItem.id);
701
+
702
+ let params = new SFS2X.SFSObject();
703
+ params.putSFSArray('files', files);
704
+
705
+ this.sendExtensionRequest(this.REQ_DELETE_FILES, params);
706
+ }
707
+
708
+ //------------------------------------
709
+ // PRIVATE METHODS
710
+ //------------------------------------
711
+
712
+ _switchView(viewId)
713
+ {
714
+ document.getElementById('svm-viewstack').selectedElement = document.getElementById(viewId);
715
+ }
716
+
717
+ _enableInterface(enable)
718
+ {
719
+ $('#svm-fileList').attr('disabled', !enable);
720
+ $('#svm-refreshBt').attr('disabled', !enable);
721
+ }
722
+
723
+ _refreshDataList()
724
+ {
725
+ // Disable interface
726
+ this._enableInterface(false);
727
+
728
+ // Send request to server
729
+ this.sendExtensionRequest(this.REQ_GET_SERVLETS)
730
+ }
731
+
732
+ _resetAddFolderValidation()
733
+ {
734
+ this._addFolderValidator.hideMessages();
735
+
736
+ // The method above doesn't remove the k-invalid classes and aria-invalid="true" attributes from inputs
737
+ // Let's do it manually
738
+ $('#svm-addFolderForm .k-invalid').removeClass('k-invalid');
739
+ $('#svm-addFolderForm [aria-invalid="true"]').removeAttr('aria-invalid');
740
+ }
741
+
742
+ _enableAddFolderModal(enable)
743
+ {
744
+ // Disable modal close buttons
745
+ $('#svm-addFolderModal button[data-dismiss="modal"]').attr('disabled', !enable);
746
+
747
+ // Disable add button
748
+ $('#svm-addFolderBt').attr('disabled', !enable);
749
+
750
+ // Disable fieldset
751
+ $('#svm-addFolderForm').attr('disabled', !enable);
752
+ }
753
+
754
+ //---------------------------------
755
+ // PRIVATE GETTERS
756
+ //---------------------------------
757
+
758
+
759
+ }
760
+
761
+ /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "jquery")))
762
+
763
+ /***/ })
764
+
765
+ }]);
766
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMTAuYnVuZGxlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbWFuYWdlcnMvZmlsZS1kYXRhc291cmNlLW1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbW9kdWxlcy9zZXJ2bGV0LW1hbmFnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEZpbGVEYXRhU291cmNlTWFuYWdlclxue1xuXHRjb25zdHJ1Y3RvcihsaWJGb2xkZXIsIHByb3RlY3RlZEZvbGRlcnMsIGZpbGVTZXBhcmF0b3IpXG5cdHtcblx0XHR0aGlzLl9wcm90ZWN0ZWRGb2xkZXJzID0gcHJvdGVjdGVkRm9sZGVyczsgLy8gRm9sZGVycyB3aGljaCBjYW4ndCBiZSBkZWxldGVkIChidXQgdGhlaXIgY29udGVudCBjYW4pXG5cdFx0dGhpcy5fbGliRm9sZGVyID0gbGliRm9sZGVyO1xuXHRcdHRoaXMuX2ZpbGVTZXBhcmF0b3IgPSBmaWxlU2VwYXJhdG9yO1xuXHR9XG5cblx0Z2V0IGRhdGFTb3VyY2UoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2RhdGFTb3VyY2U7XG5cdH1cblxuXHRpbml0KClcblx0e1xuXHRcdHRoaXMuX2RhdGFTb3VyY2UgPSBuZXcga2VuZG8uZGF0YS5UcmVlTGlzdERhdGFTb3VyY2Uoe1xuXHRcdFx0ZGF0YTogW10sXG5cdFx0XHRzY2hlbWE6IHtcblx0XHRcdFx0bW9kZWw6IHtcblx0XHRcdFx0XHRpZDogJ2lkJyxcblx0XHRcdFx0XHRwYXJlbnRJZDogJ3BhcmVudElkJyxcblx0XHRcdFx0XHRleHBhbmRlZDogZmFsc2Vcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHNvcnQ6IHsgZmllbGQ6ICduYW1lJywgZGlyOiAnYXNjJyB9XG5cdFx0fSk7XG5cdH1cblxuXHRhZGRGaWxlKGZpbGVPYmosIHBhcmVudExldmVsID0gbnVsbClcblx0e1xuXHRcdGxldCBmaWxlID0ge307XG5cblx0XHRmaWxlLm5hbWUgPSBmaWxlT2JqLmdldFV0ZlN0cmluZygnbmFtZScpO1xuXHRcdGZpbGUuaXNEaXIgPSBmaWxlT2JqLmdldEJvb2woJ2lzRGlyJyk7XG5cdFx0ZmlsZS5sYXN0TW9kID0gZmlsZU9iai5nZXRMb25nKCdsYXN0TW9kJyk7XG5cdFx0ZmlsZS5pc0xpYiA9IChmaWxlLmlzRGlyICYmIGZpbGUubmFtZSA9PSB0aGlzLl9saWJGb2xkZXIpO1xuXHRcdGZpbGUuaXNQcm90ZWN0ZWQgPSAoZmlsZS5pc0RpciAmJiB0aGlzLl9wcm90ZWN0ZWRGb2xkZXJzLmluZGV4T2YoZmlsZS5uYW1lKSA+IC0xKTtcblx0XHRmaWxlLnNpemUgPSAwO1xuXG5cdFx0aWYgKHBhcmVudExldmVsID09IG51bGwpXG5cdFx0XHRmaWxlLmxldmVsID0gMDtcblx0XHRlbHNlXG5cdFx0XHRmaWxlLmxldmVsID0gcGFyZW50TGV2ZWwgKyAxO1xuXG5cdFx0aWYgKGZpbGVPYmouY29udGFpbnNLZXkoJ3BhcmVudCcpKVxuXHRcdHtcblx0XHRcdGZpbGUucGFyZW50SWQgPSBmaWxlT2JqLmdldFV0ZlN0cmluZygncGFyZW50Jyk7XG5cdFx0XHRmaWxlLmlkID0gZmlsZS5wYXJlbnRJZCArIHRoaXMuX2ZpbGVTZXBhcmF0b3IgKyBmaWxlLm5hbWU7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRmaWxlLnBhcmVudElkID0gbnVsbDtcblx0XHRcdGZpbGUuaWQgPSBmaWxlLm5hbWU7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGNoaWxkIGZpbGVzXG5cdFx0aWYgKGZpbGUuaXNEaXIpXG5cdFx0e1xuXHRcdFx0bGV0IGZpbGVzQXJyID0gZmlsZU9iai5nZXRTRlNBcnJheSgnZmlsZXMnKTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlc0Fyci5zaXplKCk7IGkrKylcblx0XHRcdFx0ZmlsZS5zaXplICs9IHRoaXMuYWRkRmlsZShmaWxlc0Fyci5nZXRTRlNPYmplY3QoaSksIGZpbGUubGV2ZWwpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHRmaWxlLnNpemUgPSBmaWxlT2JqLmdldExvbmcoJ3NpemUnKTtcblxuXHRcdC8vIEFkZCBmaWxlIHRvIGRhdGEgc291cmNlXG5cdFx0dGhpcy5fZGF0YVNvdXJjZS5hZGQoZmlsZSk7XG5cblx0XHQvLyBSZXR1cm4gZmlsZSBzaXplXG5cdFx0cmV0dXJuIGZpbGUuc2l6ZTtcblx0fVxuXG5cdHJlbW92ZUZpbGUoaWQpXG5cdHtcblx0XHRsZXQgZmlsZUl0ZW0gPSB0aGlzLl9kYXRhU291cmNlLmdldChpZCk7XG5cblx0XHRpZiAoZmlsZUl0ZW0pXG5cdFx0e1xuXHRcdFx0aWYgKGZpbGVJdGVtLnBhcmVudElkKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTdWJ0cmFjdCBvbGQgc2l6ZSBmcm9tIHBhcmVudCBzaXplXG5cdFx0XHRcdGxldCBwYXJlbnRJdGVtID0gdGhpcy5fZGF0YVNvdXJjZS5nZXQoZmlsZUl0ZW0ucGFyZW50SWQpO1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXJlbnRTaXplKHBhcmVudEl0ZW0sIC1maWxlSXRlbS5zaXplKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fZGF0YVNvdXJjZS5yZW1vdmUoZmlsZUl0ZW0pO1xuXG5cdFx0XHQvLyBSZXR1cm4gcGFyZW50IGl0ZW1cblx0XHRcdGlmIChmaWxlSXRlbS5wYXJlbnRJZClcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2RhdGFTb3VyY2UuZ2V0KGZpbGVJdGVtLnBhcmVudElkKTtcblx0XHR9XG5cdH1cblxuXHRnZXRGaWxlQnlJZChpZClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kYXRhU291cmNlLmdldChpZCk7XG5cdH1cblxuXHRhZGRGaWxlVG9QYXJlbnQoZmlsZU9iaiwgcGFyZW50SWQpXG5cdHtcblx0XHRsZXQgcGFyZW50SXRlbSA9IHRoaXMuX2RhdGFTb3VyY2UuZ2V0KHBhcmVudElkKTtcblxuXHRcdGlmIChwYXJlbnRJdGVtICE9IG51bGwgJiYgcGFyZW50SXRlbS5pc0Rpcilcblx0XHR7XG5cdFx0XHRjb25zdCBmaWxlSWQgPSBwYXJlbnRJZCArIHRoaXMuX2ZpbGVTZXBhcmF0b3IgKyBmaWxlT2JqLmdldFV0ZlN0cmluZygnbmFtZScpO1xuXHRcdFx0bGV0IGZpbGVJdGVtID0gdGhpcy5fZGF0YVNvdXJjZS5nZXQoZmlsZUlkKTtcblxuXHRcdFx0aWYgKGZpbGVJdGVtICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFN1YnRyYWN0IG9sZCBzaXplIGZyb20gcGFyZW50IHNpemVcblx0XHRcdFx0dGhpcy5fdXBkYXRlUGFyZW50U2l6ZShwYXJlbnRJdGVtLCAtZmlsZUl0ZW0uc2l6ZSk7XG5cblx0XHRcdFx0Ly8gVXBkYXRlIGV4aXN0aW5nIGl0ZW1cblx0XHRcdFx0ZmlsZUl0ZW0ubmFtZSA9IGZpbGVPYmouZ2V0VXRmU3RyaW5nKCduYW1lJyk7XG5cdFx0XHRcdGZpbGVJdGVtLmxhc3RNb2QgPSBmaWxlT2JqLmdldExvbmcoJ2xhc3RNb2QnKTtcblx0XHRcdFx0ZmlsZUl0ZW0uc2l6ZSA9IGZpbGVPYmouZ2V0TG9uZygnc2l6ZScpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBBZGQgbmV3IGl0ZW1cblx0XHRcdFx0dGhpcy5hZGRGaWxlKGZpbGVPYmosIHBhcmVudEl0ZW0ubGV2ZWwpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgcGFyZW50IGl0ZW0gc2l6ZVxuXHRcdFx0dGhpcy5fdXBkYXRlUGFyZW50U2l6ZShwYXJlbnRJdGVtLCBmaWxlT2JqLmdldExvbmcoJ3NpemUnKSk7XG5cblx0XHRcdHJldHVybiBmaWxlSWQ7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRocm93IG5ldyBFcnJvcihgQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSBhZGRpbmcgZmlsZSAnJHtmaWxlT2JqLmdldFV0ZlN0cmluZygnbmFtZScpfScgKHRhcmdldDogJHtwYXJlbnRJZH0pLmApO1xuXHR9XG5cblx0X3VwZGF0ZVBhcmVudFNpemUocGFyZW50SXRlbSwgdmFsdWUpXG5cdHtcblx0XHRwYXJlbnRJdGVtLnNpemUgKz0gdmFsdWU7XG5cblx0XHRpZiAocGFyZW50SXRlbS5wYXJlbnRJZClcblx0XHR7XG5cdFx0XHRsZXQgZ3JhbmRQYXJlbnQgPSB0aGlzLl9kYXRhU291cmNlLmdldChwYXJlbnRJdGVtLnBhcmVudElkKTtcblx0XHRcdHRoaXMuX3VwZGF0ZVBhcmVudFNpemUoZ3JhbmRQYXJlbnQsIHZhbHVlKTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge0ZpbGVEYXRhU291cmNlTWFuYWdlcn0gZnJvbSAnLi4vbWFuYWdlcnMvZmlsZS1kYXRhc291cmNlLW1hbmFnZXInO1xuaW1wb3J0IHtieXRlc1RvU2l6ZX0gZnJvbSAnLi4vdXRpbHMvdXRpbGl0aWVzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VydmxldE1hbmFnZXIgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ3NlcnZsZXRNYW4nKTtcblxuXHRcdC8vIE91dGdvaW5nIHJlcXVlc3RzXG5cdFx0dGhpcy5SRVFfSU5JVCA9ICdpbml0Jztcblx0XHR0aGlzLlJFUV9HRVRfU0VSVkxFVFMgPSAnZ2V0U2VydmxldHMnO1xuXHRcdHRoaXMuUkVRX0NSRUFURV9GT0xERVIgPSAnY3JlYXRlRm9sZGVyJztcblx0XHR0aGlzLlJFUV9ERUxFVEVfRklMRVMgPSAnZGVsZXRlU3J2bHRGaWxlcyc7XG5cblx0XHQvLyBJbmNvbWluZyByZXNwb25zZXNcblx0XHR0aGlzLlJFU1BfTE9DS0VEID0gJ2xvY2snO1xuXHRcdHRoaXMuUkVTUF9JTklUID0gJ2luaXQnO1xuXHRcdHRoaXMuUkVTUF9TRVJWTEVUUyA9ICdzZXJ2bGV0cyc7XG5cdFx0dGhpcy5SRVNQX0ZJTEVfQURERUQgPSAnZmlsZUFkZGVkJztcblx0XHR0aGlzLlJFU1BfRklMRVNfREVMRVRFRCA9ICdmaWxlc0RlbGV0ZWQnO1xuXHRcdHRoaXMuUkVTUF9FUlJPUiA9ICdlcnJvcic7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBDT01NT04gTU9EVUxFIElOVEVSRkFDRSBNRVRIT0RTXG5cdC8vIFRoaXMgbWVtYmVycyBhcmUgdXNlZCBieSB0aGUgbWFpbiBjb250cm9sbGVyXG5cdC8vIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1vZHVsZSdzIGNvbnRyb2xsZXIuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0aW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcilcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuaW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcik7XG5cblx0XHQvLyBJbml0aWFsaXplIHByb2dyZXNzIGJhclxuXHRcdCQoJyNzdm0tcHJvZ3Jlc3NCYXInKS5rZW5kb1Byb2dyZXNzQmFyKHtcblx0XHRcdG1pbjogMCxcbiAgICAgICAgICAgIG1heDogMTAwLFxuXHRcdFx0dmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJyxcbiAgICAgICAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA0MDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXJzIHRvIGJ1dHRvbnNcblx0XHQkKCcjc3ZtLXJldHJ5QnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmV0cnlDbGljaywgdGhpcykpO1xuXHRcdCQoJyNzdm0tcmVmcmVzaEJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJlZnJlc2hDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBmaWxlcyBsaXN0XG5cdFx0dGhpcy5fZmlsZXNMaXN0ID0gJCgnI3N2bS1maWxlTGlzdCcpLmtlbmRvVHJlZUxpc3Qoe1xuICAgICAgICAgICAgZGF0YVNvdXJjZTogW10sXG5cdFx0XHRyZXNpemFibGU6IHRydWUsXG5cdFx0XHRzZWxlY3RhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29sdW1uczogW1xuICAgICAgICAgICAgICAgIHtcblx0XHRcdFx0XHRmaWVsZDogJ25hbWUnLFxuXHRcdFx0XHRcdHRpdGxlOiAnTmFtZScsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdFx0XHRcdDxkaXYgPlxuXHRcdFx0XHRcdFx0XHQjIGlmIChpc0RpcikgeyAjXG5cdFx0XHRcdFx0XHRcdFx0IyBpZiAoZXhwYW5kZWQpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtZm9sZGVyLW9wZW5cIj48L2k+XG5cdFx0XHRcdFx0XHRcdFx0IyB9IGVsc2UgeyAjXG5cdFx0XHRcdFx0XHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1mb2xkZXJcIj48L2k+XG5cdFx0XHRcdFx0XHRcdFx0IyB9ICNcblx0XHRcdFx0XHRcdFx0IyB9IGVsc2UgeyAjXG5cdFx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXIgZmEtZmlsZVwiPjwvaT5cblx0XHRcdFx0XHRcdFx0IyB9ICNcblxuXHRcdFx0XHRcdFx0XHQjOiBuYW1lICNcblxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmlsZS1jb250cm9scyBmbGV4LWdyb3ctMSB0ZXh0LXJpZ2h0XCIgZGF0YS1pdGVtLWlkPVwiIzppZCNcIj5cblx0XHRcdFx0XHRcdFx0IyBpZiAoaXNEaXIpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1wcmltYXJ5IG15LTEgY3JlYXRlLWZvbGRlci1idFwiPjxpIGNsYXNzPVwiZmFzIGZhLWZvbGRlci1wbHVzXCI+PC9pPjwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1wcmltYXJ5IG15LTEgdXBsb2FkLWZpbGVzLWJ0XCI+PGkgY2xhc3M9XCJmYXMgZmEtZmlsZS11cGxvYWRcIj48L2k+PC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdCMgfSAjXG5cblx0XHRcdFx0XHRcdFx0IyBpZiAobGV2ZWwgPiAwICYmICFpc1Byb3RlY3RlZCkgeyAjXG5cdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnkgbXktMSByZW1vdmUtZmlsZS1idFwiPjxpIGNsYXNzPVwiZmFzIGZhLW1pbnVzLWNpcmNsZVwiPjwvaT48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0IyB9ICNcblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdGApLFxuXHRcdFx0XHR9LFxuICAgICAgICAgICAgICAgIHtcblx0XHRcdFx0XHRmaWVsZDogJ3NpemUnLFxuXHRcdFx0XHRcdHRpdGxlOiAnU2l6ZScsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0XHRcdFx0XHRkYXRhSXRlbS5ieXRlc1RvU2l6ZSA9IGJ5dGVzVG9TaXplOyAvLyBQYXNzIGJ5dGVzVG9TaXplIHV0aWxpdHkgZnVuY3Rpb24gdG8gdGVtcGxhdGVcblx0XHRcdFx0XHRcdHJldHVybiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHRcdFx0XHRcdCM6IGJ5dGVzVG9TaXplKHNpemUsIDIsICdLQicpICNcblx0XHRcdFx0XHRcdGApKGRhdGFJdGVtKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHdpZHRoOiAxMjAsXG5cdFx0XHRcdFx0bWluU2NyZWVuV2lkdGg6IDU3NlxuXHRcdFx0XHR9LFxuICAgICAgICAgICAgICAgIHtcblx0XHRcdFx0XHRmaWVsZDogJ2xhc3RNb2QnLFxuXHRcdFx0XHRcdHRpdGxlOiAnTGFzdCBNb2RpZmllZCcsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdFx0XHRcdCM6IGtlbmRvLnRvU3RyaW5nKG5ldyBEYXRlKGxhc3RNb2QpLCAnZGQgTU1NIHl5eXkgSEg6bW06c3MnKSAjXG5cdFx0XHRcdFx0YCksXG5cdFx0XHRcdFx0d2lkdGg6IDIwMCxcblx0XHRcdFx0XHRtaW5TY3JlZW5XaWR0aDogNzY4XG5cdFx0XHRcdH0sXG4gICAgICAgICAgICBdLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uRmlsZVNlbGVjdGVkQ2hhbmdlLCB0aGlzKVxuICAgICAgICB9KS5kYXRhKCdrZW5kb1RyZWVMaXN0Jyk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIEFkZCBsaXN0ZW5lcnMgdG8gY2F0Y2ggY29udHJvbCBidXR0b24gY2xpY2tzIG9uIHJvd3Ncblx0XHQkKCcjc3ZtLWZpbGVMaXN0Jykub24oJ2NsaWNrJywgJy5jcmVhdGUtZm9sZGVyLWJ0JywgJC5wcm94eSh0aGlzLl9zaG93QWRkRm9sZGVyTW9kYWxDbGljaywgdGhpcykpO1xuXHRcdCQoJyNzdm0tZmlsZUxpc3QnKS5vbignY2xpY2snLCAnLnVwbG9hZC1maWxlcy1idCcsICQucHJveHkodGhpcy5fc2hvd1VwbG9hZEZpbGVzTW9kYWxDbGljaywgdGhpcykpO1xuXHRcdCQoJyNzdm0tZmlsZUxpc3QnKS5vbignY2xpY2snLCAnLnJlbW92ZS1maWxlLWJ0JywgJC5wcm94eSh0aGlzLl9vblJlbW92ZUZpbGVDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBJbml0aWFsaXplIFwiYWRkIGZvbGRlclwiIG1vZGFsXG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwgPSAkKCcjc3ZtLWFkZEZvbGRlck1vZGFsJyk7XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2Vcblx0XHR9KTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBtb2RhbCBoaWRlIGV2ZW50XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwub24oJ2hpZGRlbi5icy5tb2RhbCcsICQucHJveHkodGhpcy5fb25BZGRGb2xkZXJNb2RhbEhpZGRlbiwgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIEFkZCBidXR0b24gY2xpY2tcblx0XHQkKCcjc3ZtLWFkZEZvbGRlckJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkFkZEZvbGRlckNsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHZhbGlkYXRpb24gb24gZm9sZGVyIG5hbWUgZm9ybVxuXHRcdHRoaXMuX2FkZEZvbGRlclZhbGlkYXRvciA9ICQoJyNzdm0tYWRkRm9sZGVyRm9ybScpLmtlbmRvVmFsaWRhdG9yKHt9KS5kYXRhKCdrZW5kb1ZhbGlkYXRvcicpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBJbml0aWFsaXplIFwidXBsb2FkIGZpbGVzXCIgbW9kYWxcblx0XHR0aGlzLl91cGxvYWRGaWxlc01vZGFsID0gJCgnI3N2bS11cGxvYWRNb2RhbCcpO1xuXHRcdHRoaXMuX3VwbG9hZEZpbGVzTW9kYWwubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2Vcblx0XHR9KTtcblxuXHRcdC8vIEluaXRpYWxpemUga2VuZG8gdXBsb2FkZXJcblx0XHR0aGlzLl91cGxvYWRlciA9ICQoJyNzdm0tdXBsb2FkZXInKS5rZW5kb1VwbG9hZCh7XG5cdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdGFzeW5jOiB7XG5cdFx0XHRcdHNhdmVVcmw6ICdodHRwOi8vbG9jYWxob3N0JywgLy8gVGhpcyB3aWxsIGJlIGNoYW5nZWQgbGF0ZXIgaW4gX29uVXBsb2FkU3RhcnQgbWV0aG9kXG5cdFx0XHRcdGF1dG9VcGxvYWQ6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0ZGlyZWN0b3J5RHJvcDogdHJ1ZSxcblx0XHRcdHVwbG9hZDogJC5wcm94eSh0aGlzLl9vblVwbG9hZFN0YXJ0LCB0aGlzKSxcblx0XHRcdGNvbXBsZXRlOiAkLnByb3h5KHRoaXMuX29uVXBsb2FkRW5kLCB0aGlzKSxcblx0XHRcdGxvY2FsaXphdGlvbjoge1xuXHRcdFx0XHRzZWxlY3Q6ICdTZWxlY3QgZmlsZXMuLi4nXG5cdFx0XHR9XG5cdFx0fSkuZGF0YSgna2VuZG9VcGxvYWQnKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBVcGxvYWQgYnV0dG9uIGNsaWNrXG5cdFx0JCgnI3N2bS1jbGVhckZpbGVzQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQ2xlYXJGaWxlc0NsaWNrLCB0aGlzKSk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIFNlbmQgaW5pdGlhbGl6YXRpb24gcmVxdWVzdFxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfSU5JVCk7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXG5cdFx0JCgnI3N2bS1yZXRyeUJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNzdm0tcmVmcmVzaEJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0JCgnI3N2bS1maWxlTGlzdCcpLm9mZignY2xpY2snKTtcblxuXHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm9mZignaGlkZGVuLmJzLm1vZGFsJyk7XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoJ2Rpc3Bvc2UnKTtcblx0XHQkKCcjc3ZtLWFkZEZvbGRlckJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0dGhpcy5fdXBsb2FkRmlsZXNNb2RhbC5tb2RhbCgnZGlzcG9zZScpO1xuXHRcdCQoJyNzdm0tY2xlYXJGaWxlc0J0Jykub2ZmKCdjbGljaycpO1xuXHR9XG5cblx0b25FeHRlbnNpb25Db21tYW5kKGNvbW1hbmQsIGRhdGEpXG5cdHtcblx0XHQvLyBNb2R1bGUgY2FuIGJlIGVuYWJsZWQgKG5vIGxvY2tpbmcgZmlsZSBleGlzdHMpXG5cdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0lOSVQpXG5cdFx0e1xuXHRcdFx0Ly8gUmV0cmlldmUgZmlsZSBzZXBhcmF0b3Jcblx0XHRcdHRoaXMuX2ZpbGVTZXBhcmF0b3IgPSBkYXRhLmdldFV0ZlN0cmluZygnc2VwJyk7XG5cblx0XHRcdC8vIENyZWF0ZSBmaWxlIGRhdGEgc291cmNlIG1hbmFnZXJcblx0XHRcdHRoaXMuX2ZpbGVNYW5hZ2VyID0gbmV3IEZpbGVEYXRhU291cmNlTWFuYWdlcihudWxsLCBbXSwgdGhpcy5fZmlsZVNlcGFyYXRvcik7XG5cblx0XHRcdC8vIFJldHJpZXZlIEhUVFAgcG9ydCB0byBiZSB1c2VkIGZvciBmaWxlcyB1cGxvYWRpbmdcblx0XHRcdGNvbnN0IHVwbG9hZEh0dHBQb3J0ID0gZGF0YS5nZXRJbnQoJ2h0dHBQb3J0Jyk7XG5cblx0XHRcdC8vIFJldHJpZXZlIG1vZHVsZSBpZCBzZW50IGJ5IHRoZSBzZXJ2ZXIgKHJlcXVpcmVkIGJlY2F1c2UgbXVsdGlwbGUgbW9kdWxlcyB1c2UgZmlsZSB1cGxvYWRpbmcgc2VydmljZSlcblx0XHRcdGNvbnN0IHVwbG9hZE1vZHVsZUlkID0gZGF0YS5nZXRVdGZTdHJpbmcoJ21vZElkJyk7XG5cblx0XHRcdC8vIFNldCBmaWxlIHVwbG9hZGluZyB0YXJnZXQgY29uZmlndXJhdGlvblxuXHRcdFx0dGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnID0ge1xuXHRcdFx0XHRzZXNzaW9uVG9rZW46IHRoaXMuc21hcnRGb3guc2Vzc2lvblRva2VuLFxuXHRcdFx0XHRob3N0OiB0aGlzLnNtYXJ0Rm94LmNvbmZpZy5ob3N0LFxuXHRcdFx0XHRodHRwUG9ydDogdXBsb2FkSHR0cFBvcnQsXG5cdFx0XHRcdG1vZHVsZUlkOiB1cGxvYWRNb2R1bGVJZCxcblx0XHRcdH07XG5cblx0XHRcdC8vIFJlcXVlc3QgU2VydmxldCBmaWxlcyBkYXRhIHRvIHNlcnZlciBpbnN0YW5jZVxuXHRcdFx0dGhpcy5fcmVmcmVzaERhdGFMaXN0KCk7XG5cdFx0fVxuXG5cdFx0Lypcblx0XHQgKiBUaGlzIHJlc3BvbnNlIGlzIHJldHVybmVkIGlmIHRoZSBmaWxlIFVwbG9hZHNMb2NrLnR4dCBleGlzdHMgaW4gdGhlIC9jb25maWcgZm9sZGVyIG9mIHRoZSBzZXJ2ZXIuXG5cdFx0ICogVGhpcyBpcyBhbiBhZGRpdGlvbmFsIHNlY3VyaXR5IG1lYXN1cmUgdG8gYXZvaWQgdW53YW50ZWQgZmlsZXMgdG8gYmUgdXBsb2FkZWQgYnkgbWFsaWNpdXMgdXNlcnMgYWNjZXNzaW5nIHRoZSBzZXJ2ZXJcblx0XHQgKiB3aXRoIHRoZSBkZWZhdWx0IGNyZWRlbnRpYWxzLCBpbiBjYXNlIHRoZXkgaGF2ZSBub3QgYmVlbiBjaGFuZ2VkIGJ5IHRoZSBhZG1pbmlzdHJhdG9yIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24uXG5cdFx0ICogVGhlIGZpbGUgbXVzdCBiZSByZW1vdmVkIG1hbnVhbGx5IGJlZm9yZSBhY2Nlc3NpbmcgdGhlIFNlcnZsZXQgTWFuYWdlciBtb2R1bGUgZm9yIHRoZSBmaXJzdCB0aW1lXG5cdFx0ICovXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfTE9DS0VEKVxuXHRcdHtcblx0XHRcdC8vIFNob3cgd2FybmluZ1xuXHRcdFx0dGhpcy5fc3dpdGNoVmlldygnc3ZtLWxvY2tlZCcpO1xuXHRcdH1cblxuXHRcdC8vIFNlcnZsZXQgZm9sZGVycyBhbmQgZmlsZXNcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9TRVJWTEVUUylcblx0XHR7XG5cdFx0XHQvLyBSZXRyaWV2ZSBTZXJ2bGV0cyBmaWxlIGxpc3Rcblx0XHRcdGxldCBzZXJ2bGV0c09iaiA9IGRhdGEuZ2V0U0ZTT2JqZWN0KCdzZXJ2bGV0cycpO1xuXG5cdFx0XHQvLyBJbml0aWFsaXplIG1hbmFnZXJcblx0XHRcdHRoaXMuX2ZpbGVNYW5hZ2VyLmluaXQoKTtcblxuXHRcdFx0Ly8gQWRkIGxpc3QgdG8gbWFuYWdlclxuXHRcdFx0dGhpcy5fZmlsZU1hbmFnZXIuYWRkRmlsZShzZXJ2bGV0c09iaik7XG5cblx0XHRcdC8vIFNldCBUcmVlTGlzdCBkYXRhIHNvdXJjZVxuXHRcdFx0dGhpcy5fZmlsZXNMaXN0LnNldERhdGFTb3VyY2UodGhpcy5fZmlsZU1hbmFnZXIuZGF0YVNvdXJjZSk7XG5cblx0XHRcdC8vIEV4cGFuZCBmaXJzdCBsZXZlbFxuXHRcdFx0dGhpcy5fZmlsZXNMaXN0LmV4cGFuZCgkKCcjc3ZtLWZpbGVMaXN0IHRib2R5PnRyOmVxKDApJykpO1xuXG5cdFx0XHQvLyBFbmFibGUgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UodHJ1ZSk7XG5cblx0XHRcdC8vIFNob3cgbW9kdWxlJ3MgbWFpbiB2aWV3XG5cdFx0XHR0aGlzLl9zd2l0Y2hWaWV3KCdzdm0tbWFpbicpO1xuXHRcdH1cblxuXHRcdC8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIG1hbmFnaW5nIHNlcnZsZXQgZmlsZXNcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9FUlJPUilcblx0XHR7XG5cdFx0XHQvLyBIaWRlIGFkZCBmb2xkZXIgbW9kYWxcblx0XHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm1vZGFsKCdoaWRlJyk7XG5cblx0XHRcdC8vIFJlLWVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZSh0cnVlKTtcblxuXHRcdFx0Ly8gU2hvdyBhbiBhbGVydFxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGRhdGEuZ2V0VXRmU3RyaW5nKCdlcnJvcicpKTtcblx0XHR9XG5cblx0XHQvLyBTZXJ2bGV0IGZvbGRlciBvciBmaWxlIGFkZGVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfRklMRV9BRERFRClcblx0XHR7XG5cdFx0XHQvLyBHZXQgbmFtZSBvZiB0aGUgdXNlciB3aG8gYWRkZWQgdGhlIGZpbGUvZm9sZGVyXG5cdFx0XHRjb25zdCByZXF1ZXN0ZXIgPSBkYXRhLmdldFV0ZlN0cmluZygndXNlcicpO1xuXG5cdFx0XHQvLyBHZXQgdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGZpbGUvZm9sZGVyIGJlaW5nIGFkZGVkXG5cdFx0XHRjb25zdCBmaWxlT2JqID0gZGF0YS5nZXRTRlNPYmplY3QoJ2ZpbGUnKTtcblxuXHRcdFx0Ly8gR2V0IHRoZSB0YXJnZXQgZm9sZGVyIHdoZXJlIHRoZSBuZXcgZmlsZS9mb2xkZXIgc2hvdWxkIGJlIGFkZGVkXG5cdFx0XHRjb25zdCBwYXJlbnRQYXRoID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3BhcmVudCcpO1xuXG5cdFx0XHQvLyBHZXQgdGhlIGZsYWcgbm90aWZ5aW5nIHRoaXMgd2FzIGEgZmlsZSB1cGxvYWRcblx0XHRcdGNvbnN0IGlzVXBsb2FkID0gZGF0YS5nZXRCb29sKCdpc1VwbG9hZCcpO1xuXG5cdFx0XHR0cnlcblx0XHRcdHtcblx0XHRcdFx0Ly8gQWRkL3VwZGF0ZSBpdGVtIG9uIGRhdGEgc291cmNlXG5cdFx0XHRcdGNvbnN0IGZpbGVQYXRoID0gdGhpcy5fZmlsZU1hbmFnZXIuYWRkRmlsZVRvUGFyZW50KGZpbGVPYmosIHBhcmVudFBhdGgpO1xuXG5cdFx0XHRcdC8vIFJlZnJlc2ggdmlld1xuXHRcdFx0XHR0aGlzLl9maWxlc0xpc3QucmVmcmVzaCgpO1xuXG5cdFx0XHRcdGlmIChyZXF1ZXN0ZXIgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIEV4cGFuZCBwYXJlbnRcblx0XHRcdFx0XHR0aGlzLl9maWxlc0xpc3QuZXhwYW5kKCQoYCNzdm0tZmlsZUxpc3QgLmZpbGUtY29udHJvbHNbZGF0YS1pdGVtLWlkPVwiJHtwYXJlbnRQYXRofVwiXWApLmNsb3Nlc3QoJ3RyJykpO1xuXG5cdFx0XHRcdFx0aWYgKCFpc1VwbG9hZClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQvLyBIaWRlIG1vZGFsXG5cdFx0XHRcdFx0XHR0aGlzLl9hZGRGb2xkZXJNb2RhbC5tb2RhbCgnaGlkZScpO1xuXG5cdFx0XHRcdFx0XHQvLyBTZWxlY3QgdXBsb2FkIGZpbGVcblx0XHRcdFx0XHRcdHRoaXMuX2ZpbGVzTGlzdC5zZWxlY3QoJChgI3N2bS1maWxlTGlzdCAuZmlsZS1jb250cm9sc1tkYXRhLWl0ZW0taWQ9XCIke2ZpbGVQYXRofVwiXWApLmNsb3Nlc3QoJ3RyJykpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFVwZGF0ZSBzZWxlY3Rpb25cblx0XHRcdFx0XHR0aGlzLl9vbkZpbGVTZWxlY3RlZENoYW5nZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdFx0aWYgKCFpc1VwbG9hZClcblx0XHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oYEZvbGRlciBjcmVhdGVkYCwgYEFkbWluaXN0cmF0b3IgJHtyZXF1ZXN0ZXJ9IGNyZWF0ZWQgZm9sZGVyOiA8c3Ryb25nPiR7ZmlsZVBhdGh9PC9zdHJvbmc+YCk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd05vdGlmaWNhdGlvbihgRmlsZSB1cGxvYWRlZGAsIGBBZG1pbmlzdHJhdG9yICR7cmVxdWVzdGVyfSB1cGxvYWRlZCBmaWxlOiA8c3Ryb25nPiR7ZmlsZVBhdGh9PC9zdHJvbmc+YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNhdGNoIChlKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLi4uIGRhdGEgc291cmNlIGlzIGNvcnJ1cHRlZD9cblx0XHRcdFx0aWYgKHJlcXVlc3RlciA9PSB0aGlzLnNtYXJ0Rm94Lm15U2VsZi5uYW1lKVxuXHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChlLm1lc3NhZ2UsIHRydWUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBFbmFibGUgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UodHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Ly8gU2VydmxldCBmaWxlcyBkZWxldGVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfRklMRVNfREVMRVRFRClcblx0XHR7XG5cdFx0XHQvLyBHZXQgbmFtZSBvZiB0aGUgdXNlciB3aG8gZGVsZXRlZCB0aGUgZmlsZS9zXG5cdFx0XHRjb25zdCByZXF1ZXN0ZXIgPSBkYXRhLmdldFV0ZlN0cmluZygndXNlcicpO1xuXG5cdFx0XHQvLyBHZXQgdGhlIGxpc3Qgb2YgZGVsZXRlZCBmaWxlc1xuXHRcdFx0bGV0IGZpbGVzID0gZGF0YS5nZXRTRlNBcnJheSgnZmlsZXMnKTtcblxuXHRcdFx0bGV0IGZpbGVzQXJyID0gW107XG5cblx0XHRcdC8vIFVwZGF0ZSBkYXRhIHNvdXJjZVxuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBmaWxlcy5zaXplKCk7IGorKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IHBhdGggPSBmaWxlcy5nZXRVdGZTdHJpbmcoaik7XG5cdFx0XHRcdGZpbGVzQXJyLnB1c2gocGF0aCk7XG5cblx0XHRcdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdFx0XHQvLyBSZW1vdmUgaXRlbSBmcm9tIGRhdGEgc291cmNlOyBwYXJlbnQgaXRlbSBpcyByZXR1cm5lZFxuXHRcdFx0XHRsZXQgcGFyZW50SXRlbSA9IHRoaXMuX2ZpbGVNYW5hZ2VyLnJlbW92ZUZpbGUocGF0aCk7XG5cblx0XHRcdFx0Ly8gQ29sbGFwc2UgcGFyZW50IGlmIHRoZSBsYXN0IG9mIGl0cyBjaGlsZHJlbiB3YXMgZGVsZXRlZFxuXHRcdFx0XHRpZiAocGFyZW50SXRlbSAmJiAhcGFyZW50SXRlbS5oYXNDaGlsZHJlbilcblx0XHRcdFx0XHR0aGlzLl9maWxlc0xpc3QuY29sbGFwc2UoJChgI3N2bS1maWxlTGlzdCAuZmlsZS1jb250cm9sc1tkYXRhLWl0ZW0taWQ9XCIke3BhcmVudEl0ZW0uaWR9XCJdYCkuY2xvc2VzdCgndHInKSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyZXF1ZXN0ZXIgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd05vdGlmaWNhdGlvbihgJHt0aGlzLl9zZWxlY3RlZEl0ZW0uaXNEaXIgPyAnRm9sZGVyJyA6ICdGaWxlJ30gZGVsZXRlZGAsIGAke3RoaXMuX3NlbGVjdGVkSXRlbS5pc0RpciA/ICdGb2xkZXInIDogJ0ZpbGUnfSAnJHt0aGlzLl9zZWxlY3RlZEl0ZW0ubmFtZX0nIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5YCk7XG5cblx0XHRcdFx0dGhpcy5fc2VsZWN0ZWRJdGVtID0gbnVsbDtcblxuXHRcdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oYEZpbGUgZGVsZXRlZGAsIGBBZG1pbmlzdHJhdG9yICR7cmVxdWVzdGVyfSBkZWxldGVkIHRoZSBmb2xsb3dpbmcgZmlsZSR7ZmlsZXNBcnIubGVuZ3RoID4gMSA/ICdzJyA6ICcnfTogPHN0cm9uZz4ke2ZpbGVzQXJyLmpvaW4oJzxicj4gJyl9PC9zdHJvbmc+YCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlc2V0IHNlbGVjdGlvblxuXHRcdFx0dGhpcy5fb25GaWxlU2VsZWN0ZWRDaGFuZ2UoKTtcblx0XHR9XG5cblx0XHQvLyBlbHNlIGlmICgpXG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBVSSBFVkVOVCBMSVNURU5FUlNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfb25SZXRyeUNsaWNrKClcblx0e1xuXHRcdHRoaXMuX3N3aXRjaFZpZXcoJ3N2bS1pbml0Jyk7XG5cblx0XHQvLyBSZS1zZW5kIGluaXRpYWxpemF0aW9uIHJlcXVlc3Rcblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0lOSVQpO1xuXHR9XG5cblx0X29uUmVmcmVzaENsaWNrKClcblx0e1xuXHRcdHRoaXMuX2ZpbGVzTGlzdC5jbGVhclNlbGVjdGlvbigpO1xuXHRcdHRoaXMuX3JlZnJlc2hEYXRhTGlzdCgpO1xuXHR9XG5cblx0X29uRmlsZVNlbGVjdGVkQ2hhbmdlKClcblx0e1xuXHRcdC8vIEhpZGUgY29udHJvbCBidXR0b25zIG9uIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtXG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkSXRlbSlcblx0XHRcdCQoYCNzdm0tZmlsZUxpc3QgLmZpbGUtY29udHJvbHNbZGF0YS1pdGVtLWlkPVwiJHt0aGlzLl9zZWxlY3RlZEl0ZW0uaWR9XCJdYCkuaGlkZSgpO1xuXG5cdFx0Ly8gR2V0IHNlbGVjdGVkIGl0ZW1cblx0XHRsZXQgc2VsZWN0ZWRSb3dzID0gdGhpcy5fZmlsZXNMaXN0LnNlbGVjdCgpO1xuXG5cdFx0aWYgKHNlbGVjdGVkUm93cy5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdC8vIFNhdmUgcmVmLiB0byBzZWxlY3RlZCBpdGVtXG5cdFx0XHR0aGlzLl9zZWxlY3RlZEl0ZW0gPSB0aGlzLl9maWxlc0xpc3QuZGF0YUl0ZW0oc2VsZWN0ZWRSb3dzWzBdKTtcblxuXHRcdFx0Ly8gU2hvdyBjb250cm9sIGJ1dHRvbnMgb24gbmV3IHNlbGVjdGVkIGl0ZW1cblx0XHRcdCQoYCNzdm0tZmlsZUxpc3QgLmZpbGUtY29udHJvbHNbZGF0YS1pdGVtLWlkPVwiJHt0aGlzLl9zZWxlY3RlZEl0ZW0uaWR9XCJdYCkuc2hvdygpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHR0aGlzLl9zZWxlY3RlZEl0ZW0gPSBudWxsO1xuXHR9XG5cblx0X3Nob3dBZGRGb2xkZXJNb2RhbENsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl9zZWxlY3RlZEl0ZW0gJiYgdGhpcy5fc2VsZWN0ZWRJdGVtLmlzRGlyKVxuXHRcdHtcblx0XHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm1vZGFsKCdzaG93Jyk7XG5cdFx0XHQkKCcjc3ZtLWZvbGRlck5hbWVJbicpLmZvY3VzKCk7XG5cdFx0fVxuXHR9XG5cblx0X29uQWRkRm9sZGVyQ2xpY2soKVxuXHR7XG5cdFx0Ly8gVGhlIHBhcmVudCBmb2xkZXIgY291bGQgaGF2ZSBiZWVuIGRlbGV0ZWQgd2hpbGUgdXNlciBpcyBzdGlsbCB0eXBpbmcgdGhlIG5hbWUgb2YgdGhlIG5ldyBjaGlsZCBmb2xkZXJcblx0XHRpZiAoIXRoaXMuX3NlbGVjdGVkSXRlbSlcblx0XHR7XG5cdFx0XHR0aGlzLl9hZGRGb2xkZXJNb2RhbC5tb2RhbCgnaGlkZScpO1xuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KCdVbmFibGUgdG8gY3JlYXRlIGZvbGRlcjsgdGhlIHBhcmVudCBmb2xkZXIgZG9lc25cXCd0IGV4aXN0LicpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9hZGRGb2xkZXJWYWxpZGF0b3IudmFsaWRhdGUoKSlcblx0XHR7XG5cdFx0XHQvLyBEaXNhYmxlIG1vZGFsIGludGVyZmFjZVxuXHRcdFx0dGhpcy5fZW5hYmxlQWRkRm9sZGVyTW9kYWwoZmFsc2UpO1xuXG5cdFx0XHRsZXQgZGF0YSA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdGRhdGEucHV0VXRmU3RyaW5nKCdmb2xkZXInLCB0aGlzLl9zZWxlY3RlZEl0ZW0uaWQgKyB0aGlzLl9maWxlU2VwYXJhdG9yICsgJCgnI3N2bS1mb2xkZXJOYW1lSW4nKS52YWwoKSk7XG5cblx0XHRcdC8vIFNlbmQgcmVxdWVzdCB0byBzZXJ2ZXJcblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfQ1JFQVRFX0ZPTERFUiwgZGF0YSk7XG5cdFx0fVxuXHR9XG5cblx0X29uQWRkRm9sZGVyTW9kYWxIaWRkZW4oKVxuXHR7XG5cdFx0JCgnI3N2bS1mb2xkZXJOYW1lSW4nKS52YWwoJycpO1xuXHRcdHRoaXMuX3Jlc2V0QWRkRm9sZGVyVmFsaWRhdGlvbigpO1xuXG5cdFx0Ly8gRW5hYmxlIG1vZGFsIGludGVyZmFjZVxuXHRcdHRoaXMuX2VuYWJsZUFkZEZvbGRlck1vZGFsKHRydWUpO1xuXHR9XG5cblx0X3Nob3dVcGxvYWRGaWxlc01vZGFsQ2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkSXRlbSlcblx0XHRcdHRoaXMuX3VwbG9hZEZpbGVzTW9kYWwubW9kYWwoJ3Nob3cnKTtcblx0fVxuXG5cdF9vbkNsZWFyRmlsZXNDbGljaygpXG5cdHtcblx0XHR0aGlzLl91cGxvYWRlci5jbGVhckFsbEZpbGVzKCk7XG5cdH1cblxuXHRfb25VcGxvYWRTdGFydChlKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSBjbGVhciBidXR0b25cblx0XHQkKCcjc3ZtLWNsZWFyRmlsZXNCdCcpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cblx0XHQvLyBTZXQgZGVzdGluYXRpb24gdXJsXG5cdFx0Y29uc3QgdXJsID0gJ2h0dHA6Ly8nICsgdGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnLmhvc3QgKyAnOicgKyB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcuaHR0cFBvcnQgKyAnL0JsdWVCb3gvU0ZTMlhGaWxlVXBsb2FkP3Nlc3NIYXNoSWQ9JyArIHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZy5zZXNzaW9uVG9rZW47XG5cblx0XHRlLnNlbmRlci5vcHRpb25zLmFzeW5jLnNhdmVVcmwgPSB1cmw7XG5cblx0XHQvLyBTZXQgcGF5bG9hZFxuXHRcdGNvbnN0IHBhcmFtcyA9IG5ldyBGb3JtRGF0YSgpO1xuXHRcdHBhcmFtcy5hcHBlbmQoJ19fbW9kdWxlJywgdGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnLm1vZHVsZUlkKTtcblx0XHRwYXJhbXMuYXBwZW5kKCdfX3RhcmdldCcsIHRoaXMuX3NlbGVjdGVkSXRlbS5pZCk7XG5cblx0XHRmb3IgKGxldCBmID0gMDsgZiA8IGUuZmlsZXMubGVuZ3RoOyBmKyspXG5cdFx0XHRwYXJhbXMuYXBwZW5kKCdmaWxlc1tdJywgZS5maWxlc1tmXS5yYXdGaWxlKTtcblxuXHRcdGUuZm9ybURhdGEgPSBwYXJhbXM7XG5cdH1cblxuXHRfb25VcGxvYWRFbmQoZSlcblx0e1xuXHRcdC8vIEVuYWJsZSBjbGVhciBidXR0b25cblx0XHQkKCcjc3ZtLWNsZWFyRmlsZXNCdCcpLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpO1xuXHR9XG5cblx0X29uRmlsZXNVcGxvYWRFbmQocmVzcG9uc2UpXG5cdHtcblx0XHQvLyBOb3RoaW5nIHRvIGRvOiB3ZSBoYXZlIHRvIHdhaXQgdGhlIHVwbG9hZCBwcm9jZXNzIGNvbXBsZXRpb24gdG8gYmUgc2lnbmFsZWQgYnkgdGhlIHNlcnZlciB0aHJvdWdoIHRoZSBkZWRpY2F0ZWQgRXh0ZW5zaW9uIHJlc3BvbnNlXG5cblx0XHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHQvLyBUT0RPIFNob3VsZCB3ZSBoYW5kbGUgdGhpcyByZXNwb25zZSBpbiBzb21lIHdheT8gRm9yIHNvbWUgdW5rbm93biByZWFzb24gd2UgYWx3YXlzIGdldCBvaz1mYWxzZSBhbmQgc3RhdHVzPTBcblx0XHQvLyBjb25zb2xlLmxvZyhyZXNwb25zZSlcblx0XHQvLyBjb25zb2xlLmxvZyhyZXNwb25zZS5vaylcblx0XHQvLyBjb25zb2xlLmxvZyhyZXNwb25zZS5zdGF0dXMpXG5cdH1cblxuXHRfb25SZW1vdmVGaWxlQ2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkSXRlbSlcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dDb25maXJtV2FybmluZyhgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgc2VsZWN0ZWQgJHt0aGlzLl9zZWxlY3RlZEl0ZW0uaXNEaXIgPyAnZm9sZGVyJyA6ICdmaWxlJ30/PGJyPjxicj5QYXRoOiA8c3Ryb25nPiR7dGhpcy5fc2VsZWN0ZWRJdGVtLmlkfTwvc3Ryb25nPmAsICQucHJveHkodGhpcy5fb25SZW1vdmVGaWxlQ29uZmlybSwgdGhpcykpO1xuXHR9XG5cblx0X29uUmVtb3ZlRmlsZUNvbmZpcm0oKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSBpbnRlcmZhY2Vcblx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0Ly8gUmVxdWVzdCBTZXJ2bGV0IGZpbGVzIHJlbW92YWxcblx0XHQvLyBOT1RFOiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIEFkbWluVG9vbCwgdGhlIGZpbGUgdG8gYmUgZGVsZXRlZCBpcyBzZW50XG5cdFx0Ly8gaW4gYW4gYXJyYXkgb2Ygc3RyaW5ncywgZXZlbiBpZiB3ZSBjYW4ndCBkZWxldGUgbW9yZSB0aGFuIDEgZmlsZSBhdCBvbmNlIGluIHRoaXMgQWRtaW5Ub29sXG5cblx0XHRsZXQgZmlsZXMgPSBuZXcgU0ZTMlguU0ZTQXJyYXkoKTtcblx0XHRmaWxlcy5hZGRVdGZTdHJpbmcodGhpcy5fc2VsZWN0ZWRJdGVtLmlkKTtcblxuXHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0cGFyYW1zLnB1dFNGU0FycmF5KCdmaWxlcycsIGZpbGVzKTtcblxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfREVMRVRFX0ZJTEVTLCBwYXJhbXMpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBNRVRIT0RTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X3N3aXRjaFZpZXcodmlld0lkKVxuXHR7XG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2bS12aWV3c3RhY2snKS5zZWxlY3RlZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWV3SWQpO1xuXHR9XG5cblx0X2VuYWJsZUludGVyZmFjZShlbmFibGUpXG5cdHtcblx0XHQkKCcjc3ZtLWZpbGVMaXN0JykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblx0XHQkKCcjc3ZtLXJlZnJlc2hCdCcpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZSk7XG5cdH1cblxuXHRfcmVmcmVzaERhdGFMaXN0KClcblx0e1xuXHRcdC8vIERpc2FibGUgaW50ZXJmYWNlXG5cdFx0dGhpcy5fZW5hYmxlSW50ZXJmYWNlKGZhbHNlKTtcblxuXHRcdC8vIFNlbmQgcmVxdWVzdCB0byBzZXJ2ZXJcblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9TRVJWTEVUUylcblx0fVxuXG5cdF9yZXNldEFkZEZvbGRlclZhbGlkYXRpb24oKVxuXHR7XG5cdFx0dGhpcy5fYWRkRm9sZGVyVmFsaWRhdG9yLmhpZGVNZXNzYWdlcygpO1xuXG5cdFx0Ly8gVGhlIG1ldGhvZCBhYm92ZSBkb2Vzbid0IHJlbW92ZSB0aGUgay1pbnZhbGlkIGNsYXNzZXMgYW5kIGFyaWEtaW52YWxpZD1cInRydWVcIiBhdHRyaWJ1dGVzIGZyb20gaW5wdXRzXG5cdFx0Ly8gTGV0J3MgZG8gaXQgbWFudWFsbHlcblx0XHQkKCcjc3ZtLWFkZEZvbGRlckZvcm0gLmstaW52YWxpZCcpLnJlbW92ZUNsYXNzKCdrLWludmFsaWQnKTtcblx0XHQkKCcjc3ZtLWFkZEZvbGRlckZvcm0gW2FyaWEtaW52YWxpZD1cInRydWVcIl0nKS5yZW1vdmVBdHRyKCdhcmlhLWludmFsaWQnKTtcblx0fVxuXG5cdF9lbmFibGVBZGRGb2xkZXJNb2RhbChlbmFibGUpXG5cdHtcblx0XHQvLyBEaXNhYmxlIG1vZGFsIGNsb3NlIGJ1dHRvbnNcblx0XHQkKCcjc3ZtLWFkZEZvbGRlck1vZGFsIGJ1dHRvbltkYXRhLWRpc21pc3M9XCJtb2RhbFwiXScpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZSk7XG5cblx0XHQvLyBEaXNhYmxlIGFkZCBidXR0b25cblx0XHQkKCcjc3ZtLWFkZEZvbGRlckJ0JykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblxuXHRcdC8vIERpc2FibGUgZmllbGRzZXRcblx0XHQkKCcjc3ZtLWFkZEZvbGRlckZvcm0nKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBHRVRURVJTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2hKQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0EiLCJzb3VyY2VSb290IjoiIn0=