rubyfox-server 2.13.7.3 → 2.16.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (613) 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 +8 -9
  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 +387 -0
  54. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.sh +686 -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 +4737 -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.17.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 -337
  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 -9716
  301. data/lib/rubyfox/server/data/lib/jetty/etc/README.spnego +0 -62
  302. data/lib/rubyfox/server/data/lib/jetty/etc/example-quickstart.xml +0 -27
  303. data/lib/rubyfox/server/data/lib/jetty/etc/gcloud-memcached-session-context.xml +0 -33
  304. data/lib/rubyfox/server/data/lib/jetty/etc/gcloud-session-context.xml +0 -25
  305. data/lib/rubyfox/server/data/lib/jetty/etc/hawtio.xml +0 -16
  306. data/lib/rubyfox/server/data/lib/jetty/etc/home-base-warning.xml +0 -8
  307. data/lib/rubyfox/server/data/lib/jetty/etc/jamon.xml +0 -32
  308. data/lib/rubyfox/server/data/lib/jetty/etc/jdbcRealm.properties +0 -72
  309. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-alpn.xml +0 -32
  310. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-annotations.xml +0 -20
  311. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-cdi.xml +0 -19
  312. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-debug.xml +0 -36
  313. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-debuglog.xml +0 -25
  314. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-deploy.xml +0 -76
  315. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gcloud-memcached-sessions.xml +0 -27
  316. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gcloud-session-idmgr.xml +0 -19
  317. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gcloud-sessions.xml +0 -27
  318. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gzip-inflate.xml +0 -12
  319. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gzip.xml +0 -67
  320. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http-forwarded.xml +0 -20
  321. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http.xml +0 -47
  322. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http2.xml +0 -25
  323. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http2c.xml +0 -17
  324. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-https.xml +0 -29
  325. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-infinispan.xml +0 -39
  326. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-ipaccess.xml +0 -28
  327. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jaas.xml +0 -16
  328. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jdbc-sessions.xml +0 -34
  329. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jmx-remote.xml +0 -40
  330. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jmx.xml +0 -32
  331. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-logging.xml +0 -36
  332. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-lowresources.xml +0 -22
  333. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-monitor.xml +0 -30
  334. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-nosql.xml +0 -19
  335. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-plus.xml +0 -26
  336. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-proxy-protocol-ssl.xml +0 -10
  337. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-proxy-protocol.xml +0 -10
  338. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-proxy.xml +0 -35
  339. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-requestlog.xml +0 -30
  340. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-rewrite-customizer.xml +0 -17
  341. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-rewrite.xml +0 -31
  342. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-setuid.xml +0 -30
  343. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-spring.xml +0 -61
  344. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-ssl-context.xml +0 -31
  345. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-ssl.xml +0 -58
  346. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-started.xml +0 -15
  347. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-stats.xml +0 -18
  348. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-stop.xml +0 -6
  349. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-threadlimit.xml +0 -20
  350. data/lib/rubyfox/server/data/lib/jetty/etc/jetty.conf +0 -12
  351. data/lib/rubyfox/server/data/lib/jetty/etc/jetty.xml +0 -195
  352. data/lib/rubyfox/server/data/lib/jetty/etc/jminix.xml +0 -12
  353. data/lib/rubyfox/server/data/lib/jetty/etc/jolokia.xml +0 -16
  354. data/lib/rubyfox/server/data/lib/jetty/etc/keystore +0 -0
  355. data/lib/rubyfox/server/data/lib/jetty/etc/krb5.ini +0 -23
  356. data/lib/rubyfox/server/data/lib/jetty/etc/rewrite-compactpath.xml +0 -10
  357. data/lib/rubyfox/server/data/lib/jetty/etc/sessions/hazelcast/default.xml +0 -19
  358. data/lib/rubyfox/server/data/lib/jetty/etc/sessions/hazelcast/remote.xml +0 -19
  359. data/lib/rubyfox/server/data/lib/jetty/etc/spnego.conf +0 -19
  360. data/lib/rubyfox/server/data/lib/jetty/etc/spnego.properties +0 -1
  361. data/lib/rubyfox/server/data/lib/jetty/etc/webdefault.xml +0 -539
  362. data/lib/rubyfox/server/data/lib/jetty/lib/alpn-api-1.1.3.v20160715.jar +0 -0
  363. data/lib/rubyfox/server/data/lib/jetty/lib/apache-jsp/org.eclipse.jdt.core.compiler.ecj-4.4.2.jar +0 -0
  364. data/lib/rubyfox/server/data/lib/jetty/lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.3.28.v20191105.jar +0 -0
  365. data/lib/rubyfox/server/data/lib/jetty/lib/apache-jsp/org.mortbay.jasper.apache-el-8.0.33.jar +0 -0
  366. data/lib/rubyfox/server/data/lib/jetty/lib/apache-jsp/org.mortbay.jasper.apache-jsp-8.0.33.jar +0 -0
  367. data/lib/rubyfox/server/data/lib/jetty/lib/apache-jstl/org.apache.taglibs.taglibs-standard-impl-1.2.5.jar +0 -0
  368. data/lib/rubyfox/server/data/lib/jetty/lib/apache-jstl/org.apache.taglibs.taglibs-standard-spec-1.2.5.jar +0 -0
  369. data/lib/rubyfox/server/data/lib/jetty/lib/asm-6.0.jar +0 -0
  370. data/lib/rubyfox/server/data/lib/jetty/lib/asm-commons-6.0.jar +0 -0
  371. data/lib/rubyfox/server/data/lib/jetty/lib/fcgi/fcgi-client-9.3.28.v20191105.jar +0 -0
  372. data/lib/rubyfox/server/data/lib/jetty/lib/fcgi/fcgi-server-9.3.28.v20191105.jar +0 -0
  373. data/lib/rubyfox/server/data/lib/jetty/lib/http2/http2-common-9.3.28.v20191105.jar +0 -0
  374. data/lib/rubyfox/server/data/lib/jetty/lib/http2/http2-hpack-9.3.28.v20191105.jar +0 -0
  375. data/lib/rubyfox/server/data/lib/jetty/lib/http2/http2-server-9.3.28.v20191105.jar +0 -0
  376. data/lib/rubyfox/server/data/lib/jetty/lib/jaspi/javax.security.auth.message-1.0.0.v201108011116.jar +0 -0
  377. data/lib/rubyfox/server/data/lib/jetty/lib/javax-websocket-client-impl-9.3.28.v20191105.jar +0 -0
  378. data/lib/rubyfox/server/data/lib/jetty/lib/javax-websocket-server-impl-9.3.28.v20191105.jar +0 -0
  379. data/lib/rubyfox/server/data/lib/jetty/lib/javax.annotation-api-1.2.jar +0 -0
  380. data/lib/rubyfox/server/data/lib/jetty/lib/javax.websocket-api-1.0.jar +0 -0
  381. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-alpn-java-server-9.3.28.v20191105.jar +0 -0
  382. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-alpn-server-9.3.28.v20191105.jar +0 -0
  383. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-annotations-9.3.28.v20191105.jar +0 -0
  384. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-client-9.3.28.v20191105.jar +0 -0
  385. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-continuation-9.3.28.v20191105.jar +0 -0
  386. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-deploy-9.3.28.v20191105.jar +0 -0
  387. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-gcloud-memcached-session-manager-9.3.28.v20191105.jar +0 -0
  388. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-gcloud-session-manager-9.3.28.v20191105.jar +0 -0
  389. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-hazelcast-9.3.28.v20191105.jar +0 -0
  390. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-http-9.3.28.v20191105.jar +0 -0
  391. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-infinispan-9.3.28.v20191105.jar +0 -0
  392. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-io-9.3.28.v20191105.jar +0 -0
  393. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jaas-9.3.28.v20191105.jar +0 -0
  394. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jaspi-9.3.28.v20191105.jar +0 -0
  395. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jmx-9.3.28.v20191105.jar +0 -0
  396. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jndi-9.3.28.v20191105.jar +0 -0
  397. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-nosql-9.3.28.v20191105.jar +0 -0
  398. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-plus-9.3.28.v20191105.jar +0 -0
  399. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-proxy-9.3.28.v20191105.jar +0 -0
  400. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-quickstart-9.3.28.v20191105.jar +0 -0
  401. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-rewrite-9.3.28.v20191105.jar +0 -0
  402. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-schemas-3.1.jar +0 -0
  403. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-security-9.3.28.v20191105.jar +0 -0
  404. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-server-9.3.28.v20191105.jar +0 -0
  405. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-servlet-9.3.28.v20191105.jar +0 -0
  406. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-servlets-9.3.28.v20191105.jar +0 -0
  407. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-util-9.3.28.v20191105.jar +0 -0
  408. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-webapp-9.3.28.v20191105.jar +0 -0
  409. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-xml-9.3.28.v20191105.jar +0 -0
  410. data/lib/rubyfox/server/data/lib/jetty/lib/jndi/javax.mail.glassfish-1.4.1.v201005082020.jar +0 -0
  411. data/lib/rubyfox/server/data/lib/jetty/lib/jndi/javax.transaction-api-1.2.jar +0 -0
  412. data/lib/rubyfox/server/data/lib/jetty/lib/monitor/jetty-monitor-9.3.28.v20191105.jar +0 -0
  413. data/lib/rubyfox/server/data/lib/jetty/lib/servlet-api-3.1.jar +0 -0
  414. data/lib/rubyfox/server/data/lib/jetty/lib/setuid/jetty-setuid-java-1.0.3.jar +0 -0
  415. data/lib/rubyfox/server/data/lib/jetty/lib/setuid/libsetuid-linux.so +0 -0
  416. data/lib/rubyfox/server/data/lib/jetty/lib/setuid/libsetuid-osx.so +0 -0
  417. data/lib/rubyfox/server/data/lib/jetty/lib/spring/jetty-spring-9.3.28.v20191105.jar +0 -0
  418. data/lib/rubyfox/server/data/lib/jetty/lib/start.jar +0 -0
  419. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-api-9.3.28.v20191105.jar +0 -0
  420. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-client-9.3.28.v20191105.jar +0 -0
  421. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-common-9.3.28.v20191105.jar +0 -0
  422. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-server-9.3.28.v20191105.jar +0 -0
  423. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-servlet-9.3.28.v20191105.jar +0 -0
  424. data/lib/rubyfox/server/data/lib/jetty/license-eplv10-aslv20.html +0 -576
  425. data/lib/rubyfox/server/data/lib/jetty/modules/.donotdelete +0 -0
  426. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0.mod +0 -8
  427. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_05.mod +0 -8
  428. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_101.mod +0 -8
  429. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_102.mod +0 -8
  430. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_11.mod +0 -8
  431. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_111.mod +0 -8
  432. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_112.mod +0 -8
  433. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_121.mod +0 -8
  434. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_131.mod +0 -8
  435. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_141.mod +0 -8
  436. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_144.mod +0 -8
  437. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_151.mod +0 -8
  438. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_152.mod +0 -8
  439. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_161.mod +0 -8
  440. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_162.mod +0 -8
  441. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_171.mod +0 -8
  442. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_172.mod +0 -8
  443. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_181.mod +0 -8
  444. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_191.mod +0 -8
  445. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_192.mod +0 -8
  446. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_20.mod +0 -8
  447. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_201.mod +0 -8
  448. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_202.mod +0 -8
  449. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_211.mod +0 -8
  450. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_212.mod +0 -8
  451. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_221.mod +0 -8
  452. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_222.mod +0 -8
  453. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_231.mod +0 -8
  454. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_232.mod +0 -8
  455. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_25.mod +0 -8
  456. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_31.mod +0 -8
  457. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_40.mod +0 -8
  458. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_45.mod +0 -8
  459. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_51.mod +0 -8
  460. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_60.mod +0 -8
  461. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_65.mod +0 -8
  462. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_66.mod +0 -8
  463. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_71.mod +0 -8
  464. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_72.mod +0 -8
  465. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_73.mod +0 -8
  466. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_74.mod +0 -8
  467. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_77.mod +0 -8
  468. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_91.mod +0 -8
  469. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_92.mod +0 -8
  470. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-8.mod +0 -30
  471. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-9.mod +0 -5
  472. data/lib/rubyfox/server/data/lib/jetty/modules/alpn.mod +0 -22
  473. data/lib/rubyfox/server/data/lib/jetty/modules/annotations.mod +0 -17
  474. data/lib/rubyfox/server/data/lib/jetty/modules/apache-jsp.mod +0 -10
  475. data/lib/rubyfox/server/data/lib/jetty/modules/apache-jstl.mod +0 -9
  476. data/lib/rubyfox/server/data/lib/jetty/modules/cdi.mod +0 -38
  477. data/lib/rubyfox/server/data/lib/jetty/modules/client.mod +0 -6
  478. data/lib/rubyfox/server/data/lib/jetty/modules/continuation.mod +0 -6
  479. data/lib/rubyfox/server/data/lib/jetty/modules/debug.mod +0 -29
  480. data/lib/rubyfox/server/data/lib/jetty/modules/debuglog.mod +0 -25
  481. data/lib/rubyfox/server/data/lib/jetty/modules/deploy.mod +0 -31
  482. data/lib/rubyfox/server/data/lib/jetty/modules/ext.mod +0 -11
  483. data/lib/rubyfox/server/data/lib/jetty/modules/fcgi.mod +0 -15
  484. data/lib/rubyfox/server/data/lib/jetty/modules/flight-recorder.mod +0 -13
  485. data/lib/rubyfox/server/data/lib/jetty/modules/gcloud-memcached-sessions.mod +0 -26
  486. data/lib/rubyfox/server/data/lib/jetty/modules/gcloud-session-idmgr.mod +0 -63
  487. data/lib/rubyfox/server/data/lib/jetty/modules/gcloud-sessions.mod +0 -11
  488. data/lib/rubyfox/server/data/lib/jetty/modules/gzip-inflate.mod +0 -17
  489. data/lib/rubyfox/server/data/lib/jetty/modules/gzip.mod +0 -23
  490. data/lib/rubyfox/server/data/lib/jetty/modules/hawtio.mod +0 -28
  491. data/lib/rubyfox/server/data/lib/jetty/modules/hazelcast-embedded-sessions.mod +0 -26
  492. data/lib/rubyfox/server/data/lib/jetty/modules/hazelcast-remote-sessions.mod +0 -26
  493. data/lib/rubyfox/server/data/lib/jetty/modules/home-base-warning.mod +0 -7
  494. data/lib/rubyfox/server/data/lib/jetty/modules/http-forwarded.mod +0 -24
  495. data/lib/rubyfox/server/data/lib/jetty/modules/http.mod +0 -39
  496. data/lib/rubyfox/server/data/lib/jetty/modules/http2.mod +0 -20
  497. data/lib/rubyfox/server/data/lib/jetty/modules/http2c.mod +0 -22
  498. data/lib/rubyfox/server/data/lib/jetty/modules/https.mod +0 -14
  499. data/lib/rubyfox/server/data/lib/jetty/modules/infinispan.mod +0 -33
  500. data/lib/rubyfox/server/data/lib/jetty/modules/ipaccess.mod +0 -9
  501. data/lib/rubyfox/server/data/lib/jetty/modules/jaas.mod +0 -17
  502. data/lib/rubyfox/server/data/lib/jetty/modules/jamon.mod +0 -31
  503. data/lib/rubyfox/server/data/lib/jetty/modules/jaspi.mod +0 -10
  504. data/lib/rubyfox/server/data/lib/jetty/modules/jdbc-sessions.mod +0 -27
  505. data/lib/rubyfox/server/data/lib/jetty/modules/jminix.mod +0 -41
  506. data/lib/rubyfox/server/data/lib/jetty/modules/jmx-remote.mod +0 -16
  507. data/lib/rubyfox/server/data/lib/jetty/modules/jmx.mod +0 -13
  508. data/lib/rubyfox/server/data/lib/jetty/modules/jndi.mod +0 -11
  509. data/lib/rubyfox/server/data/lib/jetty/modules/jolokia.mod +0 -19
  510. data/lib/rubyfox/server/data/lib/jetty/modules/jsp.mod +0 -9
  511. data/lib/rubyfox/server/data/lib/jetty/modules/jstl.mod +0 -8
  512. data/lib/rubyfox/server/data/lib/jetty/modules/jvm.mod +0 -22
  513. data/lib/rubyfox/server/data/lib/jetty/modules/logging.mod +0 -36
  514. data/lib/rubyfox/server/data/lib/jetty/modules/lowresources.mod +0 -28
  515. data/lib/rubyfox/server/data/lib/jetty/modules/monitor.mod +0 -13
  516. data/lib/rubyfox/server/data/lib/jetty/modules/nosql.mod +0 -31
  517. data/lib/rubyfox/server/data/lib/jetty/modules/plus.mod +0 -15
  518. data/lib/rubyfox/server/data/lib/jetty/modules/proxy-protocol-ssl.mod +0 -9
  519. data/lib/rubyfox/server/data/lib/jetty/modules/proxy-protocol.mod +0 -9
  520. data/lib/rubyfox/server/data/lib/jetty/modules/proxy.mod +0 -22
  521. data/lib/rubyfox/server/data/lib/jetty/modules/quickstart.mod +0 -11
  522. data/lib/rubyfox/server/data/lib/jetty/modules/requestlog.mod +0 -40
  523. data/lib/rubyfox/server/data/lib/jetty/modules/resources.mod +0 -10
  524. data/lib/rubyfox/server/data/lib/jetty/modules/rewrite-compactpath.mod +0 -10
  525. data/lib/rubyfox/server/data/lib/jetty/modules/rewrite-customizer.mod +0 -24
  526. data/lib/rubyfox/server/data/lib/jetty/modules/rewrite.mod +0 -23
  527. data/lib/rubyfox/server/data/lib/jetty/modules/security.mod +0 -9
  528. data/lib/rubyfox/server/data/lib/jetty/modules/server.mod +0 -82
  529. data/lib/rubyfox/server/data/lib/jetty/modules/servlet.mod +0 -9
  530. data/lib/rubyfox/server/data/lib/jetty/modules/servlets.mod +0 -11
  531. data/lib/rubyfox/server/data/lib/jetty/modules/setuid.mod +0 -19
  532. data/lib/rubyfox/server/data/lib/jetty/modules/spring.mod +0 -17
  533. data/lib/rubyfox/server/data/lib/jetty/modules/ssl.mod +0 -101
  534. data/lib/rubyfox/server/data/lib/jetty/modules/stats.mod +0 -9
  535. data/lib/rubyfox/server/data/lib/jetty/modules/threadlimit.mod +0 -22
  536. data/lib/rubyfox/server/data/lib/jetty/modules/webapp.mod +0 -10
  537. data/lib/rubyfox/server/data/lib/jetty/modules/websocket.mod +0 -12
  538. data/lib/rubyfox/server/data/lib/jetty/start.ini +0 -85
  539. data/lib/rubyfox/server/data/www/.keep +0 -0
  540. data/lib/rubyfox/server/data/www/HelloServlet/META-INF/context.xml +0 -2
  541. data/lib/rubyfox/server/data/www/PyServletExample/MyModule$py.class +0 -0
  542. data/lib/rubyfox/server/data/www/PyServletExample/MyModule.py +0 -5
  543. data/lib/rubyfox/server/data/www/PyServletExample/WEB-INF/web.xml +0 -37
  544. data/lib/rubyfox/server/data/www/PyServletExample/errors/404.htm +0 -20
  545. data/lib/rubyfox/server/data/www/PyServletExample/index.py +0 -42
  546. data/lib/rubyfox/server/data/www/root/admin/.keep +0 -0
  547. data/lib/rubyfox/server/data/www/root/admin/AdminTool.swf +0 -0
  548. data/lib/rubyfox/server/data/www/root/admin/ReleaseNotes.txt +0 -201
  549. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/adobeFlashPlayer.png +0 -0
  550. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/advanced.png +0 -0
  551. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/analytics.png +0 -0
  552. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/banManager.png +0 -0
  553. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bannedIPs.png +0 -0
  554. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bannedUsernames.png +0 -0
  555. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bookmarks.png +0 -0
  556. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bootLog.png +0 -0
  557. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/buddyList.png +0 -0
  558. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/buddyProperties.png +0 -0
  559. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/connection.png +0 -0
  560. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/databaseManager.png +0 -0
  561. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/floodFilter.png +0 -0
  562. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/gameSettings.png +0 -0
  563. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/general.png +0 -0
  564. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/globalServerStatus.png +0 -0
  565. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/hTML5WebSockets.png +0 -0
  566. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/iPDiscovery.png +0 -0
  567. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/iPFilter.png +0 -0
  568. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/jVMSettings.png +0 -0
  569. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/logsDownload.png +0 -0
  570. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/mMOSettings.png +0 -0
  571. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/mailer.png +0 -0
  572. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/permissionsAndEvents.png +0 -0
  573. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/privilegeManager.png +0 -0
  574. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/remoteAdmin.png +0 -0
  575. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomExtension.png +0 -0
  576. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomVariables.png +0 -0
  577. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomsAndGroups.png +0 -0
  578. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeLog.png +0 -0
  579. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeRoomSettings.png +0 -0
  580. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeUserSettings.png +0 -0
  581. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeZoneSettings.png +0 -0
  582. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsApplication.png +0 -0
  583. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsDemographics.png +0 -0
  584. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsExceptions.png +0 -0
  585. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsOverview.png +0 -0
  586. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsTechnology.png +0 -0
  587. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/systemQueueStatus.png +0 -0
  588. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/threadPools.png +0 -0
  589. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/userManagement.png +0 -0
  590. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/userVariables.png +0 -0
  591. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/webServer.png +0 -0
  592. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/wordsFilter.png +0 -0
  593. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/zoneExtension.png +0 -0
  594. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/zoneTraffic.png +0 -0
  595. data/lib/rubyfox/server/data/www/root/admin/expressInstall.swf +0 -0
  596. data/lib/rubyfox/server/data/www/root/admin/index.html +0 -124
  597. data/lib/rubyfox/server/data/www/root/admin/modules/Analytics.swf +0 -0
  598. data/lib/rubyfox/server/data/www/root/admin/modules/BanManager.swf +0 -0
  599. data/lib/rubyfox/server/data/www/root/admin/modules/BlueBoxMonitor.swf +0 -0
  600. data/lib/rubyfox/server/data/www/root/admin/modules/Console.swf +0 -0
  601. data/lib/rubyfox/server/data/www/root/admin/modules/Dashboard.swf +0 -0
  602. data/lib/rubyfox/server/data/www/root/admin/modules/ExtensionManager.swf +0 -0
  603. data/lib/rubyfox/server/data/www/root/admin/modules/LicenseManager.swf +0 -0
  604. data/lib/rubyfox/server/data/www/root/admin/modules/LogViewer.swf +0 -0
  605. data/lib/rubyfox/server/data/www/root/admin/modules/ServerConfigurator.swf +0 -0
  606. data/lib/rubyfox/server/data/www/root/admin/modules/ServletManager.swf +0 -0
  607. data/lib/rubyfox/server/data/www/root/admin/modules/ZoneConfigurator.swf +0 -0
  608. data/lib/rubyfox/server/data/www/root/admin/modules/ZoneMonitor.swf +0 -0
  609. data/lib/rubyfox/server/data/www/root/admin/swfobject.js +0 -4
  610. data/lib/rubyfox/server/data/www/root/examples/.keep +0 -0
  611. data/lib/rubyfox/server/data/www/sfs2x-ws.war +0 -0
  612. data/lib/rubyfox/server/data/www/sfs2x-ws.xml +0 -30
  613. data/lib/rubyfox/server/data/zones/BasicExamples.zone.xml +0 -147
@@ -0,0 +1,2624 @@
1
+ /*! (c) gotoAndPlay | All rights reserved */
2
+ (window["webpackJsonpapplication"] = window["webpackJsonpapplication"] || []).push([["module-5"],{
3
+
4
+ /***/ "./node_modules/moment/locale sync recursive ^\\.\\/.*$":
5
+ /*!**************************************************!*\
6
+ !*** ./node_modules/moment/locale sync ^\.\/.*$ ***!
7
+ \**************************************************/
8
+ /*! no static exports found */
9
+ /***/ (function(module, exports, __webpack_require__) {
10
+
11
+ var map = {
12
+ "./af": "./node_modules/moment/locale/af.js",
13
+ "./af.js": "./node_modules/moment/locale/af.js",
14
+ "./ar": "./node_modules/moment/locale/ar.js",
15
+ "./ar-dz": "./node_modules/moment/locale/ar-dz.js",
16
+ "./ar-dz.js": "./node_modules/moment/locale/ar-dz.js",
17
+ "./ar-kw": "./node_modules/moment/locale/ar-kw.js",
18
+ "./ar-kw.js": "./node_modules/moment/locale/ar-kw.js",
19
+ "./ar-ly": "./node_modules/moment/locale/ar-ly.js",
20
+ "./ar-ly.js": "./node_modules/moment/locale/ar-ly.js",
21
+ "./ar-ma": "./node_modules/moment/locale/ar-ma.js",
22
+ "./ar-ma.js": "./node_modules/moment/locale/ar-ma.js",
23
+ "./ar-sa": "./node_modules/moment/locale/ar-sa.js",
24
+ "./ar-sa.js": "./node_modules/moment/locale/ar-sa.js",
25
+ "./ar-tn": "./node_modules/moment/locale/ar-tn.js",
26
+ "./ar-tn.js": "./node_modules/moment/locale/ar-tn.js",
27
+ "./ar.js": "./node_modules/moment/locale/ar.js",
28
+ "./az": "./node_modules/moment/locale/az.js",
29
+ "./az.js": "./node_modules/moment/locale/az.js",
30
+ "./be": "./node_modules/moment/locale/be.js",
31
+ "./be.js": "./node_modules/moment/locale/be.js",
32
+ "./bg": "./node_modules/moment/locale/bg.js",
33
+ "./bg.js": "./node_modules/moment/locale/bg.js",
34
+ "./bm": "./node_modules/moment/locale/bm.js",
35
+ "./bm.js": "./node_modules/moment/locale/bm.js",
36
+ "./bn": "./node_modules/moment/locale/bn.js",
37
+ "./bn.js": "./node_modules/moment/locale/bn.js",
38
+ "./bo": "./node_modules/moment/locale/bo.js",
39
+ "./bo.js": "./node_modules/moment/locale/bo.js",
40
+ "./br": "./node_modules/moment/locale/br.js",
41
+ "./br.js": "./node_modules/moment/locale/br.js",
42
+ "./bs": "./node_modules/moment/locale/bs.js",
43
+ "./bs.js": "./node_modules/moment/locale/bs.js",
44
+ "./ca": "./node_modules/moment/locale/ca.js",
45
+ "./ca.js": "./node_modules/moment/locale/ca.js",
46
+ "./cs": "./node_modules/moment/locale/cs.js",
47
+ "./cs.js": "./node_modules/moment/locale/cs.js",
48
+ "./cv": "./node_modules/moment/locale/cv.js",
49
+ "./cv.js": "./node_modules/moment/locale/cv.js",
50
+ "./cy": "./node_modules/moment/locale/cy.js",
51
+ "./cy.js": "./node_modules/moment/locale/cy.js",
52
+ "./da": "./node_modules/moment/locale/da.js",
53
+ "./da.js": "./node_modules/moment/locale/da.js",
54
+ "./de": "./node_modules/moment/locale/de.js",
55
+ "./de-at": "./node_modules/moment/locale/de-at.js",
56
+ "./de-at.js": "./node_modules/moment/locale/de-at.js",
57
+ "./de-ch": "./node_modules/moment/locale/de-ch.js",
58
+ "./de-ch.js": "./node_modules/moment/locale/de-ch.js",
59
+ "./de.js": "./node_modules/moment/locale/de.js",
60
+ "./dv": "./node_modules/moment/locale/dv.js",
61
+ "./dv.js": "./node_modules/moment/locale/dv.js",
62
+ "./el": "./node_modules/moment/locale/el.js",
63
+ "./el.js": "./node_modules/moment/locale/el.js",
64
+ "./en-SG": "./node_modules/moment/locale/en-SG.js",
65
+ "./en-SG.js": "./node_modules/moment/locale/en-SG.js",
66
+ "./en-au": "./node_modules/moment/locale/en-au.js",
67
+ "./en-au.js": "./node_modules/moment/locale/en-au.js",
68
+ "./en-ca": "./node_modules/moment/locale/en-ca.js",
69
+ "./en-ca.js": "./node_modules/moment/locale/en-ca.js",
70
+ "./en-gb": "./node_modules/moment/locale/en-gb.js",
71
+ "./en-gb.js": "./node_modules/moment/locale/en-gb.js",
72
+ "./en-ie": "./node_modules/moment/locale/en-ie.js",
73
+ "./en-ie.js": "./node_modules/moment/locale/en-ie.js",
74
+ "./en-il": "./node_modules/moment/locale/en-il.js",
75
+ "./en-il.js": "./node_modules/moment/locale/en-il.js",
76
+ "./en-nz": "./node_modules/moment/locale/en-nz.js",
77
+ "./en-nz.js": "./node_modules/moment/locale/en-nz.js",
78
+ "./eo": "./node_modules/moment/locale/eo.js",
79
+ "./eo.js": "./node_modules/moment/locale/eo.js",
80
+ "./es": "./node_modules/moment/locale/es.js",
81
+ "./es-do": "./node_modules/moment/locale/es-do.js",
82
+ "./es-do.js": "./node_modules/moment/locale/es-do.js",
83
+ "./es-us": "./node_modules/moment/locale/es-us.js",
84
+ "./es-us.js": "./node_modules/moment/locale/es-us.js",
85
+ "./es.js": "./node_modules/moment/locale/es.js",
86
+ "./et": "./node_modules/moment/locale/et.js",
87
+ "./et.js": "./node_modules/moment/locale/et.js",
88
+ "./eu": "./node_modules/moment/locale/eu.js",
89
+ "./eu.js": "./node_modules/moment/locale/eu.js",
90
+ "./fa": "./node_modules/moment/locale/fa.js",
91
+ "./fa.js": "./node_modules/moment/locale/fa.js",
92
+ "./fi": "./node_modules/moment/locale/fi.js",
93
+ "./fi.js": "./node_modules/moment/locale/fi.js",
94
+ "./fo": "./node_modules/moment/locale/fo.js",
95
+ "./fo.js": "./node_modules/moment/locale/fo.js",
96
+ "./fr": "./node_modules/moment/locale/fr.js",
97
+ "./fr-ca": "./node_modules/moment/locale/fr-ca.js",
98
+ "./fr-ca.js": "./node_modules/moment/locale/fr-ca.js",
99
+ "./fr-ch": "./node_modules/moment/locale/fr-ch.js",
100
+ "./fr-ch.js": "./node_modules/moment/locale/fr-ch.js",
101
+ "./fr.js": "./node_modules/moment/locale/fr.js",
102
+ "./fy": "./node_modules/moment/locale/fy.js",
103
+ "./fy.js": "./node_modules/moment/locale/fy.js",
104
+ "./ga": "./node_modules/moment/locale/ga.js",
105
+ "./ga.js": "./node_modules/moment/locale/ga.js",
106
+ "./gd": "./node_modules/moment/locale/gd.js",
107
+ "./gd.js": "./node_modules/moment/locale/gd.js",
108
+ "./gl": "./node_modules/moment/locale/gl.js",
109
+ "./gl.js": "./node_modules/moment/locale/gl.js",
110
+ "./gom-latn": "./node_modules/moment/locale/gom-latn.js",
111
+ "./gom-latn.js": "./node_modules/moment/locale/gom-latn.js",
112
+ "./gu": "./node_modules/moment/locale/gu.js",
113
+ "./gu.js": "./node_modules/moment/locale/gu.js",
114
+ "./he": "./node_modules/moment/locale/he.js",
115
+ "./he.js": "./node_modules/moment/locale/he.js",
116
+ "./hi": "./node_modules/moment/locale/hi.js",
117
+ "./hi.js": "./node_modules/moment/locale/hi.js",
118
+ "./hr": "./node_modules/moment/locale/hr.js",
119
+ "./hr.js": "./node_modules/moment/locale/hr.js",
120
+ "./hu": "./node_modules/moment/locale/hu.js",
121
+ "./hu.js": "./node_modules/moment/locale/hu.js",
122
+ "./hy-am": "./node_modules/moment/locale/hy-am.js",
123
+ "./hy-am.js": "./node_modules/moment/locale/hy-am.js",
124
+ "./id": "./node_modules/moment/locale/id.js",
125
+ "./id.js": "./node_modules/moment/locale/id.js",
126
+ "./is": "./node_modules/moment/locale/is.js",
127
+ "./is.js": "./node_modules/moment/locale/is.js",
128
+ "./it": "./node_modules/moment/locale/it.js",
129
+ "./it-ch": "./node_modules/moment/locale/it-ch.js",
130
+ "./it-ch.js": "./node_modules/moment/locale/it-ch.js",
131
+ "./it.js": "./node_modules/moment/locale/it.js",
132
+ "./ja": "./node_modules/moment/locale/ja.js",
133
+ "./ja.js": "./node_modules/moment/locale/ja.js",
134
+ "./jv": "./node_modules/moment/locale/jv.js",
135
+ "./jv.js": "./node_modules/moment/locale/jv.js",
136
+ "./ka": "./node_modules/moment/locale/ka.js",
137
+ "./ka.js": "./node_modules/moment/locale/ka.js",
138
+ "./kk": "./node_modules/moment/locale/kk.js",
139
+ "./kk.js": "./node_modules/moment/locale/kk.js",
140
+ "./km": "./node_modules/moment/locale/km.js",
141
+ "./km.js": "./node_modules/moment/locale/km.js",
142
+ "./kn": "./node_modules/moment/locale/kn.js",
143
+ "./kn.js": "./node_modules/moment/locale/kn.js",
144
+ "./ko": "./node_modules/moment/locale/ko.js",
145
+ "./ko.js": "./node_modules/moment/locale/ko.js",
146
+ "./ku": "./node_modules/moment/locale/ku.js",
147
+ "./ku.js": "./node_modules/moment/locale/ku.js",
148
+ "./ky": "./node_modules/moment/locale/ky.js",
149
+ "./ky.js": "./node_modules/moment/locale/ky.js",
150
+ "./lb": "./node_modules/moment/locale/lb.js",
151
+ "./lb.js": "./node_modules/moment/locale/lb.js",
152
+ "./lo": "./node_modules/moment/locale/lo.js",
153
+ "./lo.js": "./node_modules/moment/locale/lo.js",
154
+ "./lt": "./node_modules/moment/locale/lt.js",
155
+ "./lt.js": "./node_modules/moment/locale/lt.js",
156
+ "./lv": "./node_modules/moment/locale/lv.js",
157
+ "./lv.js": "./node_modules/moment/locale/lv.js",
158
+ "./me": "./node_modules/moment/locale/me.js",
159
+ "./me.js": "./node_modules/moment/locale/me.js",
160
+ "./mi": "./node_modules/moment/locale/mi.js",
161
+ "./mi.js": "./node_modules/moment/locale/mi.js",
162
+ "./mk": "./node_modules/moment/locale/mk.js",
163
+ "./mk.js": "./node_modules/moment/locale/mk.js",
164
+ "./ml": "./node_modules/moment/locale/ml.js",
165
+ "./ml.js": "./node_modules/moment/locale/ml.js",
166
+ "./mn": "./node_modules/moment/locale/mn.js",
167
+ "./mn.js": "./node_modules/moment/locale/mn.js",
168
+ "./mr": "./node_modules/moment/locale/mr.js",
169
+ "./mr.js": "./node_modules/moment/locale/mr.js",
170
+ "./ms": "./node_modules/moment/locale/ms.js",
171
+ "./ms-my": "./node_modules/moment/locale/ms-my.js",
172
+ "./ms-my.js": "./node_modules/moment/locale/ms-my.js",
173
+ "./ms.js": "./node_modules/moment/locale/ms.js",
174
+ "./mt": "./node_modules/moment/locale/mt.js",
175
+ "./mt.js": "./node_modules/moment/locale/mt.js",
176
+ "./my": "./node_modules/moment/locale/my.js",
177
+ "./my.js": "./node_modules/moment/locale/my.js",
178
+ "./nb": "./node_modules/moment/locale/nb.js",
179
+ "./nb.js": "./node_modules/moment/locale/nb.js",
180
+ "./ne": "./node_modules/moment/locale/ne.js",
181
+ "./ne.js": "./node_modules/moment/locale/ne.js",
182
+ "./nl": "./node_modules/moment/locale/nl.js",
183
+ "./nl-be": "./node_modules/moment/locale/nl-be.js",
184
+ "./nl-be.js": "./node_modules/moment/locale/nl-be.js",
185
+ "./nl.js": "./node_modules/moment/locale/nl.js",
186
+ "./nn": "./node_modules/moment/locale/nn.js",
187
+ "./nn.js": "./node_modules/moment/locale/nn.js",
188
+ "./pa-in": "./node_modules/moment/locale/pa-in.js",
189
+ "./pa-in.js": "./node_modules/moment/locale/pa-in.js",
190
+ "./pl": "./node_modules/moment/locale/pl.js",
191
+ "./pl.js": "./node_modules/moment/locale/pl.js",
192
+ "./pt": "./node_modules/moment/locale/pt.js",
193
+ "./pt-br": "./node_modules/moment/locale/pt-br.js",
194
+ "./pt-br.js": "./node_modules/moment/locale/pt-br.js",
195
+ "./pt.js": "./node_modules/moment/locale/pt.js",
196
+ "./ro": "./node_modules/moment/locale/ro.js",
197
+ "./ro.js": "./node_modules/moment/locale/ro.js",
198
+ "./ru": "./node_modules/moment/locale/ru.js",
199
+ "./ru.js": "./node_modules/moment/locale/ru.js",
200
+ "./sd": "./node_modules/moment/locale/sd.js",
201
+ "./sd.js": "./node_modules/moment/locale/sd.js",
202
+ "./se": "./node_modules/moment/locale/se.js",
203
+ "./se.js": "./node_modules/moment/locale/se.js",
204
+ "./si": "./node_modules/moment/locale/si.js",
205
+ "./si.js": "./node_modules/moment/locale/si.js",
206
+ "./sk": "./node_modules/moment/locale/sk.js",
207
+ "./sk.js": "./node_modules/moment/locale/sk.js",
208
+ "./sl": "./node_modules/moment/locale/sl.js",
209
+ "./sl.js": "./node_modules/moment/locale/sl.js",
210
+ "./sq": "./node_modules/moment/locale/sq.js",
211
+ "./sq.js": "./node_modules/moment/locale/sq.js",
212
+ "./sr": "./node_modules/moment/locale/sr.js",
213
+ "./sr-cyrl": "./node_modules/moment/locale/sr-cyrl.js",
214
+ "./sr-cyrl.js": "./node_modules/moment/locale/sr-cyrl.js",
215
+ "./sr.js": "./node_modules/moment/locale/sr.js",
216
+ "./ss": "./node_modules/moment/locale/ss.js",
217
+ "./ss.js": "./node_modules/moment/locale/ss.js",
218
+ "./sv": "./node_modules/moment/locale/sv.js",
219
+ "./sv.js": "./node_modules/moment/locale/sv.js",
220
+ "./sw": "./node_modules/moment/locale/sw.js",
221
+ "./sw.js": "./node_modules/moment/locale/sw.js",
222
+ "./ta": "./node_modules/moment/locale/ta.js",
223
+ "./ta.js": "./node_modules/moment/locale/ta.js",
224
+ "./te": "./node_modules/moment/locale/te.js",
225
+ "./te.js": "./node_modules/moment/locale/te.js",
226
+ "./tet": "./node_modules/moment/locale/tet.js",
227
+ "./tet.js": "./node_modules/moment/locale/tet.js",
228
+ "./tg": "./node_modules/moment/locale/tg.js",
229
+ "./tg.js": "./node_modules/moment/locale/tg.js",
230
+ "./th": "./node_modules/moment/locale/th.js",
231
+ "./th.js": "./node_modules/moment/locale/th.js",
232
+ "./tl-ph": "./node_modules/moment/locale/tl-ph.js",
233
+ "./tl-ph.js": "./node_modules/moment/locale/tl-ph.js",
234
+ "./tlh": "./node_modules/moment/locale/tlh.js",
235
+ "./tlh.js": "./node_modules/moment/locale/tlh.js",
236
+ "./tr": "./node_modules/moment/locale/tr.js",
237
+ "./tr.js": "./node_modules/moment/locale/tr.js",
238
+ "./tzl": "./node_modules/moment/locale/tzl.js",
239
+ "./tzl.js": "./node_modules/moment/locale/tzl.js",
240
+ "./tzm": "./node_modules/moment/locale/tzm.js",
241
+ "./tzm-latn": "./node_modules/moment/locale/tzm-latn.js",
242
+ "./tzm-latn.js": "./node_modules/moment/locale/tzm-latn.js",
243
+ "./tzm.js": "./node_modules/moment/locale/tzm.js",
244
+ "./ug-cn": "./node_modules/moment/locale/ug-cn.js",
245
+ "./ug-cn.js": "./node_modules/moment/locale/ug-cn.js",
246
+ "./uk": "./node_modules/moment/locale/uk.js",
247
+ "./uk.js": "./node_modules/moment/locale/uk.js",
248
+ "./ur": "./node_modules/moment/locale/ur.js",
249
+ "./ur.js": "./node_modules/moment/locale/ur.js",
250
+ "./uz": "./node_modules/moment/locale/uz.js",
251
+ "./uz-latn": "./node_modules/moment/locale/uz-latn.js",
252
+ "./uz-latn.js": "./node_modules/moment/locale/uz-latn.js",
253
+ "./uz.js": "./node_modules/moment/locale/uz.js",
254
+ "./vi": "./node_modules/moment/locale/vi.js",
255
+ "./vi.js": "./node_modules/moment/locale/vi.js",
256
+ "./x-pseudo": "./node_modules/moment/locale/x-pseudo.js",
257
+ "./x-pseudo.js": "./node_modules/moment/locale/x-pseudo.js",
258
+ "./yo": "./node_modules/moment/locale/yo.js",
259
+ "./yo.js": "./node_modules/moment/locale/yo.js",
260
+ "./zh-cn": "./node_modules/moment/locale/zh-cn.js",
261
+ "./zh-cn.js": "./node_modules/moment/locale/zh-cn.js",
262
+ "./zh-hk": "./node_modules/moment/locale/zh-hk.js",
263
+ "./zh-hk.js": "./node_modules/moment/locale/zh-hk.js",
264
+ "./zh-tw": "./node_modules/moment/locale/zh-tw.js",
265
+ "./zh-tw.js": "./node_modules/moment/locale/zh-tw.js"
266
+ };
267
+
268
+
269
+ function webpackContext(req) {
270
+ var id = webpackContextResolve(req);
271
+ return __webpack_require__(id);
272
+ }
273
+ function webpackContextResolve(req) {
274
+ if(!__webpack_require__.o(map, req)) {
275
+ var e = new Error("Cannot find module '" + req + "'");
276
+ e.code = 'MODULE_NOT_FOUND';
277
+ throw e;
278
+ }
279
+ return map[req];
280
+ }
281
+ webpackContext.keys = function webpackContextKeys() {
282
+ return Object.keys(map);
283
+ };
284
+ webpackContext.resolve = webpackContextResolve;
285
+ module.exports = webpackContext;
286
+ webpackContext.id = "./node_modules/moment/locale sync recursive ^\\.\\/.*$";
287
+
288
+ /***/ }),
289
+
290
+ /***/ "./src/components/charts/base-chart.js":
291
+ /*!*********************************************!*\
292
+ !*** ./src/components/charts/base-chart.js ***!
293
+ \*********************************************/
294
+ /*! exports provided: BaseChart */
295
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
296
+
297
+ "use strict";
298
+ __webpack_require__.r(__webpack_exports__);
299
+ /* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseChart", function() { return BaseChart; });
300
+ class BaseChart extends HTMLElement
301
+ {
302
+ constructor(maxValues)
303
+ {
304
+ super();
305
+
306
+ this._maxValues = maxValues;
307
+
308
+ // Initialize
309
+ this._initialize();
310
+ }
311
+
312
+ // Can be overridden
313
+ _initialize()
314
+ {
315
+ // Create chart html
316
+ let chartHtml = $('<div>');
317
+ $(this).append(chartHtml);
318
+
319
+ this._chartWidget = this._initChartWidget(chartHtml);
320
+
321
+ // Reset data source
322
+ this.reset();
323
+ }
324
+
325
+ // MUST BE OVERRIDDEN
326
+ _initChartWidget()
327
+ {
328
+ throw new Error('Chart widget must be initialized!')
329
+ }
330
+
331
+ set paused(value)
332
+ {
333
+ this.isPaused = value;
334
+ this._onPauseChange();
335
+ }
336
+
337
+ get paused()
338
+ {
339
+ return this.isPaused;
340
+ }
341
+
342
+ reset()
343
+ {
344
+ this._chartWidget.setDataSource([]);
345
+ }
346
+
347
+ redraw()
348
+ {
349
+ this._chartWidget.redraw();
350
+ }
351
+
352
+ getLastEntry()
353
+ {
354
+ let ds;
355
+
356
+ if (this.isPaused)
357
+ ds = this._tempDS;
358
+ else
359
+ ds = this._dataSource;
360
+
361
+ if (ds != null && ds.total() > 0)
362
+ return ds.at(ds.total() - 1);
363
+ else
364
+ return null;
365
+ }
366
+
367
+ _addEntry(newEntry)
368
+ {
369
+ if (this.isPaused)
370
+ {
371
+ if (this._tempDS == null)
372
+ this._tempDS = new kendo.data.DataSource();
373
+
374
+ // Store new value in a temporary array
375
+ this._tempDS.add(newEntry);
376
+ }
377
+ else
378
+ {
379
+ let ds = this._dataSource;
380
+
381
+ if (this._tempDS != null)
382
+ {
383
+ // Concatenate temporary entries to actual data source
384
+ let newArr = $.merge(ds.data(), this._tempDS.data());
385
+
386
+ // Remove values exceeding MAX_VALUES
387
+ if (newArr.length > this._maxValues)
388
+ newArr.splice(0, newArr.length - this._maxValues)
389
+
390
+ // Create new datasource
391
+ let newDS = new kendo.data.DataSource({data: newArr})
392
+
393
+ // Assign new data source to chart
394
+ this._chartWidget.setDataSource(newDS);
395
+
396
+ // Remove temporary array
397
+ this._tempDS = null;
398
+ }
399
+
400
+ // Add new entry
401
+ ds.add(newEntry);
402
+
403
+ // Remove first item if needed
404
+ if (ds.total() > this._maxValues)
405
+ ds.remove(ds.at(0));
406
+ }
407
+ }
408
+
409
+ get _dataSource()
410
+ {
411
+ return this._chartWidget.dataSource;
412
+ }
413
+
414
+ _onPauseChange()
415
+ {
416
+ // Nothing to do, should be overridden
417
+ }
418
+ }
419
+
420
+ // DEFINE COMPONENT
421
+ if (!window.customElements.get('base-chart'))
422
+ window.customElements.define('base-chart', BaseChart);
423
+
424
+ /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "jquery")))
425
+
426
+ /***/ }),
427
+
428
+ /***/ "./src/components/charts/chart-utils.js":
429
+ /*!**********************************************!*\
430
+ !*** ./src/components/charts/chart-utils.js ***!
431
+ \**********************************************/
432
+ /*! exports provided: getFormattedDateTime, getBasicSharedTemplate, getMemorySharedTemplate, getMemoryValueAxisLabelTemplate, getNetworkSharedTemplate, getNetworkValueAxisLabelTemplate, getUserCountSharedTemplate, getTimeRangeTooltipTemplate, getWRBytesLabelTemplate */
433
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
434
+
435
+ "use strict";
436
+ __webpack_require__.r(__webpack_exports__);
437
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getFormattedDateTime", function() { return getFormattedDateTime; });
438
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBasicSharedTemplate", function() { return getBasicSharedTemplate; });
439
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMemorySharedTemplate", function() { return getMemorySharedTemplate; });
440
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMemoryValueAxisLabelTemplate", function() { return getMemoryValueAxisLabelTemplate; });
441
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getNetworkSharedTemplate", function() { return getNetworkSharedTemplate; });
442
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getNetworkValueAxisLabelTemplate", function() { return getNetworkValueAxisLabelTemplate; });
443
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUserCountSharedTemplate", function() { return getUserCountSharedTemplate; });
444
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeRangeTooltipTemplate", function() { return getTimeRangeTooltipTemplate; });
445
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getWRBytesLabelTemplate", function() { return getWRBytesLabelTemplate; });
446
+ /* harmony import */ var _utils_utilities__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/utilities */ "./src/utils/utilities.js");
447
+
448
+
449
+ function getFormattedDateTime(date, format = 'dd MMM HH:mm:ss')
450
+ {
451
+ return kendo.toString(date, format);
452
+ }
453
+
454
+ function getBasicSharedTemplate(valueFormat = '{0}') {
455
+ return kendo.template(`
456
+ <div class="chart-tooltip-category"><strong>#: category #</strong></div>
457
+ # for (var i = 0; i < points.length; i++) { #
458
+ <div>
459
+ <i class="fas fa-square" style="color: #: points[i].color # "></i>
460
+ #: points[i].series.name# : #: kendo.format('${valueFormat}', points[i].value) #
461
+ </div>
462
+ # } #
463
+ `);
464
+ }
465
+
466
+ function getMemorySharedTemplate() {
467
+ return function(dataItem) {
468
+ dataItem.bytesToSize = _utils_utilities__WEBPACK_IMPORTED_MODULE_0__["bytesToSize"]; // Pass bytesToSize utility function to template
469
+ return kendo.template(`
470
+ <div class="chart-tooltip-category"><strong>#: category #</strong></div>
471
+ # for (var i = 0; i < points.length; i++) { #
472
+ <div>
473
+ <i class="fas fa-square" style="color: #: points[i].color # "></i>
474
+ #: points[i].series.name# : #: bytesToSize(points[i].value) #
475
+ </div>
476
+ # } #
477
+ `)(dataItem);
478
+ };
479
+ }
480
+
481
+ function getMemoryValueAxisLabelTemplate() {
482
+ return function(dataItem) {
483
+ dataItem.bytesToSize = _utils_utilities__WEBPACK_IMPORTED_MODULE_0__["bytesToSize"]; // Pass bytesToSize utility function to template
484
+ return kendo.template(`
485
+ #: bytesToSize(value) #
486
+ `)(dataItem);
487
+ };
488
+ }
489
+
490
+ function getNetworkSharedTemplate(categoryFormat = 'dd MMM HH:mm:ss') {
491
+ return function(dataItem) {
492
+ dataItem.kBytesToSize = _utils_utilities__WEBPACK_IMPORTED_MODULE_0__["kBytesToSize"]; // Pass kBytesToSize utility function to template
493
+ return kendo.template(`
494
+ <div class="chart-tooltip-category"><strong>#: kendo.toString(category, '${categoryFormat}') #</strong></div>
495
+ # for (var i = 0; i < points.length; i++) { #
496
+ <div>
497
+ <i class="fas fa-square" style="color: #: points[i].color # "></i>
498
+ #: points[i].series.name# : #: kBytesToSize(points[i].value, 1, '', '/s') #
499
+ </div>
500
+ # } #
501
+ `)(dataItem);
502
+ };
503
+ }
504
+
505
+ function getNetworkValueAxisLabelTemplate() {
506
+ return function(dataItem) {
507
+ dataItem.kBytesToSize = _utils_utilities__WEBPACK_IMPORTED_MODULE_0__["kBytesToSize"]; // Pass kBytesToSize utility function to template
508
+ return kendo.template(`
509
+ #: kBytesToSize(value, 1, '', '/s') #
510
+ `)(dataItem);
511
+ };
512
+ }
513
+
514
+ function getUserCountSharedTemplate(categoryFormat = 'dd MMM HH:mm:ss') {
515
+ return function(dataItem) {
516
+ return kendo.template(`
517
+ <div class="chart-tooltip-category"><strong>#: kendo.toString(category, '${categoryFormat}') #</strong></div>
518
+ # for (var i = 0; i < points.length; i++) { #
519
+ <div>
520
+ <i class="fas fa-square" style="color: #: points[i].color # "></i>
521
+ #: points[i].series.name# : #: points[i].value #
522
+ </div>
523
+ # } #
524
+ `)(dataItem);
525
+ };
526
+ }
527
+
528
+ function getTimeRangeTooltipTemplate() {
529
+ return function(dataItem) {
530
+ dataItem.getTooltipString = function(v1, v2) {
531
+ if (v1 == v2)
532
+ {
533
+ if (v2 == -24)
534
+ v2 = -23;
535
+
536
+ v1 = v2 - 1;
537
+ }
538
+
539
+ let start = Math.abs(v1);
540
+ let end = Math.abs(v2);
541
+
542
+ return `From ${start} hour${start != 1 ? 's' : ''} ago to ${end > 0 ? ('to ' + end + ' hour' + (end != 1 ? 's' : '') + ' ago') : 'now'}`;
543
+ }; // Pass utility function to template
544
+ return kendo.template(`
545
+ #: getTooltipString(selectionStart, selectionEnd) #
546
+ `)(dataItem);
547
+ };
548
+ }
549
+
550
+ function getWRBytesLabelTemplate() {
551
+ return function(dataItem) {
552
+ return kendo.template(`
553
+ #: value # #: dataItem.unit #
554
+ `)(dataItem);
555
+ };
556
+ }
557
+
558
+
559
+ /***/ }),
560
+
561
+ /***/ "./src/components/charts/cpu-usage-chart.js":
562
+ /*!**************************************************!*\
563
+ !*** ./src/components/charts/cpu-usage-chart.js ***!
564
+ \**************************************************/
565
+ /*! exports provided: CpuUsageChart */
566
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
567
+
568
+ "use strict";
569
+ __webpack_require__.r(__webpack_exports__);
570
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CpuUsageChart", function() { return CpuUsageChart; });
571
+ /* harmony import */ var _base_chart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base-chart */ "./src/components/charts/base-chart.js");
572
+ /* harmony import */ var _chart_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chart-utils */ "./src/components/charts/chart-utils.js");
573
+
574
+
575
+
576
+
577
+ class CpuUsageChart extends _base_chart__WEBPACK_IMPORTED_MODULE_0__["BaseChart"]
578
+ {
579
+ constructor()
580
+ {
581
+ super(120);
582
+ }
583
+
584
+ _initChartWidget(chartHtml)
585
+ {
586
+ return chartHtml.kendoChart({
587
+ transitions: false,
588
+ chartArea: {
589
+ height: 120
590
+ },
591
+ legend: {
592
+ visible: false
593
+ },
594
+ seriesDefaults: {
595
+ type: 'area',
596
+ labels: {
597
+ visible: false,
598
+ format: '{0}%',
599
+ background: 'transparent'
600
+ }
601
+ },
602
+ series: [
603
+ {
604
+ name: 'System',
605
+ field: 'systemLoad',
606
+ categoryField: 'time',
607
+ color: this.systemColor,
608
+ line: {
609
+ width: 2
610
+ }
611
+ },
612
+ {
613
+ name: 'Process',
614
+ field: 'processLoad',
615
+ categoryField: 'time',
616
+ color: this.processColor,
617
+ line: {
618
+ width: 2
619
+ }
620
+ }
621
+ ],
622
+ valueAxis: {
623
+ labels: {
624
+ format: '{0}%'
625
+ },
626
+ line: {
627
+ visible: false
628
+ },
629
+ min: 0,
630
+ max: 100
631
+ },
632
+ categoryAxis: {
633
+ majorGridLines: {
634
+ visible: false
635
+ },
636
+ majorTicks: {
637
+ visible: false
638
+ },
639
+ labels: {
640
+ visible: false
641
+ }
642
+ },
643
+ tooltip: {
644
+ shared: true,
645
+ visible: true,
646
+ sharedTemplate: Object(_chart_utils__WEBPACK_IMPORTED_MODULE_1__["getBasicSharedTemplate"])('{0}%'),
647
+ background: '#e4e4e4'
648
+ }
649
+ }).data('kendoChart');
650
+ }
651
+
652
+ get systemColor()
653
+ {
654
+ return '#3399FF';
655
+ }
656
+
657
+ get processColor()
658
+ {
659
+ return '#0033CC';
660
+ }
661
+
662
+ addEntry(processLoad, systemLoad)
663
+ {
664
+ let newEntry = {
665
+ time: Object(_chart_utils__WEBPACK_IMPORTED_MODULE_1__["getFormattedDateTime"])(new Date()),
666
+ processLoad: processLoad,
667
+ systemLoad: systemLoad
668
+ };
669
+
670
+ // Add entry to chart
671
+ super._addEntry(newEntry);
672
+ }
673
+ }
674
+
675
+ // DEFINE COMPONENT
676
+ if (!window.customElements.get('cpu-usage-chart'))
677
+ window.customElements.define('cpu-usage-chart', CpuUsageChart);
678
+
679
+
680
+ /***/ }),
681
+
682
+ /***/ "./src/components/charts/memory-chart.js":
683
+ /*!***********************************************!*\
684
+ !*** ./src/components/charts/memory-chart.js ***!
685
+ \***********************************************/
686
+ /*! exports provided: MemoryChart */
687
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
688
+
689
+ "use strict";
690
+ __webpack_require__.r(__webpack_exports__);
691
+ /* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MemoryChart", function() { return MemoryChart; });
692
+ /* harmony import */ var _base_chart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base-chart */ "./src/components/charts/base-chart.js");
693
+ /* harmony import */ var _chart_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chart-utils */ "./src/components/charts/chart-utils.js");
694
+
695
+
696
+
697
+
698
+ class MemoryChart extends _base_chart__WEBPACK_IMPORTED_MODULE_0__["BaseChart"]
699
+ {
700
+ constructor()
701
+ {
702
+ super(300);
703
+
704
+ // Append text to display elapsed time
705
+ this._elapsedTxt = $('<div>', {class: 'text-center', text: '---'});
706
+ $(this).append(this._elapsedTxt);
707
+ }
708
+
709
+ _initChartWidget(chartHtml)
710
+ {
711
+ return chartHtml.kendoChart({
712
+ transitions: false,
713
+ chartArea: {
714
+ height: 240
715
+ },
716
+ legend: {
717
+ visible: false
718
+ },
719
+ seriesDefaults: {
720
+ type: 'area',
721
+ labels: {
722
+ visible: false,
723
+ format: '{0}',
724
+ background: 'transparent'
725
+ },
726
+ },
727
+ series: [{
728
+ name: 'Allocated',
729
+ field: 'allocMem',
730
+ categoryField: 'time',
731
+ color: this.allocatedColor,
732
+ line: {
733
+ width: 2
734
+ }
735
+ },
736
+ {
737
+ name: 'Used',
738
+ field: 'usedMem',
739
+ categoryField: 'time',
740
+ color: this.usedColor,
741
+ line: {
742
+ width: 2
743
+ }
744
+ }],
745
+ valueAxis: {
746
+ labels: {
747
+ format: '{0}',
748
+ template: Object(_chart_utils__WEBPACK_IMPORTED_MODULE_1__["getMemoryValueAxisLabelTemplate"])()
749
+ },
750
+ line: {
751
+ visible: false
752
+ },
753
+ min: 0
754
+ },
755
+ categoryAxis: {
756
+ majorGridLines: {
757
+ visible: false
758
+ },
759
+ majorTicks: {
760
+ visible: false
761
+ },
762
+ labels: {
763
+ visible: false
764
+ }
765
+ },
766
+ tooltip: {
767
+ shared: true,
768
+ visible: true,
769
+ sharedTemplate: Object(_chart_utils__WEBPACK_IMPORTED_MODULE_1__["getMemorySharedTemplate"])(),
770
+ background: '#e4e4e4'
771
+ }
772
+ }).data('kendoChart');
773
+ }
774
+
775
+ get allocatedColor()
776
+ {
777
+ return '#3399FF';
778
+ }
779
+
780
+ get usedColor()
781
+ {
782
+ return '#0033CC';
783
+ }
784
+
785
+ addEntry(allocMem, usedMem)
786
+ {
787
+ let now = new Date();
788
+
789
+ let newEntry = {
790
+ time: Object(_chart_utils__WEBPACK_IMPORTED_MODULE_1__["getFormattedDateTime"])(now),
791
+ timestamp: now.getTime(),
792
+ allocMem: allocMem,
793
+ usedMem: usedMem
794
+ };
795
+
796
+ // Add entry to chart
797
+ super._addEntry(newEntry);
798
+
799
+ // Update x axis
800
+ if (!this.isPaused)
801
+ this._updateElapsedText();
802
+ }
803
+
804
+ _updateElapsedText()
805
+ {
806
+ let ds = this._dataSource;
807
+
808
+ if (ds.total() > 1)
809
+ {
810
+ // Get axis limits
811
+ const chartMinimum = ds.at(0).timestamp;
812
+ const chartMaximum = ds.at(ds.total() - 1).timestamp;
813
+
814
+ // Set elapsed text
815
+ let seconds = Math.round( (chartMaximum - chartMinimum) / 1000 );
816
+ let title;
817
+
818
+ if (seconds < 60)
819
+ title = 'Last ' + (seconds != 1 ? seconds + ' seconds' : 'second');
820
+ else
821
+ {
822
+ const minutes = Math.floor(seconds / 60);
823
+ title = 'Last ' + (minutes != 1 ? minutes + ' minutes' : 'minute');
824
+ }
825
+
826
+ this._elapsedTxt.text(title);
827
+ }
828
+ }
829
+ }
830
+
831
+ // DEFINE COMPONENT
832
+ if (!window.customElements.get('memory-chart'))
833
+ window.customElements.define('memory-chart', MemoryChart);
834
+
835
+ /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "jquery")))
836
+
837
+ /***/ }),
838
+
839
+ /***/ "./src/components/charts/network-24h-chart.js":
840
+ /*!****************************************************!*\
841
+ !*** ./src/components/charts/network-24h-chart.js ***!
842
+ \****************************************************/
843
+ /*! exports provided: Network24hChart */
844
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
845
+
846
+ "use strict";
847
+ __webpack_require__.r(__webpack_exports__);
848
+ /* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Network24hChart", function() { return Network24hChart; });
849
+ /* harmony import */ var _chart_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./chart-utils */ "./src/components/charts/chart-utils.js");
850
+ /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! moment */ "./node_modules/moment/moment.js");
851
+ /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_1__);
852
+
853
+
854
+
855
+ class Network24hChart extends HTMLElement
856
+ {
857
+ constructor()
858
+ {
859
+ super();
860
+
861
+ this._lastTotalOut = 0;
862
+ this._lastTotalIn = 0;
863
+ this._lastDate = new Date();
864
+ this._samplingRateSeconds = 0;
865
+
866
+ // Create chart html
867
+ let chartHtml = $('<div>');
868
+ $(this).append(chartHtml);
869
+
870
+ // Initialize chart
871
+ this._chartWidget = this._initChartWidget(chartHtml);
872
+ }
873
+
874
+ _initChartWidget(chartHtml)
875
+ {
876
+ return chartHtml.kendoChart({
877
+ transitions: false,
878
+ chartArea: {
879
+ height: 270,
880
+ background: 'transparent'
881
+ },
882
+ legend: {
883
+ visible: false
884
+ },
885
+ seriesDefaults: {
886
+ type: 'area',
887
+ labels: {
888
+ visible: false,
889
+ format: '{0}',
890
+ background: 'transparent'
891
+ },
892
+ },
893
+ series: [{
894
+ name: 'Outgoing',
895
+ field: 'outgoing',
896
+ categoryField: 'time',
897
+ color: '#CC0000',
898
+ line: {
899
+ width: 2
900
+ }
901
+ },
902
+ {
903
+ name: 'Incoming',
904
+ field: 'incoming',
905
+ categoryField: 'time',
906
+ color: '#009900',
907
+ line: {
908
+ width: 2
909
+ }
910
+ }],
911
+ valueAxis: {
912
+ labels: {
913
+ format: '{0}',
914
+ template: Object(_chart_utils__WEBPACK_IMPORTED_MODULE_0__["getNetworkValueAxisLabelTemplate"])()
915
+ },
916
+ line: {
917
+ visible: false
918
+ },
919
+ min: 0
920
+ },
921
+ categoryAxis: {
922
+ majorGridLines: {
923
+ visible: true,
924
+ step: 60
925
+ },
926
+ majorTicks: {
927
+ visible: true,
928
+ step: 60
929
+ },
930
+ labels: {
931
+ visible: true,
932
+ step: 60
933
+ },
934
+ baseUnit: 'minutes',
935
+ type: 'date',
936
+ },
937
+ tooltip: {
938
+ shared: true,
939
+ visible: true,
940
+ sharedTemplate: Object(_chart_utils__WEBPACK_IMPORTED_MODULE_0__["getNetworkSharedTemplate"])('dd MMM HH:mm'),
941
+ background: '#e4e4e4'
942
+ }
943
+ }).data('kendoChart');
944
+ }
945
+
946
+ redraw()
947
+ {
948
+ this._chartWidget.redraw();
949
+ }
950
+
951
+ set range(values)
952
+ {
953
+ this._range = values;
954
+
955
+ this._updateXAxisLimits();
956
+ }
957
+
958
+ get range()
959
+ {
960
+ return this._range;
961
+ }
962
+
963
+ addHistoryEntries(outgoingData, incomingData, samplingRateSeconds, shiftSeconds)
964
+ {
965
+ this._samplingRateSeconds = samplingRateSeconds;
966
+
967
+ let now = new Date();
968
+
969
+ // NOTE: outgoingData and incominData are supposed to have the same size!!!
970
+
971
+ if (outgoingData.length > 0)
972
+ {
973
+ let start = moment__WEBPACK_IMPORTED_MODULE_1__(now);
974
+ start.subtract((samplingRateSeconds * outgoingData.length) + shiftSeconds, 's')
975
+
976
+ this._lastTotalOut = outgoingData[0];
977
+ this._lastTotalIn = incomingData[0];
978
+ this._lastDate = start.toDate();
979
+
980
+ if (outgoingData.length > 1)
981
+ {
982
+ let dataSource = new kendo.data.DataSource();
983
+
984
+ for (let i = 1; i < outgoingData.length; i++)
985
+ {
986
+ const totalOut = outgoingData[i];
987
+ const totalIn = incomingData[i];
988
+
989
+ let date = start.clone();
990
+ date.add(i * samplingRateSeconds, 's');
991
+
992
+ this.addEntry(totalOut, totalIn, dataSource, date.toDate(), false);
993
+ }
994
+
995
+ // Assign datasource to chart
996
+ this._chartWidget.setDataSource(dataSource);
997
+
998
+ // Update axis
999
+ this._updateXAxisLimits();
1000
+ }
1001
+ }
1002
+ else
1003
+ {
1004
+ this._lastTotalOut = 0;
1005
+ this._lastTotalIn = 0;
1006
+ this._lastDate = now;
1007
+ }
1008
+ }
1009
+
1010
+ addEntry(totalOut, totalIn, dataSource = null, date = null, updateAxis = true)
1011
+ {
1012
+ if (date == null)
1013
+ date = new Date();
1014
+
1015
+ const elapsedSecs = Math.round((date.getTime() - this._lastDate.getTime()) / 1000);
1016
+
1017
+ // The 24h chart is updated at the same sampling rate used by the server to save the traffic history
1018
+ if (elapsedSecs >= this._samplingRateSeconds)
1019
+ {
1020
+ let newEntry = {
1021
+ time: date,
1022
+ outgoing: Math.round((totalOut - this._lastTotalOut) / elapsedSecs),
1023
+ incoming: Math.round((totalIn - this._lastTotalIn) / elapsedSecs)
1024
+ };
1025
+
1026
+ // Add entry to data source
1027
+ if (dataSource == null)
1028
+ dataSource = this._dataSource;
1029
+
1030
+ dataSource.add(newEntry);
1031
+
1032
+ this._lastTotalOut = totalOut;
1033
+ this._lastTotalIn = totalIn;
1034
+ this._lastDate = date;
1035
+
1036
+ if (updateAxis)
1037
+ this._updateXAxisLimits();
1038
+ }
1039
+ }
1040
+
1041
+ _updateXAxisLimits()
1042
+ {
1043
+ let ds = this._dataSource;
1044
+
1045
+ if (ds.total() > 0)
1046
+ {
1047
+ const chartMinimum = moment__WEBPACK_IMPORTED_MODULE_1__(this._lastDate).add(this._range[0], 'h');
1048
+ const chartMaximum = moment__WEBPACK_IMPORTED_MODULE_1__(this._lastDate).add(this._range[1], 'h');
1049
+
1050
+ this._chartWidget.options.categoryAxis.min = chartMinimum.toDate();
1051
+ this._chartWidget.options.categoryAxis.max = chartMaximum.toDate();
1052
+
1053
+ this._chartWidget.redraw();
1054
+ }
1055
+ }
1056
+
1057
+ get _dataSource()
1058
+ {
1059
+ return this._chartWidget.dataSource;
1060
+ }
1061
+ }
1062
+
1063
+ // DEFINE COMPONENT
1064
+ if (!window.customElements.get('network-24h-chart'))
1065
+ window.customElements.define('network-24h-chart', Network24hChart);
1066
+
1067
+ /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "jquery")))
1068
+
1069
+ /***/ }),
1070
+
1071
+ /***/ "./src/components/charts/network-realtime-chart.js":
1072
+ /*!*********************************************************!*\
1073
+ !*** ./src/components/charts/network-realtime-chart.js ***!
1074
+ \*********************************************************/
1075
+ /*! exports provided: NetworkRealtimeChart */
1076
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
1077
+
1078
+ "use strict";
1079
+ __webpack_require__.r(__webpack_exports__);
1080
+ /* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NetworkRealtimeChart", function() { return NetworkRealtimeChart; });
1081
+ /* harmony import */ var _base_chart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base-chart */ "./src/components/charts/base-chart.js");
1082
+ /* harmony import */ var _chart_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chart-utils */ "./src/components/charts/chart-utils.js");
1083
+
1084
+
1085
+
1086
+
1087
+ class NetworkRealtimeChart extends _base_chart__WEBPACK_IMPORTED_MODULE_0__["BaseChart"]
1088
+ {
1089
+ constructor()
1090
+ {
1091
+ super(300);
1092
+
1093
+ this._lastTotalKbOut = 0;
1094
+ this._lastTotalKbIn = 0;
1095
+ this._lastTime = 0;
1096
+
1097
+ // Append text to display elapsed time
1098
+ this._elapsedTxt = $('<div>', {class: 'text-center', text: '---'});
1099
+ $(this).append(this._elapsedTxt);
1100
+ }
1101
+
1102
+ _initChartWidget(chartHtml)
1103
+ {
1104
+ return chartHtml.kendoChart({
1105
+ transitions: false,
1106
+ chartArea: {
1107
+ height: 270,
1108
+ background: 'transparent'
1109
+ },
1110
+ legend: {
1111
+ visible: false
1112
+ },
1113
+ seriesDefaults: {
1114
+ type: 'area',
1115
+ labels: {
1116
+ visible: false,
1117
+ format: '{0}',
1118
+ background: 'transparent'
1119
+ },
1120
+ },
1121
+ series: [{
1122
+ name: 'Outgoing',
1123
+ field: 'outgoing',
1124
+ categoryField: 'time',
1125
+ color: this.outgoingColor,
1126
+ line: {
1127
+ width: 2
1128
+ }
1129
+ },
1130
+ {
1131
+ name: 'Incoming',
1132
+ field: 'incoming',
1133
+ categoryField: 'time',
1134
+ color: this.incomingColor,
1135
+ line: {
1136
+ width: 2
1137
+ }
1138
+ }],
1139
+ valueAxis: {
1140
+ labels: {
1141
+ format: '{0}',
1142
+ template: Object(_chart_utils__WEBPACK_IMPORTED_MODULE_1__["getNetworkValueAxisLabelTemplate"])()
1143
+ },
1144
+ line: {
1145
+ visible: false
1146
+ },
1147
+ min: 0,
1148
+ },
1149
+ categoryAxis: {
1150
+ majorGridLines: {
1151
+ visible: false
1152
+ },
1153
+ majorTicks: {
1154
+ visible: false
1155
+ },
1156
+ labels: {
1157
+ visible: false
1158
+ }
1159
+ },
1160
+ tooltip: {
1161
+ shared: true,
1162
+ visible: true,
1163
+ sharedTemplate: Object(_chart_utils__WEBPACK_IMPORTED_MODULE_1__["getNetworkSharedTemplate"])(),
1164
+ background: '#e4e4e4'
1165
+ }
1166
+ }).data('kendoChart');
1167
+ }
1168
+
1169
+ get outgoingColor()
1170
+ {
1171
+ return '#CC0000';
1172
+ }
1173
+
1174
+ get incomingColor()
1175
+ {
1176
+ return '#009900';
1177
+ }
1178
+
1179
+ addEntry(totalOutKb, totalInKb)
1180
+ {
1181
+ let now = new Date()
1182
+ let time = now.getTime();
1183
+
1184
+ // The first value sent by the server is not plotted: it would be a worng value because
1185
+ // we have to calculate it as the difference between two total values, but we don't have the previous one
1186
+ if (this._lastTime > 0)
1187
+ {
1188
+ let elapsedSecs = (time - this._lastTime) / 1000;
1189
+
1190
+ const valueOut = Math.round((totalOutKb - this._lastTotalKbOut) / elapsedSecs);
1191
+ const valueIn = Math.round((totalInKb - this._lastTotalKbIn) / elapsedSecs);
1192
+
1193
+ let newEntry = {
1194
+ time: Object(_chart_utils__WEBPACK_IMPORTED_MODULE_1__["getFormattedDateTime"])(now),
1195
+ timestamp: time,
1196
+ outgoing: valueOut,
1197
+ incoming: valueIn
1198
+ };
1199
+
1200
+ // Add entry to chart
1201
+ super._addEntry(newEntry);
1202
+
1203
+ // Update x axis
1204
+ if (!this.isPaused)
1205
+ this._updateElapsedText();
1206
+ }
1207
+
1208
+ this._lastTotalKbOut = totalOutKb;
1209
+ this._lastTotalKbIn = totalInKb;
1210
+ this._lastTime = time;
1211
+ }
1212
+
1213
+ _updateElapsedText()
1214
+ {
1215
+ let ds = this._dataSource;
1216
+
1217
+ if (ds.total() > 1)
1218
+ {
1219
+ // Get axis limits
1220
+ const chartMinimum = ds.at(0).timestamp;
1221
+ const chartMaximum = ds.at(ds.total() - 1).timestamp;
1222
+
1223
+ // Set elapsed text
1224
+ let title;
1225
+ let seconds = Math.round( (chartMaximum - chartMinimum) / 1000 );
1226
+
1227
+ if (seconds < 60)
1228
+ title = 'Last ' + (seconds != 1 ? seconds + ' seconds' : 'second');
1229
+ else
1230
+ {
1231
+ const minutes = Math.floor(seconds / 60);
1232
+ title = 'Last ' + (minutes != 1 ? minutes + ' minutes' : 'minute');
1233
+ }
1234
+
1235
+ this._elapsedTxt.text(title);
1236
+ }
1237
+ }
1238
+ }
1239
+
1240
+ // DEFINE COMPONENT
1241
+ if (!window.customElements.get('network-realtime-chart'))
1242
+ window.customElements.define('network-realtime-chart', NetworkRealtimeChart);
1243
+
1244
+ /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "jquery")))
1245
+
1246
+ /***/ }),
1247
+
1248
+ /***/ "./src/components/charts/system-queue-chart.js":
1249
+ /*!*****************************************************!*\
1250
+ !*** ./src/components/charts/system-queue-chart.js ***!
1251
+ \*****************************************************/
1252
+ /*! exports provided: SystemQueueChart */
1253
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
1254
+
1255
+ "use strict";
1256
+ __webpack_require__.r(__webpack_exports__);
1257
+ /* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SystemQueueChart", function() { return SystemQueueChart; });
1258
+ /* harmony import */ var _base_chart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base-chart */ "./src/components/charts/base-chart.js");
1259
+ /* harmony import */ var _chart_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chart-utils */ "./src/components/charts/chart-utils.js");
1260
+
1261
+
1262
+
1263
+
1264
+ class SystemQueueChart extends _base_chart__WEBPACK_IMPORTED_MODULE_0__["BaseChart"]
1265
+ {
1266
+ constructor()
1267
+ {
1268
+ super(240);
1269
+
1270
+ this._averageLoad = 0;
1271
+ }
1272
+
1273
+ _initialize()
1274
+ {
1275
+ const chartHeight = 240;
1276
+
1277
+ // Append container for chart & gauge
1278
+ let container = $('<div>', {class: 'd-flex flex-row'});
1279
+ $(this).append(container);
1280
+
1281
+ // CHART
1282
+
1283
+ let chartContainer = $('<div>', {class: 'flex-grow-1'});
1284
+ container.append(chartContainer);
1285
+
1286
+ // Create chart html
1287
+ let chartHtml = $('<div>');
1288
+ chartContainer.append(chartHtml);
1289
+
1290
+ // Initialize chart
1291
+ this._chartWidget = this._initChartWidget(chartHtml, chartHeight);
1292
+
1293
+ // Append text to display elapsed time
1294
+ this._elapsedTxt = $('<div>', {class: 'text-center', text: '---'});
1295
+ chartContainer.append(this._elapsedTxt);
1296
+
1297
+ // GAUGE
1298
+
1299
+ let gaugeContainer = $('<div>');
1300
+ container.append(gaugeContainer);
1301
+
1302
+ // Create gauge html
1303
+ let gaugeHtml = $('<div>');
1304
+ gaugeContainer.append(gaugeHtml);
1305
+
1306
+ // Initialize gauge
1307
+ this._gaugeWidget = this._initGaugeWidget(gaugeHtml, chartHeight);
1308
+
1309
+ // Append text to display load
1310
+ this._loadTxt = $('<div>', {class: 'text-center font-weight-bold', text: '---'});
1311
+ gaugeContainer.append(this._loadTxt);
1312
+
1313
+ //------------------------------
1314
+
1315
+ // Reset data source
1316
+ this.reset();
1317
+ }
1318
+
1319
+ _initChartWidget(chartHtml, height)
1320
+ {
1321
+ return chartHtml.kendoChart({
1322
+ transitions: false,
1323
+ chartArea: {
1324
+ height: height,
1325
+ background: 'transparent'
1326
+ },
1327
+ legend: {
1328
+ visible: false
1329
+ },
1330
+ seriesDefaults: {
1331
+ type: 'area',
1332
+ labels: {
1333
+ visible: false,
1334
+ format: '{0}',
1335
+ background: 'transparent'
1336
+ }
1337
+ },
1338
+ series: [
1339
+ {
1340
+ name: 'Messages',
1341
+ field: 'load',
1342
+ categoryField: 'time',
1343
+ color: '#3399ff',
1344
+ line: {
1345
+ width: 2
1346
+ }
1347
+ }
1348
+ ],
1349
+ valueAxis: {
1350
+ title: {
1351
+ text: 'Messages'
1352
+ },
1353
+ labels: {
1354
+ format: '{0}'
1355
+ },
1356
+ line: {
1357
+ visible: false
1358
+ },
1359
+ min: 0
1360
+ },
1361
+ categoryAxis: {
1362
+ majorGridLines: {
1363
+ visible: false
1364
+ },
1365
+ majorTicks: {
1366
+ visible: false
1367
+ },
1368
+ labels: {
1369
+ visible: false
1370
+ }
1371
+ },
1372
+ tooltip: {
1373
+ shared: true,
1374
+ visible: true,
1375
+ sharedTemplate: Object(_chart_utils__WEBPACK_IMPORTED_MODULE_1__["getBasicSharedTemplate"])(),
1376
+ background: '#e4e4e4'
1377
+ }
1378
+ }).data('kendoChart');
1379
+ }
1380
+
1381
+ _initGaugeWidget(gaugeHtml, height)
1382
+ {
1383
+ return gaugeHtml.kendoLinearGauge({
1384
+ pointer: {
1385
+ value: 0,
1386
+ shape: 'arrow',
1387
+ size: 10,
1388
+ color: '#212529'
1389
+ },
1390
+ gaugeArea: {
1391
+ height: height
1392
+ },
1393
+ scale: {
1394
+ majorUnit: 10,
1395
+ minorUnit: 1,
1396
+ min: 0,
1397
+ max: 100,
1398
+ ranges: [
1399
+ {
1400
+ from: 0,
1401
+ to: 50,
1402
+ color: '#00cc00',
1403
+ opacity: .5
1404
+ }, {
1405
+ from: 50,
1406
+ to: 75,
1407
+ color: '#ffe106',
1408
+ opacity: .5
1409
+ }, {
1410
+ from: 75,
1411
+ to: 100,
1412
+ color: '#ed1601',
1413
+ opacity: .5
1414
+ }
1415
+ ],
1416
+ majorTicks: {
1417
+ visible: true,
1418
+ size: 10
1419
+ },
1420
+ minorTicks: {
1421
+ visible: false
1422
+ },
1423
+ labels: {
1424
+ visible: false
1425
+ },
1426
+ line: {
1427
+ visible: false
1428
+ },
1429
+ rangeSize: 10
1430
+ }
1431
+ }).data('kendoLinearGauge');
1432
+ }
1433
+
1434
+ addEntry(load, queueMsgLimit)
1435
+ {
1436
+ // CHART
1437
+
1438
+ let now = new Date();
1439
+
1440
+ let newEntry = {
1441
+ time: Object(_chart_utils__WEBPACK_IMPORTED_MODULE_1__["getFormattedDateTime"])(now),
1442
+ timestamp: now.getTime(),
1443
+ load: load
1444
+ };
1445
+
1446
+ // Add entry to chart
1447
+ super._addEntry(newEntry);
1448
+
1449
+ // Update x axis
1450
+ if (!this.isPaused)
1451
+ this._updateElapsedText();
1452
+
1453
+ // GAUGE
1454
+
1455
+ // Evaluate average
1456
+ let numValues = this._dataSource.total();
1457
+
1458
+ if (numValues > 0)
1459
+ {
1460
+ let total = 0;
1461
+ for (let i = 0; i < numValues; i++)
1462
+ total += this._dataSource.at(i).load;
1463
+
1464
+ this._averageLoad = Math.round(total / numValues);
1465
+ }
1466
+ else
1467
+ this._averageLoad = 0;
1468
+
1469
+ const avgLoadPerc = Math.round(this._averageLoad / queueMsgLimit * 1000) / 10;
1470
+
1471
+ // Set gauge value
1472
+ this._gaugeWidget.value(avgLoadPerc);
1473
+
1474
+ // Set load text
1475
+ this._loadTxt.text(avgLoadPerc + '%')
1476
+ }
1477
+
1478
+ _updateElapsedText()
1479
+ {
1480
+ let ds = this._dataSource;
1481
+
1482
+ if (ds.total() > 1)
1483
+ {
1484
+ // Get axis limits
1485
+ const chartMinimum = ds.at(0).timestamp;
1486
+ const chartMaximum = ds.at(ds.total() - 1).timestamp;
1487
+
1488
+ // Set elapsed text
1489
+ let seconds = Math.round( (chartMaximum - chartMinimum) / 1000 );
1490
+ let title;
1491
+
1492
+ if (seconds < 60)
1493
+ title = 'Last ' + (seconds != 1 ? seconds + ' seconds' : 'second');
1494
+ else
1495
+ {
1496
+ const minutes = Math.floor(seconds / 60);
1497
+ title = 'Last ' + (minutes != 1 ? minutes + ' minutes' : 'minute');
1498
+ }
1499
+
1500
+ this._elapsedTxt.text(title);
1501
+ }
1502
+ }
1503
+
1504
+ get load()
1505
+ {
1506
+ return this._averageLoad;
1507
+ }
1508
+ }
1509
+
1510
+ // DEFINE COMPONENT
1511
+ if (!window.customElements.get('system-queue-chart'))
1512
+ window.customElements.define('system-queue-chart', SystemQueueChart);
1513
+
1514
+ /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "jquery")))
1515
+
1516
+ /***/ }),
1517
+
1518
+ /***/ "./src/components/charts/system-workload-chart.js":
1519
+ /*!********************************************************!*\
1520
+ !*** ./src/components/charts/system-workload-chart.js ***!
1521
+ \********************************************************/
1522
+ /*! exports provided: SystemWorkloadChart */
1523
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
1524
+
1525
+ "use strict";
1526
+ __webpack_require__.r(__webpack_exports__);
1527
+ /* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SystemWorkloadChart", function() { return SystemWorkloadChart; });
1528
+ /* harmony import */ var _base_chart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base-chart */ "./src/components/charts/base-chart.js");
1529
+ /* harmony import */ var _chart_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chart-utils */ "./src/components/charts/chart-utils.js");
1530
+
1531
+
1532
+
1533
+
1534
+ class SystemWorkloadChart extends _base_chart__WEBPACK_IMPORTED_MODULE_0__["BaseChart"]
1535
+ {
1536
+ constructor()
1537
+ {
1538
+ super(240);
1539
+ }
1540
+
1541
+ _initialize()
1542
+ {
1543
+ const chartHeight = 240;
1544
+
1545
+ // Append container for chart & gauge
1546
+ let container = $('<div>', {class: 'd-flex flex-row'});
1547
+ $(this).append(container);
1548
+
1549
+ // CHART
1550
+
1551
+ let chartContainer = $('<div>', {class: 'flex-grow-1'});
1552
+ container.append(chartContainer);
1553
+
1554
+ // Create chart html
1555
+ let chartHtml = $('<div>');
1556
+ chartContainer.append(chartHtml);
1557
+
1558
+ // Initialize chart
1559
+ this._chartWidget = this._initChartWidget(chartHtml, chartHeight);
1560
+
1561
+ // Append text to display elapsed time
1562
+ this._elapsedTxt = $('<div>', {class: 'text-center', text: '---'});
1563
+ chartContainer.append(this._elapsedTxt);
1564
+
1565
+ // GAUGE
1566
+
1567
+ let gaugeContainer = $('<div>');
1568
+ container.append(gaugeContainer);
1569
+
1570
+ // Create gauge html
1571
+ let gaugeHtml = $('<div>');
1572
+ gaugeContainer.append(gaugeHtml);
1573
+
1574
+ // Initialize gauge
1575
+ this._gaugeWidget = this._initGaugeWidget(gaugeHtml, chartHeight);
1576
+
1577
+ // Append text to display load
1578
+ this._loadTxt = $('<div>', {class: 'text-center font-weight-bold', text: '---'});
1579
+ gaugeContainer.append(this._loadTxt);
1580
+
1581
+ //------------------------------
1582
+
1583
+ // Reset data source
1584
+ this.reset();
1585
+ }
1586
+
1587
+ _initChartWidget(chartHtml, height)
1588
+ {
1589
+ return chartHtml.kendoChart({
1590
+ transitions: false,
1591
+ chartArea: {
1592
+ height: height,
1593
+ background: 'transparent'
1594
+ },
1595
+ legend: {
1596
+ visible: false
1597
+ },
1598
+ seriesDefaults: {
1599
+ type: 'area',
1600
+ labels: {
1601
+ visible: false,
1602
+ format: '{0}%',
1603
+ background: 'transparent'
1604
+ }
1605
+ },
1606
+ series: [
1607
+ {
1608
+ name: 'Workload',
1609
+ field: 'load',
1610
+ categoryField: 'time',
1611
+ color: '#3399ff',
1612
+ line: {
1613
+ width: 2
1614
+ }
1615
+ }
1616
+ ],
1617
+ valueAxis: {
1618
+ labels: {
1619
+ format: '{0}%'
1620
+ },
1621
+ line: {
1622
+ visible: false
1623
+ },
1624
+ min: 0,
1625
+ max: 100
1626
+ },
1627
+ categoryAxis: {
1628
+ majorGridLines: {
1629
+ visible: false
1630
+ },
1631
+ majorTicks: {
1632
+ visible: false
1633
+ },
1634
+ labels: {
1635
+ visible: false
1636
+ }
1637
+ },
1638
+ tooltip: {
1639
+ shared: true,
1640
+ visible: true,
1641
+ sharedTemplate: Object(_chart_utils__WEBPACK_IMPORTED_MODULE_1__["getBasicSharedTemplate"])('{0}%'),
1642
+ background: '#e4e4e4'
1643
+ }
1644
+ }).data('kendoChart');
1645
+ }
1646
+
1647
+ _initGaugeWidget(gaugeHtml, height)
1648
+ {
1649
+ return gaugeHtml.kendoLinearGauge({
1650
+ pointer: {
1651
+ value: 0,
1652
+ shape: 'arrow',
1653
+ size: 10,
1654
+ color: '#212529'
1655
+ },
1656
+ gaugeArea: {
1657
+ height: height
1658
+ },
1659
+ scale: {
1660
+ majorUnit: 10,
1661
+ minorUnit: 1,
1662
+ max: 100,
1663
+ min: 0,
1664
+ ranges: [
1665
+ {
1666
+ from: 0,
1667
+ to: 50,
1668
+ color: '#00cc00',
1669
+ opacity: .5
1670
+ }, {
1671
+ from: 50,
1672
+ to: 75,
1673
+ color: '#ffe106',
1674
+ opacity: .5
1675
+ }, {
1676
+ from: 75,
1677
+ to: 100,
1678
+ color: '#ed1601',
1679
+ opacity: .5
1680
+ }
1681
+ ],
1682
+ majorTicks: {
1683
+ visible: true,
1684
+ size: 10
1685
+ },
1686
+ minorTicks: {
1687
+ visible: false
1688
+ },
1689
+ labels: {
1690
+ visible: false
1691
+ },
1692
+ line: {
1693
+ visible: false
1694
+ },
1695
+ rangeSize: 10
1696
+ }
1697
+ }).data('kendoLinearGauge');
1698
+ }
1699
+
1700
+ addEntry(load)
1701
+ {
1702
+ // CHART
1703
+
1704
+ let now = new Date();
1705
+
1706
+ let newEntry = {
1707
+ time: Object(_chart_utils__WEBPACK_IMPORTED_MODULE_1__["getFormattedDateTime"])(now),
1708
+ timestamp: now.getTime(),
1709
+ load: load
1710
+ };
1711
+
1712
+ // Add entry to chart
1713
+ super._addEntry(newEntry);
1714
+
1715
+ // Update x axis
1716
+ if (!this.isPaused)
1717
+ this._updateElapsedText();
1718
+
1719
+ // GAUGE
1720
+
1721
+ // Evaluate average
1722
+ let numValues = this._dataSource.total();
1723
+ let averageLoad = 0;
1724
+
1725
+ if (numValues > 0)
1726
+ {
1727
+ let total = 0;
1728
+ for (let i = 0; i < numValues; i++)
1729
+ total += this._dataSource.at(i).load;
1730
+
1731
+ averageLoad = Math.round(total / numValues);
1732
+ }
1733
+
1734
+ // Set gauge value
1735
+ this._gaugeWidget.value(averageLoad);
1736
+
1737
+ // Set load text
1738
+ this._loadTxt.text(averageLoad + '%')
1739
+ }
1740
+
1741
+ _updateElapsedText()
1742
+ {
1743
+ let ds = this._dataSource;
1744
+
1745
+ if (ds.total() > 1)
1746
+ {
1747
+ // Get axis limits
1748
+ const chartMinimum = ds.at(0).timestamp;
1749
+ const chartMaximum = ds.at(ds.total() - 1).timestamp;
1750
+
1751
+ // Set elapsed text
1752
+ let seconds = Math.round( (chartMaximum - chartMinimum) / 1000 );
1753
+ let title;
1754
+
1755
+ if (seconds < 60)
1756
+ title = 'Last ' + (seconds != 1 ? seconds + ' seconds' : 'second');
1757
+ else
1758
+ {
1759
+ const minutes = Math.floor(seconds / 60);
1760
+ title = 'Last ' + (minutes != 1 ? minutes + ' minutes' : 'minute');
1761
+ }
1762
+
1763
+ this._elapsedTxt.text(title);
1764
+ }
1765
+ }
1766
+
1767
+ get load()
1768
+ {
1769
+ return this._averageLoad;
1770
+ }
1771
+ }
1772
+
1773
+ // DEFINE COMPONENT
1774
+ if (!window.customElements.get('system-workload-chart'))
1775
+ window.customElements.define('system-workload-chart', SystemWorkloadChart);
1776
+
1777
+ /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "jquery")))
1778
+
1779
+ /***/ }),
1780
+
1781
+ /***/ "./src/components/charts/thread-count-chart.js":
1782
+ /*!*****************************************************!*\
1783
+ !*** ./src/components/charts/thread-count-chart.js ***!
1784
+ \*****************************************************/
1785
+ /*! exports provided: ThreadCountChart */
1786
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
1787
+
1788
+ "use strict";
1789
+ __webpack_require__.r(__webpack_exports__);
1790
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ThreadCountChart", function() { return ThreadCountChart; });
1791
+ /* harmony import */ var _base_chart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base-chart */ "./src/components/charts/base-chart.js");
1792
+ /* harmony import */ var _chart_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chart-utils */ "./src/components/charts/chart-utils.js");
1793
+
1794
+
1795
+
1796
+
1797
+ class ThreadCountChart extends _base_chart__WEBPACK_IMPORTED_MODULE_0__["BaseChart"]
1798
+ {
1799
+ constructor()
1800
+ {
1801
+ super(120);
1802
+ }
1803
+
1804
+ _initChartWidget(chartHtml)
1805
+ {
1806
+ return chartHtml.kendoChart({
1807
+ transitions: false,
1808
+ chartArea: {
1809
+ height: 120,
1810
+ background: 'transparent'
1811
+ },
1812
+ legend: {
1813
+ visible: false
1814
+ },
1815
+ seriesDefaults: {
1816
+ type: 'area',
1817
+ labels: {
1818
+ visible: false,
1819
+ format: '{0}',
1820
+ background: 'transparent'
1821
+ },
1822
+ },
1823
+ series: [
1824
+ {
1825
+ name: 'Threads',
1826
+ field: 'threads',
1827
+ categoryField: 'time',
1828
+ color: this.threadsColor,
1829
+ line: {
1830
+ width: 2
1831
+ }
1832
+ }
1833
+ ],
1834
+ valueAxis: {
1835
+ min: 0,
1836
+ labels: {
1837
+ format: '{0}'
1838
+ },
1839
+ line: {
1840
+ visible: false
1841
+ },
1842
+ },
1843
+ categoryAxis: {
1844
+ majorGridLines: {
1845
+ visible: false
1846
+ },
1847
+ majorTicks: {
1848
+ visible: false
1849
+ },
1850
+ labels: {
1851
+ visible: false
1852
+ }
1853
+ },
1854
+ tooltip: {
1855
+ shared: true,
1856
+ visible: true,
1857
+ sharedTemplate: Object(_chart_utils__WEBPACK_IMPORTED_MODULE_1__["getBasicSharedTemplate"])(),
1858
+ background: '#e4e4e4'
1859
+ }
1860
+ }).data('kendoChart');
1861
+ }
1862
+
1863
+ get threadsColor()
1864
+ {
1865
+ return '#3399FF';
1866
+ }
1867
+
1868
+ addEntry(threads)
1869
+ {
1870
+ let newEntry = {
1871
+ time: Object(_chart_utils__WEBPACK_IMPORTED_MODULE_1__["getFormattedDateTime"])(new Date()),
1872
+ threads: threads
1873
+ };
1874
+
1875
+ // Add entry to chart
1876
+ super._addEntry(newEntry);
1877
+ }
1878
+ }
1879
+
1880
+ // DEFINE COMPONENT
1881
+ if (!window.customElements.get('thread-count-chart'))
1882
+ window.customElements.define('thread-count-chart', ThreadCountChart);
1883
+
1884
+
1885
+ /***/ }),
1886
+
1887
+ /***/ "./src/modules/dashboard.js":
1888
+ /*!**********************************!*\
1889
+ !*** ./src/modules/dashboard.js ***!
1890
+ \**********************************/
1891
+ /*! exports provided: default */
1892
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
1893
+
1894
+ "use strict";
1895
+ __webpack_require__.r(__webpack_exports__);
1896
+ /* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Dashboard; });
1897
+ /* harmony import */ var _base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base-module */ "./src/modules/base-module.js");
1898
+ /* harmony import */ var _utils_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/utilities */ "./src/utils/utilities.js");
1899
+ /* harmony import */ var _components_charts_chart_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/charts/chart-utils */ "./src/components/charts/chart-utils.js");
1900
+ /* harmony import */ var _components_charts_cpu_usage_chart__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/charts/cpu-usage-chart */ "./src/components/charts/cpu-usage-chart.js");
1901
+ /* harmony import */ var _components_charts_thread_count_chart__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/charts/thread-count-chart */ "./src/components/charts/thread-count-chart.js");
1902
+ /* harmony import */ var _components_charts_memory_chart__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/charts/memory-chart */ "./src/components/charts/memory-chart.js");
1903
+ /* harmony import */ var _components_charts_network_realtime_chart__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/charts/network-realtime-chart */ "./src/components/charts/network-realtime-chart.js");
1904
+ /* harmony import */ var _components_charts_network_24h_chart__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/charts/network-24h-chart */ "./src/components/charts/network-24h-chart.js");
1905
+ /* harmony import */ var _components_charts_system_workload_chart__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../components/charts/system-workload-chart */ "./src/components/charts/system-workload-chart.js");
1906
+ /* harmony import */ var _components_charts_system_queue_chart__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../components/charts/system-queue-chart */ "./src/components/charts/system-queue-chart.js");
1907
+
1908
+
1909
+
1910
+
1911
+
1912
+
1913
+
1914
+
1915
+
1916
+
1917
+
1918
+ class Dashboard extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
1919
+ {
1920
+ constructor()
1921
+ {
1922
+ super('dashboard');
1923
+
1924
+ // Outgoing requests
1925
+ this.REQ_INIT = 'init';
1926
+ this.REQ_GET_DATA = 'getData';
1927
+ this.REQ_DUMP_THREADS = 'getThDump';
1928
+
1929
+ // Incoming responses
1930
+ this.RESP_INIT = 'init';
1931
+ this.RESP_DATA = 'data';
1932
+ this.RESP_THREAD_DUMP = 'thDump';
1933
+
1934
+ this._tcpOutThreads = 0;
1935
+ this._tcpOutLoad = 0;
1936
+ this._udpOutThreads = 0;
1937
+ this._udpOutLoad = 0;
1938
+ }
1939
+
1940
+ //------------------------------------
1941
+ // COMMON MODULE INTERFACE METHODS
1942
+ // This members are used by the main controller
1943
+ // to communicate with the module's controller.
1944
+ //------------------------------------
1945
+
1946
+ initialize(idData, shellController)
1947
+ {
1948
+ // Call super method
1949
+ super.initialize(idData, shellController);
1950
+
1951
+ // Initialize scrolling tabs
1952
+ $('#dsh-tabNavigator > #tabs').scrollingTabs({
1953
+ bootstrapVersion: 4,
1954
+ scrollToTabEdge: true,
1955
+ enableSwiping: true,
1956
+ disableScrollArrowsOnFullyScrolled: true,
1957
+ cssClassLeftArrow: 'fa fa-chevron-left',
1958
+ cssClassRightArrow: 'fa fa-chevron-right'
1959
+ });
1960
+
1961
+ // Initialize interval dropdown
1962
+ this._intervalDropDown = $('#dsh-intervalDD').kendoDropDownList({
1963
+ valueTemplate: '<span class="text-muted pr-1">Interval:</span><span>#:data.text#</span>',
1964
+ change: $.proxy(this._onUpdateIntervalChange, this)
1965
+ }).data('kendoDropDownList');
1966
+
1967
+ // Initialize threads grid
1968
+ this._threadsGrid = $('#dsh-threadsGrid').kendoGrid({
1969
+ dataSource: this._getThreadsGridDataSource(),
1970
+ scrollable: true,
1971
+ sortable: true,
1972
+ filterable: false,
1973
+ resizable: true,
1974
+ selectable: false,
1975
+ columns: [
1976
+ {
1977
+ field: 'id',
1978
+ title: 'Id',
1979
+ width: 60
1980
+ },
1981
+ {
1982
+ field: 'name',
1983
+ title: 'Name',
1984
+ width: '65%'
1985
+ },
1986
+ {
1987
+ field: 'cpuTime',
1988
+ title: 'CPU Time',
1989
+ format: '{0}%',
1990
+ width: '35%'
1991
+ },
1992
+ ],
1993
+ noRecords: {
1994
+ template: 'No threads.'
1995
+ },
1996
+ height: 'calc(240px - .75rem + 1rem)'
1997
+ }).data('kendoGrid');
1998
+
1999
+ // Add click listener to threads dump button
2000
+ $('#dsh-dumpThreadsBt').on('click', $.proxy(this._onDumpThreadsClick, this));
2001
+
2002
+ // Configure thread dump panel
2003
+ $('#dsh-threadDumpModal').modal({
2004
+ backdrop: 'static',
2005
+ keyboard: false,
2006
+ show: false,
2007
+ });
2008
+
2009
+ // Add listener for threads dump panel hide
2010
+ $('#dsh-threadDumpModal').on('hidden.bs.modal', $.proxy(this._onThreadDumpModalHidden, this));
2011
+
2012
+ // Add click listener to threads dump copy button
2013
+ $('#dsh-copyThreadDumpBt').on('click', $.proxy(this._onCopyThreadDumpClick, this));
2014
+
2015
+ // Initialize time range slider
2016
+ this._timeSlider = $('#dsh-timeSlider').kendoRangeSlider({
2017
+ min: -24,
2018
+ max: 0,
2019
+ smallStep: 1,
2020
+ largeStep: 0,
2021
+ change: $.proxy(this._onTimeRangeChange, this),
2022
+ tooltip: {
2023
+ template: Object(_components_charts_chart_utils__WEBPACK_IMPORTED_MODULE_2__["getTimeRangeTooltipTemplate"])()
2024
+ },
2025
+ leftDragHandleTitle: 'Drag',
2026
+ rightDragHandleTitle: 'Drag',
2027
+ }).data('kendoRangeSlider');
2028
+
2029
+ // Add click listener to reset charts button
2030
+ $('#dsh-resetBt').on('click', $.proxy(this._onResetChartsClick, this));
2031
+
2032
+ // Add click listener to play & pause chart update buttons
2033
+ $('#dsh-pauseBt').on('click', $.proxy(this._onPauseUpdateClick, this));
2034
+ $('#dsh-playBt').on('click', $.proxy(this._onPlayUpdateClick, this));
2035
+
2036
+ // Set reference to charts
2037
+ this._cpuUsageChart = document.getElementById('dsh-cpuUsageChart');
2038
+ this._threadCountChart = document.getElementById('dsh-threadCountChart');
2039
+ this._memoryChart = document.getElementById('dsh-memoryChart');
2040
+ this._networkRTChart = document.getElementById('dsh-networkRTChart');
2041
+ this._network24hChart = document.getElementById('dsh-network24hChart');
2042
+ this._sysWorkloadChart = document.getElementById('dsh-systemWorkloadChart');
2043
+ this._outTcpMsgQueueChart = document.getElementById('dsh-outgoingTcpMessagesQueueChart');
2044
+ this._outUdpMsgQueueChart = document.getElementById('dsh-outgoingUdpMessagesQueueChart');
2045
+ this._sysQueueChart = document.getElementById('dsh-systemQueueChart');
2046
+ this._extQueueChart = document.getElementById('dsh-extensionQueueChart');
2047
+
2048
+ // Set colors in chart legends
2049
+ $('#dsh-systemLoadColor').css('color', this._cpuUsageChart.systemColor);
2050
+ $('#dsh-processLoadColor').css('color', this._cpuUsageChart.processColor);
2051
+ $('#dsh-allocMemColor').css('color', this._memoryChart.allocatedColor);
2052
+ $('#dsh-usedMemColor').css('color', this._memoryChart.usedColor);
2053
+ $('#dsh-incomingNetColor').css('color', this._networkRTChart.incomingColor);
2054
+ $('#dsh-outgoingNetColor').css('color', this._networkRTChart.outgoingColor);
2055
+
2056
+ // Reset time range on 24h network chart
2057
+ this._onTimeRangeChange();
2058
+
2059
+ // Add listener to redraw all charts on main tab change
2060
+ // (to work around an issue with the chart resizing to default width when pane is hidden)
2061
+ $('a[data-toggle="tab"]').on('shown.bs.tab', $.proxy(this._onWindowResize, this));
2062
+
2063
+ // Add listener to redraw network charts on network tab change
2064
+ // (to work around an issue with the chart resizing to default width when pane is hidden)
2065
+ $('#dsh-networkPills a[data-toggle="pill"]').on('shown.bs.tab', $.proxy(this._redrawNetworkCharts, this));
2066
+
2067
+ // Add listener to redraw outgoing messages queue charts on tab change
2068
+ // (to work around an issue with the chart resizing to default width when pane is hidden)
2069
+ $('#dsh-msgQueuePills a[data-toggle="pill"]').on('shown.bs.tab', $.proxy(this._redrawOutMsgCharts, this));
2070
+
2071
+ // Add listener to redraw all charts in case of window resize
2072
+ $(window).on('resize', $.proxy(this._onWindowResize, this));
2073
+ this._onWindowResize(); // Also do it immediately
2074
+
2075
+ // Add listener to show help tooltips in queues status tab
2076
+ $('#dsh-queues').kendoTooltip({
2077
+ filter: 'i[title].help',
2078
+ position: 'right',
2079
+ width: '250px',
2080
+ content: function(e) {
2081
+ return `<div class="help-tooltip">${e.target.data('title')}</div>`;
2082
+ }
2083
+ });
2084
+
2085
+ // Add listener to regenerate link to open web server external manager console
2086
+ $('#dsh-useHttpsCheck').on('change', $.proxy(this._onUseHttpsForWsManagerChange, this));
2087
+
2088
+ // Send initialization request
2089
+ this.sendExtensionRequest(this.REQ_INIT);
2090
+ }
2091
+
2092
+ destroy()
2093
+ {
2094
+ // Call super method
2095
+ super.destroy();
2096
+
2097
+ // Destroy scrolling tabs
2098
+ $('#dsh-tabNavigator #tabs').scrollingTabs('destroy');
2099
+
2100
+ // Remove other listeners
2101
+ $('#dsh-resetBt').off('click');
2102
+ $('#dsh-pauseBt').off('click');
2103
+ $('#dsh-playBt').off('click');
2104
+ $('#dsh-dumpThreadsBt').off('click');
2105
+ $('a[data-toggle="tab"]').off('shown.bs.tab');
2106
+ $('a[data-toggle="pill"]').off('shown.bs.tab');
2107
+ $(window).off('resize');
2108
+ $('#dsh-useHttpsCheck').off('change');
2109
+
2110
+ // Remove thread dump panel listener
2111
+ $('#dsh-threadDumpModal').off('hidden.bs.modal');
2112
+
2113
+ // Clear request scheduling
2114
+ clearTimeout(this._requestTimer);
2115
+ }
2116
+
2117
+ onExtensionCommand(command, data)
2118
+ {
2119
+ // Initialization data received
2120
+ if (command == this.RESP_INIT)
2121
+ {
2122
+ // Server sends flags indicating if web server's internal manager is accessible and how
2123
+ this._wsManagerConfig = {
2124
+ hasAccess: data.getBool('hasWsManager'),
2125
+ httpEnabled: data.getBool('httpEnabled'),
2126
+ httpsEnabled: data.getBool('httpsEnabled'),
2127
+ httpPort: data.getInt('httpPort'),
2128
+ httpsPort: data.getInt('httpsPort'),
2129
+ }
2130
+
2131
+ // Enable access to web server manager console
2132
+ this._enableWebServerManagerAccess();
2133
+
2134
+ // Request data to server
2135
+ this._requestData(true);
2136
+ }
2137
+
2138
+ // Data received
2139
+ else if (command == this.RESP_DATA)
2140
+ {
2141
+ // CPU LOAD CHART
2142
+
2143
+ this._cpuUsageChart.addEntry(data.getDouble('pCpu'), data.getDouble('sCpu'));
2144
+ $('#dsh-systemLoadLabel').text(data.getDouble('sCpu'));
2145
+ $('#dsh-processLoadLabel').text(data.getDouble('pCpu'));
2146
+
2147
+ // As system cpu load is not always available (for example on MacOS X), let's hide it in case it isn't
2148
+ if (data.getDouble('sCpu') < 0)
2149
+ $('#dsh-systemLoadLegend').hide();
2150
+
2151
+ // THREADS COUNT CHART
2152
+
2153
+ const threadCount = data.getSFSArray('thList').size();
2154
+ this._threadCountChart.addEntry(threadCount);
2155
+ $('#dsh-threadsCountLabel').text(threadCount);
2156
+
2157
+ // MEMORY USAGE CHART
2158
+ // NOTE: memory data is sent as Bytes by the server
2159
+
2160
+ const freeMem = data.getLong('freeMem');
2161
+ const maxMem = data.getLong('maxMem');
2162
+ const totalMem = data.getLong('totalMem');
2163
+ const usedMem = totalMem - freeMem;
2164
+
2165
+ this._memoryChart.addEntry(totalMem, usedMem);
2166
+ $('#dsh-maxMemoryLabel').text(this._getMemObject(maxMem).label);
2167
+ $('#dsh-freeMemoryLabel').text(this._getMemObject(freeMem).label);
2168
+
2169
+ // THREADS LIST
2170
+
2171
+ const totalThreadCpuTime = data.getLong('thCpu');
2172
+ let threads = [];
2173
+
2174
+ for (let i = 0; i < data.getSFSArray('thList').size(); i++)
2175
+ {
2176
+ let threadData = data.getSFSArray('thList').getSFSObject(i);
2177
+
2178
+ threads.push({
2179
+ id: threadData.getLong('id'),
2180
+ name: threadData.getUtfString('name'),
2181
+ cpuTime: Math.round(threadData.getLong('cpu') / totalThreadCpuTime * 1000) / 10
2182
+ });
2183
+ }
2184
+
2185
+ // Substitute grid's data source, retaining current sorting
2186
+ let currSort = this._threadsGrid.dataSource.sort();
2187
+ this._threadsGrid.setDataSource(this._getThreadsGridDataSource(threads, currSort));
2188
+
2189
+ // NETWORK TRAFFIC
2190
+ // NOTE: network traffic data is sent as KBytes by the server
2191
+
2192
+ if (data.containsKey('ntOutHistory'))
2193
+ {
2194
+ const outgoingData = data.getLongArray('ntOutHistory');
2195
+ const incomingData = data.getLongArray('ntInHistory');
2196
+ const samplingRateMins = data.getInt('ntRate');
2197
+ const shiftSeconds = data.getInt('ntShift');
2198
+
2199
+ this._network24hChart.addHistoryEntries(outgoingData, incomingData, samplingRateMins * 60, shiftSeconds);
2200
+ }
2201
+
2202
+ // Add current values
2203
+ this._network24hChart.addEntry(data.getLong('ntOut'), data.getLong('ntIn'));
2204
+ this._networkRTChart.addEntry(data.getLong('ntOut'), data.getLong('ntIn'));
2205
+
2206
+ // TRAFFIC DETAILS
2207
+
2208
+ // Sessions
2209
+ $('#dsh-detSessionsCurrent').text('Current: ' + (data.getInt('sSocket') + data.getInt('sHttp')));
2210
+ $('#dsh-detSessionsMax').text('Max: ' + data.getInt('ccsMax'));
2211
+ $('#dsh-detSessionsSocket').text('Socket: ' + data.getInt('sSocket'));
2212
+ $('#dsh-detSessionsHttp').text('Http: ' + data.getInt('sHttp'));
2213
+
2214
+ // Users
2215
+ $('#dsh-detUsersCurrent').text('Current: ' + (data.getInt('uSocket') + data.getInt('uHttp') + data.getInt('uNpc')));
2216
+ $('#dsh-detUsersMax').text('Max: ' + data.getInt('ccuMax'));
2217
+ $('#dsh-detUsersSocket').text('Socket: ' + data.getInt('uSocket'));
2218
+ $('#dsh-detUsersHttp').text('Http: ' + data.getInt('uHttp'));
2219
+ $('#dsh-detUsersNpc').text('Npc: ' + data.getInt('uNpc'));
2220
+
2221
+ // Rooms
2222
+ $('#dsh-detRooms').text(data.getInt('rTotal'));
2223
+ $('#dsh-detRoomsRegular').text('Regular: ' + (data.getInt('rTotal') - data.getInt('rGame')));
2224
+ $('#dsh-detRoomsGame').text('Game: ' + data.getInt('rGame'));
2225
+
2226
+ // Total data transfer
2227
+ $('#dsh-detDataTransferOut').text('Out: ' + Object(_utils_utilities__WEBPACK_IMPORTED_MODULE_1__["kBytesToSize"])(data.getLong('ntOut')));
2228
+ $('#dsh-detDataTransferIn').text('In: ' + Object(_utils_utilities__WEBPACK_IMPORTED_MODULE_1__["kBytesToSize"])(data.getLong('ntIn')));
2229
+
2230
+ // Current data transfer rate
2231
+ let obj = this._networkRTChart.getLastEntry();
2232
+
2233
+ if (obj == null)
2234
+ obj = {outgoing: 0, incoming: 0};
2235
+
2236
+ $('#dsh-detTransferRateOut').text('Out: ' + Object(_utils_utilities__WEBPACK_IMPORTED_MODULE_1__["kBytesToSize"])(obj.outgoing, 2, 'KB', '/s'));
2237
+ $('#dsh-detTransferRateIn').text('In: ' + Object(_utils_utilities__WEBPACK_IMPORTED_MODULE_1__["kBytesToSize"])(obj.incoming, 2, 'KB', '/s'));
2238
+
2239
+ // Average data transfer rate over whole uptime
2240
+ if (this._uptimeSecs > 0)
2241
+ {
2242
+ const avgOut = Math.round(data.getLong('ntOut') / this._uptimeSecs * 100) / 100;
2243
+ const avgIn = Math.round(data.getLong('ntIn') / this._uptimeSecs * 100) / 100;
2244
+
2245
+ $('#dsh-detAvgTransferRateOut').text('Out: ' + Object(_utils_utilities__WEBPACK_IMPORTED_MODULE_1__["kBytesToSize"])(avgOut, 2, 'KB', '/s'));
2246
+ $('#dsh-detAvgTransferRateIn').text('In: ' + Object(_utils_utilities__WEBPACK_IMPORTED_MODULE_1__["kBytesToSize"])(avgIn, 2, 'KB', '/s'));
2247
+ }
2248
+
2249
+ // Dropped packets
2250
+ const totalPacketsOut = data.getLong('pktOut');
2251
+
2252
+ const totalDroppedTcpPacketsOut = data.getLong('pktOutDrop');
2253
+ $('#dsh-detDroppedTcpPacketsOut').text(`Out TCP: ${totalDroppedTcpPacketsOut} (${Math.round(totalDroppedTcpPacketsOut / totalPacketsOut * 100)}%)`);
2254
+
2255
+ const totalDroppedUdpPacketsOut = data.getLong('pktOutUdpDrop');
2256
+ $('#dsh-detDroppedUdpPacketsOut').text(`Out UDP: ${totalDroppedUdpPacketsOut} (${Math.round(totalDroppedUdpPacketsOut / totalPacketsOut * 100)}%)`);
2257
+
2258
+ const totalPacketsIn = data.getLong('pktIn');
2259
+ const totalDroppedPacketsIn = data.getLong('pktInDrop');
2260
+ $('#dsh-detDroppedPacketsIn').text(`In: ${totalDroppedPacketsIn} (${Math.round(totalDroppedPacketsIn / totalPacketsIn * 100)}%)`);
2261
+
2262
+ // SYSTEM STATUS
2263
+
2264
+ // Outgoing TCP messages queue
2265
+ const outMsgQueue = data.getInt('outMsgQueue');
2266
+ const outMsgQueueMax = data.getInt('outMsgQueueMax');
2267
+ this._outTcpMsgQueueChart.addEntry(outMsgQueue, outMsgQueueMax);
2268
+ this._tcpOutThreads = data.getInt('outMsgTh');
2269
+ this._tcpOutLoad = this._outTcpMsgQueueChart.load;
2270
+
2271
+ // Outgoing UDP messages queue
2272
+ const outUdpMsgQueue = data.getInt('outUdpMsgQueue');
2273
+ const outUdpMsgQueueMax = data.getInt('outUdpMsgQueueMax');
2274
+ this._outUdpMsgQueueChart.addEntry(outUdpMsgQueue, outUdpMsgQueueMax);
2275
+ this._udpOutThreads = data.getInt('outUdpMsgTh');
2276
+ this._udpOutLoad = this._outUdpMsgQueueChart.load;
2277
+
2278
+ this._updateOutMessagesQueueStatus();
2279
+
2280
+ // System Controller requests queue
2281
+ const sysCtrlQueue = data.getInt('sysCtrlQueue');
2282
+ const sysCtrlQueueMax = data.getInt('sysCtrlQueueMax');
2283
+ this._sysQueueChart.addEntry(sysCtrlQueue, sysCtrlQueueMax);
2284
+ $('#dsh-systemQueueThreads').text(this._getQueueThreadsLabel(data.getInt('sysCtrlTh')));
2285
+ $('#dsh-systemQueueLoad').text(this._getQueueLoadLabel(this._sysQueueChart.load));
2286
+
2287
+ // Extension Controller requests queue
2288
+ const extCtrlQueue = data.getInt('extCtrlQueue');
2289
+ const extCtrlQueueMax = data.getInt('extCtrlQueueMax');
2290
+ this._extQueueChart.addEntry(extCtrlQueue, extCtrlQueueMax);
2291
+ $('#dsh-extensionQueueThreads').text(this._getQueueThreadsLabel(data.getInt('extCtrlTh')));
2292
+ $('#dsh-extensionQueueLoad').text(this._getQueueLoadLabel(this._sysQueueChart.load));
2293
+
2294
+ // Evaluate overall system workload
2295
+ let sysWorkload = Math.round((outMsgQueue / outMsgQueueMax +
2296
+ outUdpMsgQueue / outUdpMsgQueueMax +
2297
+ sysCtrlQueue / sysCtrlQueueMax +
2298
+ extCtrlQueue / extCtrlQueueMax) * 100 / 4);
2299
+ if (sysWorkload > 100)
2300
+ sysWorkload = 100;
2301
+
2302
+ this._sysWorkloadChart.addEntry(sysWorkload);
2303
+ }
2304
+
2305
+ // Thread dump received
2306
+ else if (command == this.RESP_THREAD_DUMP)
2307
+ {
2308
+ // Enable button
2309
+ $('#dsh-dumpThreadsBt').attr('disabled', false);
2310
+
2311
+ // Set result
2312
+ $('#dsh-threadDumpResult').text(data.getText('dump'));
2313
+
2314
+ // Display modal
2315
+ $('#dsh-threadDumpModal').modal('show');
2316
+ }
2317
+ }
2318
+
2319
+ onUptimeUpdated(values)
2320
+ {
2321
+ this._uptimeSecs = values[3];
2322
+ this._uptimeSecs += (values[2] * 60);
2323
+ this._uptimeSecs += (values[1] * 60 * 60);
2324
+ this._uptimeSecs += (values[0] * 24 * 60 * 60);
2325
+
2326
+ $('#dsh-uptimeDays').text( (values[0] <= 9 ? '00' : (values[0] <= 99 ? '0' : '')) + values[0] );
2327
+ $('#dsh-uptimeHours').text( (values[1] <= 9 ? '0' : '') + values[1] );
2328
+ $('#dsh-uptimeMinutes').text( (values[2] <= 9 ? '0' : '') + values[2] );
2329
+ $('#dsh-uptimeSeconds').text( (values[3] <= 9 ? '0' : '') + values[3] );
2330
+ }
2331
+
2332
+ //---------------------------------
2333
+ // UI EVENT LISTENERS
2334
+ //---------------------------------
2335
+
2336
+ _onUpdateIntervalChange()
2337
+ {
2338
+ // Request data to server
2339
+ this._requestData();
2340
+ }
2341
+
2342
+ _onPauseUpdateClick()
2343
+ {
2344
+ this._setChartUpdatePaused(true);
2345
+
2346
+ // Hide pause button and show play button
2347
+ $('#dsh-pauseBt').addClass('hidden');
2348
+ $('#dsh-playBt').removeClass('hidden');
2349
+ }
2350
+
2351
+ _onPlayUpdateClick()
2352
+ {
2353
+ this._setChartUpdatePaused(false);
2354
+
2355
+ // Hide play button and show pause button
2356
+ $('#dsh-pauseBt').removeClass('hidden');
2357
+ $('#dsh-playBt').addClass('hidden');
2358
+ }
2359
+
2360
+ _onResetChartsClick()
2361
+ {
2362
+ // Reactivate realtime charts update
2363
+ this._onPlayUpdateClick();
2364
+
2365
+ // Reset realtime charts
2366
+ this._cpuUsageChart.reset();
2367
+ this._threadCountChart.reset();
2368
+ this._memoryChart.reset();
2369
+ this._networkRTChart.reset();
2370
+ this._sysWorkloadChart.reset();
2371
+ this._outTcpMsgQueueChart.reset();
2372
+ this._outUdpMsgQueueChart.reset();
2373
+ this._sysQueueChart.reset();
2374
+ this._extQueueChart.reset();
2375
+ }
2376
+
2377
+ _redrawNetworkCharts()
2378
+ {
2379
+ // Redraw charts
2380
+ this._networkRTChart.redraw();
2381
+ this._network24hChart.redraw();
2382
+
2383
+ // Redraw time range slider
2384
+ this._timeSlider.resize();
2385
+ }
2386
+
2387
+ _redrawOutMsgCharts()
2388
+ {
2389
+ // Redraw charts
2390
+ this._outTcpMsgQueueChart.redraw();
2391
+ this._outUdpMsgQueueChart.redraw();
2392
+
2393
+ this._updateOutMessagesQueueStatus();
2394
+ }
2395
+
2396
+ _onWindowResize()
2397
+ {
2398
+ // Redraw all global charts
2399
+ this._cpuUsageChart.redraw();
2400
+ this._threadCountChart.redraw();
2401
+ this._memoryChart.redraw();
2402
+ this._redrawNetworkCharts();
2403
+
2404
+ // Redraw all queue charts
2405
+ this._sysWorkloadChart.redraw();
2406
+ this._sysQueueChart.redraw();
2407
+ this._extQueueChart.redraw();
2408
+ this._redrawOutMsgCharts();
2409
+ }
2410
+
2411
+ _onTimeRangeChange()
2412
+ {
2413
+ let values = this._timeSlider.value();
2414
+
2415
+ if (values[0] == values[1])
2416
+ {
2417
+ if (values[1] == -24)
2418
+ values[1] = -23;
2419
+
2420
+ values[0] = values[1] - 1;
2421
+
2422
+ // Reset the time range slider value (we need to use setTimeout
2423
+ // bacause doing it in the change event listener doesn't redraw the slider)
2424
+ setTimeout($.proxy( function(values) { this._timeSlider.value(values); }, this), 10, values);
2425
+ }
2426
+
2427
+ this._network24hChart.range = values;
2428
+ }
2429
+
2430
+ _onUseHttpsForWsManagerChange()
2431
+ {
2432
+ const wsMan = this._wsManagerConfig;
2433
+
2434
+ let url = ($('#dsh-useHttpsCheck').prop('checked') ? 'https' : 'http') + '://';
2435
+ url += this.smartFox.config.host;
2436
+ url += ':' + ($('#dsh-useHttpsCheck').prop('checked') ? wsMan.httpsPort : wsMan.httpPort);
2437
+ url += '/manager/status';
2438
+
2439
+ $('#dsh-toWsManagerBt').attr('href', url);
2440
+ }
2441
+
2442
+ _onDumpThreadsClick()
2443
+ {
2444
+ // Disable button
2445
+ $('#dsh-dumpThreadsBt').attr('disabled', true);
2446
+
2447
+ // Send request to extension
2448
+ this.sendExtensionRequest(this.REQ_DUMP_THREADS);
2449
+ }
2450
+
2451
+ _onCopyThreadDumpClick()
2452
+ {
2453
+ $('#dsh-threadDumpResult').attr('contenteditable', true);
2454
+ $('#dsh-threadDumpResult').attr('spellcheck', false);
2455
+ $('#dsh-threadDumpResult').focus();
2456
+ document.execCommand('selectAll');
2457
+ document.execCommand('copy');
2458
+ window.getSelection().removeAllRanges();
2459
+ $('#dsh-threadDumpResult').blur();
2460
+ $('#dsh-threadDumpResult').attr('contenteditable', false);
2461
+ }
2462
+
2463
+ _onThreadDumpModalHidden()
2464
+ {
2465
+ // Clear modal content
2466
+ $('#dsh-threadDumpResult').text('');
2467
+ }
2468
+
2469
+ //------------------------------------
2470
+ // PRIVATE METHODS
2471
+ //------------------------------------
2472
+
2473
+ _enableWebServerManagerAccess()
2474
+ {
2475
+ const wsMan = this._wsManagerConfig;
2476
+
2477
+ if (wsMan.hasAccess && (wsMan.httpEnabled || wsMan.httpsEnabled))
2478
+ {
2479
+ // Hide alert
2480
+ $('#dsh-wsManagerAlert').hide();
2481
+
2482
+ // Enable button
2483
+ $('#dsh-toWsManagerBt').attr('disabled', false);
2484
+
2485
+ // Set checkbox
2486
+ $('#dsh-useHttpsCheck').prop('checked', wsMan.httpsEnabled);
2487
+ $('#dsh-useHttpsCheck').attr('disabled', !wsMan.httpEnabled || !wsMan.httpsEnabled);
2488
+
2489
+ // Generate link
2490
+ this._onUseHttpsForWsManagerChange();
2491
+ }
2492
+ else
2493
+ {
2494
+ // Show alert
2495
+ $('#dsh-wsManagerAlert').show();
2496
+
2497
+ if (!wsMan.hasAccess)
2498
+ $('#dsh-wsManagerAlert').html('Access to Tomcat Manager console requires at least one user to be defined in <em>Web Server</em> tab of <strong>Server Configurator</strong> module.');
2499
+ else
2500
+ $('#dsh-wsManagerAlert').html('Access to Tomcat Manager console requires either HTTP or HTTPS to be enabled in <em>Web Server</em> tab of <strong>Server Configurator</strong> module.');
2501
+
2502
+ // Disable button
2503
+ $('#dsh-toWsManagerBt').attr('disabled', true);
2504
+
2505
+ // Disable checkbox
2506
+ $('#dsh-useHttpsCheck').attr('checked', wsMan.httpsEnabled);
2507
+ $('#dsh-useHttpsCheck').attr('disabled', true);
2508
+ }
2509
+ }
2510
+
2511
+ /**
2512
+ * Build the polling request to be sent to the server.
2513
+ */
2514
+ _requestData(getHistory = false)
2515
+ {
2516
+ // Clear previous request scheduling
2517
+ clearTimeout(this._requestTimer);
2518
+
2519
+ // Check if connection is still available
2520
+ if (this.smartFox.isConnected)
2521
+ {
2522
+ // Build request parameters
2523
+ let params = new SFS2X.SFSObject();
2524
+
2525
+ if (getHistory)
2526
+ params.putBool('history', true);
2527
+
2528
+ // Send request to extension
2529
+ this.sendExtensionRequest(this.REQ_GET_DATA, params);
2530
+
2531
+ // Schedule next request
2532
+ this._requestTimer = setTimeout($.proxy(this._requestData, this), Number(this._intervalDropDown.value()) * 1000);
2533
+ }
2534
+ }
2535
+
2536
+ _getMemObject(bytes)
2537
+ {
2538
+ return {
2539
+ data: bytes,
2540
+ label: Object(_utils_utilities__WEBPACK_IMPORTED_MODULE_1__["bytesToSize"])(bytes)
2541
+ };
2542
+ }
2543
+
2544
+ _setChartUpdatePaused(paused)
2545
+ {
2546
+ // Pause/reactivate realtime charts
2547
+ this._cpuUsageChart.paused = paused;
2548
+ this._threadCountChart.paused = paused;
2549
+ this._memoryChart.paused = paused;
2550
+ this._networkRTChart.paused = paused;
2551
+ this._sysWorkloadChart.paused = paused;
2552
+ this._outTcpMsgQueueChart.paused = paused;
2553
+ this._sysQueueChart.paused = paused;
2554
+ this._extQueueChart.paused = paused;
2555
+ }
2556
+
2557
+ _getThreadsGridDataSource(items, sort)
2558
+ {
2559
+ if (!items)
2560
+ items = '';
2561
+
2562
+ if (!sort)
2563
+ {
2564
+ sort = {
2565
+ field: 'cpuTime',
2566
+ dir: 'desc'
2567
+ };
2568
+ }
2569
+
2570
+ return new kendo.data.DataSource({
2571
+ schema: {
2572
+ model: {
2573
+ id: 'id'
2574
+ }
2575
+ },
2576
+ sort: sort,
2577
+ data: items
2578
+ });
2579
+ }
2580
+
2581
+ _getQueueThreadsLabel(threadsNum)
2582
+ {
2583
+ return `Threads: ${threadsNum}`;
2584
+ }
2585
+
2586
+ _getQueueLoadLabel(load)
2587
+ {
2588
+ return `Avg. messages: ${load}`;
2589
+ }
2590
+
2591
+ _updateOutMessagesQueueStatus()
2592
+ {
2593
+ let threadsStr = this._getQueueThreadsLabel('--');
2594
+ let loadStr = this._getQueueLoadLabel('--');
2595
+
2596
+ if ($('#dsh-tcpPill').hasClass('active'))
2597
+ {
2598
+ threadsStr = this._getQueueThreadsLabel(this._tcpOutThreads);
2599
+ loadStr = this._getQueueLoadLabel(this._tcpOutLoad);
2600
+ }
2601
+
2602
+ if ($('#dsh-udpPill').hasClass('active'))
2603
+ {
2604
+ threadsStr = this._getQueueThreadsLabel(this._udpOutThreads);
2605
+ loadStr = this._getQueueLoadLabel(this._udpOutLoad);
2606
+ }
2607
+
2608
+ $('#dsh-outgoingMessagesQueueThreads').text(threadsStr);
2609
+ $('#dsh-outgoingMessagesQueueLoad').text(loadStr);
2610
+ }
2611
+
2612
+ //---------------------------------
2613
+ // PRIVATE GETTERS
2614
+ //---------------------------------
2615
+
2616
+
2617
+ }
2618
+
2619
+ /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "jquery")))
2620
+
2621
+ /***/ })
2622
+
2623
+ }]);
2624
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtNS5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL2NoYXJ0cy9iYXNlLWNoYXJ0LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvY2hhcnRzL2NoYXJ0LXV0aWxzLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvY2hhcnRzL2NwdS11c2FnZS1jaGFydC5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL2NoYXJ0cy9tZW1vcnktY2hhcnQuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9jaGFydHMvbmV0d29yay0yNGgtY2hhcnQuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9jaGFydHMvbmV0d29yay1yZWFsdGltZS1jaGFydC5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL2NoYXJ0cy9zeXN0ZW0tcXVldWUtY2hhcnQuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9jaGFydHMvc3lzdGVtLXdvcmtsb2FkLWNoYXJ0LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvY2hhcnRzL3RocmVhZC1jb3VudC1jaGFydC5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9tb2R1bGVzL2Rhc2hib2FyZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgQmFzZUNoYXJ0IGV4dGVuZHMgSFRNTEVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IobWF4VmFsdWVzKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0dGhpcy5fbWF4VmFsdWVzID0gbWF4VmFsdWVzO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZVxuXHRcdHRoaXMuX2luaXRpYWxpemUoKTtcblx0fVxuXG5cdC8vIENhbiBiZSBvdmVycmlkZGVuXG5cdF9pbml0aWFsaXplKClcblx0e1xuXHRcdC8vIENyZWF0ZSBjaGFydCBodG1sXG5cdFx0bGV0IGNoYXJ0SHRtbCA9ICQoJzxkaXY+Jyk7XG5cdFx0JCh0aGlzKS5hcHBlbmQoY2hhcnRIdG1sKTtcblxuXHRcdHRoaXMuX2NoYXJ0V2lkZ2V0ID0gdGhpcy5faW5pdENoYXJ0V2lkZ2V0KGNoYXJ0SHRtbCk7XG5cblx0XHQvLyBSZXNldCBkYXRhIHNvdXJjZVxuXHRcdHRoaXMucmVzZXQoKTtcblx0fVxuXG5cdC8vIE1VU1QgQkUgT1ZFUlJJRERFTlxuXHRfaW5pdENoYXJ0V2lkZ2V0KClcblx0e1xuXHRcdHRocm93IG5ldyBFcnJvcignQ2hhcnQgd2lkZ2V0IG11c3QgYmUgaW5pdGlhbGl6ZWQhJylcblx0fVxuXG5cdHNldCBwYXVzZWQodmFsdWUpXG5cdHtcblx0XHR0aGlzLmlzUGF1c2VkID0gdmFsdWU7XG5cdFx0dGhpcy5fb25QYXVzZUNoYW5nZSgpO1xuXHR9XG5cblx0Z2V0IHBhdXNlZCgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5pc1BhdXNlZDtcblx0fVxuXG5cdHJlc2V0KClcblx0e1xuXHRcdHRoaXMuX2NoYXJ0V2lkZ2V0LnNldERhdGFTb3VyY2UoW10pO1xuXHR9XG5cblx0cmVkcmF3KClcblx0e1xuXHRcdHRoaXMuX2NoYXJ0V2lkZ2V0LnJlZHJhdygpO1xuXHR9XG5cblx0Z2V0TGFzdEVudHJ5KClcblx0e1xuXHRcdGxldCBkcztcblxuXHRcdGlmICh0aGlzLmlzUGF1c2VkKVxuXHRcdFx0ZHMgPSB0aGlzLl90ZW1wRFM7XG5cdFx0ZWxzZVxuXHRcdFx0ZHMgPSB0aGlzLl9kYXRhU291cmNlO1xuXG5cdFx0aWYgKGRzICE9IG51bGwgJiYgZHMudG90YWwoKSA+IDApXG5cdFx0XHRyZXR1cm4gZHMuYXQoZHMudG90YWwoKSAtIDEpO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0X2FkZEVudHJ5KG5ld0VudHJ5KVxuXHR7XG5cdFx0aWYgKHRoaXMuaXNQYXVzZWQpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuX3RlbXBEUyA9PSBudWxsKVxuXHRcdFx0XHR0aGlzLl90ZW1wRFMgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKCk7XG5cblx0XHRcdC8vIFN0b3JlIG5ldyB2YWx1ZSBpbiBhIHRlbXBvcmFyeSBhcnJheVxuXHRcdFx0dGhpcy5fdGVtcERTLmFkZChuZXdFbnRyeSk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRsZXQgZHMgPSB0aGlzLl9kYXRhU291cmNlO1xuXG5cdFx0XHRpZiAodGhpcy5fdGVtcERTICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIENvbmNhdGVuYXRlIHRlbXBvcmFyeSBlbnRyaWVzIHRvIGFjdHVhbCBkYXRhIHNvdXJjZVxuXHRcdFx0XHRsZXQgbmV3QXJyID0gJC5tZXJnZShkcy5kYXRhKCksIHRoaXMuX3RlbXBEUy5kYXRhKCkpO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSB2YWx1ZXMgZXhjZWVkaW5nIE1BWF9WQUxVRVNcblx0XHRcdFx0aWYgKG5ld0Fyci5sZW5ndGggPiB0aGlzLl9tYXhWYWx1ZXMpXG5cdFx0XHRcdFx0bmV3QXJyLnNwbGljZSgwLCBuZXdBcnIubGVuZ3RoIC0gdGhpcy5fbWF4VmFsdWVzKVxuXG5cdFx0XHRcdC8vIENyZWF0ZSBuZXcgZGF0YXNvdXJjZVxuXHRcdFx0XHRsZXQgbmV3RFMgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtkYXRhOiBuZXdBcnJ9KVxuXG5cdFx0XHRcdC8vIEFzc2lnbiBuZXcgZGF0YSBzb3VyY2UgdG8gY2hhcnRcblx0XHRcdFx0dGhpcy5fY2hhcnRXaWRnZXQuc2V0RGF0YVNvdXJjZShuZXdEUyk7XG5cblx0XHRcdFx0Ly8gUmVtb3ZlIHRlbXBvcmFyeSBhcnJheVxuXHRcdFx0XHR0aGlzLl90ZW1wRFMgPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgbmV3IGVudHJ5XG5cdFx0XHRkcy5hZGQobmV3RW50cnkpO1xuXG5cdFx0XHQvLyBSZW1vdmUgZmlyc3QgaXRlbSBpZiBuZWVkZWRcblx0XHRcdGlmIChkcy50b3RhbCgpID4gdGhpcy5fbWF4VmFsdWVzKVxuXHRcdFx0XHRkcy5yZW1vdmUoZHMuYXQoMCkpO1xuXHRcdH1cblx0fVxuXG5cdGdldCBfZGF0YVNvdXJjZSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fY2hhcnRXaWRnZXQuZGF0YVNvdXJjZTtcblx0fVxuXG5cdF9vblBhdXNlQ2hhbmdlKClcblx0e1xuXHRcdC8vIE5vdGhpbmcgdG8gZG8sIHNob3VsZCBiZSBvdmVycmlkZGVuXG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdiYXNlLWNoYXJ0JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2Jhc2UtY2hhcnQnLCBCYXNlQ2hhcnQpO1xuIiwiaW1wb3J0IHtieXRlc1RvU2l6ZSwga0J5dGVzVG9TaXplfSBmcm9tICcuLi8uLi91dGlscy91dGlsaXRpZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkRGF0ZVRpbWUoZGF0ZSwgZm9ybWF0ID0gJ2RkIE1NTSBISDptbTpzcycpXG57XG5cdHJldHVybiBrZW5kby50b1N0cmluZyhkYXRlLCBmb3JtYXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFzaWNTaGFyZWRUZW1wbGF0ZSh2YWx1ZUZvcm1hdCA9ICd7MH0nKSB7XG5cdHJldHVybiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0PGRpdiBjbGFzcz1cImNoYXJ0LXRvb2x0aXAtY2F0ZWdvcnlcIj48c3Ryb25nPiM6IGNhdGVnb3J5ICM8L3N0cm9uZz48L2Rpdj5cblx0XHQjIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7ICNcblx0XHQ8ZGl2PlxuXHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtc3F1YXJlXCIgc3R5bGU9XCJjb2xvcjogIzogcG9pbnRzW2ldLmNvbG9yICMgXCI+PC9pPlxuXHRcdFx0IzogcG9pbnRzW2ldLnNlcmllcy5uYW1lIyA6ICM6IGtlbmRvLmZvcm1hdCgnJHt2YWx1ZUZvcm1hdH0nLCBwb2ludHNbaV0udmFsdWUpICNcblx0XHQ8L2Rpdj5cblx0XHQjIH0gI1xuXHRgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1lbW9yeVNoYXJlZFRlbXBsYXRlKCkge1xuXHRyZXR1cm4gZnVuY3Rpb24oZGF0YUl0ZW0pIHtcblx0XHRkYXRhSXRlbS5ieXRlc1RvU2l6ZSA9IGJ5dGVzVG9TaXplOyAvLyBQYXNzIGJ5dGVzVG9TaXplIHV0aWxpdHkgZnVuY3Rpb24gdG8gdGVtcGxhdGVcblx0XHRyZXR1cm4ga2VuZG8udGVtcGxhdGUoYFxuXHRcdFx0PGRpdiBjbGFzcz1cImNoYXJ0LXRvb2x0aXAtY2F0ZWdvcnlcIj48c3Ryb25nPiM6IGNhdGVnb3J5ICM8L3N0cm9uZz48L2Rpdj5cblx0XHRcdCMgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHsgI1xuXHRcdFx0PGRpdj5cblx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtc3F1YXJlXCIgc3R5bGU9XCJjb2xvcjogIzogcG9pbnRzW2ldLmNvbG9yICMgXCI+PC9pPlxuXHRcdFx0XHQjOiBwb2ludHNbaV0uc2VyaWVzLm5hbWUjIDogIzogYnl0ZXNUb1NpemUocG9pbnRzW2ldLnZhbHVlKSAjXG5cdFx0XHQ8L2Rpdj5cblx0XHRcdCMgfSAjXG5cdFx0YCkoZGF0YUl0ZW0pO1xuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVtb3J5VmFsdWVBeGlzTGFiZWxUZW1wbGF0ZSgpIHtcblx0cmV0dXJuIGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0ZGF0YUl0ZW0uYnl0ZXNUb1NpemUgPSBieXRlc1RvU2l6ZTsgLy8gUGFzcyBieXRlc1RvU2l6ZSB1dGlsaXR5IGZ1bmN0aW9uIHRvIHRlbXBsYXRlXG5cdFx0cmV0dXJuIGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdCM6IGJ5dGVzVG9TaXplKHZhbHVlKSAjXG5cdFx0YCkoZGF0YUl0ZW0pO1xuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV0d29ya1NoYXJlZFRlbXBsYXRlKGNhdGVnb3J5Rm9ybWF0ID0gJ2RkIE1NTSBISDptbTpzcycpIHtcblx0cmV0dXJuIGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0ZGF0YUl0ZW0ua0J5dGVzVG9TaXplID0ga0J5dGVzVG9TaXplOyAvLyBQYXNzIGtCeXRlc1RvU2l6ZSB1dGlsaXR5IGZ1bmN0aW9uIHRvIHRlbXBsYXRlXG5cdFx0cmV0dXJuIGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLWNhdGVnb3J5XCI+PHN0cm9uZz4jOiBrZW5kby50b1N0cmluZyhjYXRlZ29yeSwgJyR7Y2F0ZWdvcnlGb3JtYXR9JykgIzwvc3Ryb25nPjwvZGl2PlxuXHRcdFx0IyBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykgeyAjXG5cdFx0XHQ8ZGl2PlxuXHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1zcXVhcmVcIiBzdHlsZT1cImNvbG9yOiAjOiBwb2ludHNbaV0uY29sb3IgIyBcIj48L2k+XG5cdFx0XHRcdCM6IHBvaW50c1tpXS5zZXJpZXMubmFtZSMgOiAjOiBrQnl0ZXNUb1NpemUocG9pbnRzW2ldLnZhbHVlLCAxLCAnJywgJy9zJykgI1xuXHRcdFx0PC9kaXY+XG5cdFx0XHQjIH0gI1xuXHRcdGApKGRhdGFJdGVtKTtcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5ldHdvcmtWYWx1ZUF4aXNMYWJlbFRlbXBsYXRlKCkge1xuXHRyZXR1cm4gZnVuY3Rpb24oZGF0YUl0ZW0pIHtcblx0XHRkYXRhSXRlbS5rQnl0ZXNUb1NpemUgPSBrQnl0ZXNUb1NpemU7IC8vIFBhc3Mga0J5dGVzVG9TaXplIHV0aWxpdHkgZnVuY3Rpb24gdG8gdGVtcGxhdGVcblx0XHRyZXR1cm4ga2VuZG8udGVtcGxhdGUoYFxuXHRcdFx0Izoga0J5dGVzVG9TaXplKHZhbHVlLCAxLCAnJywgJy9zJykgI1xuXHRcdGApKGRhdGFJdGVtKTtcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJDb3VudFNoYXJlZFRlbXBsYXRlKGNhdGVnb3J5Rm9ybWF0ID0gJ2RkIE1NTSBISDptbTpzcycpIHtcblx0cmV0dXJuIGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0cmV0dXJuIGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLWNhdGVnb3J5XCI+PHN0cm9uZz4jOiBrZW5kby50b1N0cmluZyhjYXRlZ29yeSwgJyR7Y2F0ZWdvcnlGb3JtYXR9JykgIzwvc3Ryb25nPjwvZGl2PlxuXHRcdFx0IyBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykgeyAjXG5cdFx0XHQ8ZGl2PlxuXHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1zcXVhcmVcIiBzdHlsZT1cImNvbG9yOiAjOiBwb2ludHNbaV0uY29sb3IgIyBcIj48L2k+XG5cdFx0XHRcdCM6IHBvaW50c1tpXS5zZXJpZXMubmFtZSMgOiAjOiBwb2ludHNbaV0udmFsdWUgI1xuXHRcdFx0PC9kaXY+XG5cdFx0XHQjIH0gI1xuXHRcdGApKGRhdGFJdGVtKTtcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVSYW5nZVRvb2x0aXBUZW1wbGF0ZSgpIHtcblx0cmV0dXJuIGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0ZGF0YUl0ZW0uZ2V0VG9vbHRpcFN0cmluZyA9IGZ1bmN0aW9uKHYxLCB2Mikge1xuXHRcdFx0aWYgKHYxID09IHYyKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodjIgPT0gLTI0KVxuXHRcdFx0XHRcdHYyID0gLTIzO1xuXG5cdFx0XHRcdHYxID0gdjIgLSAxO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgc3RhcnQgPSBNYXRoLmFicyh2MSk7XG5cdFx0XHRsZXQgZW5kID0gTWF0aC5hYnModjIpO1xuXG5cdFx0XHRyZXR1cm4gYEZyb20gJHtzdGFydH0gaG91ciR7c3RhcnQgIT0gMSA/ICdzJyA6ICcnfSBhZ28gdG8gJHtlbmQgPiAwID8gKCd0byAnICsgZW5kICsgJyBob3VyJyArIChlbmQgIT0gMSA/ICdzJyA6ICcnKSArICcgYWdvJykgOiAnbm93J31gO1xuXHRcdH07IC8vIFBhc3MgdXRpbGl0eSBmdW5jdGlvbiB0byB0ZW1wbGF0ZVxuXHRcdHJldHVybiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHQjOiBnZXRUb29sdGlwU3RyaW5nKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpICNcblx0XHRgKShkYXRhSXRlbSk7XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXUkJ5dGVzTGFiZWxUZW1wbGF0ZSgpIHtcblx0cmV0dXJuIGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0cmV0dXJuIGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdCM6IHZhbHVlICMgIzogZGF0YUl0ZW0udW5pdCAjXG5cdFx0YCkoZGF0YUl0ZW0pO1xuXHR9O1xufVxuIiwiaW1wb3J0IHtCYXNlQ2hhcnR9IGZyb20gJy4vYmFzZS1jaGFydCc7XG5cbmltcG9ydCB7Z2V0QmFzaWNTaGFyZWRUZW1wbGF0ZSwgZ2V0Rm9ybWF0dGVkRGF0ZVRpbWV9IGZyb20gJy4vY2hhcnQtdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQ3B1VXNhZ2VDaGFydCBleHRlbmRzIEJhc2VDaGFydFxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKDEyMCk7XG5cdH1cblxuXHRfaW5pdENoYXJ0V2lkZ2V0KGNoYXJ0SHRtbClcblx0e1xuXHRcdHJldHVybiBjaGFydEh0bWwua2VuZG9DaGFydCh7XG5cdFx0XHR0cmFuc2l0aW9uczogZmFsc2UsXG5cdFx0XHRjaGFydEFyZWE6IHtcblx0XHRcdFx0aGVpZ2h0OiAxMjBcblx0XHRcdH0sXG5cdCAgICAgICAgbGVnZW5kOiB7XG5cdCAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXJpZXNEZWZhdWx0czoge1xuXHQgICAgICAgICAgICB0eXBlOiAnYXJlYScsXG5cdCAgICAgICAgICAgIGxhYmVsczoge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG5cdCAgICAgICAgICAgICAgICBmb3JtYXQ6ICd7MH0lJyxcblx0ICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCdcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2VyaWVzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnU3lzdGVtJyxcblx0XHQgICAgICAgICAgICBmaWVsZDogJ3N5c3RlbUxvYWQnLFxuXHRcdCAgICAgICAgICAgIGNhdGVnb3J5RmllbGQ6ICd0aW1lJyxcblx0XHRcdFx0XHRjb2xvcjogdGhpcy5zeXN0ZW1Db2xvcixcblx0XHRcdFx0XHRsaW5lOiB7XG5cdFx0XHRcdFx0XHR3aWR0aDogMlxuXHRcdFx0XHRcdH1cblx0XHQgICAgICAgIH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnUHJvY2VzcycsXG5cdFx0XHRcdFx0ZmllbGQ6ICdwcm9jZXNzTG9hZCcsXG5cdFx0XHRcdFx0Y2F0ZWdvcnlGaWVsZDogJ3RpbWUnLFxuXHRcdFx0XHRcdGNvbG9yOiB0aGlzLnByb2Nlc3NDb2xvcixcblx0XHRcdFx0XHRsaW5lOiB7XG5cdFx0XHRcdFx0XHR3aWR0aDogMlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XSxcblx0ICAgICAgICB2YWx1ZUF4aXM6IHtcblx0ICAgICAgICAgICAgbGFiZWxzOiB7XG5cdCAgICAgICAgICAgICAgICBmb3JtYXQ6ICd7MH0lJ1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBsaW5lOiB7XG5cdCAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHRtaW46IDAsXG5cdCAgICBcdFx0bWF4OiAxMDBcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGNhdGVnb3J5QXhpczoge1xuXHQgICAgICAgICAgICBtYWpvckdyaWRMaW5lczoge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0bWFqb3JUaWNrczoge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH1cblx0ICAgICAgICB9LFxuXHRcdFx0dG9vbHRpcDoge1xuXHRcdFx0XHRzaGFyZWQ6IHRydWUsXG5cdCAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG5cdFx0XHRcdHNoYXJlZFRlbXBsYXRlOiBnZXRCYXNpY1NoYXJlZFRlbXBsYXRlKCd7MH0lJyksXG5cdFx0XHRcdGJhY2tncm91bmQ6ICcjZTRlNGU0J1xuXHQgICAgICAgIH1cblx0ICAgIH0pLmRhdGEoJ2tlbmRvQ2hhcnQnKTtcblx0fVxuXG5cdGdldCBzeXN0ZW1Db2xvcigpXG5cdHtcblx0XHRyZXR1cm4gJyMzMzk5RkYnO1xuXHR9XG5cblx0Z2V0IHByb2Nlc3NDb2xvcigpXG5cdHtcblx0XHRyZXR1cm4gJyMwMDMzQ0MnO1xuXHR9XG5cblx0YWRkRW50cnkocHJvY2Vzc0xvYWQsIHN5c3RlbUxvYWQpXG5cdHtcblx0XHRsZXQgbmV3RW50cnkgPSB7XG5cdFx0XHR0aW1lOiBnZXRGb3JtYXR0ZWREYXRlVGltZShuZXcgRGF0ZSgpKSxcblx0XHRcdHByb2Nlc3NMb2FkOiBwcm9jZXNzTG9hZCxcblx0XHRcdHN5c3RlbUxvYWQ6IHN5c3RlbUxvYWRcblx0XHR9O1xuXG5cdFx0Ly8gQWRkIGVudHJ5IHRvIGNoYXJ0XG5cdFx0c3VwZXIuX2FkZEVudHJ5KG5ld0VudHJ5KTtcblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ2NwdS11c2FnZS1jaGFydCcpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjcHUtdXNhZ2UtY2hhcnQnLCBDcHVVc2FnZUNoYXJ0KTtcbiIsImltcG9ydCB7QmFzZUNoYXJ0fSBmcm9tICcuL2Jhc2UtY2hhcnQnO1xuXG5pbXBvcnQge2dldE1lbW9yeVNoYXJlZFRlbXBsYXRlLCBnZXRNZW1vcnlWYWx1ZUF4aXNMYWJlbFRlbXBsYXRlLCBnZXRGb3JtYXR0ZWREYXRlVGltZX0gZnJvbSAnLi9jaGFydC11dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBNZW1vcnlDaGFydCBleHRlbmRzIEJhc2VDaGFydFxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKDMwMCk7XG5cblx0XHQvLyBBcHBlbmQgdGV4dCB0byBkaXNwbGF5IGVsYXBzZWQgdGltZVxuXHRcdHRoaXMuX2VsYXBzZWRUeHQgPSAkKCc8ZGl2PicsIHtjbGFzczogJ3RleHQtY2VudGVyJywgdGV4dDogJy0tLSd9KTtcblx0XHQkKHRoaXMpLmFwcGVuZCh0aGlzLl9lbGFwc2VkVHh0KTtcblx0fVxuXG5cdF9pbml0Q2hhcnRXaWRnZXQoY2hhcnRIdG1sKVxuXHR7XG5cdFx0cmV0dXJuIGNoYXJ0SHRtbC5rZW5kb0NoYXJ0KHtcblx0XHRcdHRyYW5zaXRpb25zOiBmYWxzZSxcblx0XHRcdGNoYXJ0QXJlYToge1xuXHRcdFx0XHRoZWlnaHQ6IDI0MFxuXHRcdFx0fSxcblx0ICAgICAgICBsZWdlbmQ6IHtcblx0ICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNlcmllc0RlZmF1bHRzOiB7XG5cdCAgICAgICAgICAgIHR5cGU6ICdhcmVhJyxcblx0ICAgICAgICAgICAgbGFiZWxzOiB7XG5cdCAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcblx0ICAgICAgICAgICAgICAgIGZvcm1hdDogJ3swfScsXG5cdCAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXJpZXM6IFt7XG5cdFx0XHRcdG5hbWU6ICdBbGxvY2F0ZWQnLFxuXHQgICAgICAgICAgICBmaWVsZDogJ2FsbG9jTWVtJyxcblx0ICAgICAgICAgICAgY2F0ZWdvcnlGaWVsZDogJ3RpbWUnLFxuXHRcdFx0XHRjb2xvcjogdGhpcy5hbGxvY2F0ZWRDb2xvcixcblx0XHRcdFx0bGluZToge1xuXHRcdFx0XHRcdHdpZHRoOiAyXG5cdFx0XHRcdH1cblx0ICAgICAgICB9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiAnVXNlZCcsXG5cdFx0XHRcdGZpZWxkOiAndXNlZE1lbScsXG5cdFx0XHRcdGNhdGVnb3J5RmllbGQ6ICd0aW1lJyxcblx0XHRcdFx0Y29sb3I6IHRoaXMudXNlZENvbG9yLFxuXHRcdFx0XHRsaW5lOiB7XG5cdFx0XHRcdFx0d2lkdGg6IDJcblx0XHRcdFx0fVxuXHRcdFx0fV0sXG5cdCAgICAgICAgdmFsdWVBeGlzOiB7XG5cdCAgICAgICAgICAgIGxhYmVsczoge1xuXHQgICAgICAgICAgICAgICAgZm9ybWF0OiAnezB9JyxcbiAgICAgIFx0XHRcdFx0dGVtcGxhdGU6IGdldE1lbW9yeVZhbHVlQXhpc0xhYmVsVGVtcGxhdGUoKVxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBsaW5lOiB7XG5cdCAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHRtaW46IDBcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGNhdGVnb3J5QXhpczoge1xuXHRcdFx0XHRtYWpvckdyaWRMaW5lczoge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0bWFqb3JUaWNrczoge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHRvb2x0aXA6IHtcblx0XHRcdFx0c2hhcmVkOiB0cnVlLFxuXHQgICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuXHRcdFx0XHRzaGFyZWRUZW1wbGF0ZTogZ2V0TWVtb3J5U2hhcmVkVGVtcGxhdGUoKSxcblx0XHRcdFx0YmFja2dyb3VuZDogJyNlNGU0ZTQnXG5cdCAgICAgICAgfVxuXHQgICAgfSkuZGF0YSgna2VuZG9DaGFydCcpO1xuXHR9XG5cblx0Z2V0IGFsbG9jYXRlZENvbG9yKClcblx0e1xuXHRcdHJldHVybiAnIzMzOTlGRic7XG5cdH1cblxuXHRnZXQgdXNlZENvbG9yKClcblx0e1xuXHRcdHJldHVybiAnIzAwMzNDQyc7XG5cdH1cblxuXHRhZGRFbnRyeShhbGxvY01lbSwgdXNlZE1lbSlcblx0e1xuXHRcdGxldCBub3cgPSBuZXcgRGF0ZSgpO1xuXG5cdFx0bGV0IG5ld0VudHJ5ID0ge1xuXHRcdFx0dGltZTogZ2V0Rm9ybWF0dGVkRGF0ZVRpbWUobm93KSxcblx0XHRcdHRpbWVzdGFtcDogbm93LmdldFRpbWUoKSxcblx0XHRcdGFsbG9jTWVtOiBhbGxvY01lbSxcblx0XHRcdHVzZWRNZW06IHVzZWRNZW1cblx0XHR9O1xuXG5cdFx0Ly8gQWRkIGVudHJ5IHRvIGNoYXJ0XG5cdFx0c3VwZXIuX2FkZEVudHJ5KG5ld0VudHJ5KTtcblxuXHRcdC8vIFVwZGF0ZSB4IGF4aXNcblx0XHRpZiAoIXRoaXMuaXNQYXVzZWQpXG5cdFx0XHR0aGlzLl91cGRhdGVFbGFwc2VkVGV4dCgpO1xuXHR9XG5cblx0X3VwZGF0ZUVsYXBzZWRUZXh0KClcblx0e1xuXHRcdGxldCBkcyA9IHRoaXMuX2RhdGFTb3VyY2U7XG5cblx0XHRpZiAoZHMudG90YWwoKSA+IDEpXG5cdFx0e1xuXHRcdFx0Ly8gR2V0IGF4aXMgbGltaXRzXG5cdFx0XHRjb25zdCBjaGFydE1pbmltdW0gPSBkcy5hdCgwKS50aW1lc3RhbXA7XG5cdFx0XHRjb25zdCBjaGFydE1heGltdW0gPSBkcy5hdChkcy50b3RhbCgpIC0gMSkudGltZXN0YW1wO1xuXG5cdFx0XHQvLyBTZXQgZWxhcHNlZCB0ZXh0XG5cdFx0XHRsZXQgc2Vjb25kcyA9IE1hdGgucm91bmQoIChjaGFydE1heGltdW0gLSBjaGFydE1pbmltdW0pIC8gMTAwMCApO1xuXHRcdFx0bGV0IHRpdGxlO1xuXG5cdFx0XHRpZiAoc2Vjb25kcyA8IDYwKVxuXHRcdFx0XHR0aXRsZSA9ICdMYXN0ICcgKyAoc2Vjb25kcyAhPSAxID8gc2Vjb25kcyArICcgc2Vjb25kcycgOiAnc2Vjb25kJyk7XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7XG5cdFx0XHRcdHRpdGxlID0gJ0xhc3QgJyArIChtaW51dGVzICE9IDEgPyBtaW51dGVzICsgJyBtaW51dGVzJyA6ICdtaW51dGUnKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fZWxhcHNlZFR4dC50ZXh0KHRpdGxlKTtcblx0XHR9XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdtZW1vcnktY2hhcnQnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnbWVtb3J5LWNoYXJ0JywgTWVtb3J5Q2hhcnQpO1xuIiwiaW1wb3J0IHtnZXROZXR3b3JrU2hhcmVkVGVtcGxhdGUsIGdldE5ldHdvcmtWYWx1ZUF4aXNMYWJlbFRlbXBsYXRlfSBmcm9tICcuL2NoYXJ0LXV0aWxzJztcbmltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5leHBvcnQgY2xhc3MgTmV0d29yazI0aENoYXJ0IGV4dGVuZHMgSFRNTEVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0dGhpcy5fbGFzdFRvdGFsT3V0ID0gMDtcblx0XHR0aGlzLl9sYXN0VG90YWxJbiA9IDA7XG5cdFx0dGhpcy5fbGFzdERhdGUgPSBuZXcgRGF0ZSgpO1xuXHRcdHRoaXMuX3NhbXBsaW5nUmF0ZVNlY29uZHMgPSAwO1xuXG5cdFx0Ly8gQ3JlYXRlIGNoYXJ0IGh0bWxcblx0XHRsZXQgY2hhcnRIdG1sID0gJCgnPGRpdj4nKTtcblx0XHQkKHRoaXMpLmFwcGVuZChjaGFydEh0bWwpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBjaGFydFxuXHRcdHRoaXMuX2NoYXJ0V2lkZ2V0ID0gdGhpcy5faW5pdENoYXJ0V2lkZ2V0KGNoYXJ0SHRtbCk7XG5cdH1cblxuXHRfaW5pdENoYXJ0V2lkZ2V0KGNoYXJ0SHRtbClcblx0e1xuXHRcdHJldHVybiBjaGFydEh0bWwua2VuZG9DaGFydCh7XG5cdFx0XHR0cmFuc2l0aW9uczogZmFsc2UsXG5cdFx0XHRjaGFydEFyZWE6IHtcblx0XHRcdFx0aGVpZ2h0OiAyNzAsXG5cdFx0XHRcdGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCdcblx0XHRcdH0sXG5cdCAgICAgICAgbGVnZW5kOiB7XG5cdCAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXJpZXNEZWZhdWx0czoge1xuXHQgICAgICAgICAgICB0eXBlOiAnYXJlYScsXG5cdCAgICAgICAgICAgIGxhYmVsczoge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG5cdCAgICAgICAgICAgICAgICBmb3JtYXQ6ICd7MH0nLFxuXHQgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50J1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2VyaWVzOiBbe1xuXHRcdFx0XHRuYW1lOiAnT3V0Z29pbmcnLFxuXHQgICAgICAgICAgICBmaWVsZDogJ291dGdvaW5nJyxcblx0ICAgICAgICAgICAgY2F0ZWdvcnlGaWVsZDogJ3RpbWUnLFxuXHRcdFx0XHRjb2xvcjogJyNDQzAwMDAnLFxuXHRcdFx0XHRsaW5lOiB7XG5cdFx0XHRcdFx0d2lkdGg6IDJcblx0XHRcdFx0fVxuXHQgICAgICAgIH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6ICdJbmNvbWluZycsXG5cdFx0XHRcdGZpZWxkOiAnaW5jb21pbmcnLFxuXHRcdFx0XHRjYXRlZ29yeUZpZWxkOiAndGltZScsXG5cdFx0XHRcdGNvbG9yOiAnIzAwOTkwMCcsXG5cdFx0XHRcdGxpbmU6IHtcblx0XHRcdFx0XHR3aWR0aDogMlxuXHRcdFx0XHR9XG5cdFx0XHR9XSxcblx0ICAgICAgICB2YWx1ZUF4aXM6IHtcblx0ICAgICAgICAgICAgbGFiZWxzOiB7XG5cdCAgICAgICAgICAgICAgICBmb3JtYXQ6ICd7MH0nLFxuICAgICAgXHRcdFx0XHR0ZW1wbGF0ZTogZ2V0TmV0d29ya1ZhbHVlQXhpc0xhYmVsVGVtcGxhdGUoKVxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBsaW5lOiB7XG5cdCAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHRtaW46IDBcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGNhdGVnb3J5QXhpczoge1xuXHRcdFx0XHRtYWpvckdyaWRMaW5lczoge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRzdGVwOiA2MFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHRtYWpvclRpY2tzOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRzdGVwOiA2MFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsYWJlbHM6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHN0ZXA6IDYwXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGJhc2VVbml0OiAnbWludXRlcycsXG5cdFx0XHRcdHR5cGU6ICdkYXRlJyxcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHRvb2x0aXA6IHtcblx0XHRcdFx0c2hhcmVkOiB0cnVlLFxuXHQgICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuXHRcdFx0XHRzaGFyZWRUZW1wbGF0ZTogZ2V0TmV0d29ya1NoYXJlZFRlbXBsYXRlKCdkZCBNTU0gSEg6bW0nKSxcblx0XHRcdFx0YmFja2dyb3VuZDogJyNlNGU0ZTQnXG5cdCAgICAgICAgfVxuXHQgICAgfSkuZGF0YSgna2VuZG9DaGFydCcpO1xuXHR9XG5cblx0cmVkcmF3KClcblx0e1xuXHRcdHRoaXMuX2NoYXJ0V2lkZ2V0LnJlZHJhdygpO1xuXHR9XG5cblx0c2V0IHJhbmdlKHZhbHVlcylcblx0e1xuXHRcdHRoaXMuX3JhbmdlID0gdmFsdWVzO1xuXG5cdFx0dGhpcy5fdXBkYXRlWEF4aXNMaW1pdHMoKTtcblx0fVxuXG5cdGdldCByYW5nZSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcmFuZ2U7XG5cdH1cblxuXHRhZGRIaXN0b3J5RW50cmllcyhvdXRnb2luZ0RhdGEsIGluY29taW5nRGF0YSwgc2FtcGxpbmdSYXRlU2Vjb25kcywgc2hpZnRTZWNvbmRzKVxuXHR7XG5cdFx0dGhpcy5fc2FtcGxpbmdSYXRlU2Vjb25kcyA9IHNhbXBsaW5nUmF0ZVNlY29uZHM7XG5cblx0XHRsZXQgbm93ID0gbmV3IERhdGUoKTtcblxuXHRcdC8vIE5PVEU6IG91dGdvaW5nRGF0YSBhbmQgaW5jb21pbkRhdGEgYXJlIHN1cHBvc2VkIHRvIGhhdmUgdGhlIHNhbWUgc2l6ZSEhIVxuXG5cdFx0aWYgKG91dGdvaW5nRGF0YS5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdGxldCBzdGFydCA9IG1vbWVudChub3cpO1xuXHRcdFx0c3RhcnQuc3VidHJhY3QoKHNhbXBsaW5nUmF0ZVNlY29uZHMgKiBvdXRnb2luZ0RhdGEubGVuZ3RoKSArIHNoaWZ0U2Vjb25kcywgJ3MnKVxuXG5cdFx0XHR0aGlzLl9sYXN0VG90YWxPdXQgPSBvdXRnb2luZ0RhdGFbMF07XG5cdFx0XHR0aGlzLl9sYXN0VG90YWxJbiA9IGluY29taW5nRGF0YVswXTtcblx0XHRcdHRoaXMuX2xhc3REYXRlID0gc3RhcnQudG9EYXRlKCk7XG5cblx0XHRcdGlmIChvdXRnb2luZ0RhdGEubGVuZ3RoID4gMSlcblx0XHRcdHtcblx0XHRcdFx0bGV0IGRhdGFTb3VyY2UgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKCk7XG5cblx0XHRcdFx0Zm9yIChsZXQgaSA9IDE7IGkgPCBvdXRnb2luZ0RhdGEubGVuZ3RoOyBpKyspXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb25zdCB0b3RhbE91dCA9IG91dGdvaW5nRGF0YVtpXTtcblx0XHRcdFx0XHRjb25zdCB0b3RhbEluID0gaW5jb21pbmdEYXRhW2ldO1xuXG5cdFx0XHRcdFx0bGV0IGRhdGUgPSBzdGFydC5jbG9uZSgpO1xuXHRcdFx0XHRcdGRhdGUuYWRkKGkgKiBzYW1wbGluZ1JhdGVTZWNvbmRzLCAncycpO1xuXG5cdFx0XHRcdFx0dGhpcy5hZGRFbnRyeSh0b3RhbE91dCwgdG90YWxJbiwgZGF0YVNvdXJjZSwgZGF0ZS50b0RhdGUoKSwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXNzaWduIGRhdGFzb3VyY2UgdG8gY2hhcnRcblx0XHRcdFx0dGhpcy5fY2hhcnRXaWRnZXQuc2V0RGF0YVNvdXJjZShkYXRhU291cmNlKTtcblxuXHRcdFx0XHQvLyBVcGRhdGUgYXhpc1xuXHRcdFx0XHR0aGlzLl91cGRhdGVYQXhpc0xpbWl0cygpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5fbGFzdFRvdGFsT3V0ID0gMDtcblx0XHRcdHRoaXMuX2xhc3RUb3RhbEluID0gMDtcblx0XHRcdHRoaXMuX2xhc3REYXRlID0gbm93O1xuXHRcdH1cblx0fVxuXG5cdGFkZEVudHJ5KHRvdGFsT3V0LCB0b3RhbEluLCBkYXRhU291cmNlID0gbnVsbCwgZGF0ZSA9IG51bGwsIHVwZGF0ZUF4aXMgPSB0cnVlKVxuXHR7XG5cdFx0aWYgKGRhdGUgPT0gbnVsbClcblx0XHRcdGRhdGUgPSBuZXcgRGF0ZSgpO1xuXG5cdFx0Y29uc3QgZWxhcHNlZFNlY3MgPSBNYXRoLnJvdW5kKChkYXRlLmdldFRpbWUoKSAtIHRoaXMuX2xhc3REYXRlLmdldFRpbWUoKSkgLyAxMDAwKTtcblxuXHRcdC8vIFRoZSAyNGggY2hhcnQgaXMgdXBkYXRlZCBhdCB0aGUgc2FtZSBzYW1wbGluZyByYXRlIHVzZWQgYnkgdGhlIHNlcnZlciB0byBzYXZlIHRoZSB0cmFmZmljIGhpc3Rvcnlcblx0XHRpZiAoZWxhcHNlZFNlY3MgPj0gdGhpcy5fc2FtcGxpbmdSYXRlU2Vjb25kcylcblx0XHR7XG5cdFx0XHRsZXQgbmV3RW50cnkgPSB7XG5cdFx0XHRcdHRpbWU6IGRhdGUsXG5cdFx0XHRcdG91dGdvaW5nOiBNYXRoLnJvdW5kKCh0b3RhbE91dCAtIHRoaXMuX2xhc3RUb3RhbE91dCkgLyBlbGFwc2VkU2VjcyksXG5cdFx0XHRcdGluY29taW5nOiBNYXRoLnJvdW5kKCh0b3RhbEluIC0gdGhpcy5fbGFzdFRvdGFsSW4pIC8gZWxhcHNlZFNlY3MpXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBBZGQgZW50cnkgdG8gZGF0YSBzb3VyY2Vcblx0XHRcdGlmIChkYXRhU291cmNlID09IG51bGwpXG5cdFx0XHRcdGRhdGFTb3VyY2UgPSB0aGlzLl9kYXRhU291cmNlO1xuXG5cdFx0XHRkYXRhU291cmNlLmFkZChuZXdFbnRyeSk7XG5cblx0XHRcdHRoaXMuX2xhc3RUb3RhbE91dCA9IHRvdGFsT3V0O1xuXHRcdFx0dGhpcy5fbGFzdFRvdGFsSW4gPSB0b3RhbEluO1xuXHRcdFx0dGhpcy5fbGFzdERhdGUgPSBkYXRlO1xuXG5cdFx0XHRpZiAodXBkYXRlQXhpcylcblx0XHRcdFx0dGhpcy5fdXBkYXRlWEF4aXNMaW1pdHMoKTtcblx0XHR9XG5cdH1cblxuXHRfdXBkYXRlWEF4aXNMaW1pdHMoKVxuXHR7XG5cdFx0bGV0IGRzID0gdGhpcy5fZGF0YVNvdXJjZTtcblxuXHRcdGlmIChkcy50b3RhbCgpID4gMClcblx0XHR7XG5cdFx0XHRjb25zdCBjaGFydE1pbmltdW0gPSBtb21lbnQodGhpcy5fbGFzdERhdGUpLmFkZCh0aGlzLl9yYW5nZVswXSwgJ2gnKTtcblx0XHRcdGNvbnN0IGNoYXJ0TWF4aW11bSA9IG1vbWVudCh0aGlzLl9sYXN0RGF0ZSkuYWRkKHRoaXMuX3JhbmdlWzFdLCAnaCcpO1xuXG5cdFx0XHR0aGlzLl9jaGFydFdpZGdldC5vcHRpb25zLmNhdGVnb3J5QXhpcy5taW4gPSBjaGFydE1pbmltdW0udG9EYXRlKCk7XG5cdFx0XHR0aGlzLl9jaGFydFdpZGdldC5vcHRpb25zLmNhdGVnb3J5QXhpcy5tYXggPSBjaGFydE1heGltdW0udG9EYXRlKCk7XG5cblx0XHRcdHRoaXMuX2NoYXJ0V2lkZ2V0LnJlZHJhdygpO1xuXHRcdH1cblx0fVxuXG5cdGdldCBfZGF0YVNvdXJjZSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fY2hhcnRXaWRnZXQuZGF0YVNvdXJjZTtcblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ25ldHdvcmstMjRoLWNoYXJ0JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ25ldHdvcmstMjRoLWNoYXJ0JywgTmV0d29yazI0aENoYXJ0KTtcbiIsImltcG9ydCB7QmFzZUNoYXJ0fSBmcm9tICcuL2Jhc2UtY2hhcnQnO1xuXG5pbXBvcnQge2dldE5ldHdvcmtTaGFyZWRUZW1wbGF0ZSwgZ2V0TmV0d29ya1ZhbHVlQXhpc0xhYmVsVGVtcGxhdGUsIGdldEZvcm1hdHRlZERhdGVUaW1lfSBmcm9tICcuL2NoYXJ0LXV0aWxzJztcblxuZXhwb3J0IGNsYXNzIE5ldHdvcmtSZWFsdGltZUNoYXJ0IGV4dGVuZHMgQmFzZUNoYXJ0XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoMzAwKTtcblxuXHRcdHRoaXMuX2xhc3RUb3RhbEtiT3V0ID0gMDtcblx0XHR0aGlzLl9sYXN0VG90YWxLYkluID0gMDtcblx0XHR0aGlzLl9sYXN0VGltZSA9IDA7XG5cblx0XHQvLyBBcHBlbmQgdGV4dCB0byBkaXNwbGF5IGVsYXBzZWQgdGltZVxuXHRcdHRoaXMuX2VsYXBzZWRUeHQgPSAkKCc8ZGl2PicsIHtjbGFzczogJ3RleHQtY2VudGVyJywgdGV4dDogJy0tLSd9KTtcblx0XHQkKHRoaXMpLmFwcGVuZCh0aGlzLl9lbGFwc2VkVHh0KTtcblx0fVxuXG5cdF9pbml0Q2hhcnRXaWRnZXQoY2hhcnRIdG1sKVxuXHR7XG5cdFx0cmV0dXJuIGNoYXJ0SHRtbC5rZW5kb0NoYXJ0KHtcblx0XHRcdHRyYW5zaXRpb25zOiBmYWxzZSxcblx0XHRcdGNoYXJ0QXJlYToge1xuXHRcdFx0XHRoZWlnaHQ6IDI3MCxcblx0XHRcdFx0YmFja2dyb3VuZDogJ3RyYW5zcGFyZW50J1xuXHRcdFx0fSxcblx0ICAgICAgICBsZWdlbmQ6IHtcblx0ICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNlcmllc0RlZmF1bHRzOiB7XG5cdCAgICAgICAgICAgIHR5cGU6ICdhcmVhJyxcblx0ICAgICAgICAgICAgbGFiZWxzOiB7XG5cdCAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcblx0ICAgICAgICAgICAgICAgIGZvcm1hdDogJ3swfScsXG5cdCAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXJpZXM6IFt7XG5cdFx0XHRcdG5hbWU6ICdPdXRnb2luZycsXG5cdCAgICAgICAgICAgIGZpZWxkOiAnb3V0Z29pbmcnLFxuXHQgICAgICAgICAgICBjYXRlZ29yeUZpZWxkOiAndGltZScsXG5cdFx0XHRcdGNvbG9yOiB0aGlzLm91dGdvaW5nQ29sb3IsXG5cdFx0XHRcdGxpbmU6IHtcblx0XHRcdFx0XHR3aWR0aDogMlxuXHRcdFx0XHR9XG5cdCAgICAgICAgfSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogJ0luY29taW5nJyxcblx0XHRcdFx0ZmllbGQ6ICdpbmNvbWluZycsXG5cdFx0XHRcdGNhdGVnb3J5RmllbGQ6ICd0aW1lJyxcblx0XHRcdFx0Y29sb3I6IHRoaXMuaW5jb21pbmdDb2xvcixcblx0XHRcdFx0bGluZToge1xuXHRcdFx0XHRcdHdpZHRoOiAyXG5cdFx0XHRcdH1cblx0XHRcdH1dLFxuXHQgICAgICAgIHZhbHVlQXhpczoge1xuXHQgICAgICAgICAgICBsYWJlbHM6IHtcblx0ICAgICAgICAgICAgICAgIGZvcm1hdDogJ3swfScsXG4gICAgICBcdFx0XHRcdHRlbXBsYXRlOiBnZXROZXR3b3JrVmFsdWVBeGlzTGFiZWxUZW1wbGF0ZSgpXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGxpbmU6IHtcblx0ICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdG1pbjogMCxcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGNhdGVnb3J5QXhpczoge1xuXHRcdFx0XHRtYWpvckdyaWRMaW5lczoge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0bWFqb3JUaWNrczoge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHRvb2x0aXA6IHtcblx0XHRcdFx0c2hhcmVkOiB0cnVlLFxuXHQgICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuXHRcdFx0XHRzaGFyZWRUZW1wbGF0ZTogZ2V0TmV0d29ya1NoYXJlZFRlbXBsYXRlKCksXG5cdFx0XHRcdGJhY2tncm91bmQ6ICcjZTRlNGU0J1xuXHQgICAgICAgIH1cblx0ICAgIH0pLmRhdGEoJ2tlbmRvQ2hhcnQnKTtcblx0fVxuXG5cdGdldCBvdXRnb2luZ0NvbG9yKClcblx0e1xuXHRcdHJldHVybiAnI0NDMDAwMCc7XG5cdH1cblxuXHRnZXQgaW5jb21pbmdDb2xvcigpXG5cdHtcblx0XHRyZXR1cm4gJyMwMDk5MDAnO1xuXHR9XG5cblx0YWRkRW50cnkodG90YWxPdXRLYiwgdG90YWxJbktiKVxuXHR7XG5cdFx0bGV0IG5vdyA9IG5ldyBEYXRlKClcblx0XHRsZXQgdGltZSA9IG5vdy5nZXRUaW1lKCk7XG5cblx0XHQvLyBUaGUgZmlyc3QgdmFsdWUgc2VudCBieSB0aGUgc2VydmVyIGlzIG5vdCBwbG90dGVkOiBpdCB3b3VsZCBiZSBhIHdvcm5nIHZhbHVlIGJlY2F1c2Vcblx0XHQvLyB3ZSBoYXZlIHRvIGNhbGN1bGF0ZSBpdCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byB0b3RhbCB2YWx1ZXMsIGJ1dCB3ZSBkb24ndCBoYXZlIHRoZSBwcmV2aW91cyBvbmVcblx0XHRpZiAodGhpcy5fbGFzdFRpbWUgPiAwKVxuXHRcdHtcblx0XHRcdGxldCBlbGFwc2VkU2VjcyA9ICh0aW1lIC0gdGhpcy5fbGFzdFRpbWUpIC8gMTAwMDtcblxuXHRcdFx0Y29uc3QgdmFsdWVPdXQgPSBNYXRoLnJvdW5kKCh0b3RhbE91dEtiIC0gdGhpcy5fbGFzdFRvdGFsS2JPdXQpIC8gZWxhcHNlZFNlY3MpO1xuXHRcdFx0Y29uc3QgdmFsdWVJbiA9IE1hdGgucm91bmQoKHRvdGFsSW5LYiAtIHRoaXMuX2xhc3RUb3RhbEtiSW4pIC8gZWxhcHNlZFNlY3MpO1xuXG5cdFx0XHRsZXQgbmV3RW50cnkgPSB7XG5cdFx0XHRcdHRpbWU6IGdldEZvcm1hdHRlZERhdGVUaW1lKG5vdyksXG5cdFx0XHRcdHRpbWVzdGFtcDogdGltZSxcblx0XHRcdFx0b3V0Z29pbmc6IHZhbHVlT3V0LFxuXHRcdFx0XHRpbmNvbWluZzogdmFsdWVJblxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gQWRkIGVudHJ5IHRvIGNoYXJ0XG5cdFx0XHRzdXBlci5fYWRkRW50cnkobmV3RW50cnkpO1xuXG5cdFx0XHQvLyBVcGRhdGUgeCBheGlzXG5cdFx0XHRpZiAoIXRoaXMuaXNQYXVzZWQpXG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUVsYXBzZWRUZXh0KCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fbGFzdFRvdGFsS2JPdXQgPSB0b3RhbE91dEtiO1xuXHRcdHRoaXMuX2xhc3RUb3RhbEtiSW4gPSB0b3RhbEluS2I7XG5cdFx0dGhpcy5fbGFzdFRpbWUgPSB0aW1lO1xuXHR9XG5cblx0X3VwZGF0ZUVsYXBzZWRUZXh0KClcblx0e1xuXHRcdGxldCBkcyA9IHRoaXMuX2RhdGFTb3VyY2U7XG5cblx0XHRpZiAoZHMudG90YWwoKSA+IDEpXG5cdFx0e1xuXHRcdFx0Ly8gR2V0IGF4aXMgbGltaXRzXG5cdFx0XHRjb25zdCBjaGFydE1pbmltdW0gPSBkcy5hdCgwKS50aW1lc3RhbXA7XG5cdFx0XHRjb25zdCBjaGFydE1heGltdW0gPSBkcy5hdChkcy50b3RhbCgpIC0gMSkudGltZXN0YW1wO1xuXG5cdFx0XHQvLyBTZXQgZWxhcHNlZCB0ZXh0XG5cdFx0XHRsZXQgdGl0bGU7XG5cdFx0XHRsZXQgc2Vjb25kcyA9IE1hdGgucm91bmQoIChjaGFydE1heGltdW0gLSBjaGFydE1pbmltdW0pIC8gMTAwMCApO1xuXG5cdFx0XHRpZiAoc2Vjb25kcyA8IDYwKVxuXHRcdFx0XHR0aXRsZSA9ICdMYXN0ICcgKyAoc2Vjb25kcyAhPSAxID8gc2Vjb25kcyArICcgc2Vjb25kcycgOiAnc2Vjb25kJyk7XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7XG5cdFx0XHRcdHRpdGxlID0gJ0xhc3QgJyArIChtaW51dGVzICE9IDEgPyBtaW51dGVzICsgJyBtaW51dGVzJyA6ICdtaW51dGUnKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fZWxhcHNlZFR4dC50ZXh0KHRpdGxlKTtcblx0XHR9XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCduZXR3b3JrLXJlYWx0aW1lLWNoYXJ0JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ25ldHdvcmstcmVhbHRpbWUtY2hhcnQnLCBOZXR3b3JrUmVhbHRpbWVDaGFydCk7XG4iLCJpbXBvcnQge0Jhc2VDaGFydH0gZnJvbSAnLi9iYXNlLWNoYXJ0JztcblxuaW1wb3J0IHtnZXRCYXNpY1NoYXJlZFRlbXBsYXRlLCBnZXRGb3JtYXR0ZWREYXRlVGltZX0gZnJvbSAnLi9jaGFydC11dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBTeXN0ZW1RdWV1ZUNoYXJ0IGV4dGVuZHMgQmFzZUNoYXJ0XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoMjQwKTtcblxuXHRcdHRoaXMuX2F2ZXJhZ2VMb2FkID0gMDtcblx0fVxuXG5cdF9pbml0aWFsaXplKClcblx0e1xuXHRcdGNvbnN0IGNoYXJ0SGVpZ2h0ID0gMjQwO1xuXG5cdFx0Ly8gQXBwZW5kIGNvbnRhaW5lciBmb3IgY2hhcnQgJiBnYXVnZVxuXHRcdGxldCBjb250YWluZXIgPSAkKCc8ZGl2PicsIHtjbGFzczogJ2QtZmxleCBmbGV4LXJvdyd9KTtcblx0XHQkKHRoaXMpLmFwcGVuZChjb250YWluZXIpO1xuXG5cdFx0Ly8gQ0hBUlRcblxuXHRcdGxldCBjaGFydENvbnRhaW5lciA9ICQoJzxkaXY+Jywge2NsYXNzOiAnZmxleC1ncm93LTEnfSk7XG5cdFx0Y29udGFpbmVyLmFwcGVuZChjaGFydENvbnRhaW5lcik7XG5cblx0XHQvLyBDcmVhdGUgY2hhcnQgaHRtbFxuXHRcdGxldCBjaGFydEh0bWwgPSAkKCc8ZGl2PicpO1xuXHRcdGNoYXJ0Q29udGFpbmVyLmFwcGVuZChjaGFydEh0bWwpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBjaGFydFxuXHRcdHRoaXMuX2NoYXJ0V2lkZ2V0ID0gdGhpcy5faW5pdENoYXJ0V2lkZ2V0KGNoYXJ0SHRtbCwgY2hhcnRIZWlnaHQpO1xuXG5cdFx0Ly8gQXBwZW5kIHRleHQgdG8gZGlzcGxheSBlbGFwc2VkIHRpbWVcblx0XHR0aGlzLl9lbGFwc2VkVHh0ID0gJCgnPGRpdj4nLCB7Y2xhc3M6ICd0ZXh0LWNlbnRlcicsIHRleHQ6ICctLS0nfSk7XG5cdFx0Y2hhcnRDb250YWluZXIuYXBwZW5kKHRoaXMuX2VsYXBzZWRUeHQpO1xuXG5cdFx0Ly8gR0FVR0VcblxuXHRcdGxldCBnYXVnZUNvbnRhaW5lciA9ICQoJzxkaXY+Jyk7XG5cdFx0Y29udGFpbmVyLmFwcGVuZChnYXVnZUNvbnRhaW5lcik7XG5cblx0XHQvLyBDcmVhdGUgZ2F1Z2UgaHRtbFxuXHRcdGxldCBnYXVnZUh0bWwgPSAkKCc8ZGl2PicpO1xuXHRcdGdhdWdlQ29udGFpbmVyLmFwcGVuZChnYXVnZUh0bWwpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBnYXVnZVxuXHRcdHRoaXMuX2dhdWdlV2lkZ2V0ID0gdGhpcy5faW5pdEdhdWdlV2lkZ2V0KGdhdWdlSHRtbCwgY2hhcnRIZWlnaHQpO1xuXG5cdFx0Ly8gQXBwZW5kIHRleHQgdG8gZGlzcGxheSBsb2FkXG5cdFx0dGhpcy5fbG9hZFR4dCA9ICQoJzxkaXY+Jywge2NsYXNzOiAndGV4dC1jZW50ZXIgZm9udC13ZWlnaHQtYm9sZCcsIHRleHQ6ICctLS0nfSk7XG5cdFx0Z2F1Z2VDb250YWluZXIuYXBwZW5kKHRoaXMuX2xvYWRUeHQpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIFJlc2V0IGRhdGEgc291cmNlXG5cdFx0dGhpcy5yZXNldCgpO1xuXHR9XG5cblx0X2luaXRDaGFydFdpZGdldChjaGFydEh0bWwsIGhlaWdodClcblx0e1xuXHRcdHJldHVybiBjaGFydEh0bWwua2VuZG9DaGFydCh7XG5cdFx0XHR0cmFuc2l0aW9uczogZmFsc2UsXG5cdFx0XHRjaGFydEFyZWE6IHtcblx0XHRcdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0XHRcdGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCdcblx0XHRcdH0sXG5cdCAgICAgICAgbGVnZW5kOiB7XG5cdCAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXJpZXNEZWZhdWx0czoge1xuXHQgICAgICAgICAgICB0eXBlOiAnYXJlYScsXG5cdCAgICAgICAgICAgIGxhYmVsczoge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG5cdCAgICAgICAgICAgICAgICBmb3JtYXQ6ICd7MH0nLFxuXHQgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50J1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXJpZXM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdNZXNzYWdlcycsXG5cdFx0ICAgICAgICAgICAgZmllbGQ6ICdsb2FkJyxcblx0XHQgICAgICAgICAgICBjYXRlZ29yeUZpZWxkOiAndGltZScsXG5cdFx0XHRcdFx0Y29sb3I6ICcjMzM5OWZmJyxcblx0XHRcdFx0XHRsaW5lOiB7XG5cdFx0XHRcdFx0XHR3aWR0aDogMlxuXHRcdFx0XHRcdH1cblx0XHQgICAgICAgIH1cblx0XHRcdF0sXG5cdCAgICAgICAgdmFsdWVBeGlzOiB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dGV4dDogJ01lc3NhZ2VzJ1xuXHRcdFx0XHR9LFxuXHQgICAgICAgICAgICBsYWJlbHM6IHtcblx0ICAgICAgICAgICAgICAgIGZvcm1hdDogJ3swfSdcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgbGluZToge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0bWluOiAwXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBjYXRlZ29yeUF4aXM6IHtcblx0ICAgICAgICAgICAgbWFqb3JHcmlkTGluZXM6IHtcblx0ICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdG1ham9yVGlja3M6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsYWJlbHM6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9XG5cdCAgICAgICAgfSxcblx0XHRcdHRvb2x0aXA6IHtcblx0XHRcdFx0c2hhcmVkOiB0cnVlLFxuXHQgICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuXHRcdFx0XHRzaGFyZWRUZW1wbGF0ZTogZ2V0QmFzaWNTaGFyZWRUZW1wbGF0ZSgpLFxuXHRcdFx0XHRiYWNrZ3JvdW5kOiAnI2U0ZTRlNCdcblx0ICAgICAgICB9XG5cdCAgICB9KS5kYXRhKCdrZW5kb0NoYXJ0Jyk7XG5cdH1cblxuXHRfaW5pdEdhdWdlV2lkZ2V0KGdhdWdlSHRtbCwgaGVpZ2h0KVxuXHR7XG5cdFx0cmV0dXJuIGdhdWdlSHRtbC5rZW5kb0xpbmVhckdhdWdlKHtcblx0XHRcdHBvaW50ZXI6IHtcblx0ICAgICAgICAgICAgdmFsdWU6IDAsXG5cdCAgICAgICAgICAgIHNoYXBlOiAnYXJyb3cnLFxuXHQgICAgICAgICAgXHRzaXplOiAxMCxcblx0XHRcdFx0Y29sb3I6ICcjMjEyNTI5J1xuXHQgICAgICAgIH0sXG5cdFx0XHRnYXVnZUFyZWE6IHtcblx0XHRcdFx0aGVpZ2h0OiBoZWlnaHRcblx0XHRcdH0sXG5cdCAgICAgICAgc2NhbGU6IHtcblx0ICAgICAgICAgICAgbWFqb3JVbml0OiAxMCxcblx0ICAgICAgICAgICAgbWlub3JVbml0OiAxLFxuXHRcdFx0XHRtaW46IDAsXG5cdFx0XHRcdG1heDogMTAwLFxuXHQgICAgICAgICAgICByYW5nZXM6IFtcblx0ICAgICAgICAgICAgICAgIHtcblx0XHRcdFx0XHRcdGZyb206IDAsXG5cdCAgICAgICAgICAgICAgICAgICAgdG86IDUwLFxuXHQgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzAwY2MwMCcsXG5cdCAgICAgICAgICAgICAgICAgIFx0b3BhY2l0eTogLjVcblx0ICAgICAgICAgICAgICAgIH0sIHtcblx0ICAgICAgICAgICAgICAgICAgICBmcm9tOiA1MCxcblx0ICAgICAgICAgICAgICAgICAgICB0bzogNzUsXG5cdCAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZmZlMTA2Jyxcblx0ICAgICAgICAgICAgICAgICAgXHRvcGFjaXR5OiAuNVxuXHQgICAgICAgICAgICAgICAgfSwge1xuXHQgICAgICAgICAgICAgICAgICAgIGZyb206IDc1LFxuXHQgICAgICAgICAgICAgICAgICAgIHRvOiAxMDAsXG5cdCAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZWQxNjAxJyxcblx0ICAgICAgICAgICAgICAgICAgXHRvcGFjaXR5OiAuNVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBdLFxuXHQgICAgICAgICAgXHRtYWpvclRpY2tzOiB7XG5cdCAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcblx0ICAgICAgICAgICAgICBzaXplOiAxMFxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgXHRtaW5vclRpY2tzOiB7XG5cdCAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgIFx0bGFiZWxzOiB7XG5cdCAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgIFx0bGluZToge1xuXHQgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICBcdHJhbmdlU2l6ZTogMTBcblx0ICAgICAgICB9XG5cdCAgICB9KS5kYXRhKCdrZW5kb0xpbmVhckdhdWdlJyk7XG5cdH1cblxuXHRhZGRFbnRyeShsb2FkLCBxdWV1ZU1zZ0xpbWl0KVxuXHR7XG5cdFx0Ly8gQ0hBUlRcblxuXHRcdGxldCBub3cgPSBuZXcgRGF0ZSgpO1xuXG5cdFx0bGV0IG5ld0VudHJ5ID0ge1xuXHRcdFx0dGltZTogZ2V0Rm9ybWF0dGVkRGF0ZVRpbWUobm93KSxcblx0XHRcdHRpbWVzdGFtcDogbm93LmdldFRpbWUoKSxcblx0XHRcdGxvYWQ6IGxvYWRcblx0XHR9O1xuXG5cdFx0Ly8gQWRkIGVudHJ5IHRvIGNoYXJ0XG5cdFx0c3VwZXIuX2FkZEVudHJ5KG5ld0VudHJ5KTtcblxuXHRcdC8vIFVwZGF0ZSB4IGF4aXNcblx0XHRpZiAoIXRoaXMuaXNQYXVzZWQpXG5cdFx0XHR0aGlzLl91cGRhdGVFbGFwc2VkVGV4dCgpO1xuXG5cdFx0Ly8gR0FVR0VcblxuXHRcdC8vIEV2YWx1YXRlIGF2ZXJhZ2Vcblx0XHRsZXQgbnVtVmFsdWVzID0gdGhpcy5fZGF0YVNvdXJjZS50b3RhbCgpO1xuXG5cdFx0aWYgKG51bVZhbHVlcyA+IDApXG5cdFx0e1xuXHRcdFx0bGV0IHRvdGFsID0gMDtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspXG5cdFx0XHRcdHRvdGFsICs9IHRoaXMuX2RhdGFTb3VyY2UuYXQoaSkubG9hZDtcblxuXHRcdFx0dGhpcy5fYXZlcmFnZUxvYWQgPSBNYXRoLnJvdW5kKHRvdGFsIC8gbnVtVmFsdWVzKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fYXZlcmFnZUxvYWQgPSAwO1xuXG5cdFx0Y29uc3QgYXZnTG9hZFBlcmMgPSBNYXRoLnJvdW5kKHRoaXMuX2F2ZXJhZ2VMb2FkIC8gcXVldWVNc2dMaW1pdCAqIDEwMDApIC8gMTA7XG5cblx0XHQvLyBTZXQgZ2F1Z2UgdmFsdWVcblx0XHR0aGlzLl9nYXVnZVdpZGdldC52YWx1ZShhdmdMb2FkUGVyYyk7XG5cblx0XHQvLyBTZXQgbG9hZCB0ZXh0XG5cdFx0dGhpcy5fbG9hZFR4dC50ZXh0KGF2Z0xvYWRQZXJjICsgJyUnKVxuXHR9XG5cblx0X3VwZGF0ZUVsYXBzZWRUZXh0KClcblx0e1xuXHRcdGxldCBkcyA9IHRoaXMuX2RhdGFTb3VyY2U7XG5cblx0XHRpZiAoZHMudG90YWwoKSA+IDEpXG5cdFx0e1xuXHRcdFx0Ly8gR2V0IGF4aXMgbGltaXRzXG5cdFx0XHRjb25zdCBjaGFydE1pbmltdW0gPSBkcy5hdCgwKS50aW1lc3RhbXA7XG5cdFx0XHRjb25zdCBjaGFydE1heGltdW0gPSBkcy5hdChkcy50b3RhbCgpIC0gMSkudGltZXN0YW1wO1xuXG5cdFx0XHQvLyBTZXQgZWxhcHNlZCB0ZXh0XG5cdFx0XHRsZXQgc2Vjb25kcyA9IE1hdGgucm91bmQoIChjaGFydE1heGltdW0gLSBjaGFydE1pbmltdW0pIC8gMTAwMCApO1xuXHRcdFx0bGV0IHRpdGxlO1xuXG5cdFx0XHRpZiAoc2Vjb25kcyA8IDYwKVxuXHRcdFx0XHR0aXRsZSA9ICdMYXN0ICcgKyAoc2Vjb25kcyAhPSAxID8gc2Vjb25kcyArICcgc2Vjb25kcycgOiAnc2Vjb25kJyk7XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7XG5cdFx0XHRcdHRpdGxlID0gJ0xhc3QgJyArIChtaW51dGVzICE9IDEgPyBtaW51dGVzICsgJyBtaW51dGVzJyA6ICdtaW51dGUnKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fZWxhcHNlZFR4dC50ZXh0KHRpdGxlKTtcblx0XHR9XG5cdH1cblxuXHRnZXQgbG9hZCgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fYXZlcmFnZUxvYWQ7XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdzeXN0ZW0tcXVldWUtY2hhcnQnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnc3lzdGVtLXF1ZXVlLWNoYXJ0JywgU3lzdGVtUXVldWVDaGFydCk7XG4iLCJpbXBvcnQge0Jhc2VDaGFydH0gZnJvbSAnLi9iYXNlLWNoYXJ0JztcblxuaW1wb3J0IHtnZXRCYXNpY1NoYXJlZFRlbXBsYXRlLCBnZXRGb3JtYXR0ZWREYXRlVGltZX0gZnJvbSAnLi9jaGFydC11dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBTeXN0ZW1Xb3JrbG9hZENoYXJ0IGV4dGVuZHMgQmFzZUNoYXJ0XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoMjQwKTtcblx0fVxuXG5cdF9pbml0aWFsaXplKClcblx0e1xuXHRcdGNvbnN0IGNoYXJ0SGVpZ2h0ID0gMjQwO1xuXG5cdFx0Ly8gQXBwZW5kIGNvbnRhaW5lciBmb3IgY2hhcnQgJiBnYXVnZVxuXHRcdGxldCBjb250YWluZXIgPSAkKCc8ZGl2PicsIHtjbGFzczogJ2QtZmxleCBmbGV4LXJvdyd9KTtcblx0XHQkKHRoaXMpLmFwcGVuZChjb250YWluZXIpO1xuXG5cdFx0Ly8gQ0hBUlRcblxuXHRcdGxldCBjaGFydENvbnRhaW5lciA9ICQoJzxkaXY+Jywge2NsYXNzOiAnZmxleC1ncm93LTEnfSk7XG5cdFx0Y29udGFpbmVyLmFwcGVuZChjaGFydENvbnRhaW5lcik7XG5cblx0XHQvLyBDcmVhdGUgY2hhcnQgaHRtbFxuXHRcdGxldCBjaGFydEh0bWwgPSAkKCc8ZGl2PicpO1xuXHRcdGNoYXJ0Q29udGFpbmVyLmFwcGVuZChjaGFydEh0bWwpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBjaGFydFxuXHRcdHRoaXMuX2NoYXJ0V2lkZ2V0ID0gdGhpcy5faW5pdENoYXJ0V2lkZ2V0KGNoYXJ0SHRtbCwgY2hhcnRIZWlnaHQpO1xuXG5cdFx0Ly8gQXBwZW5kIHRleHQgdG8gZGlzcGxheSBlbGFwc2VkIHRpbWVcblx0XHR0aGlzLl9lbGFwc2VkVHh0ID0gJCgnPGRpdj4nLCB7Y2xhc3M6ICd0ZXh0LWNlbnRlcicsIHRleHQ6ICctLS0nfSk7XG5cdFx0Y2hhcnRDb250YWluZXIuYXBwZW5kKHRoaXMuX2VsYXBzZWRUeHQpO1xuXG5cdFx0Ly8gR0FVR0VcblxuXHRcdGxldCBnYXVnZUNvbnRhaW5lciA9ICQoJzxkaXY+Jyk7XG5cdFx0Y29udGFpbmVyLmFwcGVuZChnYXVnZUNvbnRhaW5lcik7XG5cblx0XHQvLyBDcmVhdGUgZ2F1Z2UgaHRtbFxuXHRcdGxldCBnYXVnZUh0bWwgPSAkKCc8ZGl2PicpO1xuXHRcdGdhdWdlQ29udGFpbmVyLmFwcGVuZChnYXVnZUh0bWwpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBnYXVnZVxuXHRcdHRoaXMuX2dhdWdlV2lkZ2V0ID0gdGhpcy5faW5pdEdhdWdlV2lkZ2V0KGdhdWdlSHRtbCwgY2hhcnRIZWlnaHQpO1xuXG5cdFx0Ly8gQXBwZW5kIHRleHQgdG8gZGlzcGxheSBsb2FkXG5cdFx0dGhpcy5fbG9hZFR4dCA9ICQoJzxkaXY+Jywge2NsYXNzOiAndGV4dC1jZW50ZXIgZm9udC13ZWlnaHQtYm9sZCcsIHRleHQ6ICctLS0nfSk7XG5cdFx0Z2F1Z2VDb250YWluZXIuYXBwZW5kKHRoaXMuX2xvYWRUeHQpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIFJlc2V0IGRhdGEgc291cmNlXG5cdFx0dGhpcy5yZXNldCgpO1xuXHR9XG5cblx0X2luaXRDaGFydFdpZGdldChjaGFydEh0bWwsIGhlaWdodClcblx0e1xuXHRcdHJldHVybiBjaGFydEh0bWwua2VuZG9DaGFydCh7XG5cdFx0XHR0cmFuc2l0aW9uczogZmFsc2UsXG5cdFx0XHRjaGFydEFyZWE6IHtcblx0XHRcdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0XHRcdGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCdcblx0XHRcdH0sXG5cdCAgICAgICAgbGVnZW5kOiB7XG5cdCAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXJpZXNEZWZhdWx0czoge1xuXHQgICAgICAgICAgICB0eXBlOiAnYXJlYScsXG5cdCAgICAgICAgICAgIGxhYmVsczoge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG5cdCAgICAgICAgICAgICAgICBmb3JtYXQ6ICd7MH0lJyxcblx0ICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCdcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2VyaWVzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnV29ya2xvYWQnLFxuXHRcdCAgICAgICAgICAgIGZpZWxkOiAnbG9hZCcsXG5cdFx0ICAgICAgICAgICAgY2F0ZWdvcnlGaWVsZDogJ3RpbWUnLFxuXHRcdFx0XHRcdGNvbG9yOiAnIzMzOTlmZicsXG5cdFx0XHRcdFx0bGluZToge1xuXHRcdFx0XHRcdFx0d2lkdGg6IDJcblx0XHRcdFx0XHR9XG5cdFx0ICAgICAgICB9XG5cdFx0XHRdLFxuXHQgICAgICAgIHZhbHVlQXhpczoge1xuXHQgICAgICAgICAgICBsYWJlbHM6IHtcblx0ICAgICAgICAgICAgICAgIGZvcm1hdDogJ3swfSUnXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGxpbmU6IHtcblx0ICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdG1pbjogMCxcblx0ICAgIFx0XHRtYXg6IDEwMFxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgY2F0ZWdvcnlBeGlzOiB7XG5cdCAgICAgICAgICAgIG1ham9yR3JpZExpbmVzOiB7XG5cdCAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHRtYWpvclRpY2tzOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWxzOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fVxuXHQgICAgICAgIH0sXG5cdFx0XHR0b29sdGlwOiB7XG5cdFx0XHRcdHNoYXJlZDogdHJ1ZSxcblx0ICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcblx0XHRcdFx0c2hhcmVkVGVtcGxhdGU6IGdldEJhc2ljU2hhcmVkVGVtcGxhdGUoJ3swfSUnKSxcblx0XHRcdFx0YmFja2dyb3VuZDogJyNlNGU0ZTQnXG5cdCAgICAgICAgfVxuXHQgICAgfSkuZGF0YSgna2VuZG9DaGFydCcpO1xuXHR9XG5cblx0X2luaXRHYXVnZVdpZGdldChnYXVnZUh0bWwsIGhlaWdodClcblx0e1xuXHRcdHJldHVybiBnYXVnZUh0bWwua2VuZG9MaW5lYXJHYXVnZSh7XG5cdFx0XHRwb2ludGVyOiB7XG5cdCAgICAgICAgICAgIHZhbHVlOiAwLFxuXHQgICAgICAgICAgICBzaGFwZTogJ2Fycm93Jyxcblx0ICAgICAgICAgIFx0c2l6ZTogMTAsXG5cdFx0XHRcdGNvbG9yOiAnIzIxMjUyOSdcblx0ICAgICAgICB9LFxuXHRcdFx0Z2F1Z2VBcmVhOiB7XG5cdFx0XHRcdGhlaWdodDogaGVpZ2h0XG5cdFx0XHR9LFxuXHQgICAgICAgIHNjYWxlOiB7XG5cdCAgICAgICAgICAgIG1ham9yVW5pdDogMTAsXG5cdCAgICAgICAgICAgIG1pbm9yVW5pdDogMSxcblx0ICAgICAgICAgICAgbWF4OiAxMDAsXG5cdFx0XHRcdG1pbjogMCxcblx0ICAgICAgICAgICAgcmFuZ2VzOiBbXG5cdCAgICAgICAgICAgICAgICB7XG5cdCAgICAgICAgICAgICAgICAgICAgZnJvbTogMCxcblx0ICAgICAgICAgICAgICAgICAgICB0bzogNTAsXG5cdCAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjMDBjYzAwJyxcblx0ICAgICAgICAgICAgICAgICAgXHRvcGFjaXR5OiAuNVxuXHQgICAgICAgICAgICAgICAgfSwge1xuXHQgICAgICAgICAgICAgICAgICAgIGZyb206IDUwLFxuXHQgICAgICAgICAgICAgICAgICAgIHRvOiA3NSxcblx0ICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNmZmUxMDYnLFxuXHQgICAgICAgICAgICAgICAgICBcdG9wYWNpdHk6IC41XG5cdCAgICAgICAgICAgICAgICB9LCB7XG5cdCAgICAgICAgICAgICAgICAgICAgZnJvbTogNzUsXG5cdCAgICAgICAgICAgICAgICAgICAgdG86IDEwMCxcblx0ICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNlZDE2MDEnLFxuXHQgICAgICAgICAgICAgICAgICBcdG9wYWNpdHk6IC41XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIF0sXG5cdCAgICAgICAgICBcdG1ham9yVGlja3M6IHtcblx0ICAgICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuXHQgICAgICAgICAgICAgIHNpemU6IDEwXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICBcdG1pbm9yVGlja3M6IHtcblx0ICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgXHRsYWJlbHM6IHtcblx0ICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgXHRsaW5lOiB7XG5cdCAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgIFx0cmFuZ2VTaXplOiAxMFxuXHQgICAgICAgIH1cblx0ICAgIH0pLmRhdGEoJ2tlbmRvTGluZWFyR2F1Z2UnKTtcblx0fVxuXG5cdGFkZEVudHJ5KGxvYWQpXG5cdHtcblx0XHQvLyBDSEFSVFxuXG5cdFx0bGV0IG5vdyA9IG5ldyBEYXRlKCk7XG5cblx0XHRsZXQgbmV3RW50cnkgPSB7XG5cdFx0XHR0aW1lOiBnZXRGb3JtYXR0ZWREYXRlVGltZShub3cpLFxuXHRcdFx0dGltZXN0YW1wOiBub3cuZ2V0VGltZSgpLFxuXHRcdFx0bG9hZDogbG9hZFxuXHRcdH07XG5cblx0XHQvLyBBZGQgZW50cnkgdG8gY2hhcnRcblx0XHRzdXBlci5fYWRkRW50cnkobmV3RW50cnkpO1xuXG5cdFx0Ly8gVXBkYXRlIHggYXhpc1xuXHRcdGlmICghdGhpcy5pc1BhdXNlZClcblx0XHRcdHRoaXMuX3VwZGF0ZUVsYXBzZWRUZXh0KCk7XG5cblx0XHQvLyBHQVVHRVxuXG5cdFx0Ly8gRXZhbHVhdGUgYXZlcmFnZVxuXHRcdGxldCBudW1WYWx1ZXMgPSB0aGlzLl9kYXRhU291cmNlLnRvdGFsKCk7XG5cdFx0bGV0IGF2ZXJhZ2VMb2FkID0gMDtcblxuXHRcdGlmIChudW1WYWx1ZXMgPiAwKVxuXHRcdHtcblx0XHRcdGxldCB0b3RhbCA9IDA7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG51bVZhbHVlczsgaSsrKVxuXHRcdFx0XHR0b3RhbCArPSB0aGlzLl9kYXRhU291cmNlLmF0KGkpLmxvYWQ7XG5cblx0XHRcdGF2ZXJhZ2VMb2FkID0gTWF0aC5yb3VuZCh0b3RhbCAvIG51bVZhbHVlcyk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IGdhdWdlIHZhbHVlXG5cdFx0dGhpcy5fZ2F1Z2VXaWRnZXQudmFsdWUoYXZlcmFnZUxvYWQpO1xuXG5cdFx0Ly8gU2V0IGxvYWQgdGV4dFxuXHRcdHRoaXMuX2xvYWRUeHQudGV4dChhdmVyYWdlTG9hZCArICclJylcblx0fVxuXG5cdF91cGRhdGVFbGFwc2VkVGV4dCgpXG5cdHtcblx0XHRsZXQgZHMgPSB0aGlzLl9kYXRhU291cmNlO1xuXG5cdFx0aWYgKGRzLnRvdGFsKCkgPiAxKVxuXHRcdHtcblx0XHRcdC8vIEdldCBheGlzIGxpbWl0c1xuXHRcdFx0Y29uc3QgY2hhcnRNaW5pbXVtID0gZHMuYXQoMCkudGltZXN0YW1wO1xuXHRcdFx0Y29uc3QgY2hhcnRNYXhpbXVtID0gZHMuYXQoZHMudG90YWwoKSAtIDEpLnRpbWVzdGFtcDtcblxuXHRcdFx0Ly8gU2V0IGVsYXBzZWQgdGV4dFxuXHRcdFx0bGV0IHNlY29uZHMgPSBNYXRoLnJvdW5kKCAoY2hhcnRNYXhpbXVtIC0gY2hhcnRNaW5pbXVtKSAvIDEwMDAgKTtcblx0XHRcdGxldCB0aXRsZTtcblxuXHRcdFx0aWYgKHNlY29uZHMgPCA2MClcblx0XHRcdFx0dGl0bGUgPSAnTGFzdCAnICsgKHNlY29uZHMgIT0gMSA/IHNlY29uZHMgKyAnIHNlY29uZHMnIDogJ3NlY29uZCcpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuXHRcdFx0XHR0aXRsZSA9ICdMYXN0ICcgKyAobWludXRlcyAhPSAxID8gbWludXRlcyArICcgbWludXRlcycgOiAnbWludXRlJyk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2VsYXBzZWRUeHQudGV4dCh0aXRsZSk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IGxvYWQoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2F2ZXJhZ2VMb2FkO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnc3lzdGVtLXdvcmtsb2FkLWNoYXJ0JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3N5c3RlbS13b3JrbG9hZC1jaGFydCcsIFN5c3RlbVdvcmtsb2FkQ2hhcnQpO1xuIiwiaW1wb3J0IHtCYXNlQ2hhcnR9IGZyb20gJy4vYmFzZS1jaGFydCc7XG5cbmltcG9ydCB7Z2V0QmFzaWNTaGFyZWRUZW1wbGF0ZSwgZ2V0Rm9ybWF0dGVkRGF0ZVRpbWV9IGZyb20gJy4vY2hhcnQtdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgVGhyZWFkQ291bnRDaGFydCBleHRlbmRzIEJhc2VDaGFydFxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKDEyMCk7XG5cdH1cblxuXHRfaW5pdENoYXJ0V2lkZ2V0KGNoYXJ0SHRtbClcblx0e1xuXHRcdHJldHVybiBjaGFydEh0bWwua2VuZG9DaGFydCh7XG5cdFx0XHR0cmFuc2l0aW9uczogZmFsc2UsXG5cdFx0XHRjaGFydEFyZWE6IHtcblx0XHRcdFx0aGVpZ2h0OiAxMjAsXG5cdFx0XHRcdGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCdcblx0XHRcdH0sXG5cdCAgICAgICAgbGVnZW5kOiB7XG5cdCAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXJpZXNEZWZhdWx0czoge1xuXHQgICAgICAgICAgICB0eXBlOiAnYXJlYScsXG5cdCAgICAgICAgICAgIGxhYmVsczoge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG5cdCAgICAgICAgICAgICAgICBmb3JtYXQ6ICd7MH0nLFxuXHQgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50J1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2VyaWVzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnVGhyZWFkcycsXG5cdFx0ICAgICAgICAgICAgZmllbGQ6ICd0aHJlYWRzJyxcblx0XHQgICAgICAgICAgICBjYXRlZ29yeUZpZWxkOiAndGltZScsXG5cdFx0XHRcdFx0Y29sb3I6IHRoaXMudGhyZWFkc0NvbG9yLFxuXHRcdFx0XHRcdGxpbmU6IHtcblx0XHRcdFx0XHRcdHdpZHRoOiAyXG5cdFx0XHRcdFx0fVxuXHRcdCAgICAgICAgfVxuXHRcdFx0XSxcblx0ICAgICAgICB2YWx1ZUF4aXM6IHtcblx0XHRcdFx0bWluOiAwLFxuXHQgICAgICAgICAgICBsYWJlbHM6IHtcblx0ICAgICAgICAgICAgICAgIGZvcm1hdDogJ3swfSdcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgbGluZToge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGNhdGVnb3J5QXhpczoge1xuXHQgICAgICAgICAgICBtYWpvckdyaWRMaW5lczoge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0bWFqb3JUaWNrczoge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH1cblx0ICAgICAgICB9LFxuXHRcdFx0dG9vbHRpcDoge1xuXHRcdFx0XHRzaGFyZWQ6IHRydWUsXG5cdCAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG5cdFx0XHRcdHNoYXJlZFRlbXBsYXRlOiBnZXRCYXNpY1NoYXJlZFRlbXBsYXRlKCksXG5cdFx0XHRcdGJhY2tncm91bmQ6ICcjZTRlNGU0J1xuXHQgICAgICAgIH1cblx0ICAgIH0pLmRhdGEoJ2tlbmRvQ2hhcnQnKTtcblx0fVxuXG5cdGdldCB0aHJlYWRzQ29sb3IoKVxuXHR7XG5cdFx0cmV0dXJuICcjMzM5OUZGJztcblx0fVxuXG5cdGFkZEVudHJ5KHRocmVhZHMpXG5cdHtcblx0XHRsZXQgbmV3RW50cnkgPSB7XG5cdFx0XHR0aW1lOiBnZXRGb3JtYXR0ZWREYXRlVGltZShuZXcgRGF0ZSgpKSxcblx0XHRcdHRocmVhZHM6IHRocmVhZHNcblx0XHR9O1xuXG5cdFx0Ly8gQWRkIGVudHJ5IHRvIGNoYXJ0XG5cdFx0c3VwZXIuX2FkZEVudHJ5KG5ld0VudHJ5KTtcblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ3RocmVhZC1jb3VudC1jaGFydCcpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCd0aHJlYWQtY291bnQtY2hhcnQnLCBUaHJlYWRDb3VudENoYXJ0KTtcbiIsImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge2J5dGVzVG9TaXplLCBrQnl0ZXNUb1NpemV9IGZyb20gJy4uL3V0aWxzL3V0aWxpdGllcyc7XG5pbXBvcnQge2dldFRpbWVSYW5nZVRvb2x0aXBUZW1wbGF0ZX0gZnJvbSAnLi4vY29tcG9uZW50cy9jaGFydHMvY2hhcnQtdXRpbHMnO1xuaW1wb3J0IHtDcHVVc2FnZUNoYXJ0fSBmcm9tICcuLi9jb21wb25lbnRzL2NoYXJ0cy9jcHUtdXNhZ2UtY2hhcnQnO1xuaW1wb3J0IHtUaHJlYWRDb3VudENoYXJ0fSBmcm9tICcuLi9jb21wb25lbnRzL2NoYXJ0cy90aHJlYWQtY291bnQtY2hhcnQnO1xuaW1wb3J0IHtNZW1vcnlDaGFydH0gZnJvbSAnLi4vY29tcG9uZW50cy9jaGFydHMvbWVtb3J5LWNoYXJ0JztcbmltcG9ydCB7TmV0d29ya1JlYWx0aW1lQ2hhcnR9IGZyb20gJy4uL2NvbXBvbmVudHMvY2hhcnRzL25ldHdvcmstcmVhbHRpbWUtY2hhcnQnO1xuaW1wb3J0IHtOZXR3b3JrMjRoQ2hhcnR9IGZyb20gJy4uL2NvbXBvbmVudHMvY2hhcnRzL25ldHdvcmstMjRoLWNoYXJ0JztcbmltcG9ydCB7U3lzdGVtV29ya2xvYWRDaGFydH0gZnJvbSAnLi4vY29tcG9uZW50cy9jaGFydHMvc3lzdGVtLXdvcmtsb2FkLWNoYXJ0JztcbmltcG9ydCB7U3lzdGVtUXVldWVDaGFydH0gZnJvbSAnLi4vY29tcG9uZW50cy9jaGFydHMvc3lzdGVtLXF1ZXVlLWNoYXJ0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGFzaGJvYXJkIGV4dGVuZHMgQmFzZU1vZHVsZVxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKCdkYXNoYm9hcmQnKTtcblxuXHRcdC8vIE91dGdvaW5nIHJlcXVlc3RzXG5cdFx0dGhpcy5SRVFfSU5JVCA9ICdpbml0Jztcblx0XHR0aGlzLlJFUV9HRVRfREFUQSA9ICdnZXREYXRhJztcblx0XHR0aGlzLlJFUV9EVU1QX1RIUkVBRFMgPSAnZ2V0VGhEdW1wJztcblxuXHRcdC8vIEluY29taW5nIHJlc3BvbnNlc1xuXHRcdHRoaXMuUkVTUF9JTklUID0gJ2luaXQnO1xuXHRcdHRoaXMuUkVTUF9EQVRBID0gJ2RhdGEnO1xuXHRcdHRoaXMuUkVTUF9USFJFQURfRFVNUCA9ICd0aER1bXAnO1xuXG5cdFx0dGhpcy5fdGNwT3V0VGhyZWFkcyA9IDA7XG5cdFx0dGhpcy5fdGNwT3V0TG9hZCA9IDA7XG5cdFx0dGhpcy5fdWRwT3V0VGhyZWFkcyA9IDA7XG5cdFx0dGhpcy5fdWRwT3V0TG9hZCA9IDA7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBDT01NT04gTU9EVUxFIElOVEVSRkFDRSBNRVRIT0RTXG5cdC8vIFRoaXMgbWVtYmVycyBhcmUgdXNlZCBieSB0aGUgbWFpbiBjb250cm9sbGVyXG5cdC8vIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1vZHVsZSdzIGNvbnRyb2xsZXIuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0aW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcilcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuaW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcik7XG5cblx0XHQvLyBJbml0aWFsaXplIHNjcm9sbGluZyB0YWJzXG5cdFx0JCgnI2RzaC10YWJOYXZpZ2F0b3IgPiAjdGFicycpLnNjcm9sbGluZ1RhYnMoe1xuXHRcdFx0Ym9vdHN0cmFwVmVyc2lvbjogNCxcblx0XHRcdHNjcm9sbFRvVGFiRWRnZTogdHJ1ZSxcblx0XHRcdGVuYWJsZVN3aXBpbmc6IHRydWUsXG5cdFx0XHRkaXNhYmxlU2Nyb2xsQXJyb3dzT25GdWxseVNjcm9sbGVkOiB0cnVlLFxuXHRcdFx0Y3NzQ2xhc3NMZWZ0QXJyb3c6ICdmYSBmYS1jaGV2cm9uLWxlZnQnLFxuXHRcdFx0Y3NzQ2xhc3NSaWdodEFycm93OiAnZmEgZmEtY2hldnJvbi1yaWdodCdcblx0XHR9KTtcblxuXHRcdC8vIEluaXRpYWxpemUgaW50ZXJ2YWwgZHJvcGRvd25cblx0XHR0aGlzLl9pbnRlcnZhbERyb3BEb3duID0gJCgnI2RzaC1pbnRlcnZhbEREJykua2VuZG9Ecm9wRG93bkxpc3Qoe1xuXHRcdFx0dmFsdWVUZW1wbGF0ZTogJzxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBwci0xXCI+SW50ZXJ2YWw6PC9zcGFuPjxzcGFuPiM6ZGF0YS50ZXh0Izwvc3Bhbj4nLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uVXBkYXRlSW50ZXJ2YWxDaGFuZ2UsIHRoaXMpXG5cdFx0fSkuZGF0YSgna2VuZG9Ecm9wRG93bkxpc3QnKTtcblxuXHRcdC8vIEluaXRpYWxpemUgdGhyZWFkcyBncmlkXG5cdFx0dGhpcy5fdGhyZWFkc0dyaWQgPSAkKCcjZHNoLXRocmVhZHNHcmlkJykua2VuZG9HcmlkKHtcblx0XHRcdGRhdGFTb3VyY2U6IHRoaXMuX2dldFRocmVhZHNHcmlkRGF0YVNvdXJjZSgpLFxuXHRcdFx0c2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZmlsdGVyYWJsZTogZmFsc2UsXG5cdFx0XHRyZXNpemFibGU6IHRydWUsXG5cdFx0XHRzZWxlY3RhYmxlOiBmYWxzZSxcblx0XHRcdGNvbHVtbnM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZpZWxkOiAnaWQnLFxuXHRcdFx0XHRcdHRpdGxlOiAnSWQnLFxuXHRcdFx0XHRcdHdpZHRoOiA2MFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZmllbGQ6ICduYW1lJyxcblx0XHRcdFx0XHR0aXRsZTogJ05hbWUnLFxuXHRcdFx0XHRcdHdpZHRoOiAnNjUlJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZmllbGQ6ICdjcHVUaW1lJyxcblx0XHRcdFx0XHR0aXRsZTogJ0NQVSBUaW1lJyxcblx0XHRcdFx0XHRmb3JtYXQ6ICd7MH0lJyxcblx0XHRcdFx0XHR3aWR0aDogJzM1JSdcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0XHRub1JlY29yZHM6IHtcblx0XHRcdFx0dGVtcGxhdGU6ICdObyB0aHJlYWRzLidcblx0XHRcdH0sXG5cdFx0XHRoZWlnaHQ6ICdjYWxjKDI0MHB4IC0gLjc1cmVtICsgMXJlbSknXG5cdFx0fSkuZGF0YSgna2VuZG9HcmlkJyk7XG5cblx0XHQvLyBBZGQgY2xpY2sgbGlzdGVuZXIgdG8gdGhyZWFkcyBkdW1wIGJ1dHRvblxuXHRcdCQoJyNkc2gtZHVtcFRocmVhZHNCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25EdW1wVGhyZWFkc0NsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBDb25maWd1cmUgdGhyZWFkIGR1bXAgcGFuZWxcblx0XHQkKCcjZHNoLXRocmVhZER1bXBNb2RhbCcpLm1vZGFsKHtcblx0XHRcdGJhY2tkcm9wOiAnc3RhdGljJyxcblx0XHRcdGtleWJvYXJkOiBmYWxzZSxcblx0XHRcdHNob3c6IGZhbHNlLFxuXHRcdH0pO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIGZvciB0aHJlYWRzIGR1bXAgcGFuZWwgaGlkZVxuXHRcdCQoJyNkc2gtdGhyZWFkRHVtcE1vZGFsJykub24oJ2hpZGRlbi5icy5tb2RhbCcsICQucHJveHkodGhpcy5fb25UaHJlYWREdW1wTW9kYWxIaWRkZW4sIHRoaXMpKTtcblxuXHRcdC8vIEFkZCBjbGljayBsaXN0ZW5lciB0byB0aHJlYWRzIGR1bXAgY29weSBidXR0b25cblx0XHQkKCcjZHNoLWNvcHlUaHJlYWREdW1wQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQ29weVRocmVhZER1bXBDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aW1lIHJhbmdlIHNsaWRlclxuXHRcdHRoaXMuX3RpbWVTbGlkZXIgPSAkKCcjZHNoLXRpbWVTbGlkZXInKS5rZW5kb1JhbmdlU2xpZGVyKHtcblx0XHRcdG1pbjogLTI0LFxuICAgICAgICAgICAgbWF4OiAwLFxuICAgICAgICAgICAgc21hbGxTdGVwOiAxLFxuICAgICAgICAgICAgbGFyZ2VTdGVwOiAwLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uVGltZVJhbmdlQ2hhbmdlLCB0aGlzKSxcblx0XHRcdHRvb2x0aXA6IHtcblx0XHRcdFx0dGVtcGxhdGU6IGdldFRpbWVSYW5nZVRvb2x0aXBUZW1wbGF0ZSgpXG5cdFx0XHR9LFxuXHRcdFx0bGVmdERyYWdIYW5kbGVUaXRsZTogJ0RyYWcnLFxuXHRcdFx0cmlnaHREcmFnSGFuZGxlVGl0bGU6ICdEcmFnJyxcblx0XHR9KS5kYXRhKCdrZW5kb1JhbmdlU2xpZGVyJyk7XG5cblx0XHQvLyBBZGQgY2xpY2sgbGlzdGVuZXIgdG8gcmVzZXQgY2hhcnRzIGJ1dHRvblxuXHRcdCQoJyNkc2gtcmVzZXRCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZXNldENoYXJ0c0NsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBBZGQgY2xpY2sgbGlzdGVuZXIgdG8gcGxheSAmIHBhdXNlIGNoYXJ0IHVwZGF0ZSBidXR0b25zXG5cdFx0JCgnI2RzaC1wYXVzZUJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblBhdXNlVXBkYXRlQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjZHNoLXBsYXlCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25QbGF5VXBkYXRlQ2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIFNldCByZWZlcmVuY2UgdG8gY2hhcnRzXG5cdFx0dGhpcy5fY3B1VXNhZ2VDaGFydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkc2gtY3B1VXNhZ2VDaGFydCcpO1xuXHRcdHRoaXMuX3RocmVhZENvdW50Q2hhcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHNoLXRocmVhZENvdW50Q2hhcnQnKTtcblx0XHR0aGlzLl9tZW1vcnlDaGFydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkc2gtbWVtb3J5Q2hhcnQnKTtcblx0XHR0aGlzLl9uZXR3b3JrUlRDaGFydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkc2gtbmV0d29ya1JUQ2hhcnQnKTtcblx0XHR0aGlzLl9uZXR3b3JrMjRoQ2hhcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHNoLW5ldHdvcmsyNGhDaGFydCcpO1xuXHRcdHRoaXMuX3N5c1dvcmtsb2FkQ2hhcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHNoLXN5c3RlbVdvcmtsb2FkQ2hhcnQnKTtcblx0XHR0aGlzLl9vdXRUY3BNc2dRdWV1ZUNoYXJ0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RzaC1vdXRnb2luZ1RjcE1lc3NhZ2VzUXVldWVDaGFydCcpO1xuXHRcdHRoaXMuX291dFVkcE1zZ1F1ZXVlQ2hhcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHNoLW91dGdvaW5nVWRwTWVzc2FnZXNRdWV1ZUNoYXJ0Jyk7XG5cdFx0dGhpcy5fc3lzUXVldWVDaGFydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkc2gtc3lzdGVtUXVldWVDaGFydCcpO1xuXHRcdHRoaXMuX2V4dFF1ZXVlQ2hhcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHNoLWV4dGVuc2lvblF1ZXVlQ2hhcnQnKTtcblxuXHRcdC8vIFNldCBjb2xvcnMgaW4gY2hhcnQgbGVnZW5kc1xuXHRcdCQoJyNkc2gtc3lzdGVtTG9hZENvbG9yJykuY3NzKCdjb2xvcicsIHRoaXMuX2NwdVVzYWdlQ2hhcnQuc3lzdGVtQ29sb3IpO1xuXHRcdCQoJyNkc2gtcHJvY2Vzc0xvYWRDb2xvcicpLmNzcygnY29sb3InLCB0aGlzLl9jcHVVc2FnZUNoYXJ0LnByb2Nlc3NDb2xvcik7XG5cdFx0JCgnI2RzaC1hbGxvY01lbUNvbG9yJykuY3NzKCdjb2xvcicsIHRoaXMuX21lbW9yeUNoYXJ0LmFsbG9jYXRlZENvbG9yKTtcblx0XHQkKCcjZHNoLXVzZWRNZW1Db2xvcicpLmNzcygnY29sb3InLCB0aGlzLl9tZW1vcnlDaGFydC51c2VkQ29sb3IpO1xuXHRcdCQoJyNkc2gtaW5jb21pbmdOZXRDb2xvcicpLmNzcygnY29sb3InLCB0aGlzLl9uZXR3b3JrUlRDaGFydC5pbmNvbWluZ0NvbG9yKTtcblx0XHQkKCcjZHNoLW91dGdvaW5nTmV0Q29sb3InKS5jc3MoJ2NvbG9yJywgdGhpcy5fbmV0d29ya1JUQ2hhcnQub3V0Z29pbmdDb2xvcik7XG5cblx0XHQvLyBSZXNldCB0aW1lIHJhbmdlIG9uIDI0aCBuZXR3b3JrIGNoYXJ0XG5cdFx0dGhpcy5fb25UaW1lUmFuZ2VDaGFuZ2UoKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byByZWRyYXcgYWxsIGNoYXJ0cyBvbiBtYWluIHRhYiBjaGFuZ2Vcblx0XHQvLyAodG8gd29yayBhcm91bmQgYW4gaXNzdWUgd2l0aCB0aGUgY2hhcnQgcmVzaXppbmcgdG8gZGVmYXVsdCB3aWR0aCB3aGVuIHBhbmUgaXMgaGlkZGVuKVxuXHRcdCQoJ2FbZGF0YS10b2dnbGU9XCJ0YWJcIl0nKS5vbignc2hvd24uYnMudGFiJywgJC5wcm94eSh0aGlzLl9vbldpbmRvd1Jlc2l6ZSwgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIHJlZHJhdyBuZXR3b3JrIGNoYXJ0cyBvbiBuZXR3b3JrIHRhYiBjaGFuZ2Vcblx0XHQvLyAodG8gd29yayBhcm91bmQgYW4gaXNzdWUgd2l0aCB0aGUgY2hhcnQgcmVzaXppbmcgdG8gZGVmYXVsdCB3aWR0aCB3aGVuIHBhbmUgaXMgaGlkZGVuKVxuXHRcdCQoJyNkc2gtbmV0d29ya1BpbGxzIGFbZGF0YS10b2dnbGU9XCJwaWxsXCJdJykub24oJ3Nob3duLmJzLnRhYicsICQucHJveHkodGhpcy5fcmVkcmF3TmV0d29ya0NoYXJ0cywgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIHJlZHJhdyBvdXRnb2luZyBtZXNzYWdlcyBxdWV1ZSBjaGFydHMgb24gdGFiIGNoYW5nZVxuXHRcdC8vICh0byB3b3JrIGFyb3VuZCBhbiBpc3N1ZSB3aXRoIHRoZSBjaGFydCByZXNpemluZyB0byBkZWZhdWx0IHdpZHRoIHdoZW4gcGFuZSBpcyBoaWRkZW4pXG5cdFx0JCgnI2RzaC1tc2dRdWV1ZVBpbGxzIGFbZGF0YS10b2dnbGU9XCJwaWxsXCJdJykub24oJ3Nob3duLmJzLnRhYicsICQucHJveHkodGhpcy5fcmVkcmF3T3V0TXNnQ2hhcnRzLCB0aGlzKSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gcmVkcmF3IGFsbCBjaGFydHMgaW4gY2FzZSBvZiB3aW5kb3cgcmVzaXplXG5cdFx0JCh3aW5kb3cpLm9uKCdyZXNpemUnLCAkLnByb3h5KHRoaXMuX29uV2luZG93UmVzaXplLCB0aGlzKSk7XG5cdFx0dGhpcy5fb25XaW5kb3dSZXNpemUoKTsgLy8gQWxzbyBkbyBpdCBpbW1lZGlhdGVseVxuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIHNob3cgaGVscCB0b29sdGlwcyBpbiBxdWV1ZXMgc3RhdHVzIHRhYlxuXHRcdCQoJyNkc2gtcXVldWVzJykua2VuZG9Ub29sdGlwKHtcblx0XHRcdGZpbHRlcjogJ2lbdGl0bGVdLmhlbHAnLFxuXHRcdFx0cG9zaXRpb246ICdyaWdodCcsXG5cdFx0XHR3aWR0aDogJzI1MHB4Jyxcblx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIGA8ZGl2IGNsYXNzPVwiaGVscC10b29sdGlwXCI+JHtlLnRhcmdldC5kYXRhKCd0aXRsZScpfTwvZGl2PmA7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gcmVnZW5lcmF0ZSBsaW5rIHRvIG9wZW4gd2ViIHNlcnZlciBleHRlcm5hbCBtYW5hZ2VyIGNvbnNvbGVcblx0XHQkKCcjZHNoLXVzZUh0dHBzQ2hlY2snKS5vbignY2hhbmdlJywgJC5wcm94eSh0aGlzLl9vblVzZUh0dHBzRm9yV3NNYW5hZ2VyQ2hhbmdlLCB0aGlzKSk7XG5cblx0XHQvLyBTZW5kIGluaXRpYWxpemF0aW9uIHJlcXVlc3Rcblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0lOSVQpO1xuXHR9XG5cblx0ZGVzdHJveSgpXG5cdHtcblx0XHQvLyBDYWxsIHN1cGVyIG1ldGhvZFxuXHRcdHN1cGVyLmRlc3Ryb3koKTtcblxuXHRcdC8vIERlc3Ryb3kgc2Nyb2xsaW5nIHRhYnNcblx0XHQkKCcjZHNoLXRhYk5hdmlnYXRvciAjdGFicycpLnNjcm9sbGluZ1RhYnMoJ2Rlc3Ryb3knKTtcblxuXHRcdC8vIFJlbW92ZSBvdGhlciBsaXN0ZW5lcnNcblx0XHQkKCcjZHNoLXJlc2V0QnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2RzaC1wYXVzZUJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNkc2gtcGxheUJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNkc2gtZHVtcFRocmVhZHNCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCdhW2RhdGEtdG9nZ2xlPVwidGFiXCJdJykub2ZmKCdzaG93bi5icy50YWInKTtcblx0XHQkKCdhW2RhdGEtdG9nZ2xlPVwicGlsbFwiXScpLm9mZignc2hvd24uYnMudGFiJyk7XG5cdFx0JCh3aW5kb3cpLm9mZigncmVzaXplJyk7XG5cdFx0JCgnI2RzaC11c2VIdHRwc0NoZWNrJykub2ZmKCdjaGFuZ2UnKTtcblxuXHRcdC8vIFJlbW92ZSB0aHJlYWQgZHVtcCBwYW5lbCBsaXN0ZW5lclxuXHRcdCQoJyNkc2gtdGhyZWFkRHVtcE1vZGFsJykub2ZmKCdoaWRkZW4uYnMubW9kYWwnKTtcblxuXHRcdC8vIENsZWFyIHJlcXVlc3Qgc2NoZWR1bGluZ1xuXHRcdGNsZWFyVGltZW91dCh0aGlzLl9yZXF1ZXN0VGltZXIpO1xuXHR9XG5cblx0b25FeHRlbnNpb25Db21tYW5kKGNvbW1hbmQsIGRhdGEpXG5cdHtcblx0XHQvLyBJbml0aWFsaXphdGlvbiBkYXRhIHJlY2VpdmVkXG5cdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0lOSVQpXG5cdFx0e1xuXHRcdFx0Ly8gU2VydmVyIHNlbmRzIGZsYWdzIGluZGljYXRpbmcgaWYgd2ViIHNlcnZlcidzIGludGVybmFsIG1hbmFnZXIgaXMgYWNjZXNzaWJsZSBhbmQgaG93XG5cdFx0XHR0aGlzLl93c01hbmFnZXJDb25maWcgPSB7XG5cdFx0XHRcdGhhc0FjY2VzczogZGF0YS5nZXRCb29sKCdoYXNXc01hbmFnZXInKSxcblx0XHRcdFx0aHR0cEVuYWJsZWQ6IGRhdGEuZ2V0Qm9vbCgnaHR0cEVuYWJsZWQnKSxcblx0XHRcdFx0aHR0cHNFbmFibGVkOiBkYXRhLmdldEJvb2woJ2h0dHBzRW5hYmxlZCcpLFxuXHRcdFx0XHRodHRwUG9ydDogZGF0YS5nZXRJbnQoJ2h0dHBQb3J0JyksXG5cdFx0XHRcdGh0dHBzUG9ydDogZGF0YS5nZXRJbnQoJ2h0dHBzUG9ydCcpLFxuXHRcdFx0fVxuXG5cdFx0XHQvLyBFbmFibGUgYWNjZXNzIHRvIHdlYiBzZXJ2ZXIgbWFuYWdlciBjb25zb2xlXG5cdFx0XHR0aGlzLl9lbmFibGVXZWJTZXJ2ZXJNYW5hZ2VyQWNjZXNzKCk7XG5cblx0XHRcdC8vIFJlcXVlc3QgZGF0YSB0byBzZXJ2ZXJcblx0XHRcdHRoaXMuX3JlcXVlc3REYXRhKHRydWUpO1xuXHRcdH1cblxuXHRcdC8vIERhdGEgcmVjZWl2ZWRcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9EQVRBKVxuXHRcdHtcblx0XHRcdC8vIENQVSBMT0FEIENIQVJUXG5cblx0XHRcdHRoaXMuX2NwdVVzYWdlQ2hhcnQuYWRkRW50cnkoZGF0YS5nZXREb3VibGUoJ3BDcHUnKSwgZGF0YS5nZXREb3VibGUoJ3NDcHUnKSk7XG5cdFx0XHQkKCcjZHNoLXN5c3RlbUxvYWRMYWJlbCcpLnRleHQoZGF0YS5nZXREb3VibGUoJ3NDcHUnKSk7XG5cdFx0XHQkKCcjZHNoLXByb2Nlc3NMb2FkTGFiZWwnKS50ZXh0KGRhdGEuZ2V0RG91YmxlKCdwQ3B1JykpO1xuXG5cdFx0XHQvLyBBcyBzeXN0ZW0gY3B1IGxvYWQgaXMgbm90IGFsd2F5cyBhdmFpbGFibGUgKGZvciBleGFtcGxlIG9uIE1hY09TIFgpLCBsZXQncyBoaWRlIGl0IGluIGNhc2UgaXQgaXNuJ3Rcblx0XHRcdGlmIChkYXRhLmdldERvdWJsZSgnc0NwdScpIDwgMClcblx0XHRcdFx0JCgnI2RzaC1zeXN0ZW1Mb2FkTGVnZW5kJykuaGlkZSgpO1xuXG5cdFx0XHQvLyBUSFJFQURTIENPVU5UIENIQVJUXG5cblx0XHRcdGNvbnN0IHRocmVhZENvdW50ID0gZGF0YS5nZXRTRlNBcnJheSgndGhMaXN0Jykuc2l6ZSgpO1xuXHRcdFx0dGhpcy5fdGhyZWFkQ291bnRDaGFydC5hZGRFbnRyeSh0aHJlYWRDb3VudCk7XG5cdFx0XHQkKCcjZHNoLXRocmVhZHNDb3VudExhYmVsJykudGV4dCh0aHJlYWRDb3VudCk7XG5cblx0XHRcdC8vIE1FTU9SWSBVU0FHRSBDSEFSVFxuXHRcdFx0Ly8gTk9URTogbWVtb3J5IGRhdGEgaXMgc2VudCBhcyBCeXRlcyBieSB0aGUgc2VydmVyXG5cblx0XHRcdGNvbnN0IGZyZWVNZW0gPSBkYXRhLmdldExvbmcoJ2ZyZWVNZW0nKTtcblx0XHRcdGNvbnN0IG1heE1lbSA9IGRhdGEuZ2V0TG9uZygnbWF4TWVtJyk7XG5cdFx0XHRjb25zdCB0b3RhbE1lbSA9IGRhdGEuZ2V0TG9uZygndG90YWxNZW0nKTtcblx0XHRcdGNvbnN0IHVzZWRNZW0gPSB0b3RhbE1lbSAtIGZyZWVNZW07XG5cblx0XHRcdHRoaXMuX21lbW9yeUNoYXJ0LmFkZEVudHJ5KHRvdGFsTWVtLCB1c2VkTWVtKTtcblx0XHRcdCQoJyNkc2gtbWF4TWVtb3J5TGFiZWwnKS50ZXh0KHRoaXMuX2dldE1lbU9iamVjdChtYXhNZW0pLmxhYmVsKTtcblx0XHRcdCQoJyNkc2gtZnJlZU1lbW9yeUxhYmVsJykudGV4dCh0aGlzLl9nZXRNZW1PYmplY3QoZnJlZU1lbSkubGFiZWwpO1xuXG5cdFx0XHQvLyBUSFJFQURTIExJU1RcblxuXHRcdFx0Y29uc3QgdG90YWxUaHJlYWRDcHVUaW1lID0gZGF0YS5nZXRMb25nKCd0aENwdScpO1xuXHRcdFx0bGV0IHRocmVhZHMgPSBbXTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmdldFNGU0FycmF5KCd0aExpc3QnKS5zaXplKCk7IGkrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IHRocmVhZERhdGEgPSBkYXRhLmdldFNGU0FycmF5KCd0aExpc3QnKS5nZXRTRlNPYmplY3QoaSk7XG5cblx0XHRcdFx0dGhyZWFkcy5wdXNoKHtcblx0XHRcdFx0XHRpZDogdGhyZWFkRGF0YS5nZXRMb25nKCdpZCcpLFxuXHRcdFx0XHRcdG5hbWU6IHRocmVhZERhdGEuZ2V0VXRmU3RyaW5nKCduYW1lJyksXG5cdFx0XHRcdFx0Y3B1VGltZTogTWF0aC5yb3VuZCh0aHJlYWREYXRhLmdldExvbmcoJ2NwdScpIC8gdG90YWxUaHJlYWRDcHVUaW1lICogMTAwMCkgLyAxMFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3Vic3RpdHV0ZSBncmlkJ3MgZGF0YSBzb3VyY2UsIHJldGFpbmluZyBjdXJyZW50IHNvcnRpbmdcblx0XHRcdGxldCBjdXJyU29ydCA9IHRoaXMuX3RocmVhZHNHcmlkLmRhdGFTb3VyY2Uuc29ydCgpO1xuXHRcdFx0dGhpcy5fdGhyZWFkc0dyaWQuc2V0RGF0YVNvdXJjZSh0aGlzLl9nZXRUaHJlYWRzR3JpZERhdGFTb3VyY2UodGhyZWFkcywgY3VyclNvcnQpKTtcblxuXHRcdFx0Ly8gTkVUV09SSyBUUkFGRklDXG5cdFx0XHQvLyBOT1RFOiBuZXR3b3JrIHRyYWZmaWMgZGF0YSBpcyBzZW50IGFzIEtCeXRlcyBieSB0aGUgc2VydmVyXG5cblx0XHRcdGlmIChkYXRhLmNvbnRhaW5zS2V5KCdudE91dEhpc3RvcnknKSlcblx0XHRcdHtcblx0XHRcdFx0Y29uc3Qgb3V0Z29pbmdEYXRhID0gZGF0YS5nZXRMb25nQXJyYXkoJ250T3V0SGlzdG9yeScpO1xuXHRcdFx0XHRjb25zdCBpbmNvbWluZ0RhdGEgPSBkYXRhLmdldExvbmdBcnJheSgnbnRJbkhpc3RvcnknKTtcblx0XHRcdFx0Y29uc3Qgc2FtcGxpbmdSYXRlTWlucyA9IGRhdGEuZ2V0SW50KCdudFJhdGUnKTtcblx0XHRcdFx0Y29uc3Qgc2hpZnRTZWNvbmRzID0gZGF0YS5nZXRJbnQoJ250U2hpZnQnKTtcblxuXHRcdFx0XHR0aGlzLl9uZXR3b3JrMjRoQ2hhcnQuYWRkSGlzdG9yeUVudHJpZXMob3V0Z29pbmdEYXRhLCBpbmNvbWluZ0RhdGEsIHNhbXBsaW5nUmF0ZU1pbnMgKiA2MCwgc2hpZnRTZWNvbmRzKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGN1cnJlbnQgdmFsdWVzXG5cdFx0XHR0aGlzLl9uZXR3b3JrMjRoQ2hhcnQuYWRkRW50cnkoZGF0YS5nZXRMb25nKCdudE91dCcpLCBkYXRhLmdldExvbmcoJ250SW4nKSk7XG5cdFx0XHR0aGlzLl9uZXR3b3JrUlRDaGFydC5hZGRFbnRyeShkYXRhLmdldExvbmcoJ250T3V0JyksIGRhdGEuZ2V0TG9uZygnbnRJbicpKTtcblxuXHRcdFx0Ly8gVFJBRkZJQyBERVRBSUxTXG5cblx0XHRcdC8vIFNlc3Npb25zXG5cdFx0XHQkKCcjZHNoLWRldFNlc3Npb25zQ3VycmVudCcpLnRleHQoJ0N1cnJlbnQ6ICcgKyAoZGF0YS5nZXRJbnQoJ3NTb2NrZXQnKSArIGRhdGEuZ2V0SW50KCdzSHR0cCcpKSk7XG5cdFx0XHQkKCcjZHNoLWRldFNlc3Npb25zTWF4JykudGV4dCgnTWF4OiAnICsgZGF0YS5nZXRJbnQoJ2Njc01heCcpKTtcblx0XHRcdCQoJyNkc2gtZGV0U2Vzc2lvbnNTb2NrZXQnKS50ZXh0KCdTb2NrZXQ6ICcgKyBkYXRhLmdldEludCgnc1NvY2tldCcpKTtcblx0XHRcdCQoJyNkc2gtZGV0U2Vzc2lvbnNIdHRwJykudGV4dCgnSHR0cDogJyArIGRhdGEuZ2V0SW50KCdzSHR0cCcpKTtcblxuXHRcdFx0Ly8gVXNlcnNcblx0XHRcdCQoJyNkc2gtZGV0VXNlcnNDdXJyZW50JykudGV4dCgnQ3VycmVudDogJyArIChkYXRhLmdldEludCgndVNvY2tldCcpICsgZGF0YS5nZXRJbnQoJ3VIdHRwJykgKyBkYXRhLmdldEludCgndU5wYycpKSk7XG5cdFx0XHQkKCcjZHNoLWRldFVzZXJzTWF4JykudGV4dCgnTWF4OiAnICsgZGF0YS5nZXRJbnQoJ2NjdU1heCcpKTtcblx0XHRcdCQoJyNkc2gtZGV0VXNlcnNTb2NrZXQnKS50ZXh0KCdTb2NrZXQ6ICcgKyBkYXRhLmdldEludCgndVNvY2tldCcpKTtcblx0XHRcdCQoJyNkc2gtZGV0VXNlcnNIdHRwJykudGV4dCgnSHR0cDogJyArIGRhdGEuZ2V0SW50KCd1SHR0cCcpKTtcblx0XHRcdCQoJyNkc2gtZGV0VXNlcnNOcGMnKS50ZXh0KCdOcGM6ICcgKyBkYXRhLmdldEludCgndU5wYycpKTtcblxuXHRcdFx0Ly8gUm9vbXNcblx0XHRcdCQoJyNkc2gtZGV0Um9vbXMnKS50ZXh0KGRhdGEuZ2V0SW50KCdyVG90YWwnKSk7XG5cdFx0XHQkKCcjZHNoLWRldFJvb21zUmVndWxhcicpLnRleHQoJ1JlZ3VsYXI6ICcgKyAoZGF0YS5nZXRJbnQoJ3JUb3RhbCcpIC0gZGF0YS5nZXRJbnQoJ3JHYW1lJykpKTtcblx0XHRcdCQoJyNkc2gtZGV0Um9vbXNHYW1lJykudGV4dCgnR2FtZTogJyArIGRhdGEuZ2V0SW50KCdyR2FtZScpKTtcblxuXHRcdFx0Ly8gVG90YWwgZGF0YSB0cmFuc2ZlclxuXHRcdFx0JCgnI2RzaC1kZXREYXRhVHJhbnNmZXJPdXQnKS50ZXh0KCdPdXQ6ICcgKyBrQnl0ZXNUb1NpemUoZGF0YS5nZXRMb25nKCdudE91dCcpKSk7XG5cdFx0XHQkKCcjZHNoLWRldERhdGFUcmFuc2ZlckluJykudGV4dCgnSW46ICcgKyBrQnl0ZXNUb1NpemUoZGF0YS5nZXRMb25nKCdudEluJykpKTtcblxuXHRcdFx0Ly8gQ3VycmVudCBkYXRhIHRyYW5zZmVyIHJhdGVcblx0XHRcdGxldCBvYmogPSB0aGlzLl9uZXR3b3JrUlRDaGFydC5nZXRMYXN0RW50cnkoKTtcblxuXHRcdFx0aWYgKG9iaiA9PSBudWxsKVxuXHRcdFx0XHRvYmogPSB7b3V0Z29pbmc6IDAsIGluY29taW5nOiAwfTtcblxuXHRcdFx0JCgnI2RzaC1kZXRUcmFuc2ZlclJhdGVPdXQnKS50ZXh0KCdPdXQ6ICcgKyBrQnl0ZXNUb1NpemUob2JqLm91dGdvaW5nLCAyLCAnS0InLCAnL3MnKSk7XG5cdFx0XHQkKCcjZHNoLWRldFRyYW5zZmVyUmF0ZUluJykudGV4dCgnSW46ICcgKyBrQnl0ZXNUb1NpemUob2JqLmluY29taW5nLCAyLCAnS0InLCAnL3MnKSk7XG5cblx0XHRcdC8vIEF2ZXJhZ2UgZGF0YSB0cmFuc2ZlciByYXRlIG92ZXIgd2hvbGUgdXB0aW1lXG5cdFx0XHRpZiAodGhpcy5fdXB0aW1lU2VjcyA+IDApXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGF2Z091dCA9IE1hdGgucm91bmQoZGF0YS5nZXRMb25nKCdudE91dCcpIC8gdGhpcy5fdXB0aW1lU2VjcyAqIDEwMCkgLyAxMDA7XG5cdFx0XHRcdGNvbnN0IGF2Z0luID0gTWF0aC5yb3VuZChkYXRhLmdldExvbmcoJ250SW4nKSAvIHRoaXMuX3VwdGltZVNlY3MgKiAxMDApIC8gMTAwO1xuXG5cdFx0XHRcdCQoJyNkc2gtZGV0QXZnVHJhbnNmZXJSYXRlT3V0JykudGV4dCgnT3V0OiAnICsga0J5dGVzVG9TaXplKGF2Z091dCwgMiwgJ0tCJywgJy9zJykpO1xuXHRcdFx0XHQkKCcjZHNoLWRldEF2Z1RyYW5zZmVyUmF0ZUluJykudGV4dCgnSW46ICcgKyBrQnl0ZXNUb1NpemUoYXZnSW4sIDIsICdLQicsICcvcycpKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRHJvcHBlZCBwYWNrZXRzXG5cdFx0XHRjb25zdCB0b3RhbFBhY2tldHNPdXQgPSBkYXRhLmdldExvbmcoJ3BrdE91dCcpO1xuXG5cdFx0XHRjb25zdCB0b3RhbERyb3BwZWRUY3BQYWNrZXRzT3V0ID0gZGF0YS5nZXRMb25nKCdwa3RPdXREcm9wJyk7XG5cdFx0XHQkKCcjZHNoLWRldERyb3BwZWRUY3BQYWNrZXRzT3V0JykudGV4dChgT3V0IFRDUDogJHt0b3RhbERyb3BwZWRUY3BQYWNrZXRzT3V0fSAoJHtNYXRoLnJvdW5kKHRvdGFsRHJvcHBlZFRjcFBhY2tldHNPdXQgLyB0b3RhbFBhY2tldHNPdXQgKiAxMDApfSUpYCk7XG5cblx0XHRcdGNvbnN0IHRvdGFsRHJvcHBlZFVkcFBhY2tldHNPdXQgPSBkYXRhLmdldExvbmcoJ3BrdE91dFVkcERyb3AnKTtcblx0XHRcdCQoJyNkc2gtZGV0RHJvcHBlZFVkcFBhY2tldHNPdXQnKS50ZXh0KGBPdXQgVURQOiAke3RvdGFsRHJvcHBlZFVkcFBhY2tldHNPdXR9ICgke01hdGgucm91bmQodG90YWxEcm9wcGVkVWRwUGFja2V0c091dCAvIHRvdGFsUGFja2V0c091dCAqIDEwMCl9JSlgKTtcblxuXHRcdFx0Y29uc3QgdG90YWxQYWNrZXRzSW4gPSBkYXRhLmdldExvbmcoJ3BrdEluJyk7XG5cdFx0XHRjb25zdCB0b3RhbERyb3BwZWRQYWNrZXRzSW4gPSBkYXRhLmdldExvbmcoJ3BrdEluRHJvcCcpO1xuXHRcdFx0JCgnI2RzaC1kZXREcm9wcGVkUGFja2V0c0luJykudGV4dChgSW46ICR7dG90YWxEcm9wcGVkUGFja2V0c0lufSAoJHtNYXRoLnJvdW5kKHRvdGFsRHJvcHBlZFBhY2tldHNJbiAvIHRvdGFsUGFja2V0c0luICogMTAwKX0lKWApO1xuXG5cdFx0XHQvLyBTWVNURU0gU1RBVFVTXG5cblx0XHRcdC8vIE91dGdvaW5nIFRDUCBtZXNzYWdlcyBxdWV1ZVxuXHRcdFx0Y29uc3Qgb3V0TXNnUXVldWUgPSBkYXRhLmdldEludCgnb3V0TXNnUXVldWUnKTtcblx0XHRcdGNvbnN0IG91dE1zZ1F1ZXVlTWF4ID0gZGF0YS5nZXRJbnQoJ291dE1zZ1F1ZXVlTWF4Jyk7XG5cdFx0XHR0aGlzLl9vdXRUY3BNc2dRdWV1ZUNoYXJ0LmFkZEVudHJ5KG91dE1zZ1F1ZXVlLCBvdXRNc2dRdWV1ZU1heCk7XG5cdFx0XHR0aGlzLl90Y3BPdXRUaHJlYWRzID0gZGF0YS5nZXRJbnQoJ291dE1zZ1RoJyk7XG5cdFx0XHR0aGlzLl90Y3BPdXRMb2FkID0gdGhpcy5fb3V0VGNwTXNnUXVldWVDaGFydC5sb2FkO1xuXG5cdFx0XHQvLyBPdXRnb2luZyBVRFAgbWVzc2FnZXMgcXVldWVcblx0XHRcdGNvbnN0IG91dFVkcE1zZ1F1ZXVlID0gZGF0YS5nZXRJbnQoJ291dFVkcE1zZ1F1ZXVlJyk7XG5cdFx0XHRjb25zdCBvdXRVZHBNc2dRdWV1ZU1heCA9IGRhdGEuZ2V0SW50KCdvdXRVZHBNc2dRdWV1ZU1heCcpO1xuXHRcdFx0dGhpcy5fb3V0VWRwTXNnUXVldWVDaGFydC5hZGRFbnRyeShvdXRVZHBNc2dRdWV1ZSwgb3V0VWRwTXNnUXVldWVNYXgpO1xuXHRcdFx0dGhpcy5fdWRwT3V0VGhyZWFkcyA9IGRhdGEuZ2V0SW50KCdvdXRVZHBNc2dUaCcpO1xuXHRcdFx0dGhpcy5fdWRwT3V0TG9hZCA9IHRoaXMuX291dFVkcE1zZ1F1ZXVlQ2hhcnQubG9hZDtcblxuXHRcdFx0dGhpcy5fdXBkYXRlT3V0TWVzc2FnZXNRdWV1ZVN0YXR1cygpO1xuXG5cdFx0XHQvLyBTeXN0ZW0gQ29udHJvbGxlciByZXF1ZXN0cyBxdWV1ZVxuXHRcdFx0Y29uc3Qgc3lzQ3RybFF1ZXVlID0gZGF0YS5nZXRJbnQoJ3N5c0N0cmxRdWV1ZScpO1xuXHRcdFx0Y29uc3Qgc3lzQ3RybFF1ZXVlTWF4ID0gZGF0YS5nZXRJbnQoJ3N5c0N0cmxRdWV1ZU1heCcpO1xuXHRcdFx0dGhpcy5fc3lzUXVldWVDaGFydC5hZGRFbnRyeShzeXNDdHJsUXVldWUsIHN5c0N0cmxRdWV1ZU1heCk7XG5cdFx0XHQkKCcjZHNoLXN5c3RlbVF1ZXVlVGhyZWFkcycpLnRleHQodGhpcy5fZ2V0UXVldWVUaHJlYWRzTGFiZWwoZGF0YS5nZXRJbnQoJ3N5c0N0cmxUaCcpKSk7XG5cdFx0XHQkKCcjZHNoLXN5c3RlbVF1ZXVlTG9hZCcpLnRleHQodGhpcy5fZ2V0UXVldWVMb2FkTGFiZWwodGhpcy5fc3lzUXVldWVDaGFydC5sb2FkKSk7XG5cblx0XHRcdC8vIEV4dGVuc2lvbiBDb250cm9sbGVyIHJlcXVlc3RzIHF1ZXVlXG5cdFx0XHRjb25zdCBleHRDdHJsUXVldWUgPSBkYXRhLmdldEludCgnZXh0Q3RybFF1ZXVlJyk7XG5cdFx0XHRjb25zdCBleHRDdHJsUXVldWVNYXggPSBkYXRhLmdldEludCgnZXh0Q3RybFF1ZXVlTWF4Jyk7XG5cdFx0XHR0aGlzLl9leHRRdWV1ZUNoYXJ0LmFkZEVudHJ5KGV4dEN0cmxRdWV1ZSwgZXh0Q3RybFF1ZXVlTWF4KTtcblx0XHRcdCQoJyNkc2gtZXh0ZW5zaW9uUXVldWVUaHJlYWRzJykudGV4dCh0aGlzLl9nZXRRdWV1ZVRocmVhZHNMYWJlbChkYXRhLmdldEludCgnZXh0Q3RybFRoJykpKTtcblx0XHRcdCQoJyNkc2gtZXh0ZW5zaW9uUXVldWVMb2FkJykudGV4dCh0aGlzLl9nZXRRdWV1ZUxvYWRMYWJlbCh0aGlzLl9zeXNRdWV1ZUNoYXJ0LmxvYWQpKTtcblxuXHRcdFx0Ly8gRXZhbHVhdGUgb3ZlcmFsbCBzeXN0ZW0gd29ya2xvYWRcblx0XHRcdGxldCBzeXNXb3JrbG9hZCA9IE1hdGgucm91bmQoKG91dE1zZ1F1ZXVlIC8gb3V0TXNnUXVldWVNYXggK1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQgIG91dFVkcE1zZ1F1ZXVlIC8gb3V0VWRwTXNnUXVldWVNYXggK1xuXHRcdFx0XHQgXHRcdFx0XHRcdFx0ICBzeXNDdHJsUXVldWUgLyBzeXNDdHJsUXVldWVNYXggK1xuXHRcdFx0XHQgXHRcdFx0XHRcdCAgXHQgIGV4dEN0cmxRdWV1ZSAvIGV4dEN0cmxRdWV1ZU1heCkgKiAxMDAgLyA0KTtcblx0XHRcdGlmIChzeXNXb3JrbG9hZCA+IDEwMClcblx0XHRcdFx0c3lzV29ya2xvYWQgPSAxMDA7XG5cblx0XHRcdHRoaXMuX3N5c1dvcmtsb2FkQ2hhcnQuYWRkRW50cnkoc3lzV29ya2xvYWQpO1xuXHRcdH1cblxuXHRcdC8vIFRocmVhZCBkdW1wIHJlY2VpdmVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfVEhSRUFEX0RVTVApXG5cdFx0e1xuXHRcdFx0Ly8gRW5hYmxlIGJ1dHRvblxuXHRcdFx0JCgnI2RzaC1kdW1wVGhyZWFkc0J0JykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cblx0XHRcdC8vIFNldCByZXN1bHRcblx0XHRcdCQoJyNkc2gtdGhyZWFkRHVtcFJlc3VsdCcpLnRleHQoZGF0YS5nZXRUZXh0KCdkdW1wJykpO1xuXG5cdFx0XHQvLyBEaXNwbGF5IG1vZGFsXG5cdFx0XHQkKCcjZHNoLXRocmVhZER1bXBNb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG5cdFx0fVxuXHR9XG5cblx0b25VcHRpbWVVcGRhdGVkKHZhbHVlcylcblx0e1xuXHRcdHRoaXMuX3VwdGltZVNlY3MgPSB2YWx1ZXNbM107XG5cdFx0dGhpcy5fdXB0aW1lU2VjcyArPSAodmFsdWVzWzJdICogNjApO1xuXHRcdHRoaXMuX3VwdGltZVNlY3MgKz0gKHZhbHVlc1sxXSAqIDYwICogNjApO1xuXHRcdHRoaXMuX3VwdGltZVNlY3MgKz0gKHZhbHVlc1swXSAqIDI0ICogNjAgKiA2MCk7XG5cblx0XHQkKCcjZHNoLXVwdGltZURheXMnKS50ZXh0KCAodmFsdWVzWzBdIDw9IDkgPyAnMDAnIDogKHZhbHVlc1swXSA8PSA5OSA/ICcwJyA6ICcnKSkgKyB2YWx1ZXNbMF0gKTtcblx0XHQkKCcjZHNoLXVwdGltZUhvdXJzJykudGV4dCggKHZhbHVlc1sxXSA8PSA5ID8gJzAnIDogJycpICsgdmFsdWVzWzFdICk7XG5cdFx0JCgnI2RzaC11cHRpbWVNaW51dGVzJykudGV4dCggKHZhbHVlc1syXSA8PSA5ID8gJzAnIDogJycpICsgdmFsdWVzWzJdICk7XG5cdFx0JCgnI2RzaC11cHRpbWVTZWNvbmRzJykudGV4dCggKHZhbHVlc1szXSA8PSA5ID8gJzAnIDogJycpICsgdmFsdWVzWzNdICk7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBVSSBFVkVOVCBMSVNURU5FUlNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfb25VcGRhdGVJbnRlcnZhbENoYW5nZSgpXG5cdHtcblx0XHQvLyBSZXF1ZXN0IGRhdGEgdG8gc2VydmVyXG5cdFx0dGhpcy5fcmVxdWVzdERhdGEoKTtcblx0fVxuXG5cdF9vblBhdXNlVXBkYXRlQ2xpY2soKVxuXHR7XG5cdFx0dGhpcy5fc2V0Q2hhcnRVcGRhdGVQYXVzZWQodHJ1ZSk7XG5cblx0XHQvLyBIaWRlIHBhdXNlIGJ1dHRvbiBhbmQgc2hvdyBwbGF5IGJ1dHRvblxuXHRcdCQoJyNkc2gtcGF1c2VCdCcpLmFkZENsYXNzKCdoaWRkZW4nKTtcblx0XHQkKCcjZHNoLXBsYXlCdCcpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcblx0fVxuXG5cdF9vblBsYXlVcGRhdGVDbGljaygpXG5cdHtcblx0XHR0aGlzLl9zZXRDaGFydFVwZGF0ZVBhdXNlZChmYWxzZSk7XG5cblx0XHQvLyBIaWRlIHBsYXkgYnV0dG9uIGFuZCBzaG93IHBhdXNlIGJ1dHRvblxuXHRcdCQoJyNkc2gtcGF1c2VCdCcpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcblx0XHQkKCcjZHNoLXBsYXlCdCcpLmFkZENsYXNzKCdoaWRkZW4nKTtcblx0fVxuXG5cdF9vblJlc2V0Q2hhcnRzQ2xpY2soKVxuXHR7XG5cdFx0Ly8gUmVhY3RpdmF0ZSByZWFsdGltZSBjaGFydHMgdXBkYXRlXG5cdFx0dGhpcy5fb25QbGF5VXBkYXRlQ2xpY2soKTtcblxuXHRcdC8vIFJlc2V0IHJlYWx0aW1lIGNoYXJ0c1xuXHRcdHRoaXMuX2NwdVVzYWdlQ2hhcnQucmVzZXQoKTtcblx0XHR0aGlzLl90aHJlYWRDb3VudENoYXJ0LnJlc2V0KCk7XG5cdFx0dGhpcy5fbWVtb3J5Q2hhcnQucmVzZXQoKTtcblx0XHR0aGlzLl9uZXR3b3JrUlRDaGFydC5yZXNldCgpO1xuXHRcdHRoaXMuX3N5c1dvcmtsb2FkQ2hhcnQucmVzZXQoKTtcblx0XHR0aGlzLl9vdXRUY3BNc2dRdWV1ZUNoYXJ0LnJlc2V0KCk7XG5cdFx0dGhpcy5fb3V0VWRwTXNnUXVldWVDaGFydC5yZXNldCgpO1xuXHRcdHRoaXMuX3N5c1F1ZXVlQ2hhcnQucmVzZXQoKTtcblx0XHR0aGlzLl9leHRRdWV1ZUNoYXJ0LnJlc2V0KCk7XG5cdH1cblxuXHRfcmVkcmF3TmV0d29ya0NoYXJ0cygpXG5cdHtcblx0XHQvLyBSZWRyYXcgY2hhcnRzXG5cdFx0dGhpcy5fbmV0d29ya1JUQ2hhcnQucmVkcmF3KCk7XG5cdFx0dGhpcy5fbmV0d29yazI0aENoYXJ0LnJlZHJhdygpO1xuXG5cdFx0Ly8gUmVkcmF3IHRpbWUgcmFuZ2Ugc2xpZGVyXG5cdFx0dGhpcy5fdGltZVNsaWRlci5yZXNpemUoKTtcblx0fVxuXG5cdF9yZWRyYXdPdXRNc2dDaGFydHMoKVxuXHR7XG5cdFx0Ly8gUmVkcmF3IGNoYXJ0c1xuXHRcdHRoaXMuX291dFRjcE1zZ1F1ZXVlQ2hhcnQucmVkcmF3KCk7XG5cdFx0dGhpcy5fb3V0VWRwTXNnUXVldWVDaGFydC5yZWRyYXcoKTtcblxuXHRcdHRoaXMuX3VwZGF0ZU91dE1lc3NhZ2VzUXVldWVTdGF0dXMoKTtcblx0fVxuXG5cdF9vbldpbmRvd1Jlc2l6ZSgpXG5cdHtcblx0XHQvLyBSZWRyYXcgYWxsIGdsb2JhbCBjaGFydHNcblx0XHR0aGlzLl9jcHVVc2FnZUNoYXJ0LnJlZHJhdygpO1xuXHRcdHRoaXMuX3RocmVhZENvdW50Q2hhcnQucmVkcmF3KCk7XG5cdFx0dGhpcy5fbWVtb3J5Q2hhcnQucmVkcmF3KCk7XG5cdFx0dGhpcy5fcmVkcmF3TmV0d29ya0NoYXJ0cygpO1xuXG5cdFx0Ly8gUmVkcmF3IGFsbCBxdWV1ZSBjaGFydHNcblx0XHR0aGlzLl9zeXNXb3JrbG9hZENoYXJ0LnJlZHJhdygpO1xuXHRcdHRoaXMuX3N5c1F1ZXVlQ2hhcnQucmVkcmF3KCk7XG5cdFx0dGhpcy5fZXh0UXVldWVDaGFydC5yZWRyYXcoKTtcblx0XHR0aGlzLl9yZWRyYXdPdXRNc2dDaGFydHMoKTtcblx0fVxuXG5cdF9vblRpbWVSYW5nZUNoYW5nZSgpXG5cdHtcblx0XHRsZXQgdmFsdWVzID0gdGhpcy5fdGltZVNsaWRlci52YWx1ZSgpO1xuXG5cdFx0aWYgKHZhbHVlc1swXSA9PSB2YWx1ZXNbMV0pXG5cdFx0e1xuXHRcdFx0aWYgKHZhbHVlc1sxXSA9PSAtMjQpXG5cdFx0XHRcdHZhbHVlc1sxXSA9IC0yMztcblxuXHRcdFx0dmFsdWVzWzBdID0gdmFsdWVzWzFdIC0gMTtcblxuXHRcdFx0Ly8gUmVzZXQgdGhlIHRpbWUgcmFuZ2Ugc2xpZGVyIHZhbHVlICh3ZSBuZWVkIHRvIHVzZSBzZXRUaW1lb3V0XG5cdFx0XHQvLyBiYWNhdXNlIGRvaW5nIGl0IGluIHRoZSBjaGFuZ2UgZXZlbnQgbGlzdGVuZXIgZG9lc24ndCByZWRyYXcgdGhlIHNsaWRlcilcblx0XHRcdHNldFRpbWVvdXQoJC5wcm94eSggZnVuY3Rpb24odmFsdWVzKSB7IHRoaXMuX3RpbWVTbGlkZXIudmFsdWUodmFsdWVzKTsgfSwgdGhpcyksIDEwLCB2YWx1ZXMpO1xuXHRcdH1cblxuXHRcdHRoaXMuX25ldHdvcmsyNGhDaGFydC5yYW5nZSA9IHZhbHVlcztcblx0fVxuXG5cdF9vblVzZUh0dHBzRm9yV3NNYW5hZ2VyQ2hhbmdlKClcblx0e1xuXHRcdGNvbnN0IHdzTWFuID0gdGhpcy5fd3NNYW5hZ2VyQ29uZmlnO1xuXG5cdFx0bGV0IHVybCA9ICgkKCcjZHNoLXVzZUh0dHBzQ2hlY2snKS5wcm9wKCdjaGVja2VkJykgPyAnaHR0cHMnIDogJ2h0dHAnKSArICc6Ly8nO1xuXHRcdHVybCArPSB0aGlzLnNtYXJ0Rm94LmNvbmZpZy5ob3N0O1xuXHRcdHVybCArPSAnOicgKyAoJCgnI2RzaC11c2VIdHRwc0NoZWNrJykucHJvcCgnY2hlY2tlZCcpID8gd3NNYW4uaHR0cHNQb3J0IDogd3NNYW4uaHR0cFBvcnQpO1xuXHRcdHVybCArPSAnL21hbmFnZXIvc3RhdHVzJztcblxuXHRcdCQoJyNkc2gtdG9Xc01hbmFnZXJCdCcpLmF0dHIoJ2hyZWYnLCB1cmwpO1xuXHR9XG5cblx0X29uRHVtcFRocmVhZHNDbGljaygpXG5cdHtcblx0XHQvLyBEaXNhYmxlIGJ1dHRvblxuXHRcdCQoJyNkc2gtZHVtcFRocmVhZHNCdCcpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cblx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gZXh0ZW5zaW9uXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9EVU1QX1RIUkVBRFMpO1xuXHR9XG5cblx0X29uQ29weVRocmVhZER1bXBDbGljaygpXG5cdHtcblx0XHQkKCcjZHNoLXRocmVhZER1bXBSZXN1bHQnKS5hdHRyKCdjb250ZW50ZWRpdGFibGUnLCB0cnVlKTtcblx0XHQkKCcjZHNoLXRocmVhZER1bXBSZXN1bHQnKS5hdHRyKCdzcGVsbGNoZWNrJywgZmFsc2UpO1xuXHRcdCQoJyNkc2gtdGhyZWFkRHVtcFJlc3VsdCcpLmZvY3VzKCk7XG5cdFx0ZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ3NlbGVjdEFsbCcpO1xuXHRcdGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG5cdFx0d2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpO1xuXHRcdCQoJyNkc2gtdGhyZWFkRHVtcFJlc3VsdCcpLmJsdXIoKTtcblx0XHQkKCcjZHNoLXRocmVhZER1bXBSZXN1bHQnKS5hdHRyKCdjb250ZW50ZWRpdGFibGUnLCBmYWxzZSk7XG5cdH1cblxuXHRfb25UaHJlYWREdW1wTW9kYWxIaWRkZW4oKVxuXHR7XG5cdFx0Ly8gQ2xlYXIgbW9kYWwgY29udGVudFxuXHRcdCQoJyNkc2gtdGhyZWFkRHVtcFJlc3VsdCcpLnRleHQoJycpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBNRVRIT0RTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X2VuYWJsZVdlYlNlcnZlck1hbmFnZXJBY2Nlc3MoKVxuXHR7XG5cdFx0Y29uc3Qgd3NNYW4gPSB0aGlzLl93c01hbmFnZXJDb25maWc7XG5cblx0XHRpZiAod3NNYW4uaGFzQWNjZXNzICYmICh3c01hbi5odHRwRW5hYmxlZCB8fCB3c01hbi5odHRwc0VuYWJsZWQpKVxuXHRcdHtcblx0XHRcdC8vIEhpZGUgYWxlcnRcblx0XHRcdCQoJyNkc2gtd3NNYW5hZ2VyQWxlcnQnKS5oaWRlKCk7XG5cblx0XHRcdC8vIEVuYWJsZSBidXR0b25cblx0XHRcdCQoJyNkc2gtdG9Xc01hbmFnZXJCdCcpLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpO1xuXG5cdFx0XHQvLyBTZXQgY2hlY2tib3hcblx0XHRcdCQoJyNkc2gtdXNlSHR0cHNDaGVjaycpLnByb3AoJ2NoZWNrZWQnLCB3c01hbi5odHRwc0VuYWJsZWQpO1xuXHRcdFx0JCgnI2RzaC11c2VIdHRwc0NoZWNrJykuYXR0cignZGlzYWJsZWQnLCAhd3NNYW4uaHR0cEVuYWJsZWQgfHwgIXdzTWFuLmh0dHBzRW5hYmxlZCk7XG5cblx0XHRcdC8vIEdlbmVyYXRlIGxpbmtcblx0XHRcdHRoaXMuX29uVXNlSHR0cHNGb3JXc01hbmFnZXJDaGFuZ2UoKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdC8vIFNob3cgYWxlcnRcblx0XHRcdCQoJyNkc2gtd3NNYW5hZ2VyQWxlcnQnKS5zaG93KCk7XG5cblx0XHRcdGlmICghd3NNYW4uaGFzQWNjZXNzKVxuXHRcdFx0XHQkKCcjZHNoLXdzTWFuYWdlckFsZXJ0JykuaHRtbCgnQWNjZXNzIHRvIFRvbWNhdCBNYW5hZ2VyIGNvbnNvbGUgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHVzZXIgdG8gYmUgZGVmaW5lZCBpbiA8ZW0+V2ViIFNlcnZlcjwvZW0+IHRhYiBvZiA8c3Ryb25nPlNlcnZlciBDb25maWd1cmF0b3I8L3N0cm9uZz4gbW9kdWxlLicpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHQkKCcjZHNoLXdzTWFuYWdlckFsZXJ0JykuaHRtbCgnQWNjZXNzIHRvIFRvbWNhdCBNYW5hZ2VyIGNvbnNvbGUgcmVxdWlyZXMgZWl0aGVyIEhUVFAgb3IgSFRUUFMgdG8gYmUgZW5hYmxlZCBpbiA8ZW0+V2ViIFNlcnZlcjwvZW0+IHRhYiBvZiA8c3Ryb25nPlNlcnZlciBDb25maWd1cmF0b3I8L3N0cm9uZz4gbW9kdWxlLicpO1xuXG5cdFx0XHQvLyBEaXNhYmxlIGJ1dHRvblxuXHRcdFx0JCgnI2RzaC10b1dzTWFuYWdlckJ0JykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblxuXHRcdFx0Ly8gRGlzYWJsZSBjaGVja2JveFxuXHRcdFx0JCgnI2RzaC11c2VIdHRwc0NoZWNrJykuYXR0cignY2hlY2tlZCcsIHdzTWFuLmh0dHBzRW5hYmxlZCk7XG5cdFx0XHQkKCcjZHNoLXVzZUh0dHBzQ2hlY2snKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCdWlsZCB0aGUgcG9sbGluZyByZXF1ZXN0IHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlci5cblx0ICovXG5cdF9yZXF1ZXN0RGF0YShnZXRIaXN0b3J5ID0gZmFsc2UpXG5cdHtcblx0XHQvLyBDbGVhciBwcmV2aW91cyByZXF1ZXN0IHNjaGVkdWxpbmdcblx0XHRjbGVhclRpbWVvdXQodGhpcy5fcmVxdWVzdFRpbWVyKTtcblxuXHRcdC8vIENoZWNrIGlmIGNvbm5lY3Rpb24gaXMgc3RpbGwgYXZhaWxhYmxlXG5cdFx0aWYgKHRoaXMuc21hcnRGb3guaXNDb25uZWN0ZWQpXG5cdFx0e1xuXHRcdFx0Ly8gQnVpbGQgcmVxdWVzdCBwYXJhbWV0ZXJzXG5cdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXG5cdFx0XHRpZiAoZ2V0SGlzdG9yeSlcblx0XHRcdFx0cGFyYW1zLnB1dEJvb2woJ2hpc3RvcnknLCB0cnVlKTtcblxuXHRcdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIGV4dGVuc2lvblxuXHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9HRVRfREFUQSwgcGFyYW1zKTtcblxuXHRcdFx0Ly8gU2NoZWR1bGUgbmV4dCByZXF1ZXN0XG5cdFx0XHR0aGlzLl9yZXF1ZXN0VGltZXIgPSBzZXRUaW1lb3V0KCQucHJveHkodGhpcy5fcmVxdWVzdERhdGEsIHRoaXMpLCBOdW1iZXIodGhpcy5faW50ZXJ2YWxEcm9wRG93bi52YWx1ZSgpKSAqIDEwMDApO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRNZW1PYmplY3QoYnl0ZXMpXG5cdHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZGF0YTogYnl0ZXMsXG5cdFx0XHRsYWJlbDogYnl0ZXNUb1NpemUoYnl0ZXMpXG5cdFx0fTtcblx0fVxuXG5cdF9zZXRDaGFydFVwZGF0ZVBhdXNlZChwYXVzZWQpXG5cdHtcblx0XHQvLyBQYXVzZS9yZWFjdGl2YXRlIHJlYWx0aW1lIGNoYXJ0c1xuXHRcdHRoaXMuX2NwdVVzYWdlQ2hhcnQucGF1c2VkID0gcGF1c2VkO1xuXHRcdHRoaXMuX3RocmVhZENvdW50Q2hhcnQucGF1c2VkID0gcGF1c2VkO1xuXHRcdHRoaXMuX21lbW9yeUNoYXJ0LnBhdXNlZCA9IHBhdXNlZDtcblx0XHR0aGlzLl9uZXR3b3JrUlRDaGFydC5wYXVzZWQgPSBwYXVzZWQ7XG5cdFx0dGhpcy5fc3lzV29ya2xvYWRDaGFydC5wYXVzZWQgPSBwYXVzZWQ7XG5cdFx0dGhpcy5fb3V0VGNwTXNnUXVldWVDaGFydC5wYXVzZWQgPSBwYXVzZWQ7XG5cdFx0dGhpcy5fc3lzUXVldWVDaGFydC5wYXVzZWQgPSBwYXVzZWQ7XG5cdFx0dGhpcy5fZXh0UXVldWVDaGFydC5wYXVzZWQgPSBwYXVzZWQ7XG5cdH1cblxuXHRfZ2V0VGhyZWFkc0dyaWREYXRhU291cmNlKGl0ZW1zLCBzb3J0KVxuXHR7XG5cdFx0aWYgKCFpdGVtcylcblx0XHRcdGl0ZW1zID0gJyc7XG5cblx0XHRpZiAoIXNvcnQpXG5cdFx0e1xuXHRcdFx0c29ydCA9IHtcblx0XHRcdFx0ZmllbGQ6ICdjcHVUaW1lJyxcblx0XHRcdFx0ZGlyOiAnZGVzYydcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBrZW5kby5kYXRhLkRhdGFTb3VyY2Uoe1xuXHRcdFx0c2NoZW1hOiB7XG5cdFx0XHRcdG1vZGVsOiB7XG5cdFx0XHRcdFx0aWQ6ICdpZCdcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHNvcnQ6IHNvcnQsXG5cdFx0XHRkYXRhOiBpdGVtc1xuXHRcdH0pO1xuXHR9XG5cblx0X2dldFF1ZXVlVGhyZWFkc0xhYmVsKHRocmVhZHNOdW0pXG5cdHtcblx0XHRyZXR1cm4gYFRocmVhZHM6ICR7dGhyZWFkc051bX1gO1xuXHR9XG5cblx0X2dldFF1ZXVlTG9hZExhYmVsKGxvYWQpXG5cdHtcblx0XHRyZXR1cm4gYEF2Zy4gbWVzc2FnZXM6ICR7bG9hZH1gO1xuXHR9XG5cblx0X3VwZGF0ZU91dE1lc3NhZ2VzUXVldWVTdGF0dXMoKVxuXHR7XG5cdFx0bGV0IHRocmVhZHNTdHIgPSB0aGlzLl9nZXRRdWV1ZVRocmVhZHNMYWJlbCgnLS0nKTtcblx0XHRsZXQgbG9hZFN0ciA9IHRoaXMuX2dldFF1ZXVlTG9hZExhYmVsKCctLScpO1xuXG5cdFx0aWYgKCQoJyNkc2gtdGNwUGlsbCcpLmhhc0NsYXNzKCdhY3RpdmUnKSlcblx0XHR7XG5cdFx0XHR0aHJlYWRzU3RyID0gdGhpcy5fZ2V0UXVldWVUaHJlYWRzTGFiZWwodGhpcy5fdGNwT3V0VGhyZWFkcyk7XG5cdFx0XHRsb2FkU3RyID0gdGhpcy5fZ2V0UXVldWVMb2FkTGFiZWwodGhpcy5fdGNwT3V0TG9hZCk7XG5cdFx0fVxuXG5cdFx0aWYgKCQoJyNkc2gtdWRwUGlsbCcpLmhhc0NsYXNzKCdhY3RpdmUnKSlcblx0XHR7XG5cdFx0XHR0aHJlYWRzU3RyID0gdGhpcy5fZ2V0UXVldWVUaHJlYWRzTGFiZWwodGhpcy5fdWRwT3V0VGhyZWFkcyk7XG5cdFx0XHRsb2FkU3RyID0gdGhpcy5fZ2V0UXVldWVMb2FkTGFiZWwodGhpcy5fdWRwT3V0TG9hZCk7XG5cdFx0fVxuXG5cdFx0JCgnI2RzaC1vdXRnb2luZ01lc3NhZ2VzUXVldWVUaHJlYWRzJykudGV4dCh0aHJlYWRzU3RyKTtcblx0XHQkKCcjZHNoLW91dGdvaW5nTWVzc2FnZXNRdWV1ZUxvYWQnKS50ZXh0KGxvYWRTdHIpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBHRVRURVJTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQzFIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQzdHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3hHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDM0lBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNyTkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUMvSkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUM1UEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDclBBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDekZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0EiLCJzb3VyY2VSb290IjoiIn0=