@thetradeengineorg1/snova-shell-module 0.0.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 (288) hide show
  1. package/README.md +24 -0
  2. package/bundles/thetradeengineorg1-snova-shell-module.umd.js +13896 -0
  3. package/bundles/thetradeengineorg1-snova-shell-module.umd.js.map +1 -0
  4. package/esm2015/lib/globaldependencies/components/componentbase.js +538 -0
  5. package/esm2015/lib/globaldependencies/constants/feature-ids.js +449 -0
  6. package/esm2015/lib/globaldependencies/constants/localstorage-properties.js +38 -0
  7. package/esm2015/lib/globaldependencies/helpers/dom.helper.js +70 -0
  8. package/esm2015/lib/globaldependencies/helpers/fontawesome-icons.js +144 -0
  9. package/esm2015/lib/globaldependencies/helpers/moment-utc-date-adapter.js +37 -0
  10. package/esm2015/lib/globaldependencies/helpers/window.helper.js +32 -0
  11. package/esm2015/lib/globaldependencies/intercepter/jwt.interceptor.js +40 -0
  12. package/esm2015/lib/globaldependencies/pipes/fetchSizedAndCachedImage.pipe.js +36 -0
  13. package/esm2015/lib/globaldependencies/pipes/highLightText.pipe.js +24 -0
  14. package/esm2015/lib/globaldependencies/pipes/orderby-pipe.js +24 -0
  15. package/esm2015/lib/globaldependencies/pipes/removeSpecialCharacters.pipe.js +22 -0
  16. package/esm2015/lib/globaldependencies/pipes/sanitize.pipe.js +24 -0
  17. package/esm2015/lib/globaldependencies/pipes/softlabels.pipes.js +346 -0
  18. package/esm2015/lib/globaldependencies/pipes/utctolocaltime.pipe.js +23 -0
  19. package/esm2015/lib/globaldependencies/pipes/utctolocaltimewithdate.pipe.js +25 -0
  20. package/esm2015/lib/globaldependencies/pipes/workflowstatus.pipes.js +27 -0
  21. package/esm2015/lib/shell-components/components/Payments/account.component.js +50 -0
  22. package/esm2015/lib/shell-components/components/Payments/company-information.js +262 -0
  23. package/esm2015/lib/shell-components/components/Payments/company-plans.component.js +138 -0
  24. package/esm2015/lib/shell-components/components/Payments/document.component.js +57 -0
  25. package/esm2015/lib/shell-components/components/Payments/payment-method.component.js +32 -0
  26. package/esm2015/lib/shell-components/components/Payments/product-service.component.js +143 -0
  27. package/esm2015/lib/shell-components/components/Payments/purchase-more-licenses.js +152 -0
  28. package/esm2015/lib/shell-components/components/Payments/transactions.component.js +60 -0
  29. package/esm2015/lib/shell-components/components/admin-layout/admin-layout.component.js +250 -0
  30. package/esm2015/lib/shell-components/components/all-work-items-dialog/all-work-items-dialog.component.js +89 -0
  31. package/esm2015/lib/shell-components/components/confirmation-dialog/confirmation-dialog.component.js +90 -0
  32. package/esm2015/lib/shell-components/components/export-import-configuration/export-configuration.component.js +357 -0
  33. package/esm2015/lib/shell-components/components/feed-time/feed-time-dialog.component.js +85 -0
  34. package/esm2015/lib/shell-components/components/feed-time/feed-time.component.js +83 -0
  35. package/esm2015/lib/shell-components/components/header-side/header-side.component.js +1642 -0
  36. package/esm2015/lib/shell-components/components/header-top/header-top.component.js +93 -0
  37. package/esm2015/lib/shell-components/components/lives/lives-welcome-page.js +26 -0
  38. package/esm2015/lib/shell-components/components/menu/menu.component.js +2478 -0
  39. package/esm2015/lib/shell-components/components/menu/searchTask.enum.js +10 -0
  40. package/esm2015/lib/shell-components/components/notifications/announcement-dialog.component.js +73 -0
  41. package/esm2015/lib/shell-components/components/notifications/notifications.component.js +449 -0
  42. package/esm2015/lib/shell-components/components/sidebar-top/sidebar-top.component.js +33 -0
  43. package/esm2015/lib/shell-components/components/sidenav/side-bar.component.js +81 -0
  44. package/esm2015/lib/shell-components/components/sidenav/sidenav.component.js +43 -0
  45. package/esm2015/lib/shell-components/components/submit-feedback/submit-feedback.component.js +71 -0
  46. package/esm2015/lib/shell-components/constants/api-urls.js +1052 -0
  47. package/esm2015/lib/shell-components/constants/available-languages.js +25 -0
  48. package/esm2015/lib/shell-components/constants/channel-names.js +38 -0
  49. package/esm2015/lib/shell-components/constants/menu-categories.js +6 -0
  50. package/esm2015/lib/shell-components/constants/notification-routes.js +6 -0
  51. package/esm2015/lib/shell-components/constants/notification-type-ids.js +42 -0
  52. package/esm2015/lib/shell-components/enum/recentSearchType.enum.js +13 -0
  53. package/esm2015/lib/shell-components/models/AppMenuItemModel.js +3 -0
  54. package/esm2015/lib/shell-components/models/AppNotification.js +17 -0
  55. package/esm2015/lib/shell-components/models/AssetAssignedNotificationModel.js +12 -0
  56. package/esm2015/lib/shell-components/models/ChannelUpdateModel.js +3 -0
  57. package/esm2015/lib/shell-components/models/EmployeeStatusModel.js +3 -0
  58. package/esm2015/lib/shell-components/models/IAdjust-screen-options.js +2 -0
  59. package/esm2015/lib/shell-components/models/IBadge.js +2 -0
  60. package/esm2015/lib/shell-components/models/IChildItem.js +2 -0
  61. package/esm2015/lib/shell-components/models/ILayout-change-options.js +2 -0
  62. package/esm2015/lib/shell-components/models/IMenuItem.js +2 -0
  63. package/esm2015/lib/shell-components/models/IlayoutConf.js +2 -0
  64. package/esm2015/lib/shell-components/models/IntroModel.js +3 -0
  65. package/esm2015/lib/shell-components/models/MessageDetails.js +3 -0
  66. package/esm2015/lib/shell-components/models/MessageTypingDetails.js +3 -0
  67. package/esm2015/lib/shell-components/models/NewProjectCreatedNotificationModel.js +10 -0
  68. package/esm2015/lib/shell-components/models/NewProjectFeatureNotificationModel.js +10 -0
  69. package/esm2015/lib/shell-components/models/NotificationsOutPutModel.js +22 -0
  70. package/esm2015/lib/shell-components/models/ProjectSearchCriteriaInputModel.js +3 -0
  71. package/esm2015/lib/shell-components/models/RecentSearchModel.js +5 -0
  72. package/esm2015/lib/shell-components/models/ReportConfigAssignedNotification.js +11 -0
  73. package/esm2015/lib/shell-components/models/ReportSubmittedNotification.js +12 -0
  74. package/esm2015/lib/shell-components/models/RoleUpdatedNotification.js +9 -0
  75. package/esm2015/lib/shell-components/models/UserStoryAssignedNotification.js +13 -0
  76. package/esm2015/lib/shell-components/models/archiveUserStoryModel.js +10 -0
  77. package/esm2015/lib/shell-components/models/companieslist.model.js +3 -0
  78. package/esm2015/lib/shell-components/models/company-model.js +7 -0
  79. package/esm2015/lib/shell-components/models/company-payment-model.js +3 -0
  80. package/esm2015/lib/shell-components/models/dragedWidget.js +3 -0
  81. package/esm2015/lib/shell-components/models/employee-List.js +3 -0
  82. package/esm2015/lib/shell-components/models/employee.js +4 -0
  83. package/esm2015/lib/shell-components/models/entityRoleFeature.js +3 -0
  84. package/esm2015/lib/shell-components/models/export-configuration-model.js +3 -0
  85. package/esm2015/lib/shell-components/models/export-data.module.js +8 -0
  86. package/esm2015/lib/shell-components/models/goalApprovedNotificationModel.js +9 -0
  87. package/esm2015/lib/shell-components/models/import-configuration-model.js +3 -0
  88. package/esm2015/lib/shell-components/models/initialStatusofUsers.js +3 -0
  89. package/esm2015/lib/shell-components/models/invoiceOutput-model.js +3 -0
  90. package/esm2015/lib/shell-components/models/leaveApplicationNotifiction.js +9 -0
  91. package/esm2015/lib/shell-components/models/multiChartsScheduling.js +11 -0
  92. package/esm2015/lib/shell-components/models/parkUserStoryInputModel.js +10 -0
  93. package/esm2015/lib/shell-components/models/project.js +3 -0
  94. package/esm2015/lib/shell-components/models/recentSearchApiModel.js +3 -0
  95. package/esm2015/lib/shell-components/models/searchCriteriaInputModelBase.js +3 -0
  96. package/esm2015/lib/shell-components/models/shellModulesInfo.js +7 -0
  97. package/esm2015/lib/shell-components/models/softlabels-model.js +7 -0
  98. package/esm2015/lib/shell-components/models/sprintReplanRequestedModel.js +9 -0
  99. package/esm2015/lib/shell-components/models/sprintStartedNotificationModel.js +9 -0
  100. package/esm2015/lib/shell-components/models/store-model.js +3 -0
  101. package/esm2015/lib/shell-components/models/store-search-model.js +4 -0
  102. package/esm2015/lib/shell-components/models/themes.model.js +3 -0
  103. package/esm2015/lib/shell-components/models/timesheetenabledisable.js +4 -0
  104. package/esm2015/lib/shell-components/models/user.js +8 -0
  105. package/esm2015/lib/shell-components/models/userStory.js +3 -0
  106. package/esm2015/lib/shell-components/models/userStoryCommentNotificationModel.js +9 -0
  107. package/esm2015/lib/shell-components/models/userStoryUpdateNotificationModel.js +9 -0
  108. package/esm2015/lib/shell-components/models/userstory-custom-fields.model.js +3 -0
  109. package/esm2015/lib/shell-components/models/validation.model.js +2 -0
  110. package/esm2015/lib/shell-components/models/widgetlist.js +6 -0
  111. package/esm2015/lib/shell-components/models/workspaceList.js +3 -0
  112. package/esm2015/lib/shell-components/services/authentication.service.js +96 -0
  113. package/esm2015/lib/shell-components/services/chat.service.js +67 -0
  114. package/esm2015/lib/shell-components/services/common-used.service.js +263 -0
  115. package/esm2015/lib/shell-components/services/feature.service.js +101 -0
  116. package/esm2015/lib/shell-components/services/google-analytics.service.js +24 -0
  117. package/esm2015/lib/shell-components/services/layout.service.js +68 -0
  118. package/esm2015/lib/shell-components/services/payment.service.js +103 -0
  119. package/esm2015/lib/shell-components/services/recentSearch.service.js +90 -0
  120. package/esm2015/lib/shell-components/services/shell.modules.service.js +24 -0
  121. package/esm2015/lib/shell-components/services/signalr.service.js +113 -0
  122. package/esm2015/lib/shell-components/services/theme.service.js +161 -0
  123. package/esm2015/lib/shell-components/shell.module.js +436 -0
  124. package/esm2015/lib/shell-components/shell.routing.js +16 -0
  125. package/esm2015/lib/shell-components/store/actions/authentication.actions.js +260 -0
  126. package/esm2015/lib/shell-components/store/actions/chat.actions.js +248 -0
  127. package/esm2015/lib/shell-components/store/actions/menuitems.actions.js +39 -0
  128. package/esm2015/lib/shell-components/store/actions/notification-validator.action.js +19 -0
  129. package/esm2015/lib/shell-components/store/actions/notifications.actions.js +74 -0
  130. package/esm2015/lib/shell-components/store/effects/authentication.effects.js +503 -0
  131. package/esm2015/lib/shell-components/store/effects/chat.effects.js +139 -0
  132. package/esm2015/lib/shell-components/store/effects/index.js +13 -0
  133. package/esm2015/lib/shell-components/store/effects/menuitems.effects.js +53 -0
  134. package/esm2015/lib/shell-components/store/effects/notification-validator.effects.js +56 -0
  135. package/esm2015/lib/shell-components/store/effects/notifications.effects.js +116 -0
  136. package/esm2015/lib/shell-components/store/reducers/authentication.reducers.js +86 -0
  137. package/esm2015/lib/shell-components/store/reducers/chat.reducers.js +68 -0
  138. package/esm2015/lib/shell-components/store/reducers/index.js +80 -0
  139. package/esm2015/lib/shell-components/store/reducers/menuitems.reducers.js +56 -0
  140. package/esm2015/lib/shell-components/store/reducers/notification-validator.reducers.js +13 -0
  141. package/esm2015/lib/shell-components/store/reducers/notifications.reducers.js +38 -0
  142. package/esm2015/public-api.js +90 -0
  143. package/esm2015/store/reducers/index.js +47 -0
  144. package/esm2015/thetradeengineorg1-snova-shell-module.js +5 -0
  145. package/fesm2015/thetradeengineorg1-snova-shell-module.js +12808 -0
  146. package/fesm2015/thetradeengineorg1-snova-shell-module.js.map +1 -0
  147. package/lib/globaldependencies/components/componentbase.d.ts +455 -0
  148. package/lib/globaldependencies/constants/feature-ids.d.ts +448 -0
  149. package/lib/globaldependencies/constants/localstorage-properties.d.ts +37 -0
  150. package/lib/globaldependencies/helpers/dom.helper.d.ts +7 -0
  151. package/lib/globaldependencies/helpers/fontawesome-icons.d.ts +1 -0
  152. package/lib/globaldependencies/helpers/moment-utc-date-adapter.d.ts +9 -0
  153. package/lib/globaldependencies/helpers/window.helper.d.ts +12 -0
  154. package/lib/globaldependencies/intercepter/jwt.interceptor.d.ts +11 -0
  155. package/lib/globaldependencies/pipes/fetchSizedAndCachedImage.pipe.d.ts +8 -0
  156. package/lib/globaldependencies/pipes/highLightText.pipe.d.ts +8 -0
  157. package/lib/globaldependencies/pipes/orderby-pipe.d.ts +9 -0
  158. package/lib/globaldependencies/pipes/removeSpecialCharacters.pipe.d.ts +8 -0
  159. package/lib/globaldependencies/pipes/sanitize.pipe.d.ts +11 -0
  160. package/lib/globaldependencies/pipes/softlabels.pipes.d.ts +8 -0
  161. package/lib/globaldependencies/pipes/utctolocaltime.pipe.d.ts +8 -0
  162. package/lib/globaldependencies/pipes/utctolocaltimewithdate.pipe.d.ts +8 -0
  163. package/lib/globaldependencies/pipes/workflowstatus.pipes.d.ts +8 -0
  164. package/lib/shell-components/components/Payments/account.component.d.ts +14 -0
  165. package/lib/shell-components/components/Payments/company-information.d.ts +62 -0
  166. package/lib/shell-components/components/Payments/company-plans.component.d.ts +47 -0
  167. package/lib/shell-components/components/Payments/document.component.d.ts +20 -0
  168. package/lib/shell-components/components/Payments/payment-method.component.d.ts +15 -0
  169. package/lib/shell-components/components/Payments/product-service.component.d.ts +48 -0
  170. package/lib/shell-components/components/Payments/purchase-more-licenses.d.ts +37 -0
  171. package/lib/shell-components/components/Payments/transactions.component.d.ts +28 -0
  172. package/lib/shell-components/components/admin-layout/admin-layout.component.d.ts +67 -0
  173. package/lib/shell-components/components/all-work-items-dialog/all-work-items-dialog.component.d.ts +32 -0
  174. package/lib/shell-components/components/confirmation-dialog/confirmation-dialog.component.d.ts +32 -0
  175. package/lib/shell-components/components/export-import-configuration/export-configuration.component.d.ts +60 -0
  176. package/lib/shell-components/components/feed-time/feed-time-dialog.component.d.ts +33 -0
  177. package/lib/shell-components/components/feed-time/feed-time.component.d.ts +27 -0
  178. package/lib/shell-components/components/header-side/header-side.component.d.ts +216 -0
  179. package/lib/shell-components/components/header-top/header-top.component.d.ts +40 -0
  180. package/lib/shell-components/components/lives/lives-welcome-page.d.ts +14 -0
  181. package/lib/shell-components/components/menu/menu.component.d.ts +220 -0
  182. package/lib/shell-components/components/menu/searchTask.enum.d.ts +8 -0
  183. package/lib/shell-components/components/notifications/announcement-dialog.component.d.ts +27 -0
  184. package/lib/shell-components/components/notifications/notifications.component.d.ts +53 -0
  185. package/lib/shell-components/components/sidebar-top/sidebar-top.component.d.ts +10 -0
  186. package/lib/shell-components/components/sidenav/side-bar.component.d.ts +23 -0
  187. package/lib/shell-components/components/sidenav/sidenav.component.d.ts +17 -0
  188. package/lib/shell-components/components/submit-feedback/submit-feedback.component.d.ts +25 -0
  189. package/lib/shell-components/constants/api-urls.d.ts +1051 -0
  190. package/lib/shell-components/constants/available-languages.d.ts +7 -0
  191. package/lib/shell-components/constants/channel-names.d.ts +37 -0
  192. package/lib/shell-components/constants/menu-categories.d.ts +5 -0
  193. package/lib/shell-components/constants/notification-routes.d.ts +5 -0
  194. package/lib/shell-components/constants/notification-type-ids.d.ts +41 -0
  195. package/lib/shell-components/enum/recentSearchType.enum.d.ts +11 -0
  196. package/lib/shell-components/models/AppMenuItemModel.d.ts +12 -0
  197. package/lib/shell-components/models/AppNotification.d.ts +12 -0
  198. package/lib/shell-components/models/AssetAssignedNotificationModel.d.ts +10 -0
  199. package/lib/shell-components/models/ChannelUpdateModel.d.ts +47 -0
  200. package/lib/shell-components/models/EmployeeStatusModel.d.ts +11 -0
  201. package/lib/shell-components/models/IAdjust-screen-options.d.ts +4 -0
  202. package/lib/shell-components/models/IBadge.d.ts +4 -0
  203. package/lib/shell-components/models/IChildItem.d.ts +7 -0
  204. package/lib/shell-components/models/ILayout-change-options.d.ts +4 -0
  205. package/lib/shell-components/models/IMenuItem.d.ts +14 -0
  206. package/lib/shell-components/models/IlayoutConf.d.ts +10 -0
  207. package/lib/shell-components/models/IntroModel.d.ts +3 -0
  208. package/lib/shell-components/models/MessageDetails.d.ts +55 -0
  209. package/lib/shell-components/models/MessageTypingDetails.d.ts +9 -0
  210. package/lib/shell-components/models/NewProjectCreatedNotificationModel.d.ts +8 -0
  211. package/lib/shell-components/models/NewProjectFeatureNotificationModel.d.ts +8 -0
  212. package/lib/shell-components/models/NotificationsOutPutModel.d.ts +41 -0
  213. package/lib/shell-components/models/ProjectSearchCriteriaInputModel.d.ts +10 -0
  214. package/lib/shell-components/models/RecentSearchModel.d.ts +14 -0
  215. package/lib/shell-components/models/ReportConfigAssignedNotification.d.ts +9 -0
  216. package/lib/shell-components/models/ReportSubmittedNotification.d.ts +10 -0
  217. package/lib/shell-components/models/RoleUpdatedNotification.d.ts +7 -0
  218. package/lib/shell-components/models/UserStoryAssignedNotification.d.ts +8 -0
  219. package/lib/shell-components/models/archiveUserStoryModel.d.ts +7 -0
  220. package/lib/shell-components/models/companieslist.model.d.ts +8 -0
  221. package/lib/shell-components/models/company-model.d.ts +31 -0
  222. package/lib/shell-components/models/company-payment-model.d.ts +18 -0
  223. package/lib/shell-components/models/dragedWidget.d.ts +16 -0
  224. package/lib/shell-components/models/employee-List.d.ts +8 -0
  225. package/lib/shell-components/models/employee.d.ts +60 -0
  226. package/lib/shell-components/models/entityRoleFeature.d.ts +9 -0
  227. package/lib/shell-components/models/export-configuration-model.d.ts +8 -0
  228. package/lib/shell-components/models/export-data.module.d.ts +6 -0
  229. package/lib/shell-components/models/goalApprovedNotificationModel.d.ts +8 -0
  230. package/lib/shell-components/models/import-configuration-model.d.ts +3 -0
  231. package/lib/shell-components/models/initialStatusofUsers.d.ts +5 -0
  232. package/lib/shell-components/models/invoiceOutput-model.d.ts +9 -0
  233. package/lib/shell-components/models/leaveApplicationNotifiction.d.ts +7 -0
  234. package/lib/shell-components/models/multiChartsScheduling.d.ts +9 -0
  235. package/lib/shell-components/models/parkUserStoryInputModel.d.ts +7 -0
  236. package/lib/shell-components/models/project.d.ts +28 -0
  237. package/lib/shell-components/models/recentSearchApiModel.d.ts +6 -0
  238. package/lib/shell-components/models/searchCriteriaInputModelBase.d.ts +10 -0
  239. package/lib/shell-components/models/shellModulesInfo.d.ts +16 -0
  240. package/lib/shell-components/models/softlabels-model.d.ts +66 -0
  241. package/lib/shell-components/models/sprintReplanRequestedModel.d.ts +7 -0
  242. package/lib/shell-components/models/sprintStartedNotificationModel.d.ts +7 -0
  243. package/lib/shell-components/models/store-model.d.ts +13 -0
  244. package/lib/shell-components/models/store-search-model.d.ts +7 -0
  245. package/lib/shell-components/models/themes.model.d.ts +9 -0
  246. package/lib/shell-components/models/timesheetenabledisable.d.ts +16 -0
  247. package/lib/shell-components/models/user.d.ts +40 -0
  248. package/lib/shell-components/models/userStory.d.ts +188 -0
  249. package/lib/shell-components/models/userStoryCommentNotificationModel.d.ts +6 -0
  250. package/lib/shell-components/models/userStoryUpdateNotificationModel.d.ts +6 -0
  251. package/lib/shell-components/models/userstory-custom-fields.model.d.ts +6 -0
  252. package/lib/shell-components/models/validation.model.d.ts +5 -0
  253. package/lib/shell-components/models/widgetlist.d.ts +28 -0
  254. package/lib/shell-components/models/workspaceList.d.ts +19 -0
  255. package/lib/shell-components/services/authentication.service.d.ts +18 -0
  256. package/lib/shell-components/services/chat.service.d.ts +16 -0
  257. package/lib/shell-components/services/common-used.service.d.ts +45 -0
  258. package/lib/shell-components/services/feature.service.d.ts +19 -0
  259. package/lib/shell-components/services/google-analytics.service.d.ts +9 -0
  260. package/lib/shell-components/services/layout.service.d.ts +23 -0
  261. package/lib/shell-components/services/payment.service.d.ts +19 -0
  262. package/lib/shell-components/services/recentSearch.service.d.ts +16 -0
  263. package/lib/shell-components/services/shell.modules.service.d.ts +9 -0
  264. package/lib/shell-components/services/signalr.service.d.ts +25 -0
  265. package/lib/shell-components/services/theme.service.d.ts +14 -0
  266. package/lib/shell-components/shell.module.d.ts +117 -0
  267. package/lib/shell-components/shell.routing.d.ts +2 -0
  268. package/lib/shell-components/store/actions/authentication.actions.d.ts +327 -0
  269. package/lib/shell-components/store/actions/chat.actions.d.ts +399 -0
  270. package/lib/shell-components/store/actions/menuitems.actions.d.ts +51 -0
  271. package/lib/shell-components/store/actions/notification-validator.action.d.ts +25 -0
  272. package/lib/shell-components/store/actions/notifications.actions.d.ts +116 -0
  273. package/lib/shell-components/store/effects/authentication.effects.d.ts +54 -0
  274. package/lib/shell-components/store/effects/chat.effects.d.ts +30 -0
  275. package/lib/shell-components/store/effects/index.d.ts +1 -0
  276. package/lib/shell-components/store/effects/menuitems.effects.d.ts +17 -0
  277. package/lib/shell-components/store/effects/notification-validator.effects.d.ts +21 -0
  278. package/lib/shell-components/store/effects/notifications.effects.d.ts +23 -0
  279. package/lib/shell-components/store/reducers/authentication.reducers.d.ts +30 -0
  280. package/lib/shell-components/store/reducers/chat.reducers.d.ts +17 -0
  281. package/lib/shell-components/store/reducers/index.d.ts +59 -0
  282. package/lib/shell-components/store/reducers/menuitems.reducers.d.ts +11 -0
  283. package/lib/shell-components/store/reducers/notification-validator.reducers.d.ts +5 -0
  284. package/lib/shell-components/store/reducers/notifications.reducers.d.ts +10 -0
  285. package/package.json +22 -0
  286. package/public-api.d.ts +80 -0
  287. package/store/reducers/index.d.ts +24 -0
  288. package/thetradeengineorg1-snova-shell-module.d.ts +5 -0
