@pega/angular-sdk-components 0.24.8 → 0.25.1

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 (290) hide show
  1. package/fesm2022/pega-angular-sdk-components.mjs +2835 -1810
  2. package/fesm2022/pega-angular-sdk-components.mjs.map +1 -1
  3. package/lib/_bridge/helpers/sdk-pega-component-map.d.ts +4 -0
  4. package/lib/_components/designSystemExtension/banner/banner.component.d.ts +0 -1
  5. package/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.d.ts +0 -1
  6. package/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.d.ts +1 -1
  7. package/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.d.ts +2 -1
  8. package/lib/_components/designSystemExtension/operator/operator.component.d.ts +2 -3
  9. package/lib/_components/designSystemExtension/pulse/pulse.component.d.ts +2 -3
  10. package/lib/_components/field/auto-complete/auto-complete.component.d.ts +8 -3
  11. package/lib/_components/field/cancel-alert/cancel-alert.component.d.ts +0 -1
  12. package/lib/_components/field/check-box/check-box.component.d.ts +5 -3
  13. package/lib/_components/field/currency/currency.component.d.ts +6 -4
  14. package/lib/_components/field/date/date.component.d.ts +17 -7
  15. package/lib/_components/field/date-time/date-time.component.d.ts +10 -3
  16. package/lib/_components/field/decimal/decimal.component.d.ts +4 -4
  17. package/lib/_components/field/dropdown/dropdown.component.d.ts +14 -3
  18. package/lib/_components/field/email/email.component.d.ts +2 -1
  19. package/lib/_components/field/group/group.component.d.ts +0 -1
  20. package/lib/_components/field/integer/integer.component.d.ts +2 -1
  21. package/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.d.ts +1 -2
  22. package/lib/_components/field/location/location.component.d.ts +71 -0
  23. package/lib/_components/field/multiselect/multiselect.component.d.ts +3 -3
  24. package/lib/_components/field/percentage/percentage.component.d.ts +6 -3
  25. package/lib/_components/field/phone/phone.component.d.ts +6 -8
  26. package/lib/_components/field/radio-buttons/radio-buttons.component.d.ts +4 -2
  27. package/lib/_components/field/rich-text/rich-text.component.d.ts +3 -2
  28. package/lib/_components/field/scalar-list/scalar-list.component.d.ts +0 -1
  29. package/lib/_components/field/selectable-card/selectable-card.component.d.ts +75 -0
  30. package/lib/_components/field/semantic-link/semantic-link.component.d.ts +0 -1
  31. package/lib/_components/field/text/text.component.d.ts +3 -2
  32. package/lib/_components/field/text-area/text-area.component.d.ts +2 -1
  33. package/lib/_components/field/text-content/text-content.component.d.ts +0 -1
  34. package/lib/_components/field/text-input/text-input.component.d.ts +2 -1
  35. package/lib/_components/field/time/time.component.d.ts +3 -1
  36. package/lib/_components/field/url/url.component.d.ts +2 -1
  37. package/lib/_components/field/user-reference/user-reference.component.d.ts +7 -1
  38. package/lib/_components/infra/Containers/flow-container/flow-container.component.d.ts +0 -2
  39. package/lib/_components/infra/Containers/flow-container/helpers.d.ts +1 -0
  40. package/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.d.ts +0 -1
  41. package/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.d.ts +1 -4
  42. package/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.d.ts +0 -1
  43. package/lib/_components/infra/Containers/view-container/helper.d.ts +2 -0
  44. package/lib/_components/infra/Containers/view-container/view-container.component.d.ts +0 -1
  45. package/lib/_components/infra/action-buttons/action-buttons.component.d.ts +1 -1
  46. package/lib/_components/infra/assignment/assignment.component.d.ts +6 -4
  47. package/lib/_components/infra/assignment-card/assignment-card.component.d.ts +0 -1
  48. package/lib/_components/infra/dashboard-filter/dashboard-filter.component.d.ts +0 -1
  49. package/lib/_components/infra/defer-load/defer-load.component.d.ts +3 -3
  50. package/lib/_components/infra/error-boundary/error-boundary.component.d.ts +1 -1
  51. package/lib/_components/infra/multi-step/multi-step.component.d.ts +0 -1
  52. package/lib/_components/infra/navbar/navbar.component.d.ts +2 -3
  53. package/lib/_components/infra/reference/reference.component.d.ts +23 -3
  54. package/lib/_components/infra/region/region.component.d.ts +0 -1
  55. package/lib/_components/infra/root-container/root-container.component.d.ts +3 -2
  56. package/lib/_components/infra/stages/stages.component.d.ts +0 -1
  57. package/lib/_components/infra/view/view.component.d.ts +1 -1
  58. package/lib/_components/template/app-shell/app-shell.component.d.ts +0 -1
  59. package/lib/_components/template/banner-page/banner-page.component.d.ts +0 -1
  60. package/lib/_components/template/base/details-template-base.d.ts +21 -0
  61. package/lib/_components/template/base/form-template-base.d.ts +10 -0
  62. package/lib/_components/template/case-summary/case-summary.component.d.ts +3 -3
  63. package/lib/_components/template/case-view/case-view.component.d.ts +1 -3
  64. package/lib/_components/template/confirmation/confirmation.component.d.ts +0 -1
  65. package/lib/_components/template/data-reference/data-reference.component.d.ts +0 -1
  66. package/lib/_components/template/default-form/default-form.component.d.ts +8 -7
  67. package/lib/_components/template/details/details.component.d.ts +3 -12
  68. package/lib/_components/template/details-narrow-wide/details-narrow-wide.component.d.ts +3 -12
  69. package/lib/_components/template/details-one-column/details-one-column.component.d.ts +3 -14
  70. package/lib/_components/template/details-sub-tabs/details-sub-tabs.component.d.ts +3 -14
  71. package/lib/_components/template/details-three-column/details-three-column.component.d.ts +3 -14
  72. package/lib/_components/template/details-two-column/details-two-column.component.d.ts +3 -14
  73. package/lib/_components/template/details-wide-narrow/details-wide-narrow.component.d.ts +3 -14
  74. package/lib/_components/template/dynamic-tabs/dynamic-tabs.component.d.ts +1 -1
  75. package/lib/_components/template/field-group-template/field-group-template.component.d.ts +12 -9
  76. package/lib/_components/template/inline-dashboard/inline-dashboard.component.d.ts +0 -1
  77. package/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.d.ts +0 -1
  78. package/lib/_components/template/list-page/list-page.component.d.ts +0 -1
  79. package/lib/_components/template/list-view/list-view.component.d.ts +6 -4
  80. package/lib/_components/template/list-view/listViewHelpers.d.ts +1 -1
  81. package/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.d.ts +0 -1
  82. package/lib/_components/template/narrow-wide-form/narrow-wide-form.component.d.ts +0 -1
  83. package/lib/_components/template/one-column/one-column.component.d.ts +2 -2
  84. package/lib/_components/template/one-column-page/one-column-page.component.d.ts +0 -1
  85. package/lib/_components/template/one-column-tab/one-column-tab.component.d.ts +0 -1
  86. package/lib/_components/template/page/page.component.d.ts +0 -1
  87. package/lib/_components/template/promoted-filters/promoted-filters.component.d.ts +0 -1
  88. package/lib/_components/template/repeating-structures/repeating-structures.component.d.ts +0 -1
  89. package/lib/_components/template/simple-table/simple-table.component.d.ts +0 -1
  90. package/lib/_components/template/simple-table-manual/helpers.d.ts +19 -4
  91. package/lib/_components/template/simple-table-manual/simple-table-manual.component.d.ts +10 -3
  92. package/lib/_components/template/simple-table-select/simple-table-select.component.d.ts +0 -1
  93. package/lib/_components/template/single-reference-readonly/single-reference-readonly.component.d.ts +0 -1
  94. package/lib/_components/template/sub-tabs/sub-tabs.component.d.ts +0 -1
  95. package/lib/_components/template/three-column/three-column.component.d.ts +2 -2
  96. package/lib/_components/template/three-column-page/three-column-page.component.d.ts +0 -1
  97. package/lib/_components/template/two-column/two-column.component.d.ts +2 -2
  98. package/lib/_components/template/two-column-page/two-column-page.component.d.ts +0 -1
  99. package/lib/_components/template/two-column-tab/two-column-tab.component.d.ts +0 -1
  100. package/lib/_components/template/utils.d.ts +7 -0
  101. package/lib/_components/template/wide-narrow-form/wide-narrow-form.component.d.ts +2 -2
  102. package/lib/_components/template/wide-narrow-page/wide-narrow-page.component.d.ts +1 -2
  103. package/lib/_components/template/wss-nav-bar/wss-nav-bar.component.d.ts +3 -4
  104. package/lib/_components/widget/app-announcement/app-announcement.component.d.ts +0 -1
  105. package/lib/_components/widget/attachment/attachment.component.d.ts +3 -4
  106. package/lib/_components/widget/case-history/case-history.component.d.ts +0 -1
  107. package/lib/_components/widget/feed-container/feed-container.component.d.ts +2 -3
  108. package/lib/_components/widget/file-utility/file-utility.component.d.ts +1 -2
  109. package/lib/_components/widget/quick-create/quick-create.component.d.ts +0 -1
  110. package/lib/_components/widget/todo/todo.component.d.ts +10 -14
  111. package/lib/_components/widget/utility/utility.component.d.ts +0 -1
  112. package/lib/_helpers/common.d.ts +1 -1
  113. package/lib/_helpers/createstage-utils.d.ts +1 -0
  114. package/lib/_helpers/formatters/boolean.d.ts +1 -2
  115. package/lib/_helpers/formatters/common.d.ts +2 -2
  116. package/lib/_helpers/formatters/currency.d.ts +1 -2
  117. package/lib/_helpers/formatters/date.d.ts +1 -2
  118. package/lib/_helpers/formatters/index.d.ts +1 -2
  119. package/lib/_helpers/utils.d.ts +12 -0
  120. package/lib/_messages/error-messages.service.d.ts +1 -1
  121. package/lib/_services/banner.service.d.ts +8 -0
  122. package/lib/_services/case.service.d.ts +1 -1
  123. package/lib/_services/datapage.service.d.ts +1 -1
  124. package/lib/_services/endpoints.d.ts +0 -1
  125. package/lib/_services/google-maps-loader.service.d.ts +7 -0
  126. package/lib/doc/KeyReleaseUpdates.md +35 -1
  127. package/package.json +20 -6
  128. package/public-api.d.ts +15 -11
  129. package/esm2022/lib/_bridge/angular-pconnect.mjs +0 -428
  130. package/esm2022/lib/_bridge/component-mapper/component-mapper.component.mjs +0 -114
  131. package/esm2022/lib/_bridge/helpers/sdk-pega-component-map.mjs +0 -239
  132. package/esm2022/lib/_bridge/helpers/sdk_component_map.mjs +0 -142
  133. package/esm2022/lib/_components/designSystemExtension/alert/alert.component.mjs +0 -50
  134. package/esm2022/lib/_components/designSystemExtension/alert-banner/alert-banner.component.mjs +0 -29
  135. package/esm2022/lib/_components/designSystemExtension/banner/banner.component.mjs +0 -31
  136. package/esm2022/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.mjs +0 -51
  137. package/esm2022/lib/_components/designSystemExtension/field-group/field-group.component.mjs +0 -31
  138. package/esm2022/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.mjs +0 -83
  139. package/esm2022/lib/_components/designSystemExtension/material-details/material-details.component.mjs +0 -37
  140. package/esm2022/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.mjs +0 -31
  141. package/esm2022/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.mjs +0 -36
  142. package/esm2022/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.mjs +0 -25
  143. package/esm2022/lib/_components/designSystemExtension/material-utility/material-utility.component.mjs +0 -28
  144. package/esm2022/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.mjs +0 -42
  145. package/esm2022/lib/_components/designSystemExtension/operator/operator.component.mjs +0 -143
  146. package/esm2022/lib/_components/designSystemExtension/pulse/pulse.component.mjs +0 -33
  147. package/esm2022/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.mjs +0 -93
  148. package/esm2022/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.mjs +0 -18
  149. package/esm2022/lib/_components/field/auto-complete/auto-complete.component.mjs +0 -286
  150. package/esm2022/lib/_components/field/cancel-alert/cancel-alert.component.mjs +0 -96
  151. package/esm2022/lib/_components/field/check-box/check-box.component.mjs +0 -223
  152. package/esm2022/lib/_components/field/currency/currency.component.mjs +0 -177
  153. package/esm2022/lib/_components/field/date/date.component.mjs +0 -225
  154. package/esm2022/lib/_components/field/date-time/date-time.component.mjs +0 -181
  155. package/esm2022/lib/_components/field/decimal/decimal.component.mjs +0 -185
  156. package/esm2022/lib/_components/field/dropdown/dropdown.component.mjs +0 -192
  157. package/esm2022/lib/_components/field/email/email.component.mjs +0 -150
  158. package/esm2022/lib/_components/field/group/group.component.mjs +0 -64
  159. package/esm2022/lib/_components/field/integer/integer.component.mjs +0 -155
  160. package/esm2022/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.mjs +0 -44
  161. package/esm2022/lib/_components/field/multiselect/multiselect.component.mjs +0 -307
  162. package/esm2022/lib/_components/field/multiselect/utils.mjs +0 -187
  163. package/esm2022/lib/_components/field/percentage/percentage.component.mjs +0 -174
  164. package/esm2022/lib/_components/field/phone/phone.component.mjs +0 -167
  165. package/esm2022/lib/_components/field/radio-buttons/radio-buttons.component.mjs +0 -184
  166. package/esm2022/lib/_components/field/rich-text/rich-text.component.mjs +0 -103
  167. package/esm2022/lib/_components/field/scalar-list/scalar-list.component.mjs +0 -96
  168. package/esm2022/lib/_components/field/semantic-link/semantic-link.component.mjs +0 -57
  169. package/esm2022/lib/_components/field/text/text.component.mjs +0 -138
  170. package/esm2022/lib/_components/field/text-area/text-area.component.mjs +0 -153
  171. package/esm2022/lib/_components/field/text-content/text-content.component.mjs +0 -69
  172. package/esm2022/lib/_components/field/text-input/text-input.component.mjs +0 -152
  173. package/esm2022/lib/_components/field/time/time.component.mjs +0 -153
  174. package/esm2022/lib/_components/field/url/url.component.mjs +0 -152
  175. package/esm2022/lib/_components/field/user-reference/user-reference.component.mjs +0 -187
  176. package/esm2022/lib/_components/infra/Containers/base-components/flow-container-base.component.mjs +0 -18
  177. package/esm2022/lib/_components/infra/Containers/base-components/helper.mjs +0 -71
  178. package/esm2022/lib/_components/infra/Containers/flow-container/flow-container.component.mjs +0 -487
  179. package/esm2022/lib/_components/infra/Containers/flow-container/helpers.mjs +0 -68
  180. package/esm2022/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.mjs +0 -24
  181. package/esm2022/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.mjs +0 -342
  182. package/esm2022/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.mjs +0 -32
  183. package/esm2022/lib/_components/infra/Containers/view-container/view-container.component.mjs +0 -218
  184. package/esm2022/lib/_components/infra/action-buttons/action-buttons.component.mjs +0 -31
  185. package/esm2022/lib/_components/infra/assignment/assignment.component.mjs +0 -383
  186. package/esm2022/lib/_components/infra/assignment-card/assignment-card.component.mjs +0 -47
  187. package/esm2022/lib/_components/infra/dashboard-filter/dashboard-filter.component.mjs +0 -87
  188. package/esm2022/lib/_components/infra/defer-load/defer-load.component.mjs +0 -141
  189. package/esm2022/lib/_components/infra/error-boundary/error-boundary.component.mjs +0 -18
  190. package/esm2022/lib/_components/infra/multi-step/multi-step.component.mjs +0 -80
  191. package/esm2022/lib/_components/infra/navbar/navbar.component.mjs +0 -136
  192. package/esm2022/lib/_components/infra/reference/reference.component.mjs +0 -133
  193. package/esm2022/lib/_components/infra/region/region.component.mjs +0 -33
  194. package/esm2022/lib/_components/infra/root-container/root-container.component.mjs +0 -228
  195. package/esm2022/lib/_components/infra/stages/stages.component.mjs +0 -62
  196. package/esm2022/lib/_components/infra/view/view.component.mjs +0 -173
  197. package/esm2022/lib/_components/template/app-shell/app-shell.component.mjs +0 -140
  198. package/esm2022/lib/_components/template/banner-page/banner-page.component.mjs +0 -43
  199. package/esm2022/lib/_components/template/case-summary/case-summary.component.mjs +0 -101
  200. package/esm2022/lib/_components/template/case-view/case-view.component.mjs +0 -190
  201. package/esm2022/lib/_components/template/confirmation/confirmation.component.mjs +0 -68
  202. package/esm2022/lib/_components/template/data-reference/data-reference.component.mjs +0 -237
  203. package/esm2022/lib/_components/template/default-form/default-form.component.mjs +0 -61
  204. package/esm2022/lib/_components/template/details/details.component.mjs +0 -103
  205. package/esm2022/lib/_components/template/details-narrow-wide/details-narrow-wide.component.mjs +0 -72
  206. package/esm2022/lib/_components/template/details-one-column/details-one-column.component.mjs +0 -71
  207. package/esm2022/lib/_components/template/details-sub-tabs/details-sub-tabs.component.mjs +0 -66
  208. package/esm2022/lib/_components/template/details-three-column/details-three-column.component.mjs +0 -80
  209. package/esm2022/lib/_components/template/details-two-column/details-two-column.component.mjs +0 -77
  210. package/esm2022/lib/_components/template/details-wide-narrow/details-wide-narrow.component.mjs +0 -77
  211. package/esm2022/lib/_components/template/dynamic-tabs/dynamic-tabs.component.mjs +0 -64
  212. package/esm2022/lib/_components/template/field-group-list/field-group-list.component.mjs +0 -23
  213. package/esm2022/lib/_components/template/field-group-template/field-group-template.component.mjs +0 -124
  214. package/esm2022/lib/_components/template/field-value-list/field-value-list.component.mjs +0 -24
  215. package/esm2022/lib/_components/template/inline-dashboard/inline-dashboard.component.mjs +0 -22
  216. package/esm2022/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.mjs +0 -40
  217. package/esm2022/lib/_components/template/list-page/list-page.component.mjs +0 -14
  218. package/esm2022/lib/_components/template/list-view/DefaultViewMeta.mjs +0 -208
  219. package/esm2022/lib/_components/template/list-view/list-view.component.mjs +0 -1202
  220. package/esm2022/lib/_components/template/list-view/listViewHelpers.mjs +0 -60
  221. package/esm2022/lib/_components/template/list-view/utils.mjs +0 -662
  222. package/esm2022/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.mjs +0 -44
  223. package/esm2022/lib/_components/template/narrow-wide-form/narrow-wide-form.component.mjs +0 -30
  224. package/esm2022/lib/_components/template/one-column/one-column.component.mjs +0 -30
  225. package/esm2022/lib/_components/template/one-column-page/one-column-page.component.mjs +0 -16
  226. package/esm2022/lib/_components/template/one-column-tab/one-column-tab.component.mjs +0 -30
  227. package/esm2022/lib/_components/template/page/page.component.mjs +0 -52
  228. package/esm2022/lib/_components/template/promoted-filters/promoted-filters.component.mjs +0 -149
  229. package/esm2022/lib/_components/template/repeating-structures/repeating-structures.component.mjs +0 -138
  230. package/esm2022/lib/_components/template/simple-table/simple-table.component.mjs +0 -104
  231. package/esm2022/lib/_components/template/simple-table-manual/helpers.mjs +0 -270
  232. package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs +0 -781
  233. package/esm2022/lib/_components/template/simple-table-select/simple-table-select.component.mjs +0 -129
  234. package/esm2022/lib/_components/template/single-reference-readonly/single-reference-readonly.component.mjs +0 -16
  235. package/esm2022/lib/_components/template/sub-tabs/sub-tabs.component.mjs +0 -67
  236. package/esm2022/lib/_components/template/three-column/three-column.component.mjs +0 -30
  237. package/esm2022/lib/_components/template/three-column-page/three-column-page.component.mjs +0 -16
  238. package/esm2022/lib/_components/template/two-column/two-column.component.mjs +0 -30
  239. package/esm2022/lib/_components/template/two-column-page/two-column-page.component.mjs +0 -40
  240. package/esm2022/lib/_components/template/two-column-tab/two-column-tab.component.mjs +0 -30
  241. package/esm2022/lib/_components/template/utils.mjs +0 -22
  242. package/esm2022/lib/_components/template/wide-narrow-form/wide-narrow-form.component.mjs +0 -30
  243. package/esm2022/lib/_components/template/wide-narrow-page/wide-narrow-page.component.mjs +0 -53
  244. package/esm2022/lib/_components/template/wss-nav-bar/wss-nav-bar.component.mjs +0 -137
  245. package/esm2022/lib/_components/widget/app-announcement/app-announcement.component.mjs +0 -24
  246. package/esm2022/lib/_components/widget/attachment/attachment.component.mjs +0 -395
  247. package/esm2022/lib/_components/widget/case-history/case-history.component.mjs +0 -80
  248. package/esm2022/lib/_components/widget/feed-container/feed-container.component.mjs +0 -521
  249. package/esm2022/lib/_components/widget/file-utility/file-utility.component.mjs +0 -638
  250. package/esm2022/lib/_components/widget/list-utility/list-utility.component.mjs +0 -57
  251. package/esm2022/lib/_components/widget/quick-create/quick-create.component.mjs +0 -75
  252. package/esm2022/lib/_components/widget/todo/todo.component.mjs +0 -214
  253. package/esm2022/lib/_components/widget/utility/utility.component.mjs +0 -34
  254. package/esm2022/lib/_directives/thousand-seperator.directive.mjs +0 -28
  255. package/esm2022/lib/_helpers/case-utils.mjs +0 -71
  256. package/esm2022/lib/_helpers/common.mjs +0 -20
  257. package/esm2022/lib/_helpers/currency-utils.mjs +0 -57
  258. package/esm2022/lib/_helpers/date-format-utils.mjs +0 -68
  259. package/esm2022/lib/_helpers/event-util.mjs +0 -18
  260. package/esm2022/lib/_helpers/field-group-utils.mjs +0 -47
  261. package/esm2022/lib/_helpers/filter-utils.mjs +0 -106
  262. package/esm2022/lib/_helpers/formatters/boolean.mjs +0 -20
  263. package/esm2022/lib/_helpers/formatters/common.mjs +0 -16
  264. package/esm2022/lib/_helpers/formatters/currency-map.mjs +0 -903
  265. package/esm2022/lib/_helpers/formatters/currency.mjs +0 -68
  266. package/esm2022/lib/_helpers/formatters/date.mjs +0 -69
  267. package/esm2022/lib/_helpers/formatters/format-utils.mjs +0 -68
  268. package/esm2022/lib/_helpers/formatters/index.mjs +0 -110
  269. package/esm2022/lib/_helpers/instructions-utils.mjs +0 -36
  270. package/esm2022/lib/_helpers/tab-utils.mjs +0 -59
  271. package/esm2022/lib/_helpers/template-utils.mjs +0 -56
  272. package/esm2022/lib/_helpers/utils.mjs +0 -386
  273. package/esm2022/lib/_helpers/versionHelpers.mjs +0 -12
  274. package/esm2022/lib/_messages/error-messages.service.mjs +0 -31
  275. package/esm2022/lib/_messages/get-login-status.service.mjs +0 -26
  276. package/esm2022/lib/_messages/oauth-response.service.mjs +0 -30
  277. package/esm2022/lib/_messages/progress-spinner.service.mjs +0 -30
  278. package/esm2022/lib/_messages/reset-pconnect.service.mjs +0 -31
  279. package/esm2022/lib/_messages/update-worklist.service.mjs +0 -30
  280. package/esm2022/lib/_services/case.service.mjs +0 -32
  281. package/esm2022/lib/_services/datapage.service.mjs +0 -52
  282. package/esm2022/lib/_services/endpoints.mjs +0 -61
  283. package/esm2022/lib/_services/server-config.service.mjs +0 -52
  284. package/esm2022/lib/_types/PConnProps.interface.mjs +0 -2
  285. package/esm2022/pega-angular-sdk-components.mjs +0 -5
  286. package/esm2022/public-api.mjs +0 -141
  287. package/esm2022/sdk-local-component-map.mjs +0 -9
  288. package/lib/_messages/get-login-status.service.d.ts +0 -10
  289. package/lib/_messages/oauth-response.service.d.ts +0 -14
  290. package/lib/_messages/reset-pconnect.service.d.ts +0 -15
