ngx-hana-nameserver-history-viewer 1.1.1 → 1.1.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/README.md +7 -6
  2. package/esm2020/ngx-hana-nameserver-history-viewer.mjs +5 -0
  3. package/esm2020/public-api.mjs +2 -0
  4. package/esm2020/src/nameserver-history-viewer/components/alert/alert.component.mjs +68 -0
  5. package/esm2020/src/nameserver-history-viewer/components/alert/alert.module.mjs +22 -0
  6. package/esm2020/src/nameserver-history-viewer/components/alert/index.mjs +3 -0
  7. package/esm2020/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.mjs +112 -0
  8. package/esm2020/src/nameserver-history-viewer/components/file-drop-input/index.mjs +2 -0
  9. package/esm2020/src/nameserver-history-viewer/components/index.mjs +9 -0
  10. package/esm2020/src/nameserver-history-viewer/components/instruction/index.mjs +2 -0
  11. package/esm2020/src/nameserver-history-viewer/components/instruction/instruction.component.mjs +42 -0
  12. package/esm2020/src/nameserver-history-viewer/components/nameserver-history.component.mjs +550 -0
  13. package/esm2020/src/nameserver-history-viewer/components/port-selector/index.mjs +2 -0
  14. package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.component.mjs +69 -0
  15. package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.service.mjs +41 -0
  16. package/esm2020/src/nameserver-history-viewer/components/progress-bar/index.mjs +2 -0
  17. package/esm2020/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.mjs +40 -0
  18. package/esm2020/src/nameserver-history-viewer/components/time-range-selector/index.mjs +2 -0
  19. package/esm2020/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.mjs +70 -0
  20. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/index.mjs +2 -0
  21. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.mjs +90 -0
  22. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.mjs +49 -0
  23. package/esm2020/src/nameserver-history-viewer/index.mjs +3 -0
  24. package/esm2020/src/nameserver-history-viewer/nameserver-history.module.mjs +63 -0
  25. package/esm2020/src/nameserver-history-viewer/services/chart.service.mjs +323 -0
  26. package/esm2020/src/nameserver-history-viewer/services/file.service.mjs +390 -0
  27. package/esm2020/src/nameserver-history-viewer/services/index.mjs +4 -0
  28. package/esm2020/src/nameserver-history-viewer/services/ui.service.mjs +557 -0
  29. package/esm2020/src/nameserver-history-viewer/types/abort.types.mjs +6 -0
  30. package/esm2020/src/nameserver-history-viewer/types/alert.types.mjs +8 -0
  31. package/esm2020/src/nameserver-history-viewer/types/chart-content-data-item.types.mjs +2 -0
  32. package/esm2020/src/nameserver-history-viewer/types/chart-content-data.types.mjs +2 -0
  33. package/esm2020/src/nameserver-history-viewer/types/chart-content-header.types.mjs +2 -0
  34. package/esm2020/src/nameserver-history-viewer/types/chart-content-time.types.mjs +2 -0
  35. package/esm2020/src/nameserver-history-viewer/types/chart-content.types.mjs +2 -0
  36. package/esm2020/src/nameserver-history-viewer/types/color-rgba.types.mjs +2 -0
  37. package/esm2020/src/nameserver-history-viewer/types/html-element.type.mjs +9 -0
  38. package/esm2020/src/nameserver-history-viewer/types/index.mjs +28 -0
  39. package/esm2020/src/nameserver-history-viewer/types/item.types.mjs +14 -0
  40. package/esm2020/src/nameserver-history-viewer/types/legend-color.types.mjs +2 -0
  41. package/esm2020/src/nameserver-history-viewer/types/load-history-info-backup.types.mjs +2 -0
  42. package/esm2020/src/nameserver-history-viewer/types/load-history-info-columnstore.types.mjs +2 -0
  43. package/esm2020/src/nameserver-history-viewer/types/load-history-info-host.types.mjs +2 -0
  44. package/esm2020/src/nameserver-history-viewer/types/load-history-info-item.types.mjs +2 -0
  45. package/esm2020/src/nameserver-history-viewer/types/load-history-info-persistence.types.mjs +2 -0
  46. package/esm2020/src/nameserver-history-viewer/types/load-history-info-rowstore.types.mjs +2 -0
  47. package/esm2020/src/nameserver-history-viewer/types/load-history-info-server.types.mjs +2 -0
  48. package/esm2020/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.mjs +2 -0
  49. package/esm2020/src/nameserver-history-viewer/types/load-history-info-sql.types.mjs +2 -0
  50. package/esm2020/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.mjs +2 -0
  51. package/esm2020/src/nameserver-history-viewer/types/load-history-info-threads.types.mjs +2 -0
  52. package/esm2020/src/nameserver-history-viewer/types/load-history-info.types.mjs +2 -0
  53. package/esm2020/src/nameserver-history-viewer/types/port.types.mjs +2 -0
  54. package/esm2020/src/nameserver-history-viewer/types/scale-group.types.mjs +17 -0
  55. package/esm2020/src/nameserver-history-viewer/types/unit-category.types.mjs +10 -0
  56. package/esm2020/src/nameserver-history-viewer/types/unit.types.mjs +14 -0
  57. package/esm2020/src/nameserver-history-viewer/utils/chart-util.mjs +25 -0
  58. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.mjs +2 -0
  59. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.mjs +57 -0
  60. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.mjs +139 -0
  61. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/index.mjs +41 -0
  62. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.mjs +106 -0
  63. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.mjs +168 -0
  64. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/utils.mjs +114 -0
  65. package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.mjs +527 -0
  66. package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/index.mjs +2 -0
  67. package/esm2020/src/nameserver-history-viewer/utils/file-util.mjs +154 -0
  68. package/esm2020/src/nameserver-history-viewer/utils/index.mjs +5 -0
  69. package/esm2020/src/nameserver-history-viewer/utils/time-util.mjs +101 -0
  70. package/esm2020/src/nameserver-history-viewer/utils/ui-util.mjs +162 -0
  71. package/fesm2015/ngx-hana-nameserver-history-viewer.mjs +4081 -0
  72. package/fesm2015/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
  73. package/fesm2020/ngx-hana-nameserver-history-viewer.mjs +4081 -0
  74. package/fesm2020/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
  75. package/ngx-hana-nameserver-history-viewer.d.ts +1 -1
  76. package/package.json +36 -61
  77. package/src/nameserver-history-viewer/components/alert/alert.component.d.ts +4 -1
  78. package/src/nameserver-history-viewer/components/alert/alert.module.d.ts +6 -0
  79. package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.d.ts +3 -0
  80. package/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +3 -0
  81. package/src/nameserver-history-viewer/components/nameserver-history.component.d.ts +33 -14
  82. package/src/nameserver-history-viewer/components/port-selector/port-selector.component.d.ts +4 -1
  83. package/src/nameserver-history-viewer/components/port-selector/port-selector.service.d.ts +3 -0
  84. package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +3 -0
  85. package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +3 -0
  86. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.d.ts +3 -0
  87. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.d.ts +3 -0
  88. package/src/nameserver-history-viewer/index.d.ts +1 -0
  89. package/src/nameserver-history-viewer/nameserver-history.module.d.ts +17 -0
  90. package/src/nameserver-history-viewer/services/chart.service.d.ts +4 -1
  91. package/src/nameserver-history-viewer/services/file.service.d.ts +4 -0
  92. package/src/nameserver-history-viewer/services/ui.service.d.ts +5 -2
  93. package/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.d.ts +3 -0
  94. package/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.d.ts +1 -1
  95. package/src/nameserver-history-viewer/utils/file-util.d.ts +11 -0
  96. package/bundles/ngx-hana-nameserver-history-viewer.umd.js +0 -6298
  97. package/bundles/ngx-hana-nameserver-history-viewer.umd.js.map +0 -1
  98. package/bundles/ngx-hana-nameserver-history-viewer.umd.min.js +0 -2
  99. package/bundles/ngx-hana-nameserver-history-viewer.umd.min.js.map +0 -1
  100. package/esm2015/ngx-hana-nameserver-history-viewer.js +0 -10
  101. package/esm2015/public-api.js +0 -6
  102. package/esm2015/src/nameserver-history-viewer/components/alert/alert.component.js +0 -108
  103. package/esm2015/src/nameserver-history-viewer/components/alert/alert.module.js +0 -21
  104. package/esm2015/src/nameserver-history-viewer/components/alert/index.js +0 -7
  105. package/esm2015/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -141
  106. package/esm2015/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
  107. package/esm2015/src/nameserver-history-viewer/components/index.js +0 -13
  108. package/esm2015/src/nameserver-history-viewer/components/instruction/index.js +0 -6
  109. package/esm2015/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -62
  110. package/esm2015/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -742
  111. package/esm2015/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
  112. package/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
  113. package/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -56
  114. package/esm2015/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
  115. package/esm2015/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -35
  116. package/esm2015/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
  117. package/esm2015/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -68
  118. package/esm2015/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
  119. package/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -135
  120. package/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -72
  121. package/esm2015/src/nameserver-history-viewer/index.js +0 -6
  122. package/esm2015/src/nameserver-history-viewer/nameserver-history.module.js +0 -42
  123. package/esm2015/src/nameserver-history-viewer/services/chart.service.js +0 -423
  124. package/esm2015/src/nameserver-history-viewer/services/file.service.js +0 -447
  125. package/esm2015/src/nameserver-history-viewer/services/index.js +0 -8
  126. package/esm2015/src/nameserver-history-viewer/services/ui.service.js +0 -817
  127. package/esm2015/src/nameserver-history-viewer/types/abort.types.js +0 -13
  128. package/esm2015/src/nameserver-history-viewer/types/alert.types.js +0 -13
  129. package/esm2015/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
  130. package/esm2015/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
  131. package/esm2015/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
  132. package/esm2015/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
  133. package/esm2015/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
  134. package/esm2015/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
  135. package/esm2015/src/nameserver-history-viewer/types/html-element.type.js +0 -19
  136. package/esm2015/src/nameserver-history-viewer/types/index.js +0 -32
  137. package/esm2015/src/nameserver-history-viewer/types/item.types.js +0 -19
  138. package/esm2015/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
  139. package/esm2015/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
  140. package/esm2015/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
  141. package/esm2015/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
  142. package/esm2015/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
  143. package/esm2015/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
  144. package/esm2015/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
  145. package/esm2015/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
  146. package/esm2015/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -19
  147. package/esm2015/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
  148. package/esm2015/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
  149. package/esm2015/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
  150. package/esm2015/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
  151. package/esm2015/src/nameserver-history-viewer/types/port.types.js +0 -17
  152. package/esm2015/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
  153. package/esm2015/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
  154. package/esm2015/src/nameserver-history-viewer/types/unit.types.js +0 -19
  155. package/esm2015/src/nameserver-history-viewer/utils/chart-util.js +0 -38
  156. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
  157. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
  158. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -213
  159. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
  160. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -158
  161. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -295
  162. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -130
  163. package/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -733
  164. package/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
  165. package/esm2015/src/nameserver-history-viewer/utils/file-util.js +0 -149
  166. package/esm2015/src/nameserver-history-viewer/utils/index.js +0 -9
  167. package/esm2015/src/nameserver-history-viewer/utils/time-util.js +0 -135
  168. package/esm2015/src/nameserver-history-viewer/utils/ui-util.js +0 -203
  169. package/esm5/ngx-hana-nameserver-history-viewer.js +0 -10
  170. package/esm5/public-api.js +0 -6
  171. package/esm5/src/nameserver-history-viewer/components/alert/alert.component.js +0 -140
  172. package/esm5/src/nameserver-history-viewer/components/alert/alert.module.js +0 -25
  173. package/esm5/src/nameserver-history-viewer/components/alert/index.js +0 -7
  174. package/esm5/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -155
  175. package/esm5/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
  176. package/esm5/src/nameserver-history-viewer/components/index.js +0 -13
  177. package/esm5/src/nameserver-history-viewer/components/instruction/index.js +0 -6
  178. package/esm5/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -67
  179. package/esm5/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -990
  180. package/esm5/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
  181. package/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
  182. package/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -81
  183. package/esm5/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
  184. package/esm5/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -26
  185. package/esm5/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
  186. package/esm5/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -58
  187. package/esm5/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
  188. package/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -164
  189. package/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -102
  190. package/esm5/src/nameserver-history-viewer/index.js +0 -6
  191. package/esm5/src/nameserver-history-viewer/nameserver-history.module.js +0 -46
  192. package/esm5/src/nameserver-history-viewer/services/chart.service.js +0 -578
  193. package/esm5/src/nameserver-history-viewer/services/file.service.js +0 -566
  194. package/esm5/src/nameserver-history-viewer/services/index.js +0 -8
  195. package/esm5/src/nameserver-history-viewer/services/ui.service.js +0 -1036
  196. package/esm5/src/nameserver-history-viewer/types/abort.types.js +0 -13
  197. package/esm5/src/nameserver-history-viewer/types/alert.types.js +0 -13
  198. package/esm5/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
  199. package/esm5/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
  200. package/esm5/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
  201. package/esm5/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
  202. package/esm5/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
  203. package/esm5/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
  204. package/esm5/src/nameserver-history-viewer/types/html-element.type.js +0 -19
  205. package/esm5/src/nameserver-history-viewer/types/index.js +0 -32
  206. package/esm5/src/nameserver-history-viewer/types/item.types.js +0 -19
  207. package/esm5/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
  208. package/esm5/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
  209. package/esm5/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
  210. package/esm5/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
  211. package/esm5/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
  212. package/esm5/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
  213. package/esm5/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
  214. package/esm5/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
  215. package/esm5/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -19
  216. package/esm5/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
  217. package/esm5/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
  218. package/esm5/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
  219. package/esm5/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
  220. package/esm5/src/nameserver-history-viewer/types/port.types.js +0 -17
  221. package/esm5/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
  222. package/esm5/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
  223. package/esm5/src/nameserver-history-viewer/types/unit.types.js +0 -19
  224. package/esm5/src/nameserver-history-viewer/utils/chart-util.js +0 -39
  225. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
  226. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
  227. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -307
  228. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
  229. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -232
  230. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -350
  231. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -142
  232. package/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -733
  233. package/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
  234. package/esm5/src/nameserver-history-viewer/utils/file-util.js +0 -150
  235. package/esm5/src/nameserver-history-viewer/utils/index.js +0 -9
  236. package/esm5/src/nameserver-history-viewer/utils/time-util.js +0 -135
  237. package/esm5/src/nameserver-history-viewer/utils/ui-util.js +0 -205
  238. package/fesm2015/ngx-hana-nameserver-history-viewer.js +0 -5223
  239. package/fesm2015/ngx-hana-nameserver-history-viewer.js.map +0 -1
  240. package/fesm5/ngx-hana-nameserver-history-viewer.js +0 -6295
  241. package/fesm5/ngx-hana-nameserver-history-viewer.js.map +0 -1
  242. package/ngx-hana-nameserver-history-viewer.metadata.json +0 -1
