@c8y/ngx-components 1021.11.1 → 1021.21.0

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 (434) hide show
  1. package/alarms/alarms-date-filter.component.d.ts +34 -0
  2. package/alarms/alarms-date-filter.component.d.ts.map +1 -0
  3. package/alarms/alarms-filter.component.d.ts +2 -1
  4. package/alarms/alarms-filter.component.d.ts.map +1 -1
  5. package/alarms/alarms-list.component.d.ts +2 -17
  6. package/alarms/alarms-list.component.d.ts.map +1 -1
  7. package/alarms/alarms-view.service.d.ts +5 -2
  8. package/alarms/alarms-view.service.d.ts.map +1 -1
  9. package/alarms/alarms.component.d.ts +3 -1
  10. package/alarms/alarms.component.d.ts.map +1 -1
  11. package/alarms/alarms.model.d.ts +47 -1
  12. package/alarms/alarms.model.d.ts.map +1 -1
  13. package/alarms/alarms.module.d.ts +15 -13
  14. package/alarms/alarms.module.d.ts.map +1 -1
  15. package/branding/shared/data/store-branding.service.d.ts +5 -0
  16. package/branding/shared/data/store-branding.service.d.ts.map +1 -1
  17. package/branding/shared/lazy/branding/branding.component.d.ts.map +1 -1
  18. package/context-dashboard/context-dashboard.model.d.ts +1 -0
  19. package/context-dashboard/context-dashboard.model.d.ts.map +1 -1
  20. package/context-dashboard/context-dashboard.service.d.ts +7 -5
  21. package/context-dashboard/context-dashboard.service.d.ts.map +1 -1
  22. package/context-dashboard/dashboard-detail.component.d.ts +4 -7
  23. package/context-dashboard/dashboard-detail.component.d.ts.map +1 -1
  24. package/context-dashboard/dashboard-detail.service.d.ts +4 -4
  25. package/context-dashboard/dashboard-detail.service.d.ts.map +1 -1
  26. package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts +2 -2
  27. package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts.map +1 -1
  28. package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts +19 -6
  29. package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts.map +1 -1
  30. package/core/action-bar/action-bar-item.component.d.ts +1 -1
  31. package/core/action-bar/action-bar-item.component.d.ts.map +1 -1
  32. package/core/action-bar/action-bar.module.d.ts +6 -6
  33. package/core/action-bar/action-bar.module.d.ts.map +1 -1
  34. package/core/bootstrap/bootstrap.component.d.ts +3 -1
  35. package/core/bootstrap/bootstrap.component.d.ts.map +1 -1
  36. package/core/common/aggregation/aggregation.model.d.ts +39 -0
  37. package/core/common/aggregation/aggregation.model.d.ts.map +1 -0
  38. package/core/common/aggregation/aggregation.service.d.ts +17 -0
  39. package/core/common/aggregation/aggregation.service.d.ts.map +1 -0
  40. package/core/common/index.d.ts +4 -0
  41. package/core/common/index.d.ts.map +1 -1
  42. package/core/common/inter-app.service.d.ts +48 -0
  43. package/core/common/inter-app.service.d.ts.map +1 -0
  44. package/core/common/interval-based-reload.abstract.d.ts +120 -0
  45. package/core/common/interval-based-reload.abstract.d.ts.map +1 -0
  46. package/core/dashboard/dashboard.module.d.ts +26 -20
  47. package/core/dashboard/dashboard.module.d.ts.map +1 -1
  48. package/core/dashboard/index.d.ts +3 -0
  49. package/core/dashboard/index.d.ts.map +1 -1
  50. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts +31 -0
  51. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts.map +1 -0
  52. package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts +17 -0
  53. package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts.map +1 -0
  54. package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts +4 -0
  55. package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts.map +1 -0
  56. package/core/dashboard/widget-auto-refresh-context/index.d.ts +8 -0
  57. package/core/dashboard/widget-auto-refresh-context/index.d.ts.map +1 -0
  58. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts +7 -0
  59. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts.map +1 -0
  60. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts +29 -0
  61. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts.map +1 -0
  62. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts +15 -0
  63. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts.map +1 -0
  64. package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts +169 -0
  65. package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts.map +1 -0
  66. package/core/dashboard/widget-change-event.model.d.ts +1 -1
  67. package/core/dashboard/widget-change-event.model.d.ts.map +1 -1
  68. package/core/dashboard/widgets-dashboard.component.d.ts +6 -3
  69. package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
  70. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts +2 -2
  71. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts.map +1 -1
  72. package/core/dashboard/wiget-time-context/widget-time-context-helper.service.d.ts +2 -1
  73. package/core/dashboard/wiget-time-context/widget-time-context-helper.service.d.ts.map +1 -1
  74. package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts +1 -1
  75. package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts.map +1 -1
  76. package/core/dashboard/wiget-time-context/widget-time-context-query.service.d.ts.map +1 -1
  77. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +12 -8
  78. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
  79. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts +7 -26
  80. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts.map +1 -1
  81. package/core/date-time-picker/date-time-picker.component.d.ts.map +1 -1
  82. package/core/header/header.module.d.ts +18 -18
  83. package/core/header/header.module.d.ts.map +1 -1
  84. package/core/header/title/title.component.d.ts +1 -1
  85. package/core/header/title/title.component.d.ts.map +1 -1
  86. package/core/i18n/cached-locale-dictionary.service.d.ts +5 -1
  87. package/core/i18n/cached-locale-dictionary.service.d.ts.map +1 -1
  88. package/core/i18n/i18n.module.d.ts +0 -4
  89. package/core/i18n/i18n.module.d.ts.map +1 -1
  90. package/core/i18n/index.d.ts +2 -1
  91. package/core/i18n/index.d.ts.map +1 -1
  92. package/core/i18n/translation-loader.service.d.ts +50 -0
  93. package/core/i18n/translation-loader.service.d.ts.map +1 -0
  94. package/core/i18n/translation-utils.d.ts +14 -0
  95. package/core/i18n/translation-utils.d.ts.map +1 -0
  96. package/core/plugins/plugins-resolve.service.d.ts +7 -10
  97. package/core/plugins/plugins-resolve.service.d.ts.map +1 -1
  98. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts +2 -1
  99. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts.map +1 -1
  100. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts +11 -2
  101. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts.map +1 -1
  102. package/datapoint-selector/datapoint-selection.model.d.ts +6 -0
  103. package/datapoint-selector/datapoint-selection.model.d.ts.map +1 -1
  104. package/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.d.ts.map +1 -0
  105. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts +117 -0
  106. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -0
  107. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts +90 -0
  108. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts.map +1 -0
  109. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts +160 -0
  110. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts.map +1 -0
  111. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts +89 -0
  112. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts.map +1 -0
  113. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.d.ts +11 -0
  114. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.d.ts.map +1 -0
  115. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.d.ts +27 -0
  116. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.d.ts.map +1 -0
  117. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.d.ts +12 -0
  118. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.d.ts.map +1 -0
  119. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts +22 -0
  120. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts.map +1 -0
  121. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts +3 -0
  122. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts.map +1 -0
  123. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts +9 -0
  124. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts.map +1 -0
  125. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts +56 -0
  126. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts.map +1 -0
  127. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts +21 -0
  128. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts.map +1 -0
  129. package/datapoints-export-selector/datapoints-export-selector.component.d.ts +14 -0
  130. package/datapoints-export-selector/datapoints-export-selector.component.d.ts.map +1 -0
  131. package/datapoints-export-selector/datapoints-export-selector.model.d.ts +232 -0
  132. package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -0
  133. package/datapoints-export-selector/index.d.ts +15 -0
  134. package/datapoints-export-selector/index.d.ts.map +1 -0
  135. package/device-list/device-list.module.d.ts +4 -2
  136. package/device-list/device-list.module.d.ts.map +1 -1
  137. package/esm2022/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.mjs +4 -4
  138. package/esm2022/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.mjs +3 -3
  139. package/esm2022/alarms/alarms-date-filter.component.mjs +139 -0
  140. package/esm2022/alarms/alarms-filter.component.mjs +11 -5
  141. package/esm2022/alarms/alarms-list.component.mjs +5 -16
  142. package/esm2022/alarms/alarms-type-filter.component.mjs +3 -3
  143. package/esm2022/alarms/alarms-view.service.mjs +16 -2
  144. package/esm2022/alarms/alarms.component.mjs +12 -6
  145. package/esm2022/alarms/alarms.model.mjs +17 -1
  146. package/esm2022/alarms/alarms.module.mjs +11 -4
  147. package/esm2022/branding/shared/data/store-branding.service.mjs +24 -1
  148. package/esm2022/branding/shared/lazy/branding/branding.component.mjs +3 -1
  149. package/esm2022/context-dashboard/context-dashboard.component.mjs +4 -4
  150. package/esm2022/context-dashboard/context-dashboard.model.mjs +1 -1
  151. package/esm2022/context-dashboard/context-dashboard.service.mjs +47 -21
  152. package/esm2022/context-dashboard/dashboard-detail.component.mjs +8 -16
  153. package/esm2022/context-dashboard/dashboard-detail.service.mjs +13 -6
  154. package/esm2022/context-dashboard/dashboard-settings/dashboard-general-settings.component.mjs +3 -3
  155. package/esm2022/context-dashboard/dashboard-settings/typed-dashboard-settings.component.mjs +32 -11
  156. package/esm2022/core/action-bar/action-bar-item.component.mjs +3 -3
  157. package/esm2022/core/action-bar/action-bar.component.mjs +3 -3
  158. package/esm2022/core/action-bar/action-bar.module.mjs +16 -5
  159. package/esm2022/core/bootstrap/bootstrap.component.mjs +21 -16
  160. package/esm2022/core/common/aggregation/aggregation.model.mjs +46 -0
  161. package/esm2022/core/common/aggregation/aggregation.service.mjs +34 -0
  162. package/esm2022/core/common/humanize-app-name.model.mjs +2 -2
  163. package/esm2022/core/common/humanize-app-name.pipe.mjs +2 -2
  164. package/esm2022/core/common/index.mjs +5 -1
  165. package/esm2022/core/common/inter-app.service.mjs +76 -0
  166. package/esm2022/core/common/interval-based-reload.abstract.mjs +110 -0
  167. package/esm2022/core/countdown-interval/countdown-interval.component.mjs +3 -3
  168. package/esm2022/core/dashboard/dashboard-child.component.mjs +6 -5
  169. package/esm2022/core/dashboard/dashboard.module.mjs +22 -4
  170. package/esm2022/core/dashboard/index.mjs +4 -1
  171. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.mjs +101 -0
  172. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.mjs +50 -0
  173. package/esm2022/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.mjs +7 -0
  174. package/esm2022/core/dashboard/widget-auto-refresh-context/index.mjs +8 -0
  175. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.mjs +18 -0
  176. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.mjs +127 -0
  177. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.mjs +5 -0
  178. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.mjs +233 -0
  179. package/esm2022/core/dashboard/widget-change-event.model.mjs +1 -1
  180. package/esm2022/core/dashboard/widgets-dashboard.component.mjs +35 -30
  181. package/esm2022/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.mjs +4 -4
  182. package/esm2022/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.mjs +2 -2
  183. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-helper.service.mjs +3 -2
  184. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.mjs +5 -5
  185. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-query.service.mjs +7 -4
  186. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +37 -36
  187. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.model.mjs +1 -72
  188. package/esm2022/core/date-time-picker/date-time-picker.component.mjs +9 -3
  189. package/esm2022/core/header/header.module.mjs +7 -5
  190. package/esm2022/core/header/title/title.component.mjs +3 -3
  191. package/esm2022/core/i18n/cached-locale-dictionary.service.mjs +1 -1
  192. package/esm2022/core/i18n/i18n.module.mjs +7 -14
  193. package/esm2022/core/i18n/index.mjs +3 -2
  194. package/esm2022/core/i18n/translate.parser.mjs +2 -2
  195. package/esm2022/core/i18n/translation-loader.service.mjs +132 -0
  196. package/esm2022/core/i18n/translation-utils.mjs +24 -0
  197. package/esm2022/core/list-display-switch/list-display-switch.component.mjs +3 -3
  198. package/esm2022/core/plugins/plugins-resolve.service.mjs +12 -37
  199. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.mjs +13 -6
  200. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +22 -5
  201. package/esm2022/datapoint-selector/datapoint-selection-list/datapoint-selection-list.component.mjs +3 -3
  202. package/esm2022/datapoint-selector/datapoint-selection.model.mjs +1 -1
  203. package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +3 -3
  204. package/esm2022/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.mjs +5 -0
  205. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +407 -0
  206. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.mjs +207 -0
  207. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.mjs +467 -0
  208. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.mjs +187 -0
  209. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.mjs +27 -0
  210. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.mjs +41 -0
  211. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.mjs +23 -0
  212. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.mjs +42 -0
  213. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.mjs +120 -0
  214. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.mjs +282 -0
  215. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.mjs +76 -0
  216. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.mjs +46 -0
  217. package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +42 -0
  218. package/esm2022/datapoints-export-selector/datapoints-export-selector.model.mjs +43 -0
  219. package/esm2022/datapoints-export-selector/index.mjs +15 -0
  220. package/esm2022/device-list/add-smart-group.component.mjs +4 -3
  221. package/esm2022/device-list/device-list.module.mjs +22 -4
  222. package/esm2022/interval-picker/c8y-ngx-components-interval-picker.mjs +5 -0
  223. package/esm2022/interval-picker/index.mjs +3 -0
  224. package/esm2022/interval-picker/interval-picker.component.mjs +68 -0
  225. package/esm2022/interval-picker/interval-picker.model.mjs +47 -0
  226. package/esm2022/map/cluster-map.component.mjs +41 -13
  227. package/esm2022/map/map-status.component.mjs +6 -5
  228. package/esm2022/map/map.component.mjs +9 -5
  229. package/esm2022/map/map.model.mjs +1 -1
  230. package/esm2022/translation-editor/c8y-ngx-components-translation-editor.mjs +5 -0
  231. package/esm2022/translation-editor/data/c8y-ngx-components-translation-editor-data.mjs +5 -0
  232. package/esm2022/translation-editor/data/index.mjs +2 -0
  233. package/esm2022/translation-editor/data/translation-store.service.mjs +175 -0
  234. package/esm2022/translation-editor/index.mjs +10 -0
  235. package/esm2022/translation-editor/lazy/add-translation-modal/add-translation-modal.component.mjs +70 -0
  236. package/esm2022/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.mjs +5 -0
  237. package/esm2022/translation-editor/lazy/index.mjs +2 -0
  238. package/esm2022/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.mjs +53 -0
  239. package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +124 -0
  240. package/esm2022/translation-editor/translation-editor-naviagtor-factory.service.mjs +31 -0
  241. package/esm2022/widgets/cockpit/index.mjs +4 -2
  242. package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
  243. package/esm2022/widgets/definitions/alarms/alarm-list/index.mjs +6 -2
  244. package/esm2022/widgets/definitions/alarms/all-critical-alarms/index.mjs +6 -2
  245. package/esm2022/widgets/definitions/alarms/recent-alarms/index.mjs +6 -2
  246. package/esm2022/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +5 -0
  247. package/esm2022/widgets/definitions/datapoints-table/index.mjs +34 -0
  248. package/esm2022/widgets/definitions/index.mjs +2 -1
  249. package/esm2022/widgets/definitions/map/index.mjs +4 -2
  250. package/esm2022/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.mjs +29 -15
  251. package/esm2022/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.mjs +57 -25
  252. package/esm2022/widgets/implementations/alarms/alarm-list-widget.model.mjs +2 -1
  253. package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +19 -21
  254. package/esm2022/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +5 -0
  255. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +383 -0
  256. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.mjs +124 -0
  257. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.mjs +191 -0
  258. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.mjs +36 -0
  259. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.mjs +45 -0
  260. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +116 -0
  261. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.mjs +116 -0
  262. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.mjs +43 -0
  263. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.mjs +282 -0
  264. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.mjs +430 -0
  265. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.mjs +75 -0
  266. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-widget.model.mjs +76 -0
  267. package/esm2022/widgets/implementations/datapoints-table/datapoints-table.service.mjs +52 -0
  268. package/esm2022/widgets/implementations/datapoints-table/date-range-picker.component.mjs +68 -0
  269. package/esm2022/widgets/implementations/datapoints-table/index.mjs +10 -0
  270. package/esm2022/widgets/implementations/map/map-widget-config.component.mjs +19 -11
  271. package/esm2022/widgets/implementations/map/map-widget.component.mjs +20 -2
  272. package/esm2022/widgets/implementations/map/map-widget.model.mjs +1 -1
  273. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +5 -5
  274. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
  275. package/fesm2022/c8y-ngx-components-alarms.mjs +189 -31
  276. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  277. package/fesm2022/c8y-ngx-components-branding-shared-data.mjs +23 -0
  278. package/fesm2022/c8y-ngx-components-branding-shared-data.mjs.map +1 -1
  279. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +2 -0
  280. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
  281. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +135 -91
  282. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  283. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +37 -13
  284. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  285. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +1928 -0
  286. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -0
  287. package/fesm2022/c8y-ngx-components-device-list.mjs +24 -5
  288. package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
  289. package/fesm2022/c8y-ngx-components-interval-picker.mjs +120 -0
  290. package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -0
  291. package/fesm2022/c8y-ngx-components-map.mjs +52 -19
  292. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  293. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +181 -0
  294. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs.map +1 -0
  295. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +236 -0
  296. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -0
  297. package/fesm2022/c8y-ngx-components-translation-editor.mjs +46 -0
  298. package/fesm2022/c8y-ngx-components-translation-editor.mjs.map +1 -0
  299. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
  300. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
  301. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs +3 -1
  302. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs.map +1 -1
  303. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs +5 -1
  304. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
  305. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs +5 -1
  306. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs.map +1 -1
  307. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs +5 -1
  308. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
  309. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +41 -0
  310. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -0
  311. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs +3 -1
  312. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
  313. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +1 -0
  314. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  315. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +101 -58
  316. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  317. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +1967 -0
  318. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -0
  319. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +37 -11
  320. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  321. package/fesm2022/c8y-ngx-components.mjs +5093 -4369
  322. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  323. package/interval-picker/c8y-ngx-components-interval-picker.d.ts.map +1 -0
  324. package/interval-picker/index.d.ts +3 -0
  325. package/interval-picker/index.d.ts.map +1 -0
  326. package/{core/dashboard/wiget-time-context/interval-picker → interval-picker}/interval-picker.component.d.ts +10 -2
  327. package/interval-picker/interval-picker.component.d.ts.map +1 -0
  328. package/interval-picker/interval-picker.model.d.ts +15 -0
  329. package/interval-picker/interval-picker.model.d.ts.map +1 -0
  330. package/locales/de.po +289 -18
  331. package/locales/en.po +12 -0
  332. package/locales/en_US.po +3 -0
  333. package/locales/es.po +253 -18
  334. package/locales/fr.po +253 -18
  335. package/locales/ja_JP.po +282 -18
  336. package/locales/locales.pot +266 -21
  337. package/locales/nl.po +253 -18
  338. package/locales/pl.po +253 -18
  339. package/locales/pt_BR.po +253 -18
  340. package/map/cluster-map.component.d.ts +8 -3
  341. package/map/cluster-map.component.d.ts.map +1 -1
  342. package/map/map-status.component.d.ts +0 -3
  343. package/map/map-status.component.d.ts.map +1 -1
  344. package/map/map.component.d.ts +4 -2
  345. package/map/map.component.d.ts.map +1 -1
  346. package/map/map.model.d.ts +2 -1
  347. package/map/map.model.d.ts.map +1 -1
  348. package/package.json +1 -1
  349. package/translation-editor/c8y-ngx-components-translation-editor.d.ts.map +1 -0
  350. package/translation-editor/data/c8y-ngx-components-translation-editor-data.d.ts.map +1 -0
  351. package/translation-editor/data/index.d.ts +2 -0
  352. package/translation-editor/data/index.d.ts.map +1 -0
  353. package/translation-editor/data/translation-store.service.d.ts +61 -0
  354. package/translation-editor/data/translation-store.service.d.ts.map +1 -0
  355. package/translation-editor/index.d.ts +2 -0
  356. package/translation-editor/index.d.ts.map +1 -0
  357. package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts +30 -0
  358. package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts.map +1 -0
  359. package/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.d.ts.map +1 -0
  360. package/translation-editor/lazy/index.d.ts +2 -0
  361. package/translation-editor/lazy/index.d.ts.map +1 -0
  362. package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts +22 -0
  363. package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts.map +1 -0
  364. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts +34 -0
  365. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts.map +1 -0
  366. package/translation-editor/translation-editor-naviagtor-factory.service.d.ts +11 -0
  367. package/translation-editor/translation-editor-naviagtor-factory.service.d.ts.map +1 -0
  368. package/widgets/cockpit/index.d.ts +13 -0
  369. package/widgets/cockpit/index.d.ts.map +1 -1
  370. package/widgets/cockpit-exports/index.d.ts +6 -0
  371. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  372. package/widgets/definitions/alarms/alarm-list/index.d.ts +2 -0
  373. package/widgets/definitions/alarms/alarm-list/index.d.ts.map +1 -1
  374. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts +2 -0
  375. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts.map +1 -1
  376. package/widgets/definitions/alarms/recent-alarms/index.d.ts +2 -0
  377. package/widgets/definitions/alarms/recent-alarms/index.d.ts.map +1 -1
  378. package/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.d.ts.map +1 -0
  379. package/widgets/definitions/datapoints-table/index.d.ts +14 -0
  380. package/widgets/definitions/datapoints-table/index.d.ts.map +1 -0
  381. package/widgets/definitions/index.d.ts +1 -0
  382. package/widgets/definitions/index.d.ts.map +1 -1
  383. package/widgets/definitions/map/index.d.ts +2 -1
  384. package/widgets/definitions/map/index.d.ts.map +1 -1
  385. package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts +5 -9
  386. package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts.map +1 -1
  387. package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts +17 -10
  388. package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts.map +1 -1
  389. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts +5 -1
  390. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts.map +1 -1
  391. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +5 -11
  392. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
  393. package/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.d.ts.map +1 -0
  394. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts +129 -0
  395. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -0
  396. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts +56 -0
  397. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts.map +1 -0
  398. package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts +88 -0
  399. package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts.map +1 -0
  400. package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts +19 -0
  401. package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts.map +1 -0
  402. package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts +26 -0
  403. package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts.map +1 -0
  404. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts +63 -0
  405. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -0
  406. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts +38 -0
  407. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts.map +1 -0
  408. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts +13 -0
  409. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts.map +1 -0
  410. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts +123 -0
  411. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -0
  412. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts +196 -0
  413. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts.map +1 -0
  414. package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts +41 -0
  415. package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts.map +1 -0
  416. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts +175 -0
  417. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -0
  418. package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts +12 -0
  419. package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts.map +1 -0
  420. package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts +34 -0
  421. package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts.map +1 -0
  422. package/widgets/implementations/datapoints-table/index.d.ts +10 -0
  423. package/widgets/implementations/datapoints-table/index.d.ts.map +1 -0
  424. package/widgets/implementations/map/map-widget-config.component.d.ts +4 -4
  425. package/widgets/implementations/map/map-widget-config.component.d.ts.map +1 -1
  426. package/widgets/implementations/map/map-widget.component.d.ts +8 -3
  427. package/widgets/implementations/map/map-widget.component.d.ts.map +1 -1
  428. package/widgets/implementations/map/map-widget.model.d.ts +4 -3
  429. package/widgets/implementations/map/map-widget.model.d.ts.map +1 -1
  430. package/core/dashboard/wiget-time-context/interval-picker/interval-picker.component.d.ts.map +0 -1
  431. package/core/i18n/translate.loader.d.ts +0 -31
  432. package/core/i18n/translate.loader.d.ts.map +0 -1
  433. package/esm2022/core/dashboard/wiget-time-context/interval-picker/interval-picker.component.mjs +0 -55
  434. package/esm2022/core/i18n/translate.loader.mjs +0 -71