@@ -1,638 +0,0 @@
1
- import { Component, Input, forwardRef } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { MatButtonModule } from '@angular/material/button';
4
- import { MatInputModule } from '@angular/material/input';
5
- import { MatFormFieldModule } from '@angular/material/form-field';
6
- import download from 'downloadjs';
7
- import { ComponentMapperComponent } from '../../../_bridge/component-mapper/component-mapper.component';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "../../../_bridge/angular-pconnect";
10
- import * as i2 from "../../../_helpers/utils";
11
- import * as i3 from "@angular/common";
12
- import * as i4 from "@angular/material/button";
13
- import * as i5 from "@angular/material/form-field";
14
- import * as i6 from "@angular/material/input";
15
- export class FileUtilityComponent {
16
- constructor(angularPConnect, utils, ngZone) {
17
- this.angularPConnect = angularPConnect;
18
- this.utils = utils;
19
- this.ngZone = ngZone;
20
- // For interaction with AngularPConnect
21
- this.angularPConnectData = {};
22
- this.arFullListAttachments = [];
23
- this.lu_name$ = '';
24
- this.lu_icon$ = '';
25
- this.lu_bLoading$ = false;
26
- this.lu_count$ = 0;
27
- this.lu_arActions$ = [];
28
- this.lu_arItems$ = [];
29
- this.va_arItems$ = [];
30
- this.bShowFileModal$ = false;
31
- this.bShowLinkModal$ = false;
32
- this.bShowViewAllModal$ = false;
33
- this.arFileMainButtons$ = [];
34
- this.arFileSecondaryButtons$ = [];
35
- this.arLinkMainButtons$ = [];
36
- this.arLinkSecondaryButtons$ = [];
37
- this.arFiles$ = [];
38
- this.arFileList$ = [];
39
- this.arLinks$ = [];
40
- this.arLinksList$ = [];
41
- this.link_title$ = '';
42
- this.link_url$ = '';
43
- this.closeSvgIcon$ = '';
44
- this.currentCaseID = '';
45
- this.getNewListUtilityItemProps = ({ att, cancelFile, downloadFile, deleteFile, removeFile }) => {
46
- let actions;
47
- let isDownloadable = false;
48
- if (att.progress && att.progress !== 100) {
49
- actions = [
50
- {
51
- id: `Cancel-${att.ID}`,
52
- text: 'Cancel',
53
- icon: 'times',
54
- onClick: cancelFile
55
- }
56
- ];
57
- }
58
- else if (att.links) {
59
- const isFile = att.type === 'FILE';
60
- const ID = att.ID.replace(/\s/gi, '');
61
- const actionsMap = new Map([
62
- [
63
- 'download',
64
- {
65
- id: `download-${ID}`,
66
- text: isFile ? 'Download' : 'Open',
67
- icon: isFile ? 'download' : 'open',
68
- onClick: downloadFile
69
- }
70
- ],
71
- [
72
- 'delete',
73
- {
74
- id: `Delete-${ID}`,
75
- text: 'Delete',
76
- icon: 'trash',
77
- onClick: deleteFile
78
- }
79
- ]
80
- ]);
81
- actions = [];
82
- actionsMap.forEach((action, actionKey) => {
83
- if (att.links[actionKey]) {
84
- actions.push(action);
85
- }
86
- });
87
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
88
- isDownloadable = att.links.download;
89
- }
90
- else if (att.error) {
91
- actions = [
92
- {
93
- id: `Remove-${att.ID}`,
94
- text: 'Remove',
95
- icon: 'trash',
96
- onClick: removeFile
97
- }
98
- ];
99
- }
100
- return {
101
- id: att.ID,
102
- visual: {
103
- icon: this.utils.getIconForAttachment(att),
104
- progress: att.progress == 100 ? undefined : att.progress
105
- },
106
- primary: {
107
- type: att.type,
108
- name: att.name,
109
- icon: 'trash',
110
- click: removeFile
111
- },
112
- secondary: {
113
- text: att.meta
114
- },
115
- actions
116
- };
117
- };
118
- this.getListUtilityItemProps = ({ att, cancelFile, downloadFile, deleteFile, removeFile }) => {
119
- let actions;
120
- let isDownloadable = false;
121
- if (att.progress && att.progress !== 100) {
122
- actions = [
123
- {
124
- id: `Cancel-${att.ID}`,
125
- text: this.pConn$.getLocalizedValue('Cancel', '', ''),
126
- icon: 'times',
127
- onClick: cancelFile
128
- }
129
- ];
130
- }
131
- else if (att.links) {
132
- const isFile = att.type === 'FILE';
133
- const ID = att.ID.replace(/\s/gi, '');
134
- const actionsMap = new Map([
135
- [
136
- 'download',
137
- {
138
- id: `download-${ID}`,
139
- text: isFile ? this.pConn$.getLocalizedValue('Download', '', '') : this.pConn$.getLocalizedValue('Open', '', ''),
140
- icon: isFile ? 'download' : 'open',
141
- onClick: downloadFile
142
- }
143
- ],
144
- [
145
- 'delete',
146
- {
147
- id: `Delete-${ID}`,
148
- text: this.pConn$.getLocalizedValue('Delete', '', ''),
149
- icon: 'trash',
150
- onClick: deleteFile
151
- }
152
- ]
153
- ]);
154
- actions = [];
155
- actionsMap.forEach((action, actionKey) => {
156
- if (att.links[actionKey]) {
157
- actions.push(action);
158
- }
159
- });
160
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
161
- isDownloadable = att.links.download;
162
- }
163
- else if (att.error) {
164
- actions = [
165
- {
166
- id: `Remove-${att.ID}`,
167
- text: this.pConn$.getLocalizedValue('Remove', '', ''),
168
- icon: 'trash',
169
- onClick: removeFile
170
- }
171
- ];
172
- }
173
- return {
174
- id: att.ID,
175
- visual: {
176
- icon: this.utils.getIconForAttachment(att),
177
- progress: att.progress == 100 ? undefined : att.progress
178
- },
179
- primary: {
180
- type: att.type,
181
- name: att.name,
182
- icon: 'open',
183
- click: downloadFile
184
- },
185
- secondary: {
186
- text: att.meta
187
- },
188
- actions
189
- };
190
- };
191
- this.fileDownload = (data, fileName, ext) => {
192
- const file = ext ? `${fileName}.${ext}` : fileName;
193
- download(atob(data), file);
194
- };
195
- }
196
- ngOnInit() {
197
- // // First thing in initialization is registering and subscribing to the AngularPConnect service
198
- this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
199
- const configProps = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps());
200
- this.lu_name$ = configProps.label ?? '';
201
- this.lu_icon$ = 'paper-clip';
202
- this.closeSvgIcon$ = this.utils.getImageSrc('times', this.utils.getSDKStaticContentUrl());
203
- this.addAttachmentsActions = [
204
- {
205
- text: this.pConn$.getLocalizedValue('Add files', '', ''),
206
- id: 'addNewFiles',
207
- onClick: () => this.createModal('addLocalFile')
208
- },
209
- {
210
- text: this.pConn$.getLocalizedValue('Add links', '', ''),
211
- id: 'addNewLinks',
212
- onClick: () => this.createModal('addLocalLink')
213
- }
214
- ];
215
- // const onViewAllCallback = () => this.onViewAll(this.arFullListAttachments);
216
- this.lu_onViewAllFunction = { onClick: this.onViewAll.bind(this) };
217
- this.removeFileFromList$ = { onClick: this.removeFileFromList.bind(this) };
218
- this.removeLinksFromList$ = { onClick: this.removeLinksFromList.bind(this) };
219
- this.updateSelf();
220
- this.createModalButtons();
221
- PCore.getPubSubUtils().subscribe(PCore.getEvents().getCaseEvent().CASE_ATTACHMENTS_UPDATED_FROM_CASEVIEW, this.updateSelf.bind(this), 'caseAttachmentsUpdateFromCaseview');
222
- }
223
- ngOnDestroy() {
224
- if (this.angularPConnectData.unsubscribeFn) {
225
- this.angularPConnectData.unsubscribeFn();
226
- }
227
- PCore.getPubSubUtils().unsubscribe(PCore.getEvents().getCaseEvent().CASE_ATTACHMENTS_UPDATED_FROM_CASEVIEW, 'caseAttachmentsUpdateFromCaseview');
228
- }
229
- // Callback passed when subscribing to store change
230
- onStateChange() {
231
- // adding a property to track in configProps, when ever the attachment file changes
232
- // need to trigger a redraw
233
- this.pConn$.registerAdditionalProps({
234
- lastRefreshTime: `@P ${PCore.getConstants().SUMMARY_OF_ATTACHMENTS_LAST_REFRESH_TIME}`
235
- });
236
- // Should always check the bridge to see if the component should update itself (re-render)
237
- const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
238
- // ONLY call updateSelf when the component should update
239
- if (bUpdateSelf || this.caseHasChanged()) {
240
- this.updateSelf();
241
- }
242
- }
243
- onAttachFiles(files) {
244
- const attachmentUtils = PCore.getAttachmentUtils();
245
- const caseID = this.pConn$.getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID);
246
- if (files.length > 0) {
247
- this.lu_bLoading$ = true;
248
- }
249
- const arFiles = Array.from(files);
250
- Promise.allSettled(arFiles.map(file => attachmentUtils.uploadAttachment(file, this.onUploadProgress, this.errorHandler, this.pConn$.getContextName())))
251
- .then((fileResponses) => {
252
- const uploadedFiles = [];
253
- fileResponses.forEach(fileResponse => {
254
- if (fileResponse.status === 'fulfilled') {
255
- uploadedFiles.push(fileResponse.value);
256
- }
257
- });
258
- if (uploadedFiles.length > 0) {
259
- attachmentUtils.linkAttachmentsToCase(caseID, uploadedFiles, 'File', this.pConn$.getContextName())
260
- .then(() => {
261
- this.refreshAttachments();
262
- })
263
- .catch();
264
- }
265
- })
266
- .catch();
267
- this.arFileList$ = [];
268
- this.lu_bLoading$ = false;
269
- }
270
- refreshAttachments() {
271
- this.updateSelf();
272
- }
273
- onUploadProgress() { }
274
- errorHandler() { }
275
- onAttachLinks(links) {
276
- const attachmentUtils = PCore.getAttachmentUtils();
277
- const caseID = this.pConn$.getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID);
278
- if (links.length > 0) {
279
- this.lu_bLoading$ = true;
280
- }
281
- const linksToAttach = links.map(link => ({
282
- type: 'URL',
283
- category: 'URL',
284
- url: link.url,
285
- name: link.linkTitle
286
- }));
287
- attachmentUtils.linkAttachmentsToCase(caseID, linksToAttach, 'URL', this.pConn$.getContextName())
288
- .then(() => {
289
- this.refreshAttachments();
290
- })
291
- .catch(console.log);
292
- }
293
- addAttachments(attsFromResp = []) {
294
- this.lu_bLoading$ = false;
295
- attsFromResp = attsFromResp.map(respAtt => {
296
- const updatedAtt = {
297
- ...respAtt,
298
- meta: `${respAtt.category} . ${this.utils.generateDateTime(respAtt.createTime, 'DateTime-Since')}, ${respAtt.createdBy}`
299
- };
300
- if (updatedAtt.type === 'FILE') {
301
- updatedAtt.nameWithExt = updatedAtt.fileName;
302
- }
303
- return updatedAtt;
304
- });
305
- return attsFromResp;
306
- }
307
- onViewAll() {
308
- this.bShowViewAllModal$ = true;
309
- // add clickAway listener
310
- // window.addEventListener('mouseup', this._clickAway.bind(this));
311
- }
312
- // Below method is not needed, still having it commented in case we want in future
313
- // _clickAway(event: any) {
314
- // let bInPopUp = false;
315
- // // run through list of elements in path, if menu not in th path, then want to
316
- // // hide (toggle) the menu
317
- // for (const i in event.path) {
318
- // if (event.path[i].className == 'psdk-modal-file-top' || event.path[i].tagName == 'BUTTON') {
319
- // bInPopUp = true;
320
- // break;
321
- // }
322
- // }
323
- // if (!bInPopUp) {
324
- // this.bShowViewAllModal$ = false;
325
- // window.removeEventListener('mouseup', this._clickAway.bind(this));
326
- // }
327
- // }
328
- _closeViewAll() {
329
- this.bShowViewAllModal$ = false;
330
- // window.removeEventListener('mouseup', this._clickAway.bind(this));
331
- }
332
- removeFileFromList(item) {
333
- if (item != null) {
334
- const arFileList = this.arFileList$;
335
- const itemId = item.id;
336
- for (let fileIndex = 0; fileIndex < arFileList.length; fileIndex++) {
337
- if (arFileList[fileIndex].id == itemId) {
338
- // remove the file from the list and redraw
339
- this.ngZone.run(() => {
340
- arFileList.splice(fileIndex, 1);
341
- });
342
- break;
343
- }
344
- }
345
- }
346
- }
347
- removeLinksFromList(item) {
348
- const localLinksList = this.arLinksList$.slice();
349
- if (item != null) {
350
- const itemId = item.id;
351
- for (let linkIndex = 0; linkIndex < localLinksList.length; linkIndex++) {
352
- if (localLinksList[linkIndex].id == itemId) {
353
- // remove the file from the list and redraw
354
- localLinksList.splice(linkIndex, 1);
355
- this.ngZone.run(() => {
356
- this.arLinksList$ = localLinksList.slice();
357
- });
358
- break;
359
- }
360
- }
361
- }
362
- }
363
- _addLink() {
364
- // copy list locally
365
- const localList = this.arLinksList$.slice();
366
- const url = this.link_url$;
367
- if (!/^(http|https):\/\//.test(this.link_url$)) {
368
- this.link_url$ = `http://${this.link_url$}`;
369
- }
370
- // list for display
371
- let oLink = {};
372
- oLink.icon = 'chain';
373
- oLink.ID = `${new Date().getTime()}`;
374
- oLink = this.getNewListUtilityItemProps({
375
- att: oLink,
376
- downloadFile: null,
377
- cancelFile: null,
378
- deleteFile: null,
379
- removeFile: null
380
- });
381
- oLink.type = 'URL';
382
- oLink.primary.type = oLink.type;
383
- oLink.visual.icon = 'chain';
384
- oLink.primary.name = this.link_title$;
385
- oLink.primary.icon = 'open';
386
- oLink.secondary.text = url;
387
- this.ngZone.run(() => {
388
- // need to create a new array or summary list won't detect changes
389
- this.arLinksList$ = localList.slice();
390
- this.arLinksList$.push(oLink);
391
- // list for actually attachments
392
- const link = {};
393
- link.id = oLink.id;
394
- link.linkTitle = this.link_title$;
395
- link.type = oLink.type;
396
- link.url = url;
397
- this.arLinks$.push(link);
398
- // clear values
399
- this.link_title$ = '';
400
- this.link_url$ = '';
401
- });
402
- }
403
- _changeTitle(event) {
404
- this.link_title$ = event.srcElement.value;
405
- }
406
- _changeUrl(event) {
407
- this.link_url$ = event.srcElement.value;
408
- }
409
- downloadFile(att) {
410
- const attachUtils = PCore.getAttachmentUtils();
411
- const { ID, name, extension, type } = att;
412
- const context = this.pConn$.getContextName();
413
- attachUtils
414
- // @ts-ignore - 3rd parameter "responseEncoding" is optional
415
- .downloadAttachment(ID, context)
416
- .then((content) => {
417
- if (type === 'FILE') {
418
- this.fileDownload(content.data, name, extension);
419
- }
420
- else if (type === 'URL') {
421
- let { data } = content;
422
- if (!/^(http|https):\/\//.test(data)) {
423
- data = `//${data}`;
424
- }
425
- window.open(content.data, '_blank');
426
- }
427
- })
428
- .catch(console.error);
429
- }
430
- cancelFile() {
431
- alert('cancel');
432
- }
433
- deleteFile(att) {
434
- setTimeout(() => {
435
- const attachUtils = PCore.getAttachmentUtils();
436
- const { ID } = att;
437
- const context = this.pConn$.getContextName();
438
- attachUtils
439
- .deleteAttachment(ID, context)
440
- .then(() => {
441
- this.updateSelf();
442
- // let newAttachments;
443
- // setAttachments((current) => {
444
- // newAttachments = current.filter((file) => file.ID !== ID);
445
- // return newAttachments;
446
- // });
447
- // if (callbackFn) {
448
- // callbackFn(newAttachments);
449
- // }
450
- })
451
- .catch(console.error);
452
- });
453
- }
454
- removeFile() {
455
- alert('remove');
456
- }
457
- removeNewFile() {
458
- alert('remove');
459
- }
460
- createModal(modalType) {
461
- switch (modalType) {
462
- case 'addLocalFile':
463
- this.ngZone.run(() => {
464
- this.bShowFileModal$ = true;
465
- });
466
- break;
467
- case 'addLocalLink':
468
- this.ngZone.run(() => {
469
- this.bShowLinkModal$ = true;
470
- });
471
- break;
472
- default:
473
- break;
474
- }
475
- }
476
- createModalButtons() {
477
- this.arFileMainButtons$.push({ actionID: 'attach', jsAction: 'attachFiles', name: this.pConn$.getLocalizedValue('Attach files', '', '') });
478
- this.arFileSecondaryButtons$.push({ actionID: 'cancel', jsAction: 'cancel', name: this.pConn$.getLocalizedValue('Cancel', '', '') });
479
- this.arLinkMainButtons$.push({ actionID: 'attach', jsAction: 'attachLinks', name: this.pConn$.getLocalizedValue('Attach links', '', '') });
480
- this.arLinkSecondaryButtons$.push({ actionID: 'cancel', jsAction: 'cancel', name: this.pConn$.getLocalizedValue('Cancel', '', '') });
481
- }
482
- uploadMyFiles($event) {
483
- // alert($event.target.files[0]); // outputs the first file
484
- this.arFiles$ = this.getFiles($event.target.files);
485
- // convert FileList to an array
486
- const myFiles = Array.from(this.arFiles$);
487
- this.arFileList$ = myFiles.map(att => {
488
- return this.getNewListUtilityItemProps({
489
- att,
490
- downloadFile: !att.progress ? () => this.downloadFile(att) : null,
491
- cancelFile: att.progress ? () => this.cancelFile() : null,
492
- deleteFile: !att.progress ? () => this.deleteFile(att) : null,
493
- removeFile: att.error ? () => this.removeNewFile() : null
494
- });
495
- });
496
- }
497
- getFiles(arFiles) {
498
- return this.setNewFiles(arFiles);
499
- }
500
- setNewFiles(arFiles) {
501
- let index = 0;
502
- for (const file of arFiles) {
503
- if (!this.validateMaxSize(file, 5)) {
504
- file.error = true;
505
- file.meta = 'File is too big. Max allowed size is 5MB.';
506
- }
507
- file.mimeType = file.type;
508
- file.icon = this.utils.getIconFromFileType(file.type);
509
- file.ID = `${new Date().getTime()}I${index}`;
510
- index++;
511
- }
512
- return arFiles;
513
- }
514
- validateMaxSize(fileObj, maxSizeInMB) {
515
- const fileSize = (fileObj.size / 1048576).toFixed(2);
516
- return fileSize < maxSizeInMB;
517
- }
518
- onFileActionButtonClick(event) {
519
- // modal buttons
520
- switch (event.action) {
521
- case 'cancel':
522
- this.bShowFileModal$ = false;
523
- this.clearOutFiles();
524
- break;
525
- case 'attachFiles':
526
- this.bShowFileModal$ = false;
527
- this.onAttachFiles(this.arFiles$);
528
- this.clearOutFiles();
529
- break;
530
- default:
531
- break;
532
- }
533
- }
534
- onLinkActionButtonClick(event) {
535
- // modal buttons
536
- switch (event.action) {
537
- case 'cancel':
538
- this.bShowLinkModal$ = false;
539
- this.clearOutLinks();
540
- break;
541
- case 'attachLinks':
542
- this.bShowLinkModal$ = false;
543
- this.onAttachLinks(this.arLinks$);
544
- this.clearOutLinks();
545
- break;
546
- default:
547
- break;
548
- }
549
- }
550
- clearOutFiles() {
551
- this.arFileList$ = [];
552
- this.arFiles$ = [];
553
- }
554
- clearOutLinks() {
555
- this.arLinksList$ = [];
556
- this.arLinks$ = [];
557
- this.link_title$ = '';
558
- this.link_url$ = '';
559
- }
560
- addALink() { }
561
- _fieldOnChangeLink(event) {
562
- this.link_title$ = event.target.value;
563
- }
564
- _fieldOnChangeURL(event) {
565
- this.link_url$ = event.target.value;
566
- }
567
- updateSelf() {
568
- const caseID = this.getCaseID();
569
- if (caseID) {
570
- this.lu_bLoading$ = true;
571
- this.fetchCaseAttachments(caseID)
572
- .then(resp => {
573
- this.handleAttachmentsResponse(resp);
574
- })
575
- .catch(err => {
576
- console.log(err);
577
- })
578
- .finally(() => {
579
- this.lu_bLoading$ = false;
580
- });
581
- }
582
- }
583
- getCaseID() {
584
- return this.pConn$.getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID) || '';
585
- }
586
- fetchCaseAttachments(caseID) {
587
- const attachmentUtils = PCore.getAttachmentUtils();
588
- return attachmentUtils.getCaseAttachments(caseID, this.pConn$.getContextName());
589
- }
590
- handleAttachmentsResponse(resp) {
591
- this.arFullListAttachments = this.addAttachments(resp);
592
- this.lu_count$ = this.arFullListAttachments.length;
593
- this.lu_arActions$ = this.addAttachmentsActions;
594
- this.lu_arItems$ = this.getUtilityItems(this.arFullListAttachments.slice(0, 3));
595
- this.va_arItems$ = this.getUtilityItems(this.arFullListAttachments);
596
- }
597
- getUtilityItems(attachments) {
598
- return attachments.map(this.mapAttachmentToUtilityItem.bind(this));
599
- }
600
- mapAttachmentToUtilityItem(att) {
601
- return this.getListUtilityItemProps({
602
- att,
603
- downloadFile: this.getDownloadFunction(att),
604
- cancelFile: this.getCancelFunction(att),
605
- deleteFile: this.getDeleteFunction(att),
606
- removeFile: this.getRemoveFunction(att)
607
- });
608
- }
609
- getDownloadFunction(att) {
610
- return !att.progress ? () => this.downloadFile(att) : null;
611
- }
612
- getCancelFunction(att) {
613
- return att.progress ? () => this.cancelFile() : null;
614
- }
615
- getDeleteFunction(att) {
616
- return !att.progress ? () => this.deleteFile(att) : null;
617
- }
618
- getRemoveFunction(att) {
619
- return att.error ? () => this.removeFile() : null;
620
- }
621
- caseHasChanged() {
622
- const caseID = this.pConn$.getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID);
623
- if (this.currentCaseID !== caseID) {
624
- this.currentCaseID = caseID;
625
- return true;
626
- }
627
- return false;
628
- }
629
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FileUtilityComponent, deps: [{ token: i1.AngularPConnectService }, { token: i2.Utils }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
630
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FileUtilityComponent, isStandalone: true, selector: "app-file-utility", inputs: { pConn$: "pConn$" }, ngImport: i0, template: "<div>\n <component-mapper\n name=\"ListUtility\"\n [props]=\"{\n name$: lu_name$,\n icon$: lu_icon$,\n bLoading$: lu_bLoading$,\n count$: lu_count$,\n arActions$: lu_arActions$,\n arItems$: lu_arItems$,\n onViewAll$: lu_onViewAllFunction,\n menuIconOverrideAction$: removeFileFromList$\n }\"\n ></component-mapper>\n</div>\n\n<div *ngIf=\"bShowFileModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h3>{{ pConn$.getLocalizedValue('Add local files', '', '') }}</h3>\n <div class=\"psdk-modal-body\">\n <div class=\"psdk-modal-file-selector\">\n <input hidden type=\"file\" multiple #uploader (change)=\"uploadMyFiles($event)\" />\n\n <button mat-stroked-button color=\"primary\" (click)=\"uploader.click()\">{{ pConn$.getLocalizedValue('Upload file(s)', '', '') }}</button>\n </div>\n\n <component-mapper\n name=\"SummaryList\"\n [props]=\"{ arItems$: arFileList$, menuIconOverride$: 'trash', menuIconOverrideAction$: removeFileFromList$ }\"\n ></component-mapper>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFileMainButtons$, arSecondaryButtons$: arFileSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: onFileActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n\n<div *ngIf=\"bShowLinkModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-link-top\">\n <h3>{{ pConn$.getLocalizedValue('Add links', '', '') }}</h3>\n <div class=\"psdk-modal-link-entry\">\n <div class=\"psdk-modal-body\">\n <div class=\"psdk-modal-links-row\">\n <div class=\"psdk-links-two-column\">\n <div class=\"psdk-modal-link-data\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-label>Link title</mat-label>\n <input matInput type=\"text\" required=\"true\" (change)=\"_fieldOnChangeLink($event)\" [value]=\"link_title$\" />\n </mat-form-field>\n </div>\n <div class=\"psdk-modal-link-data\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-label>URL</mat-label>\n <input matInput type=\"text\" required=\"true\" (change)=\"_fieldOnChangeURL($event)\" [value]=\"link_url$\" />\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"psdk-modal-link-add\">\n <button mat-raised-button color=\"primary\" (click)=\"_addLink()\">{{ pConn$.getLocalizedValue('Add link', '', '') }}</button>\n </div>\n </div>\n\n <component-mapper\n name=\"SummaryList\"\n [props]=\"{ arItems$: arLinksList$, menuIconOverride$: 'trash', menuIconOverrideAction$: removeLinksFromList$ }\"\n ></component-mapper>\n </div>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arLinkMainButtons$, arSecondaryButtons$: arLinkSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: onLinkActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n\n<div *ngIf=\"bShowViewAllModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <div class=\"psdk-view-all-header\">\n <div>\n <h3>{{ pConn$.getLocalizedValue('Attachments', '', '') }}</h3>\n </div>\n <div>\n <button mat-icon-button (click)=\"_closeViewAll()\">\n <img class=\"psdk-utility-card-actions-svg-icon\" src=\"{{ closeSvgIcon$ }}\" />\n </button>\n </div>\n </div>\n <div class=\"psdk-view-all-body\">\n <component-mapper name=\"SummaryList\" [props]=\"{ arItems$: va_arItems$, menuIconOverrideAction$: removeLinksFromList$ }\"></component-mapper>\n </div>\n </div>\n</div>\n", styles: [".psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top,.psdk-modal-link-top{display:table;margin:auto;min-width:650px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.3rem;text-align:center}.psdk-modal-link-entry{display:flex;flex-direction:row}.psdk-modal-link-data{flex-grow:3;margin:0 .3rem}.psdk-modal-link-add{flex-grow:1}.psdk-full-width{width:100%}.psdk-modal-body{max-height:500px;overflow-y:auto;overflow-x:hidden;width:100%}.psdk-view-all-header{display:flex;justify-content:space-between}.psdk-view-all-close-icon{width:1.5rem}.psdk-view-all-body{max-height:500px;overflow-y:auto;overflow-x:hidden}.psdk-links-two-column{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem;width:85%}.psdk-modal-links-row{display:flex;flex-direction:row;justify-content:space-between}.psdk-links-add-link{padding:15px}ul{columns:2;-webkit-columns:2;-moz-columns:2}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "directive", type: i0.forwardRef(() => i3.NgIf), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatButtonModule) }, { kind: "component", type: i0.forwardRef(() => i4.MatButton), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(() => i4.MatIconButton), selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatFormFieldModule) }, { kind: "component", type: i0.forwardRef(() => i5.MatFormField), selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i0.forwardRef(() => i5.MatLabel), selector: "mat-label" }, { kind: "ngmodule", type: i0.forwardRef(() => MatInputModule) }, { kind: "directive", type: i0.forwardRef(() => i6.MatInput), selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i0.forwardRef(() => ComponentMapperComponent), selector: "component-mapper", inputs: ["name", "props", "errorMsg", "outputEvents", "parent"] }] }); }
631
- }
632
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FileUtilityComponent, decorators: [{
633
- type: Component,
634
- args: [{ selector: 'app-file-utility', standalone: true, imports: [CommonModule, MatButtonModule, MatFormFieldModule, MatInputModule, forwardRef(() => ComponentMapperComponent)], template: "<div>\n <component-mapper\n name=\"ListUtility\"\n [props]=\"{\n name$: lu_name$,\n icon$: lu_icon$,\n bLoading$: lu_bLoading$,\n count$: lu_count$,\n arActions$: lu_arActions$,\n arItems$: lu_arItems$,\n onViewAll$: lu_onViewAllFunction,\n menuIconOverrideAction$: removeFileFromList$\n }\"\n ></component-mapper>\n</div>\n\n<div *ngIf=\"bShowFileModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h3>{{ pConn$.getLocalizedValue('Add local files', '', '') }}</h3>\n <div class=\"psdk-modal-body\">\n <div class=\"psdk-modal-file-selector\">\n <input hidden type=\"file\" multiple #uploader (change)=\"uploadMyFiles($event)\" />\n\n <button mat-stroked-button color=\"primary\" (click)=\"uploader.click()\">{{ pConn$.getLocalizedValue('Upload file(s)', '', '') }}</button>\n </div>\n\n <component-mapper\n name=\"SummaryList\"\n [props]=\"{ arItems$: arFileList$, menuIconOverride$: 'trash', menuIconOverrideAction$: removeFileFromList$ }\"\n ></component-mapper>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFileMainButtons$, arSecondaryButtons$: arFileSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: onFileActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n\n<div *ngIf=\"bShowLinkModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-link-top\">\n <h3>{{ pConn$.getLocalizedValue('Add links', '', '') }}</h3>\n <div class=\"psdk-modal-link-entry\">\n <div class=\"psdk-modal-body\">\n <div class=\"psdk-modal-links-row\">\n <div class=\"psdk-links-two-column\">\n <div class=\"psdk-modal-link-data\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-label>Link title</mat-label>\n <input matInput type=\"text\" required=\"true\" (change)=\"_fieldOnChangeLink($event)\" [value]=\"link_title$\" />\n </mat-form-field>\n </div>\n <div class=\"psdk-modal-link-data\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-label>URL</mat-label>\n <input matInput type=\"text\" required=\"true\" (change)=\"_fieldOnChangeURL($event)\" [value]=\"link_url$\" />\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"psdk-modal-link-add\">\n <button mat-raised-button color=\"primary\" (click)=\"_addLink()\">{{ pConn$.getLocalizedValue('Add link', '', '') }}</button>\n </div>\n </div>\n\n <component-mapper\n name=\"SummaryList\"\n [props]=\"{ arItems$: arLinksList$, menuIconOverride$: 'trash', menuIconOverrideAction$: removeLinksFromList$ }\"\n ></component-mapper>\n </div>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arLinkMainButtons$, arSecondaryButtons$: arLinkSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: onLinkActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n\n<div *ngIf=\"bShowViewAllModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <div class=\"psdk-view-all-header\">\n <div>\n <h3>{{ pConn$.getLocalizedValue('Attachments', '', '') }}</h3>\n </div>\n <div>\n <button mat-icon-button (click)=\"_closeViewAll()\">\n <img class=\"psdk-utility-card-actions-svg-icon\" src=\"{{ closeSvgIcon$ }}\" />\n </button>\n </div>\n </div>\n <div class=\"psdk-view-all-body\">\n <component-mapper name=\"SummaryList\" [props]=\"{ arItems$: va_arItems$, menuIconOverrideAction$: removeLinksFromList$ }\"></component-mapper>\n </div>\n </div>\n</div>\n", styles: [".psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top,.psdk-modal-link-top{display:table;margin:auto;min-width:650px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.3rem;text-align:center}.psdk-modal-link-entry{display:flex;flex-direction:row}.psdk-modal-link-data{flex-grow:3;margin:0 .3rem}.psdk-modal-link-add{flex-grow:1}.psdk-full-width{width:100%}.psdk-modal-body{max-height:500px;overflow-y:auto;overflow-x:hidden;width:100%}.psdk-view-all-header{display:flex;justify-content:space-between}.psdk-view-all-close-icon{width:1.5rem}.psdk-view-all-body{max-height:500px;overflow-y:auto;overflow-x:hidden}.psdk-links-two-column{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem;width:85%}.psdk-modal-links-row{display:flex;flex-direction:row;justify-content:space-between}.psdk-links-add-link{padding:15px}ul{columns:2;-webkit-columns:2;-moz-columns:2}\n"] }]
635
- }], ctorParameters: () => [{ type: i1.AngularPConnectService }, { type: i2.Utils }, { type: i0.NgZone }], propDecorators: { pConn$: [{
636
- type: Input
637
- }] } });
638
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11dGlsaXR5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy93aWRnZXQvZmlsZS11dGlsaXR5L2ZpbGUtdXRpbGl0eS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2ZpbGUtdXRpbGl0eS9maWxlLXV0aWxpdHkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQVUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sUUFBUSxNQUFNLFlBQVksQ0FBQztBQUdsQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQzs7Ozs7Ozs7QUFjeEcsTUFBTSxPQUFPLG9CQUFvQjtJQThDL0IsWUFDVSxlQUF1QyxFQUN2QyxLQUFZLEVBQ1osTUFBYztRQUZkLG9CQUFlLEdBQWYsZUFBZSxDQUF3QjtRQUN2QyxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQ1osV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQTlDeEIsdUNBQXVDO1FBQ3ZDLHdCQUFtQixHQUF3QixFQUFFLENBQUM7UUFFOUMsMEJBQXFCLEdBQVUsRUFBRSxDQUFDO1FBRWxDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFD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QUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzRCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsR0FBRztRQUNuQixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3BELENBQUM7SUFFRCxjQUFjO1FBQ1osTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNqRixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7WUFDNUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOytHQXh1QlUsb0JBQW9CO21HQUFwQixvQkFBb0IsMEdDdEJqQywyMEhBb0dBLDR6Q0RoRlksWUFBWSw0S0FBRSxlQUFlLHVZQUFFLGtCQUFrQix5V0FBRSxjQUFjLHFaQUFtQix3QkFBd0I7OzRGQUUzRyxvQkFBb0I7a0JBUGhDLFNBQVM7K0JBQ0Usa0JBQWtCLGNBR2hCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO29JQUcvRyxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE5nWm9uZSwgZm9yd2FyZFJlZiwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgZG93bmxvYWQgZnJvbSAnZG93bmxvYWRqcyc7XG5pbXBvcnQgeyBBbmd1bGFyUENvbm5lY3REYXRhLCBBbmd1bGFyUENvbm5lY3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vX2JyaWRnZS9hbmd1bGFyLXBjb25uZWN0JztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vX2hlbHBlcnMvdXRpbHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50TWFwcGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vX2JyaWRnZS9jb21wb25lbnQtbWFwcGVyL2NvbXBvbmVudC1tYXBwZXIuY29tcG9uZW50JztcblxuaW50ZXJmYWNlIEZpbGVVdGlsaXR5UHJvcHMge1xuICAvLyBJZiBhbnksIGVudGVyIGFkZGl0aW9uYWwgcHJvcHMgdGhhdCBvbmx5IGV4aXN0IG9uIHRoaXMgY29tcG9uZW50XG4gIGxhYmVsPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZmlsZS11dGlsaXR5JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbGUtdXRpbGl0eS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGUtdXRpbGl0eS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdEZvcm1GaWVsZE1vZHVsZSwgTWF0SW5wdXRNb2R1bGUsIGZvcndhcmRSZWYoKCkgPT4gQ29tcG9uZW50TWFwcGVyQ29tcG9uZW50KV1cbn0pXG5leHBvcnQgY2xhc3MgRmlsZVV0aWxpdHlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHBDb25uJDogdHlwZW9mIFBDb25uZWN0O1xuXG4gIC8vIEZvciBpbnRlcmFjdGlvbiB3aXRoIEFuZ3VsYXJQQ29ubmVjdFxuICBhbmd1bGFyUENvbm5lY3REYXRhOiBBbmd1bGFyUENvbm5lY3REYXRhID0ge307XG5cbiAgYXJGdWxsTGlzdEF0dGFjaG1lbnRzOiBhbnlbXSA9IFtdO1xuXG4gIGx1X25hbWUkID0gJyc7XG4gIGx1X2ljb24kID0gJyc7XG4gIGx1X2JMb2FkaW5nJCA9IGZhbHNlO1xuICBsdV9jb3VudCQgPSAwO1xuICBsdV9hckFjdGlvbnMkOiBhbnlbXSA9IFtdO1xuICBsdV9hckl0ZW1zJDogYW55ID0gW107XG5cbiAgdmFfYXJJdGVtcyQ6IGFueVtdID0gW107XG5cbiAgbHVfb25WaWV3QWxsRnVuY3Rpb246IGFueTtcblxuICBiU2hvd0ZpbGVNb2RhbCQgPSBmYWxzZTtcbiAgYlNob3dMaW5rTW9kYWwkID0gZmFsc2U7XG4gIGJTaG93Vmlld0FsbE1vZGFsJCA9IGZhbHNlO1xuXG4gIGFyRmlsZU1haW5CdXR0b25zJDogYW55W10gPSBbXTtcbiAgYXJGaWxlU2Vjb25kYXJ5QnV0dG9ucyQ6IGFueVtdID0gW107XG5cbiAgYXJMaW5rTWFpbkJ1dHRvbnMkOiBhbnlbXSA9IFtdO1xuICBhckxpbmtTZWNvbmRhcnlCdXR0b25zJDogYW55W10gPSBbXTtcblxuICBhckZpbGVzJDogYW55W10gPSBbXTtcbiAgYXJGaWxlTGlzdCQ6IGFueVtdID0gW107XG4gIHJlbW92ZUZpbGVGcm9tTGlzdCQ6IGFueTtcblxuICBhckxpbmtzJDogYW55W10gPSBbXTtcbiAgYXJMaW5rc0xpc3QkOiBhbnlbXSA9IFtdO1xuICByZW1vdmVMaW5rc0Zyb21MaXN0JDogYW55O1xuXG4gIGxpbmtfdGl0bGUkID0gJyc7XG4gIGxpbmtfdXJsJCA9ICcnO1xuXG4gIGNsb3NlU3ZnSWNvbiQgPSAnJztcblxuICBjdXJyZW50Q2FzZUlEID0gJyc7XG5cbiAgYWRkQXR0YWNobWVudHNBY3Rpb25zOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhbmd1bGFyUENvbm5lY3Q6IEFuZ3VsYXJQQ29ubmVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1dGlsczogVXRpbHMsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gLy8gRmlyc3QgdGhpbmcgaW4gaW5pdGlhbGl6YXRpb24gaXMgcmVnaXN0ZXJpbmcgYW5kIHN1YnNjcmliaW5nIHRvIHRoZSBBbmd1bGFyUENvbm5lY3Qgc2VydmljZVxuICAgIHRoaXMuYW5ndWxhclBDb25uZWN0RGF0YSA9IHRoaXMuYW5ndWxhclBDb25uZWN0LnJlZ2lzdGVyQW5kU3Vic2NyaWJlQ29tcG9uZW50KHRoaXMsIHRoaXMub25TdGF0ZUNoYW5nZSk7XG5cbiAgICBjb25zdCBjb25maWdQcm9wczogRmlsZVV0aWxpdHlQcm9wcyA9IHRoaXMucENvbm4kLnJlc29sdmVDb25maWdQcm9wcyh0aGlzLnBDb25uJC5nZXRDb25maWdQcm9wcygpKTtcblxuICAgIHRoaXMubHVfbmFtZSQgPSBjb25maWdQcm9wcy5sYWJlbCA/PyAnJztcbiAgICB0aGlzLmx1X2ljb24kID0gJ3BhcGVyLWNsaXAnO1xuXG4gICAgdGhpcy5jbG9zZVN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygndGltZXMnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5hZGRBdHRhY2htZW50c0FjdGlvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIHRleHQ6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdBZGQgZmlsZXMnLCAnJywgJycpLFxuICAgICAgICBpZDogJ2FkZE5ld0ZpbGVzJyxcbiAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5jcmVhdGVNb2RhbCgnYWRkTG9jYWxGaWxlJylcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRleHQ6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdBZGQgbGlua3MnLCAnJywgJycpLFxuICAgICAgICBpZDogJ2FkZE5ld0xpbmtzJyxcbiAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5jcmVhdGVNb2RhbCgnYWRkTG9jYWxMaW5rJylcbiAgICAgIH1cbiAgICBdO1xuICAgIC8vIGNvbnN0IG9uVmlld0FsbENhbGxiYWNrID0gKCkgPT4gdGhpcy5vblZpZXdBbGwodGhpcy5hckZ1bGxMaXN0QXR0YWNobWVudHMpO1xuXG4gICAgdGhpcy5sdV9vblZpZXdBbGxGdW5jdGlvbiA9IHsgb25DbGljazogdGhpcy5vblZpZXdBbGwuYmluZCh0aGlzKSB9O1xuXG4gICAgdGhpcy5yZW1vdmVGaWxlRnJvbUxpc3QkID0geyBvbkNsaWNrOiB0aGlzLnJlbW92ZUZpbGVGcm9tTGlzdC5iaW5kKHRoaXMpIH07XG4gICAgdGhpcy5yZW1vdmVMaW5rc0Zyb21MaXN0JCA9IHsgb25DbGljazogdGhpcy5yZW1vdmVMaW5rc0Zyb21MaXN0LmJpbmQodGhpcykgfTtcblxuICAgIHRoaXMudXBkYXRlU2VsZigpO1xuXG4gICAgdGhpcy5jcmVhdGVNb2RhbEJ1dHRvbnMoKTtcblxuICAgIFBDb3JlLmdldFB1YlN1YlV0aWxzKCkuc3Vic2NyaWJlKFxuICAgICAgKFBDb3JlLmdldEV2ZW50cygpLmdldENhc2VFdmVudCgpIGFzIGFueSkuQ0FTRV9BVFRBQ0hNRU5UU19VUERBVEVEX0ZST01fQ0FTRVZJRVcsXG4gICAgICB0aGlzLnVwZGF0ZVNlbGYuYmluZCh0aGlzKSxcbiAgICAgICdjYXNlQXR0YWNobWVudHNVcGRhdGVGcm9tQ2FzZXZpZXcnXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEudW5zdWJzY3JpYmVGbikge1xuICAgICAgdGhpcy5hbmd1bGFyUENvbm5lY3REYXRhLnVuc3Vic2NyaWJlRm4oKTtcbiAgICB9XG5cbiAgICBQQ29yZS5nZXRQdWJTdWJVdGlscygpLnVuc3Vic2NyaWJlKFxuICAgICAgKFBDb3JlLmdldEV2ZW50cygpLmdldENhc2VFdmVudCgpIGFzIGFueSkuQ0FTRV9BVFRBQ0hNRU5UU19VUERBVEVEX0ZST01fQ0FTRVZJRVcsXG4gICAgICAnY2FzZUF0dGFjaG1lbnRzVXBkYXRlRnJvbUNhc2V2aWV3J1xuICAgICk7XG4gIH1cblxuICAvLyBDYWxsYmFjayBwYXNzZWQgd2hlbiBzdWJzY3JpYmluZyB0byBzdG9yZSBjaGFuZ2VcbiAgb25TdGF0ZUNoYW5nZSgpIHtcbiAgICAvLyBhZGRpbmcgYSBwcm9wZXJ0eSB0byB0cmFjayBpbiBjb25maWdQcm9wcywgd2hlbiBldmVyIHRoZSBhdHRhY2htZW50IGZpbGUgY2hhbmdlc1xuICAgIC8vIG5lZWQgdG8gdHJpZ2dlciBhIHJlZHJhd1xuICAgIHRoaXMucENvbm4kLnJlZ2lzdGVyQWRkaXRpb25hbFByb3BzKHtcbiAgICAgIGxhc3RSZWZyZXNoVGltZTogYEBQICR7UENvcmUuZ2V0Q29uc3RhbnRzKCkuU1VNTUFSWV9PRl9BVFRBQ0hNRU5UU19MQVNUX1JFRlJFU0hfVElNRX1gXG4gICAgfSk7XG5cbiAgICAvLyBTaG91bGQgYWx3YXlzIGNoZWNrIHRoZSBicmlkZ2UgdG8gc2VlIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkIHVwZGF0ZSBpdHNlbGYgKHJlLXJlbmRlcilcbiAgICBjb25zdCBiVXBkYXRlU2VsZiA9IHRoaXMuYW5ndWxhclBDb25uZWN0LnNob3VsZENvbXBvbmVudFVwZGF0ZSh0aGlzKTtcblxuICAgIC8vIE9OTFkgY2FsbCB1cGRhdGVTZWxmIHdoZW4gdGhlIGNvbXBvbmVudCBzaG91bGQgdXBkYXRlXG4gICAgaWYgKGJVcGRhdGVTZWxmIHx8IHRoaXMuY2FzZUhhc0NoYW5nZWQoKSkge1xuICAgICAgdGhpcy51cGRhdGVTZWxmKCk7XG4gICAgfVxuICB9XG5cbiAgb25BdHRhY2hGaWxlcyhmaWxlcykge1xuICAgIGNvbnN0IGF0dGFjaG1lbnRVdGlscyA9IFBDb3JlLmdldEF0dGFjaG1lbnRVdGlscygpO1xuICAgIGNvbnN0IGNhc2VJRCA9IHRoaXMucENvbm4kLmdldFZhbHVlKFBDb3JlLmdldENvbnN0YW50cygpLkNBU0VfSU5GTy5DQVNFX0lORk9fSUQpO1xuXG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubHVfYkxvYWRpbmckID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBhckZpbGVzOiBhbnkgPSBBcnJheS5mcm9tKGZpbGVzKTtcblxuICAgIFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIGFyRmlsZXMubWFwKGZpbGUgPT4gYXR0YWNobWVudFV0aWxzLnVwbG9hZEF0dGFjaG1lbnQoZmlsZSwgdGhpcy5vblVwbG9hZFByb2dyZXNzLCB0aGlzLmVycm9ySGFuZGxlciwgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSkpXG4gICAgKVxuICAgICAgLnRoZW4oKGZpbGVSZXNwb25zZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB1cGxvYWRlZEZpbGVzOiBhbnkgPSBbXTtcbiAgICAgICAgZmlsZVJlc3BvbnNlcy5mb3JFYWNoKGZpbGVSZXNwb25zZSA9PiB7XG4gICAgICAgICAgaWYgKGZpbGVSZXNwb25zZS5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7XG4gICAgICAgICAgICB1cGxvYWRlZEZpbGVzLnB1c2goZmlsZVJlc3BvbnNlLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodXBsb2FkZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgKGF0dGFjaG1lbnRVdGlscy5saW5rQXR0YWNobWVudHNUb0Nhc2UoY2FzZUlELCB1cGxvYWRlZEZpbGVzLCAnRmlsZScsIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpIGFzIFByb21pc2U8YW55PilcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQXR0YWNobWVudHMoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgpO1xuXG4gICAgdGhpcy5hckZpbGVMaXN0JCA9IFtdO1xuICAgIHRoaXMubHVfYkxvYWRpbmckID0gZmFsc2U7XG4gIH1cblxuICByZWZyZXNoQXR0YWNobWVudHMoKSB7XG4gICAgdGhpcy51cGRhdGVTZWxmKCk7XG4gIH1cblxuICBvblVwbG9hZFByb2dyZXNzKCkge31cblxuICBlcnJvckhhbmRsZXIoKSB7fVxuXG4gIG9uQXR0YWNoTGlua3MobGlua3MpIHtcbiAgICBjb25zdCBhdHRhY2htZW50VXRpbHMgPSBQQ29yZS5nZXRBdHRhY2htZW50VXRpbHMoKTtcbiAgICBjb25zdCBjYXNlSUQgPSB0aGlzLnBDb25uJC5nZXRWYWx1ZShQQ29yZS5nZXRDb25zdGFudHMoKS5DQVNFX0lORk8uQ0FTRV9JTkZPX0lEKTtcblxuICAgIGlmIChsaW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmx1X2JMb2FkaW5nJCA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbGlua3NUb0F0dGFjaCA9IGxpbmtzLm1hcChsaW5rID0+ICh7XG4gICAgICB0eXBlOiAnVVJMJyxcbiAgICAgIGNhdGVnb3J5OiAnVVJMJyxcbiAgICAgIHVybDogbGluay51cmwsXG4gICAgICBuYW1lOiBsaW5rLmxpbmtUaXRsZVxuICAgIH0pKTtcblxuICAgIChhdHRhY2htZW50VXRpbHMubGlua0F0dGFjaG1lbnRzVG9DYXNlKGNhc2VJRCwgbGlua3NUb0F0dGFjaCwgJ1VSTCcsIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpIGFzIFByb21pc2U8YW55PilcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWZyZXNoQXR0YWNobWVudHMoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goY29uc29sZS5sb2cpO1xuICB9XG5cbiAgYWRkQXR0YWNobWVudHMoYXR0c0Zyb21SZXNwOiBhbnlbXSA9IFtdKSB7XG4gICAgdGhpcy5sdV9iTG9hZGluZyQgPSBmYWxzZTtcblxuICAgIGF0dHNGcm9tUmVzcCA9IGF0dHNGcm9tUmVzcC5tYXAocmVzcEF0dCA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkQXR0ID0ge1xuICAgICAgICAuLi5yZXNwQXR0LFxuICAgICAgICBtZXRhOiBgJHtyZXNwQXR0LmNhdGVnb3J5fSAuICR7dGhpcy51dGlscy5nZW5lcmF0ZURhdGVUaW1lKHJlc3BBdHQuY3JlYXRlVGltZSwgJ0RhdGVUaW1lLVNpbmNlJyl9LCAke3Jlc3BBdHQuY3JlYXRlZEJ5fWBcbiAgICAgIH07XG4gICAgICBpZiAodXBkYXRlZEF0dC50eXBlID09PSAnRklMRScpIHtcbiAgICAgICAgdXBkYXRlZEF0dC5uYW1lV2l0aEV4dCA9IHVwZGF0ZWRBdHQuZmlsZU5hbWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdXBkYXRlZEF0dDtcbiAgICB9KTtcblxuICAgIHJldHVybiBhdHRzRnJvbVJlc3A7XG4gIH1cblxuICBvblZpZXdBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5iU2hvd1ZpZXdBbGxNb2RhbCQgPSB0cnVlO1xuXG4gICAgLy8gYWRkIGNsaWNrQXdheSBsaXN0ZW5lclxuICAgIC8vIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fY2xpY2tBd2F5LmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8gQmVsb3cgbWV0aG9kIGlzIG5vdCBuZWVkZWQsIHN0aWxsIGhhdmluZyBpdCBjb21tZW50ZWQgaW4gY2FzZSB3ZSB3YW50IGluIGZ1dHVyZVxuICAvLyBfY2xpY2tBd2F5KGV2ZW50OiBhbnkpIHtcbiAgLy8gICBsZXQgYkluUG9wVXAgPSBmYWxzZTtcblxuICAvLyAgIC8vIHJ1biB0aHJvdWdoIGxpc3Qgb2YgZWxlbWVudHMgaW4gcGF0aCwgaWYgbWVudSBub3QgaW4gdGggcGF0aCwgdGhlbiB3YW50IHRvXG4gIC8vICAgLy8gaGlkZSAodG9nZ2xlKSB0aGUgbWVudVxuICAvLyAgIGZvciAoY29uc3QgaSBpbiBldmVudC5wYXRoKSB7XG4gIC8vICAgICBpZiAoZXZlbnQucGF0aFtpXS5jbGFzc05hbWUgPT0gJ3BzZGstbW9kYWwtZmlsZS10b3AnIHx8IGV2ZW50LnBhdGhbaV0udGFnTmFtZSA9PSAnQlVUVE9OJykge1xuICAvLyAgICAgICBiSW5Qb3BVcCA9IHRydWU7XG4gIC8vICAgICAgIGJyZWFrO1xuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gICBpZiAoIWJJblBvcFVwKSB7XG4gIC8vICAgICB0aGlzLmJTaG93Vmlld0FsbE1vZGFsJCA9IGZhbHNlO1xuXG4gIC8vICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2NsaWNrQXdheS5iaW5kKHRoaXMpKTtcbiAgLy8gICB9XG4gIC8vIH1cblxuICBfY2xvc2VWaWV3QWxsKCkge1xuICAgIHRoaXMuYlNob3dWaWV3QWxsTW9kYWwkID0gZmFsc2U7XG5cbiAgICAvLyB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2NsaWNrQXdheS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHJlbW92ZUZpbGVGcm9tTGlzdChpdGVtOiBhbnkpIHtcbiAgICBpZiAoaXRlbSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBhckZpbGVMaXN0ID0gdGhpcy5hckZpbGVMaXN0JDtcbiAgICAgIGNvbnN0IGl0ZW1JZCA9IGl0ZW0uaWQ7XG5cbiAgICAgIGZvciAobGV0IGZpbGVJbmRleCA9IDA7IGZpbGVJbmRleCA8IGFyRmlsZUxpc3QubGVuZ3RoOyBmaWxlSW5kZXgrKykge1xuICAgICAgICBpZiAoYXJGaWxlTGlzdFtmaWxlSW5kZXhdLmlkID09IGl0ZW1JZCkge1xuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZmlsZSBmcm9tIHRoZSBsaXN0IGFuZCByZWRyYXdcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgYXJGaWxlTGlzdC5zcGxpY2UoZmlsZUluZGV4LCAxKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUxpbmtzRnJvbUxpc3QoaXRlbTogYW55KSB7XG4gICAgY29uc3QgbG9jYWxMaW5rc0xpc3QgPSB0aGlzLmFyTGlua3NMaXN0JC5zbGljZSgpO1xuXG4gICAgaWYgKGl0ZW0gIT0gbnVsbCkge1xuICAgICAgY29uc3QgaXRlbUlkID0gaXRlbS5pZDtcblxuICAgICAgZm9yIChsZXQgbGlua0luZGV4ID0gMDsgbGlua0luZGV4IDwgbG9jYWxMaW5rc0xpc3QubGVuZ3RoOyBsaW5rSW5kZXgrKykge1xuICAgICAgICBpZiAobG9jYWxMaW5rc0xpc3RbbGlua0luZGV4XS5pZCA9PSBpdGVtSWQpIHtcbiAgICAgICAgICAvLyByZW1vdmUgdGhlIGZpbGUgZnJvbSB0aGUgbGlzdCBhbmQgcmVkcmF3XG4gICAgICAgICAgbG9jYWxMaW5rc0xpc3Quc3BsaWNlKGxpbmtJbmRleCwgMSk7XG5cbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hckxpbmtzTGlzdCQgPSBsb2NhbExpbmtzTGlzdC5zbGljZSgpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXROZXdMaXN0VXRpbGl0eUl0ZW1Qcm9wcyA9ICh7IGF0dCwgY2FuY2VsRmlsZSwgZG93bmxvYWRGaWxlLCBkZWxldGVGaWxlLCByZW1vdmVGaWxlIH0pID0+IHtcbiAgICBsZXQgYWN0aW9ucztcbiAgICBsZXQgaXNEb3dubG9hZGFibGUgPSBmYWxzZTtcblxuICAgIGlmIChhdHQucHJvZ3Jlc3MgJiYgYXR0LnByb2dyZXNzICE9PSAxMDApIHtcbiAgICAgIGFjdGlvbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogYENhbmNlbC0ke2F0dC5JRH1gLFxuICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxuICAgICAgICAgIGljb246ICd0aW1lcycsXG4gICAgICAgICAgb25DbGljazogY2FuY2VsRmlsZVxuICAgICAgICB9XG4gICAgICBdO1xuICAgIH0gZWxzZSBpZiAoYXR0LmxpbmtzKSB7XG4gICAgICBjb25zdCBpc0ZpbGUgPSBhdHQudHlwZSA9PT0gJ0ZJTEUnO1xuICAgICAgY29uc3QgSUQgPSBhdHQuSUQucmVwbGFjZSgvXFxzL2dpLCAnJyk7XG4gICAgICBjb25zdCBhY3Rpb25zTWFwID0gbmV3IE1hcChbXG4gICAgICAgIFtcbiAgICAgICAgICAnZG93bmxvYWQnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBgZG93bmxvYWQtJHtJRH1gLFxuICAgICAgICAgICAgdGV4dDogaXNGaWxlID8gJ0Rvd25sb2FkJyA6ICdPcGVuJyxcbiAgICAgICAgICAgIGljb246IGlzRmlsZSA/ICdkb3dubG9hZCcgOiAnb3BlbicsXG4gICAgICAgICAgICBvbkNsaWNrOiBkb3dubG9hZEZpbGVcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogYERlbGV0ZS0ke0lEfWAsXG4gICAgICAgICAgICB0ZXh0OiAnRGVsZXRlJyxcbiAgICAgICAgICAgIGljb246ICd0cmFzaCcsXG4gICAgICAgICAgICBvbkNsaWNrOiBkZWxldGVGaWxlXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICBdKTtcbiAgICAgIGFjdGlvbnMgPSBbXTtcbiAgICAgIGFjdGlvbnNNYXAuZm9yRWFjaCgoYWN0aW9uLCBhY3Rpb25LZXkpID0+IHtcbiAgICAgICAgaWYgKGF0dC5saW5rc1thY3Rpb25LZXldKSB7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgaXNEb3dubG9hZGFibGUgPSBhdHQubGlua3MuZG93bmxvYWQ7XG4gICAgfSBlbHNlIGlmIChhdHQuZXJyb3IpIHtcbiAgICAgIGFjdGlvbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogYFJlbW92ZS0ke2F0dC5JRH1gLFxuICAgICAgICAgIHRleHQ6ICdSZW1vdmUnLFxuICAgICAgICAgIGljb246ICd0cmFzaCcsXG4gICAgICAgICAgb25DbGljazogcmVtb3ZlRmlsZVxuICAgICAgICB9XG4gICAgICBdO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogYXR0LklELFxuICAgICAgdmlzdWFsOiB7XG4gICAgICAgIGljb246IHRoaXMudXRpbHMuZ2V0SWNvbkZvckF0dGFjaG1lbnQoYXR0KSxcbiAgICAgICAgcHJvZ3Jlc3M6IGF0dC5wcm9ncmVzcyA9PSAxMDAgPyB1bmRlZmluZWQgOiBhdHQucHJvZ3Jlc3NcbiAgICAgIH0sXG4gICAgICBwcmltYXJ5OiB7XG4gICAgICAgIHR5cGU6IGF0dC50eXBlLFxuICAgICAgICBuYW1lOiBhdHQubmFtZSxcbiAgICAgICAgaWNvbjogJ3RyYXNoJyxcbiAgICAgICAgY2xpY2s6IHJlbW92ZUZpbGVcbiAgICAgIH0sXG4gICAgICBzZWNvbmRhcnk6IHtcbiAgICAgICAgdGV4dDogYXR0Lm1ldGFcbiAgICAgIH0sXG4gICAgICBhY3Rpb25zXG4gICAgfTtcbiAgfTtcblxuICBnZXRMaXN0VXRpbGl0eUl0ZW1Qcm9wcyA9ICh7IGF0dCwgY2FuY2VsRmlsZSwgZG93bmxvYWRGaWxlLCBkZWxldGVGaWxlLCByZW1vdmVGaWxlIH0pID0+IHtcbiAgICBsZXQgYWN0aW9ucztcbiAgICBsZXQgaXNEb3dubG9hZGFibGUgPSBmYWxzZTtcblxuICAgIGlmIChhdHQucHJvZ3Jlc3MgJiYgYXR0LnByb2dyZXNzICE9PSAxMDApIHtcbiAgICAgIGFjdGlvbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogYENhbmNlbC0ke2F0dC5JRH1gLFxuICAgICAgICAgIHRleHQ6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdDYW5jZWwnLCAnJywgJycpLFxuICAgICAgICAgIGljb246ICd0aW1lcycsXG4gICAgICAgICAgb25DbGljazogY2FuY2VsRmlsZVxuICAgICAgICB9XG4gICAgICBdO1xuICAgIH0gZWxzZSBpZiAoYXR0LmxpbmtzKSB7XG4gICAgICBjb25zdCBpc0ZpbGUgPSBhdHQudHlwZSA9PT0gJ0ZJTEUnO1xuICAgICAgY29uc3QgSUQgPSBhdHQuSUQucmVwbGFjZSgvXFxzL2dpLCAnJyk7XG4gICAgICBjb25zdCBhY3Rpb25zTWFwID0gbmV3IE1hcChbXG4gICAgICAgIFtcbiAgICAgICAgICAnZG93bmxvYWQnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBgZG93bmxvYWQtJHtJRH1gLFxuICAgICAgICAgICAgdGV4dDogaXNGaWxlID8gdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ0Rvd25sb2FkJywgJycsICcnKSA6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdPcGVuJywgJycsICcnKSxcbiAgICAgICAgICAgIGljb246IGlzRmlsZSA/ICdkb3dubG9hZCcgOiAnb3BlbicsXG4gICAgICAgICAgICBvbkNsaWNrOiBkb3dubG9hZEZpbGVcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogYERlbGV0ZS0ke0lEfWAsXG4gICAgICAgICAgICB0ZXh0OiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRGVsZXRlJywgJycsICcnKSxcbiAgICAgICAgICAgIGljb246ICd0cmFzaCcsXG4gICAgICAgICAgICBvbkNsaWNrOiBkZWxldGVGaWxlXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICBdKTtcbiAgICAgIGFjdGlvbnMgPSBbXTtcbiAgICAgIGFjdGlvbnNNYXAuZm9yRWFjaCgoYWN0aW9uLCBhY3Rpb25LZXkpID0+IHtcbiAgICAgICAgaWYgKGF0dC5saW5rc1thY3Rpb25LZXldKSB7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgaXNEb3dubG9hZGFibGUgPSBhdHQubGlua3MuZG93bmxvYWQ7XG4gICAgfSBlbHNlIGlmIChhdHQuZXJyb3IpIHtcbiAgICAgIGFjdGlvbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogYFJlbW92ZS0ke2F0dC5JRH1gLFxuICAgICAgICAgIHRleHQ6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdSZW1vdmUnLCAnJywgJycpLFxuICAgICAgICAgIGljb246ICd0cmFzaCcsXG4gICAgICAgICAgb25DbGljazogcmVtb3ZlRmlsZVxuICAgICAgICB9XG4gICAgICBdO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogYXR0LklELFxuICAgICAgdmlzdWFsOiB7XG4gICAgICAgIGljb246IHRoaXMudXRpbHMuZ2V0SWNvbkZvckF0dGFjaG1lbnQoYXR0KSxcbiAgICAgICAgcHJvZ3Jlc3M6IGF0dC5wcm9ncmVzcyA9PSAxMDAgPyB1bmRlZmluZWQgOiBhdHQucHJvZ3Jlc3NcbiAgICAgIH0sXG4gICAgICBwcmltYXJ5OiB7XG4gICAgICAgIHR5cGU6IGF0dC50eXBlLFxuICAgICAgICBuYW1lOiBhdHQubmFtZSxcbiAgICAgICAgaWNvbjogJ29wZW4nLFxuICAgICAgICBjbGljazogZG93bmxvYWRGaWxlXG4gICAgICB9LFxuICAgICAgc2Vjb25kYXJ5OiB7XG4gICAgICAgIHRleHQ6IGF0dC5tZXRhXG4gICAgICB9LFxuICAgICAgYWN0aW9uc1xuICAgIH07XG4gIH07XG5cbiAgX2FkZExpbmsoKSB7XG4gICAgLy8gY29weSBsaXN0IGxvY2FsbHlcbiAgICBjb25zdCBsb2NhbExpc3QgPSB0aGlzLmFyTGlua3NMaXN0JC5zbGljZSgpO1xuXG4gICAgY29uc3QgdXJsID0gdGhpcy5saW5rX3VybCQ7XG5cbiAgICBpZiAoIS9eKGh0dHB8aHR0cHMpOlxcL1xcLy8udGVzdCh0aGlzLmxpbmtfdXJsJCkpIHtcbiAgICAgIHRoaXMubGlua191cmwkID0gYGh0dHA6Ly8ke3RoaXMubGlua191cmwkfWA7XG4gICAgfVxuXG4gICAgLy8gbGlzdCBmb3IgZGlzcGxheVxuICAgIGxldCBvTGluazogYW55ID0ge307XG4gICAgb0xpbmsuaWNvbiA9ICdjaGFpbic7XG5cbiAgICBvTGluay5JRCA9IGAke25ldyBEYXRlKCkuZ2V0VGltZSgpfWA7XG5cbiAgICBvTGluayA9IHRoaXMuZ2V0TmV3TGlzdFV0aWxpdHlJdGVtUHJvcHMoe1xuICAgICAgYXR0OiBvTGluayxcbiAgICAgIGRvd25sb2FkRmlsZTogbnVsbCxcbiAgICAgIGNhbmNlbEZpbGU6IG51bGwsXG4gICAgICBkZWxldGVGaWxlOiBudWxsLFxuICAgICAgcmVtb3ZlRmlsZTogbnVsbFxuICAgIH0pO1xuXG4gICAgb0xpbmsudHlwZSA9ICdVUkwnO1xuICAgIG9MaW5rLnByaW1hcnkudHlwZSA9IG9MaW5rLnR5cGU7XG4gICAgb0xpbmsudmlzdWFsLmljb24gPSAnY2hhaW4nO1xuICAgIG9MaW5rLnByaW1hcnkubmFtZSA9IHRoaXMubGlua190aXRsZSQ7XG4gICAgb0xpbmsucHJpbWFyeS5pY29uID0gJ29wZW4nO1xuICAgIG9MaW5rLnNlY29uZGFyeS50ZXh0ID0gdXJsO1xuXG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIC8vIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGFycmF5IG9yIHN1bW1hcnkgbGlzdCB3b24ndCBkZXRlY3QgY2hhbmdlc1xuICAgICAgdGhpcy5hckxpbmtzTGlzdCQgPSBsb2NhbExpc3Quc2xpY2UoKTtcbiAgICAgIHRoaXMuYXJMaW5rc0xpc3QkLnB1c2gob0xpbmspO1xuXG4gICAgICAvLyBsaXN0IGZvciBhY3R1YWxseSBhdHRhY2htZW50c1xuICAgICAgY29uc3QgbGluazogYW55ID0ge307XG4gICAgICBsaW5rLmlkID0gb0xpbmsuaWQ7XG4gICAgICBsaW5rLmxpbmtUaXRsZSA9IHRoaXMubGlua190aXRsZSQ7XG4gICAgICBsaW5rLnR5cGUgPSBvTGluay50eXBlO1xuICAgICAgbGluay51cmwgPSB1cmw7XG5cbiAgICAgIHRoaXMuYXJMaW5rcyQucHVzaChsaW5rKTtcblxuICAgICAgLy8gY2xlYXIgdmFsdWVzXG4gICAgICB0aGlzLmxpbmtfdGl0bGUkID0gJyc7XG4gICAgICB0aGlzLmxpbmtfdXJsJCA9ICcnO1xuICAgIH0pO1xuICB9XG5cbiAgX2NoYW5nZVRpdGxlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmxpbmtfdGl0bGUkID0gZXZlbnQuc3JjRWxlbWVudC52YWx1ZTtcbiAgfVxuXG4gIF9jaGFuZ2VVcmwoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMubGlua191cmwkID0gZXZlbnQuc3JjRWxlbWVudC52YWx1ZTtcbiAgfVxuXG4gIGRvd25sb2FkRmlsZShhdHQ6IGFueSkge1xuICAgIGNvbnN0IGF0dGFjaFV0aWxzID0gUENvcmUuZ2V0QXR0YWNobWVudFV0aWxzKCk7XG4gICAgY29uc3QgeyBJRCwgbmFtZSwgZXh0ZW5zaW9uLCB0eXBlIH0gPSBhdHQ7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCk7XG5cbiAgICBhdHRhY2hVdGlsc1xuICAgICAgLy8gQHRzLWlnbm9yZSAtIDNyZCBwYXJhbWV0ZXIgXCJyZXNwb25zZUVuY29kaW5nXCIgaXMgb3B0aW9uYWxcbiAgICAgIC5kb3dubG9hZEF0dGFjaG1lbnQoSUQsIGNvbnRleHQpXG4gICAgICAudGhlbigoY29udGVudDogYW55KSA9PiB7XG4gICAgICAgIGlmICh0eXBlID09PSAnRklMRScpIHtcbiAgICAgICAgICB0aGlzLmZpbGVEb3dubG9hZChjb250ZW50LmRhdGEsIG5hbWUsIGV4dGVuc2lvbik7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1VSTCcpIHtcbiAgICAgICAgICBsZXQgeyBkYXRhIH0gPSBjb250ZW50O1xuICAgICAgICAgIGlmICghL14oaHR0cHxodHRwcyk6XFwvXFwvLy50ZXN0KGRhdGEpKSB7XG4gICAgICAgICAgICBkYXRhID0gYC8vJHtkYXRhfWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdpbmRvdy5vcGVuKGNvbnRlbnQuZGF0YSwgJ19ibGFuaycpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGNvbnNvbGUuZXJyb3IpO1xuICB9XG5cbiAgZmlsZURvd25sb2FkID0gKGRhdGEsIGZpbGVOYW1lLCBleHQpID0+IHtcbiAgICBjb25zdCBmaWxlID0gZXh0ID8gYCR7ZmlsZU5hbWV9LiR7ZXh0fWAgOiBmaWxlTmFtZTtcbiAgICBkb3dubG9hZChhdG9iKGRhdGEpLCBmaWxlKTtcbiAgfTtcblxuICBjYW5jZWxGaWxlKCkge1xuICAgIGFsZXJ0KCdjYW5jZWwnKTtcbiAgfVxuXG4gIGRlbGV0ZUZpbGUoYXR0OiBhbnkpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGF0dGFjaFV0aWxzID0gUENvcmUuZ2V0QXR0YWNobWVudFV0aWxzKCk7XG4gICAgICBjb25zdCB7IElEIH0gPSBhdHQ7XG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKTtcblxuICAgICAgYXR0YWNoVXRpbHNcbiAgICAgICAgLmRlbGV0ZUF0dGFjaG1lbnQoSUQsIGNvbnRleHQpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGYoKTtcbiAgICAgICAgICAvLyBsZXQgbmV3QXR0YWNobWVudHM7XG4gICAgICAgICAgLy8gc2V0QXR0YWNobWVudHMoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAvLyAgIG5ld0F0dGFjaG1lbnRzID0gY3VycmVudC5maWx0ZXIoKGZpbGUpID0+IGZpbGUuSUQgIT09IElEKTtcbiAgICAgICAgICAvLyAgIHJldHVybiBuZXdBdHRhY2htZW50cztcbiAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAvLyBpZiAoY2FsbGJhY2tGbikge1xuICAgICAgICAgIC8vICAgY2FsbGJhY2tGbihuZXdBdHRhY2htZW50cyk7XG4gICAgICAgICAgLy8gfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goY29uc29sZS5lcnJvcik7XG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVGaWxlKCkge1xuICAgIGFsZXJ0KCdyZW1vdmUnKTtcbiAgfVxuXG4gIHJlbW92ZU5ld0ZpbGUoKSB7XG4gICAgYWxlcnQoJ3JlbW92ZScpO1xuICB9XG5cbiAgY3JlYXRlTW9kYWwobW9kYWxUeXBlOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKG1vZGFsVHlwZSkge1xuICAgICAgY2FzZSAnYWRkTG9jYWxGaWxlJzpcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmJTaG93RmlsZU1vZGFsJCA9IHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYWRkTG9jYWxMaW5rJzpcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmJTaG93TGlua01vZGFsJCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZU1vZGFsQnV0dG9ucygpIHtcbiAgICB0aGlzLmFyRmlsZU1haW5CdXR0b25zJC5wdXNoKHsgYWN0aW9uSUQ6ICdhdHRhY2gnLCBqc0FjdGlvbjogJ2F0dGFjaEZpbGVzJywgbmFtZTogdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ0F0dGFjaCBmaWxlcycsICcnLCAnJykgfSk7XG4gICAgdGhpcy5hckZpbGVTZWNvbmRhcnlCdXR0b25zJC5wdXNoKHsgYWN0aW9uSUQ6ICdjYW5jZWwnLCBqc0FjdGlvbjogJ2NhbmNlbCcsIG5hbWU6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdDYW5jZWwnLCAnJywgJycpIH0pO1xuXG4gICAgdGhpcy5hckxpbmtNYWluQnV0dG9ucyQucHVzaCh7IGFjdGlvbklEOiAnYXR0YWNoJywganNBY3Rpb246ICdhdHRhY2hMaW5rcycsIG5hbWU6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdBdHRhY2ggbGlua3MnLCAnJywgJycpIH0pO1xuICAgIHRoaXMuYXJMaW5rU2Vjb25kYXJ5QnV0dG9ucyQucHVzaCh7IGFjdGlvbklEOiAnY2FuY2VsJywganNBY3Rpb246ICdjYW5jZWwnLCBuYW1lOiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnQ2FuY2VsJywgJycsICcnKSB9KTtcbiAgfVxuXG4gIHVwbG9hZE15RmlsZXMoJGV2ZW50KSB7XG4gICAgLy8gYWxlcnQoJGV2ZW50LnRhcmdldC5maWxlc1swXSk7IC8vIG91dHB1dHMgdGhlIGZpcnN0IGZpbGVcbiAgICB0aGlzLmFyRmlsZXMkID0gdGhpcy5nZXRGaWxlcygkZXZlbnQudGFyZ2V0LmZpbGVzKTtcblxuICAgIC8vIGNvbnZlcnQgRmlsZUxpc3QgdG8gYW4gYXJyYXlcbiAgICBjb25zdCBteUZpbGVzID0gQXJyYXkuZnJvbSh0aGlzLmFyRmlsZXMkKTtcblxuICAgIHRoaXMuYXJGaWxlTGlzdCQgPSBteUZpbGVzLm1hcChhdHQgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TmV3TGlzdFV0aWxpdHlJdGVtUHJvcHMoe1xuICAgICAgICBhdHQsXG4gICAgICAgIGRvd25sb2FkRmlsZTogIWF0dC5wcm9ncmVzcyA/ICgpID0+IHRoaXMuZG93bmxvYWRGaWxlKGF0dCkgOiBudWxsLFxuICAgICAgICBjYW5jZWxGaWxlOiBhdHQucHJvZ3Jlc3MgPyAoKSA9PiB0aGlzLmNhbmNlbEZpbGUoKSA6IG51bGwsXG4gICAgICAgIGRlbGV0ZUZpbGU6ICFhdHQucHJvZ3Jlc3MgPyAoKSA9PiB0aGlzLmRlbGV0ZUZpbGUoYXR0KSA6IG51bGwsXG4gICAgICAgIHJlbW92ZUZpbGU6IGF0dC5lcnJvciA/ICgpID0+IHRoaXMucmVtb3ZlTmV3RmlsZSgpIDogbnVsbFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRGaWxlcyhhckZpbGVzOiBhbnlbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5zZXROZXdGaWxlcyhhckZpbGVzKTtcbiAgfVxuXG4gIHNldE5ld0ZpbGVzKGFyRmlsZXMpIHtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhckZpbGVzKSB7XG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVNYXhTaXplKGZpbGUsIDUpKSB7XG4gICAgICAgIGZpbGUuZXJyb3IgPSB0cnVlO1xuICAgICAgICBmaWxlLm1ldGEgPSAnRmlsZSBpcyB0b28gYmlnLiBNYXggYWxsb3dlZCBzaXplIGlzIDVNQi4nO1xuICAgICAgfVxuICAgICAgZmlsZS5taW1lVHlwZSA9IGZpbGUudHlwZTtcbiAgICAgIGZpbGUuaWNvbiA9IHRoaXMudXRpbHMuZ2V0SWNvbkZyb21GaWxlVHlwZShmaWxlLnR5cGUpO1xuICAgICAgZmlsZS5JRCA9IGAke25ldyBEYXRlKCkuZ2V0VGltZSgpfUkke2luZGV4fWA7XG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIHJldHVybiBhckZpbGVzO1xuICB9XG5cbiAgdmFsaWRhdGVNYXhTaXplKGZpbGVPYmosIG1heFNpemVJbk1CKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZmlsZVNpemUgPSAoZmlsZU9iai5zaXplIC8gMTA0ODU3NikudG9GaXhlZCgyKTtcbiAgICByZXR1cm4gZmlsZVNpemUgPCBtYXhTaXplSW5NQjtcbiAgfVxuXG4gIG9uRmlsZUFjdGlvbkJ1dHRvbkNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICAvLyBtb2RhbCBidXR0b25zXG4gICAgc3dpdGNoIChldmVudC5hY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2NhbmNlbCc6XG4gICAgICAgIHRoaXMuYlNob3dGaWxlTW9kYWwkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5jbGVhck91dEZpbGVzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYXR0YWNoRmlsZXMnOlxuICAgICAgICB0aGlzLmJTaG93RmlsZU1vZGFsJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uQXR0YWNoRmlsZXModGhpcy5hckZpbGVzJCk7XG5cbiAgICAgICAgdGhpcy5jbGVhck91dEZpbGVzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgb25MaW5rQWN0aW9uQnV0dG9uQ2xpY2soZXZlbnQ6IGFueSkge1xuICAgIC8vIG1vZGFsIGJ1dHRvbnNcbiAgICBzd2l0Y2ggKGV2ZW50LmFjdGlvbikge1xuICAgICAgY2FzZSAnY2FuY2VsJzpcbiAgICAgICAgdGhpcy5iU2hvd0xpbmtNb2RhbCQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmNsZWFyT3V0TGlua3MoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhdHRhY2hMaW5rcyc6XG4gICAgICAgIHRoaXMuYlNob3dMaW5rTW9kYWwkID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25BdHRhY2hMaW5rcyh0aGlzLmFyTGlua3MkKTtcblxuICAgICAgICB0aGlzLmNsZWFyT3V0TGlua3MoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBjbGVhck91dEZpbGVzKCkge1xuICAgIHRoaXMuYXJGaWxlTGlzdCQgPSBbXTtcbiAgICB0aGlzLmFyRmlsZXMkID0gW107XG4gIH1cblxuICBjbGVhck91dExpbmtzKCkge1xuICAgIHRoaXMuYXJMaW5rc0xpc3QkID0gW107XG4gICAgdGhpcy5hckxpbmtzJCA9IFtdO1xuICAgIHRoaXMubGlua190aXRsZSQgPSAnJztcbiAgICB0aGlzLmxpbmtfdXJsJCA9ICcnO1xuICB9XG5cbiAgYWRkQUxpbmsoKSB7fVxuXG4gIF9maWVsZE9uQ2hhbmdlTGluayhldmVudDogYW55KSB7XG4gICAgdGhpcy5saW5rX3RpdGxlJCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgfVxuXG4gIF9maWVsZE9uQ2hhbmdlVVJMKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmxpbmtfdXJsJCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgfVxuXG4gIHVwZGF0ZVNlbGYoKSB7XG4gICAgY29uc3QgY2FzZUlEID0gdGhpcy5nZXRDYXNlSUQoKTtcblxuICAgIGlmIChjYXNlSUQpIHtcbiAgICAgIHRoaXMubHVfYkxvYWRpbmckID0gdHJ1ZTtcblxuICAgICAgdGhpcy5mZXRjaENhc2VBdHRhY2htZW50cyhjYXNlSUQpXG4gICAgICAgIC50aGVuKHJlc3AgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlQXR0YWNobWVudHNSZXNwb25zZShyZXNwKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubHVfYkxvYWRpbmckID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldENhc2VJRCgpIHtcbiAgICByZXR1cm4gdGhpcy5wQ29ubiQuZ2V0VmFsdWUoUENvcmUuZ2V0Q29uc3RhbnRzKCkuQ0FTRV9JTkZPLkNBU0VfSU5GT19JRCkgfHwgJyc7XG4gIH1cblxuICBmZXRjaENhc2VBdHRhY2htZW50cyhjYXNlSUQpIHtcbiAgICBjb25zdCBhdHRhY2htZW50VXRpbHMgPSBQQ29yZS5nZXRBdHRhY2htZW50VXRpbHMoKTtcbiAgICByZXR1cm4gYXR0YWNobWVudFV0aWxzLmdldENhc2VBdHRhY2htZW50cyhjYXNlSUQsIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpO1xuICB9XG5cbiAgaGFuZGxlQXR0YWNobWVudHNSZXNwb25zZShyZXNwKSB7XG4gICAgdGhpcy5hckZ1bGxMaXN0QXR0YWNobWVudHMgPSB0aGlzLmFkZEF0dGFjaG1lbnRzKHJlc3ApO1xuICAgIHRoaXMubHVfY291bnQkID0gdGhpcy5hckZ1bGxMaXN0QXR0YWNobWVudHMubGVuZ3RoO1xuICAgIHRoaXMubHVfYXJBY3Rpb25zJCA9IHRoaXMuYWRkQXR0YWNobWVudHNBY3Rpb25zO1xuXG4gICAgdGhpcy5sdV9hckl0ZW1zJCA9IHRoaXMuZ2V0VXRpbGl0eUl0ZW1zKHRoaXMuYXJGdWxsTGlzdEF0dGFjaG1lbnRzLnNsaWNlKDAsIDMpKTtcbiAgICB0aGlzLnZhX2FySXRlbXMkID0gdGhpcy5nZXRVdGlsaXR5SXRlbXModGhpcy5hckZ1bGxMaXN0QXR0YWNobWVudHMpO1xuICB9XG5cbiAgZ2V0VXRpbGl0eUl0ZW1zKGF0dGFjaG1lbnRzKSB7XG4gICAgcmV0dXJuIGF0dGFjaG1lbnRzLm1hcCh0aGlzLm1hcEF0dGFjaG1lbnRUb1V0aWxpdHlJdGVtLmJpbmQodGhpcykpO1xuICB9XG5cbiAgbWFwQXR0YWNobWVudFRvVXRpbGl0eUl0ZW0oYXR0KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdFV0aWxpdHlJdGVtUHJvcHMoe1xuICAgICAgYXR0LFxuICAgICAgZG93bmxvYWRGaWxlOiB0aGlzLmdldERvd25sb2FkRnVuY3Rpb24oYXR0KSxcbiAgICAgIGNhbmNlbEZpbGU6IHRoaXMuZ2V0Q2FuY2VsRnVuY3Rpb24oYXR0KSxcbiAgICAgIGRlbGV0ZUZpbGU6IHRoaXMuZ2V0RGVsZXRlRnVuY3Rpb24oYXR0KSxcbiAgICAgIHJlbW92ZUZpbGU6IHRoaXMuZ2V0UmVtb3ZlRnVuY3Rpb24oYXR0KVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0RG93bmxvYWRGdW5jdGlvbihhdHQpIHtcbiAgICByZXR1cm4gIWF0dC5wcm9ncmVzcyA/ICgpID0+IHRoaXMuZG93bmxvYWRGaWxlKGF0dCkgOiBudWxsO1xuICB9XG5cbiAgZ2V0Q2FuY2VsRnVuY3Rpb24oYXR0KSB7XG4gICAgcmV0dXJuIGF0dC5wcm9ncmVzcyA/ICgpID0+IHRoaXMuY2FuY2VsRmlsZSgpIDogbnVsbDtcbiAgfVxuXG4gIGdldERlbGV0ZUZ1bmN0aW9uKGF0dCkge1xuICAgIHJldHVybiAhYXR0LnByb2dyZXNzID8gKCkgPT4gdGhpcy5kZWxldGVGaWxlKGF0dCkgOiBudWxsO1xuICB9XG5cbiAgZ2V0UmVtb3ZlRnVuY3Rpb24oYXR0KSB7XG4gICAgcmV0dXJuIGF0dC5lcnJvciA/ICgpID0+IHRoaXMucmVtb3ZlRmlsZSgpIDogbnVsbDtcbiAgfVxuXG4gIGNhc2VIYXNDaGFuZ2VkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNhc2VJRCA9IHRoaXMucENvbm4kLmdldFZhbHVlKFBDb3JlLmdldENvbnN0YW50cygpLkNBU0VfSU5GTy5DQVNFX0lORk9fSUQpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRDYXNlSUQgIT09IGNhc2VJRCkge1xuICAgICAgdGhpcy5jdXJyZW50Q2FzZUlEID0gY2FzZUlEO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCI8ZGl2PlxuICA8Y29tcG9uZW50LW1hcHBlclxuICAgIG5hbWU9XCJMaXN0VXRpbGl0eVwiXG4gICAgW3Byb3BzXT1cIntcbiAgICAgIG5hbWUkOiBsdV9uYW1lJCxcbiAgICAgIGljb24kOiBsdV9pY29uJCxcbiAgICAgIGJMb2FkaW5nJDogbHVfYkxvYWRpbmckLFxuICAgICAgY291bnQkOiBsdV9jb3VudCQsXG4gICAgICBhckFjdGlvbnMkOiBsdV9hckFjdGlvbnMkLFxuICAgICAgYXJJdGVtcyQ6IGx1X2FySXRlbXMkLFxuICAgICAgb25WaWV3QWxsJDogbHVfb25WaWV3QWxsRnVuY3Rpb24sXG4gICAgICBtZW51SWNvbk92ZXJyaWRlQWN0aW9uJDogcmVtb3ZlRmlsZUZyb21MaXN0JFxuICAgIH1cIlxuICA+PC9jb21wb25lbnQtbWFwcGVyPlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCJiU2hvd0ZpbGVNb2RhbCRcIiBjbGFzcz1cInBzZGstZGlhbG9nLWJhY2tncm91bmRcIj5cbiAgPGRpdiBjbGFzcz1cInBzZGstbW9kYWwtZmlsZS10b3BcIj5cbiAgICA8aDM+e3sgcENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdBZGQgbG9jYWwgZmlsZXMnLCAnJywgJycpIH19PC9oMz5cbiAgICA8ZGl2IGNsYXNzPVwicHNkay1tb2RhbC1ib2R5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicHNkay1tb2RhbC1maWxlLXNlbGVjdG9yXCI+XG4gICAgICAgIDxpbnB1dCBoaWRkZW4gdHlwZT1cImZpbGVcIiBtdWx0aXBsZSAjdXBsb2FkZXIgKGNoYW5nZSk9XCJ1cGxvYWRNeUZpbGVzKCRldmVudClcIiAvPlxuXG4gICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJ1cGxvYWRlci5jbGljaygpXCI+e3sgcENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdVcGxvYWQgZmlsZShzKScsICcnLCAnJykgfX08L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8Y29tcG9uZW50LW1hcHBlclxuICAgICAgICBuYW1lPVwiU3VtbWFyeUxpc3RcIlxuICAgICAgICBbcHJvcHNdPVwieyBhckl0ZW1zJDogYXJGaWxlTGlzdCQsIG1lbnVJY29uT3ZlcnJpZGUkOiAndHJhc2gnLCBtZW51SWNvbk92ZXJyaWRlQWN0aW9uJDogcmVtb3ZlRmlsZUZyb21MaXN0JCB9XCJcbiAgICAgID48L2NvbXBvbmVudC1tYXBwZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8Y29tcG9uZW50LW1hcHBlclxuICAgICAgbmFtZT1cIkFjdGlvbkJ1dHRvbnNcIlxuICAgICAgW3Byb3BzXT1cInsgYXJNYWluQnV0dG9ucyQ6IGFyRmlsZU1haW5CdXR0b25zJCwgYXJTZWNvbmRhcnlCdXR0b25zJDogYXJGaWxlU2Vjb25kYXJ5QnV0dG9ucyQgfVwiXG4gICAgICBbcGFyZW50XT1cInRoaXNcIlxuICAgICAgW291dHB1dEV2ZW50c109XCJ7IGFjdGlvbkJ1dHRvbkNsaWNrOiBvbkZpbGVBY3Rpb25CdXR0b25DbGljayB9XCJcbiAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiYlNob3dMaW5rTW9kYWwkXCIgY2xhc3M9XCJwc2RrLWRpYWxvZy1iYWNrZ3JvdW5kXCI+XG4gIDxkaXYgY2xhc3M9XCJwc2RrLW1vZGFsLWxpbmstdG9wXCI+XG4gICAgPGgzPnt7IHBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnQWRkIGxpbmtzJywgJycsICcnKSB9fTwvaDM+XG4gICAgPGRpdiBjbGFzcz1cInBzZGstbW9kYWwtbGluay1lbnRyeVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInBzZGstbW9kYWwtYm9keVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tb2RhbC1saW5rcy1yb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1saW5rcy10d28tY29sdW1uXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tb2RhbC1saW5rLWRhdGFcIj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5MaW5rIHRpdGxlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgcmVxdWlyZWQ9XCJ0cnVlXCIgKGNoYW5nZSk9XCJfZmllbGRPbkNoYW5nZUxpbmsoJGV2ZW50KVwiIFt2YWx1ZV09XCJsaW5rX3RpdGxlJFwiIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1vZGFsLWxpbmstZGF0YVwiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlVSTDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIHJlcXVpcmVkPVwidHJ1ZVwiIChjaGFuZ2UpPVwiX2ZpZWxkT25DaGFuZ2VVUkwoJGV2ZW50KVwiIFt2YWx1ZV09XCJsaW5rX3VybCRcIiAvPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tb2RhbC1saW5rLWFkZFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiX2FkZExpbmsoKVwiPnt7IHBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnQWRkIGxpbmsnLCAnJywgJycpIH19PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxjb21wb25lbnQtbWFwcGVyXG4gICAgICAgICAgbmFtZT1cIlN1bW1hcnlMaXN0XCJcbiAgICAgICAgICBbcHJvcHNdPVwieyBhckl0ZW1zJDogYXJMaW5rc0xpc3QkLCBtZW51SWNvbk92ZXJyaWRlJDogJ3RyYXNoJywgbWVudUljb25PdmVycmlkZUFjdGlvbiQ6IHJlbW92ZUxpbmtzRnJvbUxpc3QkIH1cIlxuICAgICAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8Y29tcG9uZW50LW1hcHBlclxuICAgICAgbmFtZT1cIkFjdGlvbkJ1dHRvbnNcIlxuICAgICAgW3Byb3BzXT1cInsgYXJNYWluQnV0dG9ucyQ6IGFyTGlua01haW5CdXR0b25zJCwgYXJTZWNvbmRhcnlCdXR0b25zJDogYXJMaW5rU2Vjb25kYXJ5QnV0dG9ucyQgfVwiXG4gICAgICBbcGFyZW50XT1cInRoaXNcIlxuICAgICAgW291dHB1dEV2ZW50c109XCJ7IGFjdGlvbkJ1dHRvbkNsaWNrOiBvbkxpbmtBY3Rpb25CdXR0b25DbGljayB9XCJcbiAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiYlNob3dWaWV3QWxsTW9kYWwkXCIgY2xhc3M9XCJwc2RrLWRpYWxvZy1iYWNrZ3JvdW5kXCI+XG4gIDxkaXYgY2xhc3M9XCJwc2RrLW1vZGFsLWZpbGUtdG9wXCI+XG4gICAgPGRpdiBjbGFzcz1cInBzZGstdmlldy1hbGwtaGVhZGVyXCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8aDM+e3sgcENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdBdHRhY2htZW50cycsICcnLCAnJykgfX08L2gzPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiX2Nsb3NlVmlld0FsbCgpXCI+XG4gICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstdXRpbGl0eS1jYXJkLWFjdGlvbnMtc3ZnLWljb25cIiBzcmM9XCJ7eyBjbG9zZVN2Z0ljb24kIH19XCIgLz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHNkay12aWV3LWFsbC1ib2R5XCI+XG4gICAgICA8Y29tcG9uZW50LW1hcHBlciBuYW1lPVwiU3VtbWFyeUxpc3RcIiBbcHJvcHNdPVwieyBhckl0ZW1zJDogdmFfYXJJdGVtcyQsIG1lbnVJY29uT3ZlcnJpZGVBY3Rpb24kOiByZW1vdmVMaW5rc0Zyb21MaXN0JCB9XCI+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19