rubyfox-server 2.16.0.3 → 2.17.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (216) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rubyfox/server/data/config/admin/admintool.xml +0 -0
  3. data/lib/rubyfox/server/data/config/admin/descriptors/config_room.txt +0 -0
  4. data/lib/rubyfox/server/data/config/admin/descriptors/config_server.txt +0 -0
  5. data/lib/rubyfox/server/data/config/admin/descriptors/config_zone.txt +0 -0
  6. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_game.txt +0 -0
  7. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_mmo.txt +0 -0
  8. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_room.txt +0 -0
  9. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_user.txt +0 -0
  10. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_zone.txt +0 -0
  11. data/lib/rubyfox/server/data/config/admin/gmc/gmc.py +0 -0
  12. data/lib/rubyfox/server/data/config/admin/icons/Analytics.png +0 -0
  13. data/lib/rubyfox/server/data/config/admin/icons/Analytics.svg +0 -0
  14. data/lib/rubyfox/server/data/config/admin/icons/BanManager.png +0 -0
  15. data/lib/rubyfox/server/data/config/admin/icons/BanManager.svg +0 -0
  16. data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.png +0 -0
  17. data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.svg +0 -0
  18. data/lib/rubyfox/server/data/config/admin/icons/Console.png +0 -0
  19. data/lib/rubyfox/server/data/config/admin/icons/Console.svg +0 -0
  20. data/lib/rubyfox/server/data/config/admin/icons/Dashboard.png +0 -0
  21. data/lib/rubyfox/server/data/config/admin/icons/Dashboard.svg +0 -0
  22. data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.png +0 -0
  23. data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.svg +0 -0
  24. data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.png +0 -0
  25. data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.svg +0 -0
  26. data/lib/rubyfox/server/data/config/admin/icons/LogViewer.png +0 -0
  27. data/lib/rubyfox/server/data/config/admin/icons/LogViewer.svg +0 -0
  28. data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.png +0 -0
  29. data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.svg +0 -0
  30. data/lib/rubyfox/server/data/config/admin/icons/ServletManager.png +0 -0
  31. data/lib/rubyfox/server/data/config/admin/icons/ServletManager.svg +0 -0
  32. data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.png +0 -0
  33. data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.svg +0 -0
  34. data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.png +0 -0
  35. data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.svg +0 -0
  36. data/lib/rubyfox/server/data/config/logParser.properties +17 -28
  37. data/lib/rubyfox/server/data/lib/BlueBox.war +0 -0
  38. data/lib/rubyfox/server/data/lib/apache-tomcat/NOTICE +1 -1
  39. data/lib/rubyfox/server/data/lib/apache-tomcat/README.md +2 -0
  40. data/lib/rubyfox/server/data/lib/apache-tomcat/RELEASE-NOTES +2 -2
  41. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/bootstrap.jar +0 -0
  42. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.bat +2 -0
  43. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.sh +4 -6
  44. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon-native.tar.gz +0 -0
  45. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon.jar +0 -0
  46. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-juli.jar +0 -0
  47. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-native.tar.gz +0 -0
  48. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.policy +6 -1
  49. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.properties +1 -0
  50. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/keystore.jks +0 -0
  51. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/annotations-api.jar +0 -0
  52. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ant.jar +0 -0
  53. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ha.jar +0 -0
  54. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ssi.jar +0 -0
  55. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-storeconfig.jar +0 -0
  56. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-tribes.jar +0 -0
  57. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina.jar +0 -0
  58. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/ecj-4.20.jar +0 -0
  59. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/el-api.jar +0 -0
  60. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper-el.jar +0 -0
  61. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper.jar +0 -0
  62. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jaspic-api.jar +0 -0
  63. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jsp-api.jar +0 -0
  64. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/servlet-api.jar +0 -0
  65. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-api.jar +0 -0
  66. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-coyote.jar +0 -0
  67. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-dbcp.jar +0 -0
  68. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-cs.jar +0 -0
  69. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-de.jar +0 -0
  70. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-es.jar +0 -0
  71. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-fr.jar +0 -0
  72. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ja.jar +0 -0
  73. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ko.jar +0 -0
  74. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-pt-BR.jar +0 -0
  75. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ru.jar +0 -0
  76. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-zh-CN.jar +0 -0
  77. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jdbc.jar +0 -0
  78. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jni.jar +0 -0
  79. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util-scan.jar +0 -0
  80. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util.jar +0 -0
  81. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-websocket.jar +0 -0
  82. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/websocket-api.jar +0 -0
  83. data/lib/rubyfox/server/data/lib/commons-compress-1.19.jar +0 -0
  84. data/lib/rubyfox/server/data/lib/sfs2x-admin.jar +0 -0
  85. data/lib/rubyfox/server/data/lib/sfs2x-core.jar +0 -0
  86. data/lib/rubyfox/server/data/lib/sfs2x.jar +0 -0
  87. data/lib/rubyfox/server/data/sfs2x-service +294 -159
  88. data/lib/rubyfox/server/data/sfs2x.sh +1 -1
  89. data/lib/rubyfox/server/data/www/BlueBox.war +0 -0
  90. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/_changes-to-default-themes_.txt +0 -0
  91. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/bootstrap.min.css +0 -0
  92. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/custom-bootstrap.min.css +0 -0
  93. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/css/all.min.css +0 -0
  94. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.eot +0 -0
  95. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.svg +0 -0
  96. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  97. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.woff +0 -0
  98. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  99. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.eot +0 -0
  100. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.svg +0 -0
  101. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  102. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.woff +0 -0
  103. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  104. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.eot +0 -0
  105. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.svg +0 -0
  106. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  107. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.woff +0 -0
  108. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  109. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fonts.css +0 -0
  110. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/jquery.scrolling-tabs.min.css +0 -0
  111. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/kendo.custom-bootstrap-v4.css +0 -0
  112. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/reset.css +0 -0
  113. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/style.css +3 -1
  114. data/lib/rubyfox/server/data/www/ROOT/admin/assets/data/countries.geo.json +0 -0
  115. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.otf +0 -0
  116. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.ttf +0 -0
  117. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.woff +0 -0
  118. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.woff2 +0 -0
  119. 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
  120. 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
  121. 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
  122. 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
  123. 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
  124. 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
  125. 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
  126. 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
  127. 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
  128. 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
  129. 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
  130. 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
  131. 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
  132. 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
  133. 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
  134. 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
  135. 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
  136. 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
  137. 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
  138. 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
  139. 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
  140. 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
  141. 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
  142. 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
  143. 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
  144. 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
  145. 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
  146. 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
  147. 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
  148. 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
  149. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.ttf +0 -0
  150. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.woff +0 -0
  151. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.woff2 +0 -0
  152. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.ttf +0 -0
  153. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.woff +0 -0
  154. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.woff2 +0 -0
  155. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/compare.png +0 -0
  156. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsChart.png +0 -0
  157. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsCompare.png +0 -0
  158. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsFilter.png +0 -0
  159. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsMap.png +0 -0
  160. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsTable.png +0 -0
  161. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyChart.png +0 -0
  162. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyCompare.png +0 -0
  163. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyFilter.png +0 -0
  164. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyTable.png +0 -0
  165. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/apple-touch-icon-180x180.png +0 -0
  166. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-16x16.png +0 -0
  167. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-32x32.png +0 -0
  168. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-64x64.png +0 -0
  169. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/logo.png +0 -0
  170. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/application.bundle.js +4 -3
  171. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-0.bundle.js +0 -0
  172. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-1.bundle.js +96 -4
  173. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-10.bundle.js +9 -11
  174. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-11.bundle.js +0 -0
  175. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12.bundle.js +604 -2
  176. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12~module-13~module-9.bundle.js +18 -2
  177. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-13.bundle.js +19 -2
  178. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-3.bundle.js +0 -0
  179. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-4.bundle.js +0 -0
  180. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-5.bundle.js +0 -0
  181. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-6.bundle.js +10 -12
  182. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-7.bundle.js +0 -0
  183. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-8.bundle.js +0 -0
  184. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-9.bundle.js +4 -6
  185. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-0.bundle.js +0 -0
  186. 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 +0 -0
  187. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-1.bundle.js +983 -0
  188. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-9.bundle.js +0 -0
  189. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/bootstrap.min.js +0 -0
  190. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/jquery-3.3.1.min.js +0 -0
  191. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/jquery.scrolling-tabs.min.js +0 -0
  192. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/js.cookie.min.js +0 -0
  193. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/kendo.all.min.js +0 -0
  194. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/popper.min.js +0 -0
  195. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/sfs2x-api-1.7.15.js +0 -0
  196. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/versions-readme.txt +0 -0
  197. data/lib/rubyfox/server/data/www/ROOT/admin/index.html +0 -0
  198. data/lib/rubyfox/server/data/www/ROOT/admin/manifest.json +0 -0
  199. data/lib/rubyfox/server/data/www/ROOT/admin/modules/analytics.html +0 -0
  200. data/lib/rubyfox/server/data/www/ROOT/admin/modules/ban-manager.html +6 -0
  201. data/lib/rubyfox/server/data/www/ROOT/admin/modules/blue-box-monitor.html +0 -0
  202. data/lib/rubyfox/server/data/www/ROOT/admin/modules/console.html +0 -0
  203. data/lib/rubyfox/server/data/www/ROOT/admin/modules/dashboard.html +0 -0
  204. data/lib/rubyfox/server/data/www/ROOT/admin/modules/extension-manager.html +0 -0
  205. data/lib/rubyfox/server/data/www/ROOT/admin/modules/license-manager.html +0 -0
  206. data/lib/rubyfox/server/data/www/ROOT/admin/modules/log-viewer.html +0 -0
  207. data/lib/rubyfox/server/data/www/ROOT/admin/modules/server-configurator.html +0 -0
  208. data/lib/rubyfox/server/data/www/ROOT/admin/modules/servlet-manager.html +0 -0
  209. data/lib/rubyfox/server/data/www/ROOT/admin/modules/template.html +5 -0
  210. data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-configurator.html +11 -1
  211. data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-monitor.html +8 -0
  212. data/lib/rubyfox/server/data/zones/BasicExamples.zone.xml +147 -0
  213. data/lib/rubyfox/server/version.rb +1 -1
  214. metadata +9 -7
  215. data/lib/rubyfox/server/data/lib/apache-tomcat/.RELEASE-NOTES.swp +0 -0
  216. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/ecj-4.15.jar +0 -0
@@ -360,6 +360,9 @@ __webpack_require__.r(__webpack_exports__);
360
360
  /* harmony import */ var _data_banned_user__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../data/banned-user */ "./src/data/banned-user.js");
361
361
  /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! moment */ "./node_modules/moment/moment.js");
362
362
  /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_2__);
363
+ /* harmony import */ var clipboard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clipboard */ "./node_modules/clipboard/dist/clipboard.js");
364
+ /* harmony import */ var clipboard__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(clipboard__WEBPACK_IMPORTED_MODULE_3__);
365
+
363
366
 
364
367
 
365
368
 
@@ -419,6 +422,7 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
419
422
  sortable: true,
420
423
  //resizable: true,
421
424
  selectable: 'multiple',
425
+ allowCopy: true,
422
426
  columns:
423
427
  [
424
428
  {
@@ -430,11 +434,15 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
430
434
  field: 'banDate',
431
435
  width: 120,
432
436
  title: 'Date',
437
+ format: '{0:dd/MM/yyyy HH:mm}',
438
+ type: 'dateTime'
433
439
  },
434
440
  {
435
441
  field: 'expirationDate',
436
442
  width: 120,
437
443
  title: 'Expiration',
444
+ format: '{0:dd/MM/yyyy HH:mm}',
445
+ type: 'dateTime'
438
446
  },
439
447
  {
440
448
  field: 'reason',
@@ -460,6 +468,7 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
460
468
  sortable: true,
461
469
  //resizable: true,
462
470
  selectable: 'multiple',
471
+ allowCopy: true,
463
472
  columns:
464
473
  [
465
474
  {
@@ -471,11 +480,15 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
471
480
  field: 'banDate',
472
481
  width: 120,
473
482
  title: 'Date',
483
+ format: '{0:dd/MM/yyyy HH:mm}',
484
+ type: 'dateTime'
474
485
  },
475
486
  {
476
487
  field: 'expirationDate',
477
488
  width: 120,
478
489
  title: 'Expiration',
490
+ format: '{0:dd/MM/yyyy HH:mm}',
491
+ type: 'dateTime'
479
492
  },
480
493
  {
481
494
  field: 'reason',
@@ -495,6 +508,49 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
495
508
  dataSource: []
496
509
  }).data('kendoGrid');
497
510
 
511
+ // Initialize context menus
512
+ $("#bnm-namesGridContextMenu").kendoContextMenu({
513
+ target: '#bnm-namesGrid',
514
+ filter: 'td',
515
+ select: function (e) {
516
+ var cell = e.target;
517
+ var row = $(cell).parent()[0];
518
+ var grid = $('#bnm-namesGrid').data('kendoGrid');
519
+ var itemId = e.item.id;
520
+
521
+ var cellText = cell.innerText;
522
+
523
+ if (itemId === 'bnm-namesGridCopyText') {
524
+ new clipboard__WEBPACK_IMPORTED_MODULE_3___default.a('#bnm-namesGridCopyText', {
525
+ text: function (trigger) {
526
+ return cellText;
527
+ }
528
+ });
529
+ };
530
+ }
531
+ });
532
+
533
+ $("#bnm-ipGridContextMenu").kendoContextMenu({
534
+ target: '#bnm-ipGrid',
535
+ filter: 'td',
536
+ select: function (e) {
537
+ var cell = e.target;
538
+ var row = $(cell).parent()[0];
539
+ var grid = $('#bnm-ipGrid').data('kendoGrid');
540
+ var itemId = e.item.id;
541
+
542
+ var cellText = cell.innerText;
543
+
544
+ if (itemId === 'bnm-ipGridCopyText') {
545
+ new clipboard__WEBPACK_IMPORTED_MODULE_3___default.a('#bnm-ipGridCopyText', {
546
+ text: function (trigger) {
547
+ return cellText;
548
+ }
549
+ });
550
+ };
551
+ }
552
+ });
553
+
498
554
  // Initialize refresh and remove buttons
499
555
  $('#bnm-refreshNamesBt').on('click', $.proxy(this._onRefreshNamesClick, this));
500
556
  $('#bnm-removeNameBt').on('click', $.proxy(this._onRemoveNamesClick, this));
@@ -623,7 +679,25 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
623
679
  let currSort = this._namesGrid.dataSource.sort();
624
680
 
625
681
  let ds = new kendo.data.DataSource({
626
- sort: currSort,
682
+ schema: {
683
+ model: {
684
+ fields: {
685
+ expirationDate: {
686
+ type: 'dateTime',
687
+ parse: function (e) {
688
+ return moment__WEBPACK_IMPORTED_MODULE_2__(e, 'DD/MM/YYYY HH:mm').toDate();
689
+ }
690
+ },
691
+ banDate: {
692
+ type: 'dateTime',
693
+ parse: function (e) {
694
+ return moment__WEBPACK_IMPORTED_MODULE_2__(e, 'DD/MM/YYYY HH:mm').toDate();
695
+ }
696
+ }
697
+ }
698
+ }
699
+ },
700
+ sort: currSort, // FIXME Expected sorting doesn't seem to be applied
627
701
  data: this._generateBannedEntries(data.getSFSArray('uNames'))
628
702
  });
629
703
 
@@ -635,11 +709,29 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
635
709
  }
636
710
  else if (command == this.RESP_IPADDRESSES)
637
711
  {
638
- // Substitute grid's data source, retaining current sorting
712
+ // Substitute grid's data source, retaining current sorting (FIX)
639
713
  let currSort = this._ipGrid.dataSource.sort();
640
714
 
641
715
  let ds = new kendo.data.DataSource({
642
- sort: currSort,
716
+ schema: {
717
+ model: {
718
+ fields: {
719
+ expirationDate: {
720
+ type: 'dateTime',
721
+ parse: function (e) {
722
+ return moment__WEBPACK_IMPORTED_MODULE_2__(e, 'DD/MM/YYYY HH:mm').toDate();
723
+ }
724
+ },
725
+ banDate: {
726
+ type: 'dateTime',
727
+ parse: function (e) {
728
+ return moment__WEBPACK_IMPORTED_MODULE_2__(e, 'DD/MM/YYYY HH:mm').toDate();
729
+ }
730
+ }
731
+ }
732
+ }
733
+ },
734
+ sort: currSort, // FIXME Expected sorting doesn't seem to be applied
643
735
  data: this._generateBannedEntries(data.getSFSArray('IPs'))
644
736
  });
645
737
 
@@ -926,4 +1018,4 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
926
1018
  /***/ })
927
1019
 
928
1020
  }]);
