ngx-hana-nameserver-history-viewer 1.1.1 → 1.1.9-1.beta

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 +37 -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,566 +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 { calculateValue, getDefaultPort, getPort, getTimeFromTimeZone, isSamePort, isValidPort, printProcessedTime, validateData } from '../utils';
7
- import { parse } from 'papaparse';
8
- import { Abort } from '../types';
9
- /**
10
- * prevent browser from crashing, set the max rows limitation.
11
- * This could be overwritten by the input:maxRowsLimitation of the component.
12
- * @type {?}
13
- */
14
- var _DEFAULT_MAX_ROWS_IN_MEMORY = 100000;
15
- var FileService = /** @class */ (function () {
16
- function FileService() {
17
- }
18
- /**
19
- * prevent browser from crashing, set the max rows limitation.
20
- * @param limitation if this parameter is not null, the default value will be overwritten by this one.
21
- */
22
- /**
23
- * prevent browser from crashing, set the max rows limitation.
24
- * @private
25
- * @param {?=} limitation if this parameter is not null, the default value will be overwritten by this one.
26
- * @return {?}
27
- */
28
- FileService._getMaxRowsLimitation = /**
29
- * prevent browser from crashing, set the max rows limitation.
30
- * @private
31
- * @param {?=} limitation if this parameter is not null, the default value will be overwritten by this one.
32
- * @return {?}
33
- */
34
- function (limitation) {
35
- if (limitation === void 0) { limitation = null; }
36
- if (limitation == null || isNaN(limitation) || limitation.length === 0) {
37
- return _DEFAULT_MAX_ROWS_IN_MEMORY;
38
- }
39
- return Number(limitation);
40
- };
41
- /**
42
- * get all available ports from data
43
- */
44
- /**
45
- * get all available ports from data
46
- * @private
47
- * @param {?} data
48
- * @param {?} firstChunk
49
- * @param {?} ports
50
- * @return {?}
51
- */
52
- FileService._getPorts = /**
53
- * get all available ports from data
54
- * @private
55
- * @param {?} data
56
- * @param {?} firstChunk
57
- * @param {?} ports
58
- * @return {?}
59
- */
60
- function (data, firstChunk, ports) {
61
- /** @type {?} */
62
- var line = 0;
63
- if (firstChunk) {
64
- // start from line 3
65
- line = 2;
66
- }
67
- for (; line < data.length; line++) {
68
- /** @type {?} */
69
- var dataItem = data[line][1];
70
- if (dataItem != null && dataItem.length > 0) {
71
- if (isValidPort(dataItem) && ports.indexOf(dataItem) === -1) {
72
- ports.push(dataItem);
73
- }
74
- }
75
- }
76
- };
77
- /**
78
- * get the time column from the analyzed data
79
- * @param data the analyzed data
80
- * @param firstChunk whether it's first chunk or not
81
- * @param startTime selected starting time. It's millisecond, need to be converted second.
82
- * @param endTime selected ending time. It's millisecond, need to be converted second.
83
- * @param lastProcessedTime last processed time form last chunk
84
- * @param time time object which contains the time data for all ports
85
- * @param selectedPort if the selected port is empty (did not select any port), all ports info are needed
86
- * @param isMDC flag for MDC system
87
- * @param maxRowsLimitation prevent browser from crashing, set the max rows limitation.
88
- * This comes from the input: maxRowsLimitation of the component.
89
- */
90
- /**
91
- * get the time column from the analyzed data
92
- * @private
93
- * @param {?} data the analyzed data
94
- * @param {?} firstChunk whether it's first chunk or not
95
- * @param {?} startTime selected starting time. It's millisecond, need to be converted second.
96
- * @param {?} endTime selected ending time. It's millisecond, need to be converted second.
97
- * @param {?} lastProcessedTime last processed time form last chunk
98
- * @param {?} time time object which contains the time data for all ports
99
- * @param {?} selectedPort if the selected port is empty (did not select any port), all ports info are needed
100
- * @param {?} isMDC flag for MDC system
101
- * @param {?} maxRowsLimitation prevent browser from crashing, set the max rows limitation.
102
- * This comes from the input: maxRowsLimitation of the component.
103
- * @return {?}
104
- */
105
- FileService._getTimeColumn = /**
106
- * get the time column from the analyzed data
107
- * @private
108
- * @param {?} data the analyzed data
109
- * @param {?} firstChunk whether it's first chunk or not
110
- * @param {?} startTime selected starting time. It's millisecond, need to be converted second.
111
- * @param {?} endTime selected ending time. It's millisecond, need to be converted second.
112
- * @param {?} lastProcessedTime last processed time form last chunk
113
- * @param {?} time time object which contains the time data for all ports
114
- * @param {?} selectedPort if the selected port is empty (did not select any port), all ports info are needed
115
- * @param {?} isMDC flag for MDC system
116
- * @param {?} maxRowsLimitation prevent browser from crashing, set the max rows limitation.
117
- * This comes from the input: maxRowsLimitation of the component.
118
- * @return {?}
119
- */
120
- function (data, firstChunk, startTime, endTime, lastProcessedTime, time, selectedPort, isMDC, maxRowsLimitation) {
121
- // convert millisecond to second for startTime and endTime.
122
- startTime = startTime / 1000;
123
- endTime = endTime / 1000;
124
- /** @type {?} */
125
- var timeColumn = 2;
126
- /** @type {?} */
127
- var startLine = 0;
128
- /** @type {?} */
129
- var iStart = -1;
130
- /** @type {?} */
131
- var iEnd = -1;
132
- /** @type {?} */
133
- var curTime = lastProcessedTime;
134
- /** @type {?} */
135
- var lastProcessedTimeReturn;
136
- /** @type {?} */
137
- var totalNum = 0;
138
- /** @type {?} */
139
- var mdcFlag = isMDC;
140
- /** @type {?} */
141
- var defaultPort = getDefaultPort();
142
- /** @type {?} */
143
- var maxRowNum = this._getMaxRowsLimitation(maxRowsLimitation);
144
- if (firstChunk) {
145
- if (curTime >= startTime && curTime <= endTime) {
146
- iStart = 1; // start from first line
147
- // start from first line
148
- // get port for the line 1.
149
- /**
150
- * Modified at 2018/10/10,
151
- * in some case, eg: the nameserver history trace gets modified by Kook, Jin Young's python script,
152
- * the port show in the first line as well, and does not like the non-mdc system, this kind of file has
153
- * one port in it. The history for non-mdc system doesn't have port info in the port column.
154
- * @type {?}
155
- */
156
- var firstLinePort = getPort(data[1][1]);
157
- // init time array for the first line.
158
- if (!selectedPort || selectedPort.length === 0 || isSamePort(firstLinePort, selectedPort, mdcFlag)) {
159
- // does not select any port or
160
- // it's non-mdc (mdcFlag is false at the beginning) system and the selected port is the first line port
161
- time[firstLinePort] = [];
162
- time[firstLinePort][0] = curTime * 1000;
163
- }
164
- }
165
- lastProcessedTimeReturn = curTime;
166
- startLine = 2;
167
- }
168
- // get current total number
169
- Object.keys(time).forEach(function (key) {
170
- if (time[key]) {
171
- totalNum += time[key].length;
172
- }
173
- });
174
- if (curTime == null) {
175
- console.error('getTimeColumn', 'Can not get the time from the file, internal error!');
176
- return { indexStart: null, indexEnd: null, lastProcessedTime: null, isMDC: null };
177
- }
178
- for (var i = startLine; i < data.length; i++) {
179
- // sometime the last line is empty, need to be skipped.
180
- if (data[i] == null || data[i].length === 0 || (data[i].length === 1 && data[i][0].length === 0)) {
181
- continue;
182
- }
183
- // get port number and initialize the relative port array in time
184
- /** @type {?} */
185
- var port = getPort(data[i][1]);
186
- if (!(port in time)) {
187
- // add undefined port to time, then we can find all ports in time
188
- time[port] = void 0;
189
- }
190
- if (time[port] == null && isSamePort(port, selectedPort, mdcFlag)) {
191
- time[port] = [];
192
- // if other ports exists in this file, default port will be set to undefined.
193
- if (!mdcFlag && port !== defaultPort && time[defaultPort]) {
194
- // update the total num;
195
- totalNum -= time[defaultPort].length;
196
- time[defaultPort].length = 0;
197
- time[defaultPort] = void 0;
198
- mdcFlag = true;
199
- }
200
- }
201
- curTime = calculateValue(curTime, data[i][timeColumn]);
202
- if (curTime > endTime) {
203
- if (iEnd < 0) {
204
- iEnd = i - 1;
205
- }
206
- break;
207
- }
208
- if (iStart >= 0) {
209
- if (time[port]) {
210
- // not null means it's the selected port
211
- time[port][time[port].length] = curTime * 1000;
212
- totalNum++;
213
- }
214
- }
215
- else {
216
- if (curTime >= startTime && curTime <= endTime) {
217
- if (time[port]) {
218
- // only selected port counted in
219
- if (iStart < 0) {
220
- iStart = i;
221
- }
222
- time[port][time[port].length] = curTime * 1000;
223
- totalNum++;
224
- }
225
- }
226
- }
227
- // last processed time need to be recorded anyway
228
- lastProcessedTimeReturn = curTime;
229
- if (totalNum >= maxRowNum) {
230
- iEnd = i;
231
- break;
232
- }
233
- }
234
- return { indexStart: iStart, indexEnd: iEnd, lastProcessedTime: lastProcessedTimeReturn, isMDC: mdcFlag };
235
- };
236
- /**
237
- * Get data for all columns
238
- * @param columnNum the total number of columns. For mdc system,
239
- * the length of each row is different. Host relative data does not exist in tenant line.
240
- * Needs to use column number from the first line.
241
- * @param data data parsed by papa
242
- * @param firstChunk the flag which identifies whether it's the first chunk or not.
243
- * @param time
244
- * @param indexStart
245
- * @param indexEnd
246
- * @param lastProcessedLine
247
- * @param resultData the result data after analyzed
248
- * @param selectedPort
249
- * @param isMDC
250
- */
251
- /**
252
- * Get data for all columns
253
- * @private
254
- * @param {?} columnNum the total number of columns. For mdc system,
255
- * the length of each row is different. Host relative data does not exist in tenant line.
256
- * Needs to use column number from the first line.
257
- * @param {?} data data parsed by papa
258
- * @param {?} firstChunk the flag which identifies whether it's the first chunk or not.
259
- * @param {?} time
260
- * @param {?} indexStart
261
- * @param {?} indexEnd
262
- * @param {?} lastProcessedLine
263
- * @param {?} resultData the result data after analyzed
264
- * @param {?} selectedPort
265
- * @param {?} isMDC
266
- * @return {?}
267
- */
268
- FileService._getDataColumns = /**
269
- * Get data for all columns
270
- * @private
271
- * @param {?} columnNum the total number of columns. For mdc system,
272
- * the length of each row is different. Host relative data does not exist in tenant line.
273
- * Needs to use column number from the first line.
274
- * @param {?} data data parsed by papa
275
- * @param {?} firstChunk the flag which identifies whether it's the first chunk or not.
276
- * @param {?} time
277
- * @param {?} indexStart
278
- * @param {?} indexEnd
279
- * @param {?} lastProcessedLine
280
- * @param {?} resultData the result data after analyzed
281
- * @param {?} selectedPort
282
- * @param {?} isMDC
283
- * @return {?}
284
- */
285
- function (columnNum, data, firstChunk, time, indexStart, indexEnd, lastProcessedLine, resultData, selectedPort, isMDC) {
286
- /** @type {?} */
287
- var startLine = 0;
288
- // for mdc system, the length is not correct (host relative data only exists in the "empty" port line).
289
- // Needs to use header from the first line.
290
- // const columnNum = data[0].length;
291
- if (firstChunk) {
292
- // get port for the line 1.
293
- /**
294
- * Modified at 2018/10/10,
295
- * in some case, eg: the nameserver history trace gets modified by Kook, Jin Young's python script,
296
- * the port show in the first line as well, and does not like the non-mdc system, this kind of file has
297
- * one port in it. The history for non-mdc system doesn't have port info in the port column.
298
- * @type {?}
299
- */
300
- var firstLinePort = getPort(data[1][1]);
301
- // Initialize data column with default 'DEFAULT' port if it's not MDC system. MDC system, 'DEFAULT' gets ignored
302
- if (!isMDC && time[firstLinePort]) {
303
- resultData[firstLinePort] = [];
304
- // removed below logic, because first line is the real number, do not need to do the convert.
305
- // curLine = data[1].slice(3).map(Number);
306
- for (var j = 3; j < columnNum; j++) {
307
- /** @type {?} */
308
- var index = j - 3;
309
- // initialize data array for all columns of the default '0000' port
310
- resultData[firstLinePort][index] = [];
311
- // get the first line data of the column if it's included
312
- if (indexStart === 1) {
313
- resultData[firstLinePort][index][0] = { x: time[firstLinePort][0], y: lastProcessedLine[index] };
314
- }
315
- }
316
- }
317
- startLine = 2;
318
- }
319
- for (var j = 3; j < columnNum; j++) {
320
- /** @type {?} */
321
- var index = j - 3;
322
- for (var i = startLine; i < data.length; i++) {
323
- // sometime the last line is empty, need to be skipped.
324
- if (data[i] == null || data[i].length === 0 || (data[i].length === 1 && data[i][0].length === 0)) {
325
- continue;
326
- }
327
- // get port number and initialize the relative port array in data
328
- /** @type {?} */
329
- var port = getPort(data[i][1]);
330
- if (resultData[port] == null && isSamePort(port, selectedPort, isMDC)) {
331
- resultData[port] = [];
332
- }
333
- if (resultData[port] && resultData[port][index] == null) {
334
- resultData[port][index] = [];
335
- }
336
- lastProcessedLine[index] = calculateValue(lastProcessedLine[index], data[i][j]);
337
- if (i >= indexStart && (i <= indexEnd || indexEnd < 0) && indexStart >= 0) {
338
- if (resultData[port]) {
339
- /** @type {?} */
340
- var length_1 = resultData[port][index].length;
341
- resultData[port][index][length_1] = { x: time[port][length_1], y: lastProcessedLine[index] };
342
- }
343
- }
344
- else if (indexEnd > 0 && i > indexEnd) {
345
- break;
346
- }
347
- }
348
- }
349
- };
350
- /**
351
- * Get Chart data from provided file.
352
- * @param file the nameserver history file
353
- * @param startTime
354
- * @param endTime
355
- * @param port
356
- * @param timezone
357
- * @param maxRowsLimitation prevent browser from crashing, set the max rows limitation.
358
- * @param progress call back function for updating progress
359
- */
360
- /**
361
- * Get Chart data from provided file.
362
- * @param {?} file the nameserver history file
363
- * @param {?} startTime
364
- * @param {?} endTime
365
- * @param {?} port
366
- * @param {?} timezone
367
- * @param {?} maxRowsLimitation prevent browser from crashing, set the max rows limitation.
368
- * @param {?} progress call back function for updating progress
369
- * @return {?}
370
- */
371
- FileService.prototype.getChartContentFromFile = /**
372
- * Get Chart data from provided file.
373
- * @param {?} file the nameserver history file
374
- * @param {?} startTime
375
- * @param {?} endTime
376
- * @param {?} port
377
- * @param {?} timezone
378
- * @param {?} maxRowsLimitation prevent browser from crashing, set the max rows limitation.
379
- * @param {?} progress call back function for updating progress
380
- * @return {?}
381
- */
382
- function (file, startTime, endTime, port, timezone, maxRowsLimitation, progress) {
383
- // load done, beginning parsing
384
- /** @type {?} */
385
- var beginTime = new Date();
386
- /** @type {?} */
387
- var firstChunk = true;
388
- // save last processed data just for the later calculation
389
- /** @type {?} */
390
- var lastProcessedData;
391
- // save last processed time just for the later calculation
392
- /** @type {?} */
393
- var lastProcessedTime;
394
- // save last processed cursor position for progress calculation.
395
- // let lastProcessedCursor = 0;
396
- /** @type {?} */
397
- var indexStart = -1;
398
- /** @type {?} */
399
- var indexEnd = -1;
400
- /** @type {?} */
401
- var time = {};
402
- /** @type {?} */
403
- var data = {};
404
- /** @type {?} */
405
- var header;
406
- /** @type {?} */
407
- var host;
408
- /** @type {?} */
409
- var isMDC = false;
410
- /** @type {?} */
411
- var columnNum;
412
- /** @type {?} */
413
- var abortType;
414
- /** @type {?} */
415
- var rejectAndAbort = function (reject, parser) {
416
- if (progress) {
417
- progress(100);
418
- }
419
- reject(file.name + " is empty or the format is not correct.");
420
- parser.abort();
421
- };
422
- return new Promise(function (resolve, reject) {
423
- parse(file, {
424
- chunk: function (results, parser) {
425
- var _a;
426
- // the progress increment of this step
427
- // let analyzeStepProgress = (results.meta.cursor - lastProcessedCursor) / file.size * 100;
428
- printProcessedTime(beginTime, 'step1');
429
- if (indexEnd >= 0) {
430
- // already finished, quite.
431
- return;
432
- }
433
- else {
434
- // reset start point
435
- indexStart = -1;
436
- }
437
- // get time column
438
- if (firstChunk) {
439
- if (!validateData(results.data)) {
440
- return rejectAndAbort(reject, parser);
441
- }
442
- // initialize the header
443
- header = results.data[0].slice(3);
444
- // get column number
445
- columnNum = results.data[0].length;
446
- // get host name
447
- host = results.data[1][0];
448
- // get the first line time info from first line, it is a real number, do not need to do the convert with ">,<".
449
- lastProcessedTime = getTimeFromTimeZone(parseFloat(results.data[1][2]), timezone);
450
- // get the first line data info from first line, it is a real number, do not need to do the convert with ">,<".
451
- lastProcessedData = results.data[1].slice(3).map(Number);
452
- }
453
- printProcessedTime(beginTime, 'step2');
454
- if (!lastProcessedData) {
455
- return rejectAndAbort(reject, parser);
456
- }
457
- // get time column
458
- (_a = FileService._getTimeColumn(results.data, firstChunk, startTime, endTime, lastProcessedTime, time, port, isMDC, maxRowsLimitation), indexStart = _a.indexStart, indexEnd = _a.indexEnd, lastProcessedTime = _a.lastProcessedTime, isMDC = _a.isMDC);
459
- printProcessedTime(beginTime, 'step3');
460
- if (indexStart == null && indexEnd == null && lastProcessedTime == null && isMDC == null) {
461
- return rejectAndAbort(reject, parser);
462
- }
463
- // get all other data columns
464
- FileService._getDataColumns(columnNum, results.data, firstChunk, time, indexStart, indexEnd, lastProcessedData, data, port, isMDC);
465
- if (firstChunk) {
466
- firstChunk = false;
467
- }
468
- printProcessedTime(beginTime, 'step4');
469
- if (indexEnd >= 0) {
470
- // do not need to process the left parts, manually trigger complete
471
- /** @type {?} */
472
- var processedLines = Object.keys(time).reduce(function (total, curKey) { return time[curKey] ? total + time[curKey].length : total; }, 0);
473
- if (processedLines >= FileService._getMaxRowsLimitation(maxRowsLimitation)) {
474
- abortType = Abort.maxLineNumReached;
475
- }
476
- else {
477
- abortType = Abort.maxTimeRangeReached;
478
- }
479
- if (progress) {
480
- progress(100);
481
- }
482
- parser.abort();
483
- return;
484
- }
485
- else {
486
- // the overall progress if this step is finished
487
- if (progress) {
488
- progress(Math.round(results.meta.cursor / file.size * 100));
489
- }
490
- // lastProcessedCursor = results.meta.cursor;
491
- }
492
- },
493
- complete: function () {
494
- printProcessedTime(beginTime, 'step_complete');
495
- resolve({ header: header, host: host, time: time, data: data, aborted: abortType });
496
- }
497
- });
498
- });
499
- };
500
- /**
501
- * Get all ports from the name server history file
502
- * @param file the name server history file
503
- * @param progress call back for updating the progress
504
- */
505
- /**
506
- * Get all ports from the name server history file
507
- * @param {?} file the name server history file
508
- * @param {?} progress call back for updating the progress
509
- * @return {?}
510
- */
511
- FileService.prototype.getPortsFromFile = /**
512
- * Get all ports from the name server history file
513
- * @param {?} file the name server history file
514
- * @param {?} progress call back for updating the progress
515
- * @return {?}
516
- */
517
- function (file, progress) {
518
- /** @type {?} */
519
- var beginTime = new Date();
520
- /** @type {?} */
521
- var firstChunk = true;
522
- /** @type {?} */
523
- var ports = [];
524
- /** @type {?} */
525
- var defaultPort = getDefaultPort();
526
- return new Promise(function (resolve, reject) {
527
- parse(file, {
528
- chunk: function (results, parser) {
529
- // get time column
530
- if (firstChunk) {
531
- if (!validateData(results.data)) {
532
- if (progress) {
533
- progress(100);
534
- }
535
- reject(file.name + " is empty or the format is not correct.");
536
- parser.abort();
537
- return;
538
- }
539
- }
540
- printProcessedTime(beginTime, 'port.step1');
541
- FileService._getPorts(results.data, firstChunk, ports);
542
- if (firstChunk) {
543
- firstChunk = false;
544
- }
545
- if (progress) {
546
- progress(Math.round(results.meta.cursor / file.size * 100));
547
- }
548
- },
549
- complete: function () {
550
- // parsing done
551
- printProcessedTime(beginTime, 'step_complete');
552
- if (ports.length === 0) {
553
- ports[0] = defaultPort;
554
- }
555
- resolve(ports);
556
- }
557
- });
558
- });
559
- };
560
- FileService.decorators = [
561
- { type: Injectable }
562
- ];
563
- return FileService;
564
- }());
565
- export { FileService };
566
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWhhbmEtbmFtZXNlcnZlci1oaXN0b3J5LXZpZXdlci8iLCJzb3VyY2VzIjpbInNyYy9uYW1lc2VydmVyLWhpc3Rvcnktdmlld2VyL3NlcnZpY2VzL2ZpbGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQ0wsY0FBYyxFQUNkLGNBQWMsRUFDZCxPQUFPLEVBQ1AsbUJBQW1CLEVBQ25CLFVBQVUsRUFDVixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFlBQVksRUFDYixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxLQUFLLEVBQW1ELE1BQU0sVUFBVSxDQUFDOzs7Ozs7SUFNM0UsMkJBQTJCLEdBQUcsTUFBTTtBQUUxQztJQUFBO0lBMGFBLENBQUM7SUF4YUM7OztPQUdHOzs7Ozs7O0lBQ1ksaUNBQXFCOzs7Ozs7SUFBcEMsVUFBcUMsVUFBc0I7UUFBdEIsMkJBQUEsRUFBQSxpQkFBc0I7UUFDekQsSUFBSSxVQUFVLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN0RSxPQUFPLDJCQUEyQixDQUFDO1NBQ3BDO1FBQ0QsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHOzs7Ozs7Ozs7SUFDWSxxQkFBUzs7Ozs7Ozs7SUFBeEIsVUFBeUIsSUFBZ0IsRUFBRSxVQUFtQixFQUFFLEtBQWU7O1lBQ3pFLElBQUksR0FBRyxDQUFDO1FBQ1osSUFBSSxVQUFVLEVBQUU7WUFDZCxvQkFBb0I7WUFDcEIsSUFBSSxHQUFHLENBQUMsQ0FBQztTQUNWO1FBRUQsT0FBTyxJQUFJLEdBQUcs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Q3RCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7cUJBQ3hCO29CQUNELE9BQU8sQ0FBRSxLQUFLLENBQUMsQ0FBQztnQkFDbEIsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Z0JBemFGLFVBQVU7O0lBMGFYLGtCQUFDO0NBQUEsQUExYUQsSUEwYUM7U0F6YVksV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgY2FsY3VsYXRlVmFsdWUsXHJcbiAgZ2V0RGVmYXVsdFBvcnQsXHJcbiAgZ2V0UG9ydCxcclxuICBnZXRUaW1lRnJvbVRpbWVab25lLFxyXG4gIGlzU2FtZVBvcnQsXHJcbiAgaXNWYWxpZFBvcnQsXHJcbiAgcHJpbnRQcm9jZXNzZWRUaW1lLFxyXG4gIHZhbGlkYXRlRGF0YVxyXG59IGZyb20gJy4uL3V0aWxzJztcclxuaW1wb3J0IHtwYXJzZX0gZnJvbSAncGFwYXBhcnNlJztcclxuaW1wb3J0IHtBYm9ydCwgQ2hhcnRDb250ZW50LCBDaGFydENvbnRlbnREYXRhLCBDaGFydENvbnRlbnRUaW1lfSBmcm9tICcuLi90eXBlcyc7XHJcblxyXG4vKipcclxuICogcHJldmVudCBicm93c2VyIGZyb20gY3Jhc2hpbmcsIHNldCB0aGUgbWF4IHJvd3MgbGltaXRhdGlvbi5cclxuICogVGhpcyBjb3VsZCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgaW5wdXQ6bWF4Um93c0xpbWl0YXRpb24gb2YgdGhlIGNvbXBvbmVudC5cclxuICovXHJcbmNvbnN0IF9ERUZBVUxUX01BWF9ST1dTX0lOX01FTU9SWSA9IDEwMDAwMDtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEZpbGVTZXJ2aWNlIHtcclxuICAvKipcclxuICAgKiBwcmV2ZW50IGJyb3dzZXIgZnJvbSBjcmFzaGluZywgc2V0IHRoZSBtYXggcm93cyBsaW1pdGF0aW9uLlxyXG4gICAqIEBwYXJhbSBsaW1pdGF0aW9uIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBudWxsLCB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoaXMgb25lLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIF9nZXRNYXhSb3dzTGltaXRhdGlvbihsaW1pdGF0aW9uOiBhbnkgPSBudWxsKSB7XHJcbiAgICBpZiAobGltaXRhdGlvbiA9PSBudWxsIHx8IGlzTmFOKGxpbWl0YXRpb24pIHx8IGxpbWl0YXRpb24ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBfREVGQVVMVF9NQVhfUk9XU19JTl9NRU1PUlk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTnVtYmVyKGxpbWl0YXRpb24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZ2V0IGFsbCBhdmFpbGFibGUgcG9ydHMgZnJvbSBkYXRhXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2dldFBvcnRzKGRhdGE6IHN0cmluZ1tdW10sIGZpcnN0Q2h1bms6IGJvb2xlYW4sIHBvcnRzOiBzdHJpbmdbXSkge1xyXG4gICAgbGV0IGxpbmUgPSAwO1xyXG4gICAgaWYgKGZpcnN0Q2h1bmspIHtcclxuICAgICAgLy8gc3RhcnQgZnJvbSBsaW5lIDNcclxuICAgICAgbGluZSA9IDI7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yICg7IGxpbmUgPCBkYXRhLmxlbmd0aDsgbGluZSsrKSB7XHJcbiAgICAgIGNvbnN0IGRhdGFJdGVtID0gZGF0YVtsaW5lXVsxXTtcclxuICAgICAgaWYgKGRhdGFJdGVtICE9IG51bGwgJiYgZGF0YUl0ZW0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGlmIChpc1ZhbGlkUG9ydChkYXRhSXRlbSkgJiYgcG9ydHMuaW5kZXhPZihkYXRhSXRlbSkgPT09IC0xKSB7XHJcbiAgICAgICAgICBwb3J0cy5wdXNoKGRhdGFJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGdldCB0aGUgdGltZSBjb2x1bW4gZnJvbSB0aGUgYW5hbHl6ZWQgZGF0YVxyXG4gICAqIEBwYXJhbSBkYXRhIHRoZSBhbmFseXplZCBkYXRhXHJcbiAgICogQHBhcmFtIGZpcnN0Q2h1bmsgd2hldGhlciBpdCdzIGZpcnN0IGNodW5rIG9yIG5vdFxyXG4gICAqIEBwYXJhbSBzdGFydFRpbWUgc2VsZWN0ZWQgc3RhcnRpbmcgdGltZS4gSXQncyBtaWxsaXNlY29uZCwgbmVlZCB0byBiZSBjb252ZXJ0ZWQgc2Vjb25kLlxyXG4gICAqIEBwYXJhbSBlbmRUaW1lIHNlbGVjdGVkIGVuZGluZyB0aW1lLiBJdCdzIG1pbGxpc2Vjb25kLCBuZWVkIHRvIGJlIGNvbnZlcnRlZCBzZWNvbmQuXHJcbiAgICogQHBhcmFtIGxhc3RQcm9jZXNzZWRUaW1lIGxhc3QgcHJvY2Vzc2VkIHRpbWUgZm9ybSBsYXN0IGNodW5rXHJcbiAgICogQHBhcmFtIHRpbWUgdGltZSBvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIHRpbWUgZGF0YSBmb3IgYWxsIHBvcnRzXHJcbiAgICogQHBhcmFtIHNlbGVjdGVkUG9ydCBpZiB0aGUgc2VsZWN0ZWQgcG9ydCBpcyBlbXB0eSAoZGlkIG5vdCBzZWxlY3QgYW55IHBvcnQpLCBhbGwgcG9ydHMgaW5mbyBhcmUgbmVlZGVkXHJcbiAgICogQHBhcmFtIGlzTURDIGZsYWcgZm9yIE1EQyBzeXN0ZW1cclxuICAgKiBAcGFyYW0gbWF4Um93c0xpbWl0YXRpb24gcHJldmVudCBicm93c2VyIGZyb20gY3Jhc2hpbmcsIHNldCB0aGUgbWF4IHJvd3MgbGltaXRhdGlvbi5cclxuICAgKiBUaGlzIGNvbWVzIGZyb20gdGhlIGlucHV0OiBtYXhSb3dzTGltaXRhdGlvbiBvZiB0aGUgY29tcG9uZW50LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIF9nZXRUaW1lQ29sdW1uKGRhdGE6IHN0cmluZ1tdW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDaHVuazogYm9vbGVhbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWU6IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUaW1lOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFByb2Nlc3NlZFRpbWU6IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lOiBDaGFydENvbnRlbnRUaW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUG9ydDogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTURDOiBib29sZWFuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJvd3NMaW1pdGF0aW9uOiBhbnkpIHtcclxuICAgIC8vIGNvbnZlcnQgbWlsbGlzZWNvbmQgdG8gc2Vjb25kIGZvciBzdGFydFRpbWUgYW5kIGVuZFRpbWUuXHJcbiAgICBzdGFydFRpbWUgPSBzdGFydFRpbWUgLyAxMDAwO1xyXG4gICAgZW5kVGltZSA9IGVuZFRpbWUgLyAxMDAwO1xyXG4gICAgY29uc3QgdGltZUNvbHVtbiA9IDI7XHJcbiAgICBsZXQgc3RhcnRMaW5lID0gMDtcclxuICAgIGxldCBpU3RhcnQgPSAtMTtcclxuICAgIGxldCBpRW5kID0gLTE7XHJcblxyXG4gICAgbGV0IGN1clRpbWUgPSBsYXN0UHJvY2Vzc2VkVGltZTtcclxuICAgIGxldCBsYXN0UHJvY2Vzc2VkVGltZVJldHVybjtcclxuICAgIGxldCB0b3RhbE51bSA9IDA7XHJcbiAgICBsZXQgbWRjRmxhZyA9IGlzTURDO1xyXG4gICAgY29uc3QgZGVmYXVsdFBvcnQgPSBnZXREZWZhdWx0UG9ydCgpO1xyXG4gICAgY29uc3QgbWF4Um93TnVtID0gdGhpcy5fZ2V0TWF4Um93c0xpbWl0YXRpb24obWF4Um93c0xpbWl0YXRpb24pO1xyXG5cclxuICAgIGlmIChmaXJzdENodW5rKSB7XHJcbiAgICAgIGlmIChjdXJUaW1lID49IHN0YXJ0VGltZSAmJiBjdXJUaW1lIDw9IGVuZFRpbWUpIHtcclxuICAgICAgICBpU3RhcnQgPSAxOyAvLyBzdGFydCBmcm9tIGZpcnN0IGxpbmVcclxuXHJcbiAgICAgICAgLyoqIE1vZGlmaWVkIGF0IDIwMTgvMTAvMTAsXHJcbiAgICAgICAgICogaW4gc29tZSBjYXNlLCBlZzogdGhlIG5hbWVzZXJ2ZXIgaGlzdG9yeSB0cmFjZSBnZXRzIG1vZGlmaWVkIGJ5IEtvb2ssIEppbiBZb3VuZydzIHB5dGhvbiBzY3JpcHQsXHJcbiAgICAgICAgICogdGhlIHBvcnQgc2hvdyBpbiB0aGUgZmlyc3QgbGluZSBhcyB3ZWxsLCBhbmQgZG9lcyBub3QgbGlrZSB0aGUgbm9uLW1kYyBzeXN0ZW0sIHRoaXMga2luZCBvZiBmaWxlIGhhc1xyXG4gICAgICAgICAqIG9uZSBwb3J0IGluIGl0LiBUaGUgaGlzdG9yeSBmb3Igbm9uLW1kYyBzeXN0ZW0gZG9lc24ndCBoYXZlIHBvcnQgaW5mbyBpbiB0aGUgcG9ydCBjb2x1bW4uKi9cclxuXHJcbiAgICAgICAgICAvLyBnZXQgcG9ydCBmb3IgdGhlIGxpbmUgMS5cclxuICAgICAgICBjb25zdCBmaXJzdExpbmVQb3J0ID0gZ2V0UG9ydChkYXRhWzFdWzFdKTtcclxuICAgICAgICAvLyBpbml0IHRpbWUgYXJyYXkgZm9yIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAgICAgIGlmICghc2VsZWN0ZWRQb3J0IHx8IHNlbGVjdGVkUG9ydC5sZW5ndGggPT09IDAgfHwgaXNTYW1lUG9ydChmaXJzdExpbmVQb3J0LCBzZWxlY3RlZFBvcnQsIG1kY0ZsYWcpKSB7XHJcbiAgICAgICAgICAvLyBkb2VzIG5vdCBzZWxlY3QgYW55IHBvcnQgb3JcclxuICAgICAgICAgIC8vIGl0J3Mgbm9uLW1kYyAobWRjRmxhZyBpcyBmYWxzZSBhdCB0aGUgYmVnaW5uaW5nKSBzeXN0ZW0gYW5kIHRoZSBzZWxlY3RlZCBwb3J0IGlzIHRoZSBmaXJzdCBsaW5lIHBvcnRcclxuICAgICAgICAgIHRpbWVbZmlyc3RMaW5lUG9ydF0gPSBbXTtcclxuICAgICAgICAgIHRpbWVbZmlyc3RMaW5lUG9ydF1bMF0gPSBjdXJUaW1lICogMTAwMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGFzdFByb2Nlc3NlZFRpbWVSZXR1cm4gPSBjdXJUaW1lO1xyXG4gICAgICBzdGFydExpbmUgPSAyO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldCBjdXJyZW50IHRvdGFsIG51bWJlclxyXG4gICAgT2JqZWN0LmtleXModGltZSkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBpZiAodGltZVtrZXldKSB7XHJcbiAgICAgICAgdG90YWxOdW0gKz0gdGltZVtrZXldLmxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGN1clRpbWUgPT0gbnVsbCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdnZXRUaW1lQ29sdW1uJywgJ0NhbiBub3QgZ2V0IHRoZSB0aW1lIGZyb20gdGhlIGZpbGUsIGludGVybmFsIGVycm9yIScpO1xyXG4gICAgICByZXR1cm4ge2luZGV4U3RhcnQ6IG51bGwsIGluZGV4RW5kOiBudWxsLCBsYXN0UHJvY2Vzc2VkVGltZTogbnVsbCwgaXNNREM6IG51bGx9O1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSBzdGFydExpbmU7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIC8vIHNvbWV0aW1lIHRoZSBsYXN0IGxpbmUgaXMgZW1wdHksIG5lZWQgdG8gYmUgc2tpcHBlZC5cclxuICAgICAgaWYgKGRhdGFbaV0gPT0gbnVsbCB8fCBkYXRhW2ldLmxlbmd0aCA9PT0gMCB8fCAoZGF0YVtpXS5sZW5ndGggPT09IDEgJiYgZGF0YVtpXVswXS5sZW5ndGggPT09IDApKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGdldCBwb3J0IG51bWJlciBhbmQgaW5pdGlhbGl6ZSB0aGUgcmVsYXRpdmUgcG9ydCBhcnJheSBpbiB0aW1lXHJcbiAgICAgIGNvbnN0IHBvcnQgPSBnZXRQb3J0KGRhdGFbaV1bMV0pOyAvLyBkYXRhW2ldWzFdID09IG51bGwgfHwgZGF0YVtpXVsxXS5sZW5ndGggPT0gMCA/IF9fREVGQVVMVF9QT1JUIDogZGF0YVtpXVsxXTtcclxuICAgICAgaWYgKCEocG9ydCBpbiB0aW1lKSkge1xyXG4gICAgICAgIC8vIGFkZCB1bmRlZmluZWQgcG9ydCB0byB0aW1lLCB0aGVuIHdlIGNhbiBmaW5kIGFsbCBwb3J0cyBpbiB0aW1lXHJcbiAgICAgICAgdGltZVtwb3J0XSA9IHZvaWQgMDtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGltZVtwb3J0XSA9PSBudWxsICYmIGlzU2FtZVBvcnQocG9ydCwgc2VsZWN0ZWRQb3J0LCBtZGNGbGFnKSkge1xyXG4gICAgICAgIHRpbWVbcG9ydF0gPSBbXTtcclxuICAgICAgICAvLyBpZiBvdGhlciBwb3J0cyBleGlzdHMgaW4gdGhpcyBmaWxlLCBkZWZhdWx0IHBvcnQgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxyXG4gICAgICAgIGlmICghbWRjRmxhZyAmJiBwb3J0ICE9PSBkZWZhdWx0UG9ydCAmJiB0aW1lW2RlZmF1bHRQb3J0XSkge1xyXG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSB0b3RhbCBudW07XHJcbiAgICAgICAgICB0b3RhbE51bSAtPSB0aW1lW2RlZmF1bHRQb3J0XS5sZW5ndGg7XHJcbiAgICAgICAgICB0aW1lW2RlZmF1bHRQb3J0XS5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgdGltZVtkZWZhdWx0UG9ydF0gPSB2b2lkIDA7XHJcbiAgICAgICAgICBtZGNGbGFnID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY3VyVGltZSA9IGNhbGN1bGF0ZVZhbHVlKGN1clRpbWUsIGRhdGFbaV1bdGltZUNvbHVtbl0pO1xyXG4gICAgICBpZiAoY3VyVGltZSA+IGVuZFRpbWUpIHtcclxuICAgICAgICBpZiAoaUVuZCA8IDApIHtcclxuICAgICAgICAgIGlFbmQgPSBpIC0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGlTdGFydCA+PSAwKSB7XHJcbiAgICAgICAgaWYgKHRpbWVbcG9ydF0pIHtcclxuICAgICAgICAgIC8vIG5vdCBudWxsIG1lYW5zIGl0J3MgdGhlIHNlbGVjdGVkIHBvcnRcclxuICAgICAgICAgIHRpbWVbcG9ydF1bdGltZVtwb3J0XS5sZW5ndGhdID0gY3VyVGltZSAqIDEwMDA7XHJcbiAgICAgICAgICB0b3RhbE51bSArKztcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGN1clRpbWUgPj0gc3RhcnRUaW1lICYmIGN1clRpbWUgPD0gZW5kVGltZSkge1xyXG4gICAgICAgICAgaWYgKHRpbWVbcG9ydF0pIHtcclxuICAgICAgICAgICAgLy8gb25seSBzZWxlY3RlZCBwb3J0IGNvdW50ZWQgaW5cclxuICAgICAgICAgICAgaWYgKGlTdGFydCA8IDApIHtcclxuICAgICAgICAgICAgICBpU3RhcnQgPSBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRpbWVbcG9ydF1bdGltZVtwb3J0XS5sZW5ndGhdID0gY3VyVGltZSAqIDEwMDA7XHJcbiAgICAgICAgICAgIHRvdGFsTnVtICsrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBsYXN0IHByb2Nlc3NlZCB0aW1lIG5lZWQgdG8gYmUgcmVjb3JkZWQgYW55d2F5XHJcbiAgICAgIGxhc3RQcm9jZXNzZWRUaW1lUmV0dXJuID0gY3VyVGltZTtcclxuXHJcbiAgICAgIGlmICh0b3RhbE51bSA+PSBtYXhSb3dOdW0pIHtcclxuICAgICAgICBpRW5kID0gaTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtpbmRleFN0YXJ0OiBpU3RhcnQsIGluZGV4RW5kOiBpRW5kLCBsYXN0UHJvY2Vzc2VkVGltZTogbGFzdFByb2Nlc3NlZFRpbWVSZXR1cm4sIGlzTURDOiBtZGNGbGFnfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBkYXRhIGZvciBhbGwgY29sdW1uc1xyXG4gICAqIEBwYXJhbSBjb2x1bW5OdW0gdGhlIHRvdGFsIG51bWJlciBvZiBjb2x1bW5zLiBGb3IgbWRjIHN5c3RlbSxcclxuICAgKiAgICAgICAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgZWFjaCByb3cgaXMgZGlmZmVyZW50LiBIb3N0IHJlbGF0aXZlIGRhdGEgZG9lcyBub3QgZXhpc3QgaW4gdGVuYW50IGxpbmUuXHJcbiAgICogICAgICAgICAgICAgICAgICBOZWVkcyB0byB1c2UgY29sdW1uIG51bWJlciBmcm9tIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAqIEBwYXJhbSBkYXRhICAgICAgZGF0YSBwYXJzZWQgYnkgcGFwYVxyXG4gICAqIEBwYXJhbSBmaXJzdENodW5rIHRoZSBmbGFnIHdoaWNoIGlkZW50aWZpZXMgd2hldGhlciBpdCdzIHRoZSBmaXJzdCBjaHVuayBvciBub3QuXHJcbiAgICogQHBhcmFtIHRpbWVcclxuICAgKiBAcGFyYW0gaW5kZXhTdGFydFxyXG4gICAqIEBwYXJhbSBpbmRleEVuZFxyXG4gICAqIEBwYXJhbSBsYXN0UHJvY2Vzc2VkTGluZVxyXG4gICAqIEBwYXJhbSByZXN1bHREYXRhICAgdGhlIHJlc3VsdCBkYXRhIGFmdGVyIGFuYWx5emVkXHJcbiAgICogQHBhcmFtIHNlbGVjdGVkUG9ydFxyXG4gICAqIEBwYXJhbSBpc01EQ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIF9nZXREYXRhQ29sdW1ucyhjb2x1bW5OdW06IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogc3RyaW5nW11bXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDaHVuazogYm9vbGVhbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogQ2hhcnRDb250ZW50VGltZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTdGFydDogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEVuZDogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UHJvY2Vzc2VkTGluZTogbnVtYmVyW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdERhdGE6IENoYXJ0Q29udGVudERhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUG9ydDogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01EQzogYm9vbGVhbikge1xyXG4gICAgbGV0IHN0YXJ0TGluZSA9IDA7XHJcbiAgICAvLyBmb3IgbWRjIHN5c3RlbSwgdGhlIGxlbmd0aCBpcyBub3QgY29ycmVjdCAoaG9zdCByZWxhdGl2ZSBkYXRhIG9ubHkgZXhpc3RzIGluIHRoZSBcImVtcHR5XCIgcG9ydCBsaW5lKS5cclxuICAgIC8vIE5lZWRzIHRvIHVzZSBoZWFkZXIgZnJvbSB0aGUgZmlyc3QgbGluZS5cclxuICAgIC8vIGNvbnN0IGNvbHVtbk51bSA9IGRhdGFbMF0ubGVuZ3RoO1xyXG5cclxuICAgIGlmIChmaXJzdENodW5rKSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBNb2RpZmllZCBhdCAyMDE4LzEwLzEwLFxyXG4gICAgICAgKiBpbiBzb21lIGNhc2UsIGVnOiB0aGUgbmFtZXNlcnZlciBoaXN0b3J5IHRyYWNlIGdldHMgbW9kaWZpZWQgYnkgS29vaywgSmluIFlvdW5nJ3MgcHl0aG9uIHNjcmlwdCxcclxuICAgICAgICogdGhlIHBvcnQgc2hvdyBpbiB0aGUgZmlyc3QgbGluZSBhcyB3ZWxsLCBhbmQgZG9lcyBub3QgbGlrZSB0aGUgbm9uLW1kYyBzeXN0ZW0sIHRoaXMga2luZCBvZiBmaWxlIGhhc1xyXG4gICAgICAgKiBvbmUgcG9ydCBpbiBpdC4gVGhlIGhpc3RvcnkgZm9yIG5vbi1tZGMgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBwb3J0IGluZm8gaW4gdGhlIHBvcnQgY29sdW1uLlxyXG4gICAgICAgKi9cclxuXHJcbiAgICAgIC8vIGdldCBwb3J0IGZvciB0aGUgbGluZSAxLlxyXG4gICAgICBjb25zdCBmaXJzdExpbmVQb3J0ID0gZ2V0UG9ydChkYXRhWzFdWzFdKTtcclxuICAgICAgLy8gSW5pdGlhbGl6ZSBkYXRhIGNvbHVtbiB3aXRoIGRlZmF1bHQgJ0RFRkFVTFQnIHBvcnQgaWYgaXQncyBub3QgTURDIHN5c3RlbS4gTURDIHN5c3RlbSwgJ0RFRkFVTFQnIGdldHMgaWdub3JlZFxyXG4gICAgICBpZiAoIWlzTURDICYmIHRpbWVbZmlyc3RMaW5lUG9ydF0pIHtcclxuICAgICAgICByZXN1bHREYXRhW2ZpcnN0TGluZVBvcnRdID0gW107XHJcbiAgICAgICAgLy8gcmVtb3ZlZCBiZWxvdyBsb2dpYywgYmVjYXVzZSBmaXJzdCBsaW5lIGlzIHRoZSByZWFsIG51bWJlciwgZG8gbm90IG5lZWQgdG8gZG8gdGhlIGNvbnZlcnQuXHJcbiAgICAgICAgLy8gY3VyTGluZSA9IGRhdGFbMV0uc2xpY2UoMykubWFwKE51bWJlcik7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDM7IGogPCBjb2x1bW5OdW07IGorKykge1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBqIC0gMztcclxuXHJcbiAgICAgICAgICAvLyBpbml0aWFsaXplIGRhdGEgYXJyYXkgZm9yIGFsbCBjb2x1bW5zIG9mIHRoZSBkZWZhdWx0ICcwMDAwJyBwb3J0XHJcbiAgICAgICAgICByZXN1bHREYXRhW2ZpcnN0TGluZVBvcnRdW2luZGV4XSA9IFtdO1xyXG4gICAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBsaW5lIGRhdGEgb2YgdGhlIGNvbHVtbiBpZiBpdCdzIGluY2x1ZGVkXHJcbiAgICAgICAgICBpZiAoaW5kZXhTdGFydCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXN1bHREYXRhW2ZpcnN0TGluZVBvcnRdW2luZGV4XVswXSA9IHt4OiB0aW1lW2ZpcnN0TGluZVBvcnRdWzBdLCB5OiBsYXN0UHJvY2Vzc2VkTGluZVtpbmRleF19O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBzdGFydExpbmUgPSAyO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGogPSAzOyBqIDwgY29sdW1uTnVtOyBqKyspIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBqIC0gMztcclxuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0TGluZTsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyBzb21ldGltZSB0aGUgbGFzdCBsaW5lIGlzIGVtcHR5LCBuZWVkIHRvIGJlIHNraXBwZWQuXHJcbiAgICAgICAgaWYgKGRhdGFbaV0gPT0gbnVsbCB8fCBkYXRhW2ldLmxlbmd0aCA9PT0gMCB8fCAoZGF0YVtpXS5sZW5ndGggPT09IDEgJiYgZGF0YVtpXVswXS5sZW5ndGggPT09IDApKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGdldCBwb3J0IG51bWJlciBhbmQgaW5pdGlhbGl6ZSB0aGUgcmVsYXRpdmUgcG9ydCBhcnJheSBpbiBkYXRhXHJcbiAgICAgICAgY29uc3QgcG9ydCA9IGdldFBvcnQoZGF0YVtpXVsxXSk7XHJcbiAgICAgICAgaWYgKHJlc3VsdERhdGFbcG9ydF0gPT0gbnVsbCAmJiBpc1NhbWVQb3J0KHBvcnQsIHNlbGVjdGVkUG9ydCwgaXNNREMpKSB7XHJcbiAgICAgICAgICByZXN1bHREYXRhW3BvcnRdID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXN1bHREYXRhW3BvcnRdICYmIHJlc3VsdERhdGFbcG9ydF1baW5kZXhdID09IG51bGwpIHtcclxuICAgICAgICAgIHJlc3VsdERhdGFbcG9ydF1baW5kZXhdID0gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsYXN0UHJvY2Vzc2VkTGluZVtpbmRleF0gPSBjYWxjdWxhdGVWYWx1ZShsYXN0UHJvY2Vzc2VkTGluZVtpbmRleF0sIGRhdGFbaV1bal0pO1xyXG4gICAgICAgIGlmIChpID49IGluZGV4U3RhcnQgJiYgKGkgPD0gaW5kZXhFbmQgfHwgaW5kZXhFbmQgPCAwKSAmJiBpbmRleFN0YXJ0ID49IDApIHtcclxuICAgICAgICAgIGlmIChyZXN1bHREYXRhW3BvcnRdKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHJlc3VsdERhdGFbcG9ydF1baW5kZXhdLmxlbmd0aDtcclxuICAgICAgICAgICAgcmVzdWx0RGF0YVtwb3J0XVtpbmRleF1bbGVuZ3RoXSA9IHt4OiB0aW1lW3BvcnRdW2xlbmd0aF0sIHk6IGxhc3RQcm9jZXNzZWRMaW5lW2luZGV4XX07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbmRleEVuZCA+IDAgJiYgaSA+IGluZGV4RW5kKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBDaGFydCBkYXRhIGZyb20gcHJvdmlkZWQgZmlsZS5cclxuICAgKiBAcGFyYW0gZmlsZSB0aGUgbmFtZXNlcnZlciBoaXN0b3J5IGZpbGVcclxuICAgKiBAcGFyYW0gc3RhcnRUaW1lXHJcbiAgICogQHBhcmFtIGVuZFRpbWVcclxuICAgKiBAcGFyYW0gcG9ydFxyXG4gICAqIEBwYXJhbSB0aW1lem9uZVxyXG4gICAqIEBwYXJhbSBtYXhSb3dzTGltaXRhdGlvbiBwcmV2ZW50IGJyb3dzZXIgZnJvbSBjcmFzaGluZywgc2V0IHRoZSBtYXggcm93cyBsaW1pdGF0aW9uLlxyXG4gICAqIEBwYXJhbSBwcm9ncmVzcyBjYWxsIGJhY2sgZnVuY3Rpb24gZm9yIHVwZGF0aW5nIHByb2dyZXNzXHJcbiAgICovXHJcbiAgcHVibGljIGdldENoYXJ0Q29udGVudEZyb21GaWxlKGZpbGU6IEZpbGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUaW1lOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXpvbmU6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Um93c0xpbWl0YXRpb246IGFueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M6IGFueSk6IFByb21pc2U8Q2hhcnRDb250ZW50PiB7XHJcbiAgICAvLyBsb2FkIGRvbmUsIGJlZ2lubmluZyBwYXJzaW5nXHJcbiAgICBjb25zdCBiZWdpblRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgbGV0IGZpcnN0Q2h1bmsgPSB0cnVlO1xyXG4gICAgLy8gc2F2ZSBsYXN0IHByb2Nlc3NlZCBkYXRhIGp1c3QgZm9yIHRoZSBsYXRlciBjYWxjdWxhdGlvblxyXG4gICAgbGV0IGxhc3RQcm9jZXNzZWREYXRhO1xyXG4gICAgLy8gc2F2ZSBsYXN0IHByb2Nlc3NlZCB0aW1lIGp1c3QgZm9yIHRoZSBsYXRlciBjYWxjdWxhdGlvblxyXG4gICAgbGV0IGxhc3RQcm9jZXNzZWRUaW1lO1xyXG4gICAgLy8gc2F2ZSBsYXN0IHByb2Nlc3NlZCBjdXJzb3IgcG9zaXRpb24gZm9yIHByb2dyZXNzIGNhbGN1bGF0aW9uLlxyXG4gICAgLy8gbGV0IGxhc3RQcm9jZXNzZWRDdXJzb3IgPSAwO1xyXG4gICAgbGV0IGluZGV4U3RhcnQgPSAtMSwgaW5kZXhFbmQgPSAtMTtcclxuICAgIGNvbnN0IHRpbWU6IENoYXJ0Q29udGVudFRpbWUgPSB7fTtcclxuICAgIGNvbnN0IGRhdGE6IENoYXJ0Q29udGVudERhdGEgPSB7fTtcclxuICAgIGxldCBoZWFkZXI7XHJcbiAgICBsZXQgaG9zdDtcclxuICAgIGxldCBpc01EQyA9IGZhbHNlO1xyXG4gICAgbGV0IGNvbHVtbk51bTtcclxuICAgIGxldCBhYm9ydFR5cGU6IEFib3J0O1xyXG5cclxuICAgIGNvbnN0IHJlamVjdEFuZEFib3J0ID0gKHJlamVjdCwgcGFyc2VyKSA9PiB7XHJcbiAgICAgIGlmIChwcm9ncmVzcykge1xyXG4gICAgICAgIHByb2dyZXNzKDEwMCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVqZWN0KGAke2ZpbGUubmFtZX0gaXMgZW1wdHkgb3IgdGhlIGZvcm1hdCBpcyBub3QgY29ycmVjdC5gKTtcclxuICAgICAgcGFyc2VyLmFib3J0KCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgcGFyc2UoZmlsZSwge1xyXG4gICAgICAgIGNodW5rOiAocmVzdWx0cywgcGFyc2VyKSA9PiB7XHJcbiAgICAgICAgICAvLyB0aGUgcHJvZ3Jlc3MgaW5jcmVtZW50IG9mIHRoaXMgc3RlcFxyXG4gICAgICAgICAgLy8gbGV0IGFuYWx5emVTdGVwUHJvZ3Jlc3MgPSAocmVzdWx0cy5tZXRhLmN1cnNvciAtIGxhc3RQcm9jZXNzZWRDdXJzb3IpIC8gZmlsZS5zaXplICogMTAwO1xyXG4gICAgICAgICAgcHJpbnRQcm9jZXNzZWRUaW1lKGJlZ2luVGltZSwgJ3N0ZXAxJyk7XHJcbiAgICAgICAgICBpZiAoaW5kZXhFbmQgPj0gMCkge1xyXG4gICAgICAgICAgICAvLyBhbHJlYWR5IGZpbmlzaGVkLCBxdWl0ZS5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gcmVzZXQgc3RhcnQgcG9pbnRcclxuICAgICAgICAgICAgaW5kZXhTdGFydCA9IC0xO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGdldCB0aW1lIGNvbHVtblxyXG4gICAgICAgICAgaWYgKGZpcnN0Q2h1bmspIHtcclxuICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZURhdGEocmVzdWx0cy5kYXRhKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiByZWplY3RBbmRBYm9ydChyZWplY3QsIHBhcnNlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGhlYWRlclxyXG4gICAgICAgICAgICBoZWFkZXIgPSByZXN1bHRzLmRhdGFbMF0uc2xpY2UoMyk7XHJcbiAgICAgICAgICAgIC8vIGdldCBjb2x1bW4gbnVtYmVyXHJcbiAgICAgICAgICAgIGNvbHVtbk51bSA9IHJlc3VsdHMuZGF0YVswXS5sZW5ndGg7XHJcbiAgICAgICAgICAgIC8vIGdldCBob3N0IG5hbWVcclxuICAgICAgICAgICAgaG9zdCA9IHJlc3VsdHMuZGF0YVsxXVswXTtcclxuICAgICAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBsaW5lIHRpbWUgaW5mbyBmcm9tIGZpcnN0IGxpbmUsIGl0IGlzIGEgcmVhbCBudW1iZXIsIGRvIG5vdCBuZWVkIHRvIGRvIHRoZSBjb252ZXJ0IHdpdGggXCI+LDxcIi5cclxuICAgICAgICAgICAgbGFzdFByb2Nlc3NlZFRpbWUgPSBnZXRUaW1lRnJvbVRpbWVab25lKHBhcnNlRmxvYXQocmVzdWx0cy5kYXRhWzFdWzJdKSwgdGltZXpvbmUpO1xyXG4gICAgICAgICAgICAvLyBnZXQgdGhlIGZpcnN0IGxpbmUgZGF0YSBpbmZvIGZyb20gZmlyc3QgbGluZSwgaXQgaXMgYSByZWFsIG51bWJlciwgZG8gbm90IG5lZWQgdG8gZG8gdGhlIGNvbnZlcnQgd2l0aCBcIj4sPFwiLlxyXG4gICAgICAgICAgICBsYXN0UHJvY2Vzc2VkRGF0YSA9IHJlc3VsdHMuZGF0YVsxXS5zbGljZSgzKS5tYXAoTnVtYmVyKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBwcmludFByb2Nlc3NlZFRpbWUoYmVnaW5UaW1lLCAnc3RlcDInKTtcclxuXHJcbiAgICAgICAgICBpZiAoIWxhc3RQcm9jZXNzZWREYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZWplY3RBbmRBYm9ydChyZWplY3QsIHBhcnNlcik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gZ2V0IHRpbWUgY29sdW1uXHJcbiAgICAgICAgICAoe2luZGV4U3RhcnQsIGluZGV4RW5kLCBsYXN0UHJvY2Vzc2VkVGltZSwgaXNNREN9ID0gRmlsZVNlcnZpY2UuX2dldFRpbWVDb2x1bW4oXHJcbiAgICAgICAgICAgIHJlc3VsdHMuZGF0YSwgZmlyc3RDaHVuaywgc3RhcnRUaW1lLCBlbmRUaW1lLCBsYXN0UHJvY2Vzc2VkVGltZSwgdGltZSwgcG9ydCwgaXNNREMsIG1heFJvd3NMaW1pdGF0aW9uKSk7XHJcbiAgICAgICAgICBwcmludFByb2Nlc3NlZFRpbWUoYmVnaW5UaW1lLCAnc3RlcDMnKTtcclxuXHJcbiAgICAgICAgICBpZiAoaW5kZXhTdGFydCA9PSBudWxsICYmIGluZGV4RW5kID09IG51bGwgJiYgbGFzdFByb2Nlc3NlZFRpbWUgPT0gbnVsbCAmJiBpc01EQyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZWplY3RBbmRBYm9ydChyZWplY3QsIHBhcnNlcik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gZ2V0IGFsbCBvdGhlciBkYXRhIGNvbHVtbnNcclxuICAgICAgICAgIEZpbGVTZXJ2aWNlLl9nZXREYXRhQ29sdW1ucyhcclxuICAgICAgICAgICAgY29sdW1uTnVtLCByZXN1bHRzLmRhdGEsIGZpcnN0Q2h1bmssIHRpbWUsIGluZGV4U3RhcnQsIGluZGV4RW5kLCBsYXN0UHJvY2Vzc2VkRGF0YSwgZGF0YSwgcG9ydCwgaXNNREMpO1xyXG5cclxuICAgICAgICAgIGlmIChmaXJzdENodW5rKSB7XHJcbiAgICAgICAgICAgIGZpcnN0Q2h1bmsgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBwcmludFByb2Nlc3NlZFRpbWUoYmVnaW5UaW1lLCAnc3RlcDQnKTtcclxuXHJcbiAgICAgICAgICBpZiAoaW5kZXhFbmQgPj0gMCkge1xyXG4gICAgICAgICAgICAvLyBkbyBub3QgbmVlZCB0byBwcm9jZXNzIHRoZSBsZWZ0IHBhcnRzLCBtYW51YWxseSB0cmlnZ2VyIGNvbXBsZXRlXHJcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZExpbmVzID0gT2JqZWN0LmtleXModGltZSkucmVkdWNlKCh0b3RhbCwgY3VyS2V5KSA9PiB0aW1lW2N1cktleV0gPyB0b3RhbCArIHRpbWVbY3VyS2V5XS5sZW5ndGggOiB0b3RhbCwgMCk7XHJcbiAgICAgICAgICAgIGlmIChwcm9jZXNzZWRMaW5lcyA+PSBGaWxlU2VydmljZS5fZ2V0TWF4Um93c0xpbWl0YXRpb24obWF4Um93c0xpbWl0YXRpb24pKSB7XHJcbiAgICAgICAgICAgICAgYWJvcnRUeXBlID0gQWJvcnQubWF4TGluZU51bVJlYWNoZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgYWJvcnRUeXBlID0gQWJvcnQubWF4VGltZVJhbmdlUmVhY2hlZDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgcHJvZ3Jlc3MoMTAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwYXJzZXIuYWJvcnQoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdGhlIG92ZXJhbGwgcHJvZ3Jlc3MgaWYgdGhpcyBzdGVwIGlzIGZpbmlzaGVkXHJcbiAgICAgICAgICAgIGlmIChwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgIHByb2dyZXNzKE1hdGgucm91bmQocmVzdWx0cy5tZXRhLmN1cnNvciAvIGZpbGUuc2l6ZSAqIDEwMCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGxhc3RQcm9jZXNzZWRDdXJzb3IgPSByZXN1bHRzLm1ldGEuY3Vyc29yO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIHByaW50UHJvY2Vzc2VkVGltZShiZWdpblRpbWUsICdzdGVwX2NvbXBsZXRlJyk7XHJcbiAgICAgICAgICByZXNvbHZlICh7aGVhZGVyOiBoZWFkZXIsIGhvc3Q6IGhvc3QsIHRpbWU6IHRpbWUsIGRhdGE6IGRhdGEsIGFib3J0ZWQ6IGFib3J0VHlwZX0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbGwgcG9ydHMgZnJvbSB0aGUgbmFtZSBzZXJ2ZXIgaGlzdG9yeSBmaWxlXHJcbiAgICogQHBhcmFtIGZpbGUgdGhlIG5hbWUgc2VydmVyIGhpc3RvcnkgZmlsZVxyXG4gICAqIEBwYXJhbSBwcm9ncmVzcyBjYWxsIGJhY2sgZm9yIHVwZGF0aW5nIHRoZSBwcm9ncmVzc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRQb3J0c0Zyb21GaWxlKGZpbGU6IEZpbGUsIHByb2dyZXNzOiBhbnkpOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcbiAgICBjb25zdCBiZWdpblRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgbGV0IGZpcnN0Q2h1bmsgPSB0cnVlO1xyXG4gICAgY29uc3QgcG9ydHMgPSBbXTtcclxuICAgIGNvbnN0IGRlZmF1bHRQb3J0ID0gZ2V0RGVmYXVsdFBvcnQoKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHBhcnNlKGZpbGUsIHtcclxuICAgICAgICBjaHVuazogKHJlc3VsdHMsIHBhcnNlcikgPT4ge1xyXG4gICAgICAgICAgLy8gZ2V0IHRpbWUgY29sdW1uXHJcbiAgICAgICAgICBpZiAoZmlyc3RDaHVuaykge1xyXG4gICAgICAgICAgICBpZiAoIXZhbGlkYXRlRGF0YShyZXN1bHRzLmRhdGEpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9ncmVzcygxMDApO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICByZWplY3QoYCR7ZmlsZS5uYW1lfSBpcyBlbXB0eSBvciB0aGUgZm9ybWF0IGlzIG5vdCBjb3JyZWN0LmApO1xyXG4gICAgICAgICAgICAgIHBhcnNlci5hYm9ydCgpO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcHJpbnRQcm9jZXNzZWRUaW1lKGJlZ2luVGltZSwgJ3BvcnQuc3RlcDEnKTtcclxuICAgICAgICAgIEZpbGVTZXJ2aWNlLl9nZXRQb3J0cyhyZXN1bHRzLmRhdGEsIGZpcnN0Q2h1bmssIHBvcnRzKTtcclxuICAgICAgICAgIGlmIChmaXJzdENodW5rKSB7XHJcbiAgICAgICAgICAgIGZpcnN0Q2h1bmsgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChwcm9ncmVzcykge1xyXG4gICAgICAgICAgICBwcm9ncmVzcyhNYXRoLnJvdW5kKHJlc3VsdHMubWV0YS5jdXJzb3IgLyBmaWxlLnNpemUgKiAxMDApKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAvLyBwYXJzaW5nIGRvbmVcclxuICAgICAgICAgIHByaW50UHJvY2Vzc2VkVGltZShiZWdpblRpbWUsICdzdGVwX2NvbXBsZXRlJyk7XHJcbiAgICAgICAgICBpZiAocG9ydHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHBvcnRzWzBdID0gZGVmYXVsdFBvcnQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXNvbHZlIChwb3J0cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,8 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- export { ChartService } from './chart.service';
6
- export { FileService } from './file.service';
7
- export { UIService } from './ui.service';
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtaGFuYS1uYW1lc2VydmVyLWhpc3Rvcnktdmlld2VyLyIsInNvdXJjZXMiOlsic3JjL25hbWVzZXJ2ZXItaGlzdG9yeS12aWV3ZXIvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLDZCQUFjLGlCQUFpQixDQUFDO0FBQ2hDLDRCQUFjLGdCQUFnQixDQUFDO0FBQy9CLDBCQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY2hhcnQuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZmlsZS5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi91aS5zZXJ2aWNlJztcclxuIl19