@sunbird-cb/toc 0.0.2 → 0.0.3-2.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 (371) hide show
  1. package/esm2022/lib/_collection/_common/ai-tutor/ai-tutor.component.mjs +1169 -0
  2. package/esm2022/lib/_collection/_common/ai-tutor/socket.service.mjs +121 -0
  3. package/esm2022/lib/_collection/_common/card-competency/card-competency.component.mjs +58 -0
  4. package/esm2022/lib/_collection/_common/card-competency/card-competency.module.mjs +22 -0
  5. package/esm2022/lib/_collection/_common/card-content-v2/card-content-v2.model.mjs +23 -0
  6. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +108 -7
  7. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +5 -1
  8. package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +3 -3
  9. package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +18 -8
  10. package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +88 -7
  11. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +393 -51
  12. package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +16 -34
  13. package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +7 -2
  14. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +5 -2
  15. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +2 -8
  16. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +3 -3
  17. package/esm2022/lib/_services/widget-content.model.mjs +8 -1
  18. package/esm2022/lib/_services/widget-content.service.mjs +3 -3
  19. package/esm2022/lib/app-toc-lib.module.mjs +7 -3
  20. package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +37 -8
  21. package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +3 -3
  22. package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +3 -3
  23. package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +224 -67
  24. package/esm2022/lib/registration-toc-lib.config.mjs +14 -0
  25. package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +1 -1
  26. package/esm2022/lib/services/app-toc-v2.service.mjs +192 -54
  27. package/esm2022/lib/services/app-toc.service.mjs +381 -104
  28. package/esm2022/lib/services/certificate.service.mjs +54 -9
  29. package/esm2022/lib/services/root.service.mjs +106 -0
  30. package/esm2022/lib/services/viewer-data.service.mjs +1 -1
  31. package/esm2022/lib/services/viewer-util.service.mjs +150 -23
  32. package/esm2022/public-api.mjs +11 -1
  33. package/fesm2022/sunbird-cb-toc.mjs +9093 -6348
  34. package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
  35. package/index.d.ts +0 -1
  36. package/lib/_collection/_common/ai-tutor/ai-tutor.component.d.ts +139 -0
  37. package/lib/_collection/_common/ai-tutor/socket.service.d.ts +19 -0
  38. package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +0 -1
  39. package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +0 -1
  40. package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +0 -1
  41. package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +0 -1
  42. package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +0 -1
  43. package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +0 -1
  44. package/lib/_collection/_common/card-competency/card-competency.component.d.ts +14 -0
  45. package/lib/_collection/_common/card-competency/card-competency.module.d.ts +8 -0
  46. package/lib/_collection/_common/card-content-v2/card-content-v2.model.d.ts +44 -0
  47. package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +8 -1
  48. package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +12 -12
  49. package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +0 -1
  50. package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +0 -1
  51. package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +0 -1
  52. package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +0 -1
  53. package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +0 -1
  54. package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +0 -1
  55. package/lib/_collection/_common/connection-name/connection-name.component.d.ts +0 -1
  56. package/lib/_collection/_common/connection-name/connection-name.module.d.ts +0 -1
  57. package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +0 -1
  58. package/lib/_collection/_common/content-progress/content-progress.component.d.ts +0 -1
  59. package/lib/_collection/_common/content-progress/content-progress.module.d.ts +0 -1
  60. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +0 -1
  61. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +0 -1
  62. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +1 -2
  63. package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +2 -1
  64. package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +0 -1
  65. package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +0 -1
  66. package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +0 -1
  67. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +8 -1
  68. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +64 -5
  69. package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +0 -1
  70. package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +0 -1
  71. package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +0 -1
  72. package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +0 -1
  73. package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +0 -1
  74. package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +0 -1
  75. package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +0 -1
  76. package/lib/_collection/_common/content-toc/content-toc.component.d.ts +2 -2
  77. package/lib/_collection/_common/content-toc/content-toc.module.d.ts +29 -29
  78. package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +0 -1
  79. package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +0 -1
  80. package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +0 -1
  81. package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +0 -1
  82. package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +0 -1
  83. package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +0 -1
  84. package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +0 -1
  85. package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +0 -1
  86. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +0 -1
  87. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +0 -1
  88. package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +0 -1
  89. package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +0 -1
  90. package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +0 -1
  91. package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +0 -1
  92. package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +0 -2
  93. package/lib/_collection/_common/player-brief/player-brief.component.d.ts +0 -1
  94. package/lib/_collection/_common/player-brief/player-brief.module.d.ts +0 -1
  95. package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +0 -1
  96. package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +0 -1
  97. package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +0 -1
  98. package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +0 -1
  99. package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +0 -1
  100. package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +0 -1
  101. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +0 -1
  102. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +0 -1
  103. package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +0 -1
  104. package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +0 -1
  105. package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +0 -1
  106. package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +0 -1
  107. package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +0 -1
  108. package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +0 -1
  109. package/lib/_collection/_common/user-image/user-image.component.d.ts +0 -1
  110. package/lib/_collection/_common/user-image/user-image.module.d.ts +0 -1
  111. package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +0 -1
  112. package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +0 -1
  113. package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +0 -1
  114. package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +0 -1
  115. package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +0 -1
  116. package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +0 -1
  117. package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +0 -1
  118. package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +0 -1
  119. package/lib/_collection-api.d.ts +0 -1
  120. package/lib/_constants/widget-content.constants.d.ts +0 -1
  121. package/lib/_directives/tooltip.directive.d.ts +0 -1
  122. package/lib/_models/common.model.d.ts +0 -1
  123. package/lib/_models/error.model.d.ts +0 -1
  124. package/lib/_pipes/highlight.pipe.d.ts +0 -1
  125. package/lib/_services/rating.service.d.ts +0 -1
  126. package/lib/_services/samuhik-charcha.service.d.ts +0 -1
  127. package/lib/_services/viewer-route-util.d.ts +0 -1
  128. package/lib/_services/widget-content.model.d.ts +6 -1
  129. package/lib/_services/widget-content.service.d.ts +0 -1
  130. package/lib/_shared/translate-loader.factory.d.ts +0 -1
  131. package/lib/app-toc-lib.module.d.ts +2 -2
  132. package/lib/collection.config.d.ts +0 -1
  133. package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +0 -1
  134. package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +0 -1
  135. package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +3 -1
  136. package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +0 -1
  137. package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +0 -1
  138. package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +0 -1
  139. package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +0 -1
  140. package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +0 -1
  141. package/lib/components/app-toc-home/app-toc-home.component.d.ts +0 -1
  142. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +28 -4
  143. package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +0 -1
  144. package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +0 -1
  145. package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +0 -1
  146. package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +0 -1
  147. package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +0 -1
  148. package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +0 -1
  149. package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +0 -1
  150. package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +0 -1
  151. package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +0 -1
  152. package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +0 -1
  153. package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +0 -1
  154. package/lib/components/public-survey-form/public-survey-form.component.d.ts +0 -1
  155. package/lib/components/survey-form-question/survey-form-question.component.d.ts +0 -1
  156. package/lib/components/survey-form-section/survey-form-section.component.d.ts +0 -1
  157. package/lib/models/app-toc-analytics.model.d.ts +0 -1
  158. package/lib/models/app-toc.model.d.ts +0 -1
  159. package/lib/models/auto-complete.model.d.ts +0 -1
  160. package/lib/models/card-content.model.d.ts +0 -1
  161. package/lib/models/content-strip-with-tabs.model.d.ts +0 -1
  162. package/lib/models/discussion-forum.model.d.ts +0 -1
  163. package/lib/models/goal.model.d.ts +0 -1
  164. package/lib/models/meta-tag.model.d.ts +0 -1
  165. package/lib/models/playlist.model.d.ts +0 -1
  166. package/lib/models/profile-revamp.model.d.ts +0 -1
  167. package/lib/models/rating.model.d.ts +0 -1
  168. package/lib/models/user-profile.model.d.ts +0 -1
  169. package/lib/registration-toc-lib.config.d.ts +4 -0
  170. package/lib/resolvers/app-toc-cios-resolver.service.d.ts +0 -1
  171. package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +0 -1
  172. package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +0 -1
  173. package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +0 -1
  174. package/lib/resolvers/app-toc-resolver.service.d.ts +0 -1
  175. package/lib/resolvers/config-resolver.service.d.ts +0 -1
  176. package/lib/resolvers/profile-resolver.service.d.ts +0 -1
  177. package/lib/resolvers/restricted-features-resolver.service.d.ts +0 -1
  178. package/lib/routes/app-toc-home/app-toc-home.component.d.ts +0 -1
  179. package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +0 -1
  180. package/lib/routes/app-toc-home/app-toc-home.service.d.ts +0 -1
  181. package/lib/services/access-control.service.d.ts +0 -1
  182. package/lib/services/action.service.d.ts +0 -1
  183. package/lib/services/app-toc-v2.service.d.ts +3 -1
  184. package/lib/services/app-toc.service.d.ts +41 -13
  185. package/lib/services/certificate.service.d.ts +5 -7
  186. package/lib/services/discuss-utils.service.d.ts +0 -1
  187. package/lib/services/editor.service.d.ts +0 -1
  188. package/lib/services/load-check.service.d.ts +0 -1
  189. package/lib/services/loader.service.d.ts +0 -1
  190. package/lib/services/mobile-apps.service.d.ts +0 -1
  191. package/lib/services/netcore.service.d.ts +0 -1
  192. package/lib/services/nps-grid.service.d.ts +0 -1
  193. package/lib/services/otp.service.d.ts +0 -1
  194. package/lib/services/profile-v2.service.d.ts +0 -1
  195. package/lib/services/reset-ratings.service.d.ts +0 -1
  196. package/lib/services/resource-download-helper.service.d.ts +0 -1
  197. package/lib/services/root.service.d.ts +26 -0
  198. package/lib/services/timer.service.d.ts +0 -1
  199. package/lib/services/title-tag.service.d.ts +0 -1
  200. package/lib/services/user-profile.service.d.ts +0 -1
  201. package/lib/services/viewer-data.service.d.ts +9 -6
  202. package/lib/services/viewer-util.service.d.ts +14 -1
  203. package/lib/share-toc/share-toc/share-toc.component.d.ts +0 -1
  204. package/lib/share-toc/share-toc.module.d.ts +0 -1
  205. package/package.json +3 -5
  206. package/public-api.d.ts +9 -1
  207. package/sunbird-cb-toc-0.0.32.1.tgz +0 -0
  208. package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts.map +0 -1
  209. package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts.map +0 -1
  210. package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts.map +0 -1
  211. package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts.map +0 -1
  212. package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts.map +0 -1
  213. package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts.map +0 -1
  214. package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts.map +0 -1
  215. package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts.map +0 -1
  216. package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts.map +0 -1
  217. package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts.map +0 -1
  218. package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts.map +0 -1
  219. package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts.map +0 -1
  220. package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts.map +0 -1
  221. package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts.map +0 -1
  222. package/lib/_collection/_common/connection-name/connection-name.component.d.ts.map +0 -1
  223. package/lib/_collection/_common/connection-name/connection-name.module.d.ts.map +0 -1
  224. package/lib/_collection/_common/connection-name/profile-v2.model.d.ts.map +0 -1
  225. package/lib/_collection/_common/content-progress/content-progress.component.d.ts.map +0 -1
  226. package/lib/_collection/_common/content-progress/content-progress.module.d.ts.map +0 -1
  227. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts.map +0 -1
  228. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts.map +0 -1
  229. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts.map +0 -1
  230. package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts.map +0 -1
  231. package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts.map +0 -1
  232. package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts.map +0 -1
  233. package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts.map +0 -1
  234. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts.map +0 -1
  235. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts.map +0 -1
  236. package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts.map +0 -1
  237. package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts.map +0 -1
  238. package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts.map +0 -1
  239. package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts.map +0 -1
  240. package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts.map +0 -1
  241. package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts.map +0 -1
  242. package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts.map +0 -1
  243. package/lib/_collection/_common/content-toc/content-toc.component.d.ts.map +0 -1
  244. package/lib/_collection/_common/content-toc/content-toc.module.d.ts.map +0 -1
  245. package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts.map +0 -1
  246. package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts.map +0 -1
  247. package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts.map +0 -1
  248. package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts.map +0 -1
  249. package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts.map +0 -1
  250. package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts.map +0 -1
  251. package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts.map +0 -1
  252. package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts.map +0 -1
  253. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts.map +0 -1
  254. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts.map +0 -1
  255. package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts.map +0 -1
  256. package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts.map +0 -1
  257. package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts.map +0 -1
  258. package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts.map +0 -1
  259. package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts.map +0 -1
  260. package/lib/_collection/_common/player-brief/player-brief.component.d.ts.map +0 -1
  261. package/lib/_collection/_common/player-brief/player-brief.module.d.ts.map +0 -1
  262. package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts.map +0 -1
  263. package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts.map +0 -1
  264. package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts.map +0 -1
  265. package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts.map +0 -1
  266. package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts.map +0 -1
  267. package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts.map +0 -1
  268. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts.map +0 -1
  269. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts.map +0 -1
  270. package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts.map +0 -1
  271. package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts.map +0 -1
  272. package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts.map +0 -1
  273. package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts.map +0 -1
  274. package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts.map +0 -1
  275. package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts.map +0 -1
  276. package/lib/_collection/_common/user-image/user-image.component.d.ts.map +0 -1
  277. package/lib/_collection/_common/user-image/user-image.module.d.ts.map +0 -1
  278. package/lib/_collection/btn-page-back/btn-page-back.component.d.ts.map +0 -1
  279. package/lib/_collection/btn-page-back/btn-page-back.module.d.ts.map +0 -1
  280. package/lib/_collection/btn-page-back/btn-page-back.service.d.ts.map +0 -1
  281. package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts.map +0 -1
  282. package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts.map +0 -1
  283. package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts.map +0 -1
  284. package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts.map +0 -1
  285. package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts.map +0 -1
  286. package/lib/_collection-api.d.ts.map +0 -1
  287. package/lib/_constants/widget-content.constants.d.ts.map +0 -1
  288. package/lib/_directives/tooltip.directive.d.ts.map +0 -1
  289. package/lib/_models/common.model.d.ts.map +0 -1
  290. package/lib/_models/error.model.d.ts.map +0 -1
  291. package/lib/_pipes/highlight.pipe.d.ts.map +0 -1
  292. package/lib/_services/rating.service.d.ts.map +0 -1
  293. package/lib/_services/samuhik-charcha.service.d.ts.map +0 -1
  294. package/lib/_services/viewer-route-util.d.ts.map +0 -1
  295. package/lib/_services/widget-content.model.d.ts.map +0 -1
  296. package/lib/_services/widget-content.service.d.ts.map +0 -1
  297. package/lib/_shared/translate-loader.factory.d.ts.map +0 -1
  298. package/lib/app-toc-lib.module.d.ts.map +0 -1
  299. package/lib/collection.config.d.ts.map +0 -1
  300. package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts.map +0 -1
  301. package/lib/components/app-toc-banner/app-toc-banner.component.d.ts.map +0 -1
  302. package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts.map +0 -1
  303. package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts.map +0 -1
  304. package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts.map +0 -1
  305. package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts.map +0 -1
  306. package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts.map +0 -1
  307. package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts.map +0 -1
  308. package/lib/components/app-toc-home/app-toc-home.component.d.ts.map +0 -1
  309. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts.map +0 -1
  310. package/lib/components/app-toc-overview/app-toc-overview.component.d.ts.map +0 -1
  311. package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts.map +0 -1
  312. package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts.map +0 -1
  313. package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts.map +0 -1
  314. package/lib/components/completion-survey-form/completion-survey-form.component.d.ts.map +0 -1
  315. package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts.map +0 -1
  316. package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts.map +0 -1
  317. package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts.map +0 -1
  318. package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts.map +0 -1
  319. package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts.map +0 -1
  320. package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts.map +0 -1
  321. package/lib/components/public-survey-form/public-survey-form.component.d.ts.map +0 -1
  322. package/lib/components/survey-form-question/survey-form-question.component.d.ts.map +0 -1
  323. package/lib/components/survey-form-section/survey-form-section.component.d.ts.map +0 -1
  324. package/lib/models/app-toc-analytics.model.d.ts.map +0 -1
  325. package/lib/models/app-toc.model.d.ts.map +0 -1
  326. package/lib/models/auto-complete.model.d.ts.map +0 -1
  327. package/lib/models/card-content.model.d.ts.map +0 -1
  328. package/lib/models/content-strip-with-tabs.model.d.ts.map +0 -1
  329. package/lib/models/discussion-forum.model.d.ts.map +0 -1
  330. package/lib/models/goal.model.d.ts.map +0 -1
  331. package/lib/models/meta-tag.model.d.ts.map +0 -1
  332. package/lib/models/playlist.model.d.ts.map +0 -1
  333. package/lib/models/profile-revamp.model.d.ts.map +0 -1
  334. package/lib/models/rating.model.d.ts.map +0 -1
  335. package/lib/models/user-profile.model.d.ts.map +0 -1
  336. package/lib/resolvers/app-toc-cios-resolver.service.d.ts.map +0 -1
  337. package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts.map +0 -1
  338. package/lib/resolvers/app-toc-content-read-resolver.service.d.ts.map +0 -1
  339. package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts.map +0 -1
  340. package/lib/resolvers/app-toc-resolver.service.d.ts.map +0 -1
  341. package/lib/resolvers/config-resolver.service.d.ts.map +0 -1
  342. package/lib/resolvers/profile-resolver.service.d.ts.map +0 -1
  343. package/lib/resolvers/restricted-features-resolver.service.d.ts.map +0 -1
  344. package/lib/routes/app-toc-home/app-toc-home.component.d.ts.map +0 -1
  345. package/lib/routes/app-toc-home/app-toc-home.directive.d.ts.map +0 -1
  346. package/lib/routes/app-toc-home/app-toc-home.service.d.ts.map +0 -1
  347. package/lib/services/access-control.service.d.ts.map +0 -1
  348. package/lib/services/action.service.d.ts.map +0 -1
  349. package/lib/services/app-toc-v2.service.d.ts.map +0 -1
  350. package/lib/services/app-toc.service.d.ts.map +0 -1
  351. package/lib/services/certificate.service.d.ts.map +0 -1
  352. package/lib/services/discuss-utils.service.d.ts.map +0 -1
  353. package/lib/services/editor.service.d.ts.map +0 -1
  354. package/lib/services/load-check.service.d.ts.map +0 -1
  355. package/lib/services/loader.service.d.ts.map +0 -1
  356. package/lib/services/mobile-apps.service.d.ts.map +0 -1
  357. package/lib/services/netcore.service.d.ts.map +0 -1
  358. package/lib/services/nps-grid.service.d.ts.map +0 -1
  359. package/lib/services/otp.service.d.ts.map +0 -1
  360. package/lib/services/profile-v2.service.d.ts.map +0 -1
  361. package/lib/services/reset-ratings.service.d.ts.map +0 -1
  362. package/lib/services/resource-download-helper.service.d.ts.map +0 -1
  363. package/lib/services/timer.service.d.ts.map +0 -1
  364. package/lib/services/title-tag.service.d.ts.map +0 -1
  365. package/lib/services/user-profile.service.d.ts.map +0 -1
  366. package/lib/services/viewer-data.service.d.ts.map +0 -1
  367. package/lib/services/viewer-util.service.d.ts.map +0 -1
  368. package/lib/share-toc/share-toc/share-toc.component.d.ts.map +0 -1
  369. package/lib/share-toc/share-toc.module.d.ts.map +0 -1
  370. package/public-api.d.ts.map +0 -1
  371. package/sunbird-cb-toc.d.ts.map +0 -1