@@ -1,423 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import { Injectable } from '@angular/core';
6
- import { Chart } from 'chart.js';
7
- import { getColorString, getNumberWithCommas, randomColor } from '../utils';
8
- import { UIService } from './ui.service';
9
- import { Item, Unit } from '../types';
10
- // Using dynamic flag to fix the issue of ng-packagr #696: Lambda not supported
11
- // @dynamic
12
- export class ChartService {
13
- /**
14
- * toggle the dataset status of the chart, synchronously
15
- * @private
16
- * @param {?} dataSetIndex
17
- * @param {?} chart
18
- * @param {?} hidden
19
- * @return {?}
20
- */
21
- static _toggleDataSet(dataSetIndex, chart, hidden) {
22
- // meta.hidden = false and dataset.hidden = false --> show
23
- // meta.hidden = false and dataset.hidden = true --> show
24
- // meta.hidden = null and dataset.hidden = false -> show
25
- // meta.hidden = null and dataset.hidden = true -> hide
26
- // in the first case (false, false), needs to click legend twice to
27
- // hide the dataset, because the first click only set meta.hidden = null)
28
- if (dataSetIndex != null && chart != null) {
29
- /** @type {?} */
30
- const meta = chart.getDatasetMeta(dataSetIndex);
31
- if (meta) {
32
- if (!hidden) {
33
- // display the item, if dataset hidden is false, set hidden of meta to null,
34
- meta.hidden = !chart.data.datasets[dataSetIndex].hidden ? null : hidden;
35
- }
36
- else {
37
- meta.hidden = hidden;
38
- }
39
- }
40
- }
41
- }
42
- /**
43
- * @private
44
- * @param {?} chart
45
- * @param {?} datasetIndex
46
- * @param {?} status
47
- * @return {?}
48
- */
49
- static _restoreDataSetStatus(chart, datasetIndex, status) {
50
- if (chart && chart.data && chart.data.datasets && chart.getDatasetMeta(datasetIndex) && status) {
51
- chart.data.datasets[datasetIndex].hidden = status.datasetStatus;
52
- chart.getDatasetMeta(datasetIndex).hidden = status.metaStatus;
53
- }
54
- }
55
- /**
56
- * initialize/clear the configuration for the chart
57
- * @private
58
- * @param {?} chart
59
- * @return {?}
60
- */
61
- static _initConfig(chart) {
62
- // init data sets
63
- if (chart.data && chart.data.datasets) {
64
- chart.data.datasets.length = 0;
65
- chart.data.datasets = void 0;
66
- chart.data = void 0;
67
- }
68
- // init options
69
- if (chart.options && chart.options.scales && (chart.options.scales.xAxes || chart.options.scales.yAxis)) {
70
- if (chart.options.scales.xAxes) {
71
- chart.options.scales.xAxes.length = 0;
72
- chart.options.scales.xAxes = void 0;
73
- }
74
- if (chart.options.scales.yAxes) {
75
- chart.options.scales.yAxes.length = 0;
76
- chart.options.scales.yAxes = void 0;
77
- }
78
- chart.options.scales = void 0;
79
- chart.options = void 0;
80
- }
81
- }
82
- /**
83
- * Generate DataSets by the data and header information
84
- * @private
85
- * @param {?} data
86
- * @param {?} header
87
- * @param {?} headerKey
88
- * @param {?} defaultItems
89
- * @return {?}
90
- */
91
- static _generateDataSets(data, header, headerKey, defaultItems) {
92
- /** @type {?} */
93
- const alpha = 0.5;
94
- /** @type {?} */
95
- const colors = UIService.getColors(alpha);
96
- return data.map((item, i) => {
97
- /** @type {?} */
98
- const color = colors[headerKey[i]] ? getColorString(colors[headerKey[i]]) : randomColor(alpha);
99
- return {
100
- borderColor: color,
101
- backgroundColor: color,
102
- borderWidth: 1.25,
103
- spanGaps: false,
104
- label: header[i],
105
- data: data[i],
106
- fill: false,
107
- yAxisID: `y-axis-${i}`,
108
- hidden: !defaultItems.includes(header[i])
109
- };
110
- });
111
- }
112
- /**
113
- * @private
114
- * @param {?} time
115
- * @return {?}
116
- */
117
- static _generateXAxes(time) {
118
- /** @type {?} */
119
- const format = 'MMMDD HH:mm:ss';
120
- return [
121
- {
122
- type: 'time',
123
- time: {
124
- // unit: 'second',
125
- // stepSize: 1,
126
- displayFormats: {
127
- 'millisecond': format,
128
- 'second': format,
129
- 'minute': format,
130
- 'hour': 'MMMDD HH',
131
- 'day': 'MMMDD YYYY',
132
- 'week': format,
133
- 'month': format,
134
- 'quarter': format,
135
- 'year': format,
136
- },
137
- tooltipFormat: 'll HH:mm:ss',
138
- min: time[0],
139
- max: time[time.length - 1]
140
- },
141
- // scaleLabel: {
142
- // display: false,
143
- // labelString: 'Date'
144
- // },
145
- ticks: {
146
- maxRotation: 0,
147
- reverse: true
148
- }
149
- }
150
- ];
151
- }
152
- /**
153
- * @private
154
- * @param {?} data
155
- * @param {?} yScale
156
- * @return {?}
157
- */
158
- static _generateYAxes(data, yScale) {
159
- return data.map((item, i) => ({
160
- type: 'linear',
161
- display: false,
162
- position: 'left',
163
- id: `y-axis-${i}`,
164
- gridLines: {},
165
- ticks: {
166
- min: 0,
167
- max: yScale[i]
168
- }
169
- }));
170
- }
171
- /**
172
- * generate configuration for chart
173
- * @private
174
- * @param {?} time
175
- * @param {?} data
176
- * @param {?} yScale
177
- * @param {?} header
178
- * @param {?} headerKey
179
- * @param {?} selection
180
- * @param {?} tableSource
181
- * @param {?} title
182
- * @param {?} defaultItems
183
- * @param {?} zoomCallback
184
- * @return {?}
185
- */
186
- static _generateChartConfig(time, data, yScale, header, headerKey, selection, tableSource, title, defaultItems, zoomCallback) {
187
- return {
188
- type: 'line',
189
- data: {
190
- datasets: ChartService._generateDataSets(data, header, headerKey, defaultItems)
191
- },
192
- options: {
193
- elements: { point: { radius: 0, hitRadius: 5, hoverRadius: 5 } },
194
- // set radius to 0 not to display point
195
- responsive: true,
196
- animation: {
197
- duration: 0,
198
- },
199
- hover: {
200
- animationDuration: 0,
201
- // duration of animations when hovering an item
202
- onHover: function (e) {
203
- /** @type {?} */
204
- const point = this.getElementAtEvent(e);
205
- if (point.length) {
206
- e.target.style.cursor = 'pointer';
207
- }
208
- else {
209
- e.target.style.cursor = 'default';
210
- }
211
- }
212
- },
213
- responsiveAnimationDuration: 0,
214
- // animation duration after a resize
215
- legend: {
216
- position: 'bottom',
217
- onHover: (e) => {
218
- e.target.style.cursor = 'pointer';
219
- },
220
- labels: {
221
- filter: (legendItem) => selection.isSelected(tableSource.find(row => legendItem.text === row.KPI))
222
- }
223
- },
224
- title: {
225
- display: true,
226
- text: title
227
- },
228
- responsiveDownsample: {
229
- enabled: true,
230
- desiredDataPointDistance: 2,
231
- minNumPoints: 200,
232
- maxNumPointsToDraw: 100
233
- },
234
- tooltips: {
235
- callbacks: {
236
- label: function (tooltipItem, chartData) {
237
- // format numbers with commas and add unit information
238
- /** @type {?} */
239
- const label = chartData.datasets[tooltipItem.datasetIndex].label || '';
240
- if (label) {
241
- // get unit (eg: MB, GB, MB/s, % and so on)
242
- /** @type {?} */
243
- const rowItem = tableSource.find(controlTableRow => label === controlTableRow.KPI) || '';
244
- /** @type {?} */
245
- const unit = rowItem[Item.unit] && rowItem[Item.unit] !== Unit.PCT ? ` ${rowItem[Item.unit]}` : rowItem[Item.unit] || '';
246
- return `${label}: ${getNumberWithCommas(tooltipItem.yLabel)}${unit}`;
247
- }
248
- else {
249
- return getNumberWithCommas(tooltipItem.yLabel);
250
- }
251
- }
252
- }
253
- },
254
- scales: {
255
- xAxes: ChartService._generateXAxes(time),
256
- yAxes: ChartService._generateYAxes(data, yScale)
257
- },
258
- zoom: {
259
- enabled: true,
260
- drag: true,
261
- mode: 'x',
262
- onZoom: zoomCallback
263
- }
264
- }
265
- };
266
- }
267
- /**
268
- * @private
269
- * @param {?} label
270
- * @param {?} chart
271
- * @return {?}
272
- */
273
- _getDataSetIndexByLabel(label, chart) {
274
- if (chart.data && chart.data.datasets) {
275
- return chart.data.datasets.findIndex(dataset => dataset.label === label);
276
- }
277
- return -1;
278
- }
279
- /**
280
- * destroy the chart, release the resource of the chart
281
- * @private
282
- * @param {?} chart
283
- * @return {?}
284
- */
285
- _destroyChart(chart) {
286
- return new Promise((resolve) => {
287
- if (chart) {
288
- chart.destroy();
289
- }
290
- resolve();
291
- });
292
- }
293
- /**
294
- * update/refresh the chart
295
- * @private
296
- * @param {?} chart
297
- * @return {?}
298
- */
299
- _updateChart(chart) {
300
- return new Promise((resolve, reject) => {
301
- if (chart) {
302
- chart.update();
303
- resolve();
304
- }
305
- else {
306
- reject('Updating chart failed, error: the chart object is empty.');
307
- }
308
- });
309
- }
310
- /**
311
- * reset zoom of the chart
312
- * @private
313
- * @param {?} chart
314
- * @return {?}
315
- */
316
- _resetZoom(chart) {
317
- return new Promise((resolve, reject) => {
318
- if (chart) {
319
- /** @type {?} */
320
- const datasetStatusBeforeReset = [];
321
- if (chart.data && chart.data.datasets) {
322
- chart.data.datasets.forEach((dataset, index) => {
323
- /** @type {?} */
324
- const meta = chart.getDatasetMeta(index);
325
- if (meta) {
326
- datasetStatusBeforeReset[index] = { metaStatus: meta.hidden, datasetStatus: dataset.hidden };
327
- }
328
- else {
329
- reject(`Internal error, can not find the meta ${index}.`);
330
- }
331
- });
332
- }
333
- chart.resetZoom();
334
- resolve(datasetStatusBeforeReset);
335
- }
336
- else {
337
- reject('Resetting chart failed, error: the chart object is empty.');
338
- }
339
- });
340
- }
341
- /**
342
- * Reset Chart to initial status
343
- * If legend is already selected/unselected from the list, it wouldn't be restored.
344
- * @param {?} dataSourceData the data sets of the chart
345
- * @param {?} selection selection status list
346
- * @return {?}
347
- */
348
- resetChart(dataSourceData, selection) {
349
- return this._resetZoom(this._chart).then((datasetStatusBeforeZoom) => {
350
- // reset the data set by the selection status
351
- dataSourceData.filter(row => !row.header).forEach(row => {
352
- /** @type {?} */
353
- const index = this._getDataSetIndexByLabel(row.KPI, this._chart);
354
- if (!selection.isSelected(row)) {
355
- ChartService._toggleDataSet(index, this._chart, true);
356
- }
357
- else {
358
- ChartService._restoreDataSetStatus(this._chart, index, datasetStatusBeforeZoom[index]);
359
- }
360
- });
361
- return this._updateChart(this._chart);
362
- });
363
- }
364
- /**
365
- * destroy the chart and reinitialize the configuration of the chart
366
- * @return {?}
367
- */
368
- destroyChart() {
369
- return this._destroyChart(this._chart).then(() => {
370
- if (this._chart) {
371
- ChartService._initConfig(this._chart);
372
- this._chart = void 0;
373
- }
374
- });
375
- }
376
- /**
377
- * generate configuration for chart and create the chart object.
378
- * @param {?} time
379
- * @param {?} data
380
- * @param {?} yScale
381
- * @param {?} header
382
- * @param {?} headerKey
383
- * @param {?} selection
384
- * @param {?} tableSource
385
- * @param {?} title
386
- * @param {?} defaultItems
387
- * @param {?} zoomCB
388
- * @return {?}
389
- */
390
- buildChart(time, data, yScale, header, headerKey, selection, tableSource, title, defaultItems, zoomCB) {
391
- return new Promise((resolve) => {
392
- /** @type {?} */
393
- const ctx = ((/** @type {?} */ (document.getElementById('chartNameServerHistory')))).getContext('2d');
394
- /** @type {?} */
395
- const cfg = ChartService._generateChartConfig(time, data, yScale, header, headerKey, selection, tableSource, title, defaultItems, zoomCB);
396
- this._chart = new Chart(ctx, cfg);
397
- resolve();
398
- });
399
- }
400
- /**
401
- * show/hide the relative data set
402
- * @param {?} label
403
- * @param {?} hide
404
- * @return {?}
405
- */
406
- toggleDataInChart(label, hide) {
407
- return new Promise((resolve) => {
408
- ChartService._toggleDataSet(this._getDataSetIndexByLabel(label, this._chart), this._chart, hide);
409
- resolve(this._updateChart(this._chart));
410
- });
411
- }
412
- }
413
- ChartService.decorators = [
414
- { type: Injectable }
415
- ];
416
- if (false) {
417
- /**
418
- * @type {?}
419
- * @private
420
- */
421
- ChartService.prototype._chart;
422
- }
423
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1oYW5hLW5hbWVzZXJ2ZXItaGlzdG9yeS12aWV3ZXIvIiwic291cmNlcyI6WyJzcmMvbmFtZXNlcnZlci1oaXN0b3J5LXZpZXdlci9zZXJ2aWNlcy9jaGFydC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakMsT0FBTyxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDNUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQXFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxVQUFVLENBQUM7OztBQUt6RSxNQUFNLE9BQU8sWUFBWTs7Ozs7Ozs7O0lBTWYsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFvQixFQUFFLEtBQVksRUFBRSxNQUFlO1FBQy9FLDBEQUEwRDtRQUMxRCx5REFBeUQ7UUFDekQsd0RBQXdEO1FBQ3hELHVEQUF1RDtRQUN2RCxtRUFBbUU7UUFDbkUseUVBQXlFO1FBQ3pFLElBQUksWUFBWSxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFOztrQkFDbkMsSUFBSSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDO1lBQy9DLElBQUksSUFBSSxFQUFFO2dCQUNSLElBQUksQ0FBQyxNQUFNLEVBQUU7b0JBQ1gsNEVBQTRFO29CQUM1RSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztpQkFDekU7cUJBQU07b0JBQ0wsSUFBSSxD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TSxDQUFDLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OztZQTNVRixVQUFVOzs7Ozs7O0lBRVQsOEJBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XHJcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAncGFwYXBhcnNlJztcclxuaW1wb3J0IHsgQ2hhcnQgfSBmcm9tICdjaGFydC5qcyc7XHJcbmltcG9ydCB7IGdldENvbG9yU3RyaW5nLCBnZXROdW1iZXJXaXRoQ29tbWFzLCByYW5kb21Db2xvciB9IGZyb20gJy4uL3V0aWxzJztcclxuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi91aS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2hhcnRDb250ZW50RGF0YUl0ZW0sIExlZ2VuZENvbG9yLCBJdGVtLCBVbml0IH0gZnJvbSAnLi4vdHlwZXMnO1xyXG5cclxuLy8gVXNpbmcgZHluYW1pYyBmbGFnIHRvIGZpeCB0aGUgaXNzdWUgb2YgbmctcGFja2FnciAjNjk2OiBMYW1iZGEgbm90IHN1cHBvcnRlZFxyXG4vLyBAZHluYW1pY1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDaGFydFNlcnZpY2Uge1xyXG4gIHByaXZhdGUgX2NoYXJ0OiBDaGFydDtcclxuXHJcbiAgLyoqXHJcbiAgICogdG9nZ2xlIHRoZSBkYXRhc2V0IHN0YXR1cyBvZiB0aGUgY2hhcnQsIHN5bmNocm9ub3VzbHlcclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBfdG9nZ2xlRGF0YVNldChkYXRhU2V0SW5kZXg6IG51bWJlciwgY2hhcnQ6IENoYXJ0LCBoaWRkZW46IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIC8vIG1ldGEuaGlkZGVuID0gZmFsc2UgYW5kIGRhdGFzZXQuaGlkZGVuID0gZmFsc2UgLS0+IHNob3dcclxuICAgIC8vIG1ldGEuaGlkZGVuID0gZmFsc2UgYW5kIGRhdGFzZXQuaGlkZGVuID0gdHJ1ZSAtLT4gc2hvd1xyXG4gICAgLy8gbWV0YS5oaWRkZW4gPSBudWxsIGFuZCBkYXRhc2V0LmhpZGRlbiA9IGZhbHNlIC0+IHNob3dcclxuICAgIC8vIG1ldGEuaGlkZGVuID0gbnVsbCBhbmQgZGF0YXNldC5oaWRkZW4gPSB0cnVlIC0+IGhpZGVcclxuICAgIC8vIGluIHRoZSBmaXJzdCBjYXNlIChmYWxzZSwgZmFsc2UpLCBuZWVkcyB0byBjbGljayBsZWdlbmQgdHdpY2UgdG9cclxuICAgIC8vIGhpZGUgdGhlIGRhdGFzZXQsIGJlY2F1c2UgdGhlIGZpcnN0IGNsaWNrIG9ubHkgc2V0IG1ldGEuaGlkZGVuID0gbnVsbClcclxuICAgIGlmIChkYXRhU2V0SW5kZXggIT0gbnVsbCAmJiBjaGFydCAhPSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhU2V0SW5kZXgpO1xyXG4gICAgICBpZiAobWV0YSkge1xyXG4gICAgICAgIGlmICghaGlkZGVuKSB7XHJcbiAgICAgICAgICAvLyBkaXNwbGF5IHRoZSBpdGVtLCBpZiBkYXRhc2V0IGhpZGRlbiBpcyBmYWxzZSwgc2V0IGhpZGRlbiBvZiBtZXRhIHRvIG51bGwsXHJcbiAgICAgICAgICBtZXRhLmhpZGRlbiA9ICFjaGFydC5kYXRhLmRhdGFzZXRzW2RhdGFTZXRJbmRleF0uaGlkZGVuID8gbnVsbCA6IGhpZGRlbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbWV0YS5oaWRkZW4gPSBoaWRkZW47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgc3RhdGljIF9yZXN0b3JlRGF0YVNldFN0YXR1cyhjaGFydDogQ2hhcnQsIGRhdGFzZXRJbmRleDogbnVtYmVyLCBzdGF0dXM6IHttZXRhU3RhdHVzOiBib29sZWFuLCBkYXRhc2V0U3RhdHVzOiBib29sZWFufSk6IHZvaWQge1xyXG4gICAgaWYgKGNoYXJ0ICYmIGNoYXJ0LmRhdGEgJiYgY2hhcnQuZGF0YS5kYXRhc2V0cyAmJiBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpICYmIHN0YXR1cykge1xyXG4gICAgICBjaGFydC5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF0uaGlkZGVuID0gc3RhdHVzLmRhdGFzZXRTdGF0dXM7XHJcbiAgICAgIGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCkuaGlkZGVuID0gc3RhdHVzLm1ldGFTdGF0dXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBpbml0aWFsaXplL2NsZWFyIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgY2hhcnRcclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBfaW5pdENvbmZpZyhjaGFydDogYW55KTogdm9pZCB7XHJcbiAgICAvLyBpbml0IGRhdGEgc2V0c1xyXG4gICAgaWYgKGNoYXJ0LmRhdGEgJiYgY2hhcnQuZGF0YS5kYXRhc2V0cykge1xyXG4gICAgICBjaGFydC5kYXRhLmRhdGFzZXRzLmxlbmd0aCA9IDA7XHJcbiAgICAgIGNoYXJ0LmRhdGEuZGF0YXNldHMgPSB2b2lkIDA7XHJcbiAgICAgIGNoYXJ0LmRhdGEgPSB2b2lkIDA7XHJcbiAgICB9XHJcbiAgICAvLyBpbml0IG9wdGlvbnNcclxuICAgIGlmIChjaGFydC5vcHRpb25zICYmIGNoYXJ0Lm9wdGlvbnMuc2NhbGVzICYmIChjaGFydC5vcHRpb25zLnNjYWxlcy54QXhlcyB8fCBjaGFydC5vcHRpb25zLnNjYWxlcy55QXhpcykpIHtcclxuICAgICAgaWYgKGNoYXJ0Lm9wdGlvbnMuc2NhbGVzLnhBeGVzKSB7XHJcbiAgICAgICAgY2hhcnQub3B0aW9ucy5zY2FsZXMueEF4ZXMubGVuZ3RoID0gMDtcclxuICAgICAgICBjaGFydC5vcHRpb25zLnNjYWxlcy54QXhlcyA9IHZvaWQgMDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY2hhcnQub3B0aW9ucy5zY2FsZXMueUF4ZXMpIHtcclxuICAgICAgICBjaGFydC5vcHRpb25zLnNjYWxlcy55QXhlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgIGNoYXJ0Lm9wdGlvbnMuc2NhbGVzLnlBeGVzID0gdm9pZCAwO1xyXG4gICAgICB9XHJcbiAgICAgIGNoYXJ0Lm9wdGlvbnMuc2NhbGVzID0gdm9pZCAwO1xyXG4gICAgICBjaGFydC5vcHRpb25zID0gdm9pZCAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgRGF0YVNldHMgYnkgdGhlIGRhdGEgYW5kIGhlYWRlciBpbmZvcm1hdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIF9nZW5lcmF0ZURhdGFTZXRzKGRhdGE6IENoYXJ0Q29udGVudERhdGFJdGVtW11bXSwgaGVhZGVyOiBzdHJpbmdbXSwgaGVhZGVyS2V5OiBzdHJpbmdbXSwgZGVmYXVsdEl0ZW1zOiBzdHJpbmdbXSk6IGFueSB7XHJcbiAgICBjb25zdCBhbHBoYSA9IDAuNTtcclxuICAgIGNvbnN0IGNvbG9yczogTGVnZW5kQ29sb3IgPSBVSVNlcnZpY2UuZ2V0Q29sb3JzKGFscGhhKTtcclxuICAgIHJldHVybiBkYXRhLm1hcCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICBjb25zdCBjb2xvciA9IGNvbG9yc1toZWFkZXJLZXlbaV1dID8gZ2V0Q29sb3JTdHJpbmcoY29sb3JzW2hlYWRlcktleVtpXV0pIDogcmFuZG9tQ29sb3IoYWxwaGEpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGJvcmRlckNvbG9yOiBjb2xvcixcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yLFxyXG4gICAgICAgIGJvcmRlcldpZHRoOiAxLjI1LFxyXG4gICAgICAgIHNwYW5HYXBzOiBmYWxzZSxcclxuICAgICAgICBsYWJlbDogaGVhZGVyW2ldLFxyXG4gICAgICAgIGRhdGE6IGRhdGFbaV0sXHJcbiAgICAgICAgZmlsbDogZmFsc2UsXHJcbiAgICAgICAgeUF4aXNJRDogYHktYXhpcy0ke2l9YCxcclxuICAgICAgICBoaWRkZW46ICFkZWZhdWx0SXRlbXMuaW5jbHVkZXMoaGVhZGVyW2ldKVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgc3RhdGljIF9nZW5lcmF0ZVhBeGVzKHRpbWU6IG51bWJlcltdKTogYW55IHtcclxuICAgIGNvbnN0IGZvcm1hdCA9ICdNTU1ERCBISDptbTpzcyc7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7XHJcbiAgICAgICAgdHlwZTogJ3RpbWUnLFxyXG4gICAgICAgIHRpbWU6IHtcclxuICAgICAgICAgIC8vIHVuaXQ6ICdzZWNvbmQnLFxyXG4gICAgICAgICAgLy8gc3RlcFNpemU6IDEsXHJcbiAgICAgICAgICBkaXNwbGF5Rm9ybWF0czoge1xyXG4gICAgICAgICAgICAnbWlsbGlzZWNvbmQnOiBmb3JtYXQsXHJcbiAgICAgICAgICAgICdzZWNvbmQnOiBmb3JtYXQsXHJcbiAgICAgICAgICAgICdtaW51dGUnOiBmb3JtYXQsXHJcbiAgICAgICAgICAgICdob3VyJzogJ01NTUREIEhIJyxcclxuICAgICAgICAgICAgJ2RheSc6ICdNTU1ERCBZWVlZJyxcclxuICAgICAgICAgICAgJ3dlZWsnOiBmb3JtYXQsXHJcbiAgICAgICAgICAgICdtb250aCc6IGZvcm1hdCxcclxuICAgICAgICAgICAgJ3F1YXJ0ZXInOiBmb3JtYXQsXHJcbiAgICAgICAgICAgICd5ZWFyJzogZm9ybWF0LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHRvb2x0aXBGb3JtYXQ6ICdsbCBISDptbTpzcycsXHJcbiAgICAgICAgICBtaW46IHRpbWVbMF0sXHJcbiAgICAgICAgICBtYXg6IHRpbWVbdGltZS5sZW5ndGggLSAxXVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8gc2NhbGVMYWJlbDoge1xyXG4gICAgICAgIC8vICAgZGlzcGxheTogZmFsc2UsXHJcbiAgICAgICAgLy8gICBsYWJlbFN0cmluZzogJ0RhdGUnXHJcbiAgICAgICAgLy8gfSxcclxuICAgICAgICB0aWNrczoge1xyXG4gICAgICAgICAgbWF4Um90YXRpb246IDAsXHJcbiAgICAgICAgICByZXZlcnNlOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBdO1xyXG4gIH1cclxuICBwcml2YXRlIHN0YXRpYyBfZ2VuZXJhdGVZQXhlcyhkYXRhOiBDaGFydENvbnRlbnREYXRhSXRlbVtdW10sIHlTY2FsZTogbnVtYmVyW10pOiBhbnkge1xyXG4gICAgcmV0dXJuIGRhdGEubWFwKChpdGVtLCBpKSA9PiAoe1xyXG4gICAgICB0eXBlOiAnbGluZWFyJyxcclxuICAgICAgZGlzcGxheTogZmFsc2UsXHJcbiAgICAgIHBvc2l0aW9uOiAnbGVmdCcsXHJcbiAgICAgIGlkOiBgeS1heGlzLSR7aX1gLFxyXG4gICAgICBncmlkTGluZXM6IHtcclxuICAgICAgfSxcclxuICAgICAgdGlja3M6IHtcclxuICAgICAgICBtaW46IDAsXHJcbiAgICAgICAgbWF4OiB5U2NhbGVbaV1cclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZ2VuZXJhdGUgY29uZmlndXJhdGlvbiBmb3IgY2hhcnRcclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBfZ2VuZXJhdGVDaGFydENvbmZpZyh0aW1lOiBudW1iZXJbXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBDaGFydENvbnRlbnREYXRhSXRlbVtdW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVNjYWxlOiBudW1iZXJbXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IHN0cmluZ1tdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcktleTogc3RyaW5nW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBTZWxlY3Rpb25Nb2RlbDxhbnk+LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlU291cmNlOiBhbnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SXRlbXM6IHN0cmluZ1tdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb21DYWxsYmFjazogYW55KTogYW55IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHR5cGU6ICdsaW5lJyxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIGRhdGFzZXRzOiBDaGFydFNlcnZpY2UuX2dlbmVyYXRlRGF0YVNldHMoZGF0YSwgaGVhZGVyLCBoZWFkZXJLZXksIGRlZmF1bHRJdGVtcylcclxuICAgICAgfSxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGVsZW1lbnRzOiB7cG9pbnQ6IHtyYWRpdXM6IDAsIGhpdFJhZGl1czogNSwgaG92ZXJSYWRpdXM6IDV9fSwgLy8gc2V0IHJhZGl1cyB0byAwIG5vdCB0byBkaXNwbGF5IHBvaW50XHJcbiAgICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcclxuICAgICAgICBhbmltYXRpb246IHtcclxuICAgICAgICAgIGR1cmF0aW9uOiAwLCAvLyBnZW5lcmFsIGFuaW1hdGlvbiB0aW1lXHJcbiAgICAgICAgfSxcclxuICAgICAgICBob3Zlcjoge1xyXG4gICAgICAgICAgYW5pbWF0aW9uRHVyYXRpb246IDAsIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbnMgd2hlbiBob3ZlcmluZyBhbiBpdGVtXHJcbiAgICAgICAgICBvbkhvdmVyOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHRoaXMuZ2V0RWxlbWVudEF0RXZlbnQoZSk7XHJcbiAgICAgICAgICAgIGlmIChwb2ludC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICBlLnRhcmdldC5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZS50YXJnZXQuc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICByZXNwb25zaXZlQW5pbWF0aW9uRHVyYXRpb246IDAsIC8vIGFuaW1hdGlvbiBkdXJhdGlvbiBhZnRlciBhIHJlc2l6ZVxyXG4gICAgICAgIGxlZ2VuZDoge1xyXG4gICAgICAgICAgcG9zaXRpb246ICdib3R0b20nLFxyXG4gICAgICAgICAgb25Ib3ZlcjogKGUpID0+IHtcclxuICAgICAgICAgICAgZS50YXJnZXQuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGxhYmVsczoge1xyXG4gICAgICAgICAgICBmaWx0ZXI6IChsZWdlbmRJdGVtKSA9PiBzZWxlY3Rpb24uaXNTZWxlY3RlZCh0YWJsZVNvdXJjZS5maW5kKHJvdyA9PiBsZWdlbmRJdGVtLnRleHQgPT09IHJvdy5LUEkpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdGl0bGU6IHtcclxuICAgICAgICAgIGRpc3BsYXk6IHRydWUsXHJcbiAgICAgICAgICB0ZXh0OiB0aXRsZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzcG9uc2l2ZURvd25zYW1wbGU6IHtcclxuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICBkZXNpcmVkRGF0YVBvaW50RGlzdGFuY2U6IDIsXHJcbiAgICAgICAgICBtaW5OdW1Qb2ludHM6IDIwMCxcclxuICAgICAgICAgIG1heE51bVBvaW50c1RvRHJhdzogMTAwXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0b29sdGlwczoge1xyXG4gICAgICAgICAgY2FsbGJhY2tzOiB7XHJcbiAgICAgICAgICAgIGxhYmVsOiBmdW5jdGlvbih0b29sdGlwSXRlbSwgY2hhcnREYXRhKSB7XHJcbiAgICAgICAgICAgICAgLy8gZm9ybWF0IG51bWJlcnMgd2l0aCBjb21tYXMgYW5kIGFkZCB1bml0IGluZm9ybWF0aW9uXHJcbiAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBjaGFydERhdGEuZGF0YXNldHNbdG9vbHRpcEl0ZW0uZGF0YXNldEluZGV4XS5sYWJlbCB8fCAnJztcclxuICAgICAgICAgICAgICBpZiAobGFiZWwpIHtcclxuICAgICAgICAgICAgICAgIC8vIGdldCB1bml0IChlZzogTUIsIEdCLCBNQi9zLCAlIGFuZCBzbyBvbilcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0l0ZW0gPSB0YWJsZVNvdXJjZS5maW5kKGNvbnRyb2xUYWJsZVJvdyA9PiBsYWJlbCA9PT0gY29udHJvbFRhYmxlUm93LktQSSkgfHwgJyc7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1bml0ID0gcm93SXRlbVtJdGVtLnVuaXRdICYmIHJvd0l0ZW1bSXRlbS51bml0XSAhPT0gVW5pdC5QQ1QgPyBgICR7cm93SXRlbVtJdGVtLnVuaXRdfWAgOiByb3dJdGVtW0l0ZW0udW5pdF0gfHwgJyc7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7bGFiZWx9OiAke2dldE51bWJlcldpdGhDb21tYXModG9vbHRpcEl0ZW0ueUxhYmVsKX0ke3VuaXR9YDtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldE51bWJlcldpdGhDb21tYXModG9vbHRpcEl0ZW0ueUxhYmVsKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHNjYWxlczoge1xyXG4gICAgICAgICAgeEF4ZXM6IENoYXJ0U2VydmljZS5fZ2VuZXJhdGVYQXhlcyh0aW1lKSxcclxuICAgICAgICAgIHlBeGVzOiBDaGFydFNlcnZpY2UuX2dlbmVyYXRlWUF4ZXMoZGF0YSwgeVNjYWxlKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgem9vbToge1xyXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgIGRyYWc6IHRydWUsXHJcbiAgICAgICAgICBtb2RlOiAneCcsXHJcbiAgICAgICAgICBvblpvb206IHpvb21DYWxsYmFja1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldERhdGFTZXRJbmRleEJ5TGFiZWwobGFiZWw6IHN0cmluZywgY2hhcnQ6IENoYXJ0KTogbnVtYmVyIHtcclxuICAgIGlmIChjaGFydC5kYXRhICYmIGNoYXJ0LmRhdGEuZGF0YXNldHMpIHtcclxuICAgICAgcmV0dXJuIGNoYXJ0LmRhdGEuZGF0YXNldHMuZmluZEluZGV4KGRhdGFzZXQgPT4gZGF0YXNldC5sYWJlbCA9PT0gbGFiZWwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZGVzdHJveSB0aGUgY2hhcnQsIHJlbGVhc2UgdGhlIHJlc291cmNlIG9mIHRoZSBjaGFydFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2Rlc3Ryb3lDaGFydChjaGFydDogQ2hhcnQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGlmIChjaGFydCkge1xyXG4gICAgICAgIGNoYXJ0LmRlc3Ryb3koKTtcclxuICAgICAgfVxyXG4gICAgICByZXNvbHZlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogdXBkYXRlL3JlZnJlc2ggdGhlIGNoYXJ0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfdXBkYXRlQ2hhcnQoY2hhcnQ6IENoYXJ0KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmIChjaGFydCkge1xyXG4gICAgICAgIGNoYXJ0LnVwZGF0ZSgpO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZWplY3QoJ1VwZGF0aW5nIGNoYXJ0IGZhaWxlZCwgZXJyb3I6IHRoZSBjaGFydCBvYmplY3QgaXMgZW1wdHkuJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogcmVzZXQgem9vbSBvZiB0aGUgY2hhcnRcclxuICAgKi9cclxuICBwcml2YXRlIF9yZXNldFpvb20oY2hhcnQ6IGFueSk6IFByb21pc2U8e21ldGFTdGF0dXM6IGJvb2xlYW4sIGRhdGFzZXRTdGF0dXM6IGJvb2xlYW59W10+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmIChjaGFydCkge1xyXG4gICAgICAgIGNvbnN0IGRhdGFzZXRTdGF0dXNCZWZvcmVSZXNldCA9IFtdO1xyXG4gICAgICAgIGlmIChjaGFydC5kYXRhICYmIGNoYXJ0LmRhdGEuZGF0YXNldHMpIHtcclxuICAgICAgICAgIGNoYXJ0LmRhdGEuZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGluZGV4KTtcclxuICAgICAgICAgICAgaWYgKG1ldGEpIHtcclxuICAgICAgICAgICAgICBkYXRhc2V0U3RhdHVzQmVmb3JlUmVzZXRbaW5kZXhdID0ge21ldGFTdGF0dXM6IG1ldGEuaGlkZGVuLCBkYXRhc2V0U3RhdHVzOiBkYXRhc2V0LmhpZGRlbn07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KGBJbnRlcm5hbCBlcnJvciwgY2FuIG5vdCBmaW5kIHRoZSBtZXRhICR7aW5kZXh9LmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2hhcnQucmVzZXRab29tKCk7XHJcbiAgICAgICAgcmVzb2x2ZShkYXRhc2V0U3RhdHVzQmVmb3JlUmVzZXQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlamVjdCgnUmVzZXR0aW5nIGNoYXJ0IGZhaWxlZCwgZXJyb3I6IHRoZSBjaGFydCBvYmplY3QgaXMgZW1wdHkuJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXNldCBDaGFydCB0byBpbml0aWFsIHN0YXR1c1xyXG4gICAqIElmIGxlZ2VuZCBpcyBhbHJlYWR5IHNlbGVjdGVkL3Vuc2VsZWN0ZWQgZnJvbSB0aGUgbGlzdCwgaXQgd291bGRuJ3QgYmUgcmVzdG9yZWQuXHJcbiAgICogQHBhcmFtIGRhdGFTb3VyY2VEYXRhIHRoZSBkYXRhIHNldHMgb2YgdGhlIGNoYXJ0XHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbiBzZWxlY3Rpb24gc3RhdHVzIGxpc3RcclxuICAgKi9cclxuICBwdWJsaWMgcmVzZXRDaGFydChkYXRhU291cmNlRGF0YTogYW55LCBzZWxlY3Rpb246IFNlbGVjdGlvbk1vZGVsPGFueT4pOiBQcm9taXNlIDxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9yZXNldFpvb20odGhpcy5fY2hhcnQpLnRoZW4oKGRhdGFzZXRTdGF0dXNCZWZvcmVab29tKSA9PiB7XHJcbiAgICAgIC8vIHJlc2V0IHRoZSBkYXRhIHNldCBieSB0aGUgc2VsZWN0aW9uIHN0YXR1c1xyXG4gICAgICBkYXRhU291cmNlRGF0YS5maWx0ZXIocm93ID0+ICFyb3cuaGVhZGVyKS5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9nZXREYXRhU2V0SW5kZXhCeUxhYmVsKHJvdy5LUEksIHRoaXMuX2NoYXJ0KTtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdykpIHtcclxuICAgICAgICAgIENoYXJ0U2VydmljZS5fdG9nZ2xlRGF0YVNldChpbmRleCwgdGhpcy5fY2hhcnQsIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBDaGFydFNlcnZpY2UuX3Jlc3RvcmVEYXRhU2V0U3RhdHVzKHRoaXMuX2NoYXJ0LCBpbmRleCwgZGF0YXNldFN0YXR1c0JlZm9yZVpvb21baW5kZXhdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdGhpcy5fdXBkYXRlQ2hhcnQodGhpcy5fY2hhcnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBkZXN0cm95IHRoZSBjaGFydCBhbmQgcmVpbml0aWFsaXplIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjaGFydFxyXG4gICAqL1xyXG4gIHB1YmxpYyBkZXN0cm95Q2hhcnQoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9kZXN0cm95Q2hhcnQodGhpcy5fY2hhcnQpLnRoZW4oKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5fY2hhcnQpIHtcclxuICAgICAgICBDaGFydFNlcnZpY2UuX2luaXRDb25maWcodGhpcy5fY2hhcnQpO1xyXG4gICAgICAgIHRoaXMuX2NoYXJ0ID0gdm9pZCAwO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGdlbmVyYXRlIGNvbmZpZ3VyYXRpb24gZm9yIGNoYXJ0IGFuZCBjcmVhdGUgdGhlIGNoYXJ0IG9iamVjdC5cclxuICAgKi9cclxuICBwdWJsaWMgYnVpbGRDaGFydCh0aW1lOiBudW1iZXJbXSxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBDaGFydENvbnRlbnREYXRhSXRlbVtdW10sXHJcbiAgICAgICAgICAgICAgICAgICAgeVNjYWxlOiBudW1iZXJbXSxcclxuICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IHN0cmluZ1tdLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcktleTogc3RyaW5nW10sXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBTZWxlY3Rpb25Nb2RlbDxhbnk+LFxyXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlU291cmNlOiBhbnksXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SXRlbXM6IHN0cmluZ1tdLFxyXG4gICAgICAgICAgICAgICAgICAgIHpvb21DQik6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgY29uc3QgY3R4ID0gKDxIVE1MQ2FudmFzRWxlbWVudD4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJ0TmFtZVNlcnZlckhpc3RvcnknKSkuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgY29uc3QgY2ZnOiBhbnkgPSBDaGFydFNlcnZpY2UuX2dlbmVyYXRlQ2hhcnRDb25maWcodGltZSwgZGF0YSwgeVNjYWxlLCBoZWFkZXIsIGhlYWRlcktleSwgc2VsZWN0aW9uLCB0YWJsZVNvdXJjZSwgdGl0bGUsIGRlZmF1bHRJdGVtcywgem9vbUNCKTtcclxuICAgICAgdGhpcy5fY2hhcnQgPSBuZXcgQ2hhcnQoY3R4LCBjZmcpO1xyXG4gICAgICByZXNvbHZlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHNob3cvaGlkZSB0aGUgcmVsYXRpdmUgZGF0YSBzZXRcclxuICAgKi9cclxuICBwdWJsaWMgdG9nZ2xlRGF0YUluQ2hhcnQobGFiZWw6IHN0cmluZywgaGlkZTogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgQ2hhcnRTZXJ2aWNlLl90b2dnbGVEYXRhU2V0KHRoaXMuX2dldERhdGFTZXRJbmRleEJ5TGFiZWwobGFiZWwsIHRoaXMuX2NoYXJ0KSwgdGhpcy5fY2hhcnQsIGhpZGUpO1xyXG4gICAgICByZXNvbHZlKHRoaXMuX3VwZGF0ZUNoYXJ0KHRoaXMuX2NoYXJ0KSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19