@@ -0,0 +1,449 @@
1
+ import { Component, Input } from "@angular/core";
2
+ import { NavigationEnd } from "@angular/router";
3
+ import { ofType } from "@ngrx/effects";
4
+ import { select } from "@ngrx/store";
5
+ import { Subject } from "rxjs";
6
+ import { takeUntil, tap } from "rxjs/operators";
7
+ import { AuthenticationActionTypes } from "../../store/actions/authentication.actions";
8
+ import { ClearAllNotifications, NotificationsActionTypes, UpsertUnreadNotificationsTriggered } from "../../store/actions/notifications.actions";
9
+ import * as sharedModuleReducers from "../../store/reducers/index";
10
+ import { NotificationTypeIds } from '../../constants/notification-type-ids';
11
+ import { LocalStorageProperties } from '../../../globaldependencies/constants/localstorage-properties';
12
+ import { ChannelNames } from '../../constants/channel-names';
13
+ import '../../../globaldependencies/helpers/fontawesome-icons';
14
+ import * as _ from "underscore";
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "@angular/router";
17
+ import * as i2 from "pubnub-angular2";
18
+ import * as i3 from "@ngrx/store";
19
+ import * as i4 from "@ngrx/effects";
20
+ import * as i5 from "ngx-cookie-service";
21
+ import * as i6 from "ngx-toastr";
22
+ import * as i7 from "@angular/material/dialog";
23
+ import * as i8 from "../../../globaldependencies/pipes/orderby-pipe";
24
+ import * as i9 from "../../services/signalr.service";
25
+ import * as i10 from "@angular/material/list";
26
+ import * as i11 from "@angular/material/divider";
27
+ import * as i12 from "@angular/common";
28
+ import * as i13 from "@angular/flex-layout/extended";
29
+ import * as i14 from "@ngx-translate/core";
30
+ import * as i15 from "../../../globaldependencies/pipes/sanitize.pipe";
31
+ import * as i16 from "ngx-timeago";
32
+ import * as i17 from "../../../globaldependencies/pipes/utctolocaltime.pipe";
33
+ export class NotificationsComponent {
34
+ constructor(router, pubnub, store, actionUpdates$, cookieService, toastr, dialog, orderByPipe, signalr, cdRef) {
35
+ this.router = router;
36
+ this.pubnub = pubnub;
37
+ this.store = store;
38
+ this.actionUpdates$ = actionUpdates$;
39
+ this.cookieService = cookieService;
40
+ this.toastr = toastr;
41
+ this.dialog = dialog;
42
+ this.orderByPipe = orderByPipe;
43
+ this.signalr = signalr;
44
+ this.cdRef = cdRef;
45
+ this.ngDestroyed$ = new Subject();
46
+ this.constNotification_WorkItemAssignedToUser = NotificationTypeIds.Notification_WorkItemAssignedToUser;
47
+ this.notificationColor = false;
48
+ this.newNotifications = [];
49
+ this.actionUpdates$
50
+ .pipe(takeUntil(this.ngDestroyed$), ofType(AuthenticationActionTypes.UserDetailsFetchedAfterLogin), tap(() => {
51
+ if (this.cookieService.check(LocalStorageProperties.CurrentUserId)) {
52
+ const CurrentUserId = this.cookieService.get(LocalStorageProperties.CurrentUserId);
53
+ // Subscribe to Task Assignment Notificaitons here.
54
+ const taskAssignmentChannelToSubscribeInto = ChannelNames.Channel_TaskAssignments + CurrentUserId;
55
+ const tastatusReportSubmissionChannelToSubscribeInto = ChannelNames.Channel_StatusReportSubmission + CurrentUserId;
56
+ const tastatusConfigAssignChannelToSubscribeInto = ChannelNames.Channel_StatusConfigAssign + CurrentUserId;
57
+ const multiChartsSchedulingChannelToSubscribeInto = ChannelNames.Channel_MultiChartsScheduling + CurrentUserId;
58
+ const assetsAssignedChannelToSubscribeInto = ChannelNames.Channel_AssetAssignment + CurrentUserId;
59
+ const projectCreatedChannelToSubscribeInto = ChannelNames.Channel_NewProject + CurrentUserId;
60
+ const projectAccessToMemberChannelToSubscribeInto = ChannelNames.Channel_ProjectMemberRole + CurrentUserId;
61
+ const goalApprovedChannelToSubscribeInto = ChannelNames.Channel_GoalApprovedFromReplan + CurrentUserId;
62
+ const userStoryUpdateChannelToSubscribeInto = ChannelNames.Channel_UserStoryUpdateNotification + CurrentUserId;
63
+ const AnnouncementChannelToSubscribeInto = ChannelNames.Channel_AnnouncementNotification + CurrentUserId;
64
+ const ReminderChannelToSubscribeInto = ChannelNames.Channel_ReminderNotification + CurrentUserId;
65
+ const PerformanceChannelToSubscribeInto = ChannelNames.Channel_PeroformanceNotification + CurrentUserId;
66
+ const userStoryCommentChannelToSubscribeInto = ChannelNames.Channel_UserStoryComment + CurrentUserId;
67
+ const sprintStartedChannelToSubscribeInto = ChannelNames.Channel_SprintStarted + CurrentUserId;
68
+ const sprintReplanChannelToSubscribeInto = ChannelNames.Channel_SprintRequestedToReplan + CurrentUserId;
69
+ const leaveAppliedChannelToSubscribeInto = ChannelNames.Channel_LeaveApplied + CurrentUserId;
70
+ const ApproveLeaveChannelToSubscribeInto = ChannelNames.Channel_ApproveLeave + CurrentUserId;
71
+ const RejectLeaveChannelToSubscribeInto = ChannelNames.Channel_RejectLeave + CurrentUserId;
72
+ const ResignationChannelToSubscribeInto = ChannelNames.Channel_Resignation + CurrentUserId;
73
+ const ApproveResignationChannelToSubscribeInto = ChannelNames.Channel_ApproveResignation + CurrentUserId;
74
+ const RejectResignationChannelToSubscribeInto = ChannelNames.Channel_RejectResignation + CurrentUserId;
75
+ const AutoTImesheetSubmissionChannelToSubscribeInto = ChannelNames.Channel_AutoTimesheetSubmission + CurrentUserId;
76
+ const ProbationAssignNotification = ChannelNames.Channel_ProbationAssignNotification + CurrentUserId;
77
+ const ReviewAssignToEmployeeNotification = ChannelNames.Channel_ReviewAssignToEmployeeNotification + CurrentUserId;
78
+ const ReviewSubmittedByEmployeeNotification = ChannelNames.Channel_ReviewSubmittedByEmployeeNotification + CurrentUserId;
79
+ const ReviewInvitationNotificationModel = ChannelNames.Channel_ReviewInvitationNotificationModel + CurrentUserId;
80
+ const PerformanceReviewSubmittedByEmployeeNotification = ChannelNames.Channel_PerformanceReviewSubmittedByEmployeeNotification + CurrentUserId;
81
+ const PerformanceReviewInvitationNotificationModel = ChannelNames.Channel_PerformanceReviewInvitationNotificationModel + CurrentUserId;
82
+ const PerformanceReviewAssignToEmployeeNotification = ChannelNames.Channel_PerformanceReviewAssignToEmployeeNotification + CurrentUserId;
83
+ console.log("subscribing to " + taskAssignmentChannelToSubscribeInto);
84
+ console.log("subscribing to " + tastatusReportSubmissionChannelToSubscribeInto);
85
+ console.log("subscribing to " + tastatusConfigAssignChannelToSubscribeInto);
86
+ console.log("subscribing to" + assetsAssignedChannelToSubscribeInto);
87
+ console.log("subscribing to" + projectCreatedChannelToSubscribeInto);
88
+ console.log("subscribing to" + projectAccessToMemberChannelToSubscribeInto);
89
+ console.log("subscribing to" + goalApprovedChannelToSubscribeInto);
90
+ console.log("subscribing to" + userStoryUpdateChannelToSubscribeInto);
91
+ console.log("subscribing to" + AnnouncementChannelToSubscribeInto);
92
+ console.log("subscribing to" + userStoryCommentChannelToSubscribeInto);
93
+ console.log("subscribing to" + sprintStartedChannelToSubscribeInto);
94
+ console.log("subscribing to" + sprintReplanChannelToSubscribeInto);
95
+ console.log("subscribing to" + ReminderChannelToSubscribeInto);
96
+ console.log("subscribing to" + PerformanceChannelToSubscribeInto);
97
+ this.pubnub.subscribe({
98
+ channels: [taskAssignmentChannelToSubscribeInto, tastatusReportSubmissionChannelToSubscribeInto,
99
+ ProbationAssignNotification, ReviewAssignToEmployeeNotification, ReviewSubmittedByEmployeeNotification,
100
+ ReviewInvitationNotificationModel, PerformanceReviewSubmittedByEmployeeNotification, PerformanceReviewAssignToEmployeeNotification,
101
+ tastatusConfigAssignChannelToSubscribeInto, multiChartsSchedulingChannelToSubscribeInto, PerformanceReviewInvitationNotificationModel,
102
+ assetsAssignedChannelToSubscribeInto, projectCreatedChannelToSubscribeInto, ,
103
+ projectAccessToMemberChannelToSubscribeInto, goalApprovedChannelToSubscribeInto,
104
+ userStoryUpdateChannelToSubscribeInto, AnnouncementChannelToSubscribeInto, ReminderChannelToSubscribeInto, RejectResignationChannelToSubscribeInto,
105
+ userStoryCommentChannelToSubscribeInto, sprintStartedChannelToSubscribeInto, ResignationChannelToSubscribeInto, ApproveResignationChannelToSubscribeInto,
106
+ sprintReplanChannelToSubscribeInto, leaveAppliedChannelToSubscribeInto, ApproveLeaveChannelToSubscribeInto, RejectLeaveChannelToSubscribeInto,
107
+ PerformanceChannelToSubscribeInto, AutoTImesheetSubmissionChannelToSubscribeInto]
108
+ });
109
+ // Add other subscriptions here.
110
+ }
111
+ else {
112
+ console.log("User not logged in yet to be able to subscribe.");
113
+ }
114
+ }))
115
+ .subscribe();
116
+ this.actionUpdates$
117
+ .pipe(takeUntil(this.ngDestroyed$), ofType(AuthenticationActionTypes.UserDetailsFetchedAfterLogin), tap(() => {
118
+ var roleUpdatesChannelToSubscribeInto = ChannelNames.Channel_RoleUpdates + "19B6F9FC-7370-4B9C-A05C-3B8D819EEEAF";
119
+ console.log("subscribing to " + roleUpdatesChannelToSubscribeInto);
120
+ this.pubnub.subscribe({
121
+ channels: [roleUpdatesChannelToSubscribeInto]
122
+ });
123
+ }))
124
+ .subscribe();
125
+ this.actionUpdates$
126
+ .pipe(takeUntil(this.ngDestroyed$), ofType(NotificationsActionTypes.ClearAllUnreadNotificationsCompleted), tap(() => {
127
+ this.notifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationAll));
128
+ this.notifications$.subscribe(x => {
129
+ this.notifications = x;
130
+ });
131
+ }))
132
+ .subscribe();
133
+ // const storeListner = (message) => {
134
+ // console.log("---------Received pubnub message---------");
135
+ // // this.toastr.info(message.message.Summary);
136
+ // try {
137
+ // // Receiving the User Story Assigned Notification
138
+ // if (message.message.NotificationTypeGuid == NotificationTypeIds.Notification_WorkItemAssignedToUser) {
139
+ // var userStoryAssignedNotification = new UserStoryAssignedNotification();
140
+ // userStoryAssignedNotification.loadFromCaseInsensitiveObject(message.message);
141
+ // userStoryAssignedNotification.route = ChannelRoutes.ViewWorkItem + userStoryAssignedNotification.notificationId;
142
+ // this.store.dispatch(new NewNotificationReceived(userStoryAssignedNotification));
143
+ // } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Notification_RoleUpdated) {
144
+ // var roleUpdatedNotification = new RoleUpdatedNotification();
145
+ // roleUpdatedNotification.loadFromCaseInsensitiveObject(message.message);
146
+ // roleUpdatedNotification.route = ChannelRoutes.ViewAccount;
147
+ // this.store.dispatch(new NewNotificationReceived(roleUpdatedNotification));
148
+ // this.store.dispatch(new RolesFetchTriggered());
149
+ // } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Status_Report_Sumitted) {
150
+ // var reportSubmittedNotification = new ReportSubmittedNotification();
151
+ // reportSubmittedNotification.loadFromCaseInsensitiveObject(message.message);
152
+ // reportSubmittedNotification.route = ChannelRoutes.ViewAccount;
153
+ // this.store.dispatch(new NewNotificationReceived(reportSubmittedNotification));
154
+ // this.store.dispatch(new RolesFetchTriggered());
155
+ // } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Status_Report_Config_Created) {
156
+ // var reportConfigAssignedNotification = new ReportConfigAssignedNotification();
157
+ // reportConfigAssignedNotification.loadFromCaseInsensitiveObject(message.message);
158
+ // reportConfigAssignedNotification.route = ChannelRoutes.ViewAccount;
159
+ // this.store.dispatch(new NewNotificationReceived(reportConfigAssignedNotification));
160
+ // this.store.dispatch(new RolesFetchTriggered());
161
+ // } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Multiple_Charts_Scheduling_created) {
162
+ // var multipleChartsScheduling = new MultipleChartsScheduling();
163
+ // multipleChartsScheduling.loadFromCaseInsensitiveObject(message.message);
164
+ // multipleChartsScheduling.route = ChannelRoutes.ViewAccount;
165
+ // this.store.dispatch(new NewNotificationReceived(multipleChartsScheduling));
166
+ // this.store.dispatch(new RolesFetchTriggered());
167
+ // } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Assets_Assignment) {
168
+ // const assetAssignedNotification = new AssetAssignedNotification();
169
+ // assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
170
+ // assetAssignedNotification.route = ChannelRoutes.ViewAccount;
171
+ // this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
172
+ // this.store.dispatch(new RolesFetchTriggered());
173
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Reminder_Notification.toString().toLowerCase()) {
174
+ // const assetAssignedNotification = new AssetAssignedNotification();
175
+ // assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
176
+ // assetAssignedNotification.route = ChannelRoutes.ViewAccount;
177
+ // this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
178
+ // this.store.dispatch(new RolesFetchTriggered());
179
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Announcement_Received.toString().toLowerCase()) {
180
+ // const assetAssignedNotification = new AssetAssignedNotification();
181
+ // assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
182
+ // assetAssignedNotification.route = ChannelRoutes.ViewAccount;
183
+ // this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
184
+ // this.store.dispatch(new RolesFetchTriggered());
185
+ // if (message.message.Id != this.announceNotificationId) {
186
+ // this.announceNotificationId = message.message.Id;
187
+ // this.openAnnouncementDialog(message.message);
188
+ // }
189
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Performance_Received.toString().toLowerCase() || message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
190
+ // const newProjectCreatedNotification = new NewProjectCreatedNotificationModel();
191
+ // newProjectCreatedNotification.loadFromCaseInsensitiveObject(message.message);
192
+ // newProjectCreatedNotification.route = ChannelRoutes.ViewAccount;
193
+ // this.store.dispatch(new NewNotificationReceived(newProjectCreatedNotification));
194
+ // this.store.dispatch(new RolesFetchTriggered());
195
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.NewProjectCreatedNotificationId.toString().toLowerCase() || message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
196
+ // const newProjectCreatedNotification = new NewProjectCreatedNotificationModel();
197
+ // newProjectCreatedNotification.loadFromCaseInsensitiveObject(message.message);
198
+ // newProjectCreatedNotification.route = ChannelRoutes.ViewAccount;
199
+ // this.store.dispatch(new NewNotificationReceived(newProjectCreatedNotification));
200
+ // this.store.dispatch(new RolesFetchTriggered());
201
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.GoalApprovedFromReplan.toString().toLowerCase()) {
202
+ // const goalApprovedNotificationModel = new GoalApprovedNotificationModel();
203
+ // goalApprovedNotificationModel.loadFromCaseInsensitiveObject(message.message);
204
+ // goalApprovedNotificationModel.route = ChannelRoutes.ViewAccount;
205
+ // this.store.dispatch(new NewNotificationReceived(goalApprovedNotificationModel));
206
+ // this.store.dispatch(new RolesFetchTriggered());
207
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.USerStoryUpdateNotificationId.toString().toLowerCase()) {
208
+ // const userStoryUpdateNotificationModel = new UserStoryUpdateNotificationModel();
209
+ // userStoryUpdateNotificationModel.loadFromCaseInsensitiveObject(message.message);
210
+ // userStoryUpdateNotificationModel.route = ChannelRoutes.ViewAccount;
211
+ // this.store.dispatch(new NewNotificationReceived(userStoryUpdateNotificationModel));
212
+ // this.store.dispatch(new RolesFetchTriggered());
213
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.PushNotificationForUserStoryComment.toString().toLowerCase()) {
214
+ // const userStoryCommentNotificationModel = new UserStoryCommentNotificationModel();
215
+ // userStoryCommentNotificationModel.loadFromCaseInsensitiveObject(message.message);
216
+ // userStoryCommentNotificationModel.route = ChannelRoutes.ViewAccount;
217
+ // this.store.dispatch(new NewNotificationReceived(userStoryCommentNotificationModel));
218
+ // this.store.dispatch(new RolesFetchTriggered());
219
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.SprintStarted.toString().toLowerCase()) {
220
+ // const sprintStartedNotificationModel = new SprintStartedNotificationModel();
221
+ // sprintStartedNotificationModel.loadFromCaseInsensitiveObject(message.message);
222
+ // sprintStartedNotificationModel.route = ChannelRoutes.ViewAccount;
223
+ // this.store.dispatch(new NewNotificationReceived(sprintStartedNotificationModel));
224
+ // this.store.dispatch(new RolesFetchTriggered());
225
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.SprintRequestdForREplan.toString().toLowerCase()) {
226
+ // const sprintReplanStartedNotificationModel = new SprintReplanStartedNotificationModel();
227
+ // sprintReplanStartedNotificationModel.loadFromCaseInsensitiveObject(message.message);
228
+ // sprintReplanStartedNotificationModel.route = ChannelRoutes.ViewAccount;
229
+ // this.store.dispatch(new NewNotificationReceived(sprintReplanStartedNotificationModel));
230
+ // this.store.dispatch(new RolesFetchTriggered());
231
+ // } else {
232
+ // // TODO: Send these errors onto server for further processing
233
+ // console.log("Found undetected notification type. " + message.message.NotificationTypeGuid);
234
+ // }
235
+ // // Add other notifications here.
236
+ // } catch (exception) {
237
+ // // TODO: Send these exceptions onto server for further processing
238
+ // console.log("Exception Occured" + exception.message);
239
+ // }
240
+ // };
241
+ // this.pubnub.addListener({
242
+ // status: st => {
243
+ // if (st.category === "PNUnknownCategory") {
244
+ // var newState = {
245
+ // new: "error"
246
+ // };
247
+ // this.pubnub.setState(
248
+ // {
249
+ // state: newState
250
+ // }
251
+ // // function (status) {
252
+ // // console.log(st.errorData.message);
253
+ // // }
254
+ // );
255
+ // }
256
+ // },
257
+ // message: message => {
258
+ // console.log("subscribed to " + message);
259
+ // storeListner(message);
260
+ // }
261
+ // });
262
+ }
263
+ ngOnInit() {
264
+ this.router.events
265
+ .pipe(takeUntil(this.ngDestroyed$))
266
+ .subscribe((routeChange) => {
267
+ if (routeChange instanceof NavigationEnd) {
268
+ if (this.notificPanel) {
269
+ this.notificPanel.close();
270
+ }
271
+ }
272
+ });
273
+ this.signalr.notifications$.subscribe((data) => {
274
+ this.newNotifications = data && data.length > 0 ? data : [];
275
+ this.cdRef.detectChanges();
276
+ });
277
+ this.getSoftLabelConfigurations();
278
+ this.notifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationAll), tap(x => console.log(x)));
279
+ this.authenticatedUserRecord$ = this.store.pipe(select(sharedModuleReducers.getAuthenticatedUserModel));
280
+ this.loadingNotifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationsLoading));
281
+ }
282
+ getSoftLabelConfigurations() {
283
+ this.softLabels = JSON.parse(localStorage.getItem('SoftLabels'));
284
+ }
285
+ clearAll(e) {
286
+ const notifications = [];
287
+ this.notifications.forEach((element) => {
288
+ notifications.push(element);
289
+ });
290
+ this.store.dispatch(new ClearAllNotifications(notifications));
291
+ e.preventDefault();
292
+ this.notificationColor = !this.notificationColor;
293
+ }
294
+ // openAnnouncementDialog(announced) {
295
+ // this.dialog.closeAll();
296
+ // const dialogRef = this.dialog.open(AnnoucementDialogComponent, {
297
+ // minWidth: "60vw",
298
+ // maxWidth: "60vw",
299
+ // minHeight: "50vh",
300
+ // maxHeight: "80vh",
301
+ // disableClose: true,
302
+ // data: {
303
+ // announcementId: announced.AnnouncementId,
304
+ // announcement: announced.Announcement,
305
+ // announcedBy: announced.AnnouncedBy,
306
+ // announcedById: announced.AnnouncedById,
307
+ // announcedByUserImage: announced.AnnouncedByUserImage,
308
+ // announcedOn: announced.AnnouncedOn
309
+ // }
310
+ // });
311
+ // dialogRef.componentInstance.closeMatDialog.subscribe((result) => {
312
+ // const index = this.notifications.findIndex((p) => p.notificationId.toString().toLowerCase() == this.announceNotificationId.toString().toLowerCase());
313
+ // if (index > -1) {
314
+ // this.upsertReadNotification(this.notifications[index]);
315
+ // }
316
+ // });
317
+ // }
318
+ upsertReadNotification(selectedNotification) {
319
+ const notifications = [];
320
+ var roles = JSON.parse(localStorage.getItem(LocalStorageProperties.RoleFeatures));
321
+ let Feature_ApproveOrRejectLeave = '2C22916F-B80B-4C51-9534-23F698DE120B';
322
+ let canAccess_feature_ApproveOrRejectLeave = _.find(roles, function (role) { return role['featureId'].toLowerCase() == Feature_ApproveOrRejectLeave.toString().toLowerCase(); }) != null;
323
+ const CurrentUserId = this.cookieService.get(LocalStorageProperties.CurrentUserId);
324
+ notifications.push(selectedNotification);
325
+ const notiifcationmodel = JSON.parse(selectedNotification.notificationJson);
326
+ if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
327
+ NotificationTypeIds.NewProjectCreatedNotificationId.toString().toLowerCase() ||
328
+ selectedNotification.notificationTypeId.toString().toLowerCase() ==
329
+ NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
330
+ this.router.navigate(["projects/projectstatus/" + notiifcationmodel.ProjectGuid + "/active-goals"]);
331
+ }
332
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
333
+ NotificationTypeIds.GoalApprovedFromReplan.toString().toLowerCase()) {
334
+ this.router.navigate(["projects/goal/" + notiifcationmodel.GoalGuid]);
335
+ }
336
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
337
+ NotificationTypeIds.Notification_WorkItemAssignedToUser.toString().toLowerCase()) {
338
+ this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryGuid]);
339
+ }
340
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
341
+ NotificationTypeIds.USerStoryUpdateNotificationId.toString().toLowerCase()) {
342
+ this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryId]);
343
+ }
344
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
345
+ NotificationTypeIds.SprintStarted.toString().toLowerCase()) {
346
+ this.router.navigate(["projects/sprint/" + notiifcationmodel.SprintGuid]);
347
+ }
348
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
349
+ NotificationTypeIds.PushNotificationForUserStoryComment.toString().toLowerCase()) {
350
+ this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryGuid]);
351
+ }
352
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
353
+ NotificationTypeIds.GoalRequestdForREplan.toString().toLowerCase()) {
354
+ this.router.navigate(["projects/goal/" + notiifcationmodel.GoalGuid]);
355
+ }
356
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
357
+ NotificationTypeIds.SprintRequestdForREplan.toString().toLowerCase()) {
358
+ this.router.navigate(["projects/sprint/" + notiifcationmodel.SprintGuid]);
359
+ }
360
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
361
+ NotificationTypeIds.Notification_AdhocWorkItemAssignedToUser.toString().toLowerCase()) {
362
+ this.router.navigate(["dashboard/adhoc-workitem/" + notiifcationmodel.UserStoryGuid]);
363
+ }
364
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
365
+ NotificationTypeIds.AdhocUSerStoryUpdateNotificationId.toString().toLowerCase()) {
366
+ this.router.navigate(["dashboard/adhoc-workitem/" + notiifcationmodel.UserStoryId]);
367
+ }
368
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
369
+ NotificationTypeIds.LeaveApplication.toString().toLowerCase() && canAccess_feature_ApproveOrRejectLeave) {
370
+ this.router.navigate(["hrmanagment/leaves"]);
371
+ }
372
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
373
+ NotificationTypeIds.ApproveLeaveApplication.toString().toLowerCase()) {
374
+ this.router.navigate(["dashboard/profile/" + CurrentUserId + "/leaves-permissions"]);
375
+ }
376
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
377
+ NotificationTypeIds.RejectLeaveApplication.toString().toLowerCase()) {
378
+ this.router.navigate(["dashboard/profile/" + CurrentUserId + "/leaves-permissions"]);
379
+ }
380
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
381
+ NotificationTypeIds.AutoTimeSheetSubmissionNotification.toString().toLowerCase()) {
382
+ this.router.navigate(["dashboard/profile/" + CurrentUserId + "/timesheetApproval"]);
383
+ }
384
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
385
+ NotificationTypeIds.ProbationAssignNotification.toString().toLowerCase()) {
386
+ this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/probation"]);
387
+ }
388
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
389
+ NotificationTypeIds.ReviewAssignToEmployeeNotification.toString().toLowerCase()) {
390
+ this.router.navigate(["dashboard/profile/" + CurrentUserId + "/probation"]);
391
+ }
392
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
393
+ NotificationTypeIds.ReviewSubmittedByEmployeeNotification.toString().toLowerCase()) {
394
+ this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/probation"]);
395
+ }
396
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
397
+ NotificationTypeIds.ReviewInvitationNotification.toString().toLowerCase()) {
398
+ this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/probation"]);
399
+ }
400
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
401
+ NotificationTypeIds.PerformanceReviewSubmittedByEmployeeNotification.toString().toLowerCase()) {
402
+ this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/performance"]);
403
+ }
404
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
405
+ NotificationTypeIds.PerformanceReviewInvitationNotificationModel.toString().toLowerCase()) {
406
+ this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/performance"]);
407
+ }
408
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
409
+ NotificationTypeIds.PerformanceReviewAssignToEmployeeNotification.toString().toLowerCase()) {
410
+ this.router.navigate(["dashboard/profile/" + CurrentUserId + "/performance"]);
411
+ }
412
+ this.store.dispatch(new UpsertUnreadNotificationsTriggered(notifications));
413
+ }
414
+ upsertReadNewNotification(notification) {
415
+ let notes = [notification];
416
+ this.signalr.upsertReadNewNotifications(notes)
417
+ .subscribe((res) => {
418
+ if (res.success) {
419
+ this.signalr.removeItemFromNotifications(notification.id);
420
+ }
421
+ });
422
+ if (notification.navigationUrl) {
423
+ window.open(notification.navigationUrl, "_blank");
424
+ }
425
+ }
426
+ clearNewAll(e) {
427
+ this.signalr.upsertReadNewNotifications(this.newNotifications)
428
+ .subscribe((res) => {
429
+ if (res.success) {
430
+ this.signalr.removeAllNotifications();
431
+ }
432
+ });
433
+ }
434
+ ngOnDestroy() {
435
+ this.ngDestroyed$.next();
436
+ }
437
+ }
438
+ NotificationsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.1", ngImport: i0, type: NotificationsComponent, deps: [{ token: i1.Router }, { token: i2.PubNubAngular }, { token: i3.Store }, { token: i4.Actions }, { token: i5.CookieService }, { token: i6.ToastrService }, { token: i7.MatDialog }, { token: i8.OrderByPipe }, { token: i9.SignalrService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
439
+ NotificationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.1", type: NotificationsComponent, selector: "app-notifications", inputs: { notificPanel: "notificPanel" }, ngImport: i0, template: "<div class=\"text-center mat-bg-primary pt-1 pb-1\">\r\n <!-- <mat-progress-bar *ngIf=\"(loadingNotifications$ | async)\"></mat-progress-bar> -->\r\n <h6 class=\"m-0\">{{ 'NOTIFICATIONS.NOTIFICATIONSTITLE' | translate }} ({{newNotifications?.length}})</h6>\r\n</div>\r\n<div id=\"style-1\" *ngIf=\"newNotifications.length != 0\">\r\n <mat-nav-list class=\"notification-list p-0 pr-03\" role=\"list\"\r\n *ngFor=\"let notification of (newNotifications | orderBy)\" >\r\n <mat-list-item class=\"notific-item pr-03 notification-margin\" role=\"listitem\"\r\n [ngClass]=\"{'notificataion-unread': !notificationColor ,'notificataion-read': notificationColor }\"\r\n routerLinkActive=\"open\" (click)=\"upsertReadNewNotification(notification)\">\r\n <div>\r\n <a>\r\n <div class=\"mat-list-text pl-0 pr-03 notification-cursor notifications-list-item\">\r\n <div class=\"word-break display-pre-line\" style=\"margin: 0px !important;\"\r\n [innerHTML]=\"notification.summary | sanitizeHtml\">\r\n </div>\r\n <small class=\"time text-muted\">{{ notification.createdDateTime | utcToLocalTime | timeago }}</small>\r\n </div>\r\n </a>\r\n </div>\r\n </mat-list-item>\r\n </mat-nav-list>\r\n</div>\r\n<div class=\"text-center p-1\" *ngIf=\"newNotifications.length == 0\">\r\n {{ 'NOTIFICATIONS.NONOTIFICATIONSTITLE' | translate }}</div>\r\n<mat-divider></mat-divider>\r\n<div class=\"text-center mt-05 mb-05\" *ngIf=\"newNotifications.length\">\r\n <label class=\"mb-0\"><a (click)=\"clearNewAll($event)\">{{ 'NOTIFICATIONS.CLEARALLNOTIFICATIONS' | translate\r\n }}</a></label>\r\n</div>", components: [{ type: i10.MatNavList, selector: "mat-nav-list", inputs: ["disableRipple", "disabled"], exportAs: ["matNavList"] }, { type: i10.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["disableRipple", "disabled"], exportAs: ["matListItem"] }, { type: i11.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }], directives: [{ type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "routerLinkActive"], exportAs: ["routerLinkActive"] }, { type: i12.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i13.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }], pipes: { "translate": i14.TranslatePipe, "orderBy": i8.OrderByPipe, "sanitizeHtml": i15.SanitizeHtmlPipe, "timeago": i16.TimeagoPipe, "utcToLocalTime": i17.UtcToLocalTimePipe } });
440
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.1", ngImport: i0, type: NotificationsComponent, decorators: [{
441
+ type: Component,
442
+ args: [{
443
+ selector: "app-notifications",
444
+ templateUrl: "./notifications.component.html"
445
+ }]
446
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.PubNubAngular }, { type: i3.Store }, { type: i4.Actions }, { type: i5.CookieService }, { type: i6.ToastrService }, { type: i7.MatDialog }, { type: i8.OrderByPipe }, { type: i9.SignalrService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { notificPanel: [{
447
+ type: Input
448
+ }] } });
449
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zaGVsbC1tb2R1bGUtY29tcG9uZW50cy9zaGVsbC1jb21wb25lbnRzL3NyYy9saWIvc2hlbGwtY29tcG9uZW50cy9jb21wb25lbnRzL25vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zaGVsbC1tb2R1bGUtY29tcG9uZW50cy9zaGVsbC1jb21wb25lbnRzL3NyYy9saWIvc2hlbGwtY29tcG9uZW50cy9jb21wb25lbnRzL25vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQThDLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFckcsT0FBTyxFQUFFLGFBQWEsRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBVyxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBUyxNQUFNLGFBQWEsQ0FBQztBQUk1QyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHlCQUF5QixFQUF1QixNQUFNLDRDQUE0QyxDQUFDO0FBQzVHLE9BQU8sRUFBRSxxQkFBcUIsRUFBMkIsd0JBQXdCLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUV6SyxPQUFPLEtBQUssb0JBQW9CLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFLNUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0RBQStELENBQUM7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QUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ25EO0lBRUgsQ0FBQztJQUVELFdBQVcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7YUFDM0QsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDdEIsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO2dCQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzthQUN2QztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDOzttSEFuYlUsc0JBQXNCO3VHQUF0QixzQkFBc0IsbUdDN0NuQywrcERBNkJNOzJGRGdCTyxzQkFBc0I7a0JBTGxDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsV0FBVyxFQUFFLGdDQUFnQztpQkFDOUM7MFVBSVUsWUFBWTtzQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7IEFjdGlvbnMsIG9mVHlwZSB9IGZyb20gXCJAbmdyeC9lZmZlY3RzXCI7XHJcbmltcG9ydCB7IHNlbGVjdCwgU3RvcmUgfSBmcm9tIFwiQG5ncngvc3RvcmVcIjtcclxuaW1wb3J0IHsgQ29va2llU2VydmljZSB9IGZyb20gXCJuZ3gtY29va2llLXNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gXCJuZ3gtdG9hc3RyXCI7XHJcbmltcG9ydCB7IFB1Yk51YkFuZ3VsYXIgfSBmcm9tIFwicHVibnViLWFuZ3VsYXIyXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLCBSb2xlc0ZldGNoVHJpZ2dlcmVkIH0gZnJvbSBcIi4uLy4uL3N0b3JlL2FjdGlvbnMvYXV0aGVudGljYXRpb24uYWN0aW9uc1wiO1xyXG5pbXBvcnQgeyBDbGVhckFsbE5vdGlmaWNhdGlvbnMsIE5ld05vdGlmaWNhdGlvblJlY2VpdmVkLCBOb3RpZmljYXRpb25zQWN0aW9uVHlwZXMsIFVwc2VydFVucmVhZE5vdGlmaWNhdGlvbnNUcmlnZ2VyZWQgfSBmcm9tIFwiLi4vLi4vc3RvcmUvYWN0aW9ucy9ub3RpZmljYXRpb25zLmFjdGlvbnNcIjtcclxuaW1wb3J0IHsgU3RhdGUgfSBmcm9tIFwiLi4vLi4vc3RvcmUvcmVkdWNlcnMvaW5kZXhcIjtcclxuaW1wb3J0ICogYXMgc2hhcmVkTW9kdWxlUmVkdWNlcnMgZnJvbSBcIi4uLy4uL3N0b3JlL3JlZHVjZXJzL2luZGV4XCI7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvblR5cGVJZHMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvbm90aWZpY2F0aW9uLXR5cGUtaWRzJztcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uTW9kZWwsIE5vdGlmaWNhdGlvbk91dHB1dE1vZGVsLCBVc2VyTm90aWZpY2F0aW9uUmVhZE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL05vdGlmaWNhdGlvbnNPdXRQdXRNb2RlbCc7XHJcbmltcG9ydCB7IFNvZnRMYWJlbENvbmZpZ3VyYXRpb25Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9zb2Z0bGFiZWxzLW1vZGVsJztcclxuaW1wb3J0IHsgVXNlck1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3VzZXInO1xyXG5pbXBvcnQgeyBPcmRlckJ5UGlwZSB9IGZyb20gJy4uLy4uLy4uL2dsb2JhbGRlcGVuZGVuY2llcy9waXBlcy9vcmRlcmJ5LXBpcGUnO1xyXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vLi4vLi4vZ2xvYmFsZGVwZW5kZW5jaWVzL2NvbnN0YW50cy9sb2NhbHN0b3JhZ2UtcHJvcGVydGllcyc7XHJcbmltcG9ydCB7IENoYW5uZWxOYW1lcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9jaGFubmVsLW5hbWVzJztcclxuaW1wb3J0IHsgQ2hhbm5lbFJvdXRlcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9ub3RpZmljYXRpb24tcm91dGVzJztcclxuaW1wb3J0IHsgVXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvVXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24nO1xyXG5pbXBvcnQgeyBSb2xlVXBkYXRlZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9Sb2xlVXBkYXRlZE5vdGlmaWNhdGlvbic7XHJcbmltcG9ydCB7IFJlcG9ydFN1Ym1pdHRlZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9SZXBvcnRTdWJtaXR0ZWROb3RpZmljYXRpb24nO1xyXG5pbXBvcnQgeyBSZXBvcnRDb25maWdBc3NpZ25lZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9SZXBvcnRDb25maWdBc3NpZ25lZE5vdGlmaWNhdGlvbic7XHJcbmltcG9ydCB7IE11bHRpcGxlQ2hhcnRzU2NoZWR1bGluZyB9IGZyb20gJy4uLy4uL21vZGVscy9tdWx0aUNoYXJ0c1NjaGVkdWxpbmcnO1xyXG5pbXBvcnQgeyBBc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL0Fzc2V0QXNzaWduZWROb3RpZmljYXRpb25Nb2RlbCc7XHJcbmltcG9ydCB7IE5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvTmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb25Nb2RlbCc7XHJcbmltcG9ydCB7IEdvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsJztcclxuaW1wb3J0IHsgVXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvdXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwnO1xyXG5pbXBvcnQgeyBVc2VyU3RvcnlDb21tZW50Tm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvdXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsJztcclxuaW1wb3J0IHsgU3ByaW50U3RhcnRlZE5vdGlmaWNhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NwcmludFN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCc7XHJcbmltcG9ydCB7IFNwcmludFJlcGxhblN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9zcHJpbnRSZXBsYW5SZXF1ZXN0ZWRNb2RlbCc7XHJcbmltcG9ydCB7IEFubm91Y2VtZW50RGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9hbm5vdW5jZW1lbnQtZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEd1aWQgfSBmcm9tICdndWlkLXR5cGVzY3JpcHQnO1xyXG5pbXBvcnQgJy4uLy4uLy4uL2dsb2JhbGRlcGVuZGVuY2llcy9oZWxwZXJzL2ZvbnRhd2Vzb21lLWljb25zJztcclxuaW1wb3J0ICogYXMgXyBmcm9tIFwidW5kZXJzY29yZVwiO1xyXG5pbXBvcnQgeyBTaWduYWxyU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zaWduYWxyLnNlcnZpY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC1ub3RpZmljYXRpb25zXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9ub3RpZmljYXRpb25zLmNvbXBvbmVudC5odG1sXCJcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgbm90aWZpY1BhbmVsO1xyXG5cclxuICBwdWJsaWMgbmdEZXN0cm95ZWQkID0gbmV3IFN1YmplY3QoKTtcclxuICBjb25zdE5vdGlmaWNhdGlvbl9Xb3JrSXRlbUFzc2lnbmVkVG9Vc2VyID0gTm90aWZpY2F0aW9uVHlwZUlkcy5Ob3RpZmljYXRpb25fV29ya0l0ZW1Bc3NpZ25lZFRvVXNlcjtcclxuICBub3RpZmljYXRpb25zJDogT2JzZXJ2YWJsZTxOb3RpZmljYXRpb25PdXRwdXRNb2RlbFtdPjtcclxuICBub3RpZmljYXRpb25zOiBOb3RpZmljYXRpb25PdXRwdXRNb2RlbFtdO1xyXG4gIHNvZnRMYWJlbHM6IFNvZnRMYWJlbENvbmZpZ3VyYXRpb25Nb2RlbFtdO1xyXG4gIGxvYWRpbmdOb3RpZmljYXRpb25zJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICBzZWxlY3RlZE5vdGlmaWNhdGlvbjogVXNlck5vdGlmaWNhdGlvblJlYWRNb2RlbDtcclxuICBhbm5vdW5jZW1lbnRJZDogc3RyaW5nO1xyXG4gIGFubm91bmNlTm90aWZpY2F0aW9uSWQ6IHN0cmluZztcclxuICBub3RpZmljYXRpb25Db2xvciA9IGZhbHNlO1xyXG4gIGF1dGhlbnRpY2F0ZWRVc2VyUmVjb3JkJDogT2JzZXJ2YWJsZTxVc2VyTW9kZWw+O1xyXG4gIG5ld05vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvbk1vZGVsW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIHB1Ym51YjogUHViTnViQW5ndWxhciwgcHJpdmF0ZSBzdG9yZTogU3RvcmU8U3RhdGU+LFxyXG4gICAgcHJpdmF0ZSBhY3Rpb25VcGRhdGVzJDogQWN0aW9ucywgcHJpdmF0ZSBjb29raWVTZXJ2aWNlOiBDb29raWVTZXJ2aWNlLCBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSxcclxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZywgcHJpdmF0ZSBvcmRlckJ5UGlwZTogT3JkZXJCeVBpcGUsIHByaXZhdGUgc2lnbmFscjogU2lnbmFsclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwpIHtcclxuICAgIHRoaXMuYWN0aW9uVXBkYXRlcyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMubmdEZXN0cm95ZWQkKSxcclxuICAgICAgICBvZlR5cGUoQXV0aGVudGljYXRpb25BY3Rpb25UeXBlcy5Vc2VyRGV0YWlsc0ZldGNoZWRBZnRlckxvZ2luKSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuY29va2llU2VydmljZS5jaGVjayhMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRVc2VySWQpKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBDdXJyZW50VXNlcklkID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRVc2VySWQpO1xyXG4gICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gVGFzayBBc3NpZ25tZW50IE5vdGlmaWNhaXRvbnMgaGVyZS5cclxuICAgICAgICAgICAgY29uc3QgdGFza0Fzc2lnbm1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfVGFza0Fzc2lnbm1lbnRzICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgdGFzdGF0dXNSZXBvcnRTdWJtaXNzaW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1N0YXR1c1JlcG9ydFN1Ym1pc3Npb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCB0YXN0YXR1c0NvbmZpZ0Fzc2lnbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9TdGF0dXNDb25maWdBc3NpZ24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBtdWx0aUNoYXJ0c1NjaGVkdWxpbmdDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfTXVsdGlDaGFydHNTY2hlZHVsaW5nICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgYXNzZXRzQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfQXNzZXRBc3NpZ25tZW50ICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgcHJvamVjdENyZWF0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfTmV3UHJvamVjdCArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb2plY3RBY2Nlc3NUb01lbWJlckNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Qcm9qZWN0TWVtYmVyUm9sZSArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGdvYWxBcHByb3ZlZENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Hb2FsQXBwcm92ZWRGcm9tUmVwbGFuICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgdXNlclN0b3J5VXBkYXRlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1VzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IEFubm91bmNlbWVudENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Bbm5vdW5jZW1lbnROb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBSZW1pbmRlckNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9SZW1pbmRlck5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IFBlcmZvcm1hbmNlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Blcm9mb3JtYW5jZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZXJTdG9yeUNvbW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfVXNlclN0b3J5Q29tbWVudCArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwcmludFN0YXJ0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfU3ByaW50U3RhcnRlZCArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwcmludFJlcGxhbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9TcHJpbnRSZXF1ZXN0ZWRUb1JlcGxhbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlYXZlQXBwbGllZENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9MZWF2ZUFwcGxpZWQgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBBcHByb3ZlTGVhdmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfQXBwcm92ZUxlYXZlICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgUmVqZWN0TGVhdmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUmVqZWN0TGVhdmUgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBSZXNpZ25hdGlvbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9SZXNpZ25hdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IEFwcHJvdmVSZXNpZ25hdGlvbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9BcHByb3ZlUmVzaWduYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBSZWplY3RSZXNpZ25hdGlvbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9SZWplY3RSZXNpZ25hdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IEF1dG9USW1lc2hlZXRTdWJtaXNzaW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX0F1dG9UaW1lc2hlZXRTdWJtaXNzaW9uICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgUHJvYmF0aW9uQXNzaWduTm90aWZpY2F0aW9uID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUHJvYmF0aW9uQXNzaWduTm90aWZpY2F0aW9uICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbiA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Jldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBSZXZpZXdTdWJtaXR0ZWRCeUVtcGxveWVlTm90aWZpY2F0aW9uID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IFJldmlld0ludml0YXRpb25Ob3RpZmljYXRpb25Nb2RlbCA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Jldmlld0ludml0YXRpb25Ob3RpZmljYXRpb25Nb2RlbCArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IFBlcmZvcm1hbmNlUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbiA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1BlcmZvcm1hbmNlUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IFBlcmZvcm1hbmNlUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUGVyZm9ybWFuY2VSZXZpZXdJbnZpdGF0aW9uTm90aWZpY2F0aW9uTW9kZWwgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBQZXJmb3JtYW5jZVJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9QZXJmb3JtYW5jZVJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvIFwiICsgdGFza0Fzc2lnbm1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0byBcIiArIHRhc3RhdHVzUmVwb3J0U3VibWlzc2lvbkNoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvIFwiICsgdGFzdGF0dXNDb25maWdBc3NpZ25DaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgYXNzZXRzQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgcHJvamVjdENyZWF0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgcHJvamVjdEFjY2Vzc1RvTWVtYmVyQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIGdvYWxBcHByb3ZlZENoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyB1c2VyU3RvcnlVcGRhdGVDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgQW5ub3VuY2VtZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHVzZXJTdG9yeUNvbW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgc3ByaW50U3RhcnRlZENoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyBzcHJpbnRSZXBsYW5DaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgUmVtaW5kZXJDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgUGVyZm9ybWFuY2VDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgdGhpcy5wdWJudWIuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICBjaGFubmVsczogW3Rhc2tBc3NpZ25tZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50bywgdGFzdGF0dXNSZXBvcnRTdWJtaXNzaW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcclxuICAgICAgICAgICAgICAgIFByb2JhdGlvbkFzc2lnbk5vdGlmaWNhdGlvbiwgUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbiwgUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbixcclxuICAgICAgICAgICAgICAgIFJldmlld0ludml0YXRpb25Ob3RpZmljYXRpb25Nb2RlbCwgUGVyZm9ybWFuY2VSZXZpZXdTdWJtaXR0ZWRCeUVtcGxveWVlTm90aWZpY2F0aW9uLCBQZXJmb3JtYW5jZVJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24sXHJcbiAgICAgICAgICAgICAgICB0YXN0YXR1c0NvbmZpZ0Fzc2lnbkNoYW5uZWxUb1N1YnNjcmliZUludG8sIG11bHRpQ2hhcnRzU2NoZWR1bGluZ0NoYW5uZWxUb1N1YnNjcmliZUludG8sIFBlcmZvcm1hbmNlUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBwcm9qZWN0Q3JlYXRlZENoYW5uZWxUb1N1YnNjcmliZUludG8sICxcclxuICAgICAgICAgICAgICAgIHByb2plY3RBY2Nlc3NUb01lbWJlckNoYW5uZWxUb1N1YnNjcmliZUludG8sIGdvYWxBcHByb3ZlZENoYW5uZWxUb1N1YnNjcmliZUludG8sXHJcbiAgICAgICAgICAgICAgICB1c2VyU3RvcnlVcGRhdGVDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBBbm5vdW5jZW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBSZW1pbmRlckNoYW5uZWxUb1N1YnNjcmliZUludG8sIFJlamVjdFJlc2lnbmF0aW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcclxuICAgICAgICAgICAgICAgIHVzZXJTdG9yeUNvbW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBzcHJpbnRTdGFydGVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgUmVzaWduYXRpb25DaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBBcHByb3ZlUmVzaWduYXRpb25DaGFubmVsVG9TdWJzY3JpYmVJbnRvLFxyXG4gICAgICAgICAgICAgICAgc3ByaW50UmVwbGFuQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgbGVhdmVBcHBsaWVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgQXBwcm92ZUxlYXZlQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgUmVqZWN0TGVhdmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvLFxyXG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBBdXRvVEltZXNoZWV0U3VibWlzc2lvbkNoYW5uZWxUb1N1YnNjcmliZUludG9dXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyBBZGQgb3RoZXIgc3Vic2NyaXB0aW9ucyBoZXJlLlxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJVc2VyIG5vdCBsb2dnZWQgaW4geWV0IHRvIGJlIGFibGUgdG8gc3Vic2NyaWJlLlwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICB0aGlzLmFjdGlvblVwZGF0ZXMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm5nRGVzdHJveWVkJCksXHJcbiAgICAgICAgb2ZUeXBlKEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuVXNlckRldGFpbHNGZXRjaGVkQWZ0ZXJMb2dpbiksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIHZhciByb2xlVXBkYXRlc0NoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Sb2xlVXBkYXRlcyArIFwiMTlCNkY5RkMtNzM3MC00QjlDLUEwNUMtM0I4RDgxOUVFRUFGXCI7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvIFwiICsgcm9sZVVwZGF0ZXNDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgIHRoaXMucHVibnViLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIGNoYW5uZWxzOiBbcm9sZVVwZGF0ZXNDaGFubmVsVG9TdWJzY3JpYmVJbnRvXVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5hY3Rpb25VcGRhdGVzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5uZ0Rlc3Ryb3llZCQpLFxyXG4gICAgICAgIG9mVHlwZShOb3RpZmljYXRpb25zQWN0aW9uVHlwZXMuQ2xlYXJBbGxVbnJlYWROb3RpZmljYXRpb25zQ29tcGxldGVkKSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3Qoc2hhcmVkTW9kdWxlUmVkdWNlcnMuZ2V0Tm90aWZpY2F0aW9uQWxsKSk7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMkLnN1YnNjcmliZSh4ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zID0geDtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAvLyBjb25zdCBzdG9yZUxpc3RuZXIgPSAobWVzc2FnZSkgPT4ge1xyXG4gICAgLy8gICBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLVJlY2VpdmVkIHB1Ym51YiBtZXNzYWdlLS0tLS0tLS0tXCIpO1xyXG4gICAgLy8gICAvLyB0aGlzLnRvYXN0ci5pbmZvKG1lc3NhZ2UubWVzc2FnZS5TdW1tYXJ5KTtcclxuICAgIC8vICAgdHJ5IHtcclxuICAgIC8vICAgICAvLyBSZWNlaXZpbmcgdGhlIFVzZXIgU3RvcnkgQXNzaWduZWQgTm90aWZpY2F0aW9uXHJcbiAgICAvLyAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLk5vdGlmaWNhdGlvbl9Xb3JrSXRlbUFzc2lnbmVkVG9Vc2VyKSB7XHJcbiAgICAvLyAgICAgICB2YXIgdXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24gPSBuZXcgVXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24oKTtcclxuICAgIC8vICAgICAgIHVzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICB1c2VyU3RvcnlBc3NpZ25lZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld1dvcmtJdGVtICsgdXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZCh1c2VyU3RvcnlBc3NpZ25lZE5vdGlmaWNhdGlvbikpO1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkID09IE5vdGlmaWNhdGlvblR5cGVJZHMuTm90aWZpY2F0aW9uX1JvbGVVcGRhdGVkKSB7XHJcbiAgICAvLyAgICAgICB2YXIgcm9sZVVwZGF0ZWROb3RpZmljYXRpb24gPSBuZXcgUm9sZVVwZGF0ZWROb3RpZmljYXRpb24oKTtcclxuICAgIC8vICAgICAgIHJvbGVVcGRhdGVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICByb2xlVXBkYXRlZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChyb2xlVXBkYXRlZE5vdGlmaWNhdGlvbikpO1xyXG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlN0YXR1c19SZXBvcnRfU3VtaXR0ZWQpIHtcclxuICAgIC8vICAgICAgIHZhciByZXBvcnRTdWJtaXR0ZWROb3RpZmljYXRpb24gPSBuZXcgUmVwb3J0U3VibWl0dGVkTm90aWZpY2F0aW9uKCk7XHJcbiAgICAvLyAgICAgICByZXBvcnRTdWJtaXR0ZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIHJlcG9ydFN1Ym1pdHRlZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChyZXBvcnRTdWJtaXR0ZWROb3RpZmljYXRpb24pKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5TdGF0dXNfUmVwb3J0X0NvbmZpZ19DcmVhdGVkKSB7XHJcbiAgICAvLyAgICAgICB2YXIgcmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24gPSBuZXcgUmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24oKTtcclxuICAgIC8vICAgICAgIHJlcG9ydENvbmZpZ0Fzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICByZXBvcnRDb25maWdBc3NpZ25lZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChyZXBvcnRDb25maWdBc3NpZ25lZE5vdGlmaWNhdGlvbikpO1xyXG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLk11bHRpcGxlX0NoYXJ0c19TY2hlZHVsaW5nX2NyZWF0ZWQpIHtcclxuICAgIC8vICAgICAgIHZhciBtdWx0aXBsZUNoYXJ0c1NjaGVkdWxpbmcgPSBuZXcgTXVsdGlwbGVDaGFydHNTY2hlZHVsaW5nKCk7XHJcbiAgICAvLyAgICAgICBtdWx0aXBsZUNoYXJ0c1NjaGVkdWxpbmcubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIG11bHRpcGxlQ2hhcnRzU2NoZWR1bGluZy5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChtdWx0aXBsZUNoYXJ0c1NjaGVkdWxpbmcpKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5Bc3NldHNfQXNzaWdubWVudCkge1xyXG4gICAgLy8gICAgICAgY29uc3QgYXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbiA9IG5ldyBBc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKCk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24pKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuUmVtaW5kZXJfTm90aWZpY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgLy8gICAgICAgY29uc3QgYXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbiA9IG5ldyBBc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKCk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24pKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuQW5ub3VuY2VtZW50X1JlY2VpdmVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgLy8gICAgICAgY29uc3QgYXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbiA9IG5ldyBBc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKCk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24pKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlLklkICE9IHRoaXMuYW5ub3VuY2VOb3RpZmljYXRpb25JZCkge1xyXG4gICAgLy8gICAgICAgICB0aGlzLmFubm91bmNlTm90aWZpY2F0aW9uSWQgPSBtZXNzYWdlLm1lc3NhZ2UuSWQ7XHJcbiAgICAvLyAgICAgICAgIHRoaXMub3BlbkFubm91bmNlbWVudERpYWxvZyhtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlBlcmZvcm1hbmNlX1JlY2VpdmVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSB8fCBtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuUHJvamVjdE1lbWJlclJvbGVBZGRlZE5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgLy8gICAgICAgY29uc3QgbmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24gPSBuZXcgTmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb25Nb2RlbCgpO1xyXG4gICAgLy8gICAgICAgbmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIG5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKG5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uKSk7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLk5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpIHx8IG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5Qcm9qZWN0TWVtYmVyUm9sZUFkZGVkTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAvLyAgICAgICBjb25zdCBuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbiA9IG5ldyBOZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAvLyAgICAgICBuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbi5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgLy8gICAgICAgbmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24ucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQobmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24pKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuR29hbEFwcHJvdmVkRnJvbVJlcGxhbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgIC8vICAgICAgIGNvbnN0IGdvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsID0gbmV3IEdvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAvLyAgICAgICBnb2FsQXBwcm92ZWROb3RpZmljYXRpb25Nb2RlbC5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgLy8gICAgICAgZ29hbEFwcHJvdmVkTm90aWZpY2F0aW9uTW9kZWwucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQoZ29hbEFwcHJvdmVkTm90aWZpY2F0aW9uTW9kZWwpKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuVVNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAvLyAgICAgICBjb25zdCB1c2VyU3RvcnlVcGRhdGVOb3RpZmljYXRpb25Nb2RlbCA9IG5ldyBVc2VyU3RvcnlVcGRhdGVOb3RpZmljYXRpb25Nb2RlbCgpO1xyXG4gICAgLy8gICAgICAgdXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIHVzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbk1vZGVsLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKHVzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbk1vZGVsKSk7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlB1c2hOb3RpZmljYXRpb25Gb3JVc2VyU3RvcnlDb21tZW50LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgLy8gICAgICAgY29uc3QgdXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsID0gbmV3IFVzZXJTdG9yeUNvbW1lbnROb3RpZmljYXRpb25Nb2RlbCgpO1xyXG4gICAgLy8gICAgICAgdXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICB1c2VyU3RvcnlDb21tZW50Tm90aWZpY2F0aW9uTW9kZWwucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQodXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsKSk7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlNwcmludFN0YXJ0ZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAvLyAgICAgICBjb25zdCBzcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwgPSBuZXcgU3ByaW50U3RhcnRlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAvLyAgICAgICBzcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIHNwcmludFN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbC5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChzcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwpKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuU3ByaW50UmVxdWVzdGRGb3JSRXBsYW4udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAvLyAgICAgICBjb25zdCBzcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwgPSBuZXcgU3ByaW50UmVwbGFuU3RhcnRlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAvLyAgICAgICBzcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIHNwcmludFJlcGxhblN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbC5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChzcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwpKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgIC8vIFRPRE86IFNlbmQgdGhlc2UgZXJyb3JzIG9udG8gc2VydmVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcclxuICAgIC8vICAgICAgIGNvbnNvbGUubG9nKFwiRm91bmQgdW5kZXRlY3RlZCBub3RpZmljYXRpb24gdHlwZS4gXCIgKyBtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICAvLyBBZGQgb3RoZXIgbm90aWZpY2F0aW9ucyBoZXJlLlxyXG5cclxuICAgIC8vICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XHJcbiAgICAvLyAgICAgLy8gVE9ETzogU2VuZCB0aGVzZSBleGNlcHRpb25zIG9udG8gc2VydmVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcclxuICAgIC8vICAgICBjb25zb2xlLmxvZyhcIkV4Y2VwdGlvbiBPY2N1cmVkXCIgKyBleGNlcHRpb24ubWVzc2FnZSk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH07XHJcblxyXG4gICAgLy8gdGhpcy5wdWJudWIuYWRkTGlzdGVuZXIoe1xyXG4gICAgLy8gICBzdGF0dXM6IHN0ID0+IHtcclxuICAgIC8vICAgICBpZiAoc3QuY2F0ZWdvcnkgPT09IFwiUE5Vbmtub3duQ2F0ZWdvcnlcIikge1xyXG4gICAgLy8gICAgICAgdmFyIG5ld1N0YXRlID0ge1xyXG4gICAgLy8gICAgICAgICBuZXc6IFwiZXJyb3JcIlxyXG4gICAgLy8gICAgICAgfTtcclxuICAgIC8vICAgICAgIHRoaXMucHVibnViLnNldFN0YXRlKFxyXG4gICAgLy8gICAgICAgICB7XHJcbiAgICAvLyAgICAgICAgICAgc3RhdGU6IG5ld1N0YXRlXHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgLy8gZnVuY3Rpb24gKHN0YXR1cykge1xyXG4gICAgLy8gICAgICAgICAvLyAgIGNvbnNvbGUubG9nKHN0LmVycm9yRGF0YS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgICAgLy8gfVxyXG4gICAgLy8gICAgICAgKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIG1lc3NhZ2U6IG1lc3NhZ2UgPT4ge1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJlZCB0byBcIiArIG1lc3NhZ2UpO1xyXG4gICAgLy8gICAgIHN0b3JlTGlzdG5lcihtZXNzYWdlKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMucm91dGVyLmV2ZW50c1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ0Rlc3Ryb3llZCQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyb3V0ZUNoYW5nZSkgPT4ge1xyXG4gICAgICAgIGlmIChyb3V0ZUNoYW5nZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcclxuICAgICAgICAgIGlmICh0aGlzLm5vdGlmaWNQYW5lbCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNQYW5lbC5jbG9zZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB0aGlzLnNpZ25hbHIubm90aWZpY2F0aW9ucyQuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5uZXdOb3RpZmljYXRpb25zID0gZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDAgPyBkYXRhIDogW107XHJcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdldFNvZnRMYWJlbENvbmZpZ3VyYXRpb25zKCk7XHJcblxyXG4gICAgdGhpcy5ub3RpZmljYXRpb25zJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3Qoc2hhcmVkTW9kdWxlUmVkdWNlcnMuZ2V0Tm90aWZpY2F0aW9uQWxsKSxcclxuICAgICAgdGFwKHggPT4gY29uc29sZS5sb2coeCkpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuYXV0aGVudGljYXRlZFVzZXJSZWNvcmQkID0gdGhpcy5zdG9yZS5waXBlKFxyXG4gICAgICBzZWxlY3Qoc2hhcmVkTW9kdWxlUmVkdWNlcnMuZ2V0QXV0aGVudGljYXRlZFVzZXJNb2RlbClcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nTm90aWZpY2F0aW9ucyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KHNoYXJlZE1vZHVsZVJlZHVjZXJzLmdldE5vdGlmaWNhdGlvbnNMb2FkaW5nKSk7XHJcbiAgfVxyXG5cclxuICBnZXRTb2Z0TGFiZWxDb25maWd1cmF0aW9ucygpIHtcclxuICAgIHRoaXMuc29mdExhYmVscyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ1NvZnRMYWJlbHMnKSk7XHJcbiAgfVxyXG5cclxuICBjbGVhckFsbChlKSB7XHJcbiAgICBjb25zdCBub3RpZmljYXRpb25zID0gW107XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICBub3RpZmljYXRpb25zLnB1c2goZWxlbWVudCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IENsZWFyQWxsTm90aWZpY2F0aW9ucyhub3RpZmljYXRpb25zKSk7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbkNvbG9yID0gIXRoaXMubm90aWZpY2F0aW9uQ29sb3I7XHJcbiAgfVxyXG5cclxuICAvLyBvcGVuQW5ub3VuY2VtZW50RGlhbG9nKGFubm91bmNlZCkge1xyXG4gIC8vICAgdGhpcy5kaWFsb2cuY2xvc2VBbGwoKTtcclxuICAvLyAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQW5ub3VjZW1lbnREaWFsb2dDb21wb25lbnQsIHtcclxuICAvLyAgICAgbWluV2lkdGg6IFwiNjB2d1wiLFxyXG4gIC8vICAgICBtYXhXaWR0aDogXCI2MHZ3XCIsXHJcbiAgLy8gICAgIG1pbkhlaWdodDogXCI1MHZoXCIsXHJcbiAgLy8gICAgIG1heEhlaWdodDogXCI4MHZoXCIsXHJcbiAgLy8gICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAvLyAgICAgZGF0YToge1xyXG4gIC8vICAgICAgIGFubm91bmNlbWVudElkOiBhbm5vdW5jZWQuQW5ub3VuY2VtZW50SWQsXHJcbiAgLy8gICAgICAgYW5ub3VuY2VtZW50OiBhbm5vdW5jZWQuQW5ub3VuY2VtZW50LFxyXG4gIC8vICAgICAgIGFubm91bmNlZEJ5OiBhbm5vdW5jZWQuQW5ub3VuY2VkQnksXHJcbiAgLy8gICAgICAgYW5ub3VuY2VkQnlJZDogYW5ub3VuY2VkLkFubm91bmNlZEJ5SWQsXHJcbiAgLy8gICAgICAgYW5ub3VuY2VkQnlVc2VySW1hZ2U6IGFubm91bmNlZC5Bbm5vdW5jZWRCeVVzZXJJbWFnZSxcclxuICAvLyAgICAgICBhbm5vdW5jZWRPbjogYW5ub3VuY2VkLkFubm91bmNlZE9uXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH0pO1xyXG4gIC8vICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmNsb3NlTWF0RGlhbG9nLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgLy8gICAgIGNvbnN0IGluZGV4ID0gdGhpcy5ub3RpZmljYXRpb25zLmZpbmRJbmRleCgocCkgPT4gcC5ub3RpZmljYXRpb25JZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gdGhpcy5hbm5vdW5jZU5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSk7XHJcbiAgLy8gICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgLy8gICAgICAgdGhpcy51cHNlcnRSZWFkTm90aWZpY2F0aW9uKHRoaXMubm90aWZpY2F0aW9uc1tpbmRleF0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIHVwc2VydFJlYWROb3RpZmljYXRpb24oc2VsZWN0ZWROb3RpZmljYXRpb24pIHtcclxuICAgIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSBbXTtcclxuICAgIHZhciByb2xlcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Sb2xlRmVhdHVyZXMpKTtcclxuICAgIGxldCBGZWF0dXJlX0FwcHJvdmVPclJlamVjdExlYXZlID0gJzJDMjI5MTZGLUI4MEItNEM1MS05NTM0LTIzRjY5OERFMTIwQic7XHJcbiAgICBsZXQgY2FuQWNjZXNzX2ZlYXR1cmVfQXBwcm92ZU9yUmVqZWN0TGVhdmUgPSBfLmZpbmQocm9sZXMsIGZ1bmN0aW9uIChyb2xlKSB7IHJldHVybiByb2xlWydmZWF0dXJlSWQnXS50b0xvd2VyQ2FzZSgpID09IEZlYXR1cmVfQXBwcm92ZU9yUmVqZWN0TGVhdmUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpOyB9KSAhPSBudWxsO1xyXG4gICAgY29uc3QgQ3VycmVudFVzZXJJZCA9IHRoaXMuY29va2llU2VydmljZS5nZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5DdXJyZW50VXNlcklkKTtcclxuICAgIG5vdGlmaWNhdGlvbnMucHVzaChzZWxlY3RlZE5vdGlmaWNhdGlvbik7XHJcbiAgICBjb25zdCBub3RpaWZjYXRpb25tb2RlbCA9IEpTT04ucGFyc2Uoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uSnNvbik7XHJcbiAgICBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLk5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpIHx8XHJcbiAgICAgIHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5Qcm9qZWN0TWVtYmVyUm9sZUFkZGVkTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInByb2plY3RzL3Byb2plY3RzdGF0dXMvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Qcm9qZWN0R3VpZCArIFwiL2FjdGl2ZS1nb2Fsc1wiXSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5Hb2FsQXBwcm92ZWRGcm9tUmVwbGFuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy9nb2FsL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuR29hbEd1aWRdKTtcclxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLk5vdGlmaWNhdGlvbl9Xb3JrSXRlbUFzc2lnbmVkVG9Vc2VyLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy93b3JraXRlbS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJTdG9yeUd1aWRdKTtcclxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlVTZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy93b3JraXRlbS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJTdG9yeUlkXSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5TcHJpbnRTdGFydGVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy9zcHJpbnQvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5TcHJpbnRHdWlkXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUHVzaE5vdGlmaWNhdGlvbkZvclVzZXJTdG9yeUNvbW1lbnQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInByb2plY3RzL3dvcmtpdGVtL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlclN0b3J5R3VpZF0pO1xyXG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuR29hbFJlcXVlc3RkRm9yUkVwbGFuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy9nb2FsL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuR29hbEd1aWRdKTtcclxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlNwcmludFJlcXVlc3RkRm9yUkVwbGFuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy9zcHJpbnQvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5TcHJpbnRHdWlkXSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5Ob3RpZmljYXRpb25fQWRob2NXb3JrSXRlbUFzc2lnbmVkVG9Vc2VyLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvYWRob2Mtd29ya2l0ZW0vXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Vc2VyU3RvcnlHdWlkXSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5BZGhvY1VTZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvYWRob2Mtd29ya2l0ZW0vXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Vc2VyU3RvcnlJZF0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLkxlYXZlQXBwbGljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICYmIGNhbkFjY2Vzc19mZWF0dXJlX0FwcHJvdmVPclJlamVjdExlYXZlKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImhybWFuYWdtZW50L2xlYXZlc1wiXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuQXBwcm92ZUxlYXZlQXBwbGljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgQ3VycmVudFVzZXJJZCArIFwiL2xlYXZlcy1wZXJtaXNzaW9uc1wiXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUmVqZWN0TGVhdmVBcHBsaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL3Byb2ZpbGUvXCIgKyBDdXJyZW50VXNlcklkICsgXCIvbGVhdmVzLXBlcm1pc3Npb25zXCJdKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5BdXRvVGltZVNoZWV0U3VibWlzc2lvbk5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL3Byb2ZpbGUvXCIgKyBDdXJyZW50VXNlcklkICsgXCIvdGltZXNoZWV0QXBwcm92YWxcIl0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlByb2JhdGlvbkFzc2lnbk5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL3Byb2ZpbGUvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Vc2VySWQgKyBcIi9wcm9iYXRpb25cIl0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgQ3VycmVudFVzZXJJZCArIFwiL3Byb2JhdGlvblwiXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL3Byb2ZpbGUvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Vc2VySWQgKyBcIi9wcm9iYXRpb25cIl0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlJldmlld0ludml0YXRpb25Ob3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlcklkICsgXCIvcHJvYmF0aW9uXCJdKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5QZXJmb3JtYW5jZVJldmlld1N1Ym1pdHRlZEJ5RW1wbG95ZWVOb3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlcklkICsgXCIvcGVyZm9ybWFuY2VcIl0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlBlcmZvcm1hbmNlUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvcHJvZmlsZS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJJZCArIFwiL3BlcmZvcm1hbmNlXCJdKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5QZXJmb3JtYW5jZVJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgQ3VycmVudFVzZXJJZCArIFwiL3BlcmZvcm1hbmNlXCJdKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFVwc2VydFVucmVhZE5vdGlmaWNhdGlvbnNUcmlnZ2VyZWQobm90aWZpY2F0aW9ucykpO1xyXG4gIH1cclxuXHJcbiAgdXBzZXJ0UmVhZE5ld05vdGlmaWNhdGlvbihub3RpZmljYXRpb24pIHtcclxuICAgIGxldCBub3RlczogTm90aWZpY2F0aW9uTW9kZWxbXSA9IFtub3RpZmljYXRpb25dO1xyXG4gICAgdGhpcy5zaWduYWxyLnVwc2VydFJlYWROZXdOb3RpZmljYXRpb25zKG5vdGVzKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgdGhpcy5zaWduYWxyLnJlbW92ZUl0ZW1Gcm9tTm90aWZpY2F0aW9ucyhub3RpZmljYXRpb24uaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICBpZiAobm90aWZpY2F0aW9uLm5hdmlnYXRpb25VcmwpIHtcclxuICAgICAgd2luZG93Lm9wZW4obm90aWZpY2F0aW9uLm5hdmlnYXRpb25VcmwsIFwiX2JsYW5rXCIpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGNsZWFyTmV3QWxsKGUpIHtcclxuICAgIHRoaXMuc2lnbmFsci51cHNlcnRSZWFkTmV3Tm90aWZpY2F0aW9ucyh0aGlzLm5ld05vdGlmaWNhdGlvbnMpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICB0aGlzLnNpZ25hbHIucmVtb3ZlQWxsTm90aWZpY2F0aW9ucygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLm5nRGVzdHJveWVkJC5uZXh0KCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBtYXQtYmctcHJpbWFyeSBwdC0xIHBiLTFcIj5cclxuICA8IS0tIDxtYXQtcHJvZ3Jlc3MtYmFyICpuZ0lmPVwiKGxvYWRpbmdOb3RpZmljYXRpb25zJCB8IGFzeW5jKVwiPjwvbWF0LXByb2dyZXNzLWJhcj4gLS0+XHJcbiAgPGg2IGNsYXNzPVwibS0wXCI+e3sgJ05PVElGSUNBVElPTlMuTk9USUZJQ0FUSU9OU1RJVExFJyB8IHRyYW5zbGF0ZSB9fSAoe3tuZXdOb3RpZmljYXRpb25zPy5sZW5ndGh9fSk8L2g2PlxyXG48L2Rpdj5cclxuPGRpdiBpZD1cInN0eWxlLTFcIiAqbmdJZj1cIm5ld05vdGlmaWNhdGlvbnMubGVuZ3RoICE9IDBcIj5cclxuICA8bWF0LW5hdi1saXN0IGNsYXNzPVwibm90aWZpY2F0aW9uLWxpc3QgcC0wIHByLTAzXCIgcm9sZT1cImxpc3RcIlxyXG4gICAgKm5nRm9yPVwibGV0IG5vdGlmaWNhdGlvbiBvZiAobmV3Tm90aWZpY2F0aW9ucyB8IG9yZGVyQnkpXCIgPlxyXG4gICAgPG1hdC1saXN0LWl0ZW0gY2xhc3M9XCJub3RpZmljLWl0ZW0gIHByLTAzIG5vdGlmaWNhdGlvbi1tYXJnaW5cIiByb2xlPVwibGlzdGl0ZW1cIlxyXG4gICAgICBbbmdDbGFzc109XCJ7J25vdGlmaWNhdGFpb24tdW5yZWFkJzogIW5vdGlmaWNhdGlvbkNvbG9yICwnbm90aWZpY2F0YWlvbi1yZWFkJzogbm90aWZpY2F0aW9uQ29sb3IgfVwiXHJcbiAgICAgIHJvdXRlckxpbmtBY3RpdmU9XCJvcGVuXCIgKGNsaWNrKT1cInVwc2VydFJlYWROZXdOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKVwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxhPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1saXN0LXRleHQgcGwtMCBwci0wMyBub3RpZmljYXRpb24tY3Vyc29yIG5vdGlmaWNhdGlvbnMtbGlzdC1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3b3JkLWJyZWFrIGRpc3BsYXktcHJlLWxpbmVcIiBzdHlsZT1cIm1hcmdpbjogMHB4ICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIm5vdGlmaWNhdGlvbi5zdW1tYXJ5IHwgc2FuaXRpemVIdG1sXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0aW1lIHRleHQtbXV0ZWRcIj57eyBub3RpZmljYXRpb24uY3JlYXRlZERhdGVUaW1lIHwgdXRjVG9Mb2NhbFRpbWUgfCB0aW1lYWdvIH19PC9zbWFsbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L21hdC1saXN0LWl0ZW0+XHJcbiAgPC9tYXQtbmF2LWxpc3Q+XHJcbjwvZGl2PlxyXG48ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcC0xXCIgKm5nSWY9XCJuZXdOb3RpZmljYXRpb25zLmxlbmd0aCA9PSAwXCI+XHJcbiAge3sgJ05PVElGSUNBVElPTlMuTk9OT1RJRklDQVRJT05TVElUTEUnIHwgdHJhbnNsYXRlIH19PC9kaXY+XHJcbjxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxyXG48ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgbXQtMDUgbWItMDVcIiAqbmdJZj1cIm5ld05vdGlmaWNhdGlvbnMubGVuZ3RoXCI+XHJcbiAgPGxhYmVsIGNsYXNzPVwibWItMFwiPjxhIChjbGljayk9XCJjbGVhck5ld0FsbCgkZXZlbnQpXCI+e3sgJ05PVElGSUNBVElPTlMuQ0xFQVJBTExOT1RJRklDQVRJT05TJyB8IHRyYW5zbGF0ZVxyXG4gICAgICB9fTwvYT48L2xhYmVsPlxyXG48L2Rpdj4iXX0=