929
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMS5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9kYXRhL2Jhbm5lZC11c2VyLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21vZHVsZXMvYmFuLW1hbmFnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBCYW5uZWRVc2VyXG57XG5cdGNvbnN0cnVjdG9yKG5hbWUsIHpvbmUpXG5cdHtcblx0XHR0aGlzLkRBVEVfRk9STUFUID0gJ0REL01NL1lZWVkgSEg6bW0nO1xuXG5cdCAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMuem9uZSA9IHpvbmU7XG5cdH1cblxuXHRzdGF0aWMgZnJvbVNGU0FycmF5KHNmc2EpXG5cdHtcblx0XHRsZXQgYnUgPSBuZXcgQmFubmVkVXNlcihzZnNhLmdldFV0ZlN0cmluZygwKSwgc2ZzYS5nZXRVdGZTdHJpbmcoMSkpO1xuXG5cdFx0YnUubW9kZSA9IHNmc2EuZ2V0VXRmU3RyaW5nKDIpO1xuXHRcdGJ1LnJlYXNvbiA9IHNmc2EuZ2V0VXRmU3RyaW5nKDMpO1xuXHRcdGJ1LmFkbWluTmFtZSA9IHNmc2EuZ2V0VXRmU3RyaW5nKDQpO1xuXHRcdGJ1LmlwQWRkcmVzcyA9IHNmc2EuZ2V0VXRmU3RyaW5nKDUpO1xuXHRcdGJ1LmJhblRpbWVNaWxsaXMgPSBzZnNhLmdldExvbmcoNik7XG5cdFx0YnUuYmFuRHVyYXRpb25NaWxsaXMgPSBzZnNhLmdldExvbmcoNyk7XG5cdFx0YnUuZXhwaXJhdGlvbkRhdGUgPSBidS5fZ2V0RXhwaXJhdGlvbkRhdGUoKTtcblx0XHRidS5iYW5EYXRlID0gYnUuX2dldEJhbkRhdGUoKTtcblxuXHRcdHJldHVybiBidTtcblx0fVxuXG5cdF9nZXRFeHBpcmF0aW9uRGF0ZSgpXG5cdHtcblx0XHRjb25zdCBleHBpcmVPbiA9IG1vbWVudCh0aGlzLmJhblRpbWVNaWxsaXMgKyB0aGlzLmJhbkR1cmF0aW9uTWlsbGlzKTtcblxuXHRcdGlmIChleHBpcmVPbi55ZWFyKCkgPj0gbW9tZW50KCkueWVhcigpICsgMTAwKVxuXHRcdFx0cmV0dXJuICdOZXZlcic7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGV4cGlyZU9uLmZvcm1hdCh0aGlzLkRBVEVfRk9STUFUKTtcblx0fVxuXG5cdF9nZXRCYW5EYXRlKClcblx0e1xuXHRcdHJldHVybiBtb21lbnQodGhpcy5iYW5UaW1lTWlsbGlzKS5mb3JtYXQodGhpcy5EQVRFX0ZPUk1BVCk7XG5cdH1cbn1cbiIsImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge0Jhbm5lZFVzZXJ9IGZyb20gJy4uL2RhdGEvYmFubmVkLXVzZXInO1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhbk1hbmFnZXIgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ2Jhbk1hbmFnZXInKTtcblxuXHRcdC8vIE91dGdvaW5nIHJlcXVlc3RzXG5cdFx0dGhpcy5SRVFfR0VUX1pPTkVTID0gJ2dldFpvbmVzJztcblx0XHR0aGlzLlJFUV9HRVRfVVNFUk5BTUVTID0gJ2dldFVOYW1lcyc7XG5cdFx0dGhpcy5SRVFfR0VUX0lQQUREUkVTU0VTID0gJ2dldElQcyc7XG5cdFx0dGhpcy5SRVFfUkVNT1ZFX1VTRVJOQU1FUyA9ICdyZW1vdmVVTmFtZXMnO1xuXHRcdHRoaXMuUkVRX1JFTU9WRV9JUEFERFJFU1NFUyA9ICdyZW1vdmVJUHMnO1xuXHRcdHRoaXMuUkVRX0JBTiA9ICdiYW4nO1xuXG5cdFx0Ly8gSW5jb21pbmcgcmVzcG9uc2VzXG5cdFx0dGhpcy5SRVNQX1pPTkVTID0gJ3pvbmVzJztcblx0XHR0aGlzLlJFU1BfVVNFUk5BTUVTID0gJ3VOYW1lcyc7XG5cdFx0dGhpcy5SRVNQX0lQQUREUkVTU0VTID0gJ0lQcyc7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBDT01NT04gTU9EVUxFIElOVEVSRkFDRSBNRVRIT0RTXG5cdC8vIFRoaXMgbWVtYmVycyBhcmUgdXNlZCBieSB0aGUgbWFpbiBjb250cm9sbGVyXG5cdC8vIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1vZHVsZSdzIGNvbnRyb2xsZXIuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0aW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcilcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuaW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcik7XG5cblx0XHQvLyBJbml0aWFsaXplIHNjcm9sbGluZyB0YWJzXG5cdFx0JCgnI2JubS10YWJOYXZpZ2F0b3IgPiAjdGFicycpLnNjcm9sbGluZ1RhYnMoe1xuXHRcdFx0Ym9vdHN0cmFwVmVyc2lvbjogNCxcblx0XHRcdHNjcm9sbFRvVGFiRWRnZTogdHJ1ZSxcblx0XHRcdGVuYWJsZVN3aXBpbmc6IHRydWUsXG5cdFx0XHRkaXNhYmxlU2Nyb2xsQXJyb3dzT25GdWxseVNjcm9sbGVkOiB0cnVlLFxuXHRcdFx0Y3NzQ2xhc3NMZWZ0QXJyb3c6ICdmYSBmYS1jaGV2cm9uLWxlZnQnLFxuXHRcdFx0Y3NzQ2xhc3NSaWdodEFycm93OiAnZmEgZmEtY2hldnJvbi1yaWdodCdcblx0XHR9KTtcblxuXHRcdC8vIEluaXRpYWxpemUgem9uZSBmaWx0ZXIgZHJvcGRvd25cblx0XHR0aGlzLl96b25lc0REID0gJCgnI2JubS16b25lc0REJykua2VuZG9Ecm9wRG93bkxpc3Qoe1xuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uWm9uZUNoYW5nZSwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBiYW4gYnV0dG9uXG5cdFx0JCgnI2JubS1zaG93QmFuTW9kYWxCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25TaG93QmFuTW9kYWxDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBiYW5uZWQgSVBzIGdyaWRcblx0XHR0aGlzLl9pcEdyaWQgPSAkKCcjYm5tLWlwR3JpZCcpLmtlbmRvR3JpZCh7XG5cdFx0XHRzY3JvbGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgc29ydGFibGU6IHRydWUsXG5cdFx0XHQvL3Jlc2l6YWJsZTogdHJ1ZSxcblx0XHRcdHNlbGVjdGFibGU6ICdtdWx0aXBsZScsXG4gICAgICAgICAgICBjb2x1bW5zOlxuICAgICAgICAgICAgW1xuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2lwQWRkcmVzcycsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnSVAgQWRkcmVzcycsXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnYmFuRGF0ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTIwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdEYXRlJyxcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAge1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdleHBpcmF0aW9uRGF0ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTIwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdFeHBpcmF0aW9uJyxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0e1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdyZWFzb24nLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDI1MCxcblx0XHRcdFx0XHR0aXRsZTogJ1JlYXNvbicsXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnYWRtaW5OYW1lJyxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAxNTAsXG5cdFx0XHRcdFx0dGl0bGU6ICdCYW5uZWQgQnknLFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XSxcblx0XHRcdG5vUmVjb3Jkczoge1xuXHRcdFx0XHR0ZW1wbGF0ZTogJ05vIGJhbm5lZCBJUCBhZGRyZXNzZXMuJ1xuXHRcdFx0fSxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vbklwR3JpZFNlbGVjdGlvbkNoYW5nZSwgdGhpcyksXG5cdFx0XHRkYXRhU291cmNlOiBbXVxuICAgICAgICB9KS5kYXRhKCdrZW5kb0dyaWQnKTtcblxuXHRcdC8vIEluaXRpYWxpemUgYmFubmVkIHVzZXJuYW1lcyBncmlkXG5cdFx0dGhpcy5fbmFtZXNHcmlkID0gJCgnI2JubS1uYW1lc0dyaWQnKS5rZW5kb0dyaWQoe1xuXHRcdFx0c2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHNvcnRhYmxlOiB0cnVlLFxuXHRcdFx0Ly9yZXNpemFibGU6IHRydWUsXG5cdFx0XHRzZWxlY3RhYmxlOiAnbXVsdGlwbGUnLFxuICAgICAgICAgICAgY29sdW1uczpcbiAgICAgICAgICAgIFtcblx0XHRcdFx0e1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICduYW1lJyxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAxNTAsXG5cdFx0XHRcdFx0dGl0bGU6ICdVc2VybmFtZScsXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnYmFuRGF0ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTIwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdEYXRlJyxcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAge1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdleHBpcmF0aW9uRGF0ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTIwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdFeHBpcmF0aW9uJyxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0e1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdyZWFzb24nLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDI1MCxcblx0XHRcdFx0XHR0aXRsZTogJ1JlYXNvbicsXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnYWRtaW5OYW1lJyxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAxNTAsXG5cdFx0XHRcdFx0dGl0bGU6ICdCYW5uZWQgQnknLFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XSxcblx0XHRcdG5vUmVjb3Jkczoge1xuXHRcdFx0XHR0ZW1wbGF0ZTogJ05vIGJhbm5lZCB1c2VybmFtZXMuJ1xuXHRcdFx0fSxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vbk5hbWVzR3JpZFNlbGVjdGlvbkNoYW5nZSwgdGhpcyksXG5cdFx0XHRkYXRhU291cmNlOiBbXVxuICAgICAgICB9KS5kYXRhKCdrZW5kb0dyaWQnKTtcblxuXHRcdC8vIEluaXRpYWxpemUgcmVmcmVzaCBhbmQgcmVtb3ZlIGJ1dHRvbnNcblx0XHQkKCcjYm5tLXJlZnJlc2hOYW1lc0J0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJlZnJlc2hOYW1lc0NsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2JubS1yZW1vdmVOYW1lQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlTmFtZXNDbGljaywgdGhpcykpO1xuXHRcdCQoJyNibm0tcmVtb3ZlQWxsTmFtZXNCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZW1vdmVBbGxOYW1lc0NsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2JubS1yZWZyZXNoSXBCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZWZyZXNoSXBDbGljaywgdGhpcykpO1xuXHRcdCQoJyNibm0tcmVtb3ZlSXBCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZW1vdmVJcENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2JubS1yZW1vdmVBbGxJcEJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJlbW92ZUFsbElwQ2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIENvbmZpZ3VyZSBiYW4gcGFuZWxcblx0XHQkKCcjYm5tLWJhbk1vZGFsJykubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2UsXG5cdFx0fSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgZm9yIGJhbiBwYW5lbCBoaWRlXG5cdFx0JCgnI2JubS1iYW5Nb2RhbCcpLm9uKCdoaWRkZW4uYnMubW9kYWwnLCAkLnByb3h5KHRoaXMuX29uQmFuTW9kYWxIaWRkZW4sIHRoaXMpKTtcblxuXHRcdC8vIEluaXRpYWxpemUga2VuZG8gdmFsaWRhdGlvbiBvbiBmb2xkZXIgbmFtZSBmb3JtXG5cdFx0dGhpcy5fYmFuVmFsaWRhdG9yID0gJCgnI2JubS1iYW5Gb3JtJykua2VuZG9WYWxpZGF0b3Ioe30pLmRhdGEoJ2tlbmRvVmFsaWRhdG9yJyk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gQmFuIGJ1dHRvbiBjbGlja1xuXHRcdCQoJyNibm0tYmFuQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQmFuQ2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIEluaXQgYmFuIGRlbGF5IG51bWVyaWMgc3RlcHBlclxuXHRcdHRoaXMuX2JhbkRlbGF5SW4gPSAkKCcjYm5tLW1vZGFsRGVsYXlOUycpLmtlbmRvTnVtZXJpY1RleHRCb3goe1xuXHRcdCAgICBtaW46IDAsXG5cdFx0ICAgIHN0ZXA6IDEsXG5cdFx0ICAgIGZvcm1hdDogJyMnXG5cdFx0fSkuZGF0YSgna2VuZG9OdW1lcmljVGV4dEJveCcpO1xuXG5cdFx0Ly8gSW5pdCBiYW4gZXhwaXJhdGlvbiBkYXRlIHBpY2tlclxuXHRcdHRoaXMuX2JhbkV4cERhdGVJbiA9ICQoJyNibm0tZXhwaXJhdGlvbkRQJykua2VuZG9EYXRlUGlja2VyKHtcblx0XHRcdHZhbHVlOiB0aGlzLl90b21vcnJvdyxcblx0XHRcdG1pbjogdGhpcy5fdG9tb3Jyb3csXG5cdFx0XHRmb290ZXI6IGZhbHNlLFxuXHRcdFx0Zm9ybWF0OiAnZGQvTU0veXl5eSdcblx0XHR9KS5kYXRhKCdrZW5kb0RhdGVQaWNrZXInKTtcblxuXHRcdC8vIERpc2FibGUgbWFudWFsIGRhdGUgaW5wdXRcblx0XHQkKCcjYm5tLWV4cGlyYXRpb25EUCcpLmF0dHIoJ3JlYWRvbmx5JywncmVhZG9ubHknKTtcblxuXHRcdC8vIEluaXQgYmFuIGV4cGlyYXRpb24gaG91cnMvbWludXRlcyBpbnB1dHNcblx0XHR0aGlzLl9iYW5FeHBIb3VySW4gPSAkKCcjYm5tLW1vZGFsRXhwSG91cnNOUycpLmtlbmRvTnVtZXJpY1RleHRCb3goe1xuXHRcdCAgICBtaW46IDAsXG5cdFx0XHRtYXg6IDk5LFxuXHRcdCAgICBzdGVwOiAxLFxuXHRcdCAgICBmb3JtYXQ6ICcjJ1xuXHRcdH0pLmRhdGEoJ2tlbmRvTnVtZXJpY1RleHRCb3gnKTtcblxuXHRcdHRoaXMuX2JhbkV4cE1pbkluID0gJCgnI2JubS1tb2RhbEV4cE1pbnNOUycpLmtlbmRvTnVtZXJpY1RleHRCb3goe1xuXHRcdCAgICBtaW46IDAsXG5cdFx0XHRtYXg6IDU5LFxuXHRcdCAgICBzdGVwOiAxLFxuXHRcdCAgICBmb3JtYXQ6ICcjJ1xuXHRcdH0pLmRhdGEoJ2tlbmRvTnVtZXJpY1RleHRCb3gnKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0Ly8gTG9hZCB6b25lcyBsaXN0XG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9HRVRfWk9ORVMpO1xuXG5cdFx0Ly8gTG9hZCBiYW5uZWQgSVAgYWRkcmVzc2VzXG5cdFx0Ly8gTm90ZTogd2UgZG9uJ3QgbG9hZCB0aGUgYmFubmVkIHVzZXJuYW1lcyBhdXRvbWF0aWNhbGx5IGJlY2F1c2UgYSB6b25lIG11c3QgYmUgc2VsZWN0ZWRcblx0XHR0aGlzLl9nZXRCYW5uZWRJUHMoKTtcblx0fVxuXG5cdGRlc3Ryb3koKVxuXHR7XG5cdFx0Ly8gQ2FsbCBzdXBlciBtZXRob2Rcblx0XHRzdXBlci5kZXN0cm95KCk7XG5cblx0XHQvLyBEZXN0cm95IHNjcm9sbGluZyB0YWJzXG5cdFx0JCgnI2JubS10YWJOYXZpZ2F0b3IgI3RhYnMnKS5zY3JvbGxpbmdUYWJzKCdkZXN0cm95Jyk7XG5cblx0XHQvLyBSZW1vdmUgY2xpY2sgbGlzdGVuZXJzXG5cdFx0JCgnI2JubS1zaG93QmFuTW9kYWxCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYm5tLXJlZnJlc2hOYW1lc0J0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNibm0tcmVtb3ZlTmFtZUJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNibm0tcmVtb3ZlQWxsTmFtZXNCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYm5tLXJlZnJlc2hJcEJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNibm0tcmVtb3ZlSXBCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYm5tLXJlbW92ZUFsbElwQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2JubS1iYW5CdCcpLm9mZignY2xpY2snKTtcblxuXHRcdC8vIEhpZGUgYmFuIHBhbmVsXG5cdFx0JCgnI2JubS1iYW5Nb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG5cblx0XHQvLyBSZW1vdmUgcm9vbSBjcmVhdGlvbiBwYW5lbCBsaXN0ZW5lclxuXHRcdCQoJyNibm0tYmFuTW9kYWwnKS5vZmYoJ2hpZGRlbi5icy5tb2RhbCcpO1xuXHR9XG5cblx0b25FeHRlbnNpb25Db21tYW5kKGNvbW1hbmQsIGRhdGEpXG5cdHtcblx0XHQvLyBEYXRhIHJlY2VpdmVkXG5cdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1pPTkVTKVxuXHRcdHtcblx0XHRcdGxldCB6b25lcyA9IGRhdGEuZ2V0VXRmU3RyaW5nQXJyYXkoJ3pvbmVzJyk7XG5cblx0XHRcdC8vIElmIHdlIGhhdmUgMSB6b25lIG9ubHksIHdlIHdpbGwgc2VsZWN0IGl0IGltbWVkaWF0ZWx5XG5cdFx0XHRjb25zdCBzZWxlY3RGaXJzdFpvbmUgPSB6b25lcy5sZW5ndGggPT0gMTtcblxuXHRcdFx0Ly8gU29ydCB6b25lcyBsaXN0XG5cdFx0XHR6b25lcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG5cdFx0XHRcdHJldHVybiBhLmxvY2FsZUNvbXBhcmUoYik7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQWRkIFwibm9uZVwiIHpvbmVcblx0XHRcdHpvbmVzLnVuc2hpZnQoJ1tub25lXScpO1xuXG5cdFx0XHQvLyBTZXQgem9uZSBkcm9wZG93biBkYXRhc291cmNlXG5cdFx0XHR0aGlzLl96b25lc0RELnNldERhdGFTb3VyY2Uoem9uZXMpO1xuXG5cdFx0XHRpZiAoc2VsZWN0Rmlyc3Rab25lKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLl96b25lc0RELnNlbGVjdCgxKTtcblx0XHRcdFx0dGhpcy5fZ2V0QmFubmVkVXNlcm5hbWVzKCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuX3pvbmVzREQuc2VsZWN0KDApO1xuXHRcdH1cblxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1VTRVJOQU1FUylcblx0XHR7XG5cdFx0XHQvLyBTdWJzdGl0dXRlIGdyaWQncyBkYXRhIHNvdXJjZSwgcmV0YWluaW5nIGN1cnJlbnQgc29ydGluZ1xuXHRcdFx0bGV0IGN1cnJTb3J0ID0gdGhpcy5fbmFtZXNHcmlkLmRhdGFTb3VyY2Uuc29ydCgpO1xuXG5cdFx0XHRsZXQgZHMgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdFx0c29ydDogY3VyclNvcnQsXG5cdFx0XHRcdGRhdGE6IHRoaXMuX2dlbmVyYXRlQmFubmVkRW50cmllcyhkYXRhLmdldFNGU0FycmF5KCd1TmFtZXMnKSlcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBc3NpZ24gZGF0YSBzb3VyY2UgdG8gZ3JpZFxuXHRcdFx0dGhpcy5fbmFtZXNHcmlkLnNldERhdGFTb3VyY2UoZHMpO1xuXG5cdFx0XHQvLyBFbmFibGUgcmVtb3ZlIGFsbCBidXR0b25cblx0XHRcdCQoJyNibm0tcmVtb3ZlQWxsTmFtZXNCdCcpLmF0dHIoJ2Rpc2FibGVkJywgZHMudG90YWwoKSA9PSAwKVxuXHRcdH1cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9JUEFERFJFU1NFUylcblx0XHR7XG5cdFx0XHQvLyBTdWJzdGl0dXRlIGdyaWQncyBkYXRhIHNvdXJjZSwgcmV0YWluaW5nIGN1cnJlbnQgc29ydGluZ1xuXHRcdFx0bGV0IGN1cnJTb3J0ID0gdGhpcy5faXBHcmlkLmRhdGFTb3VyY2Uuc29ydCgpO1xuXG5cdFx0XHRsZXQgZHMgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdFx0c29ydDogY3VyclNvcnQsXG5cdFx0XHRcdGRhdGE6IHRoaXMuX2dlbmVyYXRlQmFubmVkRW50cmllcyhkYXRhLmdldFNGU0FycmF5KCdJUHMnKSlcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBc3NpZ24gZGF0YSBzb3VyY2UgdG8gZ3JpZFxuXHRcdFx0dGhpcy5faXBHcmlkLnNldERhdGFTb3VyY2UoZHMpO1xuXG5cdFx0XHQvLyBFbmFibGUgcmVtb3ZlIGFsbCBidXR0b25cblx0XHRcdCQoJyNibm0tcmVtb3ZlQWxsSXBCdCcpLmF0dHIoJ2Rpc2FibGVkJywgZHMudG90YWwoKSA9PSAwKVxuXHRcdH1cblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFVJIEVWRU5UIExJU1RFTkVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdF9vblNob3dCYW5Nb2RhbENsaWNrKClcblx0e1xuXHRcdC8vIERpc3BsYXkgem9uZSBuYW1lXG5cdFx0JCgnI2JubS1tb2RhbFpvbmVMYicpLnRleHQodGhpcy5fem9uZXNERC52YWx1ZSgpKVxuXG5cdFx0Ly8gRGlzcGxheSBiYW4gcGFuZWxcblx0XHQkKCcjYm5tLWJhbk1vZGFsJykubW9kYWwoJ3Nob3cnKTtcblxuXHRcdC8vIEZvY3VzIG5hbWUgZmllbGRcblx0XHQkKCcjYm5tLW1vZGFsTmFtZUluJykuZm9jdXMoKTtcblx0fVxuXG5cdF9vbkJhbk1vZGFsSGlkZGVuKGUpXG5cdHtcblx0XHQvLyBSZXNldCB2YWxpZGF0b3Jcblx0XHR0aGlzLl9iYW5WYWxpZGF0b3IuaGlkZU1lc3NhZ2VzKCk7XG5cblx0XHQvLyBUaGUgbWV0aG9kIGFib3ZlIGRvZXNuJ3QgcmVtb3ZlIHRoZSBrLWludmFsaWQgY2xhc3NlcyBhbmQgYXJpYS1pbnZhbGlkPVwidHJ1ZVwiIGF0dHJpYnV0ZXMgZnJvbSBpbnB1dHNcblx0XHQvLyBMZXQncyBkbyBpdCBtYW51YWxseVxuXHRcdCQoJyNibm0tYmFuRm9ybSAuay1pbnZhbGlkJykucmVtb3ZlQ2xhc3MoJ2staW52YWxpZCcpO1xuXHRcdCQoJyNibm0tYmFuRm9ybSBbYXJpYS1pbnZhbGlkPVwidHJ1ZVwiXScpLnJlbW92ZUF0dHIoJ2FyaWEtaW52YWxpZCcpO1xuXG5cdFx0Ly8gUmVzZXQgYmFuIGZvcm1cblx0XHQkKCcjYm5tLW1vZGFsTmFtZUluJykudmFsKCcnKTtcblx0XHQkKCcjYm5tLW1vZGFsUmVhc29uSW4nKS52YWwoJycpO1xuXHRcdCQoJyNibm0tbW9kYWxNZXNzYWdlSW4nKS52YWwoJycpO1xuXG5cdFx0dGhpcy5fYmFuRGVsYXlJbi52YWx1ZSg1KTtcblxuXHRcdCQoJ2lucHV0W25hbWU9XCJleHBpcmF0aW9uXCJdJykucmVtb3ZlQXR0cignY2hlY2tlZCcpO1xuXHRcdCQoJyNibm0tZXhwaXJhdGlvblJCMCcpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcblxuXHRcdHRoaXMuX2JhbkV4cEhvdXJJbi52YWx1ZSgxKTtcblx0XHR0aGlzLl9iYW5FeHBNaW5Jbi52YWx1ZSgwKTtcblxuXHRcdHRoaXMuX2JhbkV4cERhdGVJbi5taW4odGhpcy5fdG9tb3Jyb3cpO1xuXHRcdHRoaXMuX2JhbkV4cERhdGVJbi52YWx1ZSh0aGlzLl90b21vcnJvdyk7XG5cdH1cblxuXHRfb25CYW5DbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fYmFuVmFsaWRhdG9yLnZhbGlkYXRlKCkpXG5cdFx0e1xuXHRcdFx0Ly8gUmV0cmlldmUgYmFuIGRldGFpbHNcblx0XHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3pvbmUnLCB0aGlzLl96b25lc0RELnZhbHVlKCkpO1xuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygnbmFtZScsICQoJyNibm0tbW9kYWxOYW1lSW4nKS52YWwoKSk7XG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCdtc2cnLCAkKCcjYm5tLW1vZGFsTWVzc2FnZUluJykudmFsKCkpO1xuXHRcdFx0cGFyYW1zLnB1dEludCgnZGVsYXknLCB0aGlzLl9iYW5EZWxheUluLnZhbHVlKCkgIT0gbnVsbCA/IHRoaXMuX2JhbkRlbGF5SW4udmFsdWUoKSA6IDApO1xuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygncmVhc29uJywgJCgnI2JubS1tb2RhbFJlYXNvbkluJykudmFsKCkpO1xuXG5cdFx0XHRjb25zdCBleHAgPSAkKCdpbnB1dFtuYW1lPVwiZXhwaXJhdGlvblwiXTpjaGVja2VkJykudmFsKCk7XG5cdFx0XHRsZXQgZHVyYXRpb24gPSAtMTtcblxuXHRcdFx0aWYgKGV4cCA9PSAnYWZ0ZXInKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBob3VycyA9IHRoaXMuX2JhbkV4cEhvdXJJbi52YWx1ZSgpICE9IG51bGwgPyB0aGlzLl9iYW5FeHBIb3VySW4udmFsdWUoKSA6IDA7XG5cdFx0XHRcdGNvbnN0IG1pbnV0ZXMgPSB0aGlzLl9iYW5FeHBNaW5Jbi52YWx1ZSgpICE9IG51bGwgPyB0aGlzLl9iYW5FeHBNaW5Jbi52YWx1ZSgpIDogMDtcblxuXHRcdFx0XHRkdXJhdGlvbiA9IChob3VycyAqIDYwKSArIG1pbnV0ZXM7XG5cblx0XHRcdFx0aWYgKGR1cmF0aW9uIDw9IDApXG5cdFx0XHRcdFx0ZHVyYXRpb24gPSAxO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoZXhwID09ICdvbicpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IG9uRGF0ZSA9IG1vbWVudCh0aGlzLl9iYW5FeHBEYXRlSW4udmFsdWUoKSk7XG5cdFx0XHRcdGNvbnN0IG5vdyA9IG1vbWVudCgpO1xuXG5cdFx0XHRcdGR1cmF0aW9uID0gb25EYXRlLnN0YXJ0T2YoJ2RheScpLmRpZmYobm93LnN0YXJ0T2YoJ21pbnV0ZScpLCAnbWludXRlcycpO1xuXG5cdFx0XHRcdGlmIChkdXJhdGlvbiA8PSAwKVxuXHRcdFx0XHRcdGR1cmF0aW9uID0gMTtcblx0XHRcdH1cblxuXHRcdFx0cGFyYW1zLnB1dEludCgnZHVyTWlucycsIGR1cmF0aW9uKTtcblxuXHRcdFx0Ly8gU2VuZCBiYW4gcmVxdWVzdCB0byBzZXJ2ZXJcblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfQkFOLCBwYXJhbXMpO1xuXG5cdFx0XHQvLyBSZWZyZXNoIGxpc3Rcblx0XHRcdHRoaXMuX2dldEJhbm5lZFVzZXJuYW1lcygpO1xuXG5cdFx0XHQvLyBGb2N1cyB1c2VybmFtZSBmaWVsZFxuXHRcdFx0JCgnI2JubS1tb2RhbE5hbWVJbicpLmZvY3VzKCk7XG5cdFx0XHQkKCcjYm5tLW1vZGFsTmFtZUluJykuc2VsZWN0KCk7XG5cdFx0fVxuXHR9XG5cblx0X29uWm9uZUNoYW5nZSgpXG5cdHtcblx0XHQkKCcjYm5tLW5hbWVzQnV0dG9ucycpLmF0dHIoJ2Rpc2FibGVkJywgdGhpcy5fem9uZXNERC5zZWxlY3QoKSA9PSAwKTtcblx0XHQkKCcjYm5tLXNob3dCYW5Nb2RhbEJ0JykuYXR0cignZGlzYWJsZWQnLCB0aGlzLl96b25lc0RELnNlbGVjdCgpID09IDApO1xuXG5cdFx0dGhpcy5fZ2V0QmFubmVkVXNlcm5hbWVzKCk7XG5cdH1cblxuXHRfb25OYW1lc0dyaWRTZWxlY3Rpb25DaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgcmVtb3ZlIGJ1dHRvblxuXHRcdGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuX25hbWVzR3JpZC5zZWxlY3QoKTtcblx0XHQkKCcjYm5tLXJlbW92ZU5hbWVCdCcpLmF0dHIoJ2Rpc2FibGVkJywgc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PSAwKTtcblx0fVxuXG5cdF9vbklwR3JpZFNlbGVjdGlvbkNoYW5nZSgpXG5cdHtcblx0XHQvLyBFbmFibGUvZGlzYWJsZSByZW1vdmUgYnV0dG9uXG5cdFx0Y29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5faXBHcmlkLnNlbGVjdCgpO1xuXHRcdCQoJyNibm0tcmVtb3ZlSXBCdCcpLmF0dHIoJ2Rpc2FibGVkJywgc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PSAwKTtcblx0fVxuXG5cdF9vblJlZnJlc2hOYW1lc0NsaWNrKClcblx0e1xuXHRcdHRoaXMuX2dldEJhbm5lZFVzZXJuYW1lcygpO1xuXHR9XG5cblx0X29uUmVtb3ZlTmFtZXNDbGljaygpXG5cdHtcblx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Q29uZmlybVdhcm5pbmcoYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdGhlIGJhbm5pbmcgZm9yIHRoZSBzZWxlY3RlZCB1c2VybmFtZSR7dGhpcy5faXBHcmlkLnNlbGVjdCgpLmxlbmd0aCA+IDEgPyAncycgOiAnJ30/YCwgJC5wcm94eSh0aGlzLl9vblJlbW92ZU5hbWVzQ29uZmlybSwgdGhpcykpO1xuXHR9XG5cblx0X29uUmVtb3ZlTmFtZXNDb25maXJtKClcblx0e1xuXHRcdGxldCBzZWxlY3RlZFJvd3MgPSB0aGlzLl9uYW1lc0dyaWQuc2VsZWN0KCk7XG5cdFx0bGV0IHVzZXJuYW1lcyA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3RlZFJvd3MubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0bGV0IGRhdGFJdGVtID0gdGhpcy5fbmFtZXNHcmlkLmRhdGFJdGVtKHNlbGVjdGVkUm93c1tpXSk7XG5cdFx0XHR1c2VybmFtZXMucHVzaChkYXRhSXRlbS5uYW1lKTtcblx0XHR9XG5cblx0XHR0aGlzLl9yZXF1ZXN0QmFubmVkVXNlcnNSZW1vdmFsKHVzZXJuYW1lcywgdGhpcy5fem9uZXNERC52YWx1ZSgpKTtcblx0fVxuXG5cdF9vblJlbW92ZUFsbE5hbWVzQ2xpY2soKVxuXHR7XG5cdFx0dGhpcy5zaGVsbEN0cmwuc2hvd0NvbmZpcm1XYXJuaW5nKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIGFsbCBiYW5uZWQgdXNlcm5hbWVzP2AsICQucHJveHkodGhpcy5fb25SZW1vdkFsbE5hbWVzQ29uZmlybSwgdGhpcykpO1xuXHR9XG5cblx0X29uUmVtb3ZBbGxOYW1lc0NvbmZpcm0oKVxuXHR7XG5cdFx0dGhpcy5fcmVxdWVzdEJhbm5lZFVzZXJzUmVtb3ZhbChudWxsLCB0aGlzLl96b25lc0RELnZhbHVlKCkpO1xuXHR9XG5cblx0X29uUmVmcmVzaElwQ2xpY2soKVxuXHR7XG5cdFx0dGhpcy5fZ2V0QmFubmVkSVBzKCk7XG5cdH1cblxuXHRfb25SZW1vdmVJcENsaWNrKClcblx0e1xuXHRcdHRoaXMuc2hlbGxDdHJsLnNob3dDb25maXJtV2FybmluZyhgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSB0aGUgYmFubmluZyBmb3IgdGhlIHNlbGVjdGVkIElQIGFkZHJlc3Mke3RoaXMuX2lwR3JpZC5zZWxlY3QoKS5sZW5ndGggPiAxID8gJ2VzJyA6ICcnfT9gLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlSXBDb25maXJtLCB0aGlzKSk7XG5cdH1cblxuXHRfb25SZW1vdmVJcENvbmZpcm0oKVxuXHR7XG5cdFx0bGV0IHNlbGVjdGVkUm93cyA9IHRoaXMuX2lwR3JpZC5zZWxlY3QoKTtcblx0XHRsZXQgaXBBZGRyZXNzZXMgPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0ZWRSb3dzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX2lwR3JpZC5kYXRhSXRlbShzZWxlY3RlZFJvd3NbaV0pO1xuXHRcdFx0aXBBZGRyZXNzZXMucHVzaChkYXRhSXRlbS5pcEFkZHJlc3MpO1xuXHRcdH1cblxuXHRcdHRoaXMuX3JlcXVlc3RCYW5uZWRJUHNSZW1vdmFsKGlwQWRkcmVzc2VzKTtcblx0fVxuXG5cdF9vblJlbW92ZUFsbElwQ2xpY2soKVxuXHR7XG5cdFx0dGhpcy5zaGVsbEN0cmwuc2hvd0NvbmZpcm1XYXJuaW5nKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIGFsbCBiYW5uZWQgSVAgYWRkcmVzc2VzP2AsICQucHJveHkodGhpcy5fb25SZW1vdkFsbElwQ29uZmlybSwgdGhpcykpO1xuXHR9XG5cblx0X29uUmVtb3ZBbGxJcENvbmZpcm0oKVxuXHR7XG5cdFx0dGhpcy5fcmVxdWVzdEJhbm5lZElQc1JlbW92YWwobnVsbCk7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQUklWQVRFIE1FVEhPRFNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfZ2V0QmFubmVkSVBzKClcblx0e1xuXHRcdC8vIFJlbW92ZSBzZWxlY3Rpb25cblx0XHR0aGlzLl9pcEdyaWQuY2xlYXJTZWxlY3Rpb24oKTtcblxuXHRcdC8vIENsZWFyIGJhbm5lZCBJUHMgdGFibGVcblx0XHR0aGlzLl9pcEdyaWQuc2V0RGF0YVNvdXJjZShbXSk7XG5cblx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gZXh0ZW5zaW9uXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9HRVRfSVBBRERSRVNTRVMpO1xuXHR9XG5cblx0X2dldEJhbm5lZFVzZXJuYW1lcygpXG5cdHtcblx0XHQvLyBSZW1vdmUgc2VsZWN0aW9uXG5cdFx0dGhpcy5fbmFtZXNHcmlkLmNsZWFyU2VsZWN0aW9uKCk7XG5cblx0XHQvLyBDbGVhciBiYW5uZWQgSVBzIHRhYmxlXG5cdFx0dGhpcy5fbmFtZXNHcmlkLnNldERhdGFTb3VyY2UoW10pO1xuXG5cdFx0aWYgKHRoaXMuX3pvbmVzREQuc2VsZWN0KCkgPiAwKVxuXHRcdHtcblx0XHRcdC8vIEdldCB6b25lIElEXG5cdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygnem9uZScsIHRoaXMuX3pvbmVzREQudmFsdWUoKSk7XG5cblx0XHRcdC8vIFNlbmQgcmVxdWVzdCB0byBleHRlbnNpb25cblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX1VTRVJOQU1FUywgcGFyYW1zKTtcblx0XHR9XG5cdH1cblxuXHRfZ2VuZXJhdGVCYW5uZWRFbnRyaWVzKGJhbkRhdGEpXG5cdHtcblx0XHRsZXQgYmFubmVkRW50cmllcyA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBiYW5EYXRhLnNpemUoKTsgaSsrKVxuXHRcdHtcblx0XHRcdGNvbnN0IGJ1ID0gQmFubmVkVXNlci5mcm9tU0ZTQXJyYXkoYmFuRGF0YS5nZXRTRlNBcnJheShpKSk7XG5cdFx0XHRiYW5uZWRFbnRyaWVzLnB1c2goYnUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBiYW5uZWRFbnRyaWVzO1xuXHR9XG5cblx0X3JlcXVlc3RCYW5uZWRVc2Vyc1JlbW92YWwodXNlcm5hbWVzLCB6b25lKVxuXHR7XG5cdFx0Ly8gSWYgdGhlIHVzZXJuYW1lcyBhcnJheSBpcyBudWxsLCBzZXJ2ZXIgd2lsbCByZW1vdmUgYWxsIGJhbm5lZCB1c2VybmFtZXNcblx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3pvbmUnLCB6b25lKTtcblxuXHRcdGlmICh1c2VybmFtZXMgPT0gbnVsbClcblx0XHRcdHBhcmFtcy5wdXROdWxsKCd1TmFtZXMnKTtcblx0XHRlbHNlXG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nQXJyYXkoJ3VOYW1lcycsIHVzZXJuYW1lcyk7XG5cblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX1JFTU9WRV9VU0VSTkFNRVMsIHBhcmFtcyk7XG5cdH1cblxuXHRfcmVxdWVzdEJhbm5lZElQc1JlbW92YWwoaXBBZGRyZXNzZXMpXG5cdHtcblx0XHQvLyBJZiB0aGUgdXNlcm5hbWVzIGFycmF5IGlzIG51bGwsIHNlcnZlciB3aWxsIHJlbW92ZSBhbGwgYmFubmVkIHVzZXJuYW1lc1xuXHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cblx0XHRpZiAoaXBBZGRyZXNzZXMgPT0gbnVsbClcblx0XHRcdHBhcmFtcy5wdXROdWxsKCdJUHMnKTtcblx0XHRlbHNlXG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nQXJyYXkoJ0lQcycsIGlwQWRkcmVzc2VzKTtcblxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfUkVNT1ZFX0lQQUREUkVTU0VTLCBwYXJhbXMpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBHRVRURVJTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0Z2V0IF90b21vcnJvdygpXG5cdHtcblx0XHRsZXQgdG9tb3Jyb3cgPSBtb21lbnQoKS5hZGQoMSwgJ2QnKTtcblx0XHRyZXR1cm4gdG9tb3Jyb3cudG9EYXRlKCk7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQzFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QSIsInNvdXJjZVJvb3QiOiIifQ==
1021
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMS5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9kYXRhL2Jhbm5lZC11c2VyLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21vZHVsZXMvYmFuLW1hbmFnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBCYW5uZWRVc2VyXG57XG5cdGNvbnN0cnVjdG9yKG5hbWUsIHpvbmUpXG5cdHtcblx0XHR0aGlzLkRBVEVfRk9STUFUID0gJ0REL01NL1lZWVkgSEg6bW0nO1xuXG5cdCAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMuem9uZSA9IHpvbmU7XG5cdH1cblxuXHRzdGF0aWMgZnJvbVNGU0FycmF5KHNmc2EpXG5cdHtcblx0XHRsZXQgYnUgPSBuZXcgQmFubmVkVXNlcihzZnNhLmdldFV0ZlN0cmluZygwKSwgc2ZzYS5nZXRVdGZTdHJpbmcoMSkpO1xuXG5cdFx0YnUubW9kZSA9IHNmc2EuZ2V0VXRmU3RyaW5nKDIpO1xuXHRcdGJ1LnJlYXNvbiA9IHNmc2EuZ2V0VXRmU3RyaW5nKDMpO1xuXHRcdGJ1LmFkbWluTmFtZSA9IHNmc2EuZ2V0VXRmU3RyaW5nKDQpO1xuXHRcdGJ1LmlwQWRkcmVzcyA9IHNmc2EuZ2V0VXRmU3RyaW5nKDUpO1xuXHRcdGJ1LmJhblRpbWVNaWxsaXMgPSBzZnNhLmdldExvbmcoNik7XG5cdFx0YnUuYmFuRHVyYXRpb25NaWxsaXMgPSBzZnNhLmdldExvbmcoNyk7XG5cdFx0YnUuZXhwaXJhdGlvbkRhdGUgPSBidS5fZ2V0RXhwaXJhdGlvbkRhdGUoKTtcblx0XHRidS5iYW5EYXRlID0gYnUuX2dldEJhbkRhdGUoKTtcblxuXHRcdHJldHVybiBidTtcblx0fVxuXG5cdF9nZXRFeHBpcmF0aW9uRGF0ZSgpXG5cdHtcblx0XHRjb25zdCBleHBpcmVPbiA9IG1vbWVudCh0aGlzLmJhblRpbWVNaWxsaXMgKyB0aGlzLmJhbkR1cmF0aW9uTWlsbGlzKTtcblxuXHRcdGlmIChleHBpcmVPbi55ZWFyKCkgPj0gbW9tZW50KCkueWVhcigpICsgMTAwKVxuXHRcdFx0cmV0dXJuICdOZXZlcic7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGV4cGlyZU9uLmZvcm1hdCh0aGlzLkRBVEVfRk9STUFUKTtcblx0fVxuXG5cdF9nZXRCYW5EYXRlKClcblx0e1xuXHRcdHJldHVybiBtb21lbnQodGhpcy5iYW5UaW1lTWlsbGlzKS5mb3JtYXQodGhpcy5EQVRFX0ZPUk1BVCk7XG5cdH1cbn1cbiIsImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge0Jhbm5lZFVzZXJ9IGZyb20gJy4uL2RhdGEvYmFubmVkLXVzZXInO1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgQ2xpcGJvYXJkIGZyb20gJ2NsaXBib2FyZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhbk1hbmFnZXIgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ2Jhbk1hbmFnZXInKTtcblxuXHRcdC8vIE91dGdvaW5nIHJlcXVlc3RzXG5cdFx0dGhpcy5SRVFfR0VUX1pPTkVTID0gJ2dldFpvbmVzJztcblx0XHR0aGlzLlJFUV9HRVRfVVNFUk5BTUVTID0gJ2dldFVOYW1lcyc7XG5cdFx0dGhpcy5SRVFfR0VUX0lQQUREUkVTU0VTID0gJ2dldElQcyc7XG5cdFx0dGhpcy5SRVFfUkVNT1ZFX1VTRVJOQU1FUyA9ICdyZW1vdmVVTmFtZXMnO1xuXHRcdHRoaXMuUkVRX1JFTU9WRV9JUEFERFJFU1NFUyA9ICdyZW1vdmVJUHMnO1xuXHRcdHRoaXMuUkVRX0JBTiA9ICdiYW4nO1xuXG5cdFx0Ly8gSW5jb21pbmcgcmVzcG9uc2VzXG5cdFx0dGhpcy5SRVNQX1pPTkVTID0gJ3pvbmVzJztcblx0XHR0aGlzLlJFU1BfVVNFUk5BTUVTID0gJ3VOYW1lcyc7XG5cdFx0dGhpcy5SRVNQX0lQQUREUkVTU0VTID0gJ0lQcyc7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBDT01NT04gTU9EVUxFIElOVEVSRkFDRSBNRVRIT0RTXG5cdC8vIFRoaXMgbWVtYmVycyBhcmUgdXNlZCBieSB0aGUgbWFpbiBjb250cm9sbGVyXG5cdC8vIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1vZHVsZSdzIGNvbnRyb2xsZXIuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0aW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcilcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuaW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcik7XG5cblx0XHQvLyBJbml0aWFsaXplIHNjcm9sbGluZyB0YWJzXG5cdFx0JCgnI2JubS10YWJOYXZpZ2F0b3IgPiAjdGFicycpLnNjcm9sbGluZ1RhYnMoe1xuXHRcdFx0Ym9vdHN0cmFwVmVyc2lvbjogNCxcblx0XHRcdHNjcm9sbFRvVGFiRWRnZTogdHJ1ZSxcblx0XHRcdGVuYWJsZVN3aXBpbmc6IHRydWUsXG5cdFx0XHRkaXNhYmxlU2Nyb2xsQXJyb3dzT25GdWxseVNjcm9sbGVkOiB0cnVlLFxuXHRcdFx0Y3NzQ2xhc3NMZWZ0QXJyb3c6ICdmYSBmYS1jaGV2cm9uLWxlZnQnLFxuXHRcdFx0Y3NzQ2xhc3NSaWdodEFycm93OiAnZmEgZmEtY2hldnJvbi1yaWdodCdcblx0XHR9KTtcblxuXHRcdC8vIEluaXRpYWxpemUgem9uZSBmaWx0ZXIgZHJvcGRvd25cblx0XHR0aGlzLl96b25lc0REID0gJCgnI2JubS16b25lc0REJykua2VuZG9Ecm9wRG93bkxpc3Qoe1xuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uWm9uZUNoYW5nZSwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBiYW4gYnV0dG9uXG5cdFx0JCgnI2JubS1zaG93QmFuTW9kYWxCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25TaG93QmFuTW9kYWxDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBiYW5uZWQgSVBzIGdyaWRcblx0XHR0aGlzLl9pcEdyaWQgPSAkKCcjYm5tLWlwR3JpZCcpLmtlbmRvR3JpZCh7XG5cdFx0XHRzY3JvbGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgc29ydGFibGU6IHRydWUsXG5cdFx0XHQvL3Jlc2l6YWJsZTogdHJ1ZSxcblx0XHRcdHNlbGVjdGFibGU6ICdtdWx0aXBsZScsXG5cdFx0XHRhbGxvd0NvcHk6IHRydWUsXG4gICAgICAgICAgICBjb2x1bW5zOlxuICAgICAgICAgICAgW1xuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2lwQWRkcmVzcycsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnSVAgQWRkcmVzcycsXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnYmFuRGF0ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTIwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdEYXRlJyxcblx0XHRcdFx0XHRmb3JtYXQ6ICd7MDpkZC9NTS95eXl5IEhIOm1tfScsXG5cdFx0XHRcdFx0dHlwZTogJ2RhdGVUaW1lJ1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICB7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2V4cGlyYXRpb25EYXRlJyxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAxMjAsXG5cdCAgICAgICAgICAgICAgICB0aXRsZTogJ0V4cGlyYXRpb24nLFxuXHRcdFx0XHRcdGZvcm1hdDogJ3swOmRkL01NL3l5eXkgSEg6bW19Jyxcblx0XHRcdFx0XHR0eXBlOiAnZGF0ZVRpbWUnXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAncmVhc29uJyxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAyNTAsXG5cdFx0XHRcdFx0dGl0bGU6ICdSZWFzb24nLFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2FkbWluTmFtZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnQmFubmVkIEJ5Jyxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdF0sXG5cdFx0XHRub1JlY29yZHM6IHtcblx0XHRcdFx0dGVtcGxhdGU6ICdObyBiYW5uZWQgSVAgYWRkcmVzc2VzLidcblx0XHRcdH0sXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25JcEdyaWRTZWxlY3Rpb25DaGFuZ2UsIHRoaXMpLFxuXHRcdFx0ZGF0YVNvdXJjZTogW11cbiAgICAgICAgfSkuZGF0YSgna2VuZG9HcmlkJyk7XG5cblx0XHQvLyBJbml0aWFsaXplIGJhbm5lZCB1c2VybmFtZXMgZ3JpZFxuXHRcdHRoaXMuX25hbWVzR3JpZCA9ICQoJyNibm0tbmFtZXNHcmlkJykua2VuZG9HcmlkKHtcblx0XHRcdHNjcm9sbGFibGU6IHRydWUsXG4gICAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcblx0XHRcdC8vcmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0c2VsZWN0YWJsZTogJ211bHRpcGxlJyxcblx0XHRcdGFsbG93Q29weTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbHVtbnM6XG4gICAgICAgICAgICBbXG5cdFx0XHRcdHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnbmFtZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnVXNlcm5hbWUnLFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2JhbkRhdGUnLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDEyMCxcblx0ICAgICAgICAgICAgICAgIHRpdGxlOiAnRGF0ZScsXG5cdFx0XHRcdFx0Zm9ybWF0OiAnezA6ZGQvTU0veXl5eSBISDptbX0nLFxuXHRcdFx0XHRcdHR5cGU6ICdkYXRlVGltZSdcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAge1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdleHBpcmF0aW9uRGF0ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTIwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdFeHBpcmF0aW9uJyxcblx0XHRcdFx0XHRmb3JtYXQ6ICd7MDpkZC9NTS95eXl5IEhIOm1tfScsXG5cdFx0XHRcdFx0dHlwZTogJ2RhdGVUaW1lJ1xuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ3JlYXNvbicsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMjUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnUmVhc29uJyxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0e1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdhZG1pbk5hbWUnLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDE1MCxcblx0XHRcdFx0XHR0aXRsZTogJ0Jhbm5lZCBCeScsXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRdLFxuXHRcdFx0bm9SZWNvcmRzOiB7XG5cdFx0XHRcdHRlbXBsYXRlOiAnTm8gYmFubmVkIHVzZXJuYW1lcy4nXG5cdFx0XHR9LFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uTmFtZXNHcmlkU2VsZWN0aW9uQ2hhbmdlLCB0aGlzKSxcblx0XHRcdGRhdGFTb3VyY2U6IFtdXG4gICAgICAgIH0pLmRhdGEoJ2tlbmRvR3JpZCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBjb250ZXh0IG1lbnVzXG5cdFx0JChcIiNibm0tbmFtZXNHcmlkQ29udGV4dE1lbnVcIikua2VuZG9Db250ZXh0TWVudSh7XG4gICAgICAgICAgICB0YXJnZXQ6ICcjYm5tLW5hbWVzR3JpZCcsXG4gICAgICAgICAgICBmaWx0ZXI6ICd0ZCcsXG4gICAgICAgICAgICBzZWxlY3Q6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGwgPSBlLnRhcmdldDtcbiAgICAgICAgICAgICAgICB2YXIgcm93ID0gJChjZWxsKS5wYXJlbnQoKVswXTtcbiAgICAgICAgICAgICAgICB2YXIgZ3JpZCA9ICQoJyNibm0tbmFtZXNHcmlkJykuZGF0YSgna2VuZG9HcmlkJyk7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1JZCA9IGUuaXRlbS5pZDtcblxuICAgICAgICAgICAgICAgIHZhciBjZWxsVGV4dCA9IGNlbGwuaW5uZXJUZXh0O1xuXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1JZCA9PT0gJ2JubS1uYW1lc0dyaWRDb3B5VGV4dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3IENsaXBib2FyZCgnI2JubS1uYW1lc0dyaWRDb3B5VGV4dCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGZ1bmN0aW9uICh0cmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGxUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXHRcdCQoXCIjYm5tLWlwR3JpZENvbnRleHRNZW51XCIpLmtlbmRvQ29udGV4dE1lbnUoe1xuICAgICAgICAgICAgdGFyZ2V0OiAnI2JubS1pcEdyaWQnLFxuICAgICAgICAgICAgZmlsdGVyOiAndGQnLFxuICAgICAgICAgICAgc2VsZWN0OiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHZhciBjZWxsID0gZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgdmFyIHJvdyA9ICQoY2VsbCkucGFyZW50KClbMF07XG4gICAgICAgICAgICAgICAgdmFyIGdyaWQgPSAkKCcjYm5tLWlwR3JpZCcpLmRhdGEoJ2tlbmRvR3JpZCcpO1xuICAgICAgICAgICAgICAgIHZhciBpdGVtSWQgPSBlLml0ZW0uaWQ7XG5cbiAgICAgICAgICAgICAgICB2YXIgY2VsbFRleHQgPSBjZWxsLmlubmVyVGV4dDtcblxuICAgICAgICAgICAgICAgIGlmIChpdGVtSWQgPT09ICdibm0taXBHcmlkQ29weVRleHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBDbGlwYm9hcmQoJyNibm0taXBHcmlkQ29weVRleHQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBmdW5jdGlvbiAodHJpZ2dlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjZWxsVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblx0XHQvLyBJbml0aWFsaXplIHJlZnJlc2ggYW5kIHJlbW92ZSBidXR0b25zXG5cdFx0JCgnI2JubS1yZWZyZXNoTmFtZXNCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZWZyZXNoTmFtZXNDbGljaywgdGhpcykpO1xuXHRcdCQoJyNibm0tcmVtb3ZlTmFtZUJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJlbW92ZU5hbWVzQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjYm5tLXJlbW92ZUFsbE5hbWVzQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlQWxsTmFtZXNDbGljaywgdGhpcykpO1xuXHRcdCQoJyNibm0tcmVmcmVzaElwQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVmcmVzaElwQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjYm5tLXJlbW92ZUlwQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlSXBDbGljaywgdGhpcykpO1xuXHRcdCQoJyNibm0tcmVtb3ZlQWxsSXBCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZW1vdmVBbGxJcENsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBDb25maWd1cmUgYmFuIHBhbmVsXG5cdFx0JCgnI2JubS1iYW5Nb2RhbCcpLm1vZGFsKHtcblx0XHRcdGJhY2tkcm9wOiAnc3RhdGljJyxcblx0XHRcdGtleWJvYXJkOiBmYWxzZSxcblx0XHRcdHNob3c6IGZhbHNlLFxuXHRcdH0pO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIGZvciBiYW4gcGFuZWwgaGlkZVxuXHRcdCQoJyNibm0tYmFuTW9kYWwnKS5vbignaGlkZGVuLmJzLm1vZGFsJywgJC5wcm94eSh0aGlzLl9vbkJhbk1vZGFsSGlkZGVuLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHZhbGlkYXRpb24gb24gZm9sZGVyIG5hbWUgZm9ybVxuXHRcdHRoaXMuX2JhblZhbGlkYXRvciA9ICQoJyNibm0tYmFuRm9ybScpLmtlbmRvVmFsaWRhdG9yKHt9KS5kYXRhKCdrZW5kb1ZhbGlkYXRvcicpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIEJhbiBidXR0b24gY2xpY2tcblx0XHQkKCcjYm5tLWJhbkJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkJhbkNsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0IGJhbiBkZWxheSBudW1lcmljIHN0ZXBwZXJcblx0XHR0aGlzLl9iYW5EZWxheUluID0gJCgnI2JubS1tb2RhbERlbGF5TlMnKS5rZW5kb051bWVyaWNUZXh0Qm94KHtcblx0XHQgICAgbWluOiAwLFxuXHRcdCAgICBzdGVwOiAxLFxuXHRcdCAgICBmb3JtYXQ6ICcjJ1xuXHRcdH0pLmRhdGEoJ2tlbmRvTnVtZXJpY1RleHRCb3gnKTtcblxuXHRcdC8vIEluaXQgYmFuIGV4cGlyYXRpb24gZGF0ZSBwaWNrZXJcblx0XHR0aGlzLl9iYW5FeHBEYXRlSW4gPSAkKCcjYm5tLWV4cGlyYXRpb25EUCcpLmtlbmRvRGF0ZVBpY2tlcih7XG5cdFx0XHR2YWx1ZTogdGhpcy5fdG9tb3Jyb3csXG5cdFx0XHRtaW46IHRoaXMuX3RvbW9ycm93LFxuXHRcdFx0Zm9vdGVyOiBmYWxzZSxcblx0XHRcdGZvcm1hdDogJ2RkL01NL3l5eXknXG5cdFx0fSkuZGF0YSgna2VuZG9EYXRlUGlja2VyJyk7XG5cblx0XHQvLyBEaXNhYmxlIG1hbnVhbCBkYXRlIGlucHV0XG5cdFx0JCgnI2JubS1leHBpcmF0aW9uRFAnKS5hdHRyKCdyZWFkb25seScsJ3JlYWRvbmx5Jyk7XG5cblx0XHQvLyBJbml0IGJhbiBleHBpcmF0aW9uIGhvdXJzL21pbnV0ZXMgaW5wdXRzXG5cdFx0dGhpcy5fYmFuRXhwSG91ckluID0gJCgnI2JubS1tb2RhbEV4cEhvdXJzTlMnKS5rZW5kb051bWVyaWNUZXh0Qm94KHtcblx0XHQgICAgbWluOiAwLFxuXHRcdFx0bWF4OiA5OSxcblx0XHQgICAgc3RlcDogMSxcblx0XHQgICAgZm9ybWF0OiAnIydcblx0XHR9KS5kYXRhKCdrZW5kb051bWVyaWNUZXh0Qm94Jyk7XG5cblx0XHR0aGlzLl9iYW5FeHBNaW5JbiA9ICQoJyNibm0tbW9kYWxFeHBNaW5zTlMnKS5rZW5kb051bWVyaWNUZXh0Qm94KHtcblx0XHQgICAgbWluOiAwLFxuXHRcdFx0bWF4OiA1OSxcblx0XHQgICAgc3RlcDogMSxcblx0XHQgICAgZm9ybWF0OiAnIydcblx0XHR9KS5kYXRhKCdrZW5kb051bWVyaWNUZXh0Qm94Jyk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIExvYWQgem9uZXMgbGlzdFxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX1pPTkVTKTtcblxuXHRcdC8vIExvYWQgYmFubmVkIElQIGFkZHJlc3Nlc1xuXHRcdC8vIE5vdGU6IHdlIGRvbid0IGxvYWQgdGhlIGJhbm5lZCB1c2VybmFtZXMgYXV0b21hdGljYWxseSBiZWNhdXNlIGEgem9uZSBtdXN0IGJlIHNlbGVjdGVkXG5cdFx0dGhpcy5fZ2V0QmFubmVkSVBzKCk7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXG5cdFx0Ly8gRGVzdHJveSBzY3JvbGxpbmcgdGFic1xuXHRcdCQoJyNibm0tdGFiTmF2aWdhdG9yICN0YWJzJykuc2Nyb2xsaW5nVGFicygnZGVzdHJveScpO1xuXG5cdFx0Ly8gUmVtb3ZlIGNsaWNrIGxpc3RlbmVyc1xuXHRcdCQoJyNibm0tc2hvd0Jhbk1vZGFsQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2JubS1yZWZyZXNoTmFtZXNCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYm5tLXJlbW92ZU5hbWVCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYm5tLXJlbW92ZUFsbE5hbWVzQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2JubS1yZWZyZXNoSXBCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYm5tLXJlbW92ZUlwQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2JubS1yZW1vdmVBbGxJcEJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNibm0tYmFuQnQnKS5vZmYoJ2NsaWNrJyk7XG5cblx0XHQvLyBIaWRlIGJhbiBwYW5lbFxuXHRcdCQoJyNibm0tYmFuTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuXG5cdFx0Ly8gUmVtb3ZlIHJvb20gY3JlYXRpb24gcGFuZWwgbGlzdGVuZXJcblx0XHQkKCcjYm5tLWJhbk1vZGFsJykub2ZmKCdoaWRkZW4uYnMubW9kYWwnKTtcblx0fVxuXG5cdG9uRXh0ZW5zaW9uQ29tbWFuZChjb21tYW5kLCBkYXRhKVxuXHR7XG5cdFx0Ly8gRGF0YSByZWNlaXZlZFxuXHRcdGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9aT05FUylcblx0XHR7XG5cdFx0XHRsZXQgem9uZXMgPSBkYXRhLmdldFV0ZlN0cmluZ0FycmF5KCd6b25lcycpO1xuXG5cdFx0XHQvLyBJZiB3ZSBoYXZlIDEgem9uZSBvbmx5LCB3ZSB3aWxsIHNlbGVjdCBpdCBpbW1lZGlhdGVseVxuXHRcdFx0Y29uc3Qgc2VsZWN0Rmlyc3Rab25lID0gem9uZXMubGVuZ3RoID09IDE7XG5cblx0XHRcdC8vIFNvcnQgem9uZXMgbGlzdFxuXHRcdFx0em9uZXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuXHRcdFx0XHRyZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEFkZCBcIm5vbmVcIiB6b25lXG5cdFx0XHR6b25lcy51bnNoaWZ0KCdbbm9uZV0nKTtcblxuXHRcdFx0Ly8gU2V0IHpvbmUgZHJvcGRvd24gZGF0YXNvdXJjZVxuXHRcdFx0dGhpcy5fem9uZXNERC5zZXREYXRhU291cmNlKHpvbmVzKTtcblxuXHRcdFx0aWYgKHNlbGVjdEZpcnN0Wm9uZSlcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5fem9uZXNERC5zZWxlY3QoMSk7XG5cdFx0XHRcdHRoaXMuX2dldEJhbm5lZFVzZXJuYW1lcygpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLl96b25lc0RELnNlbGVjdCgwKTtcblx0XHR9XG5cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9VU0VSTkFNRVMpXG5cdFx0e1xuXHRcdFx0Ly8gU3Vic3RpdHV0ZSBncmlkJ3MgZGF0YSBzb3VyY2UsIHJldGFpbmluZyBjdXJyZW50IHNvcnRpbmdcblx0XHRcdGxldCBjdXJyU29ydCA9IHRoaXMuX25hbWVzR3JpZC5kYXRhU291cmNlLnNvcnQoKTtcblxuXHRcdFx0bGV0IGRzID0gbmV3IGtlbmRvLmRhdGEuRGF0YVNvdXJjZSh7XG5cdFx0XHRcdHNjaGVtYToge1xuXHRcdFx0XHRcdG1vZGVsOiB7XG5cdFx0XHRcdFx0XHRmaWVsZHM6IHtcblx0XHRcdFx0XHRcdFx0ZXhwaXJhdGlvbkRhdGU6IHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnZGF0ZVRpbWUnLFxuXHRcdFx0XHRcdFx0XHRcdHBhcnNlOiBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1vbWVudChlLCAnREQvTU0vWVlZWSBISDptbScpLnRvRGF0ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0YmFuRGF0ZToge1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdkYXRlVGltZScsXG5cdFx0XHRcdFx0XHRcdFx0cGFyc2U6IGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGUsICdERC9NTS9ZWVlZIEhIOm1tJykudG9EYXRlKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzb3J0OiBjdXJyU29ydCwgLy8gRklYTUUgRXhwZWN0ZWQgc29ydGluZyBkb2Vzbid0IHNlZW0gdG8gYmUgYXBwbGllZFxuXHRcdFx0XHRkYXRhOiB0aGlzLl9nZW5lcmF0ZUJhbm5lZEVudHJpZXMoZGF0YS5nZXRTRlNBcnJheSgndU5hbWVzJykpXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXNzaWduIGRhdGEgc291cmNlIHRvIGdyaWRcblx0XHRcdHRoaXMuX25hbWVzR3JpZC5zZXREYXRhU291cmNlKGRzKTtcblxuXHRcdFx0Ly8gRW5hYmxlIHJlbW92ZSBhbGwgYnV0dG9uXG5cdFx0XHQkKCcjYm5tLXJlbW92ZUFsbE5hbWVzQnQnKS5hdHRyKCdkaXNhYmxlZCcsIGRzLnRvdGFsKCkgPT0gMClcblx0XHR9XG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfSVBBRERSRVNTRVMpXG5cdFx0e1xuXHRcdFx0Ly8gU3Vic3RpdHV0ZSBncmlkJ3MgZGF0YSBzb3VyY2UsIHJldGFpbmluZyBjdXJyZW50IHNvcnRpbmcgKEZJWClcblx0XHRcdGxldCBjdXJyU29ydCA9IHRoaXMuX2lwR3JpZC5kYXRhU291cmNlLnNvcnQoKTtcblxuXHRcdFx0bGV0IGRzID0gbmV3IGtlbmRvLmRhdGEuRGF0YVNvdXJjZSh7XG5cdFx0XHRcdHNjaGVtYToge1xuXHRcdFx0XHRcdG1vZGVsOiB7XG5cdFx0XHRcdFx0XHRmaWVsZHM6IHtcblx0XHRcdFx0XHRcdFx0ZXhwaXJhdGlvbkRhdGU6IHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnZGF0ZVRpbWUnLFxuXHRcdFx0XHRcdFx0XHRcdHBhcnNlOiBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1vbWVudChlLCAnREQvTU0vWVlZWSBISDptbScpLnRvRGF0ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0YmFuRGF0ZToge1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdkYXRlVGltZScsXG5cdFx0XHRcdFx0XHRcdFx0cGFyc2U6IGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGUsICdERC9NTS9ZWVlZIEhIOm1tJykudG9EYXRlKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzb3J0OiBjdXJyU29ydCwgLy8gRklYTUUgRXhwZWN0ZWQgc29ydGluZyBkb2Vzbid0IHNlZW0gdG8gYmUgYXBwbGllZFxuXHRcdFx0XHRkYXRhOiB0aGlzLl9nZW5lcmF0ZUJhbm5lZEVudHJpZXMoZGF0YS5nZXRTRlNBcnJheSgnSVBzJykpXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXNzaWduIGRhdGEgc291cmNlIHRvIGdyaWRcblx0XHRcdHRoaXMuX2lwR3JpZC5zZXREYXRhU291cmNlKGRzKTtcblxuXHRcdFx0Ly8gRW5hYmxlIHJlbW92ZSBhbGwgYnV0dG9uXG5cdFx0XHQkKCcjYm5tLXJlbW92ZUFsbElwQnQnKS5hdHRyKCdkaXNhYmxlZCcsIGRzLnRvdGFsKCkgPT0gMClcblx0XHR9XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBVSSBFVkVOVCBMSVNURU5FUlNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfb25TaG93QmFuTW9kYWxDbGljaygpXG5cdHtcblx0XHQvLyBEaXNwbGF5IHpvbmUgbmFtZVxuXHRcdCQoJyNibm0tbW9kYWxab25lTGInKS50ZXh0KHRoaXMuX3pvbmVzREQudmFsdWUoKSlcblxuXHRcdC8vIERpc3BsYXkgYmFuIHBhbmVsXG5cdFx0JCgnI2JubS1iYW5Nb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG5cblx0XHQvLyBGb2N1cyBuYW1lIGZpZWxkXG5cdFx0JCgnI2JubS1tb2RhbE5hbWVJbicpLmZvY3VzKCk7XG5cdH1cblxuXHRfb25CYW5Nb2RhbEhpZGRlbihlKVxuXHR7XG5cdFx0Ly8gUmVzZXQgdmFsaWRhdG9yXG5cdFx0dGhpcy5fYmFuVmFsaWRhdG9yLmhpZGVNZXNzYWdlcygpO1xuXG5cdFx0Ly8gVGhlIG1ldGhvZCBhYm92ZSBkb2Vzbid0IHJlbW92ZSB0aGUgay1pbnZhbGlkIGNsYXNzZXMgYW5kIGFyaWEtaW52YWxpZD1cInRydWVcIiBhdHRyaWJ1dGVzIGZyb20gaW5wdXRzXG5cdFx0Ly8gTGV0J3MgZG8gaXQgbWFudWFsbHlcblx0XHQkKCcjYm5tLWJhbkZvcm0gLmstaW52YWxpZCcpLnJlbW92ZUNsYXNzKCdrLWludmFsaWQnKTtcblx0XHQkKCcjYm5tLWJhbkZvcm0gW2FyaWEtaW52YWxpZD1cInRydWVcIl0nKS5yZW1vdmVBdHRyKCdhcmlhLWludmFsaWQnKTtcblxuXHRcdC8vIFJlc2V0IGJhbiBmb3JtXG5cdFx0JCgnI2JubS1tb2RhbE5hbWVJbicpLnZhbCgnJyk7XG5cdFx0JCgnI2JubS1tb2RhbFJlYXNvbkluJykudmFsKCcnKTtcblx0XHQkKCcjYm5tLW1vZGFsTWVzc2FnZUluJykudmFsKCcnKTtcblxuXHRcdHRoaXMuX2JhbkRlbGF5SW4udmFsdWUoNSk7XG5cblx0XHQkKCdpbnB1dFtuYW1lPVwiZXhwaXJhdGlvblwiXScpLnJlbW92ZUF0dHIoJ2NoZWNrZWQnKTtcblx0XHQkKCcjYm5tLWV4cGlyYXRpb25SQjAnKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG5cblx0XHR0aGlzLl9iYW5FeHBIb3VySW4udmFsdWUoMSk7XG5cdFx0dGhpcy5fYmFuRXhwTWluSW4udmFsdWUoMCk7XG5cblx0XHR0aGlzLl9iYW5FeHBEYXRlSW4ubWluKHRoaXMuX3RvbW9ycm93KTtcblx0XHR0aGlzLl9iYW5FeHBEYXRlSW4udmFsdWUodGhpcy5fdG9tb3Jyb3cpO1xuXHR9XG5cblx0X29uQmFuQ2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2JhblZhbGlkYXRvci52YWxpZGF0ZSgpKVxuXHRcdHtcblx0XHRcdC8vIFJldHJpZXZlIGJhbiBkZXRhaWxzXG5cdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgdGhpcy5fem9uZXNERC52YWx1ZSgpKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ25hbWUnLCAkKCcjYm5tLW1vZGFsTmFtZUluJykudmFsKCkpO1xuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygnbXNnJywgJCgnI2JubS1tb2RhbE1lc3NhZ2VJbicpLnZhbCgpKTtcblx0XHRcdHBhcmFtcy5wdXRJbnQoJ2RlbGF5JywgdGhpcy5fYmFuRGVsYXlJbi52YWx1ZSgpICE9IG51bGwgPyB0aGlzLl9iYW5EZWxheUluLnZhbHVlKCkgOiAwKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3JlYXNvbicsICQoJyNibm0tbW9kYWxSZWFzb25JbicpLnZhbCgpKTtcblxuXHRcdFx0Y29uc3QgZXhwID0gJCgnaW5wdXRbbmFtZT1cImV4cGlyYXRpb25cIl06Y2hlY2tlZCcpLnZhbCgpO1xuXHRcdFx0bGV0IGR1cmF0aW9uID0gLTE7XG5cblx0XHRcdGlmIChleHAgPT0gJ2FmdGVyJylcblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgaG91cnMgPSB0aGlzLl9iYW5FeHBIb3VySW4udmFsdWUoKSAhPSBudWxsID8gdGhpcy5fYmFuRXhwSG91ckluLnZhbHVlKCkgOiAwO1xuXHRcdFx0XHRjb25zdCBtaW51dGVzID0gdGhpcy5fYmFuRXhwTWluSW4udmFsdWUoKSAhPSBudWxsID8gdGhpcy5fYmFuRXhwTWluSW4udmFsdWUoKSA6IDA7XG5cblx0XHRcdFx0ZHVyYXRpb24gPSAoaG91cnMgKiA2MCkgKyBtaW51dGVzO1xuXG5cdFx0XHRcdGlmIChkdXJhdGlvbiA8PSAwKVxuXHRcdFx0XHRcdGR1cmF0aW9uID0gMTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGV4cCA9PSAnb24nKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBvbkRhdGUgPSBtb21lbnQodGhpcy5fYmFuRXhwRGF0ZUluLnZhbHVlKCkpO1xuXHRcdFx0XHRjb25zdCBub3cgPSBtb21lbnQoKTtcblxuXHRcdFx0XHRkdXJhdGlvbiA9IG9uRGF0ZS5zdGFydE9mKCdkYXknKS5kaWZmKG5vdy5zdGFydE9mKCdtaW51dGUnKSwgJ21pbnV0ZXMnKTtcblxuXHRcdFx0XHRpZiAoZHVyYXRpb24gPD0gMClcblx0XHRcdFx0XHRkdXJhdGlvbiA9IDE7XG5cdFx0XHR9XG5cblx0XHRcdHBhcmFtcy5wdXRJbnQoJ2R1ck1pbnMnLCBkdXJhdGlvbik7XG5cblx0XHRcdC8vIFNlbmQgYmFuIHJlcXVlc3QgdG8gc2VydmVyXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0JBTiwgcGFyYW1zKTtcblxuXHRcdFx0Ly8gUmVmcmVzaCBsaXN0XG5cdFx0XHR0aGlzLl9nZXRCYW5uZWRVc2VybmFtZXMoKTtcblxuXHRcdFx0Ly8gRm9jdXMgdXNlcm5hbWUgZmllbGRcblx0XHRcdCQoJyNibm0tbW9kYWxOYW1lSW4nKS5mb2N1cygpO1xuXHRcdFx0JCgnI2JubS1tb2RhbE5hbWVJbicpLnNlbGVjdCgpO1xuXHRcdH1cblx0fVxuXG5cdF9vblpvbmVDaGFuZ2UoKVxuXHR7XG5cdFx0JCgnI2JubS1uYW1lc0J1dHRvbnMnKS5hdHRyKCdkaXNhYmxlZCcsIHRoaXMuX3pvbmVzREQuc2VsZWN0KCkgPT0gMCk7XG5cdFx0JCgnI2JubS1zaG93QmFuTW9kYWxCdCcpLmF0dHIoJ2Rpc2FibGVkJywgdGhpcy5fem9uZXNERC5zZWxlY3QoKSA9PSAwKTtcblxuXHRcdHRoaXMuX2dldEJhbm5lZFVzZXJuYW1lcygpO1xuXHR9XG5cblx0X29uTmFtZXNHcmlkU2VsZWN0aW9uQ2hhbmdlKClcblx0e1xuXHRcdC8vIEVuYWJsZS9kaXNhYmxlIHJlbW92ZSBidXR0b25cblx0XHRjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLl9uYW1lc0dyaWQuc2VsZWN0KCk7XG5cdFx0JCgnI2JubS1yZW1vdmVOYW1lQnQnKS5hdHRyKCdkaXNhYmxlZCcsIHNlbGVjdGVkUm93cy5sZW5ndGggPT0gMCk7XG5cdH1cblxuXHRfb25JcEdyaWRTZWxlY3Rpb25DaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgcmVtb3ZlIGJ1dHRvblxuXHRcdGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuX2lwR3JpZC5zZWxlY3QoKTtcblx0XHQkKCcjYm5tLXJlbW92ZUlwQnQnKS5hdHRyKCdkaXNhYmxlZCcsIHNlbGVjdGVkUm93cy5sZW5ndGggPT0gMCk7XG5cdH1cblxuXHRfb25SZWZyZXNoTmFtZXNDbGljaygpXG5cdHtcblx0XHR0aGlzLl9nZXRCYW5uZWRVc2VybmFtZXMoKTtcblx0fVxuXG5cdF9vblJlbW92ZU5hbWVzQ2xpY2soKVxuXHR7XG5cdFx0dGhpcy5zaGVsbEN0cmwuc2hvd0NvbmZpcm1XYXJuaW5nKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBiYW5uaW5nIGZvciB0aGUgc2VsZWN0ZWQgdXNlcm5hbWUke3RoaXMuX2lwR3JpZC5zZWxlY3QoKS5sZW5ndGggPiAxID8gJ3MnIDogJyd9P2AsICQucHJveHkodGhpcy5fb25SZW1vdmVOYW1lc0NvbmZpcm0sIHRoaXMpKTtcblx0fVxuXG5cdF9vblJlbW92ZU5hbWVzQ29uZmlybSgpXG5cdHtcblx0XHRsZXQgc2VsZWN0ZWRSb3dzID0gdGhpcy5fbmFtZXNHcmlkLnNlbGVjdCgpO1xuXHRcdGxldCB1c2VybmFtZXMgPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0ZWRSb3dzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX25hbWVzR3JpZC5kYXRhSXRlbShzZWxlY3RlZFJvd3NbaV0pO1xuXHRcdFx0dXNlcm5hbWVzLnB1c2goZGF0YUl0ZW0ubmFtZSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fcmVxdWVzdEJhbm5lZFVzZXJzUmVtb3ZhbCh1c2VybmFtZXMsIHRoaXMuX3pvbmVzREQudmFsdWUoKSk7XG5cdH1cblxuXHRfb25SZW1vdmVBbGxOYW1lc0NsaWNrKClcblx0e1xuXHRcdHRoaXMuc2hlbGxDdHJsLnNob3dDb25maXJtV2FybmluZyhgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSBhbGwgYmFubmVkIHVzZXJuYW1lcz9gLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZBbGxOYW1lc0NvbmZpcm0sIHRoaXMpKTtcblx0fVxuXG5cdF9vblJlbW92QWxsTmFtZXNDb25maXJtKClcblx0e1xuXHRcdHRoaXMuX3JlcXVlc3RCYW5uZWRVc2Vyc1JlbW92YWwobnVsbCwgdGhpcy5fem9uZXNERC52YWx1ZSgpKTtcblx0fVxuXG5cdF9vblJlZnJlc2hJcENsaWNrKClcblx0e1xuXHRcdHRoaXMuX2dldEJhbm5lZElQcygpO1xuXHR9XG5cblx0X29uUmVtb3ZlSXBDbGljaygpXG5cdHtcblx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Q29uZmlybVdhcm5pbmcoYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdGhlIGJhbm5pbmcgZm9yIHRoZSBzZWxlY3RlZCBJUCBhZGRyZXNzJHt0aGlzLl9pcEdyaWQuc2VsZWN0KCkubGVuZ3RoID4gMSA/ICdlcycgOiAnJ30/YCwgJC5wcm94eSh0aGlzLl9vblJlbW92ZUlwQ29uZmlybSwgdGhpcykpO1xuXHR9XG5cblx0X29uUmVtb3ZlSXBDb25maXJtKClcblx0e1xuXHRcdGxldCBzZWxlY3RlZFJvd3MgPSB0aGlzLl9pcEdyaWQuc2VsZWN0KCk7XG5cdFx0bGV0IGlwQWRkcmVzc2VzID0gW107XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGVkUm93cy5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHRsZXQgZGF0YUl0ZW0gPSB0aGlzLl9pcEdyaWQuZGF0YUl0ZW0oc2VsZWN0ZWRSb3dzW2ldKTtcblx0XHRcdGlwQWRkcmVzc2VzLnB1c2goZGF0YUl0ZW0uaXBBZGRyZXNzKTtcblx0XHR9XG5cblx0XHR0aGlzLl9yZXF1ZXN0QmFubmVkSVBzUmVtb3ZhbChpcEFkZHJlc3Nlcyk7XG5cdH1cblxuXHRfb25SZW1vdmVBbGxJcENsaWNrKClcblx0e1xuXHRcdHRoaXMuc2hlbGxDdHJsLnNob3dDb25maXJtV2FybmluZyhgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSBhbGwgYmFubmVkIElQIGFkZHJlc3Nlcz9gLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZBbGxJcENvbmZpcm0sIHRoaXMpKTtcblx0fVxuXG5cdF9vblJlbW92QWxsSXBDb25maXJtKClcblx0e1xuXHRcdHRoaXMuX3JlcXVlc3RCYW5uZWRJUHNSZW1vdmFsKG51bGwpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBNRVRIT0RTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X2dldEJhbm5lZElQcygpXG5cdHtcblx0XHQvLyBSZW1vdmUgc2VsZWN0aW9uXG5cdFx0dGhpcy5faXBHcmlkLmNsZWFyU2VsZWN0aW9uKCk7XG5cblx0XHQvLyBDbGVhciBiYW5uZWQgSVBzIHRhYmxlXG5cdFx0dGhpcy5faXBHcmlkLnNldERhdGFTb3VyY2UoW10pO1xuXG5cdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIGV4dGVuc2lvblxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX0lQQUREUkVTU0VTKTtcblx0fVxuXG5cdF9nZXRCYW5uZWRVc2VybmFtZXMoKVxuXHR7XG5cdFx0Ly8gUmVtb3ZlIHNlbGVjdGlvblxuXHRcdHRoaXMuX25hbWVzR3JpZC5jbGVhclNlbGVjdGlvbigpO1xuXG5cdFx0Ly8gQ2xlYXIgYmFubmVkIElQcyB0YWJsZVxuXHRcdHRoaXMuX25hbWVzR3JpZC5zZXREYXRhU291cmNlKFtdKTtcblxuXHRcdGlmICh0aGlzLl96b25lc0RELnNlbGVjdCgpID4gMClcblx0XHR7XG5cdFx0XHQvLyBHZXQgem9uZSBJRFxuXHRcdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3pvbmUnLCB0aGlzLl96b25lc0RELnZhbHVlKCkpO1xuXG5cdFx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gZXh0ZW5zaW9uXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9VU0VSTkFNRVMsIHBhcmFtcyk7XG5cdFx0fVxuXHR9XG5cblx0X2dlbmVyYXRlQmFubmVkRW50cmllcyhiYW5EYXRhKVxuXHR7XG5cdFx0bGV0IGJhbm5lZEVudHJpZXMgPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYmFuRGF0YS5zaXplKCk7IGkrKylcblx0XHR7XG5cdFx0XHRjb25zdCBidSA9IEJhbm5lZFVzZXIuZnJvbVNGU0FycmF5KGJhbkRhdGEuZ2V0U0ZTQXJyYXkoaSkpO1xuXHRcdFx0YmFubmVkRW50cmllcy5wdXNoKGJ1KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYmFubmVkRW50cmllcztcblx0fVxuXG5cdF9yZXF1ZXN0QmFubmVkVXNlcnNSZW1vdmFsKHVzZXJuYW1lcywgem9uZSlcblx0e1xuXHRcdC8vIElmIHRoZSB1c2VybmFtZXMgYXJyYXkgaXMgbnVsbCwgc2VydmVyIHdpbGwgcmVtb3ZlIGFsbCBiYW5uZWQgdXNlcm5hbWVzXG5cdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgem9uZSk7XG5cblx0XHRpZiAodXNlcm5hbWVzID09IG51bGwpXG5cdFx0XHRwYXJhbXMucHV0TnVsbCgndU5hbWVzJyk7XG5cdFx0ZWxzZVxuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZ0FycmF5KCd1TmFtZXMnLCB1c2VybmFtZXMpO1xuXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9SRU1PVkVfVVNFUk5BTUVTLCBwYXJhbXMpO1xuXHR9XG5cblx0X3JlcXVlc3RCYW5uZWRJUHNSZW1vdmFsKGlwQWRkcmVzc2VzKVxuXHR7XG5cdFx0Ly8gSWYgdGhlIHVzZXJuYW1lcyBhcnJheSBpcyBudWxsLCBzZXJ2ZXIgd2lsbCByZW1vdmUgYWxsIGJhbm5lZCB1c2VybmFtZXNcblx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXG5cdFx0aWYgKGlwQWRkcmVzc2VzID09IG51bGwpXG5cdFx0XHRwYXJhbXMucHV0TnVsbCgnSVBzJyk7XG5cdFx0ZWxzZVxuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZ0FycmF5KCdJUHMnLCBpcEFkZHJlc3Nlcyk7XG5cblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX1JFTU9WRV9JUEFERFJFU1NFUywgcGFyYW1zKTtcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgR0VUVEVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdGdldCBfdG9tb3Jyb3coKVxuXHR7XG5cdFx0bGV0IHRvbW9ycm93ID0gbW9tZW50KCkuYWRkKDEsICdkJyk7XG5cdFx0cmV0dXJuIHRvbW9ycm93LnRvRGF0ZSgpO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUMxQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBIiwic291cmNlUm9vdCI6IiJ9
@@ -374,9 +374,6 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
374
374
  // Create file data source manager