@@ -5,9 +5,10 @@ import * as i1 from "@angular/router";
5
5
  import * as i2 from "../../../../services/app-toc.service";
6
6
  import * as i3 from "@sunbird-cb/utils-v2";
7
7
  import * as i4 from "@angular/common";
8
- import * as i5 from "../app-toc-content-card-v2/app-toc-content-card-v2.component";
9
- import * as i6 from "../app-toc-sessions-new/app-toc-sessions-new.component";
10
- import * as i7 from "../app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component";
8
+ import * as i5 from "@angular/material/legacy-tooltip";
9
+ import * as i6 from "../app-toc-content-card-v2/app-toc-content-card-v2.component";
10
+ import * as i7 from "../app-toc-sessions-new/app-toc-sessions-new.component";
11
+ import * as i8 from "../app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component";
11
12
  // import { NsAppToc } from '../models/app-toc.model'
12
13
  export class AppTocContentComponent {
13
14
  constructor(route, tocSvc, configSvc) {
@@ -26,6 +27,7 @@ export class AppTocContentComponent {
26
27
  // errorCode: NsAppToc.EWsTocErrorCode | null = null
27
28
  this.routeSubscription = null;
28
29
  this.routeQuerySubscription = null;
30
+ this.hashmapUpdatedSubscription = null;
29
31
  this.contentParents = [];
30
32
  this.expandAll = false;
31
33
  this.expandPartOf = false;
@@ -44,6 +46,8 @@ export class AppTocContentComponent {
44
46
  // console.log('qParamsMap--', qParamsMap)
45
47
  // console.log('this.content--', this.content)
46
48
  // console.log('this.hierarchyMapData', this.hierarchyMapData)
49
+ // Parse preEnrolmentResources if it exists as a string
50
+ // Note: This is separate from preliminary assessment which is in children array with isPreAssessment flag
47
51
  if (this.content && this.content?.preEnrolmentResources && typeof this.content?.preEnrolmentResources === 'string') {
48
52
  this.content['preEnrolmentResources'] = JSON.parse(this.content?.preEnrolmentResources);
49
53
  }
@@ -74,6 +78,13 @@ export class AppTocContentComponent {
74
78
  this.tocSvc.contentLoader$.subscribe((val) => {
75
79
  this.contentLoader = val;
76
80
  });
81
+ // Subscribe to hashmap updates for real-time progress synchronization
82
+ this.hashmapUpdatedSubscription = this.tocSvc.hashmapUpdated$.subscribe((update) => {
83
+ if (update && update.hashmap) {
84
+ // Update hierarchyMapData with the latest hashmap from the service
85
+ this.hierarchyMapData = update.hashmap;
86
+ }
87
+ });
77
88
  const instanceConfig = this.configSvc.instanceConfig;
78
89
  if (instanceConfig) {
79
90
  this.defaultThumbnail = instanceConfig.logos.defaultContent || '';
@@ -130,7 +141,9 @@ export class AppTocContentComponent {
130
141
  }
131
142
  }
132
143
  get isEnrolled() {
133
- return this.batchId ? true : false;
144
+ // Check both batchId and batchData.enrolled to support Learning Pathways
145
+ // where batchId might not be directly set but user is enrolled in courses within the pathway
146
+ return this.batchId ? true : (this.batchData?.enrolled || false);
134
147
  }
135
148
  // private processCollectionForTree() {
136
149
  // this.pathSet = new Set()
@@ -184,13 +197,81 @@ export class AppTocContentComponent {
184
197
  if (this.routeQuerySubscription) {
185
198
  this.routeQuerySubscription.unsubscribe();
186
199
  }
200
+ if (this.hashmapUpdatedSubscription) {
201
+ this.hashmapUpdatedSubscription.unsubscribe();
202
+ }
203
+ }
204
+ getMilestoneCompletedOrNot(identifier) {
205
+ if (!this.content || !this.hierarchyMapData) {
206
+ return false;
207
+ }
208
+ const milestoneData = this.hierarchyMapData[identifier];
209
+ if (milestoneData && milestoneData?.primaryCategory === NsContent.EPrimaryCategory.FINAL_ASSESSMENT) {
210
+ return milestoneData?.completionStatus === 2;
211
+ }
212
+ if (!milestoneData) {
213
+ return false;
214
+ }
215
+ // Check if all mandatory content AND milestone assessment are completed
216
+ let hasMandatoryContent = false;
217
+ let allMandatoryComplete = true;
218
+ let hasMilestoneAssessment = false;
219
+ let milestoneAssessmentComplete = false;
220
+ // Check all direct children of the milestone
221
+ for (const key of Object.keys(this.hierarchyMapData)) {
222
+ const item = this.hierarchyMapData[key];
223
+ // Only check direct children
224
+ if (item.parent !== identifier)
225
+ continue;
226
+ // Check if this is the milestone assessment
227
+ const isAssessment = item.primaryCategory === 'Course Assessment' ||
228
+ item.primaryCategory === 'Final Assessment' ||
229
+ item.primaryCategory === 'Standalone Assessment';
230
+ if (isAssessment) {
231
+ hasMilestoneAssessment = true;
232
+ const isCompleted = item.completionStatus === 2 || item.status === 2 ||
233
+ item.completionPercentage >= 100 || item.progress >= 100;
234
+ if (isCompleted) {
235
+ milestoneAssessmentComplete = true;
236
+ }
237
+ continue; // Skip to next item
238
+ }
239
+ // Check if this is mandatory content (courses/collections)
240
+ if (item.primaryCategory === 'Course' || item.isCollection) {
241
+ const isMandatory = item.isMandatory !== false; // Default is mandatory
242
+ if (isMandatory) {
243
+ hasMandatoryContent = true;
244
+ const isCompleted = item.completionStatus === 2 || item.status === 2 ||
245
+ item.completionPercentage >= 100 || item.progress >= 100;
246
+ if (!isCompleted) {
247
+ allMandatoryComplete = false;
248
+ }
249
+ }
250
+ }
251
+ }
252
+ // Milestone is complete when:
253
+ // 1. All mandatory content is completed (or no mandatory content exists)
254
+ // 2. Milestone assessment is completed (or no assessment exists)
255
+ const mandatoryCheck = !hasMandatoryContent || allMandatoryComplete;
256
+ const assessmentCheck = !hasMilestoneAssessment || milestoneAssessmentComplete;
257
+ return mandatoryCheck && assessmentCheck;
258
+ }
259
+ /**
260
+ * Check if multi-line text is truncated (has ellipsis)
261
+ * @param element The HTMLElement to check
262
+ * @returns true if text is truncated, false otherwise
263
+ */
264
+ isMultiLineTruncated(element) {
265
+ if (!element)
266
+ return false;
267
+ return element.scrollHeight > element.clientHeight;
187
268
  }
188
269
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocContentComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.AppTocService }, { token: i3.ConfigurationsService }], target: i0.ɵɵFactoryTarget.Component }); }
189
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocContentComponent, selector: "ws-widget-app-toc-content", inputs: { batchId: "batchId", content: "content", forPreview: "forPreview", resumeData: "resumeData", batchData: "batchData", skeletonLoader: "skeletonLoader", tocStructure: "tocStructure", config: "config", hierarchyMapData: "hierarchyMapData", pathSet: "pathSet", componentName: "componentName", isPreAssessment: "isPreAssessment", baseContentReadData: "baseContentReadData", contentReadData: "contentReadData" }, usesOnChanges: true, ngImport: i0, template: "<div>\n <!-- Milestone / Learning Path UI -->\n <div class=\"milestone-wrapper\" role=\"group\" aria-label=\"Learning path milestones\">\n <ng-container *ngIf=\"content?.children?.length; else fallbackMilestones\">\n <ul class=\"milestone-list\">\n <li *ngFor=\"let m of content?.children; let i = index\" class=\"milestone-item\"\n [class.completed]=\"m?.completionStatus === 2\" role=\"listitem\">\n <div class=\"milestone-circle\" [attr.aria-label]=\"m?.name || ('Milestone ' + (i+1))\">\n <img *ngIf=\"m?.completionStatus === 2\" src=\"assets/icons/toc/tick-orange.svg\"\n class=\"milestone-checkmark\" alt=\"Completed\" />\n <span *ngIf=\"m?.completionStatus !== 2\" class=\"milestone-index\">{{ i + 1 }}</span>\n </div>\n <div class=\"milestone-label\">{{ m?.name }}</div>\n </li>\n </ul>\n </ng-container>\n <ng-template #fallbackMilestones>\n <ul class=\"milestone-list\">\n <li class=\"milestone-item completed\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"Pre Assessment\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">Pre Assessment</div>\n </li>\n <li class=\"milestone-item completed\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"1. Foundation of Workplace Ethics\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">1. Foundation of Workplace Ethics</div>\n </li>\n <li class=\"milestone-item\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"2. Health and Productivity at Work\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">2. Health and Productivity at Work</div>\n </li>\n <li class=\"milestone-item\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"3. Health and Productivity at Work\">\n <span class=\"milestone-index\">4</span>\n </div>\n <div class=\"milestone-label\">3. Health and Productivity at Work</div>\n </li>\n </ul>\n </ng-template>\n </div>\n</div>\n<div class=\"bggrey\">\n <div class=\"py-4 content-container\" id=\"contentContainer\" *ngIf=\"!isPreAssessment\">\n <div class=\"main-container flex flex-col gap-4\">\n <ng-container *ngIf=\"content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <div class=\"padding-left-m flex gap-4 tab-list\">\n <ng-container *ngFor=\"let type of typesOfContent\">\n <div class=\"tab-data\" (click)=\"!type.disabled && selectedTabType = type.id\"\n [ngClass]=\"{'active-tab': selectedTabType === type.id, 'disabled':type.disabled}\">\n <span>{{type.name}}</span>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"selectedTabType === 'content' && content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ng-container [ngTemplateOutlet]=\"contentBlock\"></ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"selectedTabType === 'session' && content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ws-widget-app-app-toc-sessions-new [batchData]=\"batchData\" [pathSet]=\"pathSet\" [rootId]=\"contextId\"\n [rootContentType]=\"contextPath\" [batchId]=\"batchId\" [config]=\"config\" [content]=\"content\">\n </ws-widget-app-app-toc-sessions-new>\n </ng-container>\n <ng-container *ngIf=\"content?.primaryCategory !== nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ng-container [ngTemplateOutlet]=\"contentBlock\"></ng-container>\n </ng-container>\n </div>\n </div>\n <!-- {{pathSet|json}} -->\n <ng-template #contentBlock>\n <ng-container *ngIf=\"!contentLoader\">\n <ng-container *ngIf=\"content?.children?.length; else noChildren\">\n <div class=\"content-card \"\n *ngFor=\"let card of content?.children; trackBy: contentTrackBy; let i = index;\"\n [ngClass]=\"{ 'content-active': pathSet && pathSet.has(card.identifier) && isEnrolled}\">\n <!-- {{card|json}} -->\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [expandAll]=\"expandAll\"\n [componentName]=\"componentName\" [expandActive]=\"true\" [rootId]=\"contextId\" [batchId]=\"batchId\"\n [rootContentType]=\"contextPath\" [content]=\"card\" [mlCourse]=\"content\" [index]=\"i+1\"\n [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\" [batchData]=\"batchData\"\n [baseContentReadData]=\"baseContentReadData\"></ws-widget-app-toc-content-card-v2>\n </div>\n </ng-container>\n <ng-template #noChildren>\n <div *ngIf=\"!isPlayable\"\n class=\"ws-mat-primary-default-text ws-mat-primary-lite-background px-6 py-8 font-normal text-base noChildren\">\n The preview for this type of content is unavailable. Please click on Start button above to view.\n </div>\n <!-- <ng-container *ngIf=\"isPlayable\" [wsResolverWidget]=\"contentPlayWidgetConfig\"></ng-container> -->\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"contentLoader\">\n <ws-widget-app-toc-content-card-v2-skeleton></ws-widget-app-toc-content-card-v2-skeleton>\n </ng-container>\n </ng-template>\n <div *ngIf=\"isPreAssessment\">\n <div class=\"content-card \"\n *ngFor=\"let card of content?.preEnrolmentResources; trackBy: identifier; let i = index;\"\n [ngClass]=\"{ 'content-active': pathSet && pathSet.has(card.identifier) && isEnrolled}\">\n <!-- {{card|json}} -->\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [expandAll]=\"expandAll\"\n [componentName]=\"componentName\" [expandActive]=\"true\" [rootId]=\"contextId\" [batchId]=\"batchId\"\n [rootContentType]=\"contextPath\" [isPreAssessment]=\"isPreAssessment\" [content]=\"card\"\n [mlCourse]=\"content\" [index]=\"i+1\" [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\"\n [batchData]=\"batchData\" [baseContentReadData]=\"baseContentReadData\"></ws-widget-app-toc-content-card-v2>\n </div>\n </div>\n</div>", styles: [".bggrey{background-color:#eff3f9}.content-container{min-height:800px}.content-accordion .content-panel{box-shadow:none}.content-accordion .content-header{padding:20px;background-color:#fff;border:none;box-shadow:none}.content-key-values{color:#0009}.content-key-values mat-icon{width:14px;height:14px;font-size:14px;color:#0006}.main-container{width:100%;box-sizing:border-box}.main-container .toc-section{display:flex;justify-content:space-between;padding-bottom:12px}.main-container .content-card{background:#fff;border:1px solid rgb(221,221,221);overflow:hidden;position:relative}.main-container .content-card.content-active{border:1px solid #1a4ca1}.main-container .noChildren{color:#222!important}@media only screen and (max-width: 959px){.main-container{width:100%;padding-right:0;margin-bottom:32px}}::ng-deep .mat-expansion-indicator{display:none!important}.mat-panel-indicator{width:28px;height:28px;font-size:28px}.tab-list .tab-data{border-radius:18px;border:1px solid rgba(0,0,0,.08);opacity:1;background-color:#e5e9ef;padding:6px 16px;cursor:pointer}.tab-list .tab-data span{opacity:1;color:#000000de;font-family:Lato-Regular;font-size:14px;font-weight:400;font-style:Regular;letter-spacing:.25px;text-align:left;line-height:20px}.tab-list .active-tab{border-radius:18px;border:1px solid rgb(27,76,161);opacity:1;background-color:#dee6f2}.tab-list .active-tab span{color:#1b4ca1}.tab-list .disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.milestone-wrapper{--milestone-size: 33px;--milestone-border: 3px;padding:24px 16px 32px;background:transparent}.milestone-list{display:flex;align-items:flex-start;justify-content:space-between;list-style:none;margin:0;padding:0 16px;gap:12px}.milestone-item{display:flex;flex-direction:column;align-items:center;text-align:center;flex:1 1 0;position:relative}.milestone-item:after{content:\"\";position:absolute;top:calc(var(--milestone-size) / 2);left:50%;right:-50%;height:3px;background:#e0e0e0;border-top:3px dotted #BDBDBD;background:transparent;z-index:0}.milestone-item.completed:after{background:linear-gradient(90deg,#efa34f,#f3962f);border:none}.milestone-item:last-child:after{display:none}.milestone-circle{width:var(--milestone-size);height:var(--milestone-size);min-width:var(--milestone-size);border-radius:50%;background:#fff;border:var(--milestone-border) solid #F3962F;display:flex;align-items:center;justify-content:center;z-index:1;position:relative;box-shadow:0 2px 8px #00000014;transition:all .2s ease}.milestone-item.completed .milestone-circle{background:#fff;border-color:#f3962f;box-shadow:0 4px 12px #efa34f4d}.milestone-checkmark{width:80%;height:80%;object-fit:contain}.milestone-index{font-weight:700;font-size:18px;color:#757575}.milestone-item.completed .milestone-index{color:#fff}.milestone-label{margin-top:12px;font-size:14px;line-height:1.4;color:#000000de;max-width:140px;word-wrap:break-word;white-space:normal;font-weight:500}.milestone-item:focus-within .milestone-circle,.milestone-item:hover .milestone-circle{transform:translateY(-2px) scale(1.05);box-shadow:0 6px 16px #00000026}.milestone-item.completed:hover .milestone-circle{box-shadow:0 6px 20px #efa34f66}@media (max-width: 768px){.milestone-wrapper{--milestone-size: 48px;padding:20px 12px 28px}.milestone-list{gap:8px;padding:0 8px}.milestone-label{font-size:12px;max-width:100px}.milestone-index{font-size:16px}}@media (max-width: 480px){.milestone-wrapper{--milestone-size: 40px;padding:16px 8px 24px}.milestone-list{gap:6px;padding:0 4px}.milestone-label{font-size:11px;max-width:80px;margin-top:8px}.milestone-index{font-size:14px}.milestone-item:after{height:2px;border-top-width:2px}}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.AppTocContentCardV2Component, selector: "ws-widget-app-toc-content-card-v2", inputs: ["content", "expandAll", "rootId", "rootContentType", "forPreview", "batchId", "componentName", "index", "pathSet", "expandActive", "hierarchyMapData", "batchData", "isPreAssessment", "baseContentReadData", "mlCourse", "parentMilestoneLocked"] }, { kind: "component", type: i6.AppTocSessionsNewComponent, selector: "ws-widget-app-app-toc-sessions-new", inputs: ["batchData", "content", "forPreview", "config", "batchId", "rootId", "rootContentType", "pathSet"] }, { kind: "component", type: i7.AppTocContentCardV2SkeletonComponent, selector: "ws-widget-app-toc-content-card-v2-skeleton" }] }); }
270
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocContentComponent, selector: "ws-widget-app-toc-content", inputs: { batchId: "batchId", content: "content", forPreview: "forPreview", resumeData: "resumeData", batchData: "batchData", skeletonLoader: "skeletonLoader", tocStructure: "tocStructure", config: "config", hierarchyMapData: "hierarchyMapData", pathSet: "pathSet", componentName: "componentName", isPreAssessment: "isPreAssessment", baseContentReadData: "baseContentReadData", contentReadData: "contentReadData" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"content?.courseCategory === 'Learning Pathway' && componentName !== 'viewer'\">\n <!-- Milestone / Learning Path UI -->\n <div class=\"milestone-wrapper\" role=\"group\" aria-label=\"Learning path milestones\">\n <!-- Learning Path Header -->\n <div class=\"learning-path-header\">\n <h3 class=\"learning-path-title\">Learning Path</h3>\n <p class=\"learning-path-subtitle\">Complete {{content?.children?.length - 1 || 3}} key milestones</p>\n </div>\n <ng-container *ngIf=\"content?.children?.length; else fallbackMilestones\">\n <ul class=\"milestone-list\">\n <li *ngFor=\"let m of content?.children; let i = index\" class=\"milestone-item\"\n [class.completed]=\"m?.completionStatus === 2 || getMilestoneCompletedOrNot(m?.identifier)\" role=\"listitem\">\n <div class=\"milestone-circle\" [attr.aria-label]=\"m?.name || ('Milestone ' + (i+1))\">\n <img *ngIf=\"m?.completionStatus === 2 || getMilestoneCompletedOrNot(m?.identifier)\" src=\"assets/icons/toc/tick-orange.svg\"\n class=\"milestone-checkmark\" alt=\"Completed\" />\n <span *ngIf=\"m?.completionStatus !== 2 && !getMilestoneCompletedOrNot(m?.identifier)\" class=\"milestone-index\"></span>\n </div>\n <div class=\"milestone-label\">\n <p class=\"mb-0 leading-none\">\n <span *ngIf=\"m?.contextCategory\">{{m?.contextCategory}}</span>\n <span *ngIf=\"m?.courseCategory\">{{m?.courseCategory}} {{ i}}</span>\n </p>\n <p #milestoneNameRef class=\"milestone-name-text leading-none\"\n [matTooltip]=\"isMultiLineTruncated(milestoneNameRef) ? m?.name : ''\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"multiline-tooltip\">\n {{ m?.name }}\n </p>\n </div>\n </li>\n </ul>\n </ng-container>\n <ng-template #fallbackMilestones>\n <ul class=\"milestone-list\">\n <li class=\"milestone-item completed\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"Pre Assessment\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">Pre Assessment</div>\n </li>\n <li class=\"milestone-item completed\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"1. Foundation of Workplace Ethics\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">1. Foundation of Workplace Ethics</div>\n </li>\n <li class=\"milestone-item\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"2. Health and Productivity at Work\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">2. Health and Productivity at Work</div>\n </li>\n <li class=\"milestone-item\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"3. Health and Productivity at Work\">\n <span class=\"milestone-index\">4</span>\n </div>\n <div class=\"milestone-label\">3. Health and Productivity at Work</div>\n </li>\n </ul>\n </ng-template>\n </div>\n</div>\n<div class=\"bggrey\">\n <div class=\"py-4 content-container\" id=\"contentContainer\" *ngIf=\"!isPreAssessment\">\n <div class=\"main-container flex flex-col gap-4\">\n <ng-container *ngIf=\"content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <div class=\"padding-left-m flex gap-4 tab-list\">\n <ng-container *ngFor=\"let type of typesOfContent\">\n <div class=\"tab-data\" (click)=\"!type.disabled && selectedTabType = type.id\"\n [ngClass]=\"{'active-tab': selectedTabType === type.id, 'disabled':type.disabled}\">\n <span>{{type.name}}</span>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"selectedTabType === 'content' && content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ng-container [ngTemplateOutlet]=\"contentBlock\"></ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"selectedTabType === 'session' && content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ws-widget-app-app-toc-sessions-new [batchData]=\"batchData\" [pathSet]=\"pathSet\" [rootId]=\"contextId\"\n [rootContentType]=\"contextPath\" [batchId]=\"batchId\" [config]=\"config\" [content]=\"content\">\n </ws-widget-app-app-toc-sessions-new>\n </ng-container>\n <ng-container *ngIf=\"content?.primaryCategory !== nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ng-container [ngTemplateOutlet]=\"contentBlock\"></ng-container>\n </ng-container>\n </div>\n </div>\n <!-- {{pathSet|json}} -->\n <ng-template #contentBlock>\n <ng-container *ngIf=\"!contentLoader\">\n <ng-container *ngIf=\"content?.children?.length; else noChildren\">\n <div class=\"content-card \"\n *ngFor=\"let card of content?.children; trackBy: contentTrackBy; let i = index;\"\n [ngClass]=\"{ 'content-active': pathSet && pathSet.has(card.identifier) && isEnrolled}\">\n <!-- {{card|json}} -->\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [expandAll]=\"expandAll\"\n [componentName]=\"componentName\" [expandActive]=\"true\" [rootId]=\"contextId\" [batchId]=\"batchId\"\n [rootContentType]=\"contextPath\" [content]=\"card\" [mlCourse]=\"content\" [index]=\"i+1\"\n [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\" [batchData]=\"batchData\"\n [baseContentReadData]=\"baseContentReadData\"></ws-widget-app-toc-content-card-v2>\n </div>\n </ng-container>\n <ng-template #noChildren>\n <div *ngIf=\"!isPlayable\"\n class=\"ws-mat-primary-default-text ws-mat-primary-lite-background px-6 py-8 font-normal text-base noChildren\">\n The preview for this type of content is unavailable. Please click on Start button above to view.\n </div>\n <!-- <ng-container *ngIf=\"isPlayable\" [sbUiResolverWidget]=\"contentPlayWidgetConfig\"></ng-container> -->\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"contentLoader\">\n <ws-widget-app-toc-content-card-v2-skeleton></ws-widget-app-toc-content-card-v2-skeleton>\n </ng-container>\n </ng-template>\n <div *ngIf=\"isPreAssessment\">\n <div class=\"content-card \"\n *ngFor=\"let card of content?.preEnrolmentResources; trackBy: identifier; let i = index;\"\n [ngClass]=\"{ 'content-active': pathSet && pathSet.has(card.identifier) && isEnrolled}\">\n <!-- {{card|json}} -->\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [expandAll]=\"expandAll\"\n [componentName]=\"componentName\" [expandActive]=\"true\" [rootId]=\"contextId\" [batchId]=\"batchId\"\n [rootContentType]=\"contextPath\" [isPreAssessment]=\"isPreAssessment\" [content]=\"card\"\n [mlCourse]=\"content\" [index]=\"i+1\" [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\"\n [batchData]=\"batchData\" [baseContentReadData]=\"baseContentReadData\"></ws-widget-app-toc-content-card-v2>\n </div>\n </div>\n</div>", styles: [".bggrey{background-color:#eff3f9}.content-container{min-height:800px}.content-accordion .content-panel{box-shadow:none}.content-accordion .content-header{padding:20px;background-color:#fff;border:none;box-shadow:none}.content-key-values{color:#0009}.content-key-values mat-icon{width:14px;height:14px;font-size:14px;color:#0006}.main-container{width:100%;box-sizing:border-box}.main-container .toc-section{display:flex;justify-content:space-between;padding-bottom:12px}.main-container .content-card{background:#fff;border:1px solid rgb(221,221,221);overflow:hidden;position:relative}.main-container .content-card.content-active{border:1px solid #1a4ca1}.main-container .noChildren{color:#222!important}@media only screen and (max-width: 959px){.main-container{width:100%;padding-right:0;margin-bottom:32px}}::ng-deep .mat-expansion-indicator{display:none!important}.mat-panel-indicator{width:28px;height:28px;font-size:28px}.tab-list .tab-data{border-radius:18px;border:1px solid rgba(0,0,0,.08);opacity:1;background-color:#e5e9ef;padding:6px 16px;cursor:pointer}.tab-list .tab-data span{opacity:1;color:#000000de;font-family:Lato-Regular;font-size:14px;font-weight:400;font-style:Regular;letter-spacing:.25px;text-align:left;line-height:20px}.tab-list .active-tab{border-radius:18px;border:1px solid rgb(27,76,161);opacity:1;background-color:#dee6f2}.tab-list .active-tab span{color:#1b4ca1}.tab-list .disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.milestone-wrapper{--milestone-size: 33px;--milestone-border: 3px;padding:16px;background:#fff;display:flex;align-items:center;margin-top:16px}.learning-path-header{padding-right:16px}.learning-path-title{font-size:18px;font-weight:700;color:#000000de;margin:0 0 4px;font-family:Lato-Bold,Lato,sans-serif}.learning-path-subtitle{font-size:14px;font-weight:400;color:#0009;margin:0;font-family:Lato-Regular,Lato,sans-serif}.milestone-list{display:flex;align-items:flex-start;justify-content:space-between;list-style:none;margin:0;gap:12px;flex:1}.milestone-item{display:flex;flex-direction:column;align-items:center;text-align:center;flex:1 1 0;position:relative}.milestone-item:after{content:\"\";position:absolute;top:calc(var(--milestone-size) / 2);left:50%;right:-50%;height:3px;background:#e0e0e0;border-top:3px dotted #BDBDBD;background:transparent;z-index:0}.milestone-item.completed:after{background:linear-gradient(90deg,#efa34f,#f3962f);border:none}.milestone-item:last-child:after{display:none}.milestone-circle{width:var(--milestone-size);height:var(--milestone-size);min-width:var(--milestone-size);border-radius:50%;background:#fff;border:var(--milestone-border) solid #F3962F;display:flex;align-items:center;justify-content:center;z-index:1;position:relative;box-shadow:0 2px 8px #00000014;transition:all .2s ease}.milestone-item.completed .milestone-circle{background:#fff;border-color:#f3962f;box-shadow:0 4px 12px #efa34f4d}.milestone-checkmark{width:80%;height:80%;object-fit:contain}.milestone-index{font-weight:700;font-size:18px;color:#757575}.milestone-item.completed .milestone-index{color:#fff}.milestone-label{margin-top:12px;font-size:14px;line-height:1.4;color:#000000de;word-wrap:break-word;white-space:normal;font-weight:500}.milestone-item:focus-within .milestone-circle,.milestone-item:hover .milestone-circle{transform:translateY(-2px) scale(1.05);box-shadow:0 6px 16px #00000026}.milestone-item.completed:hover .milestone-circle{box-shadow:0 6px 20px #efa34f66}@media (max-width: 768px){.milestone-wrapper{--milestone-size: 48px;padding:20px 12px 28px}.milestone-list{gap:8px;padding:0 8px}.milestone-label{font-size:12px;max-width:100px}.milestone-index{font-size:16px}}@media (max-width: 480px){.milestone-wrapper{--milestone-size: 40px;padding:16px 8px 24px}.milestone-list{gap:6px;padding:0 4px}.milestone-label{font-size:11px;max-width:80px;margin-top:8px}.milestone-index{font-size:14px}.milestone-item:after{height:2px;border-top-width:2px}}.milestone-name-text{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;line-height:1.4;word-break:break-word}::ng-deep .multiline-tooltip{white-space:pre-wrap!important;max-width:400px!important;word-break:break-word!important;line-height:1.4!important}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i6.AppTocContentCardV2Component, selector: "ws-widget-app-toc-content-card-v2", inputs: ["content", "expandAll", "rootId", "rootContentType", "forPreview", "batchId", "componentName", "index", "pathSet", "expandActive", "hierarchyMapData", "batchData", "isPreAssessment", "baseContentReadData", "mlCourse", "parentMilestoneLocked"] }, { kind: "component", type: i7.AppTocSessionsNewComponent, selector: "ws-widget-app-app-toc-sessions-new", inputs: ["batchData", "content", "forPreview", "config", "batchId", "rootId", "rootContentType", "pathSet"] }, { kind: "component", type: i8.AppTocContentCardV2SkeletonComponent, selector: "ws-widget-app-toc-content-card-v2-skeleton" }] }); }
190
271
  }
191
272
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocContentComponent, decorators: [{
192
273
  type: Component,
193
- args: [{ selector: 'ws-widget-app-toc-content', template: "<div>\n <!-- Milestone / Learning Path UI -->\n <div class=\"milestone-wrapper\" role=\"group\" aria-label=\"Learning path milestones\">\n <ng-container *ngIf=\"content?.children?.length; else fallbackMilestones\">\n <ul class=\"milestone-list\">\n <li *ngFor=\"let m of content?.children; let i = index\" class=\"milestone-item\"\n [class.completed]=\"m?.completionStatus === 2\" role=\"listitem\">\n <div class=\"milestone-circle\" [attr.aria-label]=\"m?.name || ('Milestone ' + (i+1))\">\n <img *ngIf=\"m?.completionStatus === 2\" src=\"assets/icons/toc/tick-orange.svg\"\n class=\"milestone-checkmark\" alt=\"Completed\" />\n <span *ngIf=\"m?.completionStatus !== 2\" class=\"milestone-index\">{{ i + 1 }}</span>\n </div>\n <div class=\"milestone-label\">{{ m?.name }}</div>\n </li>\n </ul>\n </ng-container>\n <ng-template #fallbackMilestones>\n <ul class=\"milestone-list\">\n <li class=\"milestone-item completed\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"Pre Assessment\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">Pre Assessment</div>\n </li>\n <li class=\"milestone-item completed\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"1. Foundation of Workplace Ethics\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">1. Foundation of Workplace Ethics</div>\n </li>\n <li class=\"milestone-item\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"2. Health and Productivity at Work\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">2. Health and Productivity at Work</div>\n </li>\n <li class=\"milestone-item\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"3. Health and Productivity at Work\">\n <span class=\"milestone-index\">4</span>\n </div>\n <div class=\"milestone-label\">3. Health and Productivity at Work</div>\n </li>\n </ul>\n </ng-template>\n </div>\n</div>\n<div class=\"bggrey\">\n <div class=\"py-4 content-container\" id=\"contentContainer\" *ngIf=\"!isPreAssessment\">\n <div class=\"main-container flex flex-col gap-4\">\n <ng-container *ngIf=\"content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <div class=\"padding-left-m flex gap-4 tab-list\">\n <ng-container *ngFor=\"let type of typesOfContent\">\n <div class=\"tab-data\" (click)=\"!type.disabled && selectedTabType = type.id\"\n [ngClass]=\"{'active-tab': selectedTabType === type.id, 'disabled':type.disabled}\">\n <span>{{type.name}}</span>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"selectedTabType === 'content' && content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ng-container [ngTemplateOutlet]=\"contentBlock\"></ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"selectedTabType === 'session' && content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ws-widget-app-app-toc-sessions-new [batchData]=\"batchData\" [pathSet]=\"pathSet\" [rootId]=\"contextId\"\n [rootContentType]=\"contextPath\" [batchId]=\"batchId\" [config]=\"config\" [content]=\"content\">\n </ws-widget-app-app-toc-sessions-new>\n </ng-container>\n <ng-container *ngIf=\"content?.primaryCategory !== nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ng-container [ngTemplateOutlet]=\"contentBlock\"></ng-container>\n </ng-container>\n </div>\n </div>\n <!-- {{pathSet|json}} -->\n <ng-template #contentBlock>\n <ng-container *ngIf=\"!contentLoader\">\n <ng-container *ngIf=\"content?.children?.length; else noChildren\">\n <div class=\"content-card \"\n *ngFor=\"let card of content?.children; trackBy: contentTrackBy; let i = index;\"\n [ngClass]=\"{ 'content-active': pathSet && pathSet.has(card.identifier) && isEnrolled}\">\n <!-- {{card|json}} -->\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [expandAll]=\"expandAll\"\n [componentName]=\"componentName\" [expandActive]=\"true\" [rootId]=\"contextId\" [batchId]=\"batchId\"\n [rootContentType]=\"contextPath\" [content]=\"card\" [mlCourse]=\"content\" [index]=\"i+1\"\n [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\" [batchData]=\"batchData\"\n [baseContentReadData]=\"baseContentReadData\"></ws-widget-app-toc-content-card-v2>\n </div>\n </ng-container>\n <ng-template #noChildren>\n <div *ngIf=\"!isPlayable\"\n class=\"ws-mat-primary-default-text ws-mat-primary-lite-background px-6 py-8 font-normal text-base noChildren\">\n The preview for this type of content is unavailable. Please click on Start button above to view.\n </div>\n <!-- <ng-container *ngIf=\"isPlayable\" [wsResolverWidget]=\"contentPlayWidgetConfig\"></ng-container> -->\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"contentLoader\">\n <ws-widget-app-toc-content-card-v2-skeleton></ws-widget-app-toc-content-card-v2-skeleton>\n </ng-container>\n </ng-template>\n <div *ngIf=\"isPreAssessment\">\n <div class=\"content-card \"\n *ngFor=\"let card of content?.preEnrolmentResources; trackBy: identifier; let i = index;\"\n [ngClass]=\"{ 'content-active': pathSet && pathSet.has(card.identifier) && isEnrolled}\">\n <!-- {{card|json}} -->\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [expandAll]=\"expandAll\"\n [componentName]=\"componentName\" [expandActive]=\"true\" [rootId]=\"contextId\" [batchId]=\"batchId\"\n [rootContentType]=\"contextPath\" [isPreAssessment]=\"isPreAssessment\" [content]=\"card\"\n [mlCourse]=\"content\" [index]=\"i+1\" [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\"\n [batchData]=\"batchData\" [baseContentReadData]=\"baseContentReadData\"></ws-widget-app-toc-content-card-v2>\n </div>\n </div>\n</div>", styles: [".bggrey{background-color:#eff3f9}.content-container{min-height:800px}.content-accordion .content-panel{box-shadow:none}.content-accordion .content-header{padding:20px;background-color:#fff;border:none;box-shadow:none}.content-key-values{color:#0009}.content-key-values mat-icon{width:14px;height:14px;font-size:14px;color:#0006}.main-container{width:100%;box-sizing:border-box}.main-container .toc-section{display:flex;justify-content:space-between;padding-bottom:12px}.main-container .content-card{background:#fff;border:1px solid rgb(221,221,221);overflow:hidden;position:relative}.main-container .content-card.content-active{border:1px solid #1a4ca1}.main-container .noChildren{color:#222!important}@media only screen and (max-width: 959px){.main-container{width:100%;padding-right:0;margin-bottom:32px}}::ng-deep .mat-expansion-indicator{display:none!important}.mat-panel-indicator{width:28px;height:28px;font-size:28px}.tab-list .tab-data{border-radius:18px;border:1px solid rgba(0,0,0,.08);opacity:1;background-color:#e5e9ef;padding:6px 16px;cursor:pointer}.tab-list .tab-data span{opacity:1;color:#000000de;font-family:Lato-Regular;font-size:14px;font-weight:400;font-style:Regular;letter-spacing:.25px;text-align:left;line-height:20px}.tab-list .active-tab{border-radius:18px;border:1px solid rgb(27,76,161);opacity:1;background-color:#dee6f2}.tab-list .active-tab span{color:#1b4ca1}.tab-list .disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.milestone-wrapper{--milestone-size: 33px;--milestone-border: 3px;padding:24px 16px 32px;background:transparent}.milestone-list{display:flex;align-items:flex-start;justify-content:space-between;list-style:none;margin:0;padding:0 16px;gap:12px}.milestone-item{display:flex;flex-direction:column;align-items:center;text-align:center;flex:1 1 0;position:relative}.milestone-item:after{content:\"\";position:absolute;top:calc(var(--milestone-size) / 2);left:50%;right:-50%;height:3px;background:#e0e0e0;border-top:3px dotted #BDBDBD;background:transparent;z-index:0}.milestone-item.completed:after{background:linear-gradient(90deg,#efa34f,#f3962f);border:none}.milestone-item:last-child:after{display:none}.milestone-circle{width:var(--milestone-size);height:var(--milestone-size);min-width:var(--milestone-size);border-radius:50%;background:#fff;border:var(--milestone-border) solid #F3962F;display:flex;align-items:center;justify-content:center;z-index:1;position:relative;box-shadow:0 2px 8px #00000014;transition:all .2s ease}.milestone-item.completed .milestone-circle{background:#fff;border-color:#f3962f;box-shadow:0 4px 12px #efa34f4d}.milestone-checkmark{width:80%;height:80%;object-fit:contain}.milestone-index{font-weight:700;font-size:18px;color:#757575}.milestone-item.completed .milestone-index{color:#fff}.milestone-label{margin-top:12px;font-size:14px;line-height:1.4;color:#000000de;max-width:140px;word-wrap:break-word;white-space:normal;font-weight:500}.milestone-item:focus-within .milestone-circle,.milestone-item:hover .milestone-circle{transform:translateY(-2px) scale(1.05);box-shadow:0 6px 16px #00000026}.milestone-item.completed:hover .milestone-circle{box-shadow:0 6px 20px #efa34f66}@media (max-width: 768px){.milestone-wrapper{--milestone-size: 48px;padding:20px 12px 28px}.milestone-list{gap:8px;padding:0 8px}.milestone-label{font-size:12px;max-width:100px}.milestone-index{font-size:16px}}@media (max-width: 480px){.milestone-wrapper{--milestone-size: 40px;padding:16px 8px 24px}.milestone-list{gap:6px;padding:0 4px}.milestone-label{font-size:11px;max-width:80px;margin-top:8px}.milestone-index{font-size:14px}.milestone-item:after{height:2px;border-top-width:2px}}\n"] }]
274
+ args: [{ selector: 'ws-widget-app-toc-content', template: "<div *ngIf=\"content?.courseCategory === 'Learning Pathway' && componentName !== 'viewer'\">\n <!-- Milestone / Learning Path UI -->\n <div class=\"milestone-wrapper\" role=\"group\" aria-label=\"Learning path milestones\">\n <!-- Learning Path Header -->\n <div class=\"learning-path-header\">\n <h3 class=\"learning-path-title\">Learning Path</h3>\n <p class=\"learning-path-subtitle\">Complete {{content?.children?.length - 1 || 3}} key milestones</p>\n </div>\n <ng-container *ngIf=\"content?.children?.length; else fallbackMilestones\">\n <ul class=\"milestone-list\">\n <li *ngFor=\"let m of content?.children; let i = index\" class=\"milestone-item\"\n [class.completed]=\"m?.completionStatus === 2 || getMilestoneCompletedOrNot(m?.identifier)\" role=\"listitem\">\n <div class=\"milestone-circle\" [attr.aria-label]=\"m?.name || ('Milestone ' + (i+1))\">\n <img *ngIf=\"m?.completionStatus === 2 || getMilestoneCompletedOrNot(m?.identifier)\" src=\"assets/icons/toc/tick-orange.svg\"\n class=\"milestone-checkmark\" alt=\"Completed\" />\n <span *ngIf=\"m?.completionStatus !== 2 && !getMilestoneCompletedOrNot(m?.identifier)\" class=\"milestone-index\"></span>\n </div>\n <div class=\"milestone-label\">\n <p class=\"mb-0 leading-none\">\n <span *ngIf=\"m?.contextCategory\">{{m?.contextCategory}}</span>\n <span *ngIf=\"m?.courseCategory\">{{m?.courseCategory}} {{ i}}</span>\n </p>\n <p #milestoneNameRef class=\"milestone-name-text leading-none\"\n [matTooltip]=\"isMultiLineTruncated(milestoneNameRef) ? m?.name : ''\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"multiline-tooltip\">\n {{ m?.name }}\n </p>\n </div>\n </li>\n </ul>\n </ng-container>\n <ng-template #fallbackMilestones>\n <ul class=\"milestone-list\">\n <li class=\"milestone-item completed\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"Pre Assessment\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">Pre Assessment</div>\n </li>\n <li class=\"milestone-item completed\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"1. Foundation of Workplace Ethics\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">1. Foundation of Workplace Ethics</div>\n </li>\n <li class=\"milestone-item\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"2. Health and Productivity at Work\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">2. Health and Productivity at Work</div>\n </li>\n <li class=\"milestone-item\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"3. Health and Productivity at Work\">\n <span class=\"milestone-index\">4</span>\n </div>\n <div class=\"milestone-label\">3. Health and Productivity at Work</div>\n </li>\n </ul>\n </ng-template>\n </div>\n</div>\n<div class=\"bggrey\">\n <div class=\"py-4 content-container\" id=\"contentContainer\" *ngIf=\"!isPreAssessment\">\n <div class=\"main-container flex flex-col gap-4\">\n <ng-container *ngIf=\"content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <div class=\"padding-left-m flex gap-4 tab-list\">\n <ng-container *ngFor=\"let type of typesOfContent\">\n <div class=\"tab-data\" (click)=\"!type.disabled && selectedTabType = type.id\"\n [ngClass]=\"{'active-tab': selectedTabType === type.id, 'disabled':type.disabled}\">\n <span>{{type.name}}</span>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"selectedTabType === 'content' && content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ng-container [ngTemplateOutlet]=\"contentBlock\"></ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"selectedTabType === 'session' && content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ws-widget-app-app-toc-sessions-new [batchData]=\"batchData\" [pathSet]=\"pathSet\" [rootId]=\"contextId\"\n [rootContentType]=\"contextPath\" [batchId]=\"batchId\" [config]=\"config\" [content]=\"content\">\n </ws-widget-app-app-toc-sessions-new>\n </ng-container>\n <ng-container *ngIf=\"content?.primaryCategory !== nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ng-container [ngTemplateOutlet]=\"contentBlock\"></ng-container>\n </ng-container>\n </div>\n </div>\n <!-- {{pathSet|json}} -->\n <ng-template #contentBlock>\n <ng-container *ngIf=\"!contentLoader\">\n <ng-container *ngIf=\"content?.children?.length; else noChildren\">\n <div class=\"content-card \"\n *ngFor=\"let card of content?.children; trackBy: contentTrackBy; let i = index;\"\n [ngClass]=\"{ 'content-active': pathSet && pathSet.has(card.identifier) && isEnrolled}\">\n <!-- {{card|json}} -->\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [expandAll]=\"expandAll\"\n [componentName]=\"componentName\" [expandActive]=\"true\" [rootId]=\"contextId\" [batchId]=\"batchId\"\n [rootContentType]=\"contextPath\" [content]=\"card\" [mlCourse]=\"content\" [index]=\"i+1\"\n [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\" [batchData]=\"batchData\"\n [baseContentReadData]=\"baseContentReadData\"></ws-widget-app-toc-content-card-v2>\n </div>\n </ng-container>\n <ng-template #noChildren>\n <div *ngIf=\"!isPlayable\"\n class=\"ws-mat-primary-default-text ws-mat-primary-lite-background px-6 py-8 font-normal text-base noChildren\">\n The preview for this type of content is unavailable. Please click on Start button above to view.\n </div>\n <!-- <ng-container *ngIf=\"isPlayable\" [sbUiResolverWidget]=\"contentPlayWidgetConfig\"></ng-container> -->\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"contentLoader\">\n <ws-widget-app-toc-content-card-v2-skeleton></ws-widget-app-toc-content-card-v2-skeleton>\n </ng-container>\n </ng-template>\n <div *ngIf=\"isPreAssessment\">\n <div class=\"content-card \"\n *ngFor=\"let card of content?.preEnrolmentResources; trackBy: identifier; let i = index;\"\n [ngClass]=\"{ 'content-active': pathSet && pathSet.has(card.identifier) && isEnrolled}\">\n <!-- {{card|json}} -->\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [expandAll]=\"expandAll\"\n [componentName]=\"componentName\" [expandActive]=\"true\" [rootId]=\"contextId\" [batchId]=\"batchId\"\n [rootContentType]=\"contextPath\" [isPreAssessment]=\"isPreAssessment\" [content]=\"card\"\n [mlCourse]=\"content\" [index]=\"i+1\" [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\"\n [batchData]=\"batchData\" [baseContentReadData]=\"baseContentReadData\"></ws-widget-app-toc-content-card-v2>\n </div>\n </div>\n</div>", styles: [".bggrey{background-color:#eff3f9}.content-container{min-height:800px}.content-accordion .content-panel{box-shadow:none}.content-accordion .content-header{padding:20px;background-color:#fff;border:none;box-shadow:none}.content-key-values{color:#0009}.content-key-values mat-icon{width:14px;height:14px;font-size:14px;color:#0006}.main-container{width:100%;box-sizing:border-box}.main-container .toc-section{display:flex;justify-content:space-between;padding-bottom:12px}.main-container .content-card{background:#fff;border:1px solid rgb(221,221,221);overflow:hidden;position:relative}.main-container .content-card.content-active{border:1px solid #1a4ca1}.main-container .noChildren{color:#222!important}@media only screen and (max-width: 959px){.main-container{width:100%;padding-right:0;margin-bottom:32px}}::ng-deep .mat-expansion-indicator{display:none!important}.mat-panel-indicator{width:28px;height:28px;font-size:28px}.tab-list .tab-data{border-radius:18px;border:1px solid rgba(0,0,0,.08);opacity:1;background-color:#e5e9ef;padding:6px 16px;cursor:pointer}.tab-list .tab-data span{opacity:1;color:#000000de;font-family:Lato-Regular;font-size:14px;font-weight:400;font-style:Regular;letter-spacing:.25px;text-align:left;line-height:20px}.tab-list .active-tab{border-radius:18px;border:1px solid rgb(27,76,161);opacity:1;background-color:#dee6f2}.tab-list .active-tab span{color:#1b4ca1}.tab-list .disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.milestone-wrapper{--milestone-size: 33px;--milestone-border: 3px;padding:16px;background:#fff;display:flex;align-items:center;margin-top:16px}.learning-path-header{padding-right:16px}.learning-path-title{font-size:18px;font-weight:700;color:#000000de;margin:0 0 4px;font-family:Lato-Bold,Lato,sans-serif}.learning-path-subtitle{font-size:14px;font-weight:400;color:#0009;margin:0;font-family:Lato-Regular,Lato,sans-serif}.milestone-list{display:flex;align-items:flex-start;justify-content:space-between;list-style:none;margin:0;gap:12px;flex:1}.milestone-item{display:flex;flex-direction:column;align-items:center;text-align:center;flex:1 1 0;position:relative}.milestone-item:after{content:\"\";position:absolute;top:calc(var(--milestone-size) / 2);left:50%;right:-50%;height:3px;background:#e0e0e0;border-top:3px dotted #BDBDBD;background:transparent;z-index:0}.milestone-item.completed:after{background:linear-gradient(90deg,#efa34f,#f3962f);border:none}.milestone-item:last-child:after{display:none}.milestone-circle{width:var(--milestone-size);height:var(--milestone-size);min-width:var(--milestone-size);border-radius:50%;background:#fff;border:var(--milestone-border) solid #F3962F;display:flex;align-items:center;justify-content:center;z-index:1;position:relative;box-shadow:0 2px 8px #00000014;transition:all .2s ease}.milestone-item.completed .milestone-circle{background:#fff;border-color:#f3962f;box-shadow:0 4px 12px #efa34f4d}.milestone-checkmark{width:80%;height:80%;object-fit:contain}.milestone-index{font-weight:700;font-size:18px;color:#757575}.milestone-item.completed .milestone-index{color:#fff}.milestone-label{margin-top:12px;font-size:14px;line-height:1.4;color:#000000de;word-wrap:break-word;white-space:normal;font-weight:500}.milestone-item:focus-within .milestone-circle,.milestone-item:hover .milestone-circle{transform:translateY(-2px) scale(1.05);box-shadow:0 6px 16px #00000026}.milestone-item.completed:hover .milestone-circle{box-shadow:0 6px 20px #efa34f66}@media (max-width: 768px){.milestone-wrapper{--milestone-size: 48px;padding:20px 12px 28px}.milestone-list{gap:8px;padding:0 8px}.milestone-label{font-size:12px;max-width:100px}.milestone-index{font-size:16px}}@media (max-width: 480px){.milestone-wrapper{--milestone-size: 40px;padding:16px 8px 24px}.milestone-list{gap:6px;padding:0 4px}.milestone-label{font-size:11px;max-width:80px;margin-top:8px}.milestone-index{font-size:14px}.milestone-item:after{height:2px;border-top-width:2px}}.milestone-name-text{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;line-height:1.4;word-break:break-word}::ng-deep .multiline-tooltip{white-space:pre-wrap!important;max-width:400px!important;word-break:break-word!important;line-height:1.4!important}\n"] }]
194
275
  }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.AppTocService }, { type: i3.ConfigurationsService }]; }, propDecorators: { batchId: [{
195
276
  type: Input
196
277
  }], content: [{
@@ -220,4 +301,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
220
301
  }], contentReadData: [{
221
302
  type: Input
222
303
  }] } });