@@ -0,0 +1,116 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { CommonModule, DocsModule, DynamicComponentAlert, DynamicComponentAlertAggregator, DynamicComponentModule, ListGroupModule, gettext } from '@c8y/ngx-components';
3
+ import { AdjustAggregatedTimeRangePipe } from '../adjust-aggregated-time-range.pipe';
4
+ import { ApplyRangeClassPipe } from '../apply-range-class.pipe';
5
+ import { ColumnTitlePipe } from '../column-title.pipe';
6
+ import { VirtualScrollListenerDirective } from '../virtual-scroll-listener.directive';
7
+ import { DynamicColumnDirective } from './dynamic-column.directive';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@c8y/ngx-components";
10
+ import * as i2 from "@angular/common";
11
+ export class DatapointsTableComponent {
12
+ constructor() {
13
+ this.isScrolling = new EventEmitter();
14
+ this.hasNoPermissionsToReadAnyMeasurement = false;
15
+ this.missingAllPermissionsAlert = new DynamicComponentAlertAggregator();
16
+ /**
17
+ * Default fraction size format for numbers with decimal places.
18
+ */
19
+ this.fractionSize = '1.2-2';
20
+ }
21
+ ngOnInit() {
22
+ if (typeof this.decimalPlaces === 'number' && !Number.isNaN(this.decimalPlaces)) {
23
+ this.fractionSize = `1.${this.decimalPlaces}-${this.decimalPlaces}`;
24
+ }
25
+ }
26
+ ngOnChanges() {
27
+ if (!this.seriesWithoutPermissionToReadCount) {
28
+ return;
29
+ }
30
+ this.missingAllPermissionsAlert.clear();
31
+ this.handleNoPermissionErrorMessage();
32
+ }
33
+ onListScrolled() {
34
+ this.isScrolling.emit(true);
35
+ }
36
+ onListScrolledToTop() {
37
+ this.isScrolling.emit(false);
38
+ }
39
+ getRangeValues(row) {
40
+ return {
41
+ yellowRangeMin: row.yellowRangeMin,
42
+ yellowRangeMax: row.yellowRangeMax,
43
+ redRangeMin: row.redRangeMin,
44
+ redRangeMax: row.redRangeMax
45
+ };
46
+ }
47
+ /**
48
+ * Determines the fraction size format based on whether the number is an integer or has decimal places.
49
+ *
50
+ * @param value - The number to be formatted.
51
+ * @returns Returns '1.0-0' if the number is an integer, otherwise returns the current fraction size.
52
+ */
53
+ getFractionSize(value) {
54
+ return value % 1 === 0 ? '1.0-0' : this.fractionSize;
55
+ }
56
+ handleNoPermissionErrorMessage() {
57
+ this.hasNoPermissionsToReadAnyMeasurement =
58
+ this.seriesWithoutPermissionToReadCount === this.devicesColumnHeaders.length;
59
+ if (this.hasNoPermissionsToReadAnyMeasurement) {
60
+ this.showMessageForMissingPermissionsForAllSeries();
61
+ }
62
+ }
63
+ showMessageForMissingPermissionsForAllSeries() {
64
+ this.missingAllPermissionsAlert.addAlerts(new DynamicComponentAlert({
65
+ allowHtml: true,
66
+ text: gettext(`<p>To view data, you must meet at least one of these criteria:</p>
67
+ <ul>
68
+ <li>
69
+ Have
70
+ <b>READ permission for "Measurements" permission type</b>
71
+ (either as a global role or for the specific source)
72
+ </li>
73
+ <li>
74
+ Be the
75
+ <b>owner of the source</b>
76
+ you want to export data from
77
+ </li>
78
+ </ul>
79
+ <p>Don't meet these requirements? Contact your system administrator for assistance.</p>`),
80
+ type: 'system'
81
+ }));
82
+ }
83
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
84
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DatapointsTableComponent, isStandalone: true, selector: "c8y-datapoints-table", inputs: { aggregationType: "aggregationType", datapointsTableItems: "datapointsTableItems", devicesColumnHeaders: "devicesColumnHeaders", decimalPlaces: "decimalPlaces", hasMultipleDatapoints: "hasMultipleDatapoints", isLoading: "isLoading", seriesWithoutPermissionToReadCount: "seriesWithoutPermissionToReadCount" }, outputs: { isScrolling: "isScrolling" }, host: { classAttribute: "d-col flex-grow" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"c8y-cq-440\">\n <div\n class=\"hidden-xs c8y-list__item c8y-list--timeline hidden-cq\"\n [ngClass]=\"{ 'separator-top-bottom': devicesColumnHeaders.length > 0 }\"\n >\n <div class=\"d-flex container-fluid\">\n <div class=\"c8y-list--timeline__item__date\"></div>\n <div class=\"c8y-list__item__block flex-grow min-width-0\">\n <div class=\"c8y-list__item__body\">\n <div class=\"d-flex row\">\n <ng-container *ngIf=\"hasMultipleDatapoints\">\n <div\n class=\"min-width-0\"\n [title]=\"'Device' | translate\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n >\n <span class=\"text-medium text-truncate\">\n {{ 'Device' | translate }}\n </span>\n </div>\n </ng-container>\n <!-- Data points column headers -->\n <ng-container *ngFor=\"let header of devicesColumnHeaders\">\n <div\n class=\"min-width-0\"\n title=\"{{ header | columnTitle }}\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n >\n <span class=\"text-medium text-truncate\">{{ header.label }} {{ header.unit }}</span>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<!-- The record list -->\n<ng-container *ngIf=\"!isLoading; else loading\">\n <ng-container *ngIf=\"!hasNoPermissionsToReadAnyMeasurement; else missingAllPermissions\">\n <ng-container *ngIf=\"datapointsTableItems.length; else emptyState\">\n <c8y-list-group\n class=\"p-t-8 flex-grow c8y-cq-440\"\n c8yVirtualScrollListener\n (scrolled)=\"onListScrolled()\"\n (scrolledToTop)=\"onListScrolledToTop()\"\n >\n <c8y-li-timeline\n *c8yFor=\"\n let tableItem of { data: datapointsTableItems, res: null };\n enableVirtualScroll: true;\n virtualScrollElementSize: 40;\n virtualScrollStrategy: 'fixed'\n \"\n >\n {{ tableItem.dateAndTime | c8yDate: 'mediumDate' }}\n {{\n tableItem.dateAndTime\n | c8yDate: 'mediumTime'\n | adjustAggregatedTimeRange: aggregationType\n }}\n <c8y-li>\n <c8y-li-body>\n <div class=\"d-flex row\">\n <div\n class=\"min-width-0\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngIf=\"devicesColumnHeaders.length > 1\"\n [attr.data-label]=\"'Device' | translate\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ tableItem.deviceName }}\"\n >\n {{ tableItem.deviceName }}\n </div>\n </div>\n <!-- Data point value row cells -->\n <ng-container *ngFor=\"let row of tableItem.rowItems\">\n <ng-container *ngIf=\"row !== null; else emptyRowContent\">\n <ng-container [ngSwitch]=\"row.renderType\">\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n *ngSwitchCase=\"'min'\"\n [attr.data-label]=\"row.label\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </div>\n </div>\n <div\n class=\"col-md-4\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n *ngSwitchCase=\"'max'\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </div>\n </div>\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngSwitchCase=\"'area'\"\n >\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n ...\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.max ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n </div>\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngSwitchDefault\n >\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #emptyRowContent>\n <div [c8yDynamicColumn]=\"devicesColumnHeaders.length\"></div>\n </ng-template>\n </ng-container>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n</ng-container>\n<ng-template #loading>\n <c8y-loading></c8y-loading>\n</ng-template>\n<ng-template #emptyState>\n <div class=\"p-relative p-l-24\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-alert-idle'\"\n [title]=\"'No data to display.' | translate\"\n [horizontal]=\"true\"\n data-cy=\"datapoints-table-list--empty-state\"\n >\n <p c8y-guide-docs>\n <small translate>\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#data-point-table\">\n user documentation\n </a>\n .\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n</ng-template>\n<ng-template #missingAllPermissions>\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 d-flex\">\n <div class=\"center-block\">\n <c8y-dynamic-component-alerts\n [alerts]=\"missingAllPermissionsAlert\"\n ></c8y-dynamic-component-alerts>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "pipe", type: AdjustAggregatedTimeRangePipe, name: "adjustAggregatedTimeRange" }, { kind: "pipe", type: ApplyRangeClassPipe, name: "applyRangeClass" }, { kind: "pipe", type: ColumnTitlePipe, name: "columnTitle" }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: i1.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }, { kind: "directive", type: i1.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "pipe", type: i1.DatePipe, name: "c8yDate" }, { kind: "component", type: i1.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "ngmodule", type: DocsModule }, { kind: "directive", type: i1.GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: i1.GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "directive", type: DynamicColumnDirective, selector: "[c8yDynamicColumn]", inputs: ["c8yDynamicColumn"] }, { kind: "ngmodule", type: DynamicComponentModule }, { kind: "component", type: i1.DynamicComponentAlertsComponent, selector: "c8y-dynamic-component-alerts", inputs: ["alerts"] }, { kind: "ngmodule", type: ListGroupModule }, { kind: "component", type: i1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i1.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i1.ListItemTimelineComponent, selector: "c8y-list-item-timeline, c8y-li-timeline" }, { kind: "directive", type: VirtualScrollListenerDirective, selector: "[c8yVirtualScrollListener]", inputs: ["scrollThreshold"], outputs: ["scrolled", "scrolledToTop"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
85
+ }
86
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsTableComponent, decorators: [{
87
+ type: Component,
88
+ args: [{ selector: 'c8y-datapoints-table', host: { class: 'd-col flex-grow' }, standalone: true, imports: [
89
+ AdjustAggregatedTimeRangePipe,
90
+ ApplyRangeClassPipe,
91
+ ColumnTitlePipe,
92
+ CommonModule,
93
+ DocsModule,
94
+ DynamicColumnDirective,
95
+ DynamicComponentModule,
96
+ ListGroupModule,
97
+ VirtualScrollListenerDirective
98
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"c8y-cq-440\">\n <div\n class=\"hidden-xs c8y-list__item c8y-list--timeline hidden-cq\"\n [ngClass]=\"{ 'separator-top-bottom': devicesColumnHeaders.length > 0 }\"\n >\n <div class=\"d-flex container-fluid\">\n <div class=\"c8y-list--timeline__item__date\"></div>\n <div class=\"c8y-list__item__block flex-grow min-width-0\">\n <div class=\"c8y-list__item__body\">\n <div class=\"d-flex row\">\n <ng-container *ngIf=\"hasMultipleDatapoints\">\n <div\n class=\"min-width-0\"\n [title]=\"'Device' | translate\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n >\n <span class=\"text-medium text-truncate\">\n {{ 'Device' | translate }}\n </span>\n </div>\n </ng-container>\n <!-- Data points column headers -->\n <ng-container *ngFor=\"let header of devicesColumnHeaders\">\n <div\n class=\"min-width-0\"\n title=\"{{ header | columnTitle }}\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n >\n <span class=\"text-medium text-truncate\">{{ header.label }} {{ header.unit }}</span>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<!-- The record list -->\n<ng-container *ngIf=\"!isLoading; else loading\">\n <ng-container *ngIf=\"!hasNoPermissionsToReadAnyMeasurement; else missingAllPermissions\">\n <ng-container *ngIf=\"datapointsTableItems.length; else emptyState\">\n <c8y-list-group\n class=\"p-t-8 flex-grow c8y-cq-440\"\n c8yVirtualScrollListener\n (scrolled)=\"onListScrolled()\"\n (scrolledToTop)=\"onListScrolledToTop()\"\n >\n <c8y-li-timeline\n *c8yFor=\"\n let tableItem of { data: datapointsTableItems, res: null };\n enableVirtualScroll: true;\n virtualScrollElementSize: 40;\n virtualScrollStrategy: 'fixed'\n \"\n >\n {{ tableItem.dateAndTime | c8yDate: 'mediumDate' }}\n {{\n tableItem.dateAndTime\n | c8yDate: 'mediumTime'\n | adjustAggregatedTimeRange: aggregationType\n }}\n <c8y-li>\n <c8y-li-body>\n <div class=\"d-flex row\">\n <div\n class=\"min-width-0\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngIf=\"devicesColumnHeaders.length > 1\"\n [attr.data-label]=\"'Device' | translate\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ tableItem.deviceName }}\"\n >\n {{ tableItem.deviceName }}\n </div>\n </div>\n <!-- Data point value row cells -->\n <ng-container *ngFor=\"let row of tableItem.rowItems\">\n <ng-container *ngIf=\"row !== null; else emptyRowContent\">\n <ng-container [ngSwitch]=\"row.renderType\">\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n *ngSwitchCase=\"'min'\"\n [attr.data-label]=\"row.label\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </div>\n </div>\n <div\n class=\"col-md-4\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n *ngSwitchCase=\"'max'\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </div>\n </div>\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngSwitchCase=\"'area'\"\n >\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n ...\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.max ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n </div>\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngSwitchDefault\n >\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #emptyRowContent>\n <div [c8yDynamicColumn]=\"devicesColumnHeaders.length\"></div>\n </ng-template>\n </ng-container>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n</ng-container>\n<ng-template #loading>\n <c8y-loading></c8y-loading>\n</ng-template>\n<ng-template #emptyState>\n <div class=\"p-relative p-l-24\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-alert-idle'\"\n [title]=\"'No data to display.' | translate\"\n [horizontal]=\"true\"\n data-cy=\"datapoints-table-list--empty-state\"\n >\n <p c8y-guide-docs>\n <small translate>\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#data-point-table\">\n user documentation\n </a>\n .\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n</ng-template>\n<ng-template #missingAllPermissions>\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 d-flex\">\n <div class=\"center-block\">\n <c8y-dynamic-component-alerts\n [alerts]=\"missingAllPermissionsAlert\"\n ></c8y-dynamic-component-alerts>\n </div>\n </div>\n</ng-template>\n" }]
99
+ }], propDecorators: { aggregationType: [{
100
+ type: Input
101
+ }], datapointsTableItems: [{
102
+ type: Input
103
+ }], devicesColumnHeaders: [{
104
+ type: Input
105
+ }], decimalPlaces: [{
106
+ type: Input
107
+ }], hasMultipleDatapoints: [{
108
+ type: Input
109
+ }], isLoading: [{
110
+ type: Input
111
+ }], seriesWithoutPermissionToReadCount: [{
112
+ type: Input
113
+ }], isScrolling: [{
114
+ type: Output
115
+ }] } });
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9kYXRhcG9pbnRzLXRhYmxlL2RhdGFwb2ludHMtdGFibGUtdmlldy9kYXRhcG9pbnRzLXRhYmxlL2RhdGFwb2ludHMtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxZQUFZLEVBQ1osVUFBVSxFQUNWLHFCQUFxQixFQUNyQiwrQkFBK0IsRUFDL0Isc0JBQXNCLEVBQ3RCLGVBQWUsRUFDZixPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQU83QixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUF1QnBFLE1BQU0sT0FBTyx3QkFBd0I7SUFyQnJDO1FBNkJZLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUVwRCx5Q0FBb0MsR0FBRyxLQUFLLENBQUM7UUFDN0MsK0JBQTBC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QkFBakIsS0FBSztnQkFDRyxrQ0FBa0M7c0JBQTFDLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBZ2dyZWdhdGlvbk9wdGlvbixcbiAgQ29tbW9uTW9kdWxlLFxuICBEb2NzTW9kdWxlLFxuICBEeW5hbWljQ29tcG9uZW50QWxlcnQsXG4gIER5bmFtaWNDb21wb25lbnRBbGVydEFnZ3JlZ2F0b3IsXG4gIER5bmFtaWNDb21wb25lbnRNb2R1bGUsXG4gIExpc3RHcm91cE1vZHVsZSxcbiAgZ2V0dGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEtQSURldGFpbHMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2RhdGFwb2ludC1zZWxlY3Rvcic7XG5pbXBvcnQge1xuICBDb2xvclJhbmdlQm91bmRhcmllcyxcbiAgVGFibGVDb2x1bW5IZWFkZXIsXG4gIEdyb3VwZWREYXRhcG9pbnRUYWJsZUl0ZW1cbn0gZnJvbSAnLi4vLi4vZGF0YXBvaW50cy10YWJsZS13aWRnZXQubW9kZWwnO1xuaW1wb3J0IHsgQWRqdXN0QWdncmVnYXRlZFRpbWVSYW5nZVBpcGUgfSBmcm9tICcuLi9hZGp1c3QtYWdncmVnYXRlZC10aW1lLXJhbmdlLnBpcGUnO1xuaW1wb3J0IHsgQXBwbHlSYW5nZUNsYXNzUGlwZSB9IGZyb20gJy4uL2FwcGx5LXJhbmdlLWNsYXNzLnBpcGUnO1xuaW1wb3J0IHsgQ29sdW1uVGl0bGVQaXBlIH0gZnJvbSAnLi4vY29sdW1uLXRpdGxlLnBpcGUnO1xuaW1wb3J0IHsgVmlydHVhbFNjcm9sbExpc3RlbmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vdmlydHVhbC1zY3JvbGwtbGlzdGVuZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IER5bmFtaWNDb2x1bW5EaXJlY3RpdmUgfSBmcm9tICcuL2R5bmFtaWMtY29sdW1uLmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXRhcG9pbnRzLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGFwb2ludHMtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnZC1jb2wgZmxleC1ncm93JyB9LFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQWRqdXN0QWdncmVnYXRlZFRpbWVSYW5nZVBpcGUsXG4gICAgQXBwbHlSYW5nZUNsYXNzUGlwZSxcbiAgICBDb2x1bW5UaXRsZVBpcGUsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIERvY3NNb2R1bGUsXG4gICAgRHluYW1pY0NvbHVtbkRpcmVjdGl2ZSxcbiAgICBEeW5hbWljQ29tcG9uZW50TW9kdWxlLFxuICAgIExpc3RHcm91cE1vZHVsZSxcbiAgICBWaXJ0dWFsU2Nyb2xsTGlzdGVuZXJEaXJlY3RpdmVcbiAgXSxcbiAgLyoqXG4gICAqIFVzZWQgdG8gcHJldmVudCAnZ2V0UmFuZ2VWYWx1ZXMnIGZyb20gYmVpbmcgY2FsbGVkIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUuXG4gICAqL1xuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhcG9pbnRzVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGFnZ3JlZ2F0aW9uVHlwZTogQWdncmVnYXRpb25PcHRpb247XG4gIEBJbnB1dCgpIGRhdGFwb2ludHNUYWJsZUl0ZW1zOiBHcm91cGVkRGF0YXBvaW50VGFibGVJdGVtW107XG4gIEBJbnB1dCgpIGRldmljZXNDb2x1bW5IZWFkZXJzOiBUYWJsZUNvbHVtbkhlYWRlcltdO1xuICBASW5wdXQoKSBkZWNpbWFsUGxhY2VzOiBudW1iZXI7XG4gIEBJbnB1dCgpIGhhc011bHRpcGxlRGF0YXBvaW50czogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNMb2FkaW5nOiBib29sZWFuO1xuICBASW5wdXQoKSBzZXJpZXNXaXRob3V0UGVybWlzc2lvblRvUmVhZENvdW50OiBudW1iZXI7XG4gIEBPdXRwdXQoKSBpc1Njcm9sbGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBoYXNOb1Blcm1pc3Npb25zVG9SZWFkQW55TWVhc3VyZW1lbnQgPSBmYWxzZTtcbiAgbWlzc2luZ0FsbFBlcm1pc3Npb25zQWxlcnQgPSBuZXcgRHluYW1pY0NvbXBvbmVudEFsZXJ0QWdncmVnYXRvcigpO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGZyYWN0aW9uIHNpemUgZm9ybWF0IGZvciBudW1iZXJzIHdpdGggZGVjaW1hbCBwbGFjZXMuXG4gICAqL1xuICBwcml2YXRlIGZyYWN0aW9uU2l6ZSA9ICcxLjItMic7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmRlY2ltYWxQbGFjZXMgPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4odGhpcy5kZWNpbWFsUGxhY2VzKSkge1xuICAgICAgdGhpcy5mcmFjdGlvblNpemUgPSBgMS4ke3RoaXMuZGVjaW1hbFBsYWNlc30tJHt0aGlzLmRlY2ltYWxQbGFjZXN9YDtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VyaWVzV2l0aG91dFBlcm1pc3Npb25Ub1JlYWRDb3VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWlzc2luZ0FsbFBlcm1pc3Npb25zQWxlcnQuY2xlYXIoKTtcbiAgICB0aGlzLmhhbmRsZU5vUGVybWlzc2lvbkVycm9yTWVzc2FnZSgpO1xuICB9XG5cbiAgb25MaXN0U2Nyb2xsZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1Njcm9sbGluZy5lbWl0KHRydWUpO1xuICB9XG5cbiAgb25MaXN0U2Nyb2xsZWRUb1RvcCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzU2Nyb2xsaW5nLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgZ2V0UmFuZ2VWYWx1ZXMocm93OiBLUElEZXRhaWxzKTogQ29sb3JSYW5nZUJvdW5kYXJpZXMge1xuICAgIHJldHVybiB7XG4gICAgICB5ZWxsb3dSYW5nZU1pbjogcm93LnllbGxvd1JhbmdlTWluLFxuICAgICAgeWVsbG93UmFuZ2VNYXg6IHJvdy55ZWxsb3dSYW5nZU1heCxcbiAgICAgIHJlZFJhbmdlTWluOiByb3cucmVkUmFuZ2VNaW4sXG4gICAgICByZWRSYW5nZU1heDogcm93LnJlZFJhbmdlTWF4XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBmcmFjdGlvbiBzaXplIGZvcm1hdCBiYXNlZCBvbiB3aGV0aGVyIHRoZSBudW1iZXIgaXMgYW4gaW50ZWdlciBvciBoYXMgZGVjaW1hbCBwbGFjZXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBudW1iZXIgdG8gYmUgZm9ybWF0dGVkLlxuICAgKiBAcmV0dXJucyBSZXR1cm5zICcxLjAtMCcgaWYgdGhlIG51bWJlciBpcyBhbiBpbnRlZ2VyLCBvdGhlcndpc2UgcmV0dXJucyB0aGUgY3VycmVudCBmcmFjdGlvbiBzaXplLlxuICAgKi9cbiAgZ2V0RnJhY3Rpb25TaXplKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWx1ZSAlIDEgPT09IDAgPyAnMS4wLTAnIDogdGhpcy5mcmFjdGlvblNpemU7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5vUGVybWlzc2lvbkVycm9yTWVzc2FnZSgpOiB2b2lkIHtcbiAgICB0aGlzLmhhc05vUGVybWlzc2lvbnNUb1JlYWRBbnlNZWFzdXJlbWVudCA9XG4gICAgICB0aGlzLnNlcmllc1dpdGhvdXRQZXJtaXNzaW9uVG9SZWFkQ291bnQgPT09IHRoaXMuZGV2aWNlc0NvbHVtbkhlYWRlcnMubGVuZ3RoO1xuXG4gICAgaWYgKHRoaXMuaGFzTm9QZXJtaXNzaW9uc1RvUmVhZEFueU1lYXN1cmVtZW50KSB7XG4gICAgICB0aGlzLnNob3dNZXNzYWdlRm9yTWlzc2luZ1Blcm1pc3Npb25zRm9yQWxsU2VyaWVzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93TWVzc2FnZUZvck1pc3NpbmdQZXJtaXNzaW9uc0ZvckFsbFNlcmllcygpOiB2b2lkIHtcbiAgICB0aGlzLm1pc3NpbmdBbGxQZXJtaXNzaW9uc0FsZXJ0LmFkZEFsZXJ0cyhcbiAgICAgIG5ldyBEeW5hbWljQ29tcG9uZW50QWxlcnQoe1xuICAgICAgICBhbGxvd0h0bWw6IHRydWUsXG4gICAgICAgIHRleHQ6IGdldHRleHQoYDxwPlRvIHZpZXcgZGF0YSwgeW91IG11c3QgbWVldCBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgY3JpdGVyaWE6PC9wPlxuICAgICAgICA8dWw+XG4gICAgICAgICAgPGxpPlxuICAgICAgICAgICAgSGF2ZVxuICAgICAgICAgICAgPGI+UkVBRCBwZXJtaXNzaW9uIGZvciBcIk1lYXN1cmVtZW50c1wiIHBlcm1pc3Npb24gdHlwZTwvYj5cbiAgICAgICAgICAgIChlaXRoZXIgYXMgYSBnbG9iYWwgcm9sZSBvciBmb3IgdGhlIHNwZWNpZmljIHNvdXJjZSlcbiAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgIEJlIHRoZVxuICAgICAgICAgICAgPGI+b3duZXIgb2YgdGhlIHNvdXJjZTwvYj5cbiAgICAgICAgICAgIHlvdSB3YW50IHRvIGV4cG9ydCBkYXRhIGZyb21cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgICA8cD5Eb24ndCBtZWV0IHRoZXNlIHJlcXVpcmVtZW50cz8gQ29udGFjdCB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGZvciBhc3Npc3RhbmNlLjwvcD5gKSxcbiAgICAgICAgdHlwZTogJ3N5c3RlbSdcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImM4eS1jcS00NDBcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiaGlkZGVuLXhzIGM4eS1saXN0X19pdGVtIGM4eS1saXN0LS10aW1lbGluZSBoaWRkZW4tY3FcIlxuICAgIFtuZ0NsYXNzXT1cInsgJ3NlcGFyYXRvci10b3AtYm90dG9tJzogZGV2aWNlc0NvbHVtbkhlYWRlcnMubGVuZ3RoID4gMCB9XCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggY29udGFpbmVyLWZsdWlkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3QtLXRpbWVsaW5lX19pdGVtX19kYXRlXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2Jsb2NrIGZsZXgtZ3JvdyBtaW4td2lkdGgtMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2JvZHlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHJvd1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc011bHRpcGxlRGF0YXBvaW50c1wiPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtaW4td2lkdGgtMFwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIidEZXZpY2UnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbYzh5RHluYW1pY0NvbHVtbl09XCJkZXZpY2VzQ29sdW1uSGVhZGVycy5sZW5ndGhcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW1lZGl1bSB0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnRGV2aWNlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwhLS0gRGF0YSBwb2ludHMgY29sdW1uIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBoZWFkZXIgb2YgZGV2aWNlc0NvbHVtbkhlYWRlcnNcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWluLXdpZHRoLTBcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgaGVhZGVyIHwgY29sdW1uVGl0bGUgfX1cIlxuICAgICAgICAgICAgICAgIFtjOHlEeW5hbWljQ29sdW1uXT1cImRldmljZXNDb2x1bW5IZWFkZXJzLmxlbmd0aFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbWVkaXVtIHRleHQtdHJ1bmNhdGVcIj57eyBoZWFkZXIubGFiZWwgfX0ge3sgaGVhZGVyLnVuaXQgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG48IS0tIFRoZSByZWNvcmQgbGlzdCAtLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkaW5nOyBlbHNlIGxvYWRpbmdcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoYXNOb1Blcm1pc3Npb25zVG9SZWFkQW55TWVhc3VyZW1lbnQ7IGVsc2UgbWlzc2luZ0FsbFBlcm1pc3Npb25zXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGFwb2ludHNUYWJsZUl0ZW1zLmxlbmd0aDsgZWxzZSBlbXB0eVN0YXRlXCI+XG4gICAgICA8Yzh5LWxpc3QtZ3JvdXBcbiAgICAgICAgY2xhc3M9XCJwLXQtOCBmbGV4LWdyb3cgYzh5LWNxLTQ0MFwiXG4gICAgICAgIGM4eVZpcnR1YWxTY3JvbGxMaXN0ZW5lclxuICAgICAgICAoc2Nyb2xsZWQpPVwib25MaXN0U2Nyb2xsZWQoKVwiXG4gICAgICAgIChzY3JvbGxlZFRvVG9wKT1cIm9uTGlzdFNjcm9sbGVkVG9Ub3AoKVwiXG4gICAgICA+XG4gICAgICAgIDxjOHktbGktdGltZWxpbmVcbiAgICAgICAgICAqYzh5Rm9yPVwiXG4gICAgICAgICAgICBsZXQgdGFibGVJdGVtIG9mIHsgZGF0YTogZGF0YXBvaW50c1RhYmxlSXRlbXMsIHJlczogbnVsbCB9O1xuICAgICAgICAgICAgZW5hYmxlVmlydHVhbFNjcm9sbDogdHJ1ZTtcbiAgICAgICAgICAgIHZpcnR1YWxTY3JvbGxFbGVtZW50U2l6ZTogNDA7XG4gICAgICAgICAgICB2aXJ0dWFsU2Nyb2xsU3RyYXRlZ3k6ICdmaXhlZCdcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgdGFibGVJdGVtLmRhdGVBbmRUaW1lIHwgYzh5RGF0ZTogJ21lZGl1bURhdGUnIH19XG4gICAgICAgICAge3tcbiAgICAgICAgICAgIHRhYmxlSXRlbS5kYXRlQW5kVGltZVxuICAgICAgICAgICAgICB8IGM4eURhdGU6ICdtZWRpdW1UaW1lJ1xuICAgICAgICAgICAgICB8IGFkanVzdEFnZ3JlZ2F0ZWRUaW1lUmFuZ2U6IGFnZ3JlZ2F0aW9uVHlwZVxuICAgICAgICAgIH19XG4gICAgICAgICAgPGM4eS1saT5cbiAgICAgICAgICAgIDxjOHktbGktYm9keT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCByb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm1pbi13aWR0aC0wXCJcbiAgICAgICAgICAgICAgICAgIFtjOHlEeW5hbWljQ29sdW1uXT1cImRldmljZXNDb2x1bW5IZWFkZXJzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImRldmljZXNDb2x1bW5IZWFkZXJzLmxlbmd0aCA+IDFcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1sYWJlbF09XCInRGV2aWNlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IHRhYmxlSXRlbS5kZXZpY2VOYW1lIH19XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgdGFibGVJdGVtLmRldmljZU5hbWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gRGF0YSBwb2ludCB2YWx1ZSByb3cgY2VsbHMgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93IG9mIHRhYmxlSXRlbS5yb3dJdGVtc1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvdyAhPT0gbnVsbDsgZWxzZSBlbXB0eVJvd0NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicm93LnJlbmRlclR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBbYzh5RHluYW1pY0NvbHVtbl09XCJkZXZpY2VzQ29sdW1uSGVhZGVycy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LnZhbHVlLm1pbiA/PyBudWxsIHwgYXBwbHlSYW5nZUNsYXNzOiBnZXRSYW5nZVZhbHVlcyhyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInbWluJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWxhYmVsXT1cInJvdy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IHJvdy52YWx1ZS5taW4gPz8gJycgfCBudW1iZXI6IGdldEZyYWN0aW9uU2l6ZShyb3cudmFsdWUubWluKSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJvdy52YWx1ZS5taW4gPz8gJycgfCBudW1iZXI6IGdldEZyYWN0aW9uU2l6ZShyb3cudmFsdWUubWluKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbWQtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3cudmFsdWUubWluID8/IG51bGwgfCBhcHBseVJhbmdlQ2xhc3M6IGdldFJhbmdlVmFsdWVzKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidtYXgnXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgcm93LnZhbHVlLm1pbiA/PyAnJyB8IG51bWJlcjogZ2V0RnJhY3Rpb25TaXplKHJvdy52YWx1ZS5taW4pIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcm93LnZhbHVlLm1pbiA/PyAnJyB8IG51bWJlcjogZ2V0RnJhY3Rpb25TaXplKHJvdy52YWx1ZS5taW4pIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBbYzh5RHluYW1pY0NvbHVtbl09XCJkZXZpY2VzQ29sdW1uSGVhZGVycy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidhcmVhJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyByb3cudmFsdWUubWluID8/ICcnIHwgbnVtYmVyOiBnZXRGcmFjdGlvblNpemUocm93LnZhbHVlLm1pbikgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3cudmFsdWUubWluID8/IG51bGwgfCBhcHBseVJhbmdlQ2xhc3M6IGdldFJhbmdlVmFsdWVzKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByb3cudmFsdWUubWluID8/ICcnIHwgbnVtYmVyOiBnZXRGcmFjdGlvblNpemUocm93LnZhbHVlLm1pbikgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyByb3cudmFsdWUubWluID8/ICcnIHwgbnVtYmVyOiBnZXRGcmFjdGlvblNpemUocm93LnZhbHVlLm1pbikgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3cudmFsdWUubWF4ID8/IG51bGwgfCBhcHBseVJhbmdlQ2xhc3M6IGdldFJhbmdlVmFsdWVzKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByb3cudmFsdWUubWluID8/ICcnIHwgbnVtYmVyOiBnZXRGcmFjdGlvblNpemUocm93LnZhbHVlLm1pbikgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBbYzh5RHluYW1pY0NvbHVtbl09XCJkZXZpY2VzQ29sdW1uSGVhZGVycy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgcm93LnZhbHVlLm1pbiA/PyAnJyB8IG51bWJlcjogZ2V0RnJhY3Rpb25TaXplKHJvdy52YWx1ZS5taW4pIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LnZhbHVlLm1pbiA/PyBudWxsIHwgYXBwbHlSYW5nZUNsYXNzOiBnZXRSYW5nZVZhbHVlcyhyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcm93LnZhbHVlLm1pbiA/PyAnJyB8IG51bWJlcjogZ2V0RnJhY3Rpb25TaXplKHJvdy52YWx1ZS5taW4pIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2VtcHR5Um93Q29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbYzh5RHluYW1pY0NvbHVtbl09XCJkZXZpY2VzQ29sdW1uSGVhZGVycy5sZW5ndGhcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9jOHktbGktYm9keT5cbiAgICAgICAgICA8L2M4eS1saT5cbiAgICAgICAgPC9jOHktbGktdGltZWxpbmU+XG4gICAgICA8L2M4eS1saXN0LWdyb3VwPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuPG5nLXRlbXBsYXRlICNsb2FkaW5nPlxuICA8Yzh5LWxvYWRpbmc+PC9jOHktbG9hZGluZz5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2VtcHR5U3RhdGU+XG4gIDxkaXYgY2xhc3M9XCJwLXJlbGF0aXZlIHAtbC0yNFwiPlxuICAgIDxjOHktdWktZW1wdHktc3RhdGVcbiAgICAgIFtpY29uXT1cIidjOHktYWxlcnQtaWRsZSdcIlxuICAgICAgW3RpdGxlXT1cIidObyBkYXRhIHRvIGRpc3BsYXkuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbaG9yaXpvbnRhbF09XCJ0cnVlXCJcbiAgICAgIGRhdGEtY3k9XCJkYXRhcG9pbnRzLXRhYmxlLWxpc3QtLWVtcHR5LXN0YXRlXCJcbiAgICA+XG4gICAgICA8cCBjOHktZ3VpZGUtZG9jcz5cbiAgICAgICAgPHNtYWxsIHRyYW5zbGF0ZT5cbiAgICAgICAgICBGaW5kIG91dCBtb3JlIGluIHRoZVxuICAgICAgICAgIDxhIGM4eS1ndWlkZS1ocmVmPVwiL2RvY3MvY29ja3BpdC93aWRnZXRzLWNvbGxlY3Rpb24vI2RhdGEtcG9pbnQtdGFibGVcIj5cbiAgICAgICAgICAgIHVzZXIgZG9jdW1lbnRhdGlvblxuICAgICAgICAgIDwvYT5cbiAgICAgICAgICAuXG4gICAgICAgIDwvc21hbGw+XG4gICAgICA8L3A+XG4gICAgPC9jOHktdWktZW1wdHktc3RhdGU+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjbWlzc2luZ0FsbFBlcm1pc3Npb25zPlxuICA8ZGl2IGNsYXNzPVwicC10LTI0IHAtci0xNiBwLWwtMTYgcC1iLTE2IGQtZmxleFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjZW50ZXItYmxvY2tcIj5cbiAgICAgIDxjOHktZHluYW1pYy1jb21wb25lbnQtYWxlcnRzXG4gICAgICAgIFthbGVydHNdPVwibWlzc2luZ0FsbFBlcm1pc3Npb25zQWxlcnRcIlxuICAgICAgPjwvYzh5LWR5bmFtaWMtY29tcG9uZW50LWFsZXJ0cz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -0,0 +1,43 @@
1
+ import { Directive, ElementRef, Input, Renderer2 } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class DynamicColumnDirective {
4
+ constructor(el, renderer) {
5
+ this.el = el;
6
+ this.renderer = renderer;
7
+ }
8
+ ngOnInit() {
9
+ this.updateColumnClass();
10
+ }
11
+ updateColumnClass() {
12
+ let className = '';
13
+ switch (this.numberOfColumns) {
14
+ case 1:
15
+ className = 'col-md-12';
16
+ break;
17
+ case 2:
18
+ className = 'col-md-6';
19
+ break;
20
+ default:
21
+ if (this.numberOfColumns >= 3) {
22
+ className = 'col-md-3';
23
+ }
24
+ break;
25
+ }
26
+ if (className) {
27
+ this.renderer.addClass(this.el.nativeElement, className);
28
+ }
29
+ }
30
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DynamicColumnDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
31
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.9", type: DynamicColumnDirective, isStandalone: true, selector: "[c8yDynamicColumn]", inputs: { numberOfColumns: ["c8yDynamicColumn", "numberOfColumns"] }, ngImport: i0 }); }
32
+ }
33
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DynamicColumnDirective, decorators: [{
34
+ type: Directive,
35
+ args: [{
36
+ selector: '[c8yDynamicColumn]',
37
+ standalone: true
38
+ }]
39
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { numberOfColumns: [{
40
+ type: Input,
41
+ args: ['c8yDynamicColumn']
42
+ }] } });
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1jb2x1bW4uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvZGF0YXBvaW50cy10YWJsZS9keW5hbWljLWNvbHVtbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFNaEYsTUFBTSxPQUFPLHNCQUFzQjtJQUdqQyxZQUNVLEVBQWMsRUFDZCxRQUFtQjtRQURuQixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBVztJQUMxQixDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLFFBQVEsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzdCLEtBQUssQ0FBQztnQkFDSixTQUFTLEdBQUcsV0FBVyxDQUFDO2dCQUN4QixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLFNBQVMsR0FBRyxVQUFVLENBQUM7Z0JBQ3ZCLE1BQU07WUFDUjtnQkFDRSxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQzlCLFNBQVMsR0FBRyxVQUFVLENBQUM7Z0JBQ3pCLENBQUM7Z0JBQ0QsTUFBTTtRQUNWLENBQUM7UUFFRCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0QsQ0FBQztJQUNILENBQUM7OEdBL0JVLHNCQUFzQjtrR0FBdEIsc0JBQXNCOzsyRkFBdEIsc0JBQXNCO2tCQUpsQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjt1R0FFNEIsZUFBZTtzQkFBekMsS0FBSzt1QkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbYzh5RHluYW1pY0NvbHVtbl0nLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNDb2x1bW5EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoJ2M4eUR5bmFtaWNDb2x1bW4nKSBudW1iZXJPZkNvbHVtbnM6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMlxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVDb2x1bW5DbGFzcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5DbGFzcygpIHtcbiAgICBsZXQgY2xhc3NOYW1lID0gJyc7XG4gICAgc3dpdGNoICh0aGlzLm51bWJlck9mQ29sdW1ucykge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBjbGFzc05hbWUgPSAnY29sLW1kLTEyJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGNsYXNzTmFtZSA9ICdjb2wtbWQtNic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHRoaXMubnVtYmVyT2ZDb2x1bW5zID49IDMpIHtcbiAgICAgICAgICBjbGFzc05hbWUgPSAnY29sLW1kLTMnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCBjbGFzc05hbWUpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,282 @@
1
+ import { Component, Input, signal } from '@angular/core';
2
+ import { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';
3
+ import { CommonModule, DismissAlertStrategy, DynamicComponentAlert, gettext } from '@c8y/ngx-components';
4
+ import { TranslateService } from '@ngx-translate/core';
5
+ import { TIME_RANGE_INTERVAL_UNITS_VALUES, dateRangeValidator } from '@c8y/ngx-components/datapoints-export-selector';
6
+ import { Subject, debounceTime } from 'rxjs';
7
+ import { DEFAULT_COUNTDOWN_VALUE } from '../datapoints-table-widget.model';
8
+ import { DatapointsTableService } from '../datapoints-table.service';
9
+ import { DateRangePickerComponent } from '../date-range-picker.component';
10
+ import { DatapointsReloadComponent } from './datapoints-reload/datapoints-reload.component';
11
+ import { DatapointsTableViewService } from './datapoints-table-view.service';
12
+ import { DatapointsTableComponent } from './datapoints-table/datapoints-table.component';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "../datapoints-table.service";
15
+ import * as i2 from "./datapoints-table-view.service";
16
+ import * as i3 from "@angular/forms";
17
+ import * as i4 from "@ngx-translate/core";
18
+ import * as i5 from "@angular/common";
19
+ export class DatapointsTableViewWidgetComponent {
20
+ constructor(datapointsTableConfigService, datapointsTableViewService, formBuilder, translateService) {
21
+ this.datapointsTableConfigService = datapointsTableConfigService;
22
+ this.datapointsTableViewService = datapointsTableViewService;
23
+ this.formBuilder = formBuilder;
24
+ this.translateService = translateService;
25
+ /**
26
+ * Represents the data points where __active property is set to true.
27
+ */
28
+ this.activeDatapoints = [];
29
+ /**
30
+ * An array of `GroupedDatapointTableItem` objects representing the datapoints table items.
31
+ * Used to populate the table with data.
32
+ */
33
+ this.datapointsTableItems = [];
34
+ this.isDisabled = false;
35
+ /**
36
+ * Indicates whether the component is in the initial request state
37
+ * where data for a table structure is being prepared.
38
+ */
39
+ this.isInitialRequest = true;
40
+ /**
41
+ * Current isLoading state. Indicates whether the data is being loaded.
42
+ */
43
+ this.isLoading = signal(true);
44
+ this.isExportModalOpen = false;
45
+ this.isScrolling = signal(false);
46
+ this.scrollingSubject$ = new Subject();
47
+ /**
48
+ * Indicates if the alert has already been displayed and can be dismissed.
49
+ * The message is only displayed when a component is initialized.
50
+ */
51
+ this.isMissingAnyPermissionAlertShown = false;
52
+ }
53
+ async ngOnInit() {
54
+ // Will be uncommented in MTM-61920
55
+ // if (this.config.widgetInstanceGlobalTimeContext) {
56
+ // this.handleGlobalTimeContextSettings();
57
+ // }
58
+ // Condition will be removed in MTM-61920
59
+ if (this.config.widgetInstanceGlobalTimeContext) {
60
+ this.config.widgetInstanceGlobalTimeContext = false;
61
+ }
62
+ this.setScrollingSubscription();
63
+ const isLegacyWidgetRealtimeActive = this.config.realtime &&
64
+ !this.config.decimalPlaces &&
65
+ !this.config.refreshInterval &&
66
+ !this.config.isAutoRefreshEnabled;
67
+ if (isLegacyWidgetRealtimeActive) {
68
+ this.setDefaultRefreshRelatedProperties();
69
+ }
70
+ if (!this.config.interval) {
71
+ /**
72
+ * Fix for legacy widget bug.
73
+ * When new legacy widget is created and saved
74
+ * then interval value in a config would stay null until interval is manually changed
75
+ * and saved again.
76
+ * Bug was introduced post 1018.0.164 version of UI.
77
+ */
78
+ this.config.interval = 'hours';
79
+ }
80
+ if (this.config.interval !== TIME_RANGE_INTERVAL_UNITS_VALUES.custom) {
81
+ this.recalculateIntervalToMatchFromNowDate();
82
+ }
83
+ if (this.config.displayDateSelection) {
84
+ this.prepareDateRangeForm();
85
+ }
86
+ await this.prepareTableData();
87
+ // TODO: temporarily commented out, will be enabled when MTM-59689 is integrated
88
+ // this.exportConfig = {
89
+ // aggregation: this.config.aggregation,
90
+ // dateFrom: this.config.dateFrom,
91
+ // dateTo: this.config.dateTo,
92
+ // datapointDetails: this.activeDatapoints.map(({ __target, fragment, series }) => ({
93
+ // deviceName: __target.name,
94
+ // source: __target.id,
95
+ // valueFragmentSeries: series,
96
+ // valueFragmentType: fragment
97
+ // }))
98
+ // };
99
+ }
100
+ ngOnDestroy() {
101
+ if (this.subscription) {
102
+ this.subscription.unsubscribe();
103
+ }
104
+ }
105
+ onDateChange(data) {
106
+ if (this.formGroup.invalid) {
107
+ return;
108
+ }
109
+ if (data.dateFrom) {
110
+ this.config.dateFrom = data.dateFrom;
111
+ }
112
+ if (data.dateTo) {
113
+ this.config.dateTo = data.dateTo;
114
+ }
115
+ this.prepareTableData();
116
+ // TODO: temporarily commented out, will be enabled when MTM-59689 is integrated
117
+ // TODO-2: each manual/auto list reload should update exports config date range to sync current state of view with
118
+ // inital export config
119
+ // this.exportConfig.dateFrom = this.config.dateFrom;
120
+ // this.exportConfig.dateTo = this.config.dateTo;
121
+ }
122
+ onExportModalOpen(isOpened) {
123
+ this.isExportModalOpen = isOpened;
124
+ }
125
+ onScrolling(value) {
126
+ this.scrollingSubject$.next(value);
127
+ }
128
+ async onCountdownEnded() {
129
+ const dateRange = this.datapointsTableViewService.prepareTimeRange(this.config.interval, this.config.dateFrom, this.config.dateTo);
130
+ this.config.dateFrom = dateRange.dateFrom;
131
+ this.config.dateTo = dateRange.dateTo;
132
+ await this.prepareTableData(false);
133
+ this.onScrolling(false);
134
+ }
135
+ handleGlobalTimeContextSettings() {
136
+ this.config.dateFrom = this.datapointsTableViewService.adjustDate(this.config.date[0], 0, false);
137
+ this.config.dateTo = this.datapointsTableViewService.adjustDate(this.config.date[1], 0, false);
138
+ if (this.config.realtime) {
139
+ this.setDefaultRefreshRelatedProperties();
140
+ }
141
+ else {
142
+ this.config.isAutoRefreshEnabled = false;
143
+ }
144
+ }
145
+ /**
146
+ * Sets up the scrolling subscription.
147
+ *
148
+ * Ensures similar UX as in the alarms countdown-pause logic.
149
+ */
150
+ setScrollingSubscription() {
151
+ this.subscription = this.scrollingSubject$
152
+ .pipe(debounceTime(300))
153
+ .subscribe(value => this.isScrolling.set(value));
154
+ }
155
+ setDefaultRefreshRelatedProperties() {
156
+ this.config.isAutoRefreshEnabled = true;
157
+ this.config.refreshInterval = DEFAULT_COUNTDOWN_VALUE;
158
+ }
159
+ recalculateIntervalToMatchFromNowDate() {
160
+ if (this.config.widgetInstanceGlobalTimeContext) {
161
+ return;
162
+ }
163
+ const { dateFrom, dateTo } = this.datapointsTableConfigService.calculateDateRange(this.config.interval);
164
+ this.config.dateFrom = dateFrom;
165
+ this.config.dateTo = dateTo;
166
+ }
167
+ prepareDateRangeForm() {
168
+ this.formGroup = this.createForm();
169
+ }
170
+ createForm() {
171
+ return this.formBuilder.group({
172
+ dateFrom: new FormControl(this.config.dateFrom),
173
+ dateTo: new FormControl(this.config.dateTo)
174
+ }, { validators: dateRangeValidator });
175
+ }
176
+ /**
177
+ * Prepares the table data by:
178
+ * - filtering out inactive data points,
179
+ * - checking if there are multiple devices as a source of data points,
180
+ * - getting the column headers for devices,
181
+ * - getting the series data for active data points (API call),
182
+ * - preparing data points with values list,
183
+ * - mapping data points with values to list items,
184
+ * - grouping data points by date and device,
185
+ * - sorting data by date descending.
186
+ *
187
+ * @param roundSeconds - Whether to round the seconds or not.
188
+ * If true, the seconds will be rounded to 0.
189
+ * If false, the seconds will be displayed as they are.
190
+ */
191
+ async prepareTableData(roundSeconds = true) {
192
+ this.isLoading.set(true);
193
+ if (this.isInitialRequest) {
194
+ this.activeDatapoints = this.datapointsTableViewService.filterOutInactiveDatapoints(this.config.datapoints);
195
+ this.hasMultipleDatapoints = this.datapointsTableViewService.hasMultipleDatapoints(this.activeDatapoints);
196
+ this.devicesColumnHeaders = this.datapointsTableViewService.getColumnHeaders(this.activeDatapoints);
197
+ this.isInitialRequest = false;
198
+ }
199
+ const activeDatapointsIdsWithSeries = this.datapointsTableViewService.groupSeriesByDeviceId(this.activeDatapoints);
200
+ const activeDatapointsSeriesData = await this.getActiveDatapointsSeriesDataMap(activeDatapointsIdsWithSeries, this.config, roundSeconds);
201
+ this.seriesWithoutPermissionToRead =
202
+ this.datapointsTableViewService.getSeriesWithoutPermissionToRead(activeDatapointsSeriesData, activeDatapointsIdsWithSeries);
203
+ if (!this.isMissingAnyPermissionAlertShown &&
204
+ this.seriesWithoutPermissionToRead?.length > 0 &&
205
+ activeDatapointsSeriesData?.size) {
206
+ this.handleMissingAnyPermissionErrorMessage();
207
+ this.isMissingAnyPermissionAlertShown = true;
208
+ }
209
+ if (!activeDatapointsSeriesData) {
210
+ return;
211
+ }
212
+ this.datapointsWithValues = this.datapointsTableViewService.getDatapointsWithValues(this.activeDatapoints, activeDatapointsSeriesData);
213
+ const datapointsListItems = this.datapointsTableViewService.mapDatapointsWithValuesToList(this.datapointsWithValues);
214
+ const groupedDatapointsListItems = this.datapointsTableViewService.groupByDateAndDevice(datapointsListItems, this.devicesColumnHeaders);
215
+ this.datapointsTableItems = this.datapointsTableViewService.sortDataByDateDescending(groupedDatapointsListItems);
216
+ this.isLoading.set(false);
217
+ }
218
+ /**
219
+ * Retrieves the active data points series data and returns it as a map.
220
+ *
221
+ * It's a wrapper method with try-catch block.
222
+ *
223
+ * @param datapointsIdsWithSeries - A map of data point IDs with their associated series.
224
+ * @param config - The configuration of the data points table.
225
+ * @param roundSeconds - Whether to round the seconds or not.
226
+ * If true, the seconds will be rounded to 0.
227
+ * If false, the seconds will be displayed as they are.
228
+ * @returns A Promise that resolves to a Map object with data point IDs as keys and DataObject as values.
229
+ */
230
+ async getActiveDatapointsSeriesDataMap(datapointsIdsWithSeries, config, roundSeconds) {
231
+ try {
232
+ return await this.datapointsTableViewService.getAllActiveSeriesDataMap(datapointsIdsWithSeries, config, roundSeconds);
233
+ }
234
+ catch (error) {
235
+ this.isDisabled = true;
236
+ this.isLoading.set(false);
237
+ }
238
+ }
239
+ handleMissingAnyPermissionErrorMessage() {
240
+ this.alerts.setAlertGroupDismissStrategy('system', DismissAlertStrategy.TEMPORARY);
241
+ this.alerts.addAlerts(new DynamicComponentAlert({
242
+ allowHtml: true,
243
+ text: this.getMissingPermissionsMessage(),
244
+ type: 'system'
245
+ }));
246
+ }
247
+ getMissingPermissionsMessage() {
248
+ const baseMessage = this.translateService.instant(gettext(`You don't have permissions to read the following series:`));
249
+ const formattedList = this.seriesWithoutPermissionToRead
250
+ .map(datapoint => `<li>${datapoint.key.valueOf()}_${datapoint.value}</li>`)
251
+ .join('');
252
+ return `
253
+ <div>
254
+ <p>${baseMessage}</p>
255
+ <ul>
256
+ ${formattedList}
257
+ </ul>
258
+ <p><strong>Note:</strong> The name convention for each list item is: <code>[source]_[fragment.series]</code></p>
259
+ </div>
260
+ `;
261
+ }
262
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsTableViewWidgetComponent, deps: [{ token: i1.DatapointsTableService }, { token: i2.DatapointsTableViewService }, { token: i3.FormBuilder }, { token: i4.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
263
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DatapointsTableViewWidgetComponent, isStandalone: true, selector: "c8y-datapoints-table-view", inputs: { config: "config" }, host: { classAttribute: "d-col fit-h" }, ngImport: i0, template: "<div class=\"d-flex gap-16 p-l-16 p-r-16 flex-wrap\">\n <ng-container *ngIf=\"config.displayDateSelection\">\n <form [formGroup]=\"formGroup\">\n <c8y-date-range-picker\n class=\"d-contents\"\n [isEmittingDateChange]=\"true\"\n [showLabel]=\"true\"\n (updatedDate)=\"onDateChange($event)\"\n ></c8y-date-range-picker>\n </form>\n </ng-container>\n <!-- TODO: temporarily commented out, will be enabled when MTM-59689 is integrated -->\n <!-- <c8y-datapoints-export-selector\n class=\"d-contents\"\n [exportConfig]=\"exportConfig\"\n (isExportModalOpen)=\"onExportModalOpen($event)\"\n ></c8y-datapoints-export-selector> -->\n <!-- TODO: below div is just a temp fix, it will be removed when MTM-59689 is integrated -->\n <div class=\"input-group p-t-4 p-b-4 max-width-fit m-l-auto\"></div>\n <ng-container *ngIf=\"config.datapoints.length > 0\">\n <c8y-datapoints-reload\n class=\"d-contents\"\n [isAutoRefreshEnabled]=\"config.isAutoRefreshEnabled\"\n [refreshInterval]=\"config.refreshInterval\"\n [isDisabled]=\"isDisabled\"\n [isLoading]=\"isLoading\"\n [isScrolling]=\"isScrolling()\"\n [isExportModalOpen]=\"isExportModalOpen\"\n (onCountdownEnded)=\"onCountdownEnded()\"\n ></c8y-datapoints-reload>\n </ng-container>\n</div>\n<ng-container *ngIf=\"devicesColumnHeaders\">\n <c8y-datapoints-table\n [aggregationType]=\"config.aggregation\"\n [datapointsTableItems]=\"datapointsTableItems\"\n [decimalPlaces]=\"config.decimalPlaces\"\n [devicesColumnHeaders]=\"devicesColumnHeaders\"\n [hasMultipleDatapoints]=\"hasMultipleDatapoints\"\n [isLoading]=\"isLoading()\"\n [seriesWithoutPermissionToReadCount]=\"seriesWithoutPermissionToRead?.length\"\n (isScrolling)=\"onScrolling($event)\"\n ></c8y-datapoints-table>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type:
264
+ // TODO: temporarily commented out, will be enabled when MTM-59689 is integrated
265
+ // DatapointsExportSelectorComponent,
266
+ DatapointsReloadComponent, selector: "c8y-datapoints-reload", inputs: ["isAutoRefreshEnabled", "isDisabled", "isLoading", "isScrolling", "isExportModalOpen", "refreshInterval"], outputs: ["onCountdownEnded"] }, { kind: "component", type: DatapointsTableComponent, selector: "c8y-datapoints-table", inputs: ["aggregationType", "datapointsTableItems", "devicesColumnHeaders", "decimalPlaces", "hasMultipleDatapoints", "isLoading", "seriesWithoutPermissionToReadCount"], outputs: ["isScrolling"] }, { kind: "component", type: DateRangePickerComponent, selector: "c8y-date-range-picker", inputs: ["isEmittingDateChange", "showLabel"], outputs: ["updatedDate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] }); }
267
+ }
268
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsTableViewWidgetComponent, decorators: [{
269
+ type: Component,
270
+ args: [{ selector: 'c8y-datapoints-table-view', host: { class: 'd-col fit-h' }, standalone: true, imports: [
271
+ CommonModule,
272
+ // TODO: temporarily commented out, will be enabled when MTM-59689 is integrated
273
+ // DatapointsExportSelectorComponent,
274
+ DatapointsReloadComponent,
275
+ DatapointsTableComponent,
276
+ DateRangePickerComponent,
277
+ ReactiveFormsModule
278
+ ], template: "<div class=\"d-flex gap-16 p-l-16 p-r-16 flex-wrap\">\n <ng-container *ngIf=\"config.displayDateSelection\">\n <form [formGroup]=\"formGroup\">\n <c8y-date-range-picker\n class=\"d-contents\"\n [isEmittingDateChange]=\"true\"\n [showLabel]=\"true\"\n (updatedDate)=\"onDateChange($event)\"\n ></c8y-date-range-picker>\n </form>\n </ng-container>\n <!-- TODO: temporarily commented out, will be enabled when MTM-59689 is integrated -->\n <!-- <c8y-datapoints-export-selector\n class=\"d-contents\"\n [exportConfig]=\"exportConfig\"\n (isExportModalOpen)=\"onExportModalOpen($event)\"\n ></c8y-datapoints-export-selector> -->\n <!-- TODO: below div is just a temp fix, it will be removed when MTM-59689 is integrated -->\n <div class=\"input-group p-t-4 p-b-4 max-width-fit m-l-auto\"></div>\n <ng-container *ngIf=\"config.datapoints.length > 0\">\n <c8y-datapoints-reload\n class=\"d-contents\"\n [isAutoRefreshEnabled]=\"config.isAutoRefreshEnabled\"\n [refreshInterval]=\"config.refreshInterval\"\n [isDisabled]=\"isDisabled\"\n [isLoading]=\"isLoading\"\n [isScrolling]=\"isScrolling()\"\n [isExportModalOpen]=\"isExportModalOpen\"\n (onCountdownEnded)=\"onCountdownEnded()\"\n ></c8y-datapoints-reload>\n </ng-container>\n</div>\n<ng-container *ngIf=\"devicesColumnHeaders\">\n <c8y-datapoints-table\n [aggregationType]=\"config.aggregation\"\n [datapointsTableItems]=\"datapointsTableItems\"\n [decimalPlaces]=\"config.decimalPlaces\"\n [devicesColumnHeaders]=\"devicesColumnHeaders\"\n [hasMultipleDatapoints]=\"hasMultipleDatapoints\"\n [isLoading]=\"isLoading()\"\n [seriesWithoutPermissionToReadCount]=\"seriesWithoutPermissionToRead?.length\"\n (isScrolling)=\"onScrolling($event)\"\n ></c8y-datapoints-table>\n</ng-container>\n" }]
279
+ }], ctorParameters: () => [{ type: i1.DatapointsTableService }, { type: i2.DatapointsTableViewService }, { type: i3.FormBuilder }, { type: i4.TranslateService }], propDecorators: { config: [{
280
+ type: Input
281
+ }] } });
282
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy10YWJsZS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2RhdGFwb2ludHMtdGFibGUvZGF0YXBvaW50cy10YWJsZS12aWV3L2RhdGFwb2ludHMtdGFibGUtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9kYXRhcG9pbnRzLXRhYmxlL2RhdGFwb2ludHMtdGFibGUtdmlldy9kYXRhcG9pbnRzLXRhYmxlLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFDTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUVyQixPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQU92RCxPQUFPLEVBR0wsZ0NBQWdDLEVBQ2hDLGtCQUFrQixFQUNuQixNQUFNLGdEQUFnRCxDQUFDO0FBQ3hELE9BQU8sRUFBRSxPQUFPLEVBQWdCLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRCxPQUFPLEVBQ0wsdUJBQXVCLEVBTXhCLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDNUYsT0FBTyxF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O2FBQzFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVaLE9BQU87O2FBRUUsV0FBVzs7WUFFWixhQUFhOzs7O0tBSXBCLENBQUM7SUFDSixDQUFDOzhHQXpYVSxrQ0FBa0M7a0dBQWxDLGtDQUFrQyw0SkNyRC9DLGsxREE0Q0EsMkNEQUksWUFBWTtnQkFDWixnRkFBZ0Y7Z0JBQ2hGLHFDQUFxQztnQkFDckMseUJBQXlCLHFOQUN6Qix3QkFBd0IscVFBQ3hCLHdCQUF3QiwwSUFDeEIsbUJBQW1COzsyRkFHVixrQ0FBa0M7a0JBZjlDLFNBQVM7K0JBQ0UsMkJBQTJCLFFBRS9CLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxjQUNsQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixnRkFBZ0Y7d0JBQ2hGLHFDQUFxQzt3QkFDckMseUJBQXlCO3dCQUN6Qix3QkFBd0I7d0JBQ3hCLHdCQUF3Qjt3QkFDeEIsbUJBQW1CO3FCQUNwQjs2TEFNUSxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBDb21tb25Nb2R1bGUsXG4gIERpc21pc3NBbGVydFN0cmF0ZWd5LFxuICBEeW5hbWljQ29tcG9uZW50QWxlcnQsXG4gIER5bmFtaWNDb21wb25lbnRBbGVydEFnZ3JlZ2F0b3IsXG4gIGdldHRleHRcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBLUElEZXRhaWxzIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9kYXRhcG9pbnQtc2VsZWN0b3InO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuLy8gVE9ETzogdGVtcG9yYXJpbHkgY29tbWVudGVkIG91dCwgd2lsbCBiZSBlbmFibGVkIHdoZW4gTVRNLTU5Njg5IGlzIGludGVncmF0ZWRcbi8vIGltcG9ydCB7XG4vLyAgIERhdGFwb2ludHNFeHBvcnRTZWxlY3RvckNvbXBvbmVudCxcbi8vICAgRXhwb3J0Q29uZmlnXG4vLyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3InO1xuaW1wb3J0IHsgSVNlcmllcyB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7XG4gIERhdGFwb2ludHNWYWx1ZXNEYXRhTWFwLFxuICBTb3VyY2VJZCxcbiAgVElNRV9SQU5HRV9JTlRFUlZBTF9VTklUU19WQUxVRVMsXG4gIGRhdGVSYW5nZVZhbGlkYXRvclxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBERUZBVUxUX0NPVU5URE9XTl9WQUxVRSxcbiAgRGF0YXBvaW50VGFibGVJdGVtLFxuICBEYXRhcG9pbnRXaXRoVmFsdWVzLFxuICBEYXRhcG9pbnRzVGFibGVDb25maWcsXG4gIEdyb3VwZWREYXRhcG9pbnRUYWJsZUl0ZW0sXG4gIFRhYmxlQ29sdW1uSGVhZGVyXG59IGZyb20gJy4uL2RhdGFwb2ludHMtdGFibGUtd2lkZ2V0Lm1vZGVsJztcbmltcG9ydCB7IERhdGFwb2ludHNUYWJsZVNlcnZpY2UgfSBmcm9tICcuLi9kYXRhcG9pbnRzLXRhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGFwb2ludHNSZWxvYWRDb21wb25lbnQgfSBmcm9tICcuL2RhdGFwb2ludHMtcmVsb2FkL2RhdGFwb2ludHMtcmVsb2FkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRhcG9pbnRzVGFibGVWaWV3U2VydmljZSB9IGZyb20gJy4vZGF0YXBvaW50cy10YWJsZS12aWV3LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0YXBvaW50c1RhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhcG9pbnRzLXRhYmxlL2RhdGFwb2ludHMtdGFibGUuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWRhdGFwb2ludHMtdGFibGUtdmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhcG9pbnRzLXRhYmxlLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnZC1jb2wgZml0LWgnIH0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgLy8gVE9ETzogdGVtcG9yYXJpbHkgY29tbWVudGVkIG91dCwgd2lsbCBiZSBlbmFibGVkIHdoZW4gTVRNLTU5Njg5IGlzIGludGVncmF0ZWRcbiAgICAvLyBEYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JDb21wb25lbnQsXG4gICAgRGF0YXBvaW50c1JlbG9hZENvbXBvbmVudCxcbiAgICBEYXRhcG9pbnRzVGFibGVDb21wb25lbnQsXG4gICAgRGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50LFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRhcG9pbnRzVGFibGVWaWV3V2lkZ2V0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogIERhdGEgcG9pbnRzIHRhYmxlIHdpZGdldCBjb25maWcuXG4gICAqL1xuICBASW5wdXQoKSBjb25maWc6IERhdGFwb2ludHNUYWJsZUNvbmZpZztcbiAgLy8gY29uZmlnOiBEYXRhcG9pbnRzVGFibGVDb25maWc7XG5cbiAgYWxlcnRzOiBEeW5hbWljQ29tcG9uZW50QWxlcnRBZ2dyZWdhdG9yO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIHRoZSBkYXRhIHBvaW50cyB3aGVyZSBfX2FjdGl2ZSBwcm9wZXJ0eSBpcyBzZXQgdG8gdHJ1ZS5cbiAgICovXG4gIGFjdGl2ZURhdGFwb2ludHM6IEtQSURldGFpbHNbXSA9IFtdO1xuICAvKipcbiAgICogQW4gYXJyYXkgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgZGF0YXBvaW50cyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgKiBVc2VkIHRvIHBvcHVsYXRlIHRoZSBDU1YvRXhjZWwgZmlsZSB3aXRoIGRhdGEuXG4gICAqL1xuICBkYXRhcG9pbnRzV2l0aFZhbHVlczogRGF0YXBvaW50V2l0aFZhbHVlc1tdO1xuICAvKipcbiAgICogQW4gYXJyYXkgb2YgYEdyb3VwZWREYXRhcG9pbnRUYWJsZUl0ZW1gIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBkYXRhcG9pbnRzIHRhYmxlIGl0ZW1zLlxuICAgKiBVc2VkIHRvIHBvcHVsYXRlIHRoZSB0YWJsZSB3aXRoIGRhdGEuXG4gICAqL1xuICBkYXRhcG9pbnRzVGFibGVJdGVtczogR3JvdXBlZERhdGFwb2ludFRhYmxlSXRlbVtdID0gW107XG5cbiAgZGV2aWNlc0NvbHVtbkhlYWRlcnM6IFRhYmxlQ29sdW1uSGVhZGVyW107XG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEgY29uZmlndXJhdGlvbiBvcHRpb25zIHVzZWQgYnkgYSBjOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3IuXG4gICAqL1xuICAvLyBUT0RPOiB0ZW1wb3JhcmlseSBjb21tZW50ZWQgb3V0LCB3aWxsIGJlIGVuYWJsZWQgd2hlbiBNVE0tNTk2ODkgaXMgaW50ZWdyYXRlZFxuICAvLyBleHBvcnRDb25maWc6IEV4cG9ydENvbmZpZztcblxuICBmb3JtR3JvdXA6IFJldHVyblR5cGU8RGF0YXBvaW50c1RhYmxlVmlld1dpZGdldENvbXBvbmVudFsnY3JlYXRlRm9ybSddPjtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZGF0YSBwb2ludC5cbiAgICogSWYgaXMgdHJ1ZSwgdGhlbiBhIGNvbHVtbiAnRGV2aWNlJyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgdGFibGUuXG4gICAqL1xuICBoYXNNdWx0aXBsZURhdGFwb2ludHM6IGJvb2xlYW47XG5cbiAgaXNEaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29tcG9uZW50IGlzIGluIHRoZSBpbml0aWFsIHJlcXVlc3Qgc3RhdGVcbiAgICogd2hlcmUgZGF0YSBmb3IgYSB0YWJsZSBzdHJ1Y3R1cmUgaXMgYmVpbmcgcHJlcGFyZWQuXG4gICAqL1xuICBpc0luaXRpYWxSZXF1ZXN0ID0gdHJ1ZTtcbiAgLyoqXG4gICAqIEN1cnJlbnQgaXNMb2FkaW5nIHN0YXRlLiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBiZWluZyBsb2FkZWQuXG4gICAqL1xuICBpc0xvYWRpbmcgPSBzaWduYWwodHJ1ZSk7XG5cbiAgaXNFeHBvcnRNb2RhbE9wZW4gPSBmYWxzZTtcblxuICBpc1Njcm9sbGluZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgc2VyaWVzV2l0aG91dFBlcm1pc3Npb25Ub1JlYWQ6IHsga2V5OiBTb3VyY2VJZDsgdmFsdWU6IHN0cmluZ1tdIH1bXTtcblxuICBwcml2YXRlIHNjcm9sbGluZ1N1YmplY3QkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgYWxlcnQgaGFzIGFscmVhZHkgYmVlbiBkaXNwbGF5ZWQgYW5kIGNhbiBiZSBkaXNtaXNzZWQuXG4gICAqIFRoZSBtZXNzYWdlIGlzIG9ubHkgZGlzcGxheWVkIHdoZW4gYSBjb21wb25lbnQgaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwcml2YXRlIGlzTWlzc2luZ0FueVBlcm1pc3Npb25BbGVydFNob3duID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkYXRhcG9pbnRzVGFibGVDb25maWdTZXJ2aWNlOiBEYXRhcG9pbnRzVGFibGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0YXBvaW50c1RhYmxlVmlld1NlcnZpY2U6IERhdGFwb2ludHNUYWJsZVZpZXdTZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gV2lsbCBiZSB1bmNvbW1lbnRlZCBpbiBNVE0tNjE5MjBcbiAgICAvLyBpZiAodGhpcy5jb25maWcud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dCkge1xuICAgIC8vICAgdGhpcy5oYW5kbGVHbG9iYWxUaW1lQ29udGV4dFNldHRpbmdzKCk7XG4gICAgLy8gfVxuXG4gICAgLy8gQ29uZGl0aW9uIHdpbGwgYmUgcmVtb3ZlZCBpbiBNVE0tNjE5MjBcbiAgICBpZiAodGhpcy5jb25maWcud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dCkge1xuICAgICAgdGhpcy5jb25maWcud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Nyb2xsaW5nU3Vic2NyaXB0aW9uKCk7XG5cbiAgICBjb25zdCBpc0xlZ2FjeVdpZGdldFJlYWx0aW1lQWN0aXZlID1cbiAgICAgIHRoaXMuY29uZmlnLnJlYWx0aW1lICYmXG4gICAgICAhdGhpcy5jb25maWcuZGVjaW1hbFBsYWNlcyAmJlxuICAgICAgIXRoaXMuY29uZmlnLnJlZnJlc2hJbnRlcnZhbCAmJlxuICAgICAgIXRoaXMuY29uZmlnLmlzQXV0b1JlZnJlc2hFbmFibGVkO1xuXG4gICAgaWYgKGlzTGVnYWN5V2lkZ2V0UmVhbHRpbWVBY3RpdmUpIHtcbiAgICAgIHRoaXMuc2V0RGVmYXVsdFJlZnJlc2hSZWxhdGVkUHJvcGVydGllcygpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb25maWcuaW50ZXJ2YWwpIHtcbiAgICAgIC8qKlxuICAgICAgICogRml4IGZvciBsZWdhY3kgd2lkZ2V0IGJ1Zy5cbiAgICAgICAqIFdoZW4gbmV3IGxlZ2FjeSB3aWRnZXQgaXMgY3JlYXRlZCBhbmQgc2F2ZWRcbiAgICAgICAqIHRoZW4gaW50ZXJ2YWwgdmFsdWUgaW4gYSBjb25maWcgd291bGQgc3RheSBudWxsIHVudGlsIGludGVydmFsIGlzIG1hbnVhbGx5IGNoYW5nZWRcbiAgICAgICAqIGFuZCBzYXZlZCBhZ2Fpbi5cbiAgICAgICAqIEJ1ZyB3YXMgaW50cm9kdWNlZCBwb3N0IDEwMTguMC4xNjQgdmVyc2lvbiBvZiBVSS5cbiAgICAgICAqL1xuICAgICAgdGhpcy5jb25maWcuaW50ZXJ2YWwgPSAnaG91cnMnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5pbnRlcnZhbCAhPT0gVElNRV9SQU5HRV9JTlRFUlZBTF9VTklUU19WQUxVRVMuY3VzdG9tKSB7XG4gICAgICB0aGlzLnJlY2FsY3VsYXRlSW50ZXJ2YWxUb01hdGNoRnJvbU5vd0RhdGUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcuZGlzcGxheURhdGVTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMucHJlcGFyZURhdGVSYW5nZUZvcm0oKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnByZXBhcmVUYWJsZURhdGEoKTtcblxuICAgIC8vIFRPRE86IHRlbXBvcmFyaWx5IGNvbW1lbnRlZCBvdXQsIHdpbGwgYmUgZW5hYmxlZCB3aGVuIE1UTS01OTY4OSBpcyBpbnRlZ3JhdGVkXG4gICAgLy8gdGhpcy5leHBvcnRDb25maWcgPSB7XG4gICAgLy8gICBhZ2dyZWdhdGlvbjogdGhpcy5jb25maWcuYWdncmVnYXRpb24sXG4gICAgLy8gICBkYXRlRnJvbTogdGhpcy5jb25maWcuZGF0ZUZyb20sXG4gICAgLy8gICBkYXRlVG86IHRoaXMuY29uZmlnLmRhdGVUbyxcbiAgICAvLyAgIGRhdGFwb2ludERldGFpbHM6IHRoaXMuYWN0aXZlRGF0YXBvaW50cy5tYXAoKHsgX190YXJnZXQsIGZyYWdtZW50LCBzZXJpZXMgfSkgPT4gKHtcbiAgICAvLyAgICAgZGV2aWNlTmFtZTogX190YXJnZXQubmFtZSxcbiAgICAvLyAgICAgc291cmNlOiBfX3RhcmdldC5pZCxcbiAgICAvLyAgICAgdmFsdWVGcmFnbWVudFNlcmllczogc2VyaWVzLFxuICAgIC8vICAgICB2YWx1ZUZyYWdtZW50VHlwZTogZnJhZ21lbnRcbiAgICAvLyAgIH0pKVxuICAgIC8vIH07XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgb25EYXRlQ2hhbmdlKGRhdGE6IHsgZGF0ZUZyb20/OiBzdHJpbmcgfCBudWxsOyBkYXRlVG8/OiBzdHJpbmcgfCBudWxsIH0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb3JtR3JvdXAuaW52YWxpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmRhdGVGcm9tKSB7XG4gICAgICB0aGlzLmNvbmZpZy5kYXRlRnJvbSA9IGRhdGEuZGF0ZUZyb207XG4gICAgfVxuICAgIGlmIChkYXRhLmRhdGVUbykge1xuICAgICAgdGhpcy5jb25maWcuZGF0ZVRvID0gZGF0YS5kYXRlVG87XG4gICAgfVxuICAgIHRoaXMucHJlcGFyZVRhYmxlRGF0YSgpO1xuXG4gICAgLy8gVE9ETzogdGVtcG9yYXJpbHkgY29tbWVudGVkIG91dCwgd2lsbCBiZSBlbmFibGVkIHdoZW4gTVRNLTU5Njg5IGlzIGludGVncmF0ZWRcbiAgICAvLyBUT0RPLTI6IGVhY2ggbWFudWFsL2F1dG8gbGlzdCByZWxvYWQgc2hvdWxkIHVwZGF0ZSBleHBvcnRzIGNvbmZpZyBkYXRlIHJhbmdlIHRvIHN5bmMgY3VycmVudCBzdGF0ZSBvZiB2aWV3IHdpdGhcbiAgICAvLyBpbml0YWwgZXhwb3J0IGNvbmZpZ1xuICAgIC8vIHRoaXMuZXhwb3J0Q29uZmlnLmRhdGVGcm9tID0gdGhpcy5jb25maWcuZGF0ZUZyb207XG4gICAgLy8gdGhpcy5leHBvcnRDb25maWcuZGF0ZVRvID0gdGhpcy5jb25maWcuZGF0ZVRvO1xuICB9XG5cbiAgb25FeHBvcnRNb2RhbE9wZW4oaXNPcGVuZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzRXhwb3J0TW9kYWxPcGVuID0gaXNPcGVuZWQ7XG4gIH1cblxuICBvblNjcm9sbGluZyh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsaW5nU3ViamVjdCQubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBhc3luYyBvbkNvdW50ZG93bkVuZGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRhdGVSYW5nZSA9IHRoaXMuZGF0YXBvaW50c1RhYmxlVmlld1NlcnZpY2UucHJlcGFyZVRpbWVSYW5nZShcbiAgICAgIHRoaXMuY29uZmlnLmludGVydmFsLFxuICAgICAgdGhpcy5jb25maWcuZGF0ZUZyb20sXG4gICAgICB0aGlzLmNvbmZpZy5kYXRlVG9cbiAgICApO1xuXG4gICAgdGhpcy5jb25maWcuZGF0ZUZyb20gPSBkYXRlUmFuZ2UuZGF0ZUZyb207XG4gICAgdGhpcy5jb25maWcuZGF0ZVRvID0gZGF0ZVJhbmdlLmRhdGVUbztcblxuICAgIGF3YWl0IHRoaXMucHJlcGFyZVRhYmxlRGF0YShmYWxzZSk7XG5cbiAgICB0aGlzLm9uU2Nyb2xsaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlR2xvYmFsVGltZUNvbnRleHRTZXR0aW5ncygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5kYXRlRnJvbSA9IHRoaXMuZGF0YXBvaW50c1RhYmxlVmlld1NlcnZpY2UuYWRqdXN0RGF0ZShcbiAgICAgIHRoaXMuY29uZmlnLmRhdGVbMF0sXG4gICAgICAwLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIHRoaXMuY29uZmlnLmRhdGVUbyA9IHRoaXMuZGF0YXBvaW50c1RhYmxlVmlld1NlcnZpY2UuYWRqdXN0RGF0ZSh0aGlzLmNvbmZpZy5kYXRlWzFdLCAwLCBmYWxzZSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLnJlYWx0aW1lKSB7XG4gICAgICB0aGlzLnNldERlZmF1bHRSZWZyZXNoUmVsYXRlZFByb3BlcnRpZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWcuaXNBdXRvUmVmcmVzaEVuYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgc2Nyb2xsaW5nIHN1YnNjcmlwdGlvbi5cbiAgICpcbiAgICogRW5zdXJlcyBzaW1pbGFyIFVYIGFzIGluIHRoZSBhbGFybXMgY291bnRkb3duLXBhdXNlIGxvZ2ljLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXRTY3JvbGxpbmdTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnNjcm9sbGluZ1N1YmplY3QkXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMzAwKSlcbiAgICAgIC5zdWJzY3JpYmUodmFsdWUgPT4gdGhpcy5pc1Njcm9sbGluZy5zZXQodmFsdWUpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RGVmYXVsdFJlZnJlc2hSZWxhdGVkUHJvcGVydGllcygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5pc0F1dG9SZWZyZXNoRW5hYmxlZCA9IHRydWU7XG4gICAgdGhpcy5jb25maWcucmVmcmVzaEludGVydmFsID0gREVGQVVMVF9DT1VOVERPV05fVkFMVUU7XG4gIH1cblxuICBwcml2YXRlIHJlY2FsY3VsYXRlSW50ZXJ2YWxUb01hdGNoRnJvbU5vd0RhdGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRhdGVGcm9tLCBkYXRlVG8gfSA9IHRoaXMuZGF0YXBvaW50c1RhYmxlQ29uZmlnU2VydmljZS5jYWxjdWxhdGVEYXRlUmFuZ2UoXG4gICAgICB0aGlzLmNvbmZpZy5pbnRlcnZhbFxuICAgICk7XG4gICAgdGhpcy5jb25maWcuZGF0ZUZyb20gPSBkYXRlRnJvbTtcbiAgICB0aGlzLmNvbmZpZy5kYXRlVG8gPSBkYXRlVG87XG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVEYXRlUmFuZ2VGb3JtKCkge1xuICAgIHRoaXMuZm9ybUdyb3VwID0gdGhpcy5jcmVhdGVGb3JtKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZvcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoXG4gICAgICB7XG4gICAgICAgIGRhdGVGcm9tOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5jb25maWcuZGF0ZUZyb20pLFxuICAgICAgICBkYXRlVG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLmNvbmZpZy5kYXRlVG8pXG4gICAgICB9LFxuICAgICAgeyB2YWxpZGF0b3JzOiBkYXRlUmFuZ2VWYWxpZGF0b3IgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgdGhlIHRhYmxlIGRhdGEgYnk6XG4gICAqIC0gZmlsdGVyaW5nIG91dCBpbmFjdGl2ZSBkYXRhIHBvaW50cyxcbiAgICogLSBjaGVja2luZyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZGV2aWNlcyBhcyBhIHNvdXJjZSBvZiBkYXRhIHBvaW50cyxcbiAgICogLSBnZXR0aW5nIHRoZSBjb2x1bW4gaGVhZGVycyBmb3IgZGV2aWNlcyxcbiAgICogLSBnZXR0aW5nIHRoZSBzZXJpZXMgZGF0YSBmb3IgYWN0aXZlIGRhdGEgcG9pbnRzIChBUEkgY2FsbCksXG4gICAqIC0gcHJlcGFyaW5nIGRhdGEgcG9pbnRzIHdpdGggdmFsdWVzIGxpc3QsXG4gICAqIC0gbWFwcGluZyBkYXRhIHBvaW50cyB3aXRoIHZhbHVlcyB0byBsaXN0IGl0ZW1zLFxuICAgKiAtIGdyb3VwaW5nIGRhdGEgcG9pbnRzIGJ5IGRhdGUgYW5kIGRldmljZSxcbiAgICogLSBzb3J0aW5nIGRhdGEgYnkgZGF0ZSBkZXNjZW5kaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gcm91bmRTZWNvbmRzIC0gV2hldGhlciB0byByb3VuZCB0aGUgc2Vjb25kcyBvciBub3QuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICBJZiB0cnVlLCB0aGUgc2Vjb25kcyB3aWxsIGJlIHJvdW5kZWQgdG8gMC5cbiAgICogICAgICAgICAgICAgICAgICAgICAgIElmIGZhbHNlLCB0aGUgc2Vjb25kcyB3aWxsIGJlIGRpc3BsYXllZCBhcyB0aGV5IGFyZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZVRhYmxlRGF0YShyb3VuZFNlY29uZHMgPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuXG4gICAgaWYgKHRoaXMuaXNJbml0aWFsUmVxdWVzdCkge1xuICAgICAgdGhpcy5hY3RpdmVEYXRhcG9pbnRzID0gdGhpcy5kYXRhcG9pbnRzVGFibGVWaWV3U2VydmljZS5maWx0ZXJPdXRJbmFjdGl2ZURhdGFwb2ludHMoXG4gICAgICAgIHRoaXMuY29uZmlnLmRhdGFwb2ludHNcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuaGFzTXVsdGlwbGVEYXRhcG9pbnRzID0gdGhpcy5kYXRhcG9pbnRzVGFibGVWaWV3U2VydmljZS5oYXNNdWx0aXBsZURhdGFwb2ludHMoXG4gICAgICAgIHRoaXMuYWN0aXZlRGF0YXBvaW50c1xuICAgICAgKTtcblxuICAgICAgdGhpcy5kZXZpY2VzQ29sdW1uSGVhZGVycyA9IHRoaXMuZGF0YXBvaW50c1RhYmxlVmlld1NlcnZpY2UuZ2V0Q29sdW1uSGVhZGVycyhcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRhcG9pbnRzXG4gICAgICApO1xuXG4gICAgICB0aGlzLmlzSW5pdGlhbFJlcXVlc3QgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVEYXRhcG9pbnRzSWRzV2l0aFNlcmllczogRGF0YXBvaW50c1ZhbHVlc0RhdGFNYXAgPVxuICAgICAgdGhpcy5kYXRhcG9pbnRzVGFibGVWaWV3U2VydmljZS5ncm91cFNlcmllc0J5RGV2aWNlSWQodGhpcy5hY3RpdmVEYXRhcG9pbnRzKTtcblxuICAgIGNvbnN0IGFjdGl2ZURhdGFwb2ludHNTZXJpZXNEYXRhOiBNYXA8c3RyaW5nIHwgbnVtYmVyLCBJU2VyaWVzPiA9XG4gICAgICBhd2FpdCB0aGlzLmdldEFjdGl2ZURhdGFwb2ludHNTZXJpZXNEYXRhTWFwKFxuICAgICAgICBhY3RpdmVEYXRhcG9pbnRzSWRzV2l0aFNlcmllcyxcbiAgICAgICAgdGhpcy5jb25maWcsXG4gICAgICAgIHJvdW5kU2Vjb25kc1xuICAgICAgKTtcblxuICAgIHRoaXMuc2VyaWVzV2l0aG91dFBlcm1pc3Npb25Ub1JlYWQgPVxuICAgICAgdGhpcy5kYXRhcG9pbnRzVGFibGVWaWV3U2VydmljZS5nZXRTZXJpZXNXaXRob3V0UGVybWlzc2lvblRvUmVhZChcbiAgICAgICAgYWN0aXZlRGF0YXBvaW50c1Nlcmllc0RhdGEsXG4gICAgICAgIGFjdGl2ZURhdGFwb2ludHNJZHNXaXRoU2VyaWVzXG4gICAgICApO1xuXG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNNaXNzaW5nQW55UGVybWlzc2lvbkFsZXJ0U2hvd24gJiZcbiAgICAgIHRoaXMuc2VyaWVzV2l0aG91dFBlcm1pc3Npb25Ub1JlYWQ/Lmxlbmd0aCA+IDAgJiZcbiAgICAgIGFjdGl2ZURhdGFwb2ludHNTZXJpZXNEYXRhPy5zaXplXG4gICAgKSB7XG4gICAgICB0aGlzLmhhbmRsZU1pc3NpbmdBbnlQZXJtaXNzaW9uRXJyb3JNZXNzYWdlKCk7XG4gICAgICB0aGlzLmlzTWlzc2luZ0FueVBlcm1pc3Npb25BbGVydFNob3duID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWFjdGl2ZURhdGFwb2ludHNTZXJpZXNEYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhcG9pbnRzV2l0aFZhbHVlcyA9IHRoaXMuZGF0YXBvaW50c1RhYmxlVmlld1NlcnZpY2UuZ2V0RGF0YXBvaW50c1dpdGhWYWx1ZXMoXG4gICAgICB0aGlzLmFjdGl2ZURhdGFwb2ludHMsXG4gICAgICBhY3RpdmVEYXRhcG9pbnRzU2VyaWVzRGF0YVxuICAgICk7XG5cbiAgICBjb25zdCBkYXRhcG9pbnRzTGlzdEl0ZW1zOiBEYXRhcG9pbnRUYWJsZUl0ZW1bXSA9XG4gICAgICB0aGlzLmRhdGFwb2ludHNUYWJsZVZpZXdTZXJ2aWNlLm1hcERhdGFwb2ludHNXaXRoVmFsdWVzVG9MaXN0KHRoaXMuZGF0YXBvaW50c1dpdGhWYWx1ZXMpO1xuXG4gICAgY29uc3QgZ3JvdXBlZERhdGFwb2ludHNMaXN0SXRlbXM6IEdyb3VwZWREYXRhcG9pbnRUYWJsZUl0ZW1bXSA9XG4gICAgICB0aGlzLmRhdGFwb2ludHNUYWJsZVZpZXdTZXJ2aWNlLmdyb3VwQnlEYXRlQW5kRGV2aWNlKFxuICAgICAgICBkYXRhcG9pbnRzTGlzdEl0ZW1zLFxuICAgICAgICB0aGlzLmRldmljZXNDb2x1bW5IZWFkZXJzXG4gICAgICApO1xuXG4gICAgdGhpcy5kYXRhcG9pbnRzVGFibGVJdGVtcyA9IHRoaXMuZGF0YXBvaW50c1RhYmxlVmlld1NlcnZpY2Uuc29ydERhdGFCeURhdGVEZXNjZW5kaW5nKFxuICAgICAgZ3JvdXBlZERhdGFwb2ludHNMaXN0SXRlbXNcbiAgICApO1xuXG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGFjdGl2ZSBkYXRhIHBvaW50cyBzZXJpZXMgZGF0YSBhbmQgcmV0dXJucyBpdCBhcyBhIG1hcC5cbiAgICpcbiAgICogSXQncyBhIHdyYXBwZXIgbWV0aG9kIHdpdGggdHJ5LWNhdGNoIGJsb2NrLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YXBvaW50c0lkc1dpdGhTZXJpZXMgLSBBIG1hcCBvZiBkYXRhIHBvaW50IElEcyB3aXRoIHRoZWlyIGFzc29jaWF0ZWQgc2VyaWVzLlxuICAgKiBAcGFyYW0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGRhdGEgcG9pbnRzIHRhYmxlLlxuICAgKiBAcGFyYW0gcm91bmRTZWNvbmRzIC0gV2hldGhlciB0byByb3VuZCB0aGUgc2Vjb25kcyBvciBub3QuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICBJZiB0cnVlLCB0aGUgc2Vjb25kcyB3aWxsIGJlIHJvdW5kZWQgdG8gMC5cbiAgICogICAgICAgICAgICAgICAgICAgICAgIElmIGZhbHNlLCB0aGUgc2Vjb25kcyB3aWxsIGJlIGRpc3BsYXllZCBhcyB0aGV5IGFyZS5cbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBNYXAgb2JqZWN0IHdpdGggZGF0YSBwb2ludCBJRHMgYXMga2V5cyBhbmQgRGF0YU9iamVjdCBhcyB2YWx1ZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEFjdGl2ZURhdGFwb2ludHNTZXJpZXNEYXRhTWFwKFxuICAgIGRhdGFwb2ludHNJZHNXaXRoU2VyaWVzOiBEYXRhcG9pbnRzVmFsdWVzRGF0YU1hcCxcbiAgICBjb25maWc6IERhdGFwb2ludHNUYWJsZUNvbmZpZyxcbiAgICByb3VuZFNlY29uZHM6IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxNYXA8c3RyaW5nIHwgbnVtYmVyLCBJU2VyaWVzPj4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5kYXRhcG9pbnRzVGFibGVWaWV3U2VydmljZS5nZXRBbGxBY3RpdmVTZXJpZXNEYXRhTWFwKFxuICAgICAgICBkYXRhcG9pbnRzSWRzV2l0aFNlcmllcyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICByb3VuZFNlY29uZHNcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTWlzc2luZ0FueVBlcm1pc3Npb25FcnJvck1lc3NhZ2UoKSB7XG4gICAgdGhpcy5hbGVydHMuc2V0QWxlcnRHcm91cERpc21pc3NTdHJhdGVneSgnc3lzdGVtJywgRGlzbWlzc0FsZXJ0U3RyYXRlZ3kuVEVNUE9SQVJZKTtcblxuICAgIHRoaXMuYWxlcnRzLmFkZEFsZXJ0cyhcbiAgICAgIG5ldyBEeW5hbWljQ29tcG9uZW50QWxlcnQoe1xuICAgICAgICBhbGxvd0h0bWw6IHRydWUsXG4gICAgICAgIHRleHQ6IHRoaXMuZ2V0TWlzc2luZ1Blcm1pc3Npb25zTWVzc2FnZSgpLFxuICAgICAgICB0eXBlOiAnc3lzdGVtJ1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNaXNzaW5nUGVybWlzc2lvbnNNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZU1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgIGdldHRleHQoYFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb25zIHRvIHJlYWQgdGhlIGZvbGxvd2luZyBzZXJpZXM6YClcbiAgICApO1xuXG4gICAgY29uc3QgZm9ybWF0dGVkTGlzdCA9IHRoaXMuc2VyaWVzV2l0aG91dFBlcm1pc3Npb25Ub1JlYWRcbiAgICAgIC5tYXAoZGF0YXBvaW50ID0+IGA8bGk+JHtkYXRhcG9pbnQua2V5LnZhbHVlT2YoKX1fJHtkYXRhcG9pbnQudmFsdWV9PC9saT5gKVxuICAgICAgLmpvaW4oJycpO1xuXG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXY+XG4gICAgICAgIDxwPiR7YmFzZU1lc3NhZ2V9PC9wPlxuICAgICAgICA8dWw+XG4gICAgICAgICAgJHtmb3JtYXR0ZWRMaXN0fVxuICAgICAgICA8L3VsPlxuICAgICAgICA8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBuYW1lIGNvbnZlbnRpb24gZm9yIGVhY2ggbGlzdCBpdGVtIGlzOiA8Y29kZT5bc291cmNlXV9bZnJhZ21lbnQuc2VyaWVzXTwvY29kZT48L3A+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0xNiBwLWwtMTYgcC1yLTE2IGZsZXgtd3JhcFwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlnLmRpc3BsYXlEYXRlU2VsZWN0aW9uXCI+XG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cbiAgICAgIDxjOHktZGF0ZS1yYW5nZS1waWNrZXJcbiAgICAgICAgY2xhc3M9XCJkLWNvbnRlbnRzXCJcbiAgICAgICAgW2lzRW1pdHRpbmdEYXRlQ2hhbmdlXT1cInRydWVcIlxuICAgICAgICBbc2hvd0xhYmVsXT1cInRydWVcIlxuICAgICAgICAodXBkYXRlZERhdGUpPVwib25EYXRlQ2hhbmdlKCRldmVudClcIlxuICAgICAgPjwvYzh5LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgIDwvZm9ybT5cbiAgPC9uZy1jb250YWluZXI+XG4gIDwhLS0gVE9ETzogdGVtcG9yYXJpbHkgY29tbWVudGVkIG91dCwgd2lsbCBiZSBlbmFibGVkIHdoZW4gTVRNLTU5Njg5IGlzIGludGVncmF0ZWQgLS0+XG4gIDwhLS0gPGM4eS1kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3RvclxuICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgW2V4cG9ydENvbmZpZ109XCJleHBvcnRDb25maWdcIlxuICAgIChpc0V4cG9ydE1vZGFsT3Blbik9XCJvbkV4cG9ydE1vZGFsT3BlbigkZXZlbnQpXCJcbiAgPjwvYzh5LWRhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yPiAtLT5cbiAgPCEtLSBUT0RPOiBiZWxvdyBkaXYgaXMganVzdCBhIHRlbXAgZml4LCBpdCB3aWxsIGJlIHJlbW92ZWQgd2hlbiBNVE0tNTk2ODkgaXMgaW50ZWdyYXRlZCAgLS0+XG4gIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBwLXQtNCBwLWItNCBtYXgtd2lkdGgtZml0IG0tbC1hdXRvXCI+PC9kaXY+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb25maWcuZGF0YXBvaW50cy5sZW5ndGggPiAwXCI+XG4gICAgPGM4eS1kYXRhcG9pbnRzLXJlbG9hZFxuICAgICAgY2xhc3M9XCJkLWNvbnRlbnRzXCJcbiAgICAgIFtpc0F1dG9SZWZyZXNoRW5hYmxlZF09XCJjb25maWcuaXNBdXRvUmVmcmVzaEVuYWJsZWRcIlxuICAgICAgW3JlZnJlc2hJbnRlcnZhbF09XCJjb25maWcucmVmcmVzaEludGVydmFsXCJcbiAgICAgIFtpc0Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxuICAgICAgW2lzTG9hZGluZ109XCJpc0xvYWRpbmdcIlxuICAgICAgW2lzU2Nyb2xsaW5nXT1cImlzU2Nyb2xsaW5nKClcIlxuICAgICAgW2lzRXhwb3J0TW9kYWxPcGVuXT1cImlzRXhwb3J0TW9kYWxPcGVuXCJcbiAgICAgIChvbkNvdW50ZG93bkVuZGVkKT1cIm9uQ291bnRkb3duRW5kZWQoKVwiXG4gICAgPjwvYzh5LWRhdGFwb2ludHMtcmVsb2FkPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImRldmljZXNDb2x1bW5IZWFkZXJzXCI+XG4gIDxjOHktZGF0YXBvaW50cy10YWJsZVxuICAgIFthZ2dyZWdhdGlvblR5cGVdPVwiY29uZmlnLmFnZ3JlZ2F0aW9uXCJcbiAgICBbZGF0YXBvaW50c1RhYmxlSXRlbXNdPVwiZGF0YXBvaW50c1RhYmxlSXRlbXNcIlxuICAgIFtkZWNpbWFsUGxhY2VzXT1cImNvbmZpZy5kZWNpbWFsUGxhY2VzXCJcbiAgICBbZGV2aWNlc0NvbHVtbkhlYWRlcnNdPVwiZGV2aWNlc0NvbHVtbkhlYWRlcnNcIlxuICAgIFtoYXNNdWx0aXBsZURhdGFwb2ludHNdPVwiaGFzTXVsdGlwbGVEYXRhcG9pbnRzXCJcbiAgICBbaXNMb2FkaW5nXT1cImlzTG9hZGluZygpXCJcbiAgICBbc2VyaWVzV2l0aG91dFBlcm1pc3Npb25Ub1JlYWRDb3VudF09XCJzZXJpZXNXaXRob3V0UGVybWlzc2lvblRvUmVhZD8ubGVuZ3RoXCJcbiAgICAoaXNTY3JvbGxpbmcpPVwib25TY3JvbGxpbmcoJGV2ZW50KVwiXG4gID48L2M4eS1kYXRhcG9pbnRzLXRhYmxlPlxuPC9uZy1jb250YWluZXI+XG4iXX0=