375
375
  this._fileManager = new _managers_file_datasource_manager__WEBPACK_IMPORTED_MODULE_1__["FileDataSourceManager"](null, [], this._fileSeparator);
376
376
 
377
- // Retrieve HTTP port to be used for files uploading
378
- const uploadHttpPort = data.getInt('httpPort');
379
-
380
377
  // Retrieve module id sent by the server (required because multiple modules use file uploading service)
381
378
  const uploadModuleId = data.getUtfString('modId');
382
379
 
@@ -384,8 +381,9 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
384
381
  this._uploadTargetConfig = {
385
382
  sessionToken: this.smartFox.sessionToken,
386
383
  host: this.smartFox.config.host,
387
- httpPort: uploadHttpPort,
384
+ port: this.smartFox.config.port,
388
385
  moduleId: uploadModuleId,
386
+ protocol: this.smartFox.config.useSSL ? 'https' : 'http'
389
387
  };
390
388
 
391
389
  // Request Servlet files data to server instance
@@ -468,7 +466,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
468
466
  if (requester == this.smartFox.mySelf.name)
469
467
  {
470
468
  // Expand parent
471
- this._filesList.expand($(`#svm-fileList .file-controls[data-item-id="${parentPath}"]`).closest('tr'));
469
+ this._filesList.expand($(`#svm-fileList .file-controls[data-item-id="${$.escapeSelector(parentPath)}"]`).closest('tr'));
472
470
 
473
471
  if (!isUpload)
474
472
  {
@@ -476,7 +474,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
476
474
  this._addFolderModal.modal('hide');
477
475
 
478
476
  // Select upload file
479
- this._filesList.select($(`#svm-fileList .file-controls[data-item-id="${filePath}"]`).closest('tr'));
477
+ this._filesList.select($(`#svm-fileList .file-controls[data-item-id="${$.escapeSelector(filePath)}"]`).closest('tr'));
480
478
  }
481
479
 
482
480
  // Update selection
@@ -526,7 +524,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
526
524
 
527
525
  // Collapse parent if the last of its children was deleted
528
526
  if (parentItem && !parentItem.hasChildren)
529
- this._filesList.collapse($(`#svm-fileList .file-controls[data-item-id="${parentItem.id}"]`).closest('tr'));
527
+ this._filesList.collapse($(`#svm-fileList .file-controls[data-item-id="${$.escapeSelector(parentItem.id)}"]`).closest('tr'));
530
528
  }