223
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9fY29sbGVjdGlvbi9fY29tbW9uL2NvbnRlbnQtdG9jL2FwcC10b2MtY29udGVudC9hcHAtdG9jLWNvbnRlbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy1jb250ZW50L2FwcC10b2MtY29udGVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUE7QUFHN0YsT0FBTyxFQUF5QixTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTs7Ozs7Ozs7O0FBR3ZFLHFEQUFxRDtBQVFyRCxNQUFNLE9BQU8sc0JBQXNCO0lBaUNqQyxZQUNVLEtBQXFCLEVBQ3JCLE1BQXFCLEVBQ3JCLFNBQWdDO1FBRmhDLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsY0FBUyxHQUFULFNBQVMsQ0FBdUI7UUFqQ2pDLGVBQVUsR0FBRyxLQUFLLENBQUE7UUFDbEIsZUFBVSxHQUEyQyxJQUFJLENBQUE7UUFDekQsY0FBUyxHQUFrRCxJQUFJLENBQUE7UUFDL0QsbUJBQWMsR0FBRyxLQUFLLENBQUE7UUFHdEIscUJBQWdCLEdBQVEsRUFBRSxDQUFBO1FBRzFCLG9CQUFlLEdBQUcsS0FBSyxDQUFBO1FBR2hDLGVBQVUsR0FBRyxLQUFLLENBQUE7UUFDbEIsNEJBQXVCLEdBQTRELElBQUksQ0FBQTtRQUN2RixxQkFBZ0IsR0FBRyxFQUFFLENBQUE7UUFDckIsb0RBQW9EO1FB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ZXMsIE9uRGVzdHJveSwgT25Jbml0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBEYXRhIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgTnNXaWRnZXRSZXNvbHZlciB9IGZyb20gJ0BzdW5iaXJkLWNiL3Jlc29sdmVyLXYyJ1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbnNTZXJ2aWNlLCBOc0NvbnRlbnQgfSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12MidcbmltcG9ydCB7IEFwcFRvY1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9hcHAtdG9jLnNlcnZpY2UnXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJ1xuLy8gaW1wb3J0IHsgTnNBcHBUb2MgfSBmcm9tICcuLi9tb2RlbHMvYXBwLXRvYy5tb2RlbCdcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd3Mtd2lkZ2V0LWFwcC10b2MtY29udGVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHAtdG9jLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hcHAtdG9jLWNvbnRlbnQuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5cbmV4cG9ydCBjbGFzcyBBcHBUb2NDb250ZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGJhdGNoSWQhOiBzdHJpbmdcbiAgQElucHV0KCkgY29udGVudCE6IE5zQ29udGVudC5JQ29udGVudFxuICBASW5wdXQoKSBmb3JQcmV2aWV3ID0gZmFsc2VcbiAgQElucHV0KCkgcmVzdW1lRGF0YTogTnNDb250ZW50LklDb250aW51ZUxlYXJuaW5nRGF0YSB8IG51bGwgPSBudWxsXG4gIEBJbnB1dCgpIGJhdGNoRGF0YTogLyoqTnNDb250ZW50LklCYXRjaExpc3RSZXNwb25zZSAqLyBhbnkgfCBudWxsID0gbnVsbFxuICBASW5wdXQoKSBza2VsZXRvbkxvYWRlciA9IGZhbHNlXG4gIEBJbnB1dCgpIHRvY1N0cnVjdHVyZTogYW55XG4gIEBJbnB1dCgpIGNvbmZpZzogYW55XG4gIEBJbnB1dCgpIGhpZXJhcmNoeU1hcERhdGE6IGFueSA9IHt9XG4gIEBJbnB1dCgpIHBhdGhTZXQ6IGFueVxuICBASW5wdXQoKSBjb21wb25lbnROYW1lITogc3RyaW5nXG4gIEBJbnB1dCgpIGlzUHJlQXNzZXNzbWVudCA9IGZhbHNlXG4gIEBJbnB1dCgpIGJhc2VDb250ZW50UmVhZERhdGEhOiBhbnlcbiAgQElucHV0KCkgY29udGVudFJlYWREYXRhITogYW55XG4gIGlzUGxheWFibGUgPSBmYWxzZVxuICBjb250ZW50UGxheVdpZGdldENvbmZpZzogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aFR5cGVkRGF0YTxhbnk+IHwgbnVsbCA9IG51bGxcbiAgZGVmYXVsdFRodW1ibmFpbCA9ICcnXG4gIC8vIGVycm9yQ29kZTogTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlIHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSByb3V0ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSByb3V0ZVF1ZXJ5U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBjb250ZW50UGFyZW50czogTnNDb250ZW50LklDb250ZW50TWluaW1hbFtdID0gW11cbiAgZXhwYW5kQWxsID0gZmFsc2VcbiAgZXhwYW5kUGFydE9mID0gZmFsc2VcbiAgY29udGV4dElkITogc3RyaW5nXG4gIGNvbnRleHRQYXRoITogc3RyaW5nXG4gIGNvbnRlbnRMb2FkZXIgPSBmYWxzZVxuXG4gIHR5cGVzT2ZDb250ZW50OiBhbnlcbiAgc2VsZWN0ZWRUYWJUeXBlOiBhbnkgPSAnY29udGVudCdcbiAgbnNDb250ZW50OiBhbnkgPSAgTnNDb250ZW50XG4gIG90aGVyUmVzb3Vyc2UgPSAwXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSB0b2NTdmM6IEFwcFRvY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTdmM6IENvbmZpZ3VyYXRpb25zU2VydmljZVxuICApIHtcbiAgICB0aGlzLnRvY1N2Yy5yZXN1bWVEYXRhLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucmVzdW1lRGF0YSA9IHJlc1xuICAgICAgLy8gdGhpcy5nZXRMYXN0UGxheWVkUmVzb3VyY2UoKVxuICAgIH0pXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyB0aGlzLmZvclByZXZpZXcgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL2F1dGhvci8nKVxuICAgIHRoaXMucm91dGVRdWVyeVN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGUucXVlcnlQYXJhbU1hcC5zdWJzY3JpYmUocVBhcmFtc01hcCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZygncVBhcmFtc01hcC0tJywgcVBhcmFtc01hcClcbiAgICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzLmNvbnRlbnQtLScsIHRoaXMuY29udGVudClcbiAgICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzLmhpZXJhcmNoeU1hcERhdGEnLCB0aGlzLmhpZXJhcmNoeU1hcERhdGEpXG4gICAgICBpZih0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50Py5wcmVFbnJvbG1lbnRSZXNvdXJjZXMgJiYgdHlwZW9mIHRoaXMuY29udGVudD8ucHJlRW5yb2xtZW50UmVzb3VyY2VzID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmNvbnRlbnRbJ3ByZUVucm9sbWVudFJlc291cmNlcyddID0gIEpTT04ucGFyc2UodGhpcy5jb250ZW50Py5wcmVFbnJvbG1lbnRSZXNvdXJjZXMpXG4gICAgICB9XG4gICAgICBjb25zdCBjb250ZXh0SWQgPSBxUGFyYW1zTWFwLmdldCgnY29udGV4dElkJylcbiAgICAgIGNvbnN0IGNvbnRleHRQYXRoID0gcVBhcmFtc01hcC5nZXQoJ2NvbnRleHRQYXRoJylcbiAgICAgIGNvbnN0IGJhdGNoSWQgPSBxUGFyYW1zTWFwLmdldCgnYmF0Y2hJZCcpXG4gICAgICBjb25zdCBwcmltYXJ5Q2F0ZWdvcnkgPSBxUGFyYW1zTWFwLmdldCgncHJpbWFyeUNhdGVnb3J5JylcbiAgICAgIGNvbnN0IHByZUFzc2Vzc21lbnQgPSBxUGFyYW1zTWFwLmdldCgncHJlQXNzZXNzbWVudCcpXG4gICAgICBpZihwcmVBc3Nlc3NtZW50ID09PSAndHJ1ZScpIHtcbiAgICAgICAgdGhpcy5pc1ByZUFzc2Vzc21lbnQgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoY29udGV4dElkICYmIGNvbnRleHRQYXRoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dElkID0gY29udGV4dElkXG4gICAgICAgIHRoaXMuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aFxuICAgICAgfVxuICAgICAgaWYgKGJhdGNoSWQpIHtcbiAgICAgICAgdGhpcy5iYXRjaElkID0gYmF0Y2hJZFxuICAgICAgfVxuICAgICAgaWYocHJpbWFyeUNhdGVnb3J5ICkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGFiVHlwZSA9IHByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5uc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5PRkZMSU5FX1NFU1NJT04gPyAnc2Vzc2lvbicgOiAnY29udGVudCdcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmICh0aGlzLnJvdXRlICYmIHRoaXMucm91dGUucGFyZW50KSB7XG4gICAgICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZS5wYXJlbnQuZGF0YS5zdWJzY3JpYmUoKGRhdGE6IERhdGEpID0+IHtcbiAgICAgICAgdGhpcy5pbml0RGF0YShkYXRhKVxuICAgICAgfSlcbiAgICB9XG4gICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlciQuc3Vic2NyaWJlKCh2YWw6IGFueSkgPT4ge1xuICAgICAgdGhpcy5jb250ZW50TG9hZGVyID0gdmFsXG4gICAgfSlcbiAgICBjb25zdCBpbnN0YW5jZUNvbmZpZyA9IHRoaXMuY29uZmlnU3ZjLmluc3RhbmNlQ29uZmlnXG4gICAgaWYgKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgICB0aGlzLmRlZmF1bHRUaHVtYm5haWwgPSBpbnN0YW5jZUNvbmZpZy5sb2dvcy5kZWZhdWx0Q29udGVudCB8fCAnJ1xuICAgIH1cbiAgICB0aGlzLnR5cGVzT2ZDb250ZW50ID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnU2VsZi1wYWNlZCcsXG4gICAgICAgIGlkOiAnY29udGVudCcsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdJbnN0cnVjdG9yLWxlZCcsXG4gICAgICAgIGlkOiAnc2Vzc2lvbicsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXVxuICAgIHRoaXMub3RoZXJSZXNvdXJzZSA9IDBcbiAgICBpZiAodGhpcy50b2NTdHJ1Y3R1cmUpIHtcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMudG9jU3RydWN0dXJlKS5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZWxlID09PSAnb2ZmbGluZVNlc3Npb24nIHx8IGVsZSA9PT0gJ2xlYXJuaW5nTW9kdWxlJykge1xuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgdGhpcy5vdGhlclJlc291cnNlID0gdGhpcy5vdGhlclJlc291cnNlICsgdGhpcy50b2NTdHJ1Y3R1cmVbZWxlXVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKCF0aGlzLm90aGVyUmVzb3Vyc2UpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYlR5cGUgPSAnc2Vzc2lvbidcbiAgICAgICAgICB0aGlzLnR5cGVzT2ZDb250ZW50WzBdLmRpc2FibGVkID0gdHJ1ZVxuICAgICAgICB9LCAgICAgICAgIDEwMDApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnR5cGVzT2ZDb250ZW50WzFdLmRpc2FibGVkID0gIHRoaXMudG9jU3RydWN0dXJlWydvZmZsaW5lU2Vzc2lvbiddID8gZmFsc2UgOiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0RGF0YShfZGF0YTogRGF0YSkge1xuICAgIC8vIG5vdCByZXF1aXJlZCBpbml0IG5vdyBiZWNhdXNlIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiAgaGFzaG1hcCBhbHJlYWR5IGhhcyBtYXBwZWQgdGhlIGNvbXBsZXRpb24gcGVyY2VudFxuICAgIC8vIGNvbnN0IGluaXREYXRhID0gdGhpcy50b2NTdmMuaW5pdERhdGEoZGF0YSwgdHJ1ZSlcbiAgICAvLyB0aGlzLmNvbnRlbnQgPSBpbml0RGF0YS5jb250ZW50XG4gICAgLy8gdGhpcy5lcnJvckNvZGUgPSBpbml0RGF0YS5lcnJvckNvZGVcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICBpZiAoIXRoaXMuY29udGV4dElkIHx8ICF0aGlzLmNvbnRleHRQYXRoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dElkID0gdGhpcy5jb250ZW50LmlkZW50aWZpZXJcbiAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBjaGFuZ2VzKSB7XG4gICAgICBpZiAocHJvcGVydHkgPT09ICdyZXN1bWVEYXRhJykge1xuICAgICAgICAvLyB0aGlzLmdldExhc3RQbGF5ZWRSZXNvdXJjZSgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzRW5yb2xsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYmF0Y2hJZCA/IHRydWUgOiBmYWxzZVxuICB9XG5cbiAgLy8gcHJpdmF0ZSBwcm9jZXNzQ29sbGVjdGlvbkZvclRyZWUoKSB7XG4gIC8vICAgICB0aGlzLnBhdGhTZXQgPSBuZXcgU2V0KClcbiAgLy8gfVxuXG4gIC8vIGdldExhc3RQbGF5ZWRSZXNvdXJjZSgpIHtcbiAgLy8gICBsZXQgZmlyc3RQbGF5YWJsZUNvbnRlbnRcbiAgLy8gICBsZXQgcmVzdW1lRGF0YVYyOiBhbnlcbiAgLy8gICBpZiAodGhpcy5yZXN1bWVEYXRhICYmIHRoaXMucmVzdW1lRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuY29udGVudCkge1xuICAvLyAgICAgaWYgKHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSB7XG4gIC8vICAgICAgIHJlc3VtZURhdGFWMiA9IHRoaXMuZ2V0UmVzdW1lRGF0YUZyb21MaXN0KCdzdGFydCcpXG4gIC8vICAgICB9IGVsc2Uge1xuICAvLyAgICAgICByZXN1bWVEYXRhVjIgPSB0aGlzLmdldFJlc3VtZURhdGFGcm9tTGlzdCgpXG4gIC8vICAgICB9XG4gIC8vICAgICB0aGlzLmV4cGFuZFRoZVBhdGgocmVzdW1lRGF0YVYyLmlkZW50aWZpZXIpXG4gIC8vICAgfSBlbHNlIHtcbiAgLy8gICAgIGZpcnN0UGxheWFibGVDb250ZW50ID0gdGhpcy5jb250ZW50U3ZjLmdldEZpcnN0Q2hpbGRJbkhpZXJhcmNoeSh0aGlzLmNvbnRlbnQpXG4gIC8vICAgICB0aGlzLmV4cGFuZFRoZVBhdGgoZmlyc3RQbGF5YWJsZUNvbnRlbnQuaWRlbnRpZmllcilcbiAgLy8gICB9XG4gIC8vIH1cblxuICAvLyBleHBhbmRUaGVQYXRoKHJlc291cmNlSWQ6IHN0cmluZykge1xuICAvLyAgIGlmICh0aGlzLmNvbnRlbnQgJiYgcmVzb3VyY2VJZCkge1xuICAvLyAgICAgY29uc3QgcGF0aCA9IHRoaXMudXRpbGl0eVN2Yy5nZXRQYXRoKHRoaXMuY29udGVudCwgcmVzb3VyY2VJZClcbiAgLy8gICAgIC8vIGNvbnNvbGUubG9nKCdQYXRoIDo6IDo6IDogJywgcGF0aClcbiAgLy8gICAgIHRoaXMucGF0aFNldCA9IG5ldyBTZXQocGF0aC5tYXAoKHU6IHsgaWRlbnRpZmllcjogYW55IH0pID0+IHUuaWRlbnRpZmllcikpXG4gIC8vICAgICAvLyBjb25zb2xlLmxvZygncGF0aFNldCA6OjogJywgdGhpcy5wYXRoU2V0KVxuICAvLyAgICAgLy8gcGF0aC5mb3JFYWNoKChub2RlOiBJVmlld2VyVG9jQ2FyZCkgPT4ge1xuICAvLyAgICAgLy8gICB0aGlzLm5lc3RlZFRyZWVDb250cm9sLmV4cGFuZChub2RlKVxuICAvLyAgICAgLy8gfSlcbiAgLy8gICB9XG4gIC8vIH1cblxuICAvLyBwcml2YXRlIGdldFJlc3VtZURhdGFGcm9tTGlzdCh0eXBlPzogc3RyaW5nKSB7XG4gIC8vICAgaWYgKCF0eXBlKSB7XG4gIC8vICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gIC8vICAgICBjb25zdCBsYXN0SXRlbSA9IHRoaXMucmVzdW1lRGF0YSAmJiB0aGlzLnJlc3VtZURhdGEuc29ydCgoYTogYW55LCBiOiBhbnkpID0+XG4gIC8vIG5ldyBEYXRlKGIubGFzdEFjY2Vzc1RpbWUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEubGFzdEFjY2Vzc1RpbWUpLmdldFRpbWUoKSkuc2hpZnQoKVxuICAvLyAgICAgcmV0dXJuIHtcbiAgLy8gICAgICAgaWRlbnRpZmllcjogbGFzdEl0ZW0uY29udGVudElkLFxuICAvLyAgICAgICBtaW1lVHlwZTogbGFzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzICYmIGxhc3RJdGVtLnByb2dyZXNzZGV0YWlscy5taW1lVHlwZSxcbiAgLy8gICAgIH1cbiAgLy8gICB9XG5cbiAgLy8gICBjb25zdCBmaXJzdEl0ZW0gPSB0aGlzLnJlc3VtZURhdGEgJiYgdGhpcy5yZXN1bWVEYXRhLmxlbmd0aCAmJiB0aGlzLnJlc3VtZURhdGFbMF1cbiAgLy8gICByZXR1cm4ge1xuICAvLyAgICAgaWRlbnRpZmllcjogZmlyc3RJdGVtLmNvbnRlbnRJZCxcbiAgLy8gICAgIG1pbWVUeXBlOiBmaXJzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzICYmIGZpcnN0SXRlbS5wcm9ncmVzc2RldGFpbHMubWltZVR5cGUsXG4gIC8vICAgfVxuICAvLyB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMucm91dGVTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucm91dGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZiAodGhpcy5yb3V0ZVF1ZXJ5U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJvdXRlUXVlcnlTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdj5cbiAgICA8IS0tIE1pbGVzdG9uZSAvIExlYXJuaW5nIFBhdGggVUkgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1pbGVzdG9uZS13cmFwcGVyXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIkxlYXJuaW5nIHBhdGggbWlsZXN0b25lc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY2hpbGRyZW4/Lmxlbmd0aDsgZWxzZSBmYWxsYmFja01pbGVzdG9uZXNcIj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cIm1pbGVzdG9uZS1saXN0XCI+XG4gICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBtIG9mIGNvbnRlbnQ/LmNoaWxkcmVuOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJtaWxlc3RvbmUtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jb21wbGV0ZWRdPVwibT8uY29tcGxldGlvblN0YXR1cyA9PT0gMlwiIHJvbGU9XCJsaXN0aXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWNpcmNsZVwiIFthdHRyLmFyaWEtbGFiZWxdPVwibT8ubmFtZSB8fCAoJ01pbGVzdG9uZSAnICsgKGkrMSkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwibT8uY29tcGxldGlvblN0YXR1cyA9PT0gMlwiIHNyYz1cImFzc2V0cy9pY29ucy90b2MvdGljay1vcmFuZ2Uuc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1pbGVzdG9uZS1jaGVja21hcmtcIiBhbHQ9XCJDb21wbGV0ZWRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtPy5jb21wbGV0aW9uU3RhdHVzICE9PSAyXCIgY2xhc3M9XCJtaWxlc3RvbmUtaW5kZXhcIj57eyBpICsgMSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaWxlc3RvbmUtbGFiZWxcIj57eyBtPy5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2ZhbGxiYWNrTWlsZXN0b25lcz5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cIm1pbGVzdG9uZS1saXN0XCI+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWlsZXN0b25lLWl0ZW0gY29tcGxldGVkXCIgcm9sZT1cImxpc3RpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaWxlc3RvbmUtY2lyY2xlXCIgYXJpYS1sYWJlbD1cIlByZSBBc3Nlc3NtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImFzc2V0cy9pY29ucy90b2MvdGljay1vcmFuZ2Uuc3ZnXCIgY2xhc3M9XCJtaWxlc3RvbmUtY2hlY2ttYXJrXCIgYWx0PVwiQ29tcGxldGVkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaWxlc3RvbmUtbGFiZWxcIj5QcmUgQXNzZXNzbWVudDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWlsZXN0b25lLWl0ZW0gY29tcGxldGVkXCIgcm9sZT1cImxpc3RpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaWxlc3RvbmUtY2lyY2xlXCIgYXJpYS1sYWJlbD1cIjEuIEZvdW5kYXRpb24gb2YgV29ya3BsYWNlIEV0aGljc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaWNvbnMvdG9jL3RpY2stb3JhbmdlLnN2Z1wiIGNsYXNzPVwibWlsZXN0b25lLWNoZWNrbWFya1wiIGFsdD1cIkNvbXBsZXRlZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWxhYmVsXCI+MS4gRm91bmRhdGlvbiBvZiBXb3JrcGxhY2UgRXRoaWNzPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJtaWxlc3RvbmUtaXRlbVwiIHJvbGU9XCJsaXN0aXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWNpcmNsZVwiIGFyaWEtbGFiZWw9XCIyLiBIZWFsdGggYW5kIFByb2R1Y3Rpdml0eSBhdCBXb3JrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImFzc2V0cy9pY29ucy90b2MvdGljay1vcmFuZ2Uuc3ZnXCIgY2xhc3M9XCJtaWxlc3RvbmUtY2hlY2ttYXJrXCIgYWx0PVwiQ29tcGxldGVkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaWxlc3RvbmUtbGFiZWxcIj4yLiBIZWFsdGggYW5kIFByb2R1Y3Rpdml0eSBhdCBXb3JrPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJtaWxlc3RvbmUtaXRlbVwiIHJvbGU9XCJsaXN0aXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWNpcmNsZVwiIGFyaWEtbGFiZWw9XCIzLiBIZWFsdGggYW5kIFByb2R1Y3Rpdml0eSBhdCBXb3JrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1pbGVzdG9uZS1pbmRleFwiPjQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWxhYmVsXCI+My4gSGVhbHRoIGFuZCBQcm9kdWN0aXZpdHkgYXQgV29yazwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiYmdncmV5XCI+XG4gICAgPGRpdiBjbGFzcz1cInB5LTQgY29udGVudC1jb250YWluZXJcIiBpZD1cImNvbnRlbnRDb250YWluZXJcIiAqbmdJZj1cIiFpc1ByZUFzc2Vzc21lbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1haW4tY29udGFpbmVyIGZsZXggZmxleC1jb2wgZ2FwLTRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IG5zQ29udGVudD8uRVByaW1hcnlDYXRlZ29yeT8uQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhZGRpbmctbGVmdC1tIGZsZXggZ2FwLTQgdGFiLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdHlwZSBvZiB0eXBlc09mQ29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1kYXRhXCIgKGNsaWNrKT1cIiF0eXBlLmRpc2FibGVkICYmIHNlbGVjdGVkVGFiVHlwZSA9IHR5cGUuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlLXRhYic6IHNlbGVjdGVkVGFiVHlwZSA9PT0gdHlwZS5pZCwgJ2Rpc2FibGVkJzp0eXBlLmRpc2FibGVkfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7dHlwZS5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkVGFiVHlwZSA9PT0gJ2NvbnRlbnQnICYmIGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gbnNDb250ZW50Py5FUHJpbWFyeUNhdGVnb3J5Py5CTEVOREVEX1BST0dSQU1cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnRCbG9ja1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFRhYlR5cGUgPT09ICdzZXNzaW9uJyAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IG5zQ29udGVudD8uRVByaW1hcnlDYXRlZ29yeT8uQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1hcHAtYXBwLXRvYy1zZXNzaW9ucy1uZXcgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIiBbcGF0aFNldF09XCJwYXRoU2V0XCIgW3Jvb3RJZF09XCJjb250ZXh0SWRcIlxuICAgICAgICAgICAgICAgICAgICBbcm9vdENvbnRlbnRUeXBlXT1cImNvbnRleHRQYXRoXCIgW2JhdGNoSWRdPVwiYmF0Y2hJZFwiIFtjb25maWddPVwiY29uZmlnXCIgW2NvbnRlbnRdPVwiY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWFwcC1hcHAtdG9jLXNlc3Npb25zLW5ldz5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSAhPT0gbnNDb250ZW50Py5FUHJpbWFyeUNhdGVnb3J5Py5CTEVOREVEX1BST0dSQU1cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnRCbG9ja1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0ge3twYXRoU2V0fGpzb259fSAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2NvbnRlbnRCbG9jaz5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb250ZW50TG9hZGVyXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY2hpbGRyZW4/Lmxlbmd0aDsgZWxzZSBub0NoaWxkcmVuXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtY2FyZCBcIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2FyZCBvZiBjb250ZW50Py5jaGlsZHJlbjsgdHJhY2tCeTogY29udGVudFRyYWNrQnk7IGxldCBpID0gaW5kZXg7XCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnY29udGVudC1hY3RpdmUnOiBwYXRoU2V0ICYmIHBhdGhTZXQuaGFzKGNhcmQuaWRlbnRpZmllcikgICYmIGlzRW5yb2xsZWR9XCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0ge3tjYXJkfGpzb259fSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1hcHAtdG9jLWNvbnRlbnQtY2FyZC12MiBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCIgW2V4cGFuZEFsbF09XCJleHBhbmRBbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudE5hbWVdPVwiY29tcG9uZW50TmFtZVwiIFtleHBhbmRBY3RpdmVdPVwidHJ1ZVwiIFtyb290SWRdPVwiY29udGV4dElkXCIgW2JhdGNoSWRdPVwiYmF0Y2hJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm9vdENvbnRlbnRUeXBlXT1cImNvbnRleHRQYXRoXCIgW2NvbnRlbnRdPVwiY2FyZFwiIFttbENvdXJzZV09XCJjb250ZW50XCIgW2luZGV4XT1cImkrMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGF0aFNldF09XCJwYXRoU2V0XCIgW2hpZXJhcmNoeU1hcERhdGFdPVwiaGllcmFyY2h5TWFwRGF0YVwiIFtiYXRjaERhdGFdPVwiYmF0Y2hEYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtiYXNlQ29udGVudFJlYWREYXRhXT1cImJhc2VDb250ZW50UmVhZERhdGFcIj48L3dzLXdpZGdldC1hcHAtdG9jLWNvbnRlbnQtY2FyZC12Mj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0NoaWxkcmVuPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNQbGF5YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwid3MtbWF0LXByaW1hcnktZGVmYXVsdC10ZXh0IHdzLW1hdC1wcmltYXJ5LWxpdGUtYmFja2dyb3VuZCBweC02IHB5LTggZm9udC1ub3JtYWwgdGV4dC1iYXNlIG5vQ2hpbGRyZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgVGhlIHByZXZpZXcgZm9yIHRoaXMgdHlwZSBvZiBjb250ZW50IGlzIHVuYXZhaWxhYmxlLiBQbGVhc2UgY2xpY2sgb24gU3RhcnQgYnV0dG9uIGFib3ZlIHRvIHZpZXcuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNQbGF5YWJsZVwiIFt3c1Jlc29sdmVyV2lkZ2V0XT1cImNvbnRlbnRQbGF5V2lkZ2V0Q29uZmlnXCI+PC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRMb2FkZXJcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtYXBwLXRvYy1jb250ZW50LWNhcmQtdjItc2tlbGV0b24+PC93cy13aWRnZXQtYXBwLXRvYy1jb250ZW50LWNhcmQtdjItc2tlbGV0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPGRpdiAqbmdJZj1cImlzUHJlQXNzZXNzbWVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1jYXJkIFwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2FyZCBvZiBjb250ZW50Py5wcmVFbnJvbG1lbnRSZXNvdXJjZXM7IHRyYWNrQnk6IGlkZW50aWZpZXI7IGxldCBpID0gaW5kZXg7XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2NvbnRlbnQtYWN0aXZlJzogcGF0aFNldCAmJiBwYXRoU2V0LmhhcyhjYXJkLmlkZW50aWZpZXIpICAmJiBpc0Vucm9sbGVkfVwiPlxuICAgICAgICAgICAgPCEtLSB7e2NhcmR8anNvbn19IC0tPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1hcHAtdG9jLWNvbnRlbnQtY2FyZC12MiBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCIgW2V4cGFuZEFsbF09XCJleHBhbmRBbGxcIlxuICAgICAgICAgICAgICAgIFtjb21wb25lbnROYW1lXT1cImNvbXBvbmVudE5hbWVcIiBbZXhwYW5kQWN0aXZlXT1cInRydWVcIiBbcm9vdElkXT1cImNvbnRleHRJZFwiIFtiYXRjaElkXT1cImJhdGNoSWRcIlxuICAgICAgICAgICAgICAgIFtyb290Q29udGVudFR5cGVdPVwiY29udGV4dFBhdGhcIiBbaXNQcmVBc3Nlc3NtZW50XT1cImlzUHJlQXNzZXNzbWVudFwiIFtjb250ZW50XT1cImNhcmRcIlxuICAgICAgICAgICAgICAgIFttbENvdXJzZV09XCJjb250ZW50XCIgW2luZGV4XT1cImkrMVwiIFtwYXRoU2V0XT1cInBhdGhTZXRcIiBbaGllcmFyY2h5TWFwRGF0YV09XCJoaWVyYXJjaHlNYXBEYXRhXCJcbiAgICAgICAgICAgICAgICBbYmF0Y2hEYXRhXT1cImJhdGNoRGF0YVwiIFtiYXNlQ29udGVudFJlYWREYXRhXT1cImJhc2VDb250ZW50UmVhZERhdGFcIj48L3dzLXdpZGdldC1hcHAtdG9jLWNvbnRlbnQtY2FyZC12Mj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
304
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9fY29sbGVjdGlvbi9fY29tbW9uL2NvbnRlbnQtdG9jL2FwcC10b2MtY29udGVudC9hcHAtdG9jLWNvbnRlbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy1jb250ZW50L2FwcC10b2MtY29udGVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUE7QUFHN0YsT0FBTyxFQUF5QixTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTs7Ozs7Ozs7OztBQUd2RSxxREFBcUQ7QUFRckQsTUFBTSxPQUFPLHNCQUFzQjtJQWtDakMsWUFDVSxLQUFxQixFQUNyQixNQUFxQixFQUNyQixTQUFnQztRQUZoQyxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLGNBQVMsR0FBVCxTQUFTLENBQXVCO1FBbENqQyxlQUFVLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLGVBQVUsR0FBMkMsSUFBSSxDQUFBO1FBQ3pELGNBQVMsR0FBa0QsSUFBSSxDQUFBO1FBQy9ELG1CQUFjLEdBQUcsS0FBSyxDQUFBO1FBR3RCLHFCQUFnQixHQUFRLEVBQUUsQ0FBQTtRQUcxQixvQkFBZSxHQUFHLEtBQUssQ0FBQTtRQUdoQyxlQUFVLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLDRCQUF1QixHQUE0RCxJQUFJLENBQUE7UUFDdkYscUJBQWdCLEdBQUcsRUFBRSxDQUFBO1FBQ3JCLG9EQUFvRDtR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LENBQUE7SUFDcEQsQ0FBQzsrR0FsU1Usc0JBQXNCO21HQUF0QixzQkFBc0Isc2ZDZG5DLGs5UUFrSU07OzRGRHBITyxzQkFBc0I7a0JBTmxDLFNBQVM7K0JBQ0UsMkJBQTJCO3FLQU01QixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBEYXRhIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgTnNXaWRnZXRSZXNvbHZlciB9IGZyb20gJ0BzdW5iaXJkLWNiL3Jlc29sdmVyLXYyJ1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbnNTZXJ2aWNlLCBOc0NvbnRlbnQgfSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12MidcbmltcG9ydCB7IEFwcFRvY1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9hcHAtdG9jLnNlcnZpY2UnXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJ1xuLy8gaW1wb3J0IHsgTnNBcHBUb2MgfSBmcm9tICcuLi9tb2RlbHMvYXBwLXRvYy5tb2RlbCdcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd3Mtd2lkZ2V0LWFwcC10b2MtY29udGVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHAtdG9jLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hcHAtdG9jLWNvbnRlbnQuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5cbmV4cG9ydCBjbGFzcyBBcHBUb2NDb250ZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGJhdGNoSWQhOiBzdHJpbmdcbiAgQElucHV0KCkgY29udGVudCE6IE5zQ29udGVudC5JQ29udGVudFxuICBASW5wdXQoKSBmb3JQcmV2aWV3ID0gZmFsc2VcbiAgQElucHV0KCkgcmVzdW1lRGF0YTogTnNDb250ZW50LklDb250aW51ZUxlYXJuaW5nRGF0YSB8IG51bGwgPSBudWxsXG4gIEBJbnB1dCgpIGJhdGNoRGF0YTogLyoqTnNDb250ZW50LklCYXRjaExpc3RSZXNwb25zZSAqLyBhbnkgfCBudWxsID0gbnVsbFxuICBASW5wdXQoKSBza2VsZXRvbkxvYWRlciA9IGZhbHNlXG4gIEBJbnB1dCgpIHRvY1N0cnVjdHVyZTogYW55XG4gIEBJbnB1dCgpIGNvbmZpZzogYW55XG4gIEBJbnB1dCgpIGhpZXJhcmNoeU1hcERhdGE6IGFueSA9IHt9XG4gIEBJbnB1dCgpIHBhdGhTZXQ6IGFueVxuICBASW5wdXQoKSBjb21wb25lbnROYW1lITogc3RyaW5nXG4gIEBJbnB1dCgpIGlzUHJlQXNzZXNzbWVudCA9IGZhbHNlXG4gIEBJbnB1dCgpIGJhc2VDb250ZW50UmVhZERhdGEhOiBhbnlcbiAgQElucHV0KCkgY29udGVudFJlYWREYXRhITogYW55XG4gIGlzUGxheWFibGUgPSBmYWxzZVxuICBjb250ZW50UGxheVdpZGdldENvbmZpZzogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aFR5cGVkRGF0YTxhbnk+IHwgbnVsbCA9IG51bGxcbiAgZGVmYXVsdFRodW1ibmFpbCA9ICcnXG4gIC8vIGVycm9yQ29kZTogTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlIHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSByb3V0ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSByb3V0ZVF1ZXJ5U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBwcml2YXRlIGhhc2htYXBVcGRhdGVkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBjb250ZW50UGFyZW50czogTnNDb250ZW50LklDb250ZW50TWluaW1hbFtdID0gW11cbiAgZXhwYW5kQWxsID0gZmFsc2VcbiAgZXhwYW5kUGFydE9mID0gZmFsc2VcbiAgY29udGV4dElkITogc3RyaW5nXG4gIGNvbnRleHRQYXRoITogc3RyaW5nXG4gIGNvbnRlbnRMb2FkZXIgPSBmYWxzZVxuXG4gIHR5cGVzT2ZDb250ZW50OiBhbnlcbiAgc2VsZWN0ZWRUYWJUeXBlOiBhbnkgPSAnY29udGVudCdcbiAgbnNDb250ZW50OiBhbnkgPSAgTnNDb250ZW50XG4gIG90aGVyUmVzb3Vyc2UgPSAwXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSB0b2NTdmM6IEFwcFRvY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTdmM6IENvbmZpZ3VyYXRpb25zU2VydmljZVxuICApIHtcbiAgICB0aGlzLnRvY1N2Yy5yZXN1bWVEYXRhLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucmVzdW1lRGF0YSA9IHJlc1xuICAgICAgLy8gdGhpcy5nZXRMYXN0UGxheWVkUmVzb3VyY2UoKVxuICAgIH0pXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyB0aGlzLmZvclByZXZpZXcgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL2F1dGhvci8nKVxuICAgIHRoaXMucm91dGVRdWVyeVN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGUucXVlcnlQYXJhbU1hcC5zdWJzY3JpYmUocVBhcmFtc01hcCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZygncVBhcmFtc01hcC0tJywgcVBhcmFtc01hcClcbiAgICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzLmNvbnRlbnQtLScsIHRoaXMuY29udGVudClcbiAgICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzLmhpZXJhcmNoeU1hcERhdGEnLCB0aGlzLmhpZXJhcmNoeU1hcERhdGEpXG4gICAgICBcbiAgICAgIC8vIFBhcnNlIHByZUVucm9sbWVudFJlc291cmNlcyBpZiBpdCBleGlzdHMgYXMgYSBzdHJpbmdcbiAgICAgIC8vIE5vdGU6IFRoaXMgaXMgc2VwYXJhdGUgZnJvbSBwcmVsaW1pbmFyeSBhc3Nlc3NtZW50IHdoaWNoIGlzIGluIGNoaWxkcmVuIGFycmF5IHdpdGggaXNQcmVBc3Nlc3NtZW50IGZsYWdcbiAgICAgIGlmKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQ/LnByZUVucm9sbWVudFJlc291cmNlcyAmJiB0eXBlb2YgdGhpcy5jb250ZW50Py5wcmVFbnJvbG1lbnRSZXNvdXJjZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuY29udGVudFsncHJlRW5yb2xtZW50UmVzb3VyY2VzJ10gPSAgSlNPTi5wYXJzZSh0aGlzLmNvbnRlbnQ/LnByZUVucm9sbWVudFJlc291cmNlcylcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnRleHRJZCA9IHFQYXJhbXNNYXAuZ2V0KCdjb250ZXh0SWQnKVxuICAgICAgY29uc3QgY29udGV4dFBhdGggPSBxUGFyYW1zTWFwLmdldCgnY29udGV4dFBhdGgnKVxuICAgICAgY29uc3QgYmF0Y2hJZCA9IHFQYXJhbXNNYXAuZ2V0KCdiYXRjaElkJylcbiAgICAgIGNvbnN0IHByaW1hcnlDYXRlZ29yeSA9IHFQYXJhbXNNYXAuZ2V0KCdwcmltYXJ5Q2F0ZWdvcnknKVxuICAgICAgY29uc3QgcHJlQXNzZXNzbWVudCA9IHFQYXJhbXNNYXAuZ2V0KCdwcmVBc3Nlc3NtZW50JylcbiAgICAgIGlmKHByZUFzc2Vzc21lbnQgPT09ICd0cnVlJykge1xuICAgICAgICB0aGlzLmlzUHJlQXNzZXNzbWVudCA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChjb250ZXh0SWQgJiYgY29udGV4dFBhdGgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0SWQgPSBjb250ZXh0SWRcbiAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoXG4gICAgICB9XG4gICAgICBpZiAoYmF0Y2hJZCkge1xuICAgICAgICB0aGlzLmJhdGNoSWQgPSBiYXRjaElkXG4gICAgICB9XG4gICAgICBpZihwcmltYXJ5Q2F0ZWdvcnkgKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJUeXBlID0gcHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLm5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk9GRkxJTkVfU0VTU0lPTiA/ICdzZXNzaW9uJyA6ICdjb250ZW50J1xuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKHRoaXMucm91dGUgJiYgdGhpcy5yb3V0ZS5wYXJlbnQpIHtcbiAgICAgIHRoaXMucm91dGVTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlLnBhcmVudC5kYXRhLnN1YnNjcmliZSgoZGF0YTogRGF0YSkgPT4ge1xuICAgICAgICB0aGlzLmluaXREYXRhKGRhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyJC5zdWJzY3JpYmUoKHZhbDogYW55KSA9PiB7XG4gICAgICB0aGlzLmNvbnRlbnRMb2FkZXIgPSB2YWxcbiAgICB9KVxuICAgIFxuICAgIC8vIFN1YnNjcmliZSB0byBoYXNobWFwIHVwZGF0ZXMgZm9yIHJlYWwtdGltZSBwcm9ncmVzcyBzeW5jaHJvbml6YXRpb25cbiAgICB0aGlzLmhhc2htYXBVcGRhdGVkU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuaGFzaG1hcFVwZGF0ZWQkLnN1YnNjcmliZSgodXBkYXRlKSA9PiB7XG4gICAgICBpZiAodXBkYXRlICYmIHVwZGF0ZS5oYXNobWFwKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBoaWVyYXJjaHlNYXBEYXRhIHdpdGggdGhlIGxhdGVzdCBoYXNobWFwIGZyb20gdGhlIHNlcnZpY2VcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlNYXBEYXRhID0gdXBkYXRlLmhhc2htYXBcbiAgICAgIH1cbiAgICB9KVxuICAgIGNvbnN0IGluc3RhbmNlQ29uZmlnID0gdGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWdcbiAgICBpZiAoaW5zdGFuY2VDb25maWcpIHtcbiAgICAgIHRoaXMuZGVmYXVsdFRodW1ibmFpbCA9IGluc3RhbmNlQ29uZmlnLmxvZ29zLmRlZmF1bHRDb250ZW50IHx8ICcnXG4gICAgfVxuICAgIHRoaXMudHlwZXNPZkNvbnRlbnQgPSBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdTZWxmLXBhY2VkJyxcbiAgICAgICAgaWQ6ICdjb250ZW50JyxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ0luc3RydWN0b3ItbGVkJyxcbiAgICAgICAgaWQ6ICdzZXNzaW9uJyxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdXG4gICAgdGhpcy5vdGhlclJlc291cnNlID0gMFxuICAgIGlmICh0aGlzLnRvY1N0cnVjdHVyZSkge1xuICAgICAgT2JqZWN0LmtleXModGhpcy50b2NTdHJ1Y3R1cmUpLmZvckVhY2goKGVsZTogYW55KSA9PiB7XG4gICAgICAgIGlmIChlbGUgPT09ICdvZmZsaW5lU2Vzc2lvbicgfHwgZWxlID09PSAnbGVhcm5pbmdNb2R1bGUnKSB7XG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICB0aGlzLm90aGVyUmVzb3Vyc2UgPSB0aGlzLm90aGVyUmVzb3Vyc2UgKyB0aGlzLnRvY1N0cnVjdHVyZVtlbGVdXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAoIXRoaXMub3RoZXJSZXNvdXJzZSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiVHlwZSA9ICdzZXNzaW9uJ1xuICAgICAgICAgIHRoaXMudHlwZXNPZkNvbnRlbnRbMF0uZGlzYWJsZWQgPSB0cnVlXG4gICAgICAgIH0sICAgICAgICAgMTAwMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudHlwZXNPZkNvbnRlbnRbMV0uZGlzYWJsZWQgPSAgdGhpcy50b2NTdHJ1Y3R1cmVbJ29mZmxpbmVTZXNzaW9uJ10gPyBmYWxzZSA6IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXREYXRhKF9kYXRhOiBEYXRhKSB7XG4gICAgLy8gbm90IHJlcXVpcmVkIGluaXQgbm93IGJlY2F1c2UgbmV3IGltcGxlbWVudGF0aW9uIG9mICBoYXNobWFwIGFscmVhZHkgaGFzIG1hcHBlZCB0aGUgY29tcGxldGlvbiBwZXJjZW50XG4gICAgLy8gY29uc3QgaW5pdERhdGEgPSB0aGlzLnRvY1N2Yy5pbml0RGF0YShkYXRhLCB0cnVlKVxuICAgIC8vIHRoaXMuY29udGVudCA9IGluaXREYXRhLmNvbnRlbnRcbiAgICAvLyB0aGlzLmVycm9yQ29kZSA9IGluaXREYXRhLmVycm9yQ29kZVxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGlmICghdGhpcy5jb250ZXh0SWQgfHwgIXRoaXMuY29udGV4dFBhdGgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0SWQgPSB0aGlzLmNvbnRlbnQuaWRlbnRpZmllclxuICAgICAgICB0aGlzLmNvbnRleHRQYXRoID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGNoYW5nZXMpIHtcbiAgICAgIGlmIChwcm9wZXJ0eSA9PT0gJ3Jlc3VtZURhdGEnKSB7XG4gICAgICAgIC8vIHRoaXMuZ2V0TGFzdFBsYXllZFJlc291cmNlKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgaXNFbnJvbGxlZCgpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBib3RoIGJhdGNoSWQgYW5kIGJhdGNoRGF0YS5lbnJvbGxlZCB0byBzdXBwb3J0IExlYXJuaW5nIFBhdGh3YXlzXG4gICAgLy8gd2hlcmUgYmF0Y2hJZCBtaWdodCBub3QgYmUgZGlyZWN0bHkgc2V0IGJ1dCB1c2VyIGlzIGVucm9sbGVkIGluIGNvdXJzZXMgd2l0aGluIHRoZSBwYXRod2F5XG4gICAgcmV0dXJuIHRoaXMuYmF0Y2hJZCA/IHRydWUgOiAodGhpcy5iYXRjaERhdGE/LmVucm9sbGVkIHx8IGZhbHNlKVxuICB9XG5cbiAgLy8gcHJpdmF0ZSBwcm9jZXNzQ29sbGVjdGlvbkZvclRyZWUoKSB7XG4gIC8vICAgICB0aGlzLnBhdGhTZXQgPSBuZXcgU2V0KClcbiAgLy8gfVxuXG4gIC8vIGdldExhc3RQbGF5ZWRSZXNvdXJjZSgpIHtcbiAgLy8gICBsZXQgZmlyc3RQbGF5YWJsZUNvbnRlbnRcbiAgLy8gICBsZXQgcmVzdW1lRGF0YVYyOiBhbnlcbiAgLy8gICBpZiAodGhpcy5yZXN1bWVEYXRhICYmIHRoaXMucmVzdW1lRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuY29udGVudCkge1xuICAvLyAgICAgaWYgKHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSB7XG4gIC8vICAgICAgIHJlc3VtZURhdGFWMiA9IHRoaXMuZ2V0UmVzdW1lRGF0YUZyb21MaXN0KCdzdGFydCcpXG4gIC8vICAgICB9IGVsc2Uge1xuICAvLyAgICAgICByZXN1bWVEYXRhVjIgPSB0aGlzLmdldFJlc3VtZURhdGFGcm9tTGlzdCgpXG4gIC8vICAgICB9XG4gIC8vICAgICB0aGlzLmV4cGFuZFRoZVBhdGgocmVzdW1lRGF0YVYyLmlkZW50aWZpZXIpXG4gIC8vICAgfSBlbHNlIHtcbiAgLy8gICAgIGZpcnN0UGxheWFibGVDb250ZW50ID0gdGhpcy5jb250ZW50U3ZjLmdldEZpcnN0Q2hpbGRJbkhpZXJhcmNoeSh0aGlzLmNvbnRlbnQpXG4gIC8vICAgICB0aGlzLmV4cGFuZFRoZVBhdGgoZmlyc3RQbGF5YWJsZUNvbnRlbnQuaWRlbnRpZmllcilcbiAgLy8gICB9XG4gIC8vIH1cblxuICAvLyBleHBhbmRUaGVQYXRoKHJlc291cmNlSWQ6IHN0cmluZykge1xuICAvLyAgIGlmICh0aGlzLmNvbnRlbnQgJiYgcmVzb3VyY2VJZCkge1xuICAvLyAgICAgY29uc3QgcGF0aCA9IHRoaXMudXRpbGl0eVN2Yy5nZXRQYXRoKHRoaXMuY29udGVudCwgcmVzb3VyY2VJZClcbiAgLy8gICAgIC8vIGNvbnNvbGUubG9nKCdQYXRoIDo6IDo6IDogJywgcGF0aClcbiAgLy8gICAgIHRoaXMucGF0aFNldCA9IG5ldyBTZXQocGF0aC5tYXAoKHU6IHsgaWRlbnRpZmllcjogYW55IH0pID0+IHUuaWRlbnRpZmllcikpXG4gIC8vICAgICAvLyBjb25zb2xlLmxvZygncGF0aFNldCA6OjogJywgdGhpcy5wYXRoU2V0KVxuICAvLyAgICAgLy8gcGF0aC5mb3JFYWNoKChub2RlOiBJVmlld2VyVG9jQ2FyZCkgPT4ge1xuICAvLyAgICAgLy8gICB0aGlzLm5lc3RlZFRyZWVDb250cm9sLmV4cGFuZChub2RlKVxuICAvLyAgICAgLy8gfSlcbiAgLy8gICB9XG4gIC8vIH1cblxuICAvLyBwcml2YXRlIGdldFJlc3VtZURhdGFGcm9tTGlzdCh0eXBlPzogc3RyaW5nKSB7XG4gIC8vICAgaWYgKCF0eXBlKSB7XG4gIC8vICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gIC8vICAgICBjb25zdCBsYXN0SXRlbSA9IHRoaXMucmVzdW1lRGF0YSAmJiB0aGlzLnJlc3VtZURhdGEuc29ydCgoYTogYW55LCBiOiBhbnkpID0+XG4gIC8vIG5ldyBEYXRlKGIubGFzdEFjY2Vzc1RpbWUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEubGFzdEFjY2Vzc1RpbWUpLmdldFRpbWUoKSkuc2hpZnQoKVxuICAvLyAgICAgcmV0dXJuIHtcbiAgLy8gICAgICAgaWRlbnRpZmllcjogbGFzdEl0ZW0uY29udGVudElkLFxuICAvLyAgICAgICBtaW1lVHlwZTogbGFzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzICYmIGxhc3RJdGVtLnByb2dyZXNzZGV0YWlscy5taW1lVHlwZSxcbiAgLy8gICAgIH1cbiAgLy8gICB9XG5cbiAgLy8gICBjb25zdCBmaXJzdEl0ZW0gPSB0aGlzLnJlc3VtZURhdGEgJiYgdGhpcy5yZXN1bWVEYXRhLmxlbmd0aCAmJiB0aGlzLnJlc3VtZURhdGFbMF1cbiAgLy8gICByZXR1cm4ge1xuICAvLyAgICAgaWRlbnRpZmllcjogZmlyc3RJdGVtLmNvbnRlbnRJZCxcbiAgLy8gICAgIG1pbWVUeXBlOiBmaXJzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzICYmIGZpcnN0SXRlbS5wcm9ncmVzc2RldGFpbHMubWltZVR5cGUsXG4gIC8vICAgfVxuICAvLyB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMucm91dGVTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucm91dGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZiAodGhpcy5yb3V0ZVF1ZXJ5U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJvdXRlUXVlcnlTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZiAodGhpcy5oYXNobWFwVXBkYXRlZFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5oYXNobWFwVXBkYXRlZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICB9XG5cbiAgICBnZXRNaWxlc3RvbmVDb21wbGV0ZWRPck5vdChpZGVudGlmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY29udGVudCB8fCAhdGhpcy5oaWVyYXJjaHlNYXBEYXRhKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgbWlsZXN0b25lRGF0YSA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YVtpZGVudGlmaWVyXVxuICAgIGlmKG1pbGVzdG9uZURhdGEgJiYgbWlsZXN0b25lRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UKSB7XG4gICAgICByZXR1cm4gbWlsZXN0b25lRGF0YT8uY29tcGxldGlvblN0YXR1cyA9PT0gMlxuICAgIH1cbiAgICBpZiAoIW1pbGVzdG9uZURhdGEpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGFsbCBtYW5kYXRvcnkgY29udGVudCBBTkQgbWlsZXN0b25lIGFzc2Vzc21lbnQgYXJlIGNvbXBsZXRlZFxuICAgIGxldCBoYXNNYW5kYXRvcnlDb250ZW50ID0gZmFsc2VcbiAgICBsZXQgYWxsTWFuZGF0b3J5Q29tcGxldGUgPSB0cnVlXG4gICAgbGV0IGhhc01pbGVzdG9uZUFzc2Vzc21lbnQgPSBmYWxzZVxuICAgIGxldCBtaWxlc3RvbmVBc3Nlc3NtZW50Q29tcGxldGUgPSBmYWxzZVxuXG4gICAgLy8gQ2hlY2sgYWxsIGRpcmVjdCBjaGlsZHJlbiBvZiB0aGUgbWlsZXN0b25lXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5oaWVyYXJjaHlNYXBEYXRhKSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YVtrZXldXG5cbiAgICAgIC8vIE9ubHkgY2hlY2sgZGlyZWN0IGNoaWxkcmVuXG4gICAgICBpZiAoaXRlbS5wYXJlbnQgIT09IGlkZW50aWZpZXIpIGNvbnRpbnVlXG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgdGhlIG1pbGVzdG9uZSBhc3Nlc3NtZW50XG4gICAgICBjb25zdCBpc0Fzc2Vzc21lbnQgPSBcbiAgICAgICAgaXRlbS5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdDb3Vyc2UgQXNzZXNzbWVudCcgfHxcbiAgICAgICAgaXRlbS5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdGaW5hbCBBc3Nlc3NtZW50JyB8fFxuICAgICAgICBpdGVtLnByaW1hcnlDYXRlZ29yeSA9PT0gJ1N0YW5kYWxvbmUgQXNzZXNzbWVudCdcblxuICAgICAgaWYgKGlzQXNzZXNzbWVudCkge1xuICAgICAgICBoYXNNaWxlc3RvbmVBc3Nlc3NtZW50ID0gdHJ1ZVxuICAgICAgICBjb25zdCBpc0NvbXBsZXRlZCA9IGl0ZW0uY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBpdGVtLnN0YXR1cyA9PT0gMiB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwIHx8IGl0ZW0ucHJvZ3Jlc3MgPj0gMTAwXG4gICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICAgIG1pbGVzdG9uZUFzc2Vzc21lbnRDb21wbGV0ZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZSAvLyBTa2lwIHRvIG5leHQgaXRlbVxuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIG1hbmRhdG9yeSBjb250ZW50IChjb3Vyc2VzL2NvbGxlY3Rpb25zKVxuICAgICAgaWYgKGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnQ291cnNlJyB8fCBpdGVtLmlzQ29sbGVjdGlvbikge1xuICAgICAgICBjb25zdCBpc01hbmRhdG9yeSA9IGl0ZW0uaXNNYW5kYXRvcnkgIT09IGZhbHNlIC8vIERlZmF1bHQgaXMgbWFuZGF0b3J5XG4gICAgICAgIFxuICAgICAgICBpZiAoaXNNYW5kYXRvcnkpIHtcbiAgICAgICAgICBoYXNNYW5kYXRvcnlDb250ZW50ID0gdHJ1ZVxuICAgICAgICAgIGNvbnN0IGlzQ29tcGxldGVkID0gaXRlbS5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGl0ZW0uc3RhdHVzID09PSAyIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMCB8fCBpdGVtLnByb2dyZXNzID49IDEwMFxuICAgICAgICAgIGlmICghaXNDb21wbGV0ZWQpIHtcbiAgICAgICAgICAgIGFsbE1hbmRhdG9yeUNvbXBsZXRlID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNaWxlc3RvbmUgaXMgY29tcGxldGUgd2hlbjpcbiAgICAvLyAxLiBBbGwgbWFuZGF0b3J5IGNvbnRlbnQgaXMgY29tcGxldGVkIChvciBubyBtYW5kYXRvcnkgY29udGVudCBleGlzdHMpXG4gICAgLy8gMi4gTWlsZXN0b25lIGFzc2Vzc21lbnQgaXMgY29tcGxldGVkIChvciBubyBhc3Nlc3NtZW50IGV4aXN0cylcbiAgICBjb25zdCBtYW5kYXRvcnlDaGVjayA9ICFoYXNNYW5kYXRvcnlDb250ZW50IHx8IGFsbE1hbmRhdG9yeUNvbXBsZXRlXG4gICAgY29uc3QgYXNzZXNzbWVudENoZWNrID0gIWhhc01pbGVzdG9uZUFzc2Vzc21lbnQgfHwgbWlsZXN0b25lQXNzZXNzbWVudENvbXBsZXRlXG5cbiAgICByZXR1cm4gbWFuZGF0b3J5Q2hlY2sgJiYgYXNzZXNzbWVudENoZWNrXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgbXVsdGktbGluZSB0ZXh0IGlzIHRydW5jYXRlZCAoaGFzIGVsbGlwc2lzKVxuICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgSFRNTEVsZW1lbnQgdG8gY2hlY2tcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0ZXh0IGlzIHRydW5jYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBpc011bHRpTGluZVRydW5jYXRlZChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIGVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gZWxlbWVudC5jbGllbnRIZWlnaHRcbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cImNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5ID09PSAnTGVhcm5pbmcgUGF0aHdheScgJiYgIGNvbXBvbmVudE5hbWUgIT09ICd2aWV3ZXInXCI+XG4gICAgPCEtLSBNaWxlc3RvbmUgLyBMZWFybmluZyBQYXRoIFVJIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtaWxlc3RvbmUtd3JhcHBlclwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJMZWFybmluZyBwYXRoIG1pbGVzdG9uZXNcIj5cbiAgICAgICAgPCEtLSBMZWFybmluZyBQYXRoIEhlYWRlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxlYXJuaW5nLXBhdGgtaGVhZGVyXCI+XG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJsZWFybmluZy1wYXRoLXRpdGxlXCI+TGVhcm5pbmcgUGF0aDwvaDM+XG4gICAgICAgICAgICA8cCBjbGFzcz1cImxlYXJuaW5nLXBhdGgtc3VidGl0bGVcIj5Db21wbGV0ZSB7e2NvbnRlbnQ/LmNoaWxkcmVuPy5sZW5ndGggLSAxIHx8IDN9fSBrZXkgbWlsZXN0b25lczwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jaGlsZHJlbj8ubGVuZ3RoOyBlbHNlIGZhbGxiYWNrTWlsZXN0b25lc1wiPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwibWlsZXN0b25lLWxpc3RcIj5cbiAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IG0gb2YgY29udGVudD8uY2hpbGRyZW47IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cIm1pbGVzdG9uZS1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmNvbXBsZXRlZF09XCJtPy5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGdldE1pbGVzdG9uZUNvbXBsZXRlZE9yTm90KG0/LmlkZW50aWZpZXIpXCIgcm9sZT1cImxpc3RpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaWxlc3RvbmUtY2lyY2xlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJtPy5uYW1lIHx8ICgnTWlsZXN0b25lICcgKyAoaSsxKSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJtPy5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGdldE1pbGVzdG9uZUNvbXBsZXRlZE9yTm90KG0/LmlkZW50aWZpZXIpXCIgc3JjPVwiYXNzZXRzL2ljb25zL3RvYy90aWNrLW9yYW5nZS5zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWlsZXN0b25lLWNoZWNrbWFya1wiIGFsdD1cIkNvbXBsZXRlZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm0/LmNvbXBsZXRpb25TdGF0dXMgIT09IDIgJiYgIWdldE1pbGVzdG9uZUNvbXBsZXRlZE9yTm90KG0/LmlkZW50aWZpZXIpXCIgY2xhc3M9XCJtaWxlc3RvbmUtaW5kZXhcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTAgbGVhZGluZy1ub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtPy5jb250ZXh0Q2F0ZWdvcnlcIj57e20/LmNvbnRleHRDYXRlZ29yeX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibT8uY291cnNlQ2F0ZWdvcnlcIj57e20/LmNvdXJzZUNhdGVnb3J5fX0ge3sgaX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgI21pbGVzdG9uZU5hbWVSZWYgY2xhc3M9XCJtaWxlc3RvbmUtbmFtZS10ZXh0IGxlYWRpbmctbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiaXNNdWx0aUxpbmVUcnVuY2F0ZWQobWlsZXN0b25lTmFtZVJlZikgPyBtPy5uYW1lIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwQ2xhc3M9XCJtdWx0aWxpbmUtdG9vbHRpcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG0/Lm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2ZhbGxiYWNrTWlsZXN0b25lcz5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cIm1pbGVzdG9uZS1saXN0XCI+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWlsZXN0b25lLWl0ZW0gY29tcGxldGVkXCIgcm9sZT1cImxpc3RpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaWxlc3RvbmUtY2lyY2xlXCIgYXJpYS1sYWJlbD1cIlByZSBBc3Nlc3NtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImFzc2V0cy9pY29ucy90b2MvdGljay1vcmFuZ2Uuc3ZnXCIgY2xhc3M9XCJtaWxlc3RvbmUtY2hlY2ttYXJrXCIgYWx0PVwiQ29tcGxldGVkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaWxlc3RvbmUtbGFiZWxcIj5QcmUgQXNzZXNzbWVudDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWlsZXN0b25lLWl0ZW0gY29tcGxldGVkXCIgcm9sZT1cImxpc3RpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaWxlc3RvbmUtY2lyY2xlXCIgYXJpYS1sYWJlbD1cIjEuIEZvdW5kYXRpb24gb2YgV29ya3BsYWNlIEV0aGljc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaWNvbnMvdG9jL3RpY2stb3JhbmdlLnN2Z1wiIGNsYXNzPVwibWlsZXN0b25lLWNoZWNrbWFya1wiIGFsdD1cIkNvbXBsZXRlZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWxhYmVsXCI+MS4gRm91bmRhdGlvbiBvZiBXb3JrcGxhY2UgRXRoaWNzPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJtaWxlc3RvbmUtaXRlbVwiIHJvbGU9XCJsaXN0aXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWNpcmNsZVwiIGFyaWEtbGFiZWw9XCIyLiBIZWFsdGggYW5kIFByb2R1Y3Rpdml0eSBhdCBXb3JrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImFzc2V0cy9pY29ucy90b2MvdGljay1vcmFuZ2Uuc3ZnXCIgY2xhc3M9XCJtaWxlc3RvbmUtY2hlY2ttYXJrXCIgYWx0PVwiQ29tcGxldGVkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaWxlc3RvbmUtbGFiZWxcIj4yLiBIZWFsdGggYW5kIFByb2R1Y3Rpdml0eSBhdCBXb3JrPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJtaWxlc3RvbmUtaXRlbVwiIHJvbGU9XCJsaXN0aXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWNpcmNsZVwiIGFyaWEtbGFiZWw9XCIzLiBIZWFsdGggYW5kIFByb2R1Y3Rpdml0eSBhdCBXb3JrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1pbGVzdG9uZS1pbmRleFwiPjQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWxhYmVsXCI+My4gSGVhbHRoIGFuZCBQcm9kdWN0aXZpdHkgYXQgV29yazwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiYmdncmV5XCI+XG4gICAgPGRpdiBjbGFzcz1cInB5LTQgY29udGVudC1jb250YWluZXJcIiBpZD1cImNvbnRlbnRDb250YWluZXJcIiAqbmdJZj1cIiFpc1ByZUFzc2Vzc21lbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1haW4tY29udGFpbmVyIGZsZXggZmxleC1jb2wgZ2FwLTRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IG5zQ29udGVudD8uRVByaW1hcnlDYXRlZ29yeT8uQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhZGRpbmctbGVmdC1tIGZsZXggZ2FwLTQgdGFiLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdHlwZSBvZiB0eXBlc09mQ29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1kYXRhXCIgKGNsaWNrKT1cIiF0eXBlLmRpc2FibGVkICYmIHNlbGVjdGVkVGFiVHlwZSA9IHR5cGUuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlLXRhYic6IHNlbGVjdGVkVGFiVHlwZSA9PT0gdHlwZS5pZCwgJ2Rpc2FibGVkJzp0eXBlLmRpc2FibGVkfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7dHlwZS5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkVGFiVHlwZSA9PT0gJ2NvbnRlbnQnICYmIGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gbnNDb250ZW50Py5FUHJpbWFyeUNhdGVnb3J5Py5CTEVOREVEX1BST0dSQU1cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnRCbG9ja1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFRhYlR5cGUgPT09ICdzZXNzaW9uJyAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IG5zQ29udGVudD8uRVByaW1hcnlDYXRlZ29yeT8uQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1hcHAtYXBwLXRvYy1zZXNzaW9ucy1uZXcgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIiBbcGF0aFNldF09XCJwYXRoU2V0XCIgW3Jvb3RJZF09XCJjb250ZXh0SWRcIlxuICAgICAgICAgICAgICAgICAgICBbcm9vdENvbnRlbnRUeXBlXT1cImNvbnRleHRQYXRoXCIgW2JhdGNoSWRdPVwiYmF0Y2hJZFwiIFtjb25maWddPVwiY29uZmlnXCIgW2NvbnRlbnRdPVwiY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWFwcC1hcHAtdG9jLXNlc3Npb25zLW5ldz5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSAhPT0gbnNDb250ZW50Py5FUHJpbWFyeUNhdGVnb3J5Py5CTEVOREVEX1BST0dSQU1cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnRCbG9ja1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0ge3twYXRoU2V0fGpzb259fSAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2NvbnRlbnRCbG9jaz5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb250ZW50TG9hZGVyXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY2hpbGRyZW4/Lmxlbmd0aDsgZWxzZSBub0NoaWxkcmVuXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtY2FyZCBcIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2FyZCBvZiBjb250ZW50Py5jaGlsZHJlbjsgdHJhY2tCeTogY29udGVudFRyYWNrQnk7IGxldCBpID0gaW5kZXg7XCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnY29udGVudC1hY3RpdmUnOiBwYXRoU2V0ICYmIHBhdGhTZXQuaGFzKGNhcmQuaWRlbnRpZmllcikgICYmIGlzRW5yb2xsZWR9XCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0ge3tjYXJkfGpzb259fSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1hcHAtdG9jLWNvbnRlbnQtY2FyZC12MiBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCIgW2V4cGFuZEFsbF09XCJleHBhbmRBbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudE5hbWVdPVwiY29tcG9uZW50TmFtZVwiIFtleHBhbmRBY3RpdmVdPVwidHJ1ZVwiIFtyb290SWRdPVwiY29udGV4dElkXCIgW2JhdGNoSWRdPVwiYmF0Y2hJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm9vdENvbnRlbnRUeXBlXT1cImNvbnRleHRQYXRoXCIgW2NvbnRlbnRdPVwiY2FyZFwiIFttbENvdXJzZV09XCJjb250ZW50XCIgW2luZGV4XT1cImkrMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGF0aFNldF09XCJwYXRoU2V0XCIgW2hpZXJhcmNoeU1hcERhdGFdPVwiaGllcmFyY2h5TWFwRGF0YVwiIFtiYXRjaERhdGFdPVwiYmF0Y2hEYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtiYXNlQ29udGVudFJlYWREYXRhXT1cImJhc2VDb250ZW50UmVhZERhdGFcIj48L3dzLXdpZGdldC1hcHAtdG9jLWNvbnRlbnQtY2FyZC12Mj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0NoaWxkcmVuPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNQbGF5YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwid3MtbWF0LXByaW1hcnktZGVmYXVsdC10ZXh0IHdzLW1hdC1wcmltYXJ5LWxpdGUtYmFja2dyb3VuZCBweC02IHB5LTggZm9udC1ub3JtYWwgdGV4dC1iYXNlIG5vQ2hpbGRyZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgVGhlIHByZXZpZXcgZm9yIHRoaXMgdHlwZSBvZiBjb250ZW50IGlzIHVuYXZhaWxhYmxlLiBQbGVhc2UgY2xpY2sgb24gU3RhcnQgYnV0dG9uIGFib3ZlIHRvIHZpZXcuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNQbGF5YWJsZVwiIFtzYlVpUmVzb2x2ZXJXaWRnZXRdPVwiY29udGVudFBsYXlXaWRnZXRDb25maWdcIj48L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudExvYWRlclwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1hcHAtdG9jLWNvbnRlbnQtY2FyZC12Mi1za2VsZXRvbj48L3dzLXdpZGdldC1hcHAtdG9jLWNvbnRlbnQtY2FyZC12Mi1za2VsZXRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNQcmVBc3Nlc3NtZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWNhcmQgXCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjYXJkIG9mIGNvbnRlbnQ/LnByZUVucm9sbWVudFJlc291cmNlczsgdHJhY2tCeTogaWRlbnRpZmllcjsgbGV0IGkgPSBpbmRleDtcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnY29udGVudC1hY3RpdmUnOiBwYXRoU2V0ICYmIHBhdGhTZXQuaGFzKGNhcmQuaWRlbnRpZmllcikgICYmIGlzRW5yb2xsZWR9XCI+XG4gICAgICAgICAgICA8IS0tIHt7Y2FyZHxqc29ufX0gLS0+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LWFwcC10b2MtY29udGVudC1jYXJkLXYyIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbZXhwYW5kQWxsXT1cImV4cGFuZEFsbFwiXG4gICAgICAgICAgICAgICAgW2NvbXBvbmVudE5hbWVdPVwiY29tcG9uZW50TmFtZVwiIFtleHBhbmRBY3RpdmVdPVwidHJ1ZVwiIFtyb290SWRdPVwiY29udGV4dElkXCIgW2JhdGNoSWRdPVwiYmF0Y2hJZFwiXG4gICAgICAgICAgICAgICAgW3Jvb3RDb250ZW50VHlwZV09XCJjb250ZXh0UGF0aFwiIFtpc1ByZUFzc2Vzc21lbnRdPVwiaXNQcmVBc3Nlc3NtZW50XCIgW2NvbnRlbnRdPVwiY2FyZFwiXG4gICAgICAgICAgICAgICAgW21sQ291cnNlXT1cImNvbnRlbnRcIiBbaW5kZXhdPVwiaSsxXCIgW3BhdGhTZXRdPVwicGF0aFNldFwiIFtoaWVyYXJjaHlNYXBEYXRhXT1cImhpZXJhcmNoeU1hcERhdGFcIlxuICAgICAgICAgICAgICAgIFtiYXRjaERhdGFdPVwiYmF0Y2hEYXRhXCIgW2Jhc2VDb250ZW50UmVhZERhdGFdPVwiYmFzZUNvbnRlbnRSZWFkRGF0YVwiPjwvd3Mtd2lkZ2V0LWFwcC10b2MtY29udGVudC1jYXJkLXYyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==