531
529
 
532
530
  if (requester == this.smartFox.mySelf.name)
@@ -573,7 +571,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
573
571
  {
574
572
  // Hide control buttons on currently selected item
575
573
  if (this._selectedItem)
576
- $(`#svm-fileList .file-controls[data-item-id="${this._selectedItem.id}"]`).hide();
574
+ $(`#svm-fileList .file-controls[data-item-id="${$.escapeSelector(this._selectedItem.id)}"]`).hide();
577
575
 
578
576
  // Get selected item
579
577
  let selectedRows = this._filesList.select();
@@ -584,7 +582,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
584
582
  this._selectedItem = this._filesList.dataItem(selectedRows[0]);
585
583
 
586
584
  // Show control buttons on new selected item
587
- $(`#svm-fileList .file-controls[data-item-id="${this._selectedItem.id}"]`).show();
585
+ $(`#svm-fileList .file-controls[data-item-id="${$.escapeSelector(this._selectedItem.id)}"]`).show();
588
586
  }
589
587
  else
590
588
  this._selectedItem = null;
@@ -648,7 +646,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
648
646
  $('#svm-clearFilesBt').attr('disabled', true);
649
647
 
650
648
  // Set destination url
651
- const url = 'http://' + this._uploadTargetConfig.host + ':' + this._uploadTargetConfig.httpPort + '/BlueBox/SFS2XFileUpload?sessHashId=' + this._uploadTargetConfig.sessionToken;
649
+ const url = this._uploadTargetConfig.protocol + '://' + this._uploadTargetConfig.host + ':' + this._uploadTargetConfig.port + '/BlueBox/SFS2XFileUpload?sessHashId=' + this._uploadTargetConfig.sessionToken;
652
650
 
653
651
  e.sender.options.async.saveUrl = url;
654
652
 
@@ -763,4 +761,4 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
763
761
  /***/ })
764
762
 
765
763
  }]);
766
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMTAuYnVuZGxlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbWFuYWdlcnMvZmlsZS1kYXRhc291cmNlLW1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbW9kdWxlcy9zZXJ2bGV0LW1hbmFnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEZpbGVEYXRhU291cmNlTWFuYWdlclxue1xuXHRjb25zdHJ1Y3RvcihsaWJGb2xkZXIsIHByb3RlY3RlZEZvbGRlcnMsIGZpbGVTZXBhcmF0b3IpXG5cdHtcblx0XHR0aGlzLl9wcm90ZWN0ZWRGb2xkZXJzID0gcHJvdGVjdGVkRm9sZGVyczsgLy8gRm9sZGVycyB3aGljaCBjYW4ndCBiZSBkZWxldGVkIChidXQgdGhlaXIgY29udGVudCBjYW4pXG5cdFx0dGhpcy5fbGliRm9sZGVyID0gbGliRm9sZGVyO1xuXHRcdHRoaXMuX2ZpbGVTZXBhcmF0b3IgPSBmaWxlU2VwYXJhdG9yO1xuXHR9XG5cblx0Z2V0IGRhdGFTb3VyY2UoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2RhdGFTb3VyY2U7XG5cdH1cblxuXHRpbml0KClcblx0e1xuXHRcdHRoaXMuX2RhdGFTb3VyY2UgPSBuZXcga2VuZG8uZGF0YS5UcmVlTGlzdERhdGFTb3VyY2Uoe1xuXHRcdFx0ZGF0YTogW10sXG5cdFx0XHRzY2hlbWE6IHtcblx0XHRcdFx0bW9kZWw6IHtcblx0XHRcdFx0XHRpZDogJ2lkJyxcblx0XHRcdFx0XHRwYXJlbnRJZDogJ3BhcmVudElkJyxcblx0XHRcdFx0XHRleHBhbmRlZDogZmFsc2Vcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHNvcnQ6IHsgZmllbGQ6ICduYW1lJywgZGlyOiAnYXNjJyB9XG5cdFx0fSk7XG5cdH1cblxuXHRhZGRGaWxlKGZpbGVPYmosIHBhcmVudExldmVsID0gbnVsbClcblx0e1xuXHRcdGxldCBmaWxlID0ge307XG5cblx0XHRmaWxlLm5hbWUgPSBmaWxlT2JqLmdldFV0ZlN0cmluZygnbmFtZScpO1xuXHRcdGZpbGUuaXNEaXIgPSBmaWxlT2JqLmdldEJvb2woJ2lzRGlyJyk7XG5cdFx0ZmlsZS5sYXN0TW9kID0gZmlsZU9iai5nZXRMb25nKCdsYXN0TW9kJyk7XG5cdFx0ZmlsZS5pc0xpYiA9IChmaWxlLmlzRGlyICYmIGZpbGUubmFtZSA9PSB0aGlzLl9saWJGb2xkZXIpO1xuXHRcdGZpbGUuaXNQcm90ZWN0ZWQgPSAoZmlsZS5pc0RpciAmJiB0aGlzLl9wcm90ZWN0ZWRGb2xkZXJzLmluZGV4T2YoZmlsZS5uYW1lKSA+IC0xKTtcblx0XHRmaWxlLnNpemUgPSAwO1xuXG5cdFx0aWYgKHBhcmVudExldmVsID09IG51bGwpXG5cdFx0XHRmaWxlLmxldmVsID0gMDtcblx0XHRlbHNlXG5cdFx0XHRmaWxlLmxldmVsID0gcGFyZW50TGV2ZWwgKyAxO1xuXG5cdFx0aWYgKGZpbGVPYmouY29udGFpbnNLZXkoJ3BhcmVudCcpKVxuXHRcdHtcblx0XHRcdGZpbGUucGFyZW50SWQgPSBmaWxlT2JqLmdldFV0ZlN0cmluZygncGFyZW50Jyk7XG5cdFx0XHRmaWxlLmlkID0gZmlsZS5wYXJlbnRJZCArIHRoaXMuX2ZpbGVTZXBhcmF0b3IgKyBmaWxlLm5hbWU7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRmaWxlLnBhcmVudElkID0gbnVsbDtcblx0XHRcdGZpbGUuaWQgPSBmaWxlLm5hbWU7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGNoaWxkIGZpbGVzXG5cdFx0aWYgKGZpbGUuaXNEaXIpXG5cdFx0e1xuXHRcdFx0bGV0IGZpbGVzQXJyID0gZmlsZU9iai5nZXRTRlNBcnJheSgnZmlsZXMnKTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlc0Fyci5zaXplKCk7IGkrKylcblx0XHRcdFx0ZmlsZS5zaXplICs9IHRoaXMuYWRkRmlsZShmaWxlc0Fyci5nZXRTRlNPYmplY3QoaSksIGZpbGUubGV2ZWwpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHRmaWxlLnNpemUgPSBmaWxlT2JqLmdldExvbmcoJ3NpemUnKTtcblxuXHRcdC8vIEFkZCBmaWxlIHRvIGRhdGEgc291cmNlXG5cdFx0dGhpcy5fZGF0YVNvdXJjZS5hZGQoZmlsZSk7XG5cblx0XHQvLyBSZXR1cm4gZmlsZSBzaXplXG5cdFx0cmV0dXJuIGZpbGUuc2l6ZTtcblx0fVxuXG5cdHJlbW92ZUZpbGUoaWQpXG5cdHtcblx0XHRsZXQgZmlsZUl0ZW0gPSB0aGlzLl9kYXRhU291cmNlLmdldChpZCk7XG5cblx0XHRpZiAoZmlsZUl0ZW0pXG5cdFx0e1xuXHRcdFx0aWYgKGZpbGVJdGVtLnBhcmVudElkKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTdWJ0cmFjdCBvbGQgc2l6ZSBmcm9tIHBhcmVudCBzaXplXG5cdFx0XHRcdGxldCBwYXJlbnRJdGVtID0gdGhpcy5fZGF0YVNvdXJjZS5nZXQoZmlsZUl0ZW0ucGFyZW50SWQpO1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXJlbnRTaXplKHBhcmVudEl0ZW0sIC1maWxlSXRlbS5zaXplKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fZGF0YVNvdXJjZS5yZW1vdmUoZmlsZUl0ZW0pO1xuXG5cdFx0XHQvLyBSZXR1cm4gcGFyZW50IGl0ZW1cblx0XHRcdGlmIChmaWxlSXRlbS5wYXJlbnRJZClcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2RhdGFTb3VyY2UuZ2V0KGZpbGVJdGVtLnBhcmVudElkKTtcblx0XHR9XG5cdH1cblxuXHRnZXRGaWxlQnlJZChpZClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kYXRhU291cmNlLmdldChpZCk7XG5cdH1cblxuXHRhZGRGaWxlVG9QYXJlbnQoZmlsZU9iaiwgcGFyZW50SWQpXG5cdHtcblx0XHRsZXQgcGFyZW50SXRlbSA9IHRoaXMuX2RhdGFTb3VyY2UuZ2V0KHBhcmVudElkKTtcblxuXHRcdGlmIChwYXJlbnRJdGVtICE9IG51bGwgJiYgcGFyZW50SXRlbS5pc0Rpcilcblx0XHR7XG5cdFx0XHRjb25zdCBmaWxlSWQgPSBwYXJlbnRJZCArIHRoaXMuX2ZpbGVTZXBhcmF0b3IgKyBmaWxlT2JqLmdldFV0ZlN0cmluZygnbmFtZScpO1xuXHRcdFx0bGV0IGZpbGVJdGVtID0gdGhpcy5fZGF0YVNvdXJjZS5nZXQoZmlsZUlkKTtcblxuXHRcdFx0aWYgKGZpbGVJdGVtICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFN1YnRyYWN0IG9sZCBzaXplIGZyb20gcGFyZW50IHNpemVcblx0XHRcdFx0dGhpcy5fdXBkYXRlUGFyZW50U2l6ZShwYXJlbnRJdGVtLCAtZmlsZUl0ZW0uc2l6ZSk7XG5cblx0XHRcdFx0Ly8gVXBkYXRlIGV4aXN0aW5nIGl0ZW1cblx0XHRcdFx0ZmlsZUl0ZW0ubmFtZSA9IGZpbGVPYmouZ2V0VXRmU3RyaW5nKCduYW1lJyk7XG5cdFx0XHRcdGZpbGVJdGVtLmxhc3RNb2QgPSBmaWxlT2JqLmdldExvbmcoJ2xhc3RNb2QnKTtcblx0XHRcdFx0ZmlsZUl0ZW0uc2l6ZSA9IGZpbGVPYmouZ2V0TG9uZygnc2l6ZScpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBBZGQgbmV3IGl0ZW1cblx0XHRcdFx0dGhpcy5hZGRGaWxlKGZpbGVPYmosIHBhcmVudEl0ZW0ubGV2ZWwpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgcGFyZW50IGl0ZW0gc2l6ZVxuXHRcdFx0dGhpcy5fdXBkYXRlUGFyZW50U2l6ZShwYXJlbnRJdGVtLCBmaWxlT2JqLmdldExvbmcoJ3NpemUnKSk7XG5cblx0XHRcdHJldHVybiBmaWxlSWQ7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRocm93IG5ldyBFcnJvcihgQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSBhZGRpbmcgZmlsZSAnJHtmaWxlT2JqLmdldFV0ZlN0cmluZygnbmFtZScpfScgKHRhcmdldDogJHtwYXJlbnRJZH0pLmApO1xuXHR9XG5cblx0X3VwZGF0ZVBhcmVudFNpemUocGFyZW50SXRlbSwgdmFsdWUpXG5cdHtcblx0XHRwYXJlbnRJdGVtLnNpemUgKz0gdmFsdWU7XG5cblx0XHRpZiAocGFyZW50SXRlbS5wYXJlbnRJZClcblx0XHR7XG5cdFx0XHRsZXQgZ3JhbmRQYXJlbnQgPSB0aGlzLl9kYXRhU291cmNlLmdldChwYXJlbnRJdGVtLnBhcmVudElkKTtcblx0XHRcdHRoaXMuX3VwZGF0ZVBhcmVudFNpemUoZ3JhbmRQYXJlbnQsIHZhbHVlKTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge0ZpbGVEYXRhU291cmNlTWFuYWdlcn0gZnJvbSAnLi4vbWFuYWdlcnMvZmlsZS1kYXRhc291cmNlLW1hbmFnZXInO1xuaW1wb3J0IHtieXRlc1RvU2l6ZX0gZnJvbSAnLi4vdXRpbHMvdXRpbGl0aWVzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VydmxldE1hbmFnZXIgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ3NlcnZsZXRNYW4nKTtcblxuXHRcdC8vIE91dGdvaW5nIHJlcXVlc3RzXG5cdFx0dGhpcy5SRVFfSU5JVCA9ICdpbml0Jztcblx0XHR0aGlzLlJFUV9HRVRfU0VSVkxFVFMgPSAnZ2V0U2VydmxldHMnO1xuXHRcdHRoaXMuUkVRX0NSRUFURV9GT0xERVIgPSAnY3JlYXRlRm9sZGVyJztcblx0XHR0aGlzLlJFUV9ERUxFVEVfRklMRVMgPSAnZGVsZXRlU3J2bHRGaWxlcyc7XG5cblx0XHQvLyBJbmNvbWluZyByZXNwb25zZXNcblx0XHR0aGlzLlJFU1BfTE9DS0VEID0gJ2xvY2snO1xuXHRcdHRoaXMuUkVTUF9JTklUID0gJ2luaXQnO1xuXHRcdHRoaXMuUkVTUF9TRVJWTEVUUyA9ICdzZXJ2bGV0cyc7XG5cdFx0dGhpcy5SRVNQX0ZJTEVfQURERUQgPSAnZmlsZUFkZGVkJztcblx0XHR0aGlzLlJFU1BfRklMRVNfREVMRVRFRCA9ICdmaWxlc0RlbGV0ZWQnO1xuXHRcdHRoaXMuUkVTUF9FUlJPUiA9ICdlcnJvcic7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBDT01NT04gTU9EVUxFIElOVEVSRkFDRSBNRVRIT0RTXG5cdC8vIFRoaXMgbWVtYmVycyBhcmUgdXNlZCBieSB0aGUgbWFpbiBjb250cm9sbGVyXG5cdC8vIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1vZHVsZSdzIGNvbnRyb2xsZXIuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0aW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcilcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuaW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcik7XG5cblx0XHQvLyBJbml0aWFsaXplIHByb2dyZXNzIGJhclxuXHRcdCQoJyNzdm0tcHJvZ3Jlc3NCYXInKS5rZW5kb1Byb2dyZXNzQmFyKHtcblx0XHRcdG1pbjogMCxcbiAgICAgICAgICAgIG1heDogMTAwLFxuXHRcdFx0dmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJyxcbiAgICAgICAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA0MDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXJzIHRvIGJ1dHRvbnNcblx0XHQkKCcjc3ZtLXJldHJ5QnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmV0cnlDbGljaywgdGhpcykpO1xuXHRcdCQoJyNzdm0tcmVmcmVzaEJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJlZnJlc2hDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBmaWxlcyBsaXN0XG5cdFx0dGhpcy5fZmlsZXNMaXN0ID0gJCgnI3N2bS1maWxlTGlzdCcpLmtlbmRvVHJlZUxpc3Qoe1xuICAgICAgICAgICAgZGF0YVNvdXJjZTogW10sXG5cdFx0XHRyZXNpemFibGU6IHRydWUsXG5cdFx0XHRzZWxlY3RhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29sdW1uczogW1xuICAgICAgICAgICAgICAgIHtcblx0XHRcdFx0XHRmaWVsZDogJ25hbWUnLFxuXHRcdFx0XHRcdHRpdGxlOiAnTmFtZScsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdFx0XHRcdDxkaXYgPlxuXHRcdFx0XHRcdFx0XHQjIGlmIChpc0RpcikgeyAjXG5cdFx0XHRcdFx0XHRcdFx0IyBpZiAoZXhwYW5kZWQpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtZm9sZGVyLW9wZW5cIj48L2k+XG5cdFx0XHRcdFx0XHRcdFx0IyB9IGVsc2UgeyAjXG5cdFx0XHRcdFx0XHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1mb2xkZXJcIj48L2k+XG5cdFx0XHRcdFx0XHRcdFx0IyB9ICNcblx0XHRcdFx0XHRcdFx0IyB9IGVsc2UgeyAjXG5cdFx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXIgZmEtZmlsZVwiPjwvaT5cblx0XHRcdFx0XHRcdFx0IyB9ICNcblxuXHRcdFx0XHRcdFx0XHQjOiBuYW1lICNcblxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmlsZS1jb250cm9scyBmbGV4LWdyb3ctMSB0ZXh0LXJpZ2h0XCIgZGF0YS1pdGVtLWlkPVwiIzppZCNcIj5cblx0XHRcdFx0XHRcdFx0IyBpZiAoaXNEaXIpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1wcmltYXJ5IG15LTEgY3JlYXRlLWZvbGRlci1idFwiPjxpIGNsYXNzPVwiZmFzIGZhLWZvbGRlci1wbHVzXCI+PC9pPjwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1wcmltYXJ5IG15LTEgdXBsb2FkLWZpbGVzLWJ0XCI+PGkgY2xhc3M9XCJmYXMgZmEtZmlsZS11cGxvYWRcIj48L2k+PC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdCMgfSAjXG5cblx0XHRcdFx0XHRcdFx0IyBpZiAobGV2ZWwgPiAwICYmICFpc1Byb3RlY3RlZCkgeyAjXG5cdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnkgbXktMSByZW1vdmUtZmlsZS1idFwiPjxpIGNsYXNzPVwiZmFzIGZhLW1pbnVzLWNpcmNsZVwiPjwvaT48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0IyB9ICNcblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdGApLFxuXHRcdFx0XHR9LFxuICAgICAgICAgICAgICAgIHtcblx0XHRcdFx0XHRmaWVsZDogJ3NpemUnLFxuXHRcdFx0XHRcdHRpdGxlOiAnU2l6ZScsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0XHRcdFx0XHRkYXRhSXRlbS5ieXRlc1RvU2l6ZSA9IGJ5dGVzVG9TaXplOyAvLyBQYXNzIGJ5dGVzVG9TaXplIHV0aWxpdHkgZnVuY3Rpb24gdG8gdGVtcGxhdGVcblx0XHRcdFx0XHRcdHJldHVybiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHRcdFx0XHRcdCM6IGJ5dGVzVG9TaXplKHNpemUsIDIsICdLQicpICNcblx0XHRcdFx0XHRcdGApKGRhdGFJdGVtKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHdpZHRoOiAxMjAsXG5cdFx0XHRcdFx0bWluU2NyZWVuV2lkdGg6IDU3NlxuXHRcdFx0XHR9LFxuICAgICAgICAgICAgICAgIHtcblx0XHRcdFx0XHRmaWVsZDogJ2xhc3RNb2QnLFxuXHRcdFx0XHRcdHRpdGxlOiAnTGFzdCBNb2RpZmllZCcsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdFx0XHRcdCM6IGtlbmRvLnRvU3RyaW5nKG5ldyBEYXRlKGxhc3RNb2QpLCAnZGQgTU1NIHl5eXkgSEg6bW06c3MnKSAjXG5cdFx0XHRcdFx0YCksXG5cdFx0XHRcdFx0d2lkdGg6IDIwMCxcblx0XHRcdFx0XHRtaW5TY3JlZW5XaWR0aDogNzY4XG5cdFx0XHRcdH0sXG4gICAgICAgICAgICBdLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uRmlsZVNlbGVjdGVkQ2hhbmdlLCB0aGlzKVxuICAgICAgICB9KS5kYXRhKCdrZW5kb1RyZWVMaXN0Jyk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIEFkZCBsaXN0ZW5lcnMgdG8gY2F0Y2ggY29udHJvbCBidXR0b24gY2xpY2tzIG9uIHJvd3Ncblx0XHQkKCcjc3ZtLWZpbGVMaXN0Jykub24oJ2NsaWNrJywgJy5jcmVhdGUtZm9sZGVyLWJ0JywgJC5wcm94eSh0aGlzLl9zaG93QWRkRm9sZGVyTW9kYWxDbGljaywgdGhpcykpO1xuXHRcdCQoJyNzdm0tZmlsZUxpc3QnKS5vbignY2xpY2snLCAnLnVwbG9hZC1maWxlcy1idCcsICQucHJveHkodGhpcy5fc2hvd1VwbG9hZEZpbGVzTW9kYWxDbGljaywgdGhpcykpO1xuXHRcdCQoJyNzdm0tZmlsZUxpc3QnKS5vbignY2xpY2snLCAnLnJlbW92ZS1maWxlLWJ0JywgJC5wcm94eSh0aGlzLl9vblJlbW92ZUZpbGVDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBJbml0aWFsaXplIFwiYWRkIGZvbGRlclwiIG1vZGFsXG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwgPSAkKCcjc3ZtLWFkZEZvbGRlck1vZGFsJyk7XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2Vcblx0XHR9KTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBtb2RhbCBoaWRlIGV2ZW50XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwub24oJ2hpZGRlbi5icy5tb2RhbCcsICQucHJveHkodGhpcy5fb25BZGRGb2xkZXJNb2RhbEhpZGRlbiwgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIEFkZCBidXR0b24gY2xpY2tcblx0XHQkKCcjc3ZtLWFkZEZvbGRlckJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkFkZEZvbGRlckNsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHZhbGlkYXRpb24gb24gZm9sZGVyIG5hbWUgZm9ybVxuXHRcdHRoaXMuX2FkZEZvbGRlclZhbGlkYXRvciA9ICQoJyNzdm0tYWRkRm9sZGVyRm9ybScpLmtlbmRvVmFsaWRhdG9yKHt9KS5kYXRhKCdrZW5kb1ZhbGlkYXRvcicpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBJbml0aWFsaXplIFwidXBsb2FkIGZpbGVzXCIgbW9kYWxcblx0XHR0aGlzLl91cGxvYWRGaWxlc01vZGFsID0gJCgnI3N2bS11cGxvYWRNb2RhbCcpO1xuXHRcdHRoaXMuX3VwbG9hZEZpbGVzTW9kYWwubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2Vcblx0XHR9KTtcblxuXHRcdC8vIEluaXRpYWxpemUga2VuZG8gdXBsb2FkZXJcblx0XHR0aGlzLl91cGxvYWRlciA9ICQoJyNzdm0tdXBsb2FkZXInKS5rZW5kb1VwbG9hZCh7XG5cdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdGFzeW5jOiB7XG5cdFx0XHRcdHNhdmVVcmw6ICdodHRwOi8vbG9jYWxob3N0JywgLy8gVGhpcyB3aWxsIGJlIGNoYW5nZWQgbGF0ZXIgaW4gX29uVXBsb2FkU3RhcnQgbWV0aG9kXG5cdFx0XHRcdGF1dG9VcGxvYWQ6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0ZGlyZWN0b3J5RHJvcDogdHJ1ZSxcblx0XHRcdHVwbG9hZDogJC5wcm94eSh0aGlzLl9vblVwbG9hZFN0YXJ0LCB0aGlzKSxcblx0XHRcdGNvbXBsZXRlOiAkLnByb3h5KHRoaXMuX29uVXBsb2FkRW5kLCB0aGlzKSxcblx0XHRcdGxvY2FsaXphdGlvbjoge1xuXHRcdFx0XHRzZWxlY3Q6ICdTZWxlY3QgZmlsZXMuLi4nXG5cdFx0XHR9XG5cdFx0fSkuZGF0YSgna2VuZG9VcGxvYWQnKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBVcGxvYWQgYnV0dG9uIGNsaWNrXG5cdFx0JCgnI3N2bS1jbGVhckZpbGVzQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQ2xlYXJGaWxlc0NsaWNrLCB0aGlzKSk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIFNlbmQgaW5pdGlhbGl6YXRpb24gcmVxdWVzdFxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfSU5JVCk7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXG5cdFx0JCgnI3N2bS1yZXRyeUJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNzdm0tcmVmcmVzaEJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0JCgnI3N2bS1maWxlTGlzdCcpLm9mZignY2xpY2snKTtcblxuXHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm9mZignaGlkZGVuLmJzLm1vZGFsJyk7XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoJ2Rpc3Bvc2UnKTtcblx0XHQkKCcjc3ZtLWFkZEZvbGRlckJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0dGhpcy5fdXBsb2FkRmlsZXNNb2RhbC5tb2RhbCgnZGlzcG9zZScpO1xuXHRcdCQoJyNzdm0tY2xlYXJGaWxlc0J0Jykub2ZmKCdjbGljaycpO1xuXHR9XG5cblx0b25FeHRlbnNpb25Db21tYW5kKGNvbW1hbmQsIGRhdGEpXG5cdHtcblx0XHQvLyBNb2R1bGUgY2FuIGJlIGVuYWJsZWQgKG5vIGxvY2tpbmcgZmlsZSBleGlzdHMpXG5cdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0lOSVQpXG5cdFx0e1xuXHRcdFx0Ly8gUmV0cmlldmUgZmlsZSBzZXBhcmF0b3Jcblx0XHRcdHRoaXMuX2ZpbGVTZXBhcmF0b3IgPSBkYXRhLmdldFV0ZlN0cmluZygnc2VwJyk7XG5cblx0XHRcdC8vIENyZWF0ZSBmaWxlIGRhdGEgc291cmNlIG1hbmFnZXJcblx0XHRcdHRoaXMuX2ZpbGVNYW5hZ2VyID0gbmV3IEZpbGVEYXRhU291cmNlTWFuYWdlcihudWxsLCBbXSwgdGhpcy5fZmlsZVNlcGFyYXRvcik7XG5cblx0XHRcdC8vIFJldHJpZXZlIEhUVFAgcG9ydCB0byBiZSB1c2VkIGZvciBmaWxlcyB1cGxvYWRpbmdcblx0XHRcdGNvbnN0IHVwbG9hZEh0dHBQb3J0ID0gZGF0YS5nZXRJbnQoJ2h0dHBQb3J0Jyk7XG5cblx0XHRcdC8vIFJldHJpZXZlIG1vZHVsZSBpZCBzZW50IGJ5IHRoZSBzZXJ2ZXIgKHJlcXVpcmVkIGJlY2F1c2UgbXVsdGlwbGUgbW9kdWxlcyB1c2UgZmlsZSB1cGxvYWRpbmcgc2VydmljZSlcblx0XHRcdGNvbnN0IHVwbG9hZE1vZHVsZUlkID0gZGF0YS5nZXRVdGZTdHJpbmcoJ21vZElkJyk7XG5cblx0XHRcdC8vIFNldCBmaWxlIHVwbG9hZGluZyB0YXJnZXQgY29uZmlndXJhdGlvblxuXHRcdFx0dGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnID0ge1xuXHRcdFx0XHRzZXNzaW9uVG9rZW46IHRoaXMuc21hcnRGb3guc2Vzc2lvblRva2VuLFxuXHRcdFx0XHRob3N0OiB0aGlzLnNtYXJ0Rm94LmNvbmZpZy5ob3N0LFxuXHRcdFx0XHRodHRwUG9ydDogdXBsb2FkSHR0cFBvcnQsXG5cdFx0XHRcdG1vZHVsZUlkOiB1cGxvYWRNb2R1bGVJZCxcblx0XHRcdH07XG5cblx0XHRcdC8vIFJlcXVlc3QgU2VydmxldCBmaWxlcyBkYXRhIHRvIHNlcnZlciBpbnN0YW5jZVxuXHRcdFx0dGhpcy5fcmVmcmVzaERhdGFMaXN0KCk7XG5cdFx0fVxuXG5cdFx0Lypcblx0XHQgKiBUaGlzIHJlc3BvbnNlIGlzIHJldHVybmVkIGlmIHRoZSBmaWxlIFVwbG9hZHNMb2NrLnR4dCBleGlzdHMgaW4gdGhlIC9jb25maWcgZm9sZGVyIG9mIHRoZSBzZXJ2ZXIuXG5cdFx0ICogVGhpcyBpcyBhbiBhZGRpdGlvbmFsIHNlY3VyaXR5IG1lYXN1cmUgdG8gYXZvaWQgdW53YW50ZWQgZmlsZXMgdG8gYmUgdXBsb2FkZWQgYnkgbWFsaWNpdXMgdXNlcnMgYWNjZXNzaW5nIHRoZSBzZXJ2ZXJcblx0XHQgKiB3aXRoIHRoZSBkZWZhdWx0IGNyZWRlbnRpYWxzLCBpbiBjYXNlIHRoZXkgaGF2ZSBub3QgYmVlbiBjaGFuZ2VkIGJ5IHRoZSBhZG1pbmlzdHJhdG9yIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24uXG5cdFx0ICogVGhlIGZpbGUgbXVzdCBiZSByZW1vdmVkIG1hbnVhbGx5IGJlZm9yZSBhY2Nlc3NpbmcgdGhlIFNlcnZsZXQgTWFuYWdlciBtb2R1bGUgZm9yIHRoZSBmaXJzdCB0aW1lXG5cdFx0ICovXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfTE9DS0VEKVxuXHRcdHtcblx0XHRcdC8vIFNob3cgd2FybmluZ1xuXHRcdFx0dGhpcy5fc3dpdGNoVmlldygnc3ZtLWxvY2tlZCcpO1xuXHRcdH1cblxuXHRcdC8vIFNlcnZsZXQgZm9sZGVycyBhbmQgZmlsZXNcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9TRVJWTEVUUylcblx0XHR7XG5cdFx0XHQvLyBSZXRyaWV2ZSBTZXJ2bGV0cyBmaWxlIGxpc3Rcblx0XHRcdGxldCBzZXJ2bGV0c09iaiA9IGRhdGEuZ2V0U0ZTT2JqZWN0KCdzZXJ2bGV0cycpO1xuXG5cdFx0XHQvLyBJbml0aWFsaXplIG1hbmFnZXJcblx0XHRcdHRoaXMuX2ZpbGVNYW5hZ2VyLmluaXQoKTtcblxuXHRcdFx0Ly8gQWRkIGxpc3QgdG8gbWFuYWdlclxuXHRcdFx0dGhpcy5fZmlsZU1hbmFnZXIuYWRkRmlsZShzZXJ2bGV0c09iaik7XG5cblx0XHRcdC8vIFNldCBUcmVlTGlzdCBkYXRhIHNvdXJjZVxuXHRcdFx0dGhpcy5fZmlsZXNMaXN0LnNldERhdGFTb3VyY2UodGhpcy5fZmlsZU1hbmFnZXIuZGF0YVNvdXJjZSk7XG5cblx0XHRcdC8vIEV4cGFuZCBmaXJzdCBsZXZlbFxuXHRcdFx0dGhpcy5fZmlsZXNMaXN0LmV4cGFuZCgkKCcjc3ZtLWZpbGVMaXN0IHRib2R5PnRyOmVxKDApJykpO1xuXG5cdFx0XHQvLyBFbmFibGUgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UodHJ1ZSk7XG5cblx0XHRcdC8vIFNob3cgbW9kdWxlJ3MgbWFpbiB2aWV3XG5cdFx0XHR0aGlzLl9zd2l0Y2hWaWV3KCdzdm0tbWFpbicpO1xuXHRcdH1cblxuXHRcdC8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIG1hbmFnaW5nIHNlcnZsZXQgZmlsZXNcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9FUlJPUilcblx0XHR7XG5cdFx0XHQvLyBIaWRlIGFkZCBmb2xkZXIgbW9kYWxcblx0XHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm1vZGFsKCdoaWRlJyk7XG5cblx0XHRcdC8vIFJlLWVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZSh0cnVlKTtcblxuXHRcdFx0Ly8gU2hvdyBhbiBhbGVydFxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGRhdGEuZ2V0VXRmU3RyaW5nKCdlcnJvcicpKTtcblx0XHR9XG5cblx0XHQvLyBTZXJ2bGV0IGZvbGRlciBvciBmaWxlIGFkZGVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfRklMRV9BRERFRClcblx0XHR7XG5cdFx0XHQvLyBHZXQgbmFtZSBvZiB0aGUgdXNlciB3aG8gYWRkZWQgdGhlIGZpbGUvZm9sZGVyXG5cdFx0XHRjb25zdCByZXF1ZXN0ZXIgPSBkYXRhLmdldFV0ZlN0cmluZygndXNlcicpO1xuXG5cdFx0XHQvLyBHZXQgdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGZpbGUvZm9sZGVyIGJlaW5nIGFkZGVkXG5cdFx0XHRjb25zdCBmaWxlT2JqID0gZGF0YS5nZXRTRlNPYmplY3QoJ2ZpbGUnKTtcblxuXHRcdFx0Ly8gR2V0IHRoZSB0YXJnZXQgZm9sZGVyIHdoZXJlIHRoZSBuZXcgZmlsZS9mb2xkZXIgc2hvdWxkIGJlIGFkZGVkXG5cdFx0XHRjb25zdCBwYXJlbnRQYXRoID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3BhcmVudCcpO1xuXG5cdFx0XHQvLyBHZXQgdGhlIGZsYWcgbm90aWZ5aW5nIHRoaXMgd2FzIGEgZmlsZSB1cGxvYWRcblx0XHRcdGNvbnN0IGlzVXBsb2FkID0gZGF0YS5nZXRCb29sKCdpc1VwbG9hZCcpO1xuXG5cdFx0XHR0cnlcblx0XHRcdHtcblx0XHRcdFx0Ly8gQWRkL3VwZGF0ZSBpdGVtIG9uIGRhdGEgc291cmNlXG5cdFx0XHRcdGNvbnN0IGZpbGVQYXRoID0gdGhpcy5fZmlsZU1hbmFnZXIuYWRkRmlsZVRvUGFyZW50KGZpbGVPYmosIHBhcmVudFBhdGgpO1xuXG5cdFx0XHRcdC8vIFJlZnJlc2ggdmlld1xuXHRcdFx0XHR0aGlzLl9maWxlc0xpc3QucmVmcmVzaCgpO1xuXG5cdFx0XHRcdGlmIChyZXF1ZXN0ZXIgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIEV4cGFuZCBwYXJlbnRcblx0XHRcdFx0XHR0aGlzLl9maWxlc0xpc3QuZXhwYW5kKCQoYCNzdm0tZmlsZUxpc3QgLmZpbGUtY29udHJvbHNbZGF0YS1pdGVtLWlkPVwiJHtwYXJlbnRQYXRofVwiXWApLmNsb3Nlc3QoJ3RyJykpO1xuXG5cdFx0XHRcdFx0aWYgKCFpc1VwbG9hZClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQvLyBIaWRlIG1vZGFsXG5cdFx0XHRcdFx0XHR0aGlzLl9hZGRGb2xkZXJNb2RhbC5tb2RhbCgnaGlkZScpO1xuXG5cdFx0XHRcdFx0XHQvLyBTZWxlY3QgdXBsb2FkIGZpbGVcblx0XHRcdFx0XHRcdHRoaXMuX2ZpbGVzTGlzdC5zZWxlY3QoJChgI3N2bS1maWxlTGlzdCAuZmlsZS1jb250cm9sc1tkYXRhLWl0ZW0taWQ9XCIke2ZpbGVQYXRofVwiXWApLmNsb3Nlc3QoJ3RyJykpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFVwZGF0ZSBzZWxlY3Rpb25cblx0XHRcdFx0XHR0aGlzLl9vbkZpbGVTZWxlY3RlZENoYW5nZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdFx0aWYgKCFpc1VwbG9hZClcblx0XHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oYEZvbGRlciBjcmVhdGVkYCwgYEFkbWluaXN0cmF0b3IgJHtyZXF1ZXN0ZXJ9IGNyZWF0ZWQgZm9sZGVyOiA8c3Ryb25nPiR7ZmlsZVBhdGh9PC9zdHJvbmc+YCk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd05vdGlmaWNhdGlvbihgRmlsZSB1cGxvYWRlZGAsIGBBZG1pbmlzdHJhdG9yICR7cmVxdWVzdGVyfSB1cGxvYWRlZCBmaWxlOiA8c3Ryb25nPiR7ZmlsZVBhdGh9PC9zdHJvbmc+YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNhdGNoIChlKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLi4uIGRhdGEgc291cmNlIGlzIGNvcnJ1cHRlZD9cblx0XHRcdFx0aWYgKHJlcXVlc3RlciA9PSB0aGlzLnNtYXJ0Rm94Lm15U2VsZi5uYW1lKVxuXHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChlLm1lc3NhZ2UsIHRydWUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBFbmFibGUgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UodHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Ly8gU2VydmxldCBmaWxlcyBkZWxldGVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfRklMRVNfREVMRVRFRClcblx0XHR7XG5cdFx0XHQvLyBHZXQgbmFtZSBvZiB0aGUgdXNlciB3aG8gZGVsZXRlZCB0aGUgZmlsZS9zXG5cdFx0XHRjb25zdCByZXF1ZXN0ZXIgPSBkYXRhLmdldFV0ZlN0cmluZygndXNlcicpO1xuXG5cdFx0XHQvLyBHZXQgdGhlIGxpc3Qgb2YgZGVsZXRlZCBmaWxlc1xuXHRcdFx0bGV0IGZpbGVzID0gZGF0YS5nZXRTRlNBcnJheSgnZmlsZXMnKTtcblxuXHRcdFx0bGV0IGZpbGVzQXJyID0gW107XG5cblx0XHRcdC8vIFVwZGF0ZSBkYXRhIHNvdXJjZVxuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBmaWxlcy5zaXplKCk7IGorKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IHBhdGggPSBmaWxlcy5nZXRVdGZTdHJpbmcoaik7XG5cdFx0XHRcdGZpbGVzQXJyLnB1c2gocGF0aCk7XG5cblx0XHRcdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdFx0XHQvLyBSZW1vdmUgaXRlbSBmcm9tIGRhdGEgc291cmNlOyBwYXJlbnQgaXRlbSBpcyByZXR1cm5lZFxuXHRcdFx0XHRsZXQgcGFyZW50SXRlbSA9IHRoaXMuX2ZpbGVNYW5hZ2VyLnJlbW92ZUZpbGUocGF0aCk7XG5cblx0XHRcdFx0Ly8gQ29sbGFwc2UgcGFyZW50IGlmIHRoZSBsYXN0IG9mIGl0cyBjaGlsZHJlbiB3YXMgZGVsZXRlZFxuXHRcdFx0XHRpZiAocGFyZW50SXRlbSAmJiAhcGFyZW50SXRlbS5oYXNDaGlsZHJlbilcblx0XHRcdFx0XHR0aGlzLl9maWxlc0xpc3QuY29sbGFwc2UoJChgI3N2bS1maWxlTGlzdCAuZmlsZS1jb250cm9sc1tkYXRhLWl0ZW0taWQ9XCIke3BhcmVudEl0ZW0uaWR9XCJdYCkuY2xvc2VzdCgndHInKSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyZXF1ZXN0ZXIgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd05vdGlmaWNhdGlvbihgJHt0aGlzLl9zZWxlY3RlZEl0ZW0uaXNEaXIgPyAnRm9sZGVyJyA6ICdGaWxlJ30gZGVsZXRlZGAsIGAke3RoaXMuX3NlbGVjdGVkSXRlbS5pc0RpciA/ICdGb2xkZXInIDogJ0ZpbGUnfSAnJHt0aGlzLl9zZWxlY3RlZEl0ZW0ubmFtZX0nIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5YCk7XG5cblx0XHRcdFx0dGhpcy5fc2VsZWN0ZWRJdGVtID0gbnVsbDtcblxuXHRcdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oYEZpbGUgZGVsZXRlZGAsIGBBZG1pbmlzdHJhdG9yICR7cmVxdWVzdGVyfSBkZWxldGVkIHRoZSBmb2xsb3dpbmcgZmlsZSR7ZmlsZXNBcnIubGVuZ3RoID4gMSA/ICdzJyA6ICcnfTogPHN0cm9uZz4ke2ZpbGVzQXJyLmpvaW4oJzxicj4gJyl9PC9zdHJvbmc+YCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlc2V0IHNlbGVjdGlvblxuXHRcdFx0dGhpcy5fb25GaWxlU2VsZWN0ZWRDaGFuZ2UoKTtcblx0XHR9XG5cblx0XHQvLyBlbHNlIGlmICgpXG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBVSSBFVkVOVCBMSVNURU5FUlNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfb25SZXRyeUNsaWNrKClcblx0e1xuXHRcdHRoaXMuX3N3aXRjaFZpZXcoJ3N2bS1pbml0Jyk7XG5cblx0XHQvLyBSZS1zZW5kIGluaXRpYWxpemF0aW9uIHJlcXVlc3Rcblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0lOSVQpO1xuXHR9XG5cblx0X29uUmVmcmVzaENsaWNrKClcblx0e1xuXHRcdHRoaXMuX2ZpbGVzTGlzdC5jbGVhclNlbGVjdGlvbigpO1xuXHRcdHRoaXMuX3JlZnJlc2hEYXRhTGlzdCgpO1xuXHR9XG5cblx0X29uRmlsZVNlbGVjdGVkQ2hhbmdlKClcblx0e1xuXHRcdC8vIEhpZGUgY29udHJvbCBidXR0b25zIG9uIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtXG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkSXRlbSlcblx0XHRcdCQoYCNzdm0tZmlsZUxpc3QgLmZpbGUtY29udHJvbHNbZGF0YS1pdGVtLWlkPVwiJHt0aGlzLl9zZWxlY3RlZEl0ZW0uaWR9XCJdYCkuaGlkZSgpO1xuXG5cdFx0Ly8gR2V0IHNlbGVjdGVkIGl0ZW1cblx0XHRsZXQgc2VsZWN0ZWRSb3dzID0gdGhpcy5fZmlsZXNMaXN0LnNlbGVjdCgpO1xuXG5cdFx0aWYgKHNlbGVjdGVkUm93cy5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdC8vIFNhdmUgcmVmLiB0byBzZWxlY3RlZCBpdGVtXG5cdFx0XHR0aGlzLl9zZWxlY3RlZEl0ZW0gPSB0aGlzLl9maWxlc0xpc3QuZGF0YUl0ZW0oc2VsZWN0ZWRSb3dzWzBdKTtcblxuXHRcdFx0Ly8gU2hvdyBjb250cm9sIGJ1dHRvbnMgb24gbmV3IHNlbGVjdGVkIGl0ZW1cblx0XHRcdCQoYCNzdm0tZmlsZUxpc3QgLmZpbGUtY29udHJvbHNbZGF0YS1pdGVtLWlkPVwiJHt0aGlzLl9zZWxlY3RlZEl0ZW0uaWR9XCJdYCkuc2hvdygpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHR0aGlzLl9zZWxlY3RlZEl0ZW0gPSBudWxsO1xuXHR9XG5cblx0X3Nob3dBZGRGb2xkZXJNb2RhbENsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl9zZWxlY3RlZEl0ZW0gJiYgdGhpcy5fc2VsZWN0ZWRJdGVtLmlzRGlyKVxuXHRcdHtcblx0XHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm1vZGFsKCdzaG93Jyk7XG5cdFx0XHQkKCcjc3ZtLWZvbGRlck5hbWVJbicpLmZvY3VzKCk7XG5cdFx0fVxuXHR9XG5cblx0X29uQWRkRm9sZGVyQ2xpY2soKVxuXHR7XG5cdFx0Ly8gVGhlIHBhcmVudCBmb2xkZXIgY291bGQgaGF2ZSBiZWVuIGRlbGV0ZWQgd2hpbGUgdXNlciBpcyBzdGlsbCB0eXBpbmcgdGhlIG5hbWUgb2YgdGhlIG5ldyBjaGlsZCBmb2xkZXJcblx0XHRpZiAoIXRoaXMuX3NlbGVjdGVkSXRlbSlcblx0XHR7XG5cdFx0XHR0aGlzLl9hZGRGb2xkZXJNb2RhbC5tb2RhbCgnaGlkZScpO1xuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KCdVbmFibGUgdG8gY3JlYXRlIGZvbGRlcjsgdGhlIHBhcmVudCBmb2xkZXIgZG9lc25cXCd0IGV4aXN0LicpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9hZGRGb2xkZXJWYWxpZGF0b3IudmFsaWRhdGUoKSlcblx0XHR7XG5cdFx0XHQvLyBEaXNhYmxlIG1vZGFsIGludGVyZmFjZVxuXHRcdFx0dGhpcy5fZW5hYmxlQWRkRm9sZGVyTW9kYWwoZmFsc2UpO1xuXG5cdFx0XHRsZXQgZGF0YSA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdGRhdGEucHV0VXRmU3RyaW5nKCdmb2xkZXInLCB0aGlzLl9zZWxlY3RlZEl0ZW0uaWQgKyB0aGlzLl9maWxlU2VwYXJhdG9yICsgJCgnI3N2bS1mb2xkZXJOYW1lSW4nKS52YWwoKSk7XG5cblx0XHRcdC8vIFNlbmQgcmVxdWVzdCB0byBzZXJ2ZXJcblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfQ1JFQVRFX0ZPTERFUiwgZGF0YSk7XG5cdFx0fVxuXHR9XG5cblx0X29uQWRkRm9sZGVyTW9kYWxIaWRkZW4oKVxuXHR7XG5cdFx0JCgnI3N2bS1mb2xkZXJOYW1lSW4nKS52YWwoJycpO1xuXHRcdHRoaXMuX3Jlc2V0QWRkRm9sZGVyVmFsaWRhdGlvbigpO1xuXG5cdFx0Ly8gRW5hYmxlIG1vZGFsIGludGVyZmFjZVxuXHRcdHRoaXMuX2VuYWJsZUFkZEZvbGRlck1vZGFsKHRydWUpO1xuXHR9XG5cblx0X3Nob3dVcGxvYWRGaWxlc01vZGFsQ2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkSXRlbSlcblx0XHRcdHRoaXMuX3VwbG9hZEZpbGVzTW9kYWwubW9kYWwoJ3Nob3cnKTtcblx0fVxuXG5cdF9vbkNsZWFyRmlsZXNDbGljaygpXG5cdHtcblx0XHR0aGlzLl91cGxvYWRlci5jbGVhckFsbEZpbGVzKCk7XG5cdH1cblxuXHRfb25VcGxvYWRTdGFydChlKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSBjbGVhciBidXR0b25cblx0XHQkKCcjc3ZtLWNsZWFyRmlsZXNCdCcpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cblx0XHQvLyBTZXQgZGVzdGluYXRpb24gdXJsXG5cdFx0Y29uc3QgdXJsID0gJ2h0dHA6Ly8nICsgdGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnLmhvc3QgKyAnOicgKyB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcuaHR0cFBvcnQgKyAnL0JsdWVCb3gvU0ZTMlhGaWxlVXBsb2FkP3Nlc3NIYXNoSWQ9JyArIHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZy5zZXNzaW9uVG9rZW47XG5cblx0XHRlLnNlbmRlci5vcHRpb25zLmFzeW5jLnNhdmVVcmwgPSB1cmw7XG5cblx0XHQvLyBTZXQgcGF5bG9hZFxuXHRcdGNvbnN0IHBhcmFtcyA9IG5ldyBGb3JtRGF0YSgpO1xuXHRcdHBhcmFtcy5hcHBlbmQoJ19fbW9kdWxlJywgdGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnLm1vZHVsZUlkKTtcblx0XHRwYXJhbXMuYXBwZW5kKCdfX3RhcmdldCcsIHRoaXMuX3NlbGVjdGVkSXRlbS5pZCk7XG5cblx0XHRmb3IgKGxldCBmID0gMDsgZiA8IGUuZmlsZXMubGVuZ3RoOyBmKyspXG5cdFx0XHRwYXJhbXMuYXBwZW5kKCdmaWxlc1tdJywgZS5maWxlc1tmXS5yYXdGaWxlKTtcblxuXHRcdGUuZm9ybURhdGEgPSBwYXJhbXM7XG5cdH1cblxuXHRfb25VcGxvYWRFbmQoZSlcblx0e1xuXHRcdC8vIEVuYWJsZSBjbGVhciBidXR0b25cblx0XHQkKCcjc3ZtLWNsZWFyRmlsZXNCdCcpLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpO1xuXHR9XG5cblx0X29uRmlsZXNVcGxvYWRFbmQocmVzcG9uc2UpXG5cdHtcblx0XHQvLyBOb3RoaW5nIHRvIGRvOiB3ZSBoYXZlIHRvIHdhaXQgdGhlIHVwbG9hZCBwcm9jZXNzIGNvbXBsZXRpb24gdG8gYmUgc2lnbmFsZWQgYnkgdGhlIHNlcnZlciB0aHJvdWdoIHRoZSBkZWRpY2F0ZWQgRXh0ZW5zaW9uIHJlc3BvbnNlXG5cblx0XHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHQvLyBUT0RPIFNob3VsZCB3ZSBoYW5kbGUgdGhpcyByZXNwb25zZSBpbiBzb21lIHdheT8gRm9yIHNvbWUgdW5rbm93biByZWFzb24gd2UgYWx3YXlzIGdldCBvaz1mYWxzZSBhbmQgc3RhdHVzPTBcblx0XHQvLyBjb25zb2xlLmxvZyhyZXNwb25zZSlcblx0XHQvLyBjb25zb2xlLmxvZyhyZXNwb25zZS5vaylcblx0XHQvLyBjb25zb2xlLmxvZyhyZXNwb25zZS5zdGF0dXMpXG5cdH1cblxuXHRfb25SZW1vdmVGaWxlQ2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkSXRlbSlcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dDb25maXJtV2FybmluZyhgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgc2VsZWN0ZWQgJHt0aGlzLl9zZWxlY3RlZEl0ZW0uaXNEaXIgPyAnZm9sZGVyJyA6ICdmaWxlJ30/PGJyPjxicj5QYXRoOiA8c3Ryb25nPiR7dGhpcy5fc2VsZWN0ZWRJdGVtLmlkfTwvc3Ryb25nPmAsICQucHJveHkodGhpcy5fb25SZW1vdmVGaWxlQ29uZmlybSwgdGhpcykpO1xuXHR9XG5cblx0X29uUmVtb3ZlRmlsZUNvbmZpcm0oKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSBpbnRlcmZhY2Vcblx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0Ly8gUmVxdWVzdCBTZXJ2bGV0IGZpbGVzIHJlbW92YWxcblx0XHQvLyBOT1RFOiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIEFkbWluVG9vbCwgdGhlIGZpbGUgdG8gYmUgZGVsZXRlZCBpcyBzZW50XG5cdFx0Ly8gaW4gYW4gYXJyYXkgb2Ygc3RyaW5ncywgZXZlbiBpZiB3ZSBjYW4ndCBkZWxldGUgbW9yZSB0aGFuIDEgZmlsZSBhdCBvbmNlIGluIHRoaXMgQWRtaW5Ub29sXG5cblx0XHRsZXQgZmlsZXMgPSBuZXcgU0ZTMlguU0ZTQXJyYXkoKTtcblx0XHRmaWxlcy5hZGRVdGZTdHJpbmcodGhpcy5fc2VsZWN0ZWRJdGVtLmlkKTtcblxuXHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0cGFyYW1zLnB1dFNGU0FycmF5KCdmaWxlcycsIGZpbGVzKTtcblxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfREVMRVRFX0ZJTEVTLCBwYXJhbXMpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBNRVRIT0RTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X3N3aXRjaFZpZXcodmlld0lkKVxuXHR7XG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2bS12aWV3c3RhY2snKS5zZWxlY3RlZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWV3SWQpO1xuXHR9XG5cblx0X2VuYWJsZUludGVyZmFjZShlbmFibGUpXG5cdHtcblx0XHQkKCcjc3ZtLWZpbGVMaXN0JykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblx0XHQkKCcjc3ZtLXJlZnJlc2hCdCcpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZSk7XG5cdH1cblxuXHRfcmVmcmVzaERhdGFMaXN0KClcblx0e1xuXHRcdC8vIERpc2FibGUgaW50ZXJmYWNlXG5cdFx0dGhpcy5fZW5hYmxlSW50ZXJmYWNlKGZhbHNlKTtcblxuXHRcdC8vIFNlbmQgcmVxdWVzdCB0byBzZXJ2ZXJcblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9TRVJWTEVUUylcblx0fVxuXG5cdF9yZXNldEFkZEZvbGRlclZhbGlkYXRpb24oKVxuXHR7XG5cdFx0dGhpcy5fYWRkRm9sZGVyVmFsaWRhdG9yLmhpZGVNZXNzYWdlcygpO1xuXG5cdFx0Ly8gVGhlIG1ldGhvZCBhYm92ZSBkb2Vzbid0IHJlbW92ZSB0aGUgay1pbnZhbGlkIGNsYXNzZXMgYW5kIGFyaWEtaW52YWxpZD1cInRydWVcIiBhdHRyaWJ1dGVzIGZyb20gaW5wdXRzXG5cdFx0Ly8gTGV0J3MgZG8gaXQgbWFudWFsbHlcblx0XHQkKCcjc3ZtLWFkZEZvbGRlckZvcm0gLmstaW52YWxpZCcpLnJlbW92ZUNsYXNzKCdrLWludmFsaWQnKTtcblx0XHQkKCcjc3ZtLWFkZEZvbGRlckZvcm0gW2FyaWEtaW52YWxpZD1cInRydWVcIl0nKS5yZW1vdmVBdHRyKCdhcmlhLWludmFsaWQnKTtcblx0fVxuXG5cdF9lbmFibGVBZGRGb2xkZXJNb2RhbChlbmFibGUpXG5cdHtcblx0XHQvLyBEaXNhYmxlIG1vZGFsIGNsb3NlIGJ1dHRvbnNcblx0XHQkKCcjc3ZtLWFkZEZvbGRlck1vZGFsIGJ1dHRvbltkYXRhLWRpc21pc3M9XCJtb2RhbFwiXScpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZSk7XG5cblx0XHQvLyBEaXNhYmxlIGFkZCBidXR0b25cblx0XHQkKCcjc3ZtLWFkZEZvbGRlckJ0JykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblxuXHRcdC8vIERpc2FibGUgZmllbGRzZXRcblx0XHQkKCcjc3ZtLWFkZEZvbGRlckZvcm0nKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBHRVRURVJTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2hKQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0EiLCJzb3VyY2VSb290IjoiIn0=
764
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMTAuYnVuZGxlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbWFuYWdlcnMvZmlsZS1kYXRhc291cmNlLW1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbW9kdWxlcy9zZXJ2bGV0LW1hbmFnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEZpbGVEYXRhU291cmNlTWFuYWdlclxue1xuXHRjb25zdHJ1Y3RvcihsaWJGb2xkZXIsIHByb3RlY3RlZEZvbGRlcnMsIGZpbGVTZXBhcmF0b3IpXG5cdHtcblx0XHR0aGlzLl9wcm90ZWN0ZWRGb2xkZXJzID0gcHJvdGVjdGVkRm9sZGVyczsgLy8gRm9sZGVycyB3aGljaCBjYW4ndCBiZSBkZWxldGVkIChidXQgdGhlaXIgY29udGVudCBjYW4pXG5cdFx0dGhpcy5fbGliRm9sZGVyID0gbGliRm9sZGVyO1xuXHRcdHRoaXMuX2ZpbGVTZXBhcmF0b3IgPSBmaWxlU2VwYXJhdG9yO1xuXHR9XG5cblx0Z2V0IGRhdGFTb3VyY2UoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2RhdGFTb3VyY2U7XG5cdH1cblxuXHRpbml0KClcblx0e1xuXHRcdHRoaXMuX2RhdGFTb3VyY2UgPSBuZXcga2VuZG8uZGF0YS5UcmVlTGlzdERhdGFTb3VyY2Uoe1xuXHRcdFx0ZGF0YTogW10sXG5cdFx0XHRzY2hlbWE6IHtcblx0XHRcdFx0bW9kZWw6IHtcblx0XHRcdFx0XHRpZDogJ2lkJyxcblx0XHRcdFx0XHRwYXJlbnRJZDogJ3BhcmVudElkJyxcblx0XHRcdFx0XHRleHBhbmRlZDogZmFsc2Vcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHNvcnQ6IHsgZmllbGQ6ICduYW1lJywgZGlyOiAnYXNjJyB9XG5cdFx0fSk7XG5cdH1cblxuXHRhZGRGaWxlKGZpbGVPYmosIHBhcmVudExldmVsID0gbnVsbClcblx0e1xuXHRcdGxldCBmaWxlID0ge307XG5cblx0XHRmaWxlLm5hbWUgPSBmaWxlT2JqLmdldFV0ZlN0cmluZygnbmFtZScpO1xuXHRcdGZpbGUuaXNEaXIgPSBmaWxlT2JqLmdldEJvb2woJ2lzRGlyJyk7XG5cdFx0ZmlsZS5sYXN0TW9kID0gZmlsZU9iai5nZXRMb25nKCdsYXN0TW9kJyk7XG5cdFx0ZmlsZS5pc0xpYiA9IChmaWxlLmlzRGlyICYmIGZpbGUubmFtZSA9PSB0aGlzLl9saWJGb2xkZXIpO1xuXHRcdGZpbGUuaXNQcm90ZWN0ZWQgPSAoZmlsZS5pc0RpciAmJiB0aGlzLl9wcm90ZWN0ZWRGb2xkZXJzLmluZGV4T2YoZmlsZS5uYW1lKSA+IC0xKTtcblx0XHRmaWxlLnNpemUgPSAwO1xuXG5cdFx0aWYgKHBhcmVudExldmVsID09IG51bGwpXG5cdFx0XHRmaWxlLmxldmVsID0gMDtcblx0XHRlbHNlXG5cdFx0XHRmaWxlLmxldmVsID0gcGFyZW50TGV2ZWwgKyAxO1xuXG5cdFx0aWYgKGZpbGVPYmouY29udGFpbnNLZXkoJ3BhcmVudCcpKVxuXHRcdHtcblx0XHRcdGZpbGUucGFyZW50SWQgPSBmaWxlT2JqLmdldFV0ZlN0cmluZygncGFyZW50Jyk7XG5cdFx0XHRmaWxlLmlkID0gZmlsZS5wYXJlbnRJZCArIHRoaXMuX2ZpbGVTZXBhcmF0b3IgKyBmaWxlLm5hbWU7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRmaWxlLnBhcmVudElkID0gbnVsbDtcblx0XHRcdGZpbGUuaWQgPSBmaWxlLm5hbWU7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGNoaWxkIGZpbGVzXG5cdFx0aWYgKGZpbGUuaXNEaXIpXG5cdFx0e1xuXHRcdFx0bGV0IGZpbGVzQXJyID0gZmlsZU9iai5nZXRTRlNBcnJheSgnZmlsZXMnKTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlc0Fyci5zaXplKCk7IGkrKylcblx0XHRcdFx0ZmlsZS5zaXplICs9IHRoaXMuYWRkRmlsZShmaWxlc0Fyci5nZXRTRlNPYmplY3QoaSksIGZpbGUubGV2ZWwpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHRmaWxlLnNpemUgPSBmaWxlT2JqLmdldExvbmcoJ3NpemUnKTtcblxuXHRcdC8vIEFkZCBmaWxlIHRvIGRhdGEgc291cmNlXG5cdFx0dGhpcy5fZGF0YVNvdXJjZS5hZGQoZmlsZSk7XG5cblx0XHQvLyBSZXR1cm4gZmlsZSBzaXplXG5cdFx0cmV0dXJuIGZpbGUuc2l6ZTtcblx0fVxuXG5cdHJlbW92ZUZpbGUoaWQpXG5cdHtcblx0XHRsZXQgZmlsZUl0ZW0gPSB0aGlzLl9kYXRhU291cmNlLmdldChpZCk7XG5cblx0XHRpZiAoZmlsZUl0ZW0pXG5cdFx0e1xuXHRcdFx0aWYgKGZpbGVJdGVtLnBhcmVudElkKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTdWJ0cmFjdCBvbGQgc2l6ZSBmcm9tIHBhcmVudCBzaXplXG5cdFx0XHRcdGxldCBwYXJlbnRJdGVtID0gdGhpcy5fZGF0YVNvdXJjZS5nZXQoZmlsZUl0ZW0ucGFyZW50SWQpO1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXJlbnRTaXplKHBhcmVudEl0ZW0sIC1maWxlSXRlbS5zaXplKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fZGF0YVNvdXJjZS5yZW1vdmUoZmlsZUl0ZW0pO1xuXG5cdFx0XHQvLyBSZXR1cm4gcGFyZW50IGl0ZW1cblx0XHRcdGlmIChmaWxlSXRlbS5wYXJlbnRJZClcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2RhdGFTb3VyY2UuZ2V0KGZpbGVJdGVtLnBhcmVudElkKTtcblx0XHR9XG5cdH1cblxuXHRnZXRGaWxlQnlJZChpZClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kYXRhU291cmNlLmdldChpZCk7XG5cdH1cblxuXHRhZGRGaWxlVG9QYXJlbnQoZmlsZU9iaiwgcGFyZW50SWQpXG5cdHtcblx0XHRsZXQgcGFyZW50SXRlbSA9IHRoaXMuX2RhdGFTb3VyY2UuZ2V0KHBhcmVudElkKTtcblxuXHRcdGlmIChwYXJlbnRJdGVtICE9IG51bGwgJiYgcGFyZW50SXRlbS5pc0Rpcilcblx0XHR7XG5cdFx0XHRjb25zdCBmaWxlSWQgPSBwYXJlbnRJZCArIHRoaXMuX2ZpbGVTZXBhcmF0b3IgKyBmaWxlT2JqLmdldFV0ZlN0cmluZygnbmFtZScpO1xuXHRcdFx0bGV0IGZpbGVJdGVtID0gdGhpcy5fZGF0YVNvdXJjZS5nZXQoZmlsZUlkKTtcblxuXHRcdFx0aWYgKGZpbGVJdGVtICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFN1YnRyYWN0IG9sZCBzaXplIGZyb20gcGFyZW50IHNpemVcblx0XHRcdFx0dGhpcy5fdXBkYXRlUGFyZW50U2l6ZShwYXJlbnRJdGVtLCAtZmlsZUl0ZW0uc2l6ZSk7XG5cblx0XHRcdFx0Ly8gVXBkYXRlIGV4aXN0aW5nIGl0ZW1cblx0XHRcdFx0ZmlsZUl0ZW0ubmFtZSA9IGZpbGVPYmouZ2V0VXRmU3RyaW5nKCduYW1lJyk7XG5cdFx0XHRcdGZpbGVJdGVtLmxhc3RNb2QgPSBmaWxlT2JqLmdldExvbmcoJ2xhc3RNb2QnKTtcblx0XHRcdFx0ZmlsZUl0ZW0uc2l6ZSA9IGZpbGVPYmouZ2V0TG9uZygnc2l6ZScpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBBZGQgbmV3IGl0ZW1cblx0XHRcdFx0dGhpcy5hZGRGaWxlKGZpbGVPYmosIHBhcmVudEl0ZW0ubGV2ZWwpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgcGFyZW50IGl0ZW0gc2l6ZVxuXHRcdFx0dGhpcy5fdXBkYXRlUGFyZW50U2l6ZShwYXJlbnRJdGVtLCBmaWxlT2JqLmdldExvbmcoJ3NpemUnKSk7XG5cblx0XHRcdHJldHVybiBmaWxlSWQ7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRocm93IG5ldyBFcnJvcihgQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSBhZGRpbmcgZmlsZSAnJHtmaWxlT2JqLmdldFV0ZlN0cmluZygnbmFtZScpfScgKHRhcmdldDogJHtwYXJlbnRJZH0pLmApO1xuXHR9XG5cblx0X3VwZGF0ZVBhcmVudFNpemUocGFyZW50SXRlbSwgdmFsdWUpXG5cdHtcblx0XHRwYXJlbnRJdGVtLnNpemUgKz0gdmFsdWU7XG5cblx0XHRpZiAocGFyZW50SXRlbS5wYXJlbnRJZClcblx0XHR7XG5cdFx0XHRsZXQgZ3JhbmRQYXJlbnQgPSB0aGlzLl9kYXRhU291cmNlLmdldChwYXJlbnRJdGVtLnBhcmVudElkKTtcblx0XHRcdHRoaXMuX3VwZGF0ZVBhcmVudFNpemUoZ3JhbmRQYXJlbnQsIHZhbHVlKTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge0ZpbGVEYXRhU291cmNlTWFuYWdlcn0gZnJvbSAnLi4vbWFuYWdlcnMvZmlsZS1kYXRhc291cmNlLW1hbmFnZXInO1xuaW1wb3J0IHtieXRlc1RvU2l6ZX0gZnJvbSAnLi4vdXRpbHMvdXRpbGl0aWVzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VydmxldE1hbmFnZXIgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ3NlcnZsZXRNYW4nKTtcblxuXHRcdC8vIE91dGdvaW5nIHJlcXVlc3RzXG5cdFx0dGhpcy5SRVFfSU5JVCA9ICdpbml0Jztcblx0XHR0aGlzLlJFUV9HRVRfU0VSVkxFVFMgPSAnZ2V0U2VydmxldHMnO1xuXHRcdHRoaXMuUkVRX0NSRUFURV9GT0xERVIgPSAnY3JlYXRlRm9sZGVyJztcblx0XHR0aGlzLlJFUV9ERUxFVEVfRklMRVMgPSAnZGVsZXRlU3J2bHRGaWxlcyc7XG5cblx0XHQvLyBJbmNvbWluZyByZXNwb25zZXNcblx0XHR0aGlzLlJFU1BfTE9DS0VEID0gJ2xvY2snO1xuXHRcdHRoaXMuUkVTUF9JTklUID0gJ2luaXQnO1xuXHRcdHRoaXMuUkVTUF9TRVJWTEVUUyA9ICdzZXJ2bGV0cyc7XG5cdFx0dGhpcy5SRVNQX0ZJTEVfQURERUQgPSAnZmlsZUFkZGVkJztcblx0XHR0aGlzLlJFU1BfRklMRVNfREVMRVRFRCA9ICdmaWxlc0RlbGV0ZWQnO1xuXHRcdHRoaXMuUkVTUF9FUlJPUiA9ICdlcnJvcic7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBDT01NT04gTU9EVUxFIElOVEVSRkFDRSBNRVRIT0RTXG5cdC8vIFRoaXMgbWVtYmVycyBhcmUgdXNlZCBieSB0aGUgbWFpbiBjb250cm9sbGVyXG5cdC8vIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1vZHVsZSdzIGNvbnRyb2xsZXIuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0aW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcilcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuaW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcik7XG5cblx0XHQvLyBJbml0aWFsaXplIHByb2dyZXNzIGJhclxuXHRcdCQoJyNzdm0tcHJvZ3Jlc3NCYXInKS5rZW5kb1Byb2dyZXNzQmFyKHtcblx0XHRcdG1pbjogMCxcbiAgICAgICAgICAgIG1heDogMTAwLFxuXHRcdFx0dmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJyxcbiAgICAgICAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA0MDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXJzIHRvIGJ1dHRvbnNcblx0XHQkKCcjc3ZtLXJldHJ5QnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmV0cnlDbGljaywgdGhpcykpO1xuXHRcdCQoJyNzdm0tcmVmcmVzaEJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJlZnJlc2hDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBmaWxlcyBsaXN0XG5cdFx0dGhpcy5fZmlsZXNMaXN0ID0gJCgnI3N2bS1maWxlTGlzdCcpLmtlbmRvVHJlZUxpc3Qoe1xuICAgICAgICAgICAgZGF0YVNvdXJjZTogW10sXG5cdFx0XHRyZXNpemFibGU6IHRydWUsXG5cdFx0XHRzZWxlY3RhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29sdW1uczogW1xuICAgICAgICAgICAgICAgIHtcblx0XHRcdFx0XHRmaWVsZDogJ25hbWUnLFxuXHRcdFx0XHRcdHRpdGxlOiAnTmFtZScsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdFx0XHRcdDxkaXYgPlxuXHRcdFx0XHRcdFx0XHQjIGlmIChpc0RpcikgeyAjXG5cdFx0XHRcdFx0XHRcdFx0IyBpZiAoZXhwYW5kZWQpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtZm9sZGVyLW9wZW5cIj48L2k+XG5cdFx0XHRcdFx0XHRcdFx0IyB9IGVsc2UgeyAjXG5cdFx0XHRcdFx0XHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1mb2xkZXJcIj48L2k+XG5cdFx0XHRcdFx0XHRcdFx0IyB9ICNcblx0XHRcdFx0XHRcdFx0IyB9IGVsc2UgeyAjXG5cdFx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXIgZmEtZmlsZVwiPjwvaT5cblx0XHRcdFx0XHRcdFx0IyB9ICNcblxuXHRcdFx0XHRcdFx0XHQjOiBuYW1lICNcblxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmlsZS1jb250cm9scyBmbGV4LWdyb3ctMSB0ZXh0LXJpZ2h0XCIgZGF0YS1pdGVtLWlkPVwiIzppZCNcIj5cblx0XHRcdFx0XHRcdFx0IyBpZiAoaXNEaXIpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1wcmltYXJ5IG15LTEgY3JlYXRlLWZvbGRlci1idFwiPjxpIGNsYXNzPVwiZmFzIGZhLWZvbGRlci1wbHVzXCI+PC9pPjwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1wcmltYXJ5IG15LTEgdXBsb2FkLWZpbGVzLWJ0XCI+PGkgY2xhc3M9XCJmYXMgZmEtZmlsZS11cGxvYWRcIj48L2k+PC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdCMgfSAjXG5cblx0XHRcdFx0XHRcdFx0IyBpZiAobGV2ZWwgPiAwICYmICFpc1Byb3RlY3RlZCkgeyAjXG5cdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnkgbXktMSByZW1vdmUtZmlsZS1idFwiPjxpIGNsYXNzPVwiZmFzIGZhLW1pbnVzLWNpcmNsZVwiPjwvaT48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0IyB9ICNcblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdGApLFxuXHRcdFx0XHR9LFxuICAgICAgICAgICAgICAgIHtcblx0XHRcdFx0XHRmaWVsZDogJ3NpemUnLFxuXHRcdFx0XHRcdHRpdGxlOiAnU2l6ZScsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0XHRcdFx0XHRkYXRhSXRlbS5ieXRlc1RvU2l6ZSA9IGJ5dGVzVG9TaXplOyAvLyBQYXNzIGJ5dGVzVG9TaXplIHV0aWxpdHkgZnVuY3Rpb24gdG8gdGVtcGxhdGVcblx0XHRcdFx0XHRcdHJldHVybiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHRcdFx0XHRcdCM6IGJ5dGVzVG9TaXplKHNpemUsIDIsICdLQicpICNcblx0XHRcdFx0XHRcdGApKGRhdGFJdGVtKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHdpZHRoOiAxMjAsXG5cdFx0XHRcdFx0bWluU2NyZWVuV2lkdGg6IDU3NlxuXHRcdFx0XHR9LFxuICAgICAgICAgICAgICAgIHtcblx0XHRcdFx0XHRmaWVsZDogJ2xhc3RNb2QnLFxuXHRcdFx0XHRcdHRpdGxlOiAnTGFzdCBNb2RpZmllZCcsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdFx0XHRcdCM6IGtlbmRvLnRvU3RyaW5nKG5ldyBEYXRlKGxhc3RNb2QpLCAnZGQgTU1NIHl5eXkgSEg6bW06c3MnKSAjXG5cdFx0XHRcdFx0YCksXG5cdFx0XHRcdFx0d2lkdGg6IDIwMCxcblx0XHRcdFx0XHRtaW5TY3JlZW5XaWR0aDogNzY4XG5cdFx0XHRcdH0sXG4gICAgICAgICAgICBdLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uRmlsZVNlbGVjdGVkQ2hhbmdlLCB0aGlzKVxuICAgICAgICB9KS5kYXRhKCdrZW5kb1RyZWVMaXN0Jyk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIEFkZCBsaXN0ZW5lcnMgdG8gY2F0Y2ggY29udHJvbCBidXR0b24gY2xpY2tzIG9uIHJvd3Ncblx0XHQkKCcjc3ZtLWZpbGVMaXN0Jykub24oJ2NsaWNrJywgJy5jcmVhdGUtZm9sZGVyLWJ0JywgJC5wcm94eSh0aGlzLl9zaG93QWRkRm9sZGVyTW9kYWxDbGljaywgdGhpcykpO1xuXHRcdCQoJyNzdm0tZmlsZUxpc3QnKS5vbignY2xpY2snLCAnLnVwbG9hZC1maWxlcy1idCcsICQucHJveHkodGhpcy5fc2hvd1VwbG9hZEZpbGVzTW9kYWxDbGljaywgdGhpcykpO1xuXHRcdCQoJyNzdm0tZmlsZUxpc3QnKS5vbignY2xpY2snLCAnLnJlbW92ZS1maWxlLWJ0JywgJC5wcm94eSh0aGlzLl9vblJlbW92ZUZpbGVDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBJbml0aWFsaXplIFwiYWRkIGZvbGRlclwiIG1vZGFsXG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwgPSAkKCcjc3ZtLWFkZEZvbGRlck1vZGFsJyk7XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2Vcblx0XHR9KTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBtb2RhbCBoaWRlIGV2ZW50XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwub24oJ2hpZGRlbi5icy5tb2RhbCcsICQucHJveHkodGhpcy5fb25BZGRGb2xkZXJNb2RhbEhpZGRlbiwgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIEFkZCBidXR0b24gY2xpY2tcblx0XHQkKCcjc3ZtLWFkZEZvbGRlckJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkFkZEZvbGRlckNsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHZhbGlkYXRpb24gb24gZm9sZGVyIG5hbWUgZm9ybVxuXHRcdHRoaXMuX2FkZEZvbGRlclZhbGlkYXRvciA9ICQoJyNzdm0tYWRkRm9sZGVyRm9ybScpLmtlbmRvVmFsaWRhdG9yKHt9KS5kYXRhKCdrZW5kb1ZhbGlkYXRvcicpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBJbml0aWFsaXplIFwidXBsb2FkIGZpbGVzXCIgbW9kYWxcblx0XHR0aGlzLl91cGxvYWRGaWxlc01vZGFsID0gJCgnI3N2bS11cGxvYWRNb2RhbCcpO1xuXHRcdHRoaXMuX3VwbG9hZEZpbGVzTW9kYWwubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2Vcblx0XHR9KTtcblxuXHRcdC8vIEluaXRpYWxpemUga2VuZG8gdXBsb2FkZXJcblx0XHR0aGlzLl91cGxvYWRlciA9ICQoJyNzdm0tdXBsb2FkZXInKS5rZW5kb1VwbG9hZCh7XG5cdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdGFzeW5jOiB7XG5cdFx0XHRcdHNhdmVVcmw6ICdodHRwOi8vbG9jYWxob3N0JywgLy8gVGhpcyB3aWxsIGJlIGNoYW5nZWQgbGF0ZXIgaW4gX29uVXBsb2FkU3RhcnQgbWV0aG9kXG5cdFx0XHRcdGF1dG9VcGxvYWQ6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0ZGlyZWN0b3J5RHJvcDogdHJ1ZSxcblx0XHRcdHVwbG9hZDogJC5wcm94eSh0aGlzLl9vblVwbG9hZFN0YXJ0LCB0aGlzKSxcblx0XHRcdGNvbXBsZXRlOiAkLnByb3h5KHRoaXMuX29uVXBsb2FkRW5kLCB0aGlzKSxcblx0XHRcdGxvY2FsaXphdGlvbjoge1xuXHRcdFx0XHRzZWxlY3Q6ICdTZWxlY3QgZmlsZXMuLi4nXG5cdFx0XHR9XG5cdFx0fSkuZGF0YSgna2VuZG9VcGxvYWQnKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBVcGxvYWQgYnV0dG9uIGNsaWNrXG5cdFx0JCgnI3N2bS1jbGVhckZpbGVzQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQ2xlYXJGaWxlc0NsaWNrLCB0aGlzKSk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIFNlbmQgaW5pdGlhbGl6YXRpb24gcmVxdWVzdFxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfSU5JVCk7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXG5cdFx0JCgnI3N2bS1yZXRyeUJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNzdm0tcmVmcmVzaEJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0JCgnI3N2bS1maWxlTGlzdCcpLm9mZignY2xpY2snKTtcblxuXHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm9mZignaGlkZGVuLmJzLm1vZGFsJyk7XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoJ2Rpc3Bvc2UnKTtcblx0XHQkKCcjc3ZtLWFkZEZvbGRlckJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0dGhpcy5fdXBsb2FkRmlsZXNNb2RhbC5tb2RhbCgnZGlzcG9zZScpO1xuXHRcdCQoJyNzdm0tY2xlYXJGaWxlc0J0Jykub2ZmKCdjbGljaycpO1xuXHR9XG5cblx0b25FeHRlbnNpb25Db21tYW5kKGNvbW1hbmQsIGRhdGEpXG5cdHtcblx0XHQvLyBNb2R1bGUgY2FuIGJlIGVuYWJsZWQgKG5vIGxvY2tpbmcgZmlsZSBleGlzdHMpXG5cdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0lOSVQpXG5cdFx0e1xuXHRcdFx0Ly8gUmV0cmlldmUgZmlsZSBzZXBhcmF0b3Jcblx0XHRcdHRoaXMuX2ZpbGVTZXBhcmF0b3IgPSBkYXRhLmdldFV0ZlN0cmluZygnc2VwJyk7XG5cblx0XHRcdC8vIENyZWF0ZSBmaWxlIGRhdGEgc291cmNlIG1hbmFnZXJcblx0XHRcdHRoaXMuX2ZpbGVNYW5hZ2VyID0gbmV3IEZpbGVEYXRhU291cmNlTWFuYWdlcihudWxsLCBbXSwgdGhpcy5fZmlsZVNlcGFyYXRvcik7XG5cblx0XHRcdC8vIFJldHJpZXZlIG1vZHVsZSBpZCBzZW50IGJ5IHRoZSBzZXJ2ZXIgKHJlcXVpcmVkIGJlY2F1c2UgbXVsdGlwbGUgbW9kdWxlcyB1c2UgZmlsZSB1cGxvYWRpbmcgc2VydmljZSlcblx0XHRcdGNvbnN0IHVwbG9hZE1vZHVsZUlkID0gZGF0YS5nZXRVdGZTdHJpbmcoJ21vZElkJyk7XG5cblx0XHRcdC8vIFNldCBmaWxlIHVwbG9hZGluZyB0YXJnZXQgY29uZmlndXJhdGlvblxuXHRcdFx0dGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnID0ge1xuXHRcdFx0XHRzZXNzaW9uVG9rZW46IHRoaXMuc21hcnRGb3guc2Vzc2lvblRva2VuLFxuXHRcdFx0XHRob3N0OiB0aGlzLnNtYXJ0Rm94LmNvbmZpZy5ob3N0LFxuXHRcdFx0XHRwb3J0OiB0aGlzLnNtYXJ0Rm94LmNvbmZpZy5wb3J0LFxuXHRcdFx0XHRtb2R1bGVJZDogdXBsb2FkTW9kdWxlSWQsXG5cdFx0XHRcdHByb3RvY29sOiB0aGlzLnNtYXJ0Rm94LmNvbmZpZy51c2VTU0wgPyAnaHR0cHMnIDogJ2h0dHAnXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBSZXF1ZXN0IFNlcnZsZXQgZmlsZXMgZGF0YSB0byBzZXJ2ZXIgaW5zdGFuY2Vcblx0XHRcdHRoaXMuX3JlZnJlc2hEYXRhTGlzdCgpO1xuXHRcdH1cblxuXHRcdC8qXG5cdFx0ICogVGhpcyByZXNwb25zZSBpcyByZXR1cm5lZCBpZiB0aGUgZmlsZSBVcGxvYWRzTG9jay50eHQgZXhpc3RzIGluIHRoZSAvY29uZmlnIGZvbGRlciBvZiB0aGUgc2VydmVyLlxuXHRcdCAqIFRoaXMgaXMgYW4gYWRkaXRpb25hbCBzZWN1cml0eSBtZWFzdXJlIHRvIGF2b2lkIHVud2FudGVkIGZpbGVzIHRvIGJlIHVwbG9hZGVkIGJ5IG1hbGljaXVzIHVzZXJzIGFjY2Vzc2luZyB0aGUgc2VydmVyXG5cdFx0ICogd2l0aCB0aGUgZGVmYXVsdCBjcmVkZW50aWFscywgaW4gY2FzZSB0aGV5IGhhdmUgbm90IGJlZW4gY2hhbmdlZCBieSB0aGUgYWRtaW5pc3RyYXRvciBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLlxuXHRcdCAqIFRoZSBmaWxlIG11c3QgYmUgcmVtb3ZlZCBtYW51YWxseSBiZWZvcmUgYWNjZXNzaW5nIHRoZSBTZXJ2bGV0IE1hbmFnZXIgbW9kdWxlIGZvciB0aGUgZmlyc3QgdGltZVxuXHRcdCAqL1xuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0xPQ0tFRClcblx0XHR7XG5cdFx0XHQvLyBTaG93IHdhcm5pbmdcblx0XHRcdHRoaXMuX3N3aXRjaFZpZXcoJ3N2bS1sb2NrZWQnKTtcblx0XHR9XG5cblx0XHQvLyBTZXJ2bGV0IGZvbGRlcnMgYW5kIGZpbGVzXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfU0VSVkxFVFMpXG5cdFx0e1xuXHRcdFx0Ly8gUmV0cmlldmUgU2VydmxldHMgZmlsZSBsaXN0XG5cdFx0XHRsZXQgc2VydmxldHNPYmogPSBkYXRhLmdldFNGU09iamVjdCgnc2VydmxldHMnKTtcblxuXHRcdFx0Ly8gSW5pdGlhbGl6ZSBtYW5hZ2VyXG5cdFx0XHR0aGlzLl9maWxlTWFuYWdlci5pbml0KCk7XG5cblx0XHRcdC8vIEFkZCBsaXN0IHRvIG1hbmFnZXJcblx0XHRcdHRoaXMuX2ZpbGVNYW5hZ2VyLmFkZEZpbGUoc2VydmxldHNPYmopO1xuXG5cdFx0XHQvLyBTZXQgVHJlZUxpc3QgZGF0YSBzb3VyY2Vcblx0XHRcdHRoaXMuX2ZpbGVzTGlzdC5zZXREYXRhU291cmNlKHRoaXMuX2ZpbGVNYW5hZ2VyLmRhdGFTb3VyY2UpO1xuXG5cdFx0XHQvLyBFeHBhbmQgZmlyc3QgbGV2ZWxcblx0XHRcdHRoaXMuX2ZpbGVzTGlzdC5leHBhbmQoJCgnI3N2bS1maWxlTGlzdCB0Ym9keT50cjplcSgwKScpKTtcblxuXHRcdFx0Ly8gRW5hYmxlIGludGVyZmFjZVxuXHRcdFx0dGhpcy5fZW5hYmxlSW50ZXJmYWNlKHRydWUpO1xuXG5cdFx0XHQvLyBTaG93IG1vZHVsZSdzIG1haW4gdmlld1xuXHRcdFx0dGhpcy5fc3dpdGNoVmlldygnc3ZtLW1haW4nKTtcblx0XHR9XG5cblx0XHQvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBtYW5hZ2luZyBzZXJ2bGV0IGZpbGVzXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfRVJST1IpXG5cdFx0e1xuXHRcdFx0Ly8gSGlkZSBhZGQgZm9sZGVyIG1vZGFsXG5cdFx0XHR0aGlzLl9hZGRGb2xkZXJNb2RhbC5tb2RhbCgnaGlkZScpO1xuXG5cdFx0XHQvLyBSZS1lbmFibGUgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UodHJ1ZSk7XG5cblx0XHRcdC8vIFNob3cgYW4gYWxlcnRcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChkYXRhLmdldFV0ZlN0cmluZygnZXJyb3InKSk7XG5cdFx0fVxuXG5cdFx0Ly8gU2VydmxldCBmb2xkZXIgb3IgZmlsZSBhZGRlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0ZJTEVfQURERUQpXG5cdFx0e1xuXHRcdFx0Ly8gR2V0IG5hbWUgb2YgdGhlIHVzZXIgd2hvIGFkZGVkIHRoZSBmaWxlL2ZvbGRlclxuXHRcdFx0Y29uc3QgcmVxdWVzdGVyID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3VzZXInKTtcblxuXHRcdFx0Ly8gR2V0IHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmaWxlL2ZvbGRlciBiZWluZyBhZGRlZFxuXHRcdFx0Y29uc3QgZmlsZU9iaiA9IGRhdGEuZ2V0U0ZTT2JqZWN0KCdmaWxlJyk7XG5cblx0XHRcdC8vIEdldCB0aGUgdGFyZ2V0IGZvbGRlciB3aGVyZSB0aGUgbmV3IGZpbGUvZm9sZGVyIHNob3VsZCBiZSBhZGRlZFxuXHRcdFx0Y29uc3QgcGFyZW50UGF0aCA9IGRhdGEuZ2V0VXRmU3RyaW5nKCdwYXJlbnQnKTtcblxuXHRcdFx0Ly8gR2V0IHRoZSBmbGFnIG5vdGlmeWluZyB0aGlzIHdhcyBhIGZpbGUgdXBsb2FkXG5cdFx0XHRjb25zdCBpc1VwbG9hZCA9IGRhdGEuZ2V0Qm9vbCgnaXNVcGxvYWQnKTtcblxuXHRcdFx0dHJ5XG5cdFx0XHR7XG5cdFx0XHRcdC8vIEFkZC91cGRhdGUgaXRlbSBvbiBkYXRhIHNvdXJjZVxuXHRcdFx0XHRjb25zdCBmaWxlUGF0aCA9IHRoaXMuX2ZpbGVNYW5hZ2VyLmFkZEZpbGVUb1BhcmVudChmaWxlT2JqLCBwYXJlbnRQYXRoKTtcblxuXHRcdFx0XHQvLyBSZWZyZXNoIHZpZXdcblx0XHRcdFx0dGhpcy5fZmlsZXNMaXN0LnJlZnJlc2goKTtcblxuXHRcdFx0XHRpZiAocmVxdWVzdGVyID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBFeHBhbmQgcGFyZW50XG5cdFx0XHRcdFx0dGhpcy5fZmlsZXNMaXN0LmV4cGFuZCgkKGAjc3ZtLWZpbGVMaXN0IC5maWxlLWNvbnRyb2xzW2RhdGEtaXRlbS1pZD1cIiR7JC5lc2NhcGVTZWxlY3RvcihwYXJlbnRQYXRoKX1cIl1gKS5jbG9zZXN0KCd0cicpKTtcblxuXHRcdFx0XHRcdGlmICghaXNVcGxvYWQpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gSGlkZSBtb2RhbFxuXHRcdFx0XHRcdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoJ2hpZGUnKTtcblxuXHRcdFx0XHRcdFx0Ly8gU2VsZWN0IHVwbG9hZCBmaWxlXG5cdFx0XHRcdFx0XHR0aGlzLl9maWxlc0xpc3Quc2VsZWN0KCQoYCNzdm0tZmlsZUxpc3QgLmZpbGUtY29udHJvbHNbZGF0YS1pdGVtLWlkPVwiJHskLmVzY2FwZVNlbGVjdG9yKGZpbGVQYXRoKX1cIl1gKS5jbG9zZXN0KCd0cicpKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBVcGRhdGUgc2VsZWN0aW9uXG5cdFx0XHRcdFx0dGhpcy5fb25GaWxlU2VsZWN0ZWRDaGFuZ2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHRcdGlmICghaXNVcGxvYWQpXG5cdFx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKGBGb2xkZXIgY3JlYXRlZGAsIGBBZG1pbmlzdHJhdG9yICR7cmVxdWVzdGVyfSBjcmVhdGVkIGZvbGRlcjogPHN0cm9uZz4ke2ZpbGVQYXRofTwvc3Ryb25nPmApO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oYEZpbGUgdXBsb2FkZWRgLCBgQWRtaW5pc3RyYXRvciAke3JlcXVlc3Rlcn0gdXBsb2FkZWQgZmlsZTogPHN0cm9uZz4ke2ZpbGVQYXRofTwvc3Ryb25nPmApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjYXRjaCAoZSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gVGhpcyBzaG91bGQgbm90IGhhcHBlbi4uLiBkYXRhIHNvdXJjZSBpcyBjb3JydXB0ZWQ/XG5cdFx0XHRcdGlmIChyZXF1ZXN0ZXIgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoZS5tZXNzYWdlLCB0cnVlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRW5hYmxlIGludGVyZmFjZVxuXHRcdFx0dGhpcy5fZW5hYmxlSW50ZXJmYWNlKHRydWUpO1xuXHRcdH1cblxuXHRcdC8vIFNlcnZsZXQgZmlsZXMgZGVsZXRlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0ZJTEVTX0RFTEVURUQpXG5cdFx0e1xuXHRcdFx0Ly8gR2V0IG5hbWUgb2YgdGhlIHVzZXIgd2hvIGRlbGV0ZWQgdGhlIGZpbGUvc1xuXHRcdFx0Y29uc3QgcmVxdWVzdGVyID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3VzZXInKTtcblxuXHRcdFx0Ly8gR2V0IHRoZSBsaXN0IG9mIGRlbGV0ZWQgZmlsZXNcblx0XHRcdGxldCBmaWxlcyA9IGRhdGEuZ2V0U0ZTQXJyYXkoJ2ZpbGVzJyk7XG5cblx0XHRcdGxldCBmaWxlc0FyciA9IFtdO1xuXG5cdFx0XHQvLyBVcGRhdGUgZGF0YSBzb3VyY2Vcblx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgZmlsZXMuc2l6ZSgpOyBqKyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBwYXRoID0gZmlsZXMuZ2V0VXRmU3RyaW5nKGopO1xuXHRcdFx0XHRmaWxlc0Fyci5wdXNoKHBhdGgpO1xuXG5cdFx0XHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHRcdFx0Ly8gUmVtb3ZlIGl0ZW0gZnJvbSBkYXRhIHNvdXJjZTsgcGFyZW50IGl0ZW0gaXMgcmV0dXJuZWRcblx0XHRcdFx0bGV0IHBhcmVudEl0ZW0gPSB0aGlzLl9maWxlTWFuYWdlci5yZW1vdmVGaWxlKHBhdGgpO1xuXG5cdFx0XHRcdC8vIENvbGxhcHNlIHBhcmVudCBpZiB0aGUgbGFzdCBvZiBpdHMgY2hpbGRyZW4gd2FzIGRlbGV0ZWRcblx0XHRcdFx0aWYgKHBhcmVudEl0ZW0gJiYgIXBhcmVudEl0ZW0uaGFzQ2hpbGRyZW4pXG5cdFx0XHRcdFx0dGhpcy5fZmlsZXNMaXN0LmNvbGxhcHNlKCQoYCNzdm0tZmlsZUxpc3QgLmZpbGUtY29udHJvbHNbZGF0YS1pdGVtLWlkPVwiJHskLmVzY2FwZVNlbGVjdG9yKHBhcmVudEl0ZW0uaWQpfVwiXWApLmNsb3Nlc3QoJ3RyJykpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocmVxdWVzdGVyID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oYCR7dGhpcy5fc2VsZWN0ZWRJdGVtLmlzRGlyID8gJ0ZvbGRlcicgOiAnRmlsZSd9IGRlbGV0ZWRgLCBgJHt0aGlzLl9zZWxlY3RlZEl0ZW0uaXNEaXIgPyAnRm9sZGVyJyA6ICdGaWxlJ30gJyR7dGhpcy5fc2VsZWN0ZWRJdGVtLm5hbWV9JyBkZWxldGVkIHN1Y2Nlc3NmdWxseWApO1xuXG5cdFx0XHRcdHRoaXMuX3NlbGVjdGVkSXRlbSA9IG51bGw7XG5cblx0XHRcdFx0dGhpcy5fZW5hYmxlSW50ZXJmYWNlKHRydWUpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKGBGaWxlIGRlbGV0ZWRgLCBgQWRtaW5pc3RyYXRvciAke3JlcXVlc3Rlcn0gZGVsZXRlZCB0aGUgZm9sbG93aW5nIGZpbGUke2ZpbGVzQXJyLmxlbmd0aCA+IDEgPyAncycgOiAnJ306IDxzdHJvbmc+JHtmaWxlc0Fyci5qb2luKCc8YnI+ICcpfTwvc3Ryb25nPmApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNldCBzZWxlY3Rpb25cblx0XHRcdHRoaXMuX29uRmlsZVNlbGVjdGVkQ2hhbmdlKCk7XG5cdFx0fVxuXG5cdFx0Ly8gZWxzZSBpZiAoKVxuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gVUkgRVZFTlQgTElTVEVORVJTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X29uUmV0cnlDbGljaygpXG5cdHtcblx0XHR0aGlzLl9zd2l0Y2hWaWV3KCdzdm0taW5pdCcpO1xuXG5cdFx0Ly8gUmUtc2VuZCBpbml0aWFsaXphdGlvbiByZXF1ZXN0XG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9JTklUKTtcblx0fVxuXG5cdF9vblJlZnJlc2hDbGljaygpXG5cdHtcblx0XHR0aGlzLl9maWxlc0xpc3QuY2xlYXJTZWxlY3Rpb24oKTtcblx0XHR0aGlzLl9yZWZyZXNoRGF0YUxpc3QoKTtcblx0fVxuXG5cdF9vbkZpbGVTZWxlY3RlZENoYW5nZSgpXG5cdHtcblx0XHQvLyBIaWRlIGNvbnRyb2wgYnV0dG9ucyBvbiBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbVxuXHRcdGlmICh0aGlzLl9zZWxlY3RlZEl0ZW0pXG5cdFx0XHQkKGAjc3ZtLWZpbGVMaXN0IC5maWxlLWNvbnRyb2xzW2RhdGEtaXRlbS1pZD1cIiR7JC5lc2NhcGVTZWxlY3Rvcih0aGlzLl9zZWxlY3RlZEl0ZW0uaWQpfVwiXWApLmhpZGUoKTtcblxuXHRcdC8vIEdldCBzZWxlY3RlZCBpdGVtXG5cdFx0bGV0IHNlbGVjdGVkUm93cyA9IHRoaXMuX2ZpbGVzTGlzdC5zZWxlY3QoKTtcblxuXHRcdGlmIChzZWxlY3RlZFJvd3MubGVuZ3RoID4gMClcblx0XHR7XG5cdFx0XHQvLyBTYXZlIHJlZi4gdG8gc2VsZWN0ZWQgaXRlbVxuXHRcdFx0dGhpcy5fc2VsZWN0ZWRJdGVtID0gdGhpcy5fZmlsZXNMaXN0LmRhdGFJdGVtKHNlbGVjdGVkUm93c1swXSk7XG5cblx0XHRcdC8vIFNob3cgY29udHJvbCBidXR0b25zIG9uIG5ldyBzZWxlY3RlZCBpdGVtXG5cdFx0XHQkKGAjc3ZtLWZpbGVMaXN0IC5maWxlLWNvbnRyb2xzW2RhdGEtaXRlbS1pZD1cIiR7JC5lc2NhcGVTZWxlY3Rvcih0aGlzLl9zZWxlY3RlZEl0ZW0uaWQpfVwiXWApLnNob3coKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fc2VsZWN0ZWRJdGVtID0gbnVsbDtcblx0fVxuXG5cdF9zaG93QWRkRm9sZGVyTW9kYWxDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtICYmIHRoaXMuX3NlbGVjdGVkSXRlbS5pc0Rpcilcblx0XHR7XG5cdFx0XHR0aGlzLl9hZGRGb2xkZXJNb2RhbC5tb2RhbCgnc2hvdycpO1xuXHRcdFx0JCgnI3N2bS1mb2xkZXJOYW1lSW4nKS5mb2N1cygpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkFkZEZvbGRlckNsaWNrKClcblx0e1xuXHRcdC8vIFRoZSBwYXJlbnQgZm9sZGVyIGNvdWxkIGhhdmUgYmVlbiBkZWxldGVkIHdoaWxlIHVzZXIgaXMgc3RpbGwgdHlwaW5nIHRoZSBuYW1lIG9mIHRoZSBuZXcgY2hpbGQgZm9sZGVyXG5cdFx0aWYgKCF0aGlzLl9zZWxlY3RlZEl0ZW0pXG5cdFx0e1xuXHRcdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoJ2hpZGUnKTtcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydCgnVW5hYmxlIHRvIGNyZWF0ZSBmb2xkZXI7IHRoZSBwYXJlbnQgZm9sZGVyIGRvZXNuXFwndCBleGlzdC4nKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fYWRkRm9sZGVyVmFsaWRhdG9yLnZhbGlkYXRlKCkpXG5cdFx0e1xuXHRcdFx0Ly8gRGlzYWJsZSBtb2RhbCBpbnRlcmZhY2Vcblx0XHRcdHRoaXMuX2VuYWJsZUFkZEZvbGRlck1vZGFsKGZhbHNlKTtcblxuXHRcdFx0bGV0IGRhdGEgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0XHRkYXRhLnB1dFV0ZlN0cmluZygnZm9sZGVyJywgdGhpcy5fc2VsZWN0ZWRJdGVtLmlkICsgdGhpcy5fZmlsZVNlcGFyYXRvciArICQoJyNzdm0tZm9sZGVyTmFtZUluJykudmFsKCkpO1xuXG5cdFx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gc2VydmVyXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0NSRUFURV9GT0xERVIsIGRhdGEpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkFkZEZvbGRlck1vZGFsSGlkZGVuKClcblx0e1xuXHRcdCQoJyNzdm0tZm9sZGVyTmFtZUluJykudmFsKCcnKTtcblx0XHR0aGlzLl9yZXNldEFkZEZvbGRlclZhbGlkYXRpb24oKTtcblxuXHRcdC8vIEVuYWJsZSBtb2RhbCBpbnRlcmZhY2Vcblx0XHR0aGlzLl9lbmFibGVBZGRGb2xkZXJNb2RhbCh0cnVlKTtcblx0fVxuXG5cdF9zaG93VXBsb2FkRmlsZXNNb2RhbENsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl9zZWxlY3RlZEl0ZW0pXG5cdFx0XHR0aGlzLl91cGxvYWRGaWxlc01vZGFsLm1vZGFsKCdzaG93Jyk7XG5cdH1cblxuXHRfb25DbGVhckZpbGVzQ2xpY2soKVxuXHR7XG5cdFx0dGhpcy5fdXBsb2FkZXIuY2xlYXJBbGxGaWxlcygpO1xuXHR9XG5cblx0X29uVXBsb2FkU3RhcnQoZSlcblx0e1xuXHRcdC8vIERpc2FibGUgY2xlYXIgYnV0dG9uXG5cdFx0JCgnI3N2bS1jbGVhckZpbGVzQnQnKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xuXG5cdFx0Ly8gU2V0IGRlc3RpbmF0aW9uIHVybFxuXHRcdGNvbnN0IHVybCA9IHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZy5wcm90b2NvbCArICc6Ly8nICsgdGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnLmhvc3QgKyAnOicgKyB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcucG9ydCArICcvQmx1ZUJveC9TRlMyWEZpbGVVcGxvYWQ/c2Vzc0hhc2hJZD0nICsgdGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnLnNlc3Npb25Ub2tlbjtcblxuXHRcdGUuc2VuZGVyLm9wdGlvbnMuYXN5bmMuc2F2ZVVybCA9IHVybDtcblxuXHRcdC8vIFNldCBwYXlsb2FkXG5cdFx0Y29uc3QgcGFyYW1zID0gbmV3IEZvcm1EYXRhKCk7XG5cdFx0cGFyYW1zLmFwcGVuZCgnX19tb2R1bGUnLCB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcubW9kdWxlSWQpO1xuXHRcdHBhcmFtcy5hcHBlbmQoJ19fdGFyZ2V0JywgdGhpcy5fc2VsZWN0ZWRJdGVtLmlkKTtcblxuXHRcdGZvciAobGV0IGYgPSAwOyBmIDwgZS5maWxlcy5sZW5ndGg7IGYrKylcblx0XHRcdHBhcmFtcy5hcHBlbmQoJ2ZpbGVzW10nLCBlLmZpbGVzW2ZdLnJhd0ZpbGUpO1xuXG5cdFx0ZS5mb3JtRGF0YSA9IHBhcmFtcztcblx0fVxuXG5cdF9vblVwbG9hZEVuZChlKVxuXHR7XG5cdFx0Ly8gRW5hYmxlIGNsZWFyIGJ1dHRvblxuXHRcdCQoJyNzdm0tY2xlYXJGaWxlc0J0JykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cdH1cblxuXHRfb25GaWxlc1VwbG9hZEVuZChyZXNwb25zZSlcblx0e1xuXHRcdC8vIE5vdGhpbmcgdG8gZG86IHdlIGhhdmUgdG8gd2FpdCB0aGUgdXBsb2FkIHByb2Nlc3MgY29tcGxldGlvbiB0byBiZSBzaWduYWxlZCBieSB0aGUgc2VydmVyIHRocm91Z2ggdGhlIGRlZGljYXRlZCBFeHRlbnNpb24gcmVzcG9uc2VcblxuXHRcdC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdC8vIFRPRE8gU2hvdWxkIHdlIGhhbmRsZSB0aGlzIHJlc3BvbnNlIGluIHNvbWUgd2F5PyBGb3Igc29tZSB1bmtub3duIHJlYXNvbiB3ZSBhbHdheXMgZ2V0IG9rPWZhbHNlIGFuZCBzdGF0dXM9MFxuXHRcdC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKVxuXHRcdC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlLm9rKVxuXHRcdC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlLnN0YXR1cylcblx0fVxuXG5cdF9vblJlbW92ZUZpbGVDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtKVxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd0NvbmZpcm1XYXJuaW5nKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBzZWxlY3RlZCAke3RoaXMuX3NlbGVjdGVkSXRlbS5pc0RpciA/ICdmb2xkZXInIDogJ2ZpbGUnfT88YnI+PGJyPlBhdGg6IDxzdHJvbmc+JHt0aGlzLl9zZWxlY3RlZEl0ZW0uaWR9PC9zdHJvbmc+YCwgJC5wcm94eSh0aGlzLl9vblJlbW92ZUZpbGVDb25maXJtLCB0aGlzKSk7XG5cdH1cblxuXHRfb25SZW1vdmVGaWxlQ29uZmlybSgpXG5cdHtcblx0XHQvLyBEaXNhYmxlIGludGVyZmFjZVxuXHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZShmYWxzZSk7XG5cblx0XHQvLyBSZXF1ZXN0IFNlcnZsZXQgZmlsZXMgcmVtb3ZhbFxuXHRcdC8vIE5PVEU6IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgQWRtaW5Ub29sLCB0aGUgZmlsZSB0byBiZSBkZWxldGVkIGlzIHNlbnRcblx0XHQvLyBpbiBhbiBhcnJheSBvZiBzdHJpbmdzLCBldmVuIGlmIHdlIGNhbid0IGRlbGV0ZSBtb3JlIHRoYW4gMSBmaWxlIGF0IG9uY2UgaW4gdGhpcyBBZG1pblRvb2xcblxuXHRcdGxldCBmaWxlcyA9IG5ldyBTRlMyWC5TRlNBcnJheSgpO1xuXHRcdGZpbGVzLmFkZFV0ZlN0cmluZyh0aGlzLl9zZWxlY3RlZEl0ZW0uaWQpO1xuXG5cdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRwYXJhbXMucHV0U0ZTQXJyYXkoJ2ZpbGVzJywgZmlsZXMpO1xuXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9ERUxFVEVfRklMRVMsIHBhcmFtcyk7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQUklWQVRFIE1FVEhPRFNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfc3dpdGNoVmlldyh2aWV3SWQpXG5cdHtcblx0XHRkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZtLXZpZXdzdGFjaycpLnNlbGVjdGVkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZpZXdJZCk7XG5cdH1cblxuXHRfZW5hYmxlSW50ZXJmYWNlKGVuYWJsZSlcblx0e1xuXHRcdCQoJyNzdm0tZmlsZUxpc3QnKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXHRcdCQoJyNzdm0tcmVmcmVzaEJ0JykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblx0fVxuXG5cdF9yZWZyZXNoRGF0YUxpc3QoKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSBpbnRlcmZhY2Vcblx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIHNlcnZlclxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX1NFUlZMRVRTKVxuXHR9XG5cblx0X3Jlc2V0QWRkRm9sZGVyVmFsaWRhdGlvbigpXG5cdHtcblx0XHR0aGlzLl9hZGRGb2xkZXJWYWxpZGF0b3IuaGlkZU1lc3NhZ2VzKCk7XG5cblx0XHQvLyBUaGUgbWV0aG9kIGFib3ZlIGRvZXNuJ3QgcmVtb3ZlIHRoZSBrLWludmFsaWQgY2xhc3NlcyBhbmQgYXJpYS1pbnZhbGlkPVwidHJ1ZVwiIGF0dHJpYnV0ZXMgZnJvbSBpbnB1dHNcblx0XHQvLyBMZXQncyBkbyBpdCBtYW51YWxseVxuXHRcdCQoJyNzdm0tYWRkRm9sZGVyRm9ybSAuay1pbnZhbGlkJykucmVtb3ZlQ2xhc3MoJ2staW52YWxpZCcpO1xuXHRcdCQoJyNzdm0tYWRkRm9sZGVyRm9ybSBbYXJpYS1pbnZhbGlkPVwidHJ1ZVwiXScpLnJlbW92ZUF0dHIoJ2FyaWEtaW52YWxpZCcpO1xuXHR9XG5cblx0X2VuYWJsZUFkZEZvbGRlck1vZGFsKGVuYWJsZSlcblx0e1xuXHRcdC8vIERpc2FibGUgbW9kYWwgY2xvc2UgYnV0dG9uc1xuXHRcdCQoJyNzdm0tYWRkRm9sZGVyTW9kYWwgYnV0dG9uW2RhdGEtZGlzbWlzcz1cIm1vZGFsXCJdJykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblxuXHRcdC8vIERpc2FibGUgYWRkIGJ1dHRvblxuXHRcdCQoJyNzdm0tYWRkRm9sZGVyQnQnKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXG5cdFx0Ly8gRGlzYWJsZSBmaWVsZHNldFxuXHRcdCQoJyNzdm0tYWRkRm9sZGVyRm9ybScpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZSk7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQUklWQVRFIEdFVFRFUlNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDaEpBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBIiwic291cmNlUm9vdCI6IiJ9