@sunbird-cb/toc 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (495) hide show
  1. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.component.mjs +55 -0
  2. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.module.mjs +126 -0
  3. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.component.mjs +32 -0
  4. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.module.mjs +85 -0
  5. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.component.mjs +100 -0
  6. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.module.mjs +48 -0
  7. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +120 -0
  8. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +92 -0
  9. package/esm2022/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.mjs +48 -0
  10. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.component.mjs +25 -0
  11. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.module.mjs +41 -0
  12. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover-card.component.mjs +89 -0
  13. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.module.mjs +42 -0
  14. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.servive.mjs +41 -0
  15. package/esm2022/lib/_collection/_common/connection-name/connection-name.component.mjs +78 -0
  16. package/esm2022/lib/_collection/_common/connection-name/connection-name.module.mjs +45 -0
  17. package/esm2022/lib/_collection/_common/connection-name/profile-v2.model.mjs +2 -0
  18. package/esm2022/lib/_collection/_common/content-progress/content-progress.component.mjs +70 -0
  19. package/esm2022/lib/_collection/_common/content-progress/content-progress.module.mjs +28 -0
  20. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.mjs +187 -0
  21. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.mjs +86 -0
  22. package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +31 -0
  23. package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +941 -0
  24. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.mjs +183 -0
  25. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.mjs +327 -0
  26. package/esm2022/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.mjs +297 -0
  27. package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +223 -0
  28. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +591 -0
  29. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.mjs +16 -0
  30. package/esm2022/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.mjs +43 -0
  31. package/esm2022/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.mjs +133 -0
  32. package/esm2022/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.mjs +66 -0
  33. package/esm2022/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.mjs +278 -0
  34. package/esm2022/lib/_collection/_common/content-toc/content-services/handle-claim.service.mjs +21 -0
  35. package/esm2022/lib/_collection/_common/content-toc/content-services/review-component-data.service.mjs +21 -0
  36. package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +847 -0
  37. package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +219 -0
  38. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +209 -0
  39. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.module.mjs +26 -0
  40. package/esm2022/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.mjs +19 -0
  41. package/esm2022/lib/_collection/_common/content-toc/pipes/truncate.pipe.mjs +23 -0
  42. package/esm2022/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.mjs +113 -0
  43. package/esm2022/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.mjs +110 -0
  44. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.component.mjs +26 -0
  45. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.module.mjs +19 -0
  46. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.mjs +67 -0
  47. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.mjs +28 -0
  48. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.component.mjs +77 -0
  49. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.model.mjs +2 -0
  50. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.module.mjs +61 -0
  51. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.module.mjs +20 -0
  52. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +73 -0
  53. package/esm2022/lib/_collection/_common/player-brief/player-brief.component.mjs +139 -0
  54. package/esm2022/lib/_collection/_common/player-brief/player-brief.module.mjs +71 -0
  55. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.component.mjs +34 -0
  56. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.module.mjs +56 -0
  57. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.component.mjs +25 -0
  58. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.module.mjs +37 -0
  59. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.mjs +32 -0
  60. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner.module.mjs +30 -0
  61. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +38 -0
  62. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.mjs +51 -0
  63. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.component.mjs +115 -0
  64. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.model.mjs +12 -0
  65. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.module.mjs +51 -0
  66. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.service.mjs +61 -0
  67. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.component.mjs +87 -0
  68. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.module.mjs +36 -0
  69. package/esm2022/lib/_collection/_common/user-image/user-image.component.mjs +62 -0
  70. package/esm2022/lib/_collection/_common/user-image/user-image.module.mjs +24 -0
  71. package/esm2022/lib/_collection/btn-page-back/btn-page-back.component.mjs +192 -0
  72. package/esm2022/lib/_collection/btn-page-back/btn-page-back.module.mjs +44 -0
  73. package/esm2022/lib/_collection/btn-page-back/btn-page-back.service.mjs +99 -0
  74. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.component.mjs +58 -0
  75. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.module.mjs +67 -0
  76. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.component.mjs +112 -0
  77. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.model.mjs +2 -0
  78. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.module.mjs +69 -0
  79. package/esm2022/lib/_collection-api.mjs +57 -0
  80. package/esm2022/lib/_constants/widget-content.constants.mjs +19 -0
  81. package/esm2022/lib/_directives/tooltip.directive.mjs +68 -0
  82. package/esm2022/lib/_models/common.model.mjs +2 -0
  83. package/esm2022/lib/_models/error.model.mjs +2 -0
  84. package/esm2022/lib/_pipes/highlight.pipe.mjs +24 -0
  85. package/esm2022/lib/_services/rating.service.mjs +89 -0
  86. package/esm2022/lib/_services/samuhik-charcha.service.mjs +29 -0
  87. package/esm2022/lib/_services/viewer-route-util.mjs +103 -0
  88. package/esm2022/lib/_services/widget-content.model.mjs +246 -0
  89. package/esm2022/lib/_services/widget-content.service.mjs +589 -0
  90. package/esm2022/lib/_shared/translate-loader.factory.mjs +9 -0
  91. package/esm2022/lib/app-toc-lib.module.mjs +499 -0
  92. package/esm2022/lib/collection.config.mjs +161 -0
  93. package/esm2022/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.mjs +37 -0
  94. package/esm2022/lib/components/app-toc-banner/app-toc-banner.component.mjs +1436 -0
  95. package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +475 -0
  96. package/esm2022/lib/components/app-toc-cios-home/consent-dialog.component.mjs +119 -0
  97. package/esm2022/lib/components/app-toc-cohorts/app-toc-cohorts.component.mjs +80 -0
  98. package/esm2022/lib/components/app-toc-content-card/app-toc-content-card.component.mjs +249 -0
  99. package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +39 -0
  100. package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +58 -0
  101. package/esm2022/lib/components/app-toc-home/app-toc-home.component.mjs +2229 -0
  102. package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +2796 -0
  103. package/esm2022/lib/components/app-toc-overview/app-toc-overview.component.mjs +157 -0
  104. package/esm2022/lib/components/app-toc-session-card/app-toc-session-card.component.mjs +48 -0
  105. package/esm2022/lib/components/app-toc-sessions/app-toc-sessions.component.mjs +47 -0
  106. package/esm2022/lib/components/app-toc-single-page/app-toc-single-page.component.mjs +766 -0
  107. package/esm2022/lib/components/completion-survey-form/completion-survey-form.component.mjs +243 -0
  108. package/esm2022/lib/components/create-batch-dialog/create-batch-dialog.component.mjs +116 -0
  109. package/esm2022/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.mjs +44 -0
  110. package/esm2022/lib/components/enroll-profile-form/enroll-profile-form.component.mjs +1838 -0
  111. package/esm2022/lib/components/enroll-questionnaire/enroll-questionnaire.component.mjs +236 -0
  112. package/esm2022/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.mjs +213 -0
  113. package/esm2022/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.mjs +36 -0
  114. package/esm2022/lib/components/public-survey-form/public-survey-form.component.mjs +256 -0
  115. package/esm2022/lib/components/survey-form-question/survey-form-question.component.mjs +133 -0
  116. package/esm2022/lib/components/survey-form-section/survey-form-section.component.mjs +36 -0
  117. package/esm2022/lib/models/app-toc-analytics.model.mjs +2 -0
  118. package/esm2022/lib/models/app-toc.model.mjs +38 -0
  119. package/esm2022/lib/models/auto-complete.model.mjs +2 -0
  120. package/esm2022/lib/models/card-content.model.mjs +13 -0
  121. package/esm2022/lib/models/content-strip-with-tabs.model.mjs +2 -0
  122. package/esm2022/lib/models/discussion-forum.model.mjs +14 -0
  123. package/esm2022/lib/models/goal.model.mjs +2 -0
  124. package/esm2022/lib/models/meta-tag.model.mjs +8 -0
  125. package/esm2022/lib/models/playlist.model.mjs +2 -0
  126. package/esm2022/lib/models/profile-revamp.model.mjs +2 -0
  127. package/esm2022/lib/models/rating.model.mjs +2 -0
  128. package/esm2022/lib/models/user-profile.model.mjs +21 -0
  129. package/esm2022/lib/resolvers/app-toc-cios-resolver.service.mjs +24 -0
  130. package/esm2022/lib/resolvers/app-toc-cios-user-enroll-resolver.service.mjs +24 -0
  131. package/esm2022/lib/resolvers/app-toc-content-read-resolver.service.mjs +60 -0
  132. package/esm2022/lib/resolvers/app-toc-ext-public-resolver.service.mjs +25 -0
  133. package/esm2022/lib/resolvers/app-toc-resolver.service.mjs +106 -0
  134. package/esm2022/lib/resolvers/config-resolver.service.mjs +25 -0
  135. package/esm2022/lib/resolvers/profile-resolver.service.mjs +25 -0
  136. package/esm2022/lib/resolvers/restricted-features-resolver.service.mjs +25 -0
  137. package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +51 -0
  138. package/esm2022/lib/routes/app-toc-home/app-toc-home.directive.mjs +16 -0
  139. package/esm2022/lib/routes/app-toc-home/app-toc-home.service.mjs +18 -0
  140. package/esm2022/lib/services/access-control.service.mjs +56 -0
  141. package/esm2022/lib/services/action.service.mjs +23 -0
  142. package/esm2022/lib/services/app-toc-v2.service.mjs +47 -0
  143. package/esm2022/lib/services/app-toc.service.mjs +1001 -0
  144. package/esm2022/lib/services/certificate.service.mjs +69 -0
  145. package/esm2022/lib/services/discuss-utils.service.mjs +58 -0
  146. package/esm2022/lib/services/editor.service.mjs +34 -0
  147. package/esm2022/lib/services/load-check.service.mjs +21 -0
  148. package/esm2022/lib/services/loader.service.mjs +33 -0
  149. package/esm2022/lib/services/mobile-apps.service.mjs +67 -0
  150. package/esm2022/lib/services/netcore.service.mjs +56 -0
  151. package/esm2022/lib/services/nps-grid.service.mjs +31 -0
  152. package/esm2022/lib/services/otp.service.mjs +43 -0
  153. package/esm2022/lib/services/profile-v2.service.mjs +43 -0
  154. package/esm2022/lib/services/reset-ratings.service.mjs +19 -0
  155. package/esm2022/lib/services/resource-download-helper.service.mjs +64 -0
  156. package/esm2022/lib/services/timer.service.mjs +23 -0
  157. package/esm2022/lib/services/title-tag.service.mjs +71 -0
  158. package/esm2022/lib/services/user-profile.service.mjs +55 -0
  159. package/esm2022/lib/services/viewer-data.service.mjs +64 -0
  160. package/esm2022/lib/services/viewer-util.service.mjs +500 -0
  161. package/esm2022/lib/share-toc/share-toc/share-toc.component.mjs +291 -0
  162. package/esm2022/lib/share-toc/share-toc.module.mjs +119 -0
  163. package/esm2022/public-api.mjs +56 -0
  164. package/esm2022/sunbird-cb-toc.mjs +5 -0
  165. package/fesm2022/sunbird-cb-toc.mjs +23517 -0
  166. package/fesm2022/sunbird-cb-toc.mjs.map +1 -0
  167. package/index.d.ts +6 -0
  168. package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +17 -0
  169. package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts.map +1 -0
  170. package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +32 -0
  171. package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts.map +1 -0
  172. package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +16 -0
  173. package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts.map +1 -0
  174. package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +21 -0
  175. package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts.map +1 -0
  176. package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +23 -0
  177. package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts.map +1 -0
  178. package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +16 -0
  179. package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts.map +1 -0
  180. package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +23 -0
  181. package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts.map +1 -0
  182. package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +23 -0
  183. package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts.map +1 -0
  184. package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +10 -0
  185. package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts.map +1 -0
  186. package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +12 -0
  187. package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts.map +1 -0
  188. package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +13 -0
  189. package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts.map +1 -0
  190. package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +19 -0
  191. package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts.map +1 -0
  192. package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +15 -0
  193. package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts.map +1 -0
  194. package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +12 -0
  195. package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts.map +1 -0
  196. package/lib/_collection/_common/connection-name/connection-name.component.d.ts +18 -0
  197. package/lib/_collection/_common/connection-name/connection-name.component.d.ts.map +1 -0
  198. package/lib/_collection/_common/connection-name/connection-name.module.d.ts +15 -0
  199. package/lib/_collection/_common/connection-name/connection-name.module.d.ts.map +1 -0
  200. package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +200 -0
  201. package/lib/_collection/_common/connection-name/profile-v2.model.d.ts.map +1 -0
  202. package/lib/_collection/_common/content-progress/content-progress.component.d.ts +17 -0
  203. package/lib/_collection/_common/content-progress/content-progress.component.d.ts.map +1 -0
  204. package/lib/_collection/_common/content-progress/content-progress.module.d.ts +11 -0
  205. package/lib/_collection/_common/content-progress/content-progress.module.d.ts.map +1 -0
  206. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +39 -0
  207. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts.map +1 -0
  208. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +20 -0
  209. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts.map +1 -0
  210. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +12 -0
  211. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts.map +1 -0
  212. package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +184 -0
  213. package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts.map +1 -0
  214. package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +42 -0
  215. package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts.map +1 -0
  216. package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +55 -0
  217. package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts.map +1 -0
  218. package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +48 -0
  219. package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts.map +1 -0
  220. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +49 -0
  221. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts.map +1 -0
  222. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +92 -0
  223. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts.map +1 -0
  224. package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +9 -0
  225. package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts.map +1 -0
  226. package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +17 -0
  227. package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts.map +1 -0
  228. package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +41 -0
  229. package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts.map +1 -0
  230. package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +22 -0
  231. package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts.map +1 -0
  232. package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +46 -0
  233. package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts.map +1 -0
  234. package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +11 -0
  235. package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts.map +1 -0
  236. package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +11 -0
  237. package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts.map +1 -0
  238. package/lib/_collection/_common/content-toc/content-toc.component.d.ts +129 -0
  239. package/lib/_collection/_common/content-toc/content-toc.component.d.ts.map +1 -0
  240. package/lib/_collection/_common/content-toc/content-toc.module.d.ts +52 -0
  241. package/lib/_collection/_common/content-toc/content-toc.module.d.ts.map +1 -0
  242. package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +30 -0
  243. package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts.map +1 -0
  244. package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +10 -0
  245. package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts.map +1 -0
  246. package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +8 -0
  247. package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts.map +1 -0
  248. package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +8 -0
  249. package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts.map +1 -0
  250. package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +29 -0
  251. package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts.map +1 -0
  252. package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +25 -0
  253. package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts.map +1 -0
  254. package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +15 -0
  255. package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts.map +1 -0
  256. package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +10 -0
  257. package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts.map +1 -0
  258. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +13 -0
  259. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts.map +1 -0
  260. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +11 -0
  261. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts.map +1 -0
  262. package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +23 -0
  263. package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts.map +1 -0
  264. package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +9 -0
  265. package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts.map +1 -0
  266. package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +19 -0
  267. package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts.map +1 -0
  268. package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +9 -0
  269. package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts.map +1 -0
  270. package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +17 -0
  271. package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts.map +1 -0
  272. package/lib/_collection/_common/player-brief/player-brief.component.d.ts +36 -0
  273. package/lib/_collection/_common/player-brief/player-brief.component.d.ts.map +1 -0
  274. package/lib/_collection/_common/player-brief/player-brief.module.d.ts +20 -0
  275. package/lib/_collection/_common/player-brief/player-brief.module.d.ts.map +1 -0
  276. package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +15 -0
  277. package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts.map +1 -0
  278. package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +14 -0
  279. package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts.map +1 -0
  280. package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +12 -0
  281. package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts.map +1 -0
  282. package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +12 -0
  283. package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts.map +1 -0
  284. package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +16 -0
  285. package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts.map +1 -0
  286. package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +11 -0
  287. package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts.map +1 -0
  288. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +17 -0
  289. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts.map +1 -0
  290. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +12 -0
  291. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts.map +1 -0
  292. package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +35 -0
  293. package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts.map +1 -0
  294. package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +18 -0
  295. package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts.map +1 -0
  296. package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +16 -0
  297. package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts.map +1 -0
  298. package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +16 -0
  299. package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts.map +1 -0
  300. package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +22 -0
  301. package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts.map +1 -0
  302. package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +13 -0
  303. package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts.map +1 -0
  304. package/lib/_collection/_common/user-image/user-image.component.d.ts +22 -0
  305. package/lib/_collection/_common/user-image/user-image.component.d.ts.map +1 -0
  306. package/lib/_collection/_common/user-image/user-image.module.d.ts +10 -0
  307. package/lib/_collection/_common/user-image/user-image.module.d.ts.map +1 -0
  308. package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +48 -0
  309. package/lib/_collection/btn-page-back/btn-page-back.component.d.ts.map +1 -0
  310. package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +15 -0
  311. package/lib/_collection/btn-page-back/btn-page-back.module.d.ts.map +1 -0
  312. package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +23 -0
  313. package/lib/_collection/btn-page-back/btn-page-back.service.d.ts.map +1 -0
  314. package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +20 -0
  315. package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts.map +1 -0
  316. package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +16 -0
  317. package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts.map +1 -0
  318. package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +26 -0
  319. package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts.map +1 -0
  320. package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +22 -0
  321. package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts.map +1 -0
  322. package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +19 -0
  323. package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts.map +1 -0
  324. package/lib/_collection-api.d.ts +35 -0
  325. package/lib/_collection-api.d.ts.map +1 -0
  326. package/lib/_constants/widget-content.constants.d.ts +8 -0
  327. package/lib/_constants/widget-content.constants.d.ts.map +1 -0
  328. package/lib/_directives/tooltip.directive.d.ts +18 -0
  329. package/lib/_directives/tooltip.directive.d.ts.map +1 -0
  330. package/lib/_models/common.model.d.ts +4 -0
  331. package/lib/_models/common.model.d.ts.map +1 -0
  332. package/lib/_models/error.model.d.ts +6 -0
  333. package/lib/_models/error.model.d.ts.map +1 -0
  334. package/lib/_pipes/highlight.pipe.d.ts +11 -0
  335. package/lib/_pipes/highlight.pipe.d.ts.map +1 -0
  336. package/lib/_services/rating.service.d.ts +19 -0
  337. package/lib/_services/rating.service.d.ts.map +1 -0
  338. package/lib/_services/samuhik-charcha.service.d.ts +14 -0
  339. package/lib/_services/samuhik-charcha.service.d.ts.map +1 -0
  340. package/lib/_services/viewer-route-util.d.ts +9 -0
  341. package/lib/_services/viewer-route-util.d.ts.map +1 -0
  342. package/lib/_services/widget-content.model.d.ts +515 -0
  343. package/lib/_services/widget-content.model.d.ts.map +1 -0
  344. package/lib/_services/widget-content.service.d.ts +101 -0
  345. package/lib/_services/widget-content.service.d.ts.map +1 -0
  346. package/lib/_shared/translate-loader.factory.d.ts +8 -0
  347. package/lib/_shared/translate-loader.factory.d.ts.map +1 -0
  348. package/lib/app-toc-lib.module.d.ts +89 -0
  349. package/lib/app-toc-lib.module.d.ts.map +1 -0
  350. package/lib/collection.config.d.ts +160 -0
  351. package/lib/collection.config.d.ts.map +1 -0
  352. package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +18 -0
  353. package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts.map +1 -0
  354. package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +226 -0
  355. package/lib/components/app-toc-banner/app-toc-banner.component.d.ts.map +1 -0
  356. package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +79 -0
  357. package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts.map +1 -0
  358. package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +23 -0
  359. package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts.map +1 -0
  360. package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +32 -0
  361. package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts.map +1 -0
  362. package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +48 -0
  363. package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts.map +1 -0
  364. package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +15 -0
  365. package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts.map +1 -0
  366. package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +22 -0
  367. package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts.map +1 -0
  368. package/lib/components/app-toc-home/app-toc-home.component.d.ts +315 -0
  369. package/lib/components/app-toc-home/app-toc-home.component.d.ts.map +1 -0
  370. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +386 -0
  371. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts.map +1 -0
  372. package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +48 -0
  373. package/lib/components/app-toc-overview/app-toc-overview.component.d.ts.map +1 -0
  374. package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +23 -0
  375. package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts.map +1 -0
  376. package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +15 -0
  377. package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts.map +1 -0
  378. package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +150 -0
  379. package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts.map +1 -0
  380. package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +43 -0
  381. package/lib/components/completion-survey-form/completion-survey-form.component.d.ts.map +1 -0
  382. package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +28 -0
  383. package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts.map +1 -0
  384. package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +16 -0
  385. package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts.map +1 -0
  386. package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +196 -0
  387. package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts.map +1 -0
  388. package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +45 -0
  389. package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts.map +1 -0
  390. package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +55 -0
  391. package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts.map +1 -0
  392. package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +19 -0
  393. package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts.map +1 -0
  394. package/lib/components/public-survey-form/public-survey-form.component.d.ts +44 -0
  395. package/lib/components/public-survey-form/public-survey-form.component.d.ts.map +1 -0
  396. package/lib/components/survey-form-question/survey-form-question.component.d.ts +21 -0
  397. package/lib/components/survey-form-question/survey-form-question.component.d.ts.map +1 -0
  398. package/lib/components/survey-form-section/survey-form-section.component.d.ts +14 -0
  399. package/lib/components/survey-form-section/survey-form-section.component.d.ts.map +1 -0
  400. package/lib/models/app-toc-analytics.model.d.ts +153 -0
  401. package/lib/models/app-toc-analytics.model.d.ts.map +1 -0
  402. package/lib/models/app-toc.model.d.ts +85 -0
  403. package/lib/models/app-toc.model.d.ts.map +1 -0
  404. package/lib/models/auto-complete.model.d.ts +28 -0
  405. package/lib/models/auto-complete.model.d.ts.map +1 -0
  406. package/lib/models/card-content.model.d.ts +20 -0
  407. package/lib/models/card-content.model.d.ts.map +1 -0
  408. package/lib/models/content-strip-with-tabs.model.d.ts +45 -0
  409. package/lib/models/content-strip-with-tabs.model.d.ts.map +1 -0
  410. package/lib/models/discussion-forum.model.d.ts +41 -0
  411. package/lib/models/discussion-forum.model.d.ts.map +1 -0
  412. package/lib/models/goal.model.d.ts +23 -0
  413. package/lib/models/goal.model.d.ts.map +1 -0
  414. package/lib/models/meta-tag.model.d.ts +7 -0
  415. package/lib/models/meta-tag.model.d.ts.map +1 -0
  416. package/lib/models/playlist.model.d.ts +24 -0
  417. package/lib/models/playlist.model.d.ts.map +1 -0
  418. package/lib/models/profile-revamp.model.d.ts +15 -0
  419. package/lib/models/profile-revamp.model.d.ts.map +1 -0
  420. package/lib/models/rating.model.d.ts +18 -0
  421. package/lib/models/rating.model.d.ts.map +1 -0
  422. package/lib/models/user-profile.model.d.ts +38 -0
  423. package/lib/models/user-profile.model.d.ts.map +1 -0
  424. package/lib/resolvers/app-toc-cios-resolver.service.d.ts +13 -0
  425. package/lib/resolvers/app-toc-cios-resolver.service.d.ts.map +1 -0
  426. package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +13 -0
  427. package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts.map +1 -0
  428. package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +17 -0
  429. package/lib/resolvers/app-toc-content-read-resolver.service.d.ts.map +1 -0
  430. package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +13 -0
  431. package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts.map +1 -0
  432. package/lib/resolvers/app-toc-resolver.service.d.ts +17 -0
  433. package/lib/resolvers/app-toc-resolver.service.d.ts.map +1 -0
  434. package/lib/resolvers/config-resolver.service.d.ts +12 -0
  435. package/lib/resolvers/config-resolver.service.d.ts.map +1 -0
  436. package/lib/resolvers/profile-resolver.service.d.ts +12 -0
  437. package/lib/resolvers/profile-resolver.service.d.ts.map +1 -0
  438. package/lib/resolvers/restricted-features-resolver.service.d.ts +12 -0
  439. package/lib/resolvers/restricted-features-resolver.service.d.ts.map +1 -0
  440. package/lib/routes/app-toc-home/app-toc-home.component.d.ts +20 -0
  441. package/lib/routes/app-toc-home/app-toc-home.component.d.ts.map +1 -0
  442. package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +9 -0
  443. package/lib/routes/app-toc-home/app-toc-home.directive.d.ts.map +1 -0
  444. package/lib/routes/app-toc-home/app-toc-home.service.d.ts +9 -0
  445. package/lib/routes/app-toc-home/app-toc-home.service.d.ts.map +1 -0
  446. package/lib/services/access-control.service.d.ts +30 -0
  447. package/lib/services/access-control.service.d.ts.map +1 -0
  448. package/lib/services/action.service.d.ts +10 -0
  449. package/lib/services/action.service.d.ts.map +1 -0
  450. package/lib/services/app-toc-v2.service.d.ts +8 -0
  451. package/lib/services/app-toc-v2.service.d.ts.map +1 -0
  452. package/lib/services/app-toc.service.d.ts +131 -0
  453. package/lib/services/app-toc.service.d.ts.map +1 -0
  454. package/lib/services/certificate.service.d.ts +43 -0
  455. package/lib/services/certificate.service.d.ts.map +1 -0
  456. package/lib/services/discuss-utils.service.d.ts +34 -0
  457. package/lib/services/discuss-utils.service.d.ts.map +1 -0
  458. package/lib/services/editor.service.d.ts +18 -0
  459. package/lib/services/editor.service.d.ts.map +1 -0
  460. package/lib/services/load-check.service.d.ts +9 -0
  461. package/lib/services/load-check.service.d.ts.map +1 -0
  462. package/lib/services/loader.service.d.ts +17 -0
  463. package/lib/services/loader.service.d.ts.map +1 -0
  464. package/lib/services/mobile-apps.service.d.ts +39 -0
  465. package/lib/services/mobile-apps.service.d.ts.map +1 -0
  466. package/lib/services/netcore.service.d.ts +34 -0
  467. package/lib/services/netcore.service.d.ts.map +1 -0
  468. package/lib/services/nps-grid.service.d.ts +16 -0
  469. package/lib/services/nps-grid.service.d.ts.map +1 -0
  470. package/lib/services/otp.service.d.ts +21 -0
  471. package/lib/services/otp.service.d.ts.map +1 -0
  472. package/lib/services/profile-v2.service.d.ts +21 -0
  473. package/lib/services/profile-v2.service.d.ts.map +1 -0
  474. package/lib/services/reset-ratings.service.d.ts +9 -0
  475. package/lib/services/reset-ratings.service.d.ts.map +1 -0
  476. package/lib/services/resource-download-helper.service.d.ts +30 -0
  477. package/lib/services/resource-download-helper.service.d.ts.map +1 -0
  478. package/lib/services/timer.service.d.ts +10 -0
  479. package/lib/services/timer.service.d.ts.map +1 -0
  480. package/lib/services/title-tag.service.d.ts +22 -0
  481. package/lib/services/title-tag.service.d.ts.map +1 -0
  482. package/lib/services/user-profile.service.d.ts +25 -0
  483. package/lib/services/user-profile.service.d.ts.map +1 -0
  484. package/lib/services/viewer-data.service.d.ts +59 -0
  485. package/lib/services/viewer-data.service.d.ts.map +1 -0
  486. package/lib/services/viewer-util.service.d.ts +63 -0
  487. package/lib/services/viewer-util.service.d.ts.map +1 -0
  488. package/lib/share-toc/share-toc/share-toc.component.d.ts +57 -0
  489. package/lib/share-toc/share-toc/share-toc.component.d.ts.map +1 -0
  490. package/lib/share-toc/share-toc.module.d.ts +33 -0
  491. package/lib/share-toc/share-toc.module.d.ts.map +1 -0
  492. package/package.json +36 -0
  493. package/public-api.d.ts +44 -0
  494. package/public-api.d.ts.map +1 -0
  495. package/sunbird-cb-toc.d.ts.map +1 -0
@@ -0,0 +1,2229 @@
1
+ import { Component, HostListener, ViewChild, ViewEncapsulation, Input, Inject, } from '@angular/core';
2
+ import { NavigationEnd } from '@angular/router';
3
+ import { UntypedFormControl, Validators } from '@angular/forms';
4
+ import { Subject } from 'rxjs';
5
+ import { share, takeUntil } from 'rxjs/operators';
6
+ import dayjs from 'dayjs';
7
+ // tslint:disable-next-line
8
+ import _ from 'lodash';
9
+ import moment from 'moment';
10
+ import isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
11
+ import { NsContent } from '../../_services/widget-content.model';
12
+ import { viewerRouteGenerator } from '../../_services/viewer-route-util';
13
+ import { WsEvents, } from '@sunbird-cb/utils-v2';
14
+ import { NsAppToc } from '../../models/app-toc.model';
15
+ import { AppTocDialogIntroVideoComponent } from '../app-toc-dialog-intro-video/app-toc-dialog-intro-video.component';
16
+ import { ContentRatingV2DialogComponent } from '../../_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component';
17
+ import { NsCardContent } from '../../models/card-content.model';
18
+ import { NonReleventFeedbackDialogComponent } from '../non-relevent-feedback-dialog/non-relevent-feedback-dialog.component';
19
+ import * as i0 from "@angular/core";
20
+ import * as i1 from "@angular/router";
21
+ import * as i2 from "../../_services/widget-content.service";
22
+ import * as i3 from "../../services/app-toc.service";
23
+ import * as i4 from "@sunbird-cb/utils-v2";
24
+ import * as i5 from "@angular/platform-browser";
25
+ import * as i6 from "../../services/access-control.service";
26
+ import * as i7 from "@angular/material/legacy-snack-bar";
27
+ import * as i8 from "@angular/material/legacy-dialog";
28
+ import * as i9 from "../../services/mobile-apps.service";
29
+ import * as i10 from "../../services/action.service";
30
+ import * as i11 from "../../services/viewer-util.service";
31
+ import * as i12 from "../../_services/rating.service";
32
+ import * as i13 from "@ngx-translate/core";
33
+ import * as i14 from "../../services/load-check.service";
34
+ import * as i15 from "../../_collection/_common/content-toc/content-services/handle-claim.service";
35
+ import * as i16 from "./../../services/reset-ratings.service";
36
+ import * as i17 from "../../services/timer.service";
37
+ import * as i18 from "@sunbird-cb/consumption";
38
+ import * as i19 from "@angular/material/snack-bar";
39
+ import * as i20 from "../../services/netcore.service";
40
+ dayjs.extend(isSameOrBefore);
41
+ export var ErrorType;
42
+ (function (ErrorType) {
43
+ ErrorType["internalServer"] = "internalServer";
44
+ ErrorType["serviceUnavailable"] = "serviceUnavailable";
45
+ ErrorType["somethingWrong"] = "somethingWrong";
46
+ })(ErrorType || (ErrorType = {}));
47
+ const flattenItems = (items, key) => {
48
+ return items.reduce((flattenedItems, item) => {
49
+ flattenedItems.push(item);
50
+ if (Array.isArray(item[key])) {
51
+ // tslint:disable-next-line
52
+ flattenedItems = flattenedItems.concat(flattenItems(item[key], key));
53
+ }
54
+ return flattenedItems;
55
+ // tslint:disable-next-line
56
+ }, []);
57
+ };
58
+ const SNACKBAR_DURATION = 3000;
59
+ export class AppTocHomeComponent {
60
+ handleScroll() {
61
+ const windowScroll = window.pageYOffset;
62
+ if (windowScroll >= this.elementPosition - 100) {
63
+ this.sticky = true;
64
+ }
65
+ else {
66
+ this.sticky = false;
67
+ }
68
+ if (this.scrollLimit) {
69
+ if ((window.scrollY + this.rcElem.BottomPos) >= this.scrollLimit) {
70
+ this.rcElement.nativeElement.style.position = 'sticky';
71
+ }
72
+ else {
73
+ this.rcElement.nativeElement.style.position = 'fixed';
74
+ }
75
+ }
76
+ // 236... (OffsetTop of right container + 104)
77
+ if (window.scrollY > (this.rcElem.offSetTop + 104)) {
78
+ this.scrolled = true;
79
+ }
80
+ else {
81
+ this.scrolled = false;
82
+ }
83
+ }
84
+ constructor(route, router, contentSvc, tocSvc, loggerSvc, configSvc, domSanitizer, authAccessControlSvc, snackBar, dialog, mobileAppsSvc, utilitySvc,
85
+ // private progressSvc: ContentProgressService,
86
+ actionSVC, viewerSvc, ratingSvc, telemetryService, translate, langtranslations, events, matSnackBar, loadCheckService, handleClaimService, resetRatingsService, timerService, enrollSvc, contentLibSvc, dataTransferSvc, matSnackbarNew, userServiceLib, netCoreService, environment) {
87
+ this.route = route;
88
+ this.router = router;
89
+ this.contentSvc = contentSvc;
90
+ this.tocSvc = tocSvc;
91
+ this.loggerSvc = loggerSvc;
92
+ this.configSvc = configSvc;
93
+ this.domSanitizer = domSanitizer;
94
+ this.authAccessControlSvc = authAccessControlSvc;
95
+ this.snackBar = snackBar;
96
+ this.dialog = dialog;
97
+ this.mobileAppsSvc = mobileAppsSvc;
98
+ this.utilitySvc = utilitySvc;
99
+ this.actionSVC = actionSVC;
100
+ this.viewerSvc = viewerSvc;
101
+ this.ratingSvc = ratingSvc;
102
+ this.telemetryService = telemetryService;
103
+ this.translate = translate;
104
+ this.langtranslations = langtranslations;
105
+ this.events = events;
106
+ this.matSnackBar = matSnackBar;
107
+ this.loadCheckService = loadCheckService;
108
+ this.handleClaimService = handleClaimService;
109
+ this.resetRatingsService = resetRatingsService;
110
+ this.timerService = timerService;
111
+ this.enrollSvc = enrollSvc;
112
+ this.contentLibSvc = contentLibSvc;
113
+ this.dataTransferSvc = dataTransferSvc;
114
+ this.matSnackbarNew = matSnackbarNew;
115
+ this.userServiceLib = userServiceLib;
116
+ this.netCoreService = netCoreService;
117
+ this.show = false;
118
+ this.changeTab = false;
119
+ this.skeletonLoader = true;
120
+ this.banners = null;
121
+ this.showMoreGlance = false;
122
+ this.content = null;
123
+ this.contentReadData = null;
124
+ this.errorCode = null;
125
+ this.resumeData = null;
126
+ this.nsCardContentData = NsCardContent.ACBPConst;
127
+ this.batchData = null;
128
+ this.currentCourseBatchId = null;
129
+ this.routeSubscription = null;
130
+ this.pageNavbar = this.configSvc.pageNavBar;
131
+ this.isCohortsRestricted = false;
132
+ this.sticky = false;
133
+ this.isInIframe = false;
134
+ this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('/author/');
135
+ // forPreview = window.location.href.includes('/author/')
136
+ this.analytics = this.route.snapshot.data.pageData.data?.analytics;
137
+ this.errorWidgetData = {
138
+ widgetType: 'errorResolver',
139
+ widgetSubType: 'errorResolver',
140
+ widgetData: {
141
+ errorType: 'internalServer',
142
+ },
143
+ };
144
+ this.isAuthor = false;
145
+ this.authorBtnWidget = {
146
+ actionBtnId: 'feature_authoring',
147
+ config: {
148
+ type: 'mat-button',
149
+ },
150
+ };
151
+ this.tocConfig = null;
152
+ this.primaryCategory = NsContent.EPrimaryCategory;
153
+ this.courseCategory = NsContent.ECourseCategory;
154
+ this.WFBlendedProgramStatus = NsContent.WFBlendedProgramStatus;
155
+ this.askAuthorEnabled = true;
156
+ this.trainingLHubEnabled = false;
157
+ this.body = null;
158
+ this.viewMoreRelatedTopics = false;
159
+ this.hasTocStructure = false;
160
+ this.tocStructure = null;
161
+ this.contentParents = {};
162
+ this.objKeys = Object.keys;
163
+ this.activeFragment = this.route.fragment.pipe(share());
164
+ this.currentFragment = 'overview';
165
+ this.showScrollHeight = 300;
166
+ this.hideScrollHeight = 10;
167
+ this.batchSubscription = null;
168
+ this.batchDataSubscription = null;
169
+ this.resumeDataSubscription = null;
170
+ this.batchControl = new UntypedFormControl('', Validators.required);
171
+ this.contentProgress = 0;
172
+ this.bannerUrl = null;
173
+ this.routePath = 'overview';
174
+ this.validPaths = new Set(['overview', 'contents', 'analytics']);
175
+ this.routerParamSubscription = null;
176
+ this.actionBtnStatus = 'wait';
177
+ this.isRegistrationSupported = false;
178
+ this.showIntranetMessage = false;
179
+ this.firstResourceLink = null;
180
+ this.resumeDataLink = null;
181
+ this.showTakeAssessment = null;
182
+ this.checkRegistrationSources = new Set([
183
+ 'SkillSoft Digitalization',
184
+ 'SkillSoft Leadership',
185
+ 'Pluralsight',
186
+ ]);
187
+ this.btnPlaylistConfig = null;
188
+ this.btnGoalsConfig = null;
189
+ this.externalContentFetchStatus = 'done';
190
+ this.registerForExternal = false;
191
+ this.isGoalsEnabled = false;
192
+ this.defaultSLogo = '';
193
+ this.disableEnrollBtn = false;
194
+ this.isAssessVisible = false;
195
+ this.isPracticeVisible = false;
196
+ this.certificateOpen = false;
197
+ this.courseCompleteState = 2;
198
+ this.dakshtaName = '';
199
+ this.cscmsUrl = '';
200
+ this.showBtn = false;
201
+ this.kparray = [];
202
+ this.enrollBtnLoading = false;
203
+ this.isAcbpCourse = false;
204
+ this.isAcbpClaim = false;
205
+ this.isClaimed = false;
206
+ this.monthlyCapExceed = false;
207
+ this.isCompletedThisMonth = false;
208
+ this.sourceEllipsis = false;
209
+ this.scrollLimit = 0;
210
+ this.rcElem = {
211
+ offSetTop: 0,
212
+ BottomPos: 0,
213
+ };
214
+ this.scrolled = false;
215
+ this.pathSet = new Set();
216
+ this.canShare = false;
217
+ this.enableShare = false;
218
+ this.contentCreatorData = [];
219
+ // randomlearnAdvisoryObj: any
220
+ // learnAdvisoryDataLength: any
221
+ this.destroySubject$ = new Subject();
222
+ this.isReleventBtnHovered = false;
223
+ this.SAKSHAMAI_ICON_NORMAL = '/assets/images/sakshamAI/ai-icon.svg';
224
+ this.SAKSHAMAI_ICON_LOADER = '/assets/images/sakshamAI/saksham_ai_loader.gif';
225
+ this.recommendedCoursesId = '';
226
+ this.preAssessmentCompletionStatus = false;
227
+ this.fromAITutor = false;
228
+ this.languageList = [
229
+ { name: "English", value: "English" },
230
+ { name: "ಕನ್ನಡ (Kannada)", value: "Kannada" },
231
+ { name: "తెలుగు (Telugu)", value: "Telugu" },
232
+ { name: "தமிழ் (Tamil)", value: "Tamil" },
233
+ { name: "മലയാളം (Malayalam)", value: "Malayalam" },
234
+ { name: "हिंदी (Hindi)", value: "Hindi" },
235
+ { name: "অসমীয়া (Assamese)", value: "Assamese" },
236
+ { name: "বাংলা (Bengali)", value: "Bengali" },
237
+ { name: "ગુજરાતી (Gujarati)", value: "Gujarati" },
238
+ { name: "मराठी (Marathi)", value: "Marathi" },
239
+ { name: "ଓଡିଆ (Odia)", value: "Odia" },
240
+ { name: "ਪੰਜਾਬੀ (Punjabi)", value: "Punjabi" },
241
+ { name: "कोंकणी (Konkani)", value: "Konkani" },
242
+ { name: "बड़ो (Bodo)", value: "Bodo" },
243
+ { name: "डोगरी (Dogri)", value: "Dogri" },
244
+ { name: "كشميري / कश्मीरी (Kashmiri)", value: "Kashmiri" },
245
+ { name: "मैथिली (Maithili)", value: "Maithili" },
246
+ { name: "মৈতৈলোন্ (Manipuri )", value: "Manipuri" },
247
+ { name: "नेपाली (Nepali)", value: "Nepali" },
248
+ { name: "संस्कृतम् (Sanskrit)", value: "Sanskrit" },
249
+ { name: "ᱥᱟᱱᱛᱟᱲᱤ (Santali)", value: "Santali" },
250
+ { name: "سنڌي / सिंधी (Sindhi)", value: "Sindhi" },
251
+ { name: "اُردُو (Urdu)", value: "Urdu" }
252
+ ];
253
+ this.environment = environment;
254
+ this.dakshtaName = this.environment.dakshtaName;
255
+ this.cscmsUrl = this.environment.cscmsUrl;
256
+ this.historyData = history.state;
257
+ this.handleBreadcrumbs();
258
+ this.mobileAppsSvc.mobileTopHeaderVisibilityStatus.next(true);
259
+ if (localStorage.getItem('websiteLanguage')) {
260
+ this.translate.setDefaultLang('en');
261
+ const lang = localStorage.getItem('websiteLanguage');
262
+ this.translate.use(lang);
263
+ }
264
+ this.loadCheckService.childComponentLoaded$.subscribe(_isLoaded => {
265
+ // Present in app-toc-about.component
266
+ if (document.getElementById('ratingsDiv')) {
267
+ setTimeout(() => {
268
+ const ratingsDiv = document.getElementById('ratingsDiv');
269
+ if (ratingsDiv) {
270
+ this.scrollLimit = ratingsDiv.getBoundingClientRect().bottom;
271
+ }
272
+ }, 500);
273
+ }
274
+ if (document.getElementById('contentContainer')) {
275
+ const contentDiv = document.getElementById('contentContainer');
276
+ if (contentDiv) {
277
+ this.scrollLimit = contentDiv.getBoundingClientRect().bottom;
278
+ }
279
+ }
280
+ });
281
+ this.handleClaimService.getClaimData().subscribe((_eventData) => {
282
+ this.onClickOfClaim(_eventData);
283
+ });
284
+ }
285
+ ngOnInit() {
286
+ this.dataTransferSvc.setEnrollData(null);
287
+ this.mobile1200 = window.innerWidth < 1201;
288
+ this.configSvc.languageTranslationFlag.subscribe((data) => {
289
+ if (data) {
290
+ if (localStorage.getItem('websiteLanguage')) {
291
+ this.translate.setDefaultLang('en');
292
+ const lang = localStorage.getItem('websiteLanguage');
293
+ this.translate.use(lang);
294
+ }
295
+ }
296
+ });
297
+ if (this.route.snapshot.data.pageData && this.route.snapshot.data.pageData.data) {
298
+ this.learnAdvisoryData = this.route.snapshot.data.pageData.data.learnerAdvisory;
299
+ // this.learnAdvisoryDataLength = this.learnAdvisoryData.length
300
+ }
301
+ this.getServerDateTime();
302
+ // this.displayRandomlearnAdvisoryData()
303
+ this.selectedBatchSubscription = this.tocSvc.getSelectedBatch.subscribe(batchData => {
304
+ this.selectedBatchData = batchData;
305
+ });
306
+ this.serverDateSubscription = this.tocSvc.serverDate.subscribe(serverDate => {
307
+ this.serverDate = serverDate;
308
+ });
309
+ this.channelId = this.telemetryService.telemetryConfig ? this.telemetryService.telemetryConfig.channel : '';
310
+ try {
311
+ this.isInIframe = window.self !== window.top;
312
+ }
313
+ catch (_ex) {
314
+ this.isInIframe = false;
315
+ }
316
+ if (this.route) {
317
+ this.skeletonLoader = true;
318
+ this.routeSubscription = this.route.data.subscribe(async (data) => {
319
+ if (data && data.content && data.content.data && data.content.data.identifier) {
320
+ this.courseID = data.content.data.identifier;
321
+ this.tocSvc.fetchGetContentData(data.content.data.identifier).subscribe(res => {
322
+ this.contentReadData = res.result.content;
323
+ console.log('this.contentReadData', this.contentReadData);
324
+ this.getPreAssessmentCompletionStatus();
325
+ }, (error) => {
326
+ if (!error.ok) {
327
+ this.matSnackBar.open('Unable to fetch content data, due to some error!');
328
+ }
329
+ });
330
+ const initData = this.tocSvc.initData(data, true);
331
+ this.content = initData.content;
332
+ if (this.forPreview) {
333
+ this.tocSvc.contentLoader.next(true);
334
+ await this.tocSvc.fetchCourseHeirarchy(this.content);
335
+ this.tocSvc.contentLoader.next(false);
336
+ this.tocSvc.checkModuleWiseData(this.content);
337
+ this.skeletonLoader = false;
338
+ }
339
+ else {
340
+ this.fetchUserEnrollmentData();
341
+ }
342
+ this.initialrouteData = data;
343
+ this.banners = data.pageData.data.banners;
344
+ this.tocSvc.subtitleOnBanners = data.pageData.data.subtitleOnBanners || false;
345
+ this.tocSvc.showDescription = data.pageData.data.showDescription || false;
346
+ this.tocConfig = data.pageData.data;
347
+ this.kparray = this.tocConfig.karmaPoints;
348
+ this.tocConfig = data.pageData.data;
349
+ this.kparray = this.tocConfig.karmaPoints;
350
+ if (this.content && this.isPostAssessment) {
351
+ this.tocSvc.fetchPostAssessmentStatus(this.content.identifier).subscribe(res => {
352
+ const assessmentData = res.result;
353
+ for (const o of assessmentData) {
354
+ if (o.contentId === (this.content && this.content.identifier)) {
355
+ this.showTakeAssessment = o;
356
+ break;
357
+ }
358
+ }
359
+ });
360
+ }
361
+ this.initData(data);
362
+ }
363
+ });
364
+ }
365
+ this.currentFragment = 'overview';
366
+ this.route.fragment.subscribe((fragment) => {
367
+ this.currentFragment = fragment || 'overview';
368
+ });
369
+ this.batchSubscription = this.tocSvc.batchReplaySubject.subscribe(() => {
370
+ this.fetchBatchDetails();
371
+ if (this.content && (this.content.primaryCategory === this.primaryCategory.BLENDED_PROGRAM)) {
372
+ this.fetchUserWFForBlended();
373
+ }
374
+ }, () => {
375
+ // tslint:disable-next-line: no-console
376
+ console.log('error on batchSubscription');
377
+ });
378
+ this.batchDataSubscription = this.tocSvc.setBatchDataSubject.subscribe(() => {
379
+ if (this.content && (this.content.primaryCategory === this.primaryCategory.BLENDED_PROGRAM)) {
380
+ this.fetchUserWFForBlended();
381
+ }
382
+ }, () => {
383
+ // tslint:disable-next-line: no-console
384
+ console.log('error on batchDataSubscription');
385
+ });
386
+ const instanceConfig = this.configSvc.instanceConfig;
387
+ if (instanceConfig && instanceConfig.logos && instanceConfig.logos.defaultSourceLogo) {
388
+ this.defaultSLogo = instanceConfig.logos.defaultSourceLogo;
389
+ }
390
+ if (this.configSvc.restrictedFeatures) {
391
+ this.isGoalsEnabled = !this.configSvc.restrictedFeatures.has('goals');
392
+ }
393
+ this.routeSubscription = this.route.queryParamMap.subscribe(async (qParamsMap) => {
394
+ const contextId = qParamsMap.get('contextId');
395
+ const contextPath = qParamsMap.get('contextPath');
396
+ const recommendedCoursesId = qParamsMap.get('recommendationId');
397
+ if (contextId && contextPath) {
398
+ this.contextId = contextId;
399
+ this.contextPath = contextPath;
400
+ }
401
+ if (recommendedCoursesId) {
402
+ this.recommendedCoursesId = recommendedCoursesId;
403
+ const response = await this.userServiceLib.getRecommendedCoursesSakshamAI(recommendedCoursesId).toPromise();
404
+ if (response.feedbacks.length) {
405
+ this.feedbackGiven = response.feedbacks.find((feedback) => feedback?.course_id === this.courseID);
406
+ }
407
+ }
408
+ if (recommendedCoursesId) {
409
+ this.recommendedCoursesId = recommendedCoursesId;
410
+ const response = await this.userServiceLib.getRecommendedCoursesSakshamAI(recommendedCoursesId).toPromise();
411
+ if (response.feedbacks.length) {
412
+ this.feedbackGiven = response.feedbacks.find((feedback) => feedback?.course_id === this.courseID);
413
+ }
414
+ }
415
+ });
416
+ if (this.configSvc.restrictedFeatures) {
417
+ this.isRegistrationSupported = this.configSvc.restrictedFeatures.has('registrationExternal');
418
+ this.showIntranetMessage = !this.configSvc.restrictedFeatures.has('showIntranetMessageDesktop');
419
+ }
420
+ this.checkRegistrationStatus();
421
+ this.routerParamSubscription = this.router.events.subscribe((routerEvent) => {
422
+ if (routerEvent instanceof NavigationEnd) {
423
+ this.assignPathAndUpdateBanner(routerEvent.url);
424
+ }
425
+ });
426
+ if (this.content) {
427
+ const contentName = this.content.name.trim();
428
+ if (this.content.creatorContacts) {
429
+ this.contentCreatorData = this.handleParseJsonData(this.content.creatorContacts);
430
+ }
431
+ if ((contentName).toLowerCase() === this.dakshtaName.toLowerCase()) {
432
+ this.showBtn = true;
433
+ }
434
+ else {
435
+ this.showBtn = false;
436
+ }
437
+ this.btnPlaylistConfig = {
438
+ contentId: this.content.identifier,
439
+ contentName: this.content.name,
440
+ contentType: this.content.contentType,
441
+ primaryCategory: this.content.primaryCategory,
442
+ mode: 'dialog',
443
+ };
444
+ this.btnGoalsConfig = {
445
+ contentId: this.content.identifier,
446
+ contentName: this.content.name,
447
+ contentType: this.content.contentType,
448
+ primaryCategory: this.content.primaryCategory,
449
+ };
450
+ }
451
+ if (this.content && ![
452
+ NsContent.ECourseCategory.MODERATED_COURSE,
453
+ NsContent.ECourseCategory.MODERATED_ASSESSEMENT,
454
+ NsContent.ECourseCategory.MODERATED_PROGRAM,
455
+ NsContent.ECourseCategory.INVITE_ONLY_PROGRAM,
456
+ ].includes(this.content.courseCategory)) {
457
+ this.canShare = true;
458
+ if (this.configSvc.userProfile) {
459
+ this.rootOrgId = this.configSvc.userProfile.rootOrgId;
460
+ }
461
+ }
462
+ }
463
+ // displayRandomlearnAdvisoryData(): void {
464
+ // const randomIndex = Math.floor(Math.random() * this.learnAdvisoryData.length)
465
+ // this.randomlearnAdvisoryObj = this.learnAdvisoryData[randomIndex]
466
+ // }
467
+ getKarmapointsLimit() {
468
+ if (!this.forPreview) {
469
+ this.contentSvc.userKarmaPoints().subscribe((res) => {
470
+ if (res && res.kpList) {
471
+ const info = res.kpList.addinfo;
472
+ if (info) {
473
+ this.monthlyCapExceed = JSON.parse(info).claimedNonACBPCourseKarmaQuota >= 4;
474
+ }
475
+ }
476
+ });
477
+ }
478
+ }
479
+ isCourseCompletedOnThisMonth() {
480
+ const now = moment(this.serverDate).format('YYYY-MM-DD');
481
+ if (this.content) {
482
+ const courseData = this.enrolledCourseData;
483
+ if (courseData && courseData.completionPercentage === 100 && courseData.completedOn) {
484
+ const completedOn = moment(courseData.completedOn).format('YYYY-MM-DD');
485
+ const completedMonth = moment(completedOn, 'YYYY-MM-DD').month();
486
+ const currentMonth = moment(now, 'YYYY-MM-DD').month();
487
+ this.isCompletedThisMonth = completedMonth === currentMonth;
488
+ this.content['viewMore'] = false;
489
+ this.content['completedOn'] = courseData.completedOn;
490
+ }
491
+ }
492
+ }
493
+ filteredAcbpList(res) {
494
+ return res.filter((v) => v.identifier === this.courseID);
495
+ }
496
+ findACPB() {
497
+ const localCbp = localStorage.getItem('cbpData');
498
+ if (localCbp) {
499
+ const storeageCbp = JSON.parse(localCbp);
500
+ const cbp = this.filteredAcbpList(storeageCbp);
501
+ if (cbp.length) {
502
+ const acbp = 'cbPlan';
503
+ this.cbPlanEndDate = cbp[0].endDate;
504
+ const sDate = dayjs(this.serverDate).format('YYYY-MM-DD');
505
+ const daysCount = dayjs(this.cbPlanEndDate).diff(this.serverDate, 'day');
506
+ this.cbPlanDuration = daysCount < 0 ? NsCardContent.ACBPConst.OVERDUE : daysCount > 29
507
+ ? NsCardContent.ACBPConst.SUCCESS : NsCardContent.ACBPConst.UPCOMING;
508
+ if (acbp && this.cbPlanEndDate && acbp === 'cbPlan') {
509
+ this.isAcbpCourse = true;
510
+ const eDate = dayjs(this.cbPlanEndDate).format('YYYY-MM-DD');
511
+ if (dayjs(sDate).isSameOrBefore(eDate)) {
512
+ const requestObj = {
513
+ request: {
514
+ filters: {
515
+ contextType: 'Course',
516
+ contextId: this.courseID,
517
+ },
518
+ },
519
+ };
520
+ this.contentSvc.getCourseKarmaPoints(requestObj).subscribe((res) => {
521
+ if (res && res.kpList) {
522
+ const row = res.kpList;
523
+ if (row.addinfo) {
524
+ if (JSON.parse(row.addinfo).ACBP) {
525
+ this.isAcbpClaim = false;
526
+ this.isClaimed = true;
527
+ }
528
+ else {
529
+ this.isAcbpClaim = true;
530
+ }
531
+ }
532
+ else {
533
+ this.isAcbpClaim = true;
534
+ }
535
+ }
536
+ else {
537
+ this.isAcbpClaim = true;
538
+ }
539
+ });
540
+ }
541
+ }
542
+ }
543
+ }
544
+ }
545
+ raiseTelemeteryForProvider(providerName, prividerId) {
546
+ this.events.raiseInteractTelemetry({
547
+ type: 'click',
548
+ id: 'btn-provider',
549
+ }, {
550
+ id: providerName,
551
+ type: prividerId,
552
+ }, {
553
+ pageIdExt: 'btn-provider',
554
+ module: WsEvents.EnumTelemetrymodules.CONTENT,
555
+ });
556
+ }
557
+ raiseTelemetry() {
558
+ this.events.raiseInteractTelemetry({
559
+ type: 'click',
560
+ subType: 'karmapoints-claim',
561
+ id: this.courseID,
562
+ }, {
563
+ id: this.courseID,
564
+ type: 'course',
565
+ }, {
566
+ pageIdExt: 'btn-acbp-claim',
567
+ module: WsEvents.EnumTelemetrymodules.KARMAPOINTS,
568
+ });
569
+ }
570
+ onClickOfClaim(event) {
571
+ // tslint:disable:no-console
572
+ console.log(event);
573
+ const request = {
574
+ userId: this.configSvc.unMappedUser.identifier,
575
+ courseId: this.courseID,
576
+ };
577
+ this.raiseTelemetry();
578
+ this.contentSvc.claimKarmapoints(request).subscribe((res) => {
579
+ // tslint:disable:no-console
580
+ console.log(res);
581
+ this.isClaimed = true;
582
+ this.openSnackbar('Karma points are successfully claimed.');
583
+ // this.getUserEnrollmentList()
584
+ this.checkIfUserEnrolled();
585
+ }, (error) => {
586
+ // tslint:disable:no-console
587
+ console.log(error);
588
+ this.openSnackbar('something went wrong.');
589
+ });
590
+ }
591
+ ngAfterViewInit() {
592
+ if (this.rcElement) {
593
+ this.rcElem.BottomPos = this.rcElement.nativeElement.offsetTop + this.rcElement.nativeElement.offsetHeight;
594
+ this.rcElem.offSetTop = this.rcElement.nativeElement.offsetTop;
595
+ }
596
+ // Get Time for the batch
597
+ this.timerUnsubscribe = this.timerService.getTimerData()
598
+ .pipe(takeUntil(this.destroySubject$))
599
+ .subscribe((_timer) => {
600
+ this.timer = _timer;
601
+ });
602
+ }
603
+ handleBreadcrumbs() {
604
+ if (this.historyData) {
605
+ if (this.historyData.path === 'Search') {
606
+ const searchurl = `/app/globalsearch`;
607
+ const qParam = {
608
+ q: this.historyData.param,
609
+ };
610
+ // tslint:disable-next-line:max-line-length
611
+ this.breadcrumbs = { url: 'home', titles: [{ title: 'Search', url: searchurl, queryParams: qParam }, { title: 'Details', url: 'none' }] };
612
+ }
613
+ else if (this.historyData.path === 'competency-details') {
614
+ const finalUrl = `/app/learn/browse-by/competency/${this.historyData.param}`;
615
+ // tslint:disable-next-line: max-line-length
616
+ this.breadcrumbs = { url: 'home', titles: [{ title: this.historyData.param, url: finalUrl }, { title: 'Details', url: 'none' }] };
617
+ }
618
+ else if (this.historyData.path === 'all-CBP') {
619
+ const finalURL = `/app/learn/browse-by/provider/${this.historyData.param}`;
620
+ this.breadcrumbs = { url: 'home', titles: [{ title: `all CBP's`, url: finalURL }, { title: 'Details', url: 'none' }] };
621
+ }
622
+ else if (this.historyData.path === 'all-competencies') {
623
+ const finalUrl = `/app/learn/browse-by/competency/all-competencies`;
624
+ // tslint:disable-next-line: max-line-length
625
+ this.breadcrumbs = { url: 'home', titles: [{ title: 'all competencies', url: finalUrl }, { title: 'Details', url: 'none' }] };
626
+ }
627
+ else if (this.historyData.path === 'curatedCollections') {
628
+ const finalUrl = `/app/curatedCollections/home`;
629
+ // tslint:disable-next-line: max-line-length
630
+ this.breadcrumbs = { url: 'home', titles: [{ title: 'curated collections', url: finalUrl }, { title: 'Details', url: 'none' }] };
631
+ }
632
+ else {
633
+ // tslint:disable-next-line:max-line-length
634
+ this.breadcrumbs = { url: 'home', titles: [{ title: 'Learn', url: '/page/learn', icon: 'school' }, { title: 'Details', url: 'none' }] };
635
+ }
636
+ }
637
+ }
638
+ ngAfterViewChecked() {
639
+ try {
640
+ if (this.fragment) {
641
+ // tslint:disable-next-line: no-non-null-assertion
642
+ document.querySelector(`#${this.fragment}`).scrollTo({
643
+ top: 80,
644
+ behavior: 'smooth',
645
+ });
646
+ }
647
+ }
648
+ catch (e) { }
649
+ }
650
+ get enableAnalytics() {
651
+ if (this.configSvc.restrictedFeatures) {
652
+ return !this.configSvc.restrictedFeatures.has('tocAnalytics');
653
+ }
654
+ return false;
655
+ }
656
+ get isResource() {
657
+ if (this.content) {
658
+ const isResource = this.content.primaryCategory === NsContent.EPrimaryCategory.KNOWLEDGE_ARTIFACT ||
659
+ this.content.primaryCategory === NsContent.EPrimaryCategory.RESOURCE
660
+ || this.content.primaryCategory === NsContent.EPrimaryCategory.PRACTICE_RESOURCE
661
+ || this.content.primaryCategory === NsContent.EPrimaryCategory.FINAL_ASSESSMENT
662
+ || this.content.primaryCategory === NsContent.EPrimaryCategory.COMP_ASSESSMENT
663
+ || this.content.primaryCategory === NsContent.EPrimaryCategory.OFFLINE_SESSION
664
+ || !(this.content.children && this.content.children.length);
665
+ if (isResource) {
666
+ this.mobileAppsSvc.sendViewerData(this.content);
667
+ }
668
+ return isResource;
669
+ }
670
+ return false;
671
+ }
672
+ get getStartDate() {
673
+ if (this.enrolledCourseData) {
674
+ const now = new Date().getTime();
675
+ // const batch = _.first(_.filter(this.content['batches'], { batchId: this.currentCourseBatchId }) || [])
676
+ const batch = this.enrolledCourseData.batch;
677
+ this.currentCourseBatchId = batch.batchId;
678
+ if (batch && this.currentCourseBatchId) {
679
+ this.startDate = (_.get(batch, 'startDate'));
680
+ // const parsedDate = moment(this.startDate);
681
+ // const dateOnly = parsedDate.clone().startOf('day');
682
+ const startDateTime = this.startDate && new Date(this.startDate).getTime();
683
+ this.startDateDifference = startDateTime - now;
684
+ if (this.startDateDifference && this.startDateDifference > 0) {
685
+ const days = Math.floor(this.startDateDifference / (1000 * 60 * 60 * 24));
686
+ const hours = Math.floor((this.startDateDifference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
687
+ const minutes = Math.floor((this.startDateDifference % (1000 * 60 * 60)) / (1000 * 60));
688
+ return (`${days} Days : ${hours} Hours : ${minutes} Minutes`);
689
+ }
690
+ return 'NA';
691
+ }
692
+ return 'NA';
693
+ // if (_.get(batch, 'startDate') && moment(_.get(batch, 'startDate')).isAfter()) {
694
+ // return moment(_.get(batch, 'startDate')).from(now)
695
+ // }
696
+ // if (_.get(batch, 'endDate') && moment(_.get(batch, 'endDate')).isBefore()) {
697
+ // return 'NA'
698
+ // }
699
+ // if (startDateTime && moment(startDateTime).isAfter()) {
700
+ // return moment(startDateTime).from(now)
701
+ // }
702
+ // if (endDateTime && moment(endDateTime).isBefore()) {
703
+ // return 'NA'
704
+ // }
705
+ // return 'NA'
706
+ }
707
+ return 'NA';
708
+ }
709
+ get isBatchInProgress() {
710
+ // if (this.content && this.content['batches']) {
711
+ // const batches = this.content['batches'] as NsContent.IBatch
712
+ // if (this.currentCourseBatchId) {
713
+ // // const now = moment().format('YYYY-MM-DD HH:mm:ss')
714
+ // const now = new Date().getTime()
715
+ // if (this.batchData && this.batchData.content) {
716
+ // const batch = _.first(_.filter(this.batchData.content, { batchId: this.currentCourseBatchId }) || [])
717
+ // if (batch) {
718
+ // // const startDate = moment(batch.startDate).format('YYYY-MM-DD HH:mm:ss')
719
+ // // const endDate = batch.endDate ? moment(batch.endDate).format('YYYY-MM-DD HH:mm:ss') : now
720
+ // // return (
721
+ // // // batch.status &&
722
+ // // moment(startDate).isSameOrBefore(now)
723
+ // // && moment(endDate).isSameOrAfter(now)
724
+ // // )
725
+ // this.startDate = batch && (_.get(batch, 'startTime'))
726
+ // this.endDate = batch && (_.get(batch, 'endTime'))
727
+ // const endDateTime = new Date(this.endDate).getTime()
728
+ // this.endDateDifference = endDateTime - now
729
+ // if(this.endDateDifference > 0) {
730
+ // return batch.status
731
+ // }
732
+ // }
733
+ // return false
734
+ // }
735
+ // return false
736
+ // } return false
737
+ if (this.enrolledCourseData) {
738
+ const now = new Date().getTime();
739
+ const batch = this.enrolledCourseData.batch;
740
+ this.currentCourseBatchId = batch.batchId;
741
+ if (batch && this.currentCourseBatchId) {
742
+ this.startDate = (_.get(batch, 'startDate'));
743
+ this.endDate = (_.get(batch, 'endDate'));
744
+ if (this.endDate) {
745
+ const startDateTime = this.startDate && new Date(this.startDate).getTime();
746
+ let endDate = this.endDate && new Date(this.endDate);
747
+ endDate.setHours(23, 59, 59, 999);
748
+ const endDateTime = endDate.getTime();
749
+ this.startDateDifference = now - startDateTime;
750
+ this.endDateDifference = endDateTime - now;
751
+ if (this.endDateDifference > 0 && this.startDateDifference > 0 && batch.status !== 2) {
752
+ return true;
753
+ }
754
+ return false;
755
+ }
756
+ return true;
757
+ }
758
+ return false;
759
+ }
760
+ return false;
761
+ }
762
+ initData(data) {
763
+ const initData = this.tocSvc.initData(data, true);
764
+ this.errorCode = initData.errorCode;
765
+ switch (this.errorCode) {
766
+ case NsAppToc.EWsTocErrorCode.API_FAILURE: {
767
+ this.errorWidgetData.widgetData.errorType = ErrorType.internalServer;
768
+ break;
769
+ }
770
+ case NsAppToc.EWsTocErrorCode.INVALID_DATA: {
771
+ this.errorWidgetData.widgetData.errorType = ErrorType.internalServer;
772
+ break;
773
+ }
774
+ case NsAppToc.EWsTocErrorCode.NO_DATA: {
775
+ this.errorWidgetData.widgetData.errorType = ErrorType.internalServer;
776
+ break;
777
+ }
778
+ default: {
779
+ this.errorWidgetData.widgetData.errorType = ErrorType.somethingWrong;
780
+ break;
781
+ }
782
+ }
783
+ if (!this.forPreview) {
784
+ this.getUserRating(false);
785
+ // this.getUserEnrollmentList()
786
+ }
787
+ this.body = this.domSanitizer.bypassSecurityTrustHtml(this.content && this.content.body
788
+ ? this.forPreview
789
+ ? this.authAccessControlSvc.proxyToAuthoringUrl(this.content.body)
790
+ : this.content.body
791
+ : '');
792
+ this.contentParents = {};
793
+ this.tocStructure = {
794
+ assessment: 0,
795
+ course: 0,
796
+ handsOn: 0,
797
+ interactiveVideo: 0,
798
+ learningModule: 0,
799
+ other: 0,
800
+ pdf: 0,
801
+ survey: 0,
802
+ podcast: 0,
803
+ practiceTest: 0,
804
+ finalTest: 0,
805
+ quiz: 0,
806
+ video: 0,
807
+ webModule: 0,
808
+ webPage: 0,
809
+ youtube: 0,
810
+ interactivecontent: 0,
811
+ offlineSession: 0,
812
+ };
813
+ if (this.content) {
814
+ this.hasTocStructure = false;
815
+ this.tocStructure.learningModule = this.content.primaryCategory === this.primaryCategory.MODULE ? -1 : 0;
816
+ this.tocStructure.course = this.content.primaryCategory === this.primaryCategory.COURSE ? -1 : 0;
817
+ this.tocStructure = this.tocSvc.getTocStructure(this.content, this.tocStructure);
818
+ for (const progType in this.tocStructure) {
819
+ if (this.tocStructure[progType] > 0) {
820
+ this.hasTocStructure = true;
821
+ break;
822
+ }
823
+ }
824
+ // from ngOnChanges
825
+ this.fetchExternalContentAccess();
826
+ this.modifySensibleContentRating();
827
+ this.assignPathAndUpdateBanner(this.router.url);
828
+ this.getLearningUrls();
829
+ }
830
+ this.actionSVC.getUpdateCompGroupO.subscribe((res) => {
831
+ this.resumeDataLink = res;
832
+ });
833
+ if (this.content && this.isPostAssessment) {
834
+ this.tocSvc.fetchPostAssessmentStatus(this.content.identifier).subscribe(res => {
835
+ const assessmentData = res.result;
836
+ for (const o of assessmentData) {
837
+ if (o.contentId === (this.content && this.content.identifier)) {
838
+ this.showTakeAssessment = o;
839
+ break;
840
+ }
841
+ }
842
+ });
843
+ }
844
+ // from ngOnChanges
845
+ this.batchControl.valueChanges.subscribe((batch) => {
846
+ this.disableEnrollBtn = true;
847
+ let userId = '';
848
+ if (batch) {
849
+ if (this.configSvc.userProfile) {
850
+ userId = this.configSvc.userProfile.userId || '';
851
+ }
852
+ const req = {
853
+ request: {
854
+ userId,
855
+ courseId: batch.courseId,
856
+ batchId: batch.batchId,
857
+ },
858
+ };
859
+ this.contentSvc.enrollUserToBatch(req).then((datab) => {
860
+ if (datab && datab.result && datab.result.response === 'SUCCESS') {
861
+ this.batchData = {
862
+ content: [batch],
863
+ enrolled: true,
864
+ };
865
+ this.tocSvc.getSelectedBatchData(this.batchData);
866
+ this.tocSvc.mapSessionCompletionPercentage(this.batchData);
867
+ this.router.navigate([], {
868
+ relativeTo: this.route,
869
+ queryParams: { batchId: batch.batchId },
870
+ queryParamsHandling: 'merge',
871
+ });
872
+ this.openSnackbar('Enrolled Successfully!');
873
+ this.disableEnrollBtn = false;
874
+ }
875
+ else {
876
+ this.openSnackbar('Something went wrong, please try again later!');
877
+ this.disableEnrollBtn = false;
878
+ }
879
+ });
880
+ }
881
+ });
882
+ this.tocSvc.contentLoader.next(false);
883
+ }
884
+ getUserRating(fireUpdate) {
885
+ if (!this.forPreview) {
886
+ if (this.configSvc.userProfile) {
887
+ this.userId = this.configSvc.userProfile.userId || '';
888
+ }
889
+ if (this.content && this.content.identifier && this.content.primaryCategory) {
890
+ this.ratingSvc.getRating(this.content.identifier, this.content.primaryCategory, this.userId).subscribe((res) => {
891
+ if (res && res.result && res.result.response) {
892
+ this.userRating = res.result.response;
893
+ if (fireUpdate) {
894
+ this.tocSvc.changeUpdateReviews(true);
895
+ }
896
+ }
897
+ this.contentViewEventForNetCore('view');
898
+ }, (err) => {
899
+ this.loggerSvc.error('USER RATING FETCH ERROR >', err);
900
+ });
901
+ }
902
+ }
903
+ setTimeout(() => {
904
+ if (this.contentSource && this.contentSource.nativeElement.offsetHeight > 44) {
905
+ this.sourceEllipsis = true;
906
+ }
907
+ }, 250);
908
+ }
909
+ // private getUserEnrollmentList() {
910
+ // this.enrollBtnLoading = true
911
+ // this.tocSvc.contentLoader.next(true)
912
+ // // tslint:disable-next-line
913
+ // if (this.content && this.content.identifier && this.content.primaryCategory !== this.primaryCategory.COURSE &&
914
+ // this.content.primaryCategory !== this.primaryCategory.PROGRAM &&
915
+ // this.content.primaryCategory !== this.primaryCategory.MANDATORY_COURSE_GOAL &&
916
+ // this.content.primaryCategory !== this.primaryCategory.STANDALONE_ASSESSMENT &&
917
+ // this.content.primaryCategory !== this.primaryCategory.BLENDED_PROGRAM &&
918
+ // this.content.primaryCategory !== this.primaryCategory.CURATED_PROGRAM) {
919
+ // // const collectionId = this.isResource ? '' : this.content.identifier
920
+ // return this.getContinueLearningData(this.content.identifier)
921
+ // }
922
+ // this.userEnrollmentList = []
923
+ // let userId: any
924
+ // if (this.configSvc.userProfile) {
925
+ // userId = this.configSvc.userProfile.userId || ''
926
+ // }
927
+ // this.userSvc.fetchUserBatchList(userId).toPromise().then(
928
+ // async (result: any) => {
929
+ // const courses: NsContent.ICourse[] = result && result.courses
930
+ // this.userEnrollmentList = courses
931
+ // let enrolledCourse: NsContent.ICourse | undefined
932
+ // if (this.content && this.content.identifier && !this.forPreview) {
933
+ // if (courses && courses.length) {
934
+ // enrolledCourse = courses.find((course: any) => {
935
+ // const identifier = this.content && this.content.identifier || ''
936
+ // if (course.courseId !== identifier) {
937
+ // return undefined
938
+ // }
939
+ // return course
940
+ // })
941
+ // }
942
+ // // If current course is present in the list of user enrolled course
943
+ // if (enrolledCourse && enrolledCourse.batchId) {
944
+ // this.resumeDataSubscription = this.tocSvc.resumeData.subscribe((res: any) => {
945
+ // if (res) {
946
+ // this.resumeData = res
947
+ // this.getLastPlayedResource()
948
+ // this.generateResumeDataLinkNew()
949
+ // }
950
+ // })
951
+ // this.tocSvc.checkModuleWiseData(this.content)
952
+ // this.enrolledCourseData = enrolledCourse
953
+ // this.isCourseCompletedOnThisMonth()
954
+ // this.currentCourseBatchId = enrolledCourse.batchId
955
+ // // this.downloadCert(enrolledCourse.issuedCertificates)
956
+ // if (enrolledCourse && enrolledCourse.issuedCertificates &&
957
+ // enrolledCourse.issuedCertificates.length) {
958
+ // const certificate: any = enrolledCourse.issuedCertificates.sort((a: any, b: any) =>
959
+ // new Date(b.lastIssuedOn).getTime() - new Date(a.lastIssuedOn).getTime())
960
+ // const certId = certificate[0].identifier
961
+ // this.certId = certId
962
+ // if (this.content) {
963
+ // this.content['certificateObj'] = {
964
+ // certId,
965
+ // certData: '',
966
+ // }
967
+ // }
968
+ // }
969
+ // this.content.completionPercentage = enrolledCourse.completionPercentage || 0
970
+ // this.content.completionStatus = enrolledCourse.status || 0
971
+ // if (this.contentReadData && this.contentReadData.cumulativeTracking) {
972
+ // await this.tocSvc.mapCompletionPercentageProgram(this.content, this.userEnrollmentList)
973
+ // this.resumeDataSubscription = this.tocSvc.resumeData.subscribe((res: any) => {
974
+ // if (res) {
975
+ // this.resumeData = res
976
+ // this.getLastPlayedResource()
977
+ // this.generateResumeDataLinkNew()
978
+ // }
979
+ // })
980
+ // this.enrollBtnLoading = false
981
+ // // this.tocSvc.contentLoader.next(false)
982
+ // } else {
983
+ // this.getContinueLearningData(this.content.identifier, enrolledCourse.batchId)
984
+ // this.content['completionPercentage'] = enrolledCourse.completionPercentage
985
+ // this.enrollBtnLoading = false
986
+ // this.tocSvc.mapModuleCount(this.content)
987
+ // // this.tocSvc.contentLoader.next(false)
988
+ // }
989
+ // this.batchData = {
990
+ // content: [enrolledCourse.batch],
991
+ // enrolled: true,
992
+ // }
993
+ // this.tocSvc.setBatchData(this.batchData)
994
+ // this.tocSvc.getSelectedBatchData(this.batchData)
995
+ // this.tocSvc.mapSessionCompletionPercentage(this.batchData, this.resumeData)
996
+ // if (this.getBatchId()) {
997
+ // this.router.navigate(
998
+ // [],
999
+ // {
1000
+ // relativeTo: this.route,
1001
+ // queryParams: { batchId: this.getBatchId() },
1002
+ // queryParamsHandling: 'merge',
1003
+ // })
1004
+ // }
1005
+ // } else {
1006
+ // this.tocSvc.checkModuleWiseData(this.content)
1007
+ // this.tocSvc.mapModuleCount(this.content)
1008
+ // // It's understood that user is not already enrolled
1009
+ // // Fetch the available batches and present to user
1010
+ // if (this.content.primaryCategory === this.primaryCategory.COURSE
1011
+ // || this.content.primaryCategory !== this.primaryCategory.PROGRAM) {
1012
+ // // Disabling auto enrollment to batch
1013
+ // if (this.content.primaryCategory === this.primaryCategory.BLENDED_PROGRAM) {
1014
+ // this.fetchBatchDetails()
1015
+ // }
1016
+ // } else {
1017
+ // this.fetchBatchDetails()
1018
+ // }
1019
+ // this.tocSvc.callHirarchyProgressHashmap(this.content)
1020
+ // this.enrollBtnLoading = false
1021
+ // // this.tocSvc.contentLoader.next(false)
1022
+ // }
1023
+ // }
1024
+ // // console.log('calling ---------------- =========')
1025
+ // // this.getLastPlayedResource()
1026
+ // },
1027
+ // (error: any) => {
1028
+ // this.loggerSvc.error('CONTENT HISTORY FETCH ERROR >', error)
1029
+ // },
1030
+ // )
1031
+ // }
1032
+ fetchUserWFForBlended() {
1033
+ const applicationIds = (this.batchData && this.batchData.content && this.batchData.content.map(e => e.batchId)) || [];
1034
+ const req = {
1035
+ applicationIds,
1036
+ serviceName: 'blendedprogram',
1037
+ limit: 100,
1038
+ offset: 0,
1039
+ };
1040
+ this.contentSvc.fetchBlendedUserWF(req).then((data) => {
1041
+ if (data && data.result && data.result.data.length) {
1042
+ const latestWF = _.maxBy(data.result.data[0].wfInfo, (el) => {
1043
+ return new Date(el.lastUpdatedOn).getTime();
1044
+ });
1045
+ // latestWF.currentStatus = this.WFBlendedProgramStatus.REJECTED
1046
+ /* tslint:disable-next-line */
1047
+ this.batchData.workFlow = {
1048
+ wfInitiated: true,
1049
+ /* tslint:disable-next-line */
1050
+ batch: this.batchData && this.batchData.content && this.batchData.content.find((e) => e.batchId === latestWF.applicationId),
1051
+ wfItem: latestWF,
1052
+ };
1053
+ this.tocSvc.setWFData(this.batchData);
1054
+ }
1055
+ this.loggerSvc.info('fetchBlendedUserWF data == ', data);
1056
+ }, (error) => {
1057
+ this.loggerSvc.error('CONTENT HISTORY FETCH ERROR >', error);
1058
+ });
1059
+ }
1060
+ checkIfBatchExists(latest) {
1061
+ if (!this.batchData || !this.batchData.content) {
1062
+ return false;
1063
+ }
1064
+ return this.batchData.content.find(b => b.batchId === latest.batchId);
1065
+ }
1066
+ getBatchId() {
1067
+ let batchId = '';
1068
+ if (this.batchData && this.batchData.content) {
1069
+ for (const batch of this.batchData.content) {
1070
+ batchId = batch.batchId;
1071
+ }
1072
+ }
1073
+ return batchId;
1074
+ }
1075
+ // downloadCert(certIdArr: any) {
1076
+ // if (certIdArr && certIdArr.length && certIdArr.length > 0) {
1077
+ // certIdArr.sort((a: any, b: any) => new Date(b.lastIssuedOn).getTime() - new Date(a.lastIssuedOn).getTime())
1078
+ // const certId = certIdArr[0].identifier
1079
+ // this.certId = certId
1080
+ // this.contentSvc.downloadCert(certId).subscribe(response => {
1081
+ // if (this.content) {
1082
+ // this.content['certificateObj'] = {
1083
+ // certData: response.result.printUri,
1084
+ // certId: this.certId,
1085
+ // }
1086
+ // }
1087
+ // })
1088
+ // }
1089
+ // }
1090
+ handleAutoBatchAssign() {
1091
+ if (this.forPreview) {
1092
+ this.navigateToPlayerPage('');
1093
+ }
1094
+ else {
1095
+ this.enrollBtnLoading = true;
1096
+ this.changeTab = !this.changeTab;
1097
+ this.raiseEnrollTelemetry();
1098
+ if (this.recommendedCoursesId) {
1099
+ this.raiseEnrollTelementryForSakshamAIGenerated();
1100
+ }
1101
+ if (this.recommendedCoursesId) {
1102
+ this.raiseEnrollTelementryForSakshamAIGenerated();
1103
+ }
1104
+ const batchData = this.contentReadData && this.contentReadData.batches && this.contentReadData.batches[0];
1105
+ if (this.content && this.content.primaryCategory === NsContent.EPrimaryCategory.CURATED_PROGRAM) {
1106
+ this.autoEnrollCuratedProgram(NsContent.ECourseCategory.CURATED_PROGRAM, batchData);
1107
+ }
1108
+ else if (this.content && this.content.courseCategory === NsContent.ECourseCategory.MODERATED_PROGRAM) {
1109
+ let moderatedBatchData;
1110
+ if (this.batchData && this.batchData.content && this.batchData.content.length > 1) {
1111
+ moderatedBatchData = this.selectedBatchData && this.selectedBatchData.content && this.selectedBatchData.content[0];
1112
+ }
1113
+ else {
1114
+ moderatedBatchData = this.batchData && this.batchData.content && this.batchData.content[0];
1115
+ }
1116
+ this.autoEnrollCuratedProgram(NsContent.ECourseCategory.MODERATED_PROGRAM, moderatedBatchData);
1117
+ }
1118
+ else {
1119
+ this.autoAssignEnroll();
1120
+ }
1121
+ }
1122
+ this.contentViewEventForNetCore('enroll');
1123
+ }
1124
+ autoEnrollCuratedProgram(programType, batchData) {
1125
+ if (this.content && this.content.identifier) {
1126
+ let userId = '';
1127
+ if (this.configSvc.userProfile && this.configSvc.userProfile.userId) {
1128
+ userId = this.configSvc.userProfile.userId;
1129
+ }
1130
+ const req = {
1131
+ request: {
1132
+ userId,
1133
+ programId: this.content.identifier,
1134
+ // as of now curated program only one batch is coming need to check and modify
1135
+ batchId: batchData.batchId,
1136
+ },
1137
+ };
1138
+ this.contentSvc.autoAssignCuratedBatchApi(req, programType).subscribe((data) => {
1139
+ if (data) {
1140
+ if (programType === NsContent.ECourseCategory.MODERATED_PROGRAM && batchData.endDate) {
1141
+ this.batchData = {
1142
+ content: [batchData],
1143
+ enrolled: true,
1144
+ };
1145
+ this.router.navigate([], {
1146
+ relativeTo: this.route,
1147
+ queryParams: { batchId: batchData.batchId },
1148
+ queryParamsHandling: 'merge',
1149
+ });
1150
+ setTimeout(() => {
1151
+ // this.getUserEnrollmentList()
1152
+ this.checkIfUserEnrolled();
1153
+ }, 2000);
1154
+ }
1155
+ else {
1156
+ this.navigateToPlayerPage(req.request.batchId);
1157
+ }
1158
+ }
1159
+ }, (_error) => {
1160
+ // console.log('_error', _error)
1161
+ // if(_error && _error.error && _error.error.params && _error.error.params.err && _error.error.params.err.errmsg) {
1162
+ this.snackBar.open(_.get(_error, 'error.params.errmsg') || 'Please try again later');
1163
+ // }
1164
+ this.enrollBtnLoading = false;
1165
+ });
1166
+ }
1167
+ }
1168
+ autoAssignEnroll() {
1169
+ if (this.content && this.content.identifier) {
1170
+ this.contentSvc.autoAssignBatchApi(this.content.identifier).subscribe((data) => {
1171
+ this.batchData = {
1172
+ content: data.content,
1173
+ enrolled: true,
1174
+ };
1175
+ const batchId = this.getBatchId();
1176
+ if (batchId) {
1177
+ this.navigateToPlayerPage(batchId);
1178
+ }
1179
+ }, (_error) => {
1180
+ this.snackBar.open(_.get(_error, 'error.params.errmsg') || 'Please try again later');
1181
+ this.enrollBtnLoading = false;
1182
+ });
1183
+ }
1184
+ }
1185
+ navigateToPlayerPage(batchId) {
1186
+ if (this.content) {
1187
+ this.enrollBtnLoading = true;
1188
+ const firstPlayableContent = this.contentSvc.getFirstChildInHierarchy(this.content);
1189
+ let primaryCategory;
1190
+ if (this.content.secureSettings !== undefined) {
1191
+ primaryCategory = 'Learning Resource';
1192
+ }
1193
+ else {
1194
+ primaryCategory = firstPlayableContent.primaryCategory || this.content.primaryCategory;
1195
+ }
1196
+ this.firstResourceLink = viewerRouteGenerator(firstPlayableContent.identifier, firstPlayableContent.mimeType, this.isResource ? undefined : this.content.identifier, this.isResource ? undefined : this.content.contentType, this.forPreview, primaryCategory, batchId);
1197
+ this.router.navigate([`${this.firstResourceLink.url}`], { queryParams: { ...this.firstResourceLink.queryParams, fromAITutor: this.fromAITutor } });
1198
+ }
1199
+ }
1200
+ fetchBatchDetails() {
1201
+ if (this.content && this.content.identifier) {
1202
+ const req = {
1203
+ request: {
1204
+ filters: {
1205
+ courseId: this.content.identifier,
1206
+ status: ['0', '1', '2'],
1207
+ // createdBy: 'fca2925f-1eee-4654-9177-fece3fd6afc9',
1208
+ },
1209
+ sort_by: { createdDate: 'desc' },
1210
+ },
1211
+ };
1212
+ this.contentSvc.fetchCourseBatches(req).subscribe((data) => {
1213
+ this.batchData = data;
1214
+ this.batchData.enrolled = false;
1215
+ this.tocSvc.setBatchData(this.batchData);
1216
+ if (this.getBatchId()) {
1217
+ this.router.navigate([], {
1218
+ relativeTo: this.route,
1219
+ // queryParams: { batchId: this.getBatchId() },
1220
+ queryParamsHandling: 'merge',
1221
+ });
1222
+ }
1223
+ }, (error) => {
1224
+ this.loggerSvc.error('CONTENT HISTORY FETCH ERROR >', error);
1225
+ });
1226
+ }
1227
+ }
1228
+ getContinueLearningData(contentId, batchId) {
1229
+ this.tocSvc.contentLoader.next(true);
1230
+ this.resumeData = null;
1231
+ let userId;
1232
+ if (this.configSvc.userProfile) {
1233
+ userId = this.configSvc.userProfile.userId || '';
1234
+ }
1235
+ const req = {
1236
+ request: {
1237
+ batchId,
1238
+ userId,
1239
+ courseId: contentId || '',
1240
+ contentIds: [],
1241
+ fields: ['progressdetails'],
1242
+ },
1243
+ };
1244
+ if (this.content && this.content.primaryCategory !== NsContent.EPrimaryCategory.RESOURCE) {
1245
+ this.contentSvc.fetchContentHistoryV2(req).subscribe(data => {
1246
+ if (data && data.result && data.result.contentList && data.result.contentList.length) {
1247
+ const tempResumeData = _.get(data, 'result.contentList');
1248
+ this.resumeData = _.map(tempResumeData, rr => {
1249
+ // tslint:disable-next-line
1250
+ const items = _.filter(flattenItems(_.get(this.content, 'children') || [], 'children'), { 'identifier': rr.contentId, primaryCategory: 'Learning Resource' });
1251
+ _.set(rr, 'progressdetails.mimeType', _.get(_.first(items), 'mimeType'));
1252
+ if (!_.get(rr, 'completionPercentage')) {
1253
+ if (_.get(rr, 'status') === 2) {
1254
+ _.set(rr, 'completionPercentage', 100);
1255
+ }
1256
+ else {
1257
+ _.set(rr, 'completionPercentage', 0);
1258
+ }
1259
+ }
1260
+ return rr;
1261
+ });
1262
+ const progress = _.map(this.resumeData, 'completionPercentage');
1263
+ const totalCount = _.toInteger(_.get(this.content, 'leafNodesCount')) || 1;
1264
+ if (progress.length < totalCount) {
1265
+ const diff = totalCount - progress.length;
1266
+ if (diff) {
1267
+ // tslint:disable-next-line
1268
+ _.each(new Array(diff), () => {
1269
+ progress.push(0);
1270
+ });
1271
+ }
1272
+ }
1273
+ this.generateResumeDataLinkNew();
1274
+ this.tocSvc.updateResumaData(this.resumeData);
1275
+ // this.tocSvc.mapModuleDurationAndProgress(this.content, this.content)
1276
+ this.getLastPlayedResource();
1277
+ this.tocSvc.mapCompletionPercentage(this.content, this.resumeData);
1278
+ this.tocSvc.callHirarchyProgressHashmap(this.content);
1279
+ this.tocSvc.contentLoader.next(false);
1280
+ }
1281
+ else {
1282
+ this.resumeData = null;
1283
+ this.tocSvc.callHirarchyProgressHashmap(this.content);
1284
+ this.tocSvc.contentLoader.next(false);
1285
+ }
1286
+ this.contentSvc.setProgramChildResumeData(this.resumeData, contentId);
1287
+ }, (error) => {
1288
+ this.loggerSvc.error('CONTENT HISTORY FETCH ERROR >', error);
1289
+ });
1290
+ }
1291
+ }
1292
+ generateResumeDataLinkNew() {
1293
+ if (this.resumeData && this.content) {
1294
+ let resumeDataV2;
1295
+ if (this.content.completionPercentage === 100) {
1296
+ resumeDataV2 = this.getResumeDataFromList('start');
1297
+ }
1298
+ else {
1299
+ resumeDataV2 = this.getResumeDataFromList();
1300
+ }
1301
+ if (!resumeDataV2.mimeType) {
1302
+ resumeDataV2.mimeType = this.tocSvc.getMimeType(this.content, resumeDataV2.identifier);
1303
+ }
1304
+ this.resumeDataLink = viewerRouteGenerator(resumeDataV2.identifier, resumeDataV2.mimeType, this.isResource ? undefined : this.content.identifier, this.isResource ? undefined : this.content.contentType, this.forPreview, 'Learning Resource', this.getBatchId(), this.content.name);
1305
+ this.actionSVC.setUpdateCompGroupO = this.resumeDataLink;
1306
+ /* tslint:disable-next-line */
1307
+ }
1308
+ }
1309
+ scrollToTop() {
1310
+ (function smoothscroll() {
1311
+ const currentScroll = document.documentElement.scrollTop || document.body.scrollTop;
1312
+ if (currentScroll > 0) {
1313
+ // window.requestAnimationFrame(smoothscroll)
1314
+ // window.scrollTo(0, currentScroll - (currentScroll / 5))
1315
+ window.scrollTo({
1316
+ top: 0,
1317
+ behavior: 'smooth',
1318
+ });
1319
+ }
1320
+ })();
1321
+ }
1322
+ getCompetencies(competencies) {
1323
+ const competenciesArray = JSON.parse(competencies);
1324
+ const competencyStringArray = [];
1325
+ competenciesArray.map((c) => {
1326
+ competencyStringArray.push(c.name);
1327
+ });
1328
+ return competencyStringArray;
1329
+ }
1330
+ get showIntranetMsg() {
1331
+ if (this.isMobile) {
1332
+ return true;
1333
+ }
1334
+ return this.showIntranetMessage;
1335
+ }
1336
+ get showStart() {
1337
+ return this.tocSvc.showStartButton(this.content);
1338
+ }
1339
+ get isPostAssessment() {
1340
+ if (!(this.tocConfig && this.tocConfig.postAssessment)) {
1341
+ return false;
1342
+ }
1343
+ if (this.content) {
1344
+ return (this.content.primaryCategory === NsContent.EPrimaryCategory.COURSE &&
1345
+ this.content.learningMode === 'Instructor-Led');
1346
+ }
1347
+ return false;
1348
+ }
1349
+ get isMobile() {
1350
+ return this.utilitySvc.isMobile;
1351
+ }
1352
+ get showSubtitleOnBanner() {
1353
+ return this.tocSvc.subtitleOnBanners;
1354
+ }
1355
+ handleEnrollmentEndDate(batch) {
1356
+ const enrollmentEndDate = dayjs(_.get(batch, 'enrollmentEndDate')).format('YYYY-MM-DD');
1357
+ const systemDate = dayjs();
1358
+ return enrollmentEndDate ? dayjs(enrollmentEndDate).isBefore(systemDate) : false;
1359
+ }
1360
+ openSnackbar(primaryMsg, duration = 5000) {
1361
+ this.snackBar.open(primaryMsg, 'X', {
1362
+ duration,
1363
+ });
1364
+ }
1365
+ get showInstructorLedMsg() {
1366
+ return (this.showActionButtons &&
1367
+ this.content &&
1368
+ this.content.learningMode === 'Instructor-Led' &&
1369
+ !this.content.children.length &&
1370
+ !this.content.artifactUrl);
1371
+ }
1372
+ get isHeaderHidden() {
1373
+ return this.isResource && this.content && !this.content.artifactUrl.length;
1374
+ }
1375
+ get showActionButtons() {
1376
+ return (this.actionBtnStatus !== 'wait' &&
1377
+ this.content &&
1378
+ this.content.status !== 'Deleted' &&
1379
+ this.content.status !== 'Expired');
1380
+ }
1381
+ get showButtonContainer() {
1382
+ return (this.actionBtnStatus === 'grant' &&
1383
+ !(this.isMobile && this.content && this.content.isInIntranet) &&
1384
+ !(this.content &&
1385
+ this.content.contentType === 'Course' &&
1386
+ this.content.children.length === 0 &&
1387
+ !this.content.artifactUrl) &&
1388
+ !(this.content && this.content.contentType === 'Resource' && !this.content.artifactUrl));
1389
+ }
1390
+ getResumeDataFromList(type) {
1391
+ const resumeCopy = [...this.resumeData];
1392
+ if (resumeCopy && resumeCopy.length) {
1393
+ if (!type) {
1394
+ // tslint:disable-next-line:max-line-length
1395
+ const lastItem = resumeCopy && resumeCopy.sort((a, b) => new Date(b.lastAccessTime).getTime() - new Date(a.lastAccessTime).getTime()).shift();
1396
+ return {
1397
+ identifier: lastItem.contentId,
1398
+ mimeType: lastItem.progressdetails && lastItem.progressdetails.mimeType,
1399
+ };
1400
+ }
1401
+ const firstItem = resumeCopy && resumeCopy.length && resumeCopy[0];
1402
+ return {
1403
+ identifier: firstItem.contentId,
1404
+ mimeType: firstItem.progressdetails && firstItem.progressdetails.mimeType,
1405
+ };
1406
+ }
1407
+ return {};
1408
+ }
1409
+ modifySensibleContentRating() {
1410
+ if (this.content &&
1411
+ this.content.averageRating &&
1412
+ typeof this.content.averageRating !== 'number') {
1413
+ this.content.averageRating = this.content.averageRating[this.configSvc.rootOrg || ''];
1414
+ }
1415
+ if (this.content && this.content.totalRating && typeof this.content.totalRating !== 'number') {
1416
+ this.content.totalRating = this.content.totalRating[this.configSvc.rootOrg || ''];
1417
+ }
1418
+ }
1419
+ getLearningUrls() {
1420
+ if (this.content) {
1421
+ this.isPracticeVisible = Boolean(this.tocSvc.filterToc(this.content, NsContent.EFilterCategory.PRACTICE));
1422
+ this.isAssessVisible = Boolean(this.tocSvc.filterToc(this.content, NsContent.EFilterCategory.ASSESS));
1423
+ const firstPlayableContent = this.contentSvc.getFirstChildInHierarchy(this.content);
1424
+ let primaryCategory;
1425
+ if (this.content.secureSettings !== undefined) {
1426
+ primaryCategory = 'Learning Resource';
1427
+ }
1428
+ else {
1429
+ primaryCategory = firstPlayableContent.primaryCategory || this.content.primaryCategory;
1430
+ }
1431
+ this.firstResourceLink = viewerRouteGenerator(firstPlayableContent.identifier, firstPlayableContent.mimeType, this.isResource ? undefined : this.content.identifier, this.isResource ? undefined : this.content.contentType, this.forPreview, primaryCategory, this.getBatchId());
1432
+ /* tslint:disable-next-line */
1433
+ if (firstPlayableContent.optionalReading && firstPlayableContent.primaryCategory === 'Learning Resource') {
1434
+ this.updateProgress(2, firstPlayableContent.identifier);
1435
+ }
1436
+ }
1437
+ }
1438
+ assignPathAndUpdateBanner(url) {
1439
+ const path = url.split('/').pop();
1440
+ if (path && this.validPaths.has(path)) {
1441
+ this.routePath = path;
1442
+ this.updateBannerUrl();
1443
+ }
1444
+ }
1445
+ updateBannerUrl() {
1446
+ if (this.banners) {
1447
+ this.bannerUrl = this.domSanitizer.bypassSecurityTrustStyle(`url(${this.banners[this.routePath]})`);
1448
+ }
1449
+ }
1450
+ playIntroVideo() {
1451
+ if (this.content) {
1452
+ this.dialog.open(AppTocDialogIntroVideoComponent, {
1453
+ data: this.content.introductoryVideo,
1454
+ height: '350px',
1455
+ width: '620px',
1456
+ });
1457
+ }
1458
+ }
1459
+ get sanitizedIntroductoryVideoIcon() {
1460
+ if (this.content && this.content.introductoryVideoIcon) {
1461
+ return this.domSanitizer.bypassSecurityTrustStyle(`url(${this.content.introductoryVideoIcon})`);
1462
+ }
1463
+ return null;
1464
+ }
1465
+ fetchExternalContentAccess() {
1466
+ if (this.content && this.content.registrationUrl) {
1467
+ if (!this.forPreview) {
1468
+ this.externalContentFetchStatus = 'fetching';
1469
+ this.registerForExternal = false;
1470
+ this.tocSvc.fetchExternalContentAccess(this.content.identifier).subscribe(data => {
1471
+ this.externalContentFetchStatus = 'done';
1472
+ this.registerForExternal = data.hasAccess;
1473
+ }, _error => {
1474
+ this.externalContentFetchStatus = 'done';
1475
+ this.registerForExternal = false;
1476
+ });
1477
+ }
1478
+ else {
1479
+ this.externalContentFetchStatus = 'done';
1480
+ this.registerForExternal = true;
1481
+ }
1482
+ }
1483
+ }
1484
+ getRatingIcon(ratingIndex) {
1485
+ if (this.content && this.content.averageRating) {
1486
+ const avgRating = this.content.averageRating;
1487
+ const ratingFloor = Math.floor(avgRating);
1488
+ if (ratingIndex <= ratingFloor) {
1489
+ return 'star';
1490
+ }
1491
+ if (ratingFloor === ratingIndex - 1 && avgRating % 1 > 0) {
1492
+ return 'star_half';
1493
+ }
1494
+ }
1495
+ return 'star_border';
1496
+ }
1497
+ checkRegistrationStatus() {
1498
+ const source = (this.content && this.content.sourceShortName) || '';
1499
+ if (!this.forPreview &&
1500
+ !this.isRegistrationSupported &&
1501
+ this.checkRegistrationSources.has(source)) {
1502
+ this.contentSvc
1503
+ .getRegistrationStatus(source)
1504
+ .then(res => {
1505
+ if (res.hasAccess) {
1506
+ this.actionBtnStatus = 'grant';
1507
+ }
1508
+ else {
1509
+ this.actionBtnStatus = 'reject';
1510
+ if (res.registrationUrl && this.content) {
1511
+ this.content.registrationUrl = res.registrationUrl;
1512
+ }
1513
+ }
1514
+ })
1515
+ .catch(_err => { });
1516
+ }
1517
+ else {
1518
+ this.actionBtnStatus = 'grant';
1519
+ }
1520
+ }
1521
+ generateQuery(type) {
1522
+ if (this.firstResourceLink && (type === 'START' || type === 'START_OVER')) {
1523
+ let qParams = {
1524
+ ...this.firstResourceLink.queryParams,
1525
+ viewMode: type,
1526
+ batchId: this.getBatchId(),
1527
+ };
1528
+ if (this.contextId && this.contextPath) {
1529
+ qParams = {
1530
+ ...qParams,
1531
+ collectionId: this.contextId,
1532
+ collectionType: this.contextPath,
1533
+ };
1534
+ }
1535
+ if (this.forPreview) {
1536
+ delete qParams.viewMode;
1537
+ }
1538
+ qParams = {
1539
+ ...qParams,
1540
+ channelId: this.channelId,
1541
+ };
1542
+ return qParams;
1543
+ }
1544
+ if (this.resumeDataLink && type === 'RESUME') {
1545
+ let qParams = {
1546
+ ...this.resumeDataLink.queryParams,
1547
+ batchId: this.getBatchId(),
1548
+ viewMode: 'RESUME',
1549
+ // courseName: this.content ? this.content.name : '',
1550
+ };
1551
+ if (this.contextId && this.contextPath) {
1552
+ qParams = {
1553
+ ...qParams,
1554
+ collectionId: this.contextId,
1555
+ collectionType: this.contextPath,
1556
+ };
1557
+ }
1558
+ if (this.forPreview) {
1559
+ delete qParams.viewMode;
1560
+ }
1561
+ qParams = {
1562
+ ...qParams,
1563
+ channelId: this.channelId,
1564
+ };
1565
+ return qParams;
1566
+ }
1567
+ if (this.forPreview) {
1568
+ return {};
1569
+ }
1570
+ return {
1571
+ batchId: this.getBatchId(),
1572
+ viewMode: type,
1573
+ };
1574
+ }
1575
+ get isInIFrame() {
1576
+ try {
1577
+ return window.self !== window.top;
1578
+ }
1579
+ catch (e) {
1580
+ return true;
1581
+ }
1582
+ }
1583
+ openFeedbackDialog(content) {
1584
+ const dialogRef = this.dialog.open(ContentRatingV2DialogComponent, {
1585
+ width: '768px',
1586
+ data: { content, userId: this.userId, userRating: this.userRating },
1587
+ });
1588
+ dialogRef.afterClosed().subscribe((result) => {
1589
+ if (result) {
1590
+ this.getUserRating(true);
1591
+ // this.getUserEnrollmentList()
1592
+ this.checkIfUserEnrolled();
1593
+ this.resetRatingsService.setRatingServiceUpdate(true);
1594
+ }
1595
+ });
1596
+ }
1597
+ updateProgress(status, resourceId) {
1598
+ const collectionId = this.route.snapshot.params.id ?
1599
+ this.route.snapshot.params.id : '';
1600
+ const batchId = this.route.snapshot.queryParams.batchId ?
1601
+ this.route.snapshot.queryParams.batchId : '';
1602
+ const isPreAssessment = this.route.snapshot.queryParams.preAssessment;
1603
+ if (isPreAssessment) {
1604
+ return this.viewerSvc
1605
+ .realTimeProgressUpdateForPreAssessmentQuiz(resourceId, status);
1606
+ }
1607
+ return this.viewerSvc.realTimeProgressUpdateQuiz(resourceId, collectionId, batchId, status);
1608
+ }
1609
+ getProgramDuration(batchData) {
1610
+ if (batchData) {
1611
+ const startDate = dayjs(dayjs(batchData.startDate).format('YYYY-MM-DD'));
1612
+ const endDate = dayjs(dayjs(batchData.endDate).format('YYYY-MM-DD'));
1613
+ // adding 1 to include the start date
1614
+ return (endDate.diff(startDate, 'days') + 1);
1615
+ }
1616
+ return '';
1617
+ }
1618
+ withdrawOrEnroll(data) {
1619
+ if (data === NsContent.WFBlendedProgramStatus.INITIATE) {
1620
+ this.fetchUserWFForBlended();
1621
+ }
1622
+ }
1623
+ getServerDateTime() {
1624
+ this.tocSvc.getServerDate().subscribe((response) => {
1625
+ if (response && response.systemDate) {
1626
+ this.tocSvc.changeServerDate(response.systemDate);
1627
+ this.tocSvc.changeServerDate(response.systemDate);
1628
+ this.serverDate = response.systemDate;
1629
+ }
1630
+ else {
1631
+ this.tocSvc.changeServerDate(new Date().getTime());
1632
+ }
1633
+ this.findACPB();
1634
+ this.getKarmapointsLimit();
1635
+ }, (_err) => {
1636
+ this.tocSvc.changeServerDate(new Date().getTime());
1637
+ });
1638
+ }
1639
+ handleCapitalize(str, type) {
1640
+ let returnValue = '';
1641
+ if (str) {
1642
+ if (type === 'name') {
1643
+ returnValue = str.split(' ').map(_str => {
1644
+ return _str.charAt(0).toUpperCase() + _str.slice(1);
1645
+ }).join(' ');
1646
+ }
1647
+ else {
1648
+ returnValue = str && (str.charAt(0).toUpperCase() + str.slice(1));
1649
+ }
1650
+ }
1651
+ return returnValue;
1652
+ }
1653
+ handleParseJsonData(s) {
1654
+ try {
1655
+ const parsedString = JSON.parse(s);
1656
+ return parsedString;
1657
+ }
1658
+ catch {
1659
+ return [];
1660
+ }
1661
+ }
1662
+ handleNavigateToReviews() {
1663
+ const elementToView = document.getElementById('reviewContainer');
1664
+ if (elementToView) {
1665
+ window.scrollTo({
1666
+ top: elementToView.offsetTop,
1667
+ behavior: 'smooth',
1668
+ });
1669
+ }
1670
+ }
1671
+ raiseCertIntreactTelemetry() {
1672
+ this.events.raiseInteractTelemetry({
1673
+ type: WsEvents.EnumInteractTypes.CLICK,
1674
+ id: 'view-certificate',
1675
+ subType: WsEvents.EnumInteractSubTypes.CERTIFICATE,
1676
+ }, {
1677
+ id: this.certId,
1678
+ type: WsEvents.EnumInteractSubTypes.CERTIFICATE,
1679
+ });
1680
+ }
1681
+ translateLabels(label, type) {
1682
+ return this.langtranslations.translateLabel(label, type, '');
1683
+ }
1684
+ // checkModuleWiseData() {
1685
+ // if (this.content && this.content.children) {
1686
+ // this.content.children.forEach((ele: any) => {
1687
+ // if (ele.primaryCategory === NsContent.EPrimaryCategory.MODULE) {
1688
+ // let moduleResourseCount = 0
1689
+ // let offlineResourseCount = 0
1690
+ // ele.children.forEach((childEle: any) => {
1691
+ // if (childEle.primaryCategory !== NsContent.EPrimaryCategory.OFFLINE_SESSION) {
1692
+ // moduleResourseCount = moduleResourseCount + 1
1693
+ // } else {
1694
+ // offlineResourseCount = offlineResourseCount + 1
1695
+ // }
1696
+ // })
1697
+ // ele['moduleResourseCount'] = moduleResourseCount
1698
+ // ele['offlineResourseCount'] = offlineResourseCount
1699
+ // }
1700
+ // })
1701
+ // }
1702
+ // }
1703
+ getLastPlayedResource() {
1704
+ let firstPlayableContent;
1705
+ let resumeDataV2;
1706
+ if (this.resumeData && this.resumeData.length > 0 && this.content) {
1707
+ if (this.content.completionPercentage === 100) {
1708
+ resumeDataV2 = this.getResumeDataFromList('start');
1709
+ }
1710
+ else {
1711
+ resumeDataV2 = this.getResumeDataFromList();
1712
+ }
1713
+ this.expandThePath(resumeDataV2.identifier);
1714
+ }
1715
+ else {
1716
+ if (this.content) {
1717
+ firstPlayableContent = this.contentSvc.getFirstChildInHierarchy(this.content);
1718
+ this.expandThePath(firstPlayableContent.identifier);
1719
+ }
1720
+ }
1721
+ }
1722
+ expandThePath(resourceId) {
1723
+ if (this.content && resourceId) {
1724
+ const path = this.utilitySvc.getPath(this.content, resourceId);
1725
+ // console.log('Path :: :: : ', path)
1726
+ this.pathSet = new Set(path.map((u) => u.identifier));
1727
+ // console.log('pathSet ::: ', this.pathSet)
1728
+ // path.forEach((node: IViewerTocCard) => {
1729
+ // this.nestedTreeControl.expand(node)
1730
+ // })
1731
+ }
1732
+ }
1733
+ raiseEnrollTelemetry() {
1734
+ this.events.raiseInteractTelemetry({
1735
+ type: 'click',
1736
+ subType: 'enroll',
1737
+ id: this.content ? this.content.identifier : '',
1738
+ }, {
1739
+ id: this.content ? this.content.identifier : '',
1740
+ type: this.content ? this.content.primaryCategory : '',
1741
+ }, {
1742
+ pageIdExt: `btn-enroll`,
1743
+ module: WsEvents.EnumTelemetrymodules.CONTENT,
1744
+ });
1745
+ }
1746
+ raiseEnrollTelementryForSakshamAIGenerated() {
1747
+ this.events.raiseInteractTelemetry({
1748
+ type: 'click',
1749
+ subType: 'enroll',
1750
+ id: this.content ? this.content.identifier : '',
1751
+ target: {
1752
+ id: this.recommendedCoursesId,
1753
+ ver: "1.0",
1754
+ type: "igot-ai"
1755
+ },
1756
+ }, {
1757
+ id: this.content ? this.content.identifier : '',
1758
+ type: this.content ? this.content.primaryCategory : '',
1759
+ }, {
1760
+ pageId: `/app/toc/${this.content?.identifier}/overview_btn-enroll`,
1761
+ module: WsEvents.EnumTelemetrymodules.CONTENT,
1762
+ });
1763
+ }
1764
+ onClickOfShare() {
1765
+ this.enableShare = true;
1766
+ this.raiseTelemetryForShare('shareContent');
1767
+ }
1768
+ /* tslint:disable */
1769
+ raiseTelemetryForShare(subType) {
1770
+ this.events.raiseInteractTelemetry({
1771
+ type: 'click',
1772
+ subType,
1773
+ id: this.content ? this.content.identifier : '',
1774
+ }, {
1775
+ id: this.content ? this.content.identifier : '',
1776
+ type: this.content ? this.content.primaryCategory : '',
1777
+ }, {
1778
+ pageIdExt: `btn-${subType}`,
1779
+ module: WsEvents.EnumTelemetrymodules.CONTENT,
1780
+ });
1781
+ }
1782
+ resetEnableShare() {
1783
+ this.enableShare = false;
1784
+ }
1785
+ translateLabel(label, type) {
1786
+ if (label && type) {
1787
+ return this.langtranslations.translateLabel(label, type, '');
1788
+ }
1789
+ }
1790
+ ngOnDestroy() {
1791
+ if (this.routeSubscription) {
1792
+ this.routeSubscription.unsubscribe();
1793
+ }
1794
+ if (this.batchSubscription) {
1795
+ this.batchSubscription.unsubscribe();
1796
+ }
1797
+ if (this.batchDataSubscription) {
1798
+ this.batchDataSubscription.unsubscribe();
1799
+ }
1800
+ this.tocSvc.analyticsFetchStatus = 'none';
1801
+ if (this.routerParamSubscription) {
1802
+ this.routerParamSubscription.unsubscribe();
1803
+ }
1804
+ if (this.selectedBatchSubscription) {
1805
+ this.selectedBatchSubscription.unsubscribe();
1806
+ }
1807
+ if (this.resumeDataSubscription) {
1808
+ this.resumeDataSubscription.unsubscribe();
1809
+ }
1810
+ if (this.timerUnsubscribe) {
1811
+ this.timerUnsubscribe.unsubscribe();
1812
+ }
1813
+ }
1814
+ programEnrollCall(batchData) {
1815
+ this.autoEnrollCuratedProgram(NsContent.ECourseCategory.MODERATED_PROGRAM, batchData);
1816
+ }
1817
+ raiseTelemetryForPublic() {
1818
+ this.events.raiseInteractTelemetry({
1819
+ type: 'click',
1820
+ id: "view-assessment",
1821
+ subType: "anonymous-assessment",
1822
+ }, {}, {
1823
+ module: 'Landing Page',
1824
+ });
1825
+ }
1826
+ fetchUserEnrollmentData() {
1827
+ let identifier = this.content && this.content.identifier || '';
1828
+ let request = {
1829
+ "request": {
1830
+ "retiredCoursesEnabled": true,
1831
+ "courseId": [identifier]
1832
+ }
1833
+ };
1834
+ this.enrollSvc.fetchEnrollContentData(request).subscribe(async (res) => {
1835
+ if (res && res.result && res.result.courses && res.result.courses.length) {
1836
+ this.userEnrollmentList = res.result.courses;
1837
+ let completedContentFlagData = this.userEnrollmentList &&
1838
+ this.userEnrollmentList.find((el) => el.collectionId === this.content?.identifier);
1839
+ if (completedContentFlagData && completedContentFlagData.completionPercentage && completedContentFlagData.completionPercentage === 100) {
1840
+ this.contentViewEventForNetCore('complete');
1841
+ }
1842
+ this.dataTransferSvc.setEnrollData(this.userEnrollmentList);
1843
+ if (this.contentLibSvc && this.contentLibSvc.oneStepResumeEnable) {
1844
+ // let urlData = await this.contentLibSvc.getResourseLink(this.content, this.userEnrollmentList, true)
1845
+ const foundContent = this.userEnrollmentList &&
1846
+ this.userEnrollmentList.find((el) => el.collectionId === this.content?.identifier);
1847
+ let urlData = await this.contentLibSvc.getResourseLink(this.content, [foundContent], true);
1848
+ // let urlData = await this.contentLibSvc.getResourseLink(this.content, this.userEnrollmentList, true)
1849
+ if (urlData && urlData.url && urlData.url.includes('app/toc')) {
1850
+ this.checkIfUserEnrolled();
1851
+ }
1852
+ else {
1853
+ this.contentLibSvc.oneStepResumeEnable = false;
1854
+ if (urlData && urlData.url) {
1855
+ this.router.navigate([urlData.url], {
1856
+ queryParams: urlData.queryParams
1857
+ });
1858
+ }
1859
+ }
1860
+ }
1861
+ else {
1862
+ this.checkIfUserEnrolled();
1863
+ }
1864
+ }
1865
+ else {
1866
+ this.userEnrollmentList = [];
1867
+ this.checkIfUserEnrolled();
1868
+ }
1869
+ });
1870
+ }
1871
+ async checkIfUserEnrolled() {
1872
+ this.contentLibSvc.oneStepResumeEnable = false;
1873
+ this.enrollBtnLoading = true;
1874
+ this.tocSvc.contentLoader.next(true);
1875
+ // tslint:disable-next-line
1876
+ if (this.content && this.content.identifier && this.content.primaryCategory !== this.primaryCategory.COURSE &&
1877
+ this.content.primaryCategory !== this.primaryCategory.PROGRAM &&
1878
+ this.content.primaryCategory !== this.primaryCategory.MANDATORY_COURSE_GOAL &&
1879
+ this.content.primaryCategory !== this.primaryCategory.STANDALONE_ASSESSMENT &&
1880
+ this.content.primaryCategory !== this.primaryCategory.BLENDED_PROGRAM &&
1881
+ this.content.primaryCategory !== this.primaryCategory.CURATED_PROGRAM) {
1882
+ // const collectionId = this.isResource ? '' : this.content.identifier
1883
+ return this.getContinueLearningData(this.content.identifier);
1884
+ }
1885
+ let enrolledCourse;
1886
+ if (this.content && this.content.identifier && !this.forPreview) {
1887
+ if (this.userEnrollmentList && this.userEnrollmentList.length) {
1888
+ enrolledCourse = this.userEnrollmentList.find((course) => {
1889
+ const identifier = this.content && this.content.identifier || '';
1890
+ if (course.courseId !== identifier) {
1891
+ return undefined;
1892
+ }
1893
+ return course;
1894
+ });
1895
+ }
1896
+ // If current course is present in the list of user enrolled course
1897
+ if (enrolledCourse && enrolledCourse.batchId) {
1898
+ this.resumeDataSubscription = this.tocSvc.resumeData.subscribe((res) => {
1899
+ if (res) {
1900
+ this.resumeData = res;
1901
+ this.getLastPlayedResource();
1902
+ this.generateResumeDataLinkNew();
1903
+ }
1904
+ });
1905
+ this.tocSvc.checkModuleWiseData(this.content);
1906
+ this.enrolledCourseData = enrolledCourse;
1907
+ this.isCourseCompletedOnThisMonth();
1908
+ this.currentCourseBatchId = enrolledCourse.batchId;
1909
+ // this.downloadCert(enrolledCourse.issuedCertificates)
1910
+ if (enrolledCourse && enrolledCourse.issuedCertificates &&
1911
+ enrolledCourse.issuedCertificates.length) {
1912
+ const certificate = enrolledCourse.issuedCertificates.sort((a, b) => new Date(b.lastIssuedOn).getTime() - new Date(a.lastIssuedOn).getTime());
1913
+ const certId = certificate[0].identifier;
1914
+ this.certId = certId;
1915
+ if (this.content) {
1916
+ this.content['certificateObj'] = {
1917
+ certId,
1918
+ certData: '',
1919
+ };
1920
+ }
1921
+ }
1922
+ this.content.completionPercentage = enrolledCourse.completionPercentage || 0;
1923
+ this.content.completionStatus = enrolledCourse.status || 0;
1924
+ if (this.contentReadData && this.contentReadData.cumulativeTracking) {
1925
+ await this.tocSvc.mapCompletionPercentageProgram(this.content, this.userEnrollmentList);
1926
+ this.resumeDataSubscription = this.tocSvc.resumeData.subscribe((res) => {
1927
+ if (res) {
1928
+ this.resumeData = res;
1929
+ this.getLastPlayedResource();
1930
+ this.generateResumeDataLinkNew();
1931
+ }
1932
+ });
1933
+ this.enrollBtnLoading = false;
1934
+ // this.tocSvc.contentLoader.next(false)
1935
+ }
1936
+ else {
1937
+ this.getContinueLearningData(this.content.identifier, enrolledCourse.batchId);
1938
+ this.content['completionPercentage'] = enrolledCourse.completionPercentage;
1939
+ this.enrollBtnLoading = false;
1940
+ this.tocSvc.mapModuleCount(this.content);
1941
+ // this.tocSvc.contentLoader.next(false)
1942
+ }
1943
+ this.batchData = {
1944
+ content: [enrolledCourse.batch],
1945
+ enrolled: true,
1946
+ };
1947
+ this.tocSvc.setBatchData(this.batchData);
1948
+ this.tocSvc.getSelectedBatchData(this.batchData);
1949
+ this.tocSvc.mapSessionCompletionPercentage(this.batchData, this.resumeData);
1950
+ if (this.getBatchId()) {
1951
+ this.router.navigate([], {
1952
+ relativeTo: this.route,
1953
+ queryParams: { batchId: this.getBatchId() },
1954
+ queryParamsHandling: 'merge',
1955
+ });
1956
+ }
1957
+ }
1958
+ else {
1959
+ this.tocSvc.checkModuleWiseData(this.content);
1960
+ this.tocSvc.mapModuleCount(this.content);
1961
+ // It's understood that user is not already enrolled
1962
+ // Fetch the available batches and present to user
1963
+ if (this.content.primaryCategory === this.primaryCategory.COURSE
1964
+ || this.content.primaryCategory !== this.primaryCategory.PROGRAM) {
1965
+ // Disabling auto enrollment to batch
1966
+ if (this.content.primaryCategory === this.primaryCategory.BLENDED_PROGRAM) {
1967
+ this.fetchBatchDetails();
1968
+ }
1969
+ }
1970
+ else {
1971
+ this.fetchBatchDetails();
1972
+ }
1973
+ this.tocSvc.callHirarchyProgressHashmap(this.content);
1974
+ this.enrollBtnLoading = false;
1975
+ this.tocSvc.contentLoader.next(false);
1976
+ }
1977
+ }
1978
+ this.skeletonLoader = false;
1979
+ }
1980
+ handleAcceptRelevent() {
1981
+ this.saveFeedback('', 1);
1982
+ }
1983
+ handleDeclineRelevent() {
1984
+ const dialogRef = this.dialog.open(NonReleventFeedbackDialogComponent, {
1985
+ disableClose: true,
1986
+ width: '502px',
1987
+ panelClass: ['relevent-feedback-dialog'],
1988
+ });
1989
+ dialogRef.afterClosed().subscribe((result) => {
1990
+ if (result) {
1991
+ this.saveFeedback(result, 0);
1992
+ dialogRef.close();
1993
+ }
1994
+ else {
1995
+ dialogRef.close();
1996
+ }
1997
+ });
1998
+ }
1999
+ contentViewEventForNetCore(eventType) {
2000
+ if (this.configSvc.netcoreConfig && this.configSvc.netcoreConfig.netcoreWebConfig // NOSONAR
2001
+ && this.configSvc.netcoreConfig.netcoreWebConfig.isActive // NOSONAR
2002
+ && this.configSvc.netcoreConfig.netcoreWebConfig.events // NOSONAR
2003
+ && this.configSvc.netcoreConfig.netcoreWebConfig.events.content_view // NOSONAR
2004
+ && this.configSvc.netcoreConfig.netcoreWebConfig.events.content_view.isActive // NOSONAR
2005
+ ) {
2006
+ let payload = {};
2007
+ // if (this.configSvc && this.configSvc.unMappedUser && this.configSvc.unMappedUser.identifier) { // NOSONAR
2008
+ // payload['pk^userid'] = this.configSvc.unMappedUser.identifier.trim().toLowerCase()
2009
+ // }
2010
+ if (this.content && this.content.name) {
2011
+ payload['content_name'] = this.content.name;
2012
+ }
2013
+ if (this.content && this.content.courseCategory) {
2014
+ payload['content_category'] = this.content.courseCategory;
2015
+ }
2016
+ if (this.content && this.content.identifier) {
2017
+ payload['content_id'] = this.content.identifier;
2018
+ }
2019
+ // if(this.content && this.content.name) {
2020
+ payload['content_url'] = window.location.href;
2021
+ // }
2022
+ if (this.content && this.content.appIcon) {
2023
+ payload['content_image'] = this.content.appIcon;
2024
+ }
2025
+ if (this.content && this.content.duration) {
2026
+ payload['content_duration'] = this.content.duration && Number(this.content.duration) > 0 ? Number(this.content.duration) : 0;
2027
+ }
2028
+ else {
2029
+ payload['content_duration'] = 0;
2030
+ }
2031
+ if (this.content && this.content.avgRating) {
2032
+ payload['content_rating'] = this.content.avgRating;
2033
+ payload['content rating'] = this.content.avgRating;
2034
+ }
2035
+ if (this.content && this.content.totalNoOfRating) {
2036
+ payload['no_users_rated'] = this.content.totalNoOfRating;
2037
+ }
2038
+ // if(this.content && this.content.name) {
2039
+ payload['learning_path_content'] = this.userEnrollmentList && this.userEnrollmentList.length ? true : false;
2040
+ payload['learning path content'] = this.userEnrollmentList && this.userEnrollmentList.length ? true : false;
2041
+ // }
2042
+ if (this.content && this.content.source) {
2043
+ payload['content_provider_name'] = this.content.source;
2044
+ }
2045
+ // console.log('payload', payload)
2046
+ if (eventType === 'view') {
2047
+ this.netCoreService.trackEventForContentAndEvent('content_view', this.configSvc.unMappedUser.identifier.trim().toLowerCase(), payload);
2048
+ }
2049
+ else if (eventType === 'enroll') {
2050
+ this.netCoreService.trackEventForContentAndEvent('content_enrolment', this.configSvc.unMappedUser.identifier.trim().toLowerCase(), payload);
2051
+ }
2052
+ else if (eventType === 'complete') {
2053
+ this.netCoreService.trackEventForContentAndEvent('content_completion', this.configSvc.unMappedUser.identifier.trim().toLowerCase(), payload);
2054
+ }
2055
+ }
2056
+ }
2057
+ secondsToTime(d) {
2058
+ d = Number(d);
2059
+ var h = Math.floor(d / 3600);
2060
+ var m = Math.floor(d % 3600 / 60);
2061
+ var s = Math.floor(d % 3600 % 60);
2062
+ var hDisplay = h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : "";
2063
+ var mDisplay = m > 0 ? m + (m == 1 ? " minute, " : " minutes, ") : "";
2064
+ var sDisplay = s > 0 ? s + (s == 1 ? " second" : " seconds") : "";
2065
+ return hDisplay + mDisplay + sDisplay;
2066
+ }
2067
+ async saveFeedback(comment, rating = 0) {
2068
+ const payload = {
2069
+ "recommendation_id": this.recommendedCoursesId,
2070
+ "course_id": this.courseID,
2071
+ "rating": rating,
2072
+ "comments": comment,
2073
+ "user_id": this.configSvc.userProfile?.userId || ''
2074
+ };
2075
+ const response = await this.contentLibSvc.saveFeedbackSakshamAI(payload).toPromise().catch(() => { });
2076
+ if (response && response?.message) {
2077
+ this.matSnackbarNew.open('Thank you for your feedback.', 'X', { duration: SNACKBAR_DURATION, panelClass: ['success'] });
2078
+ // this.router.navigate([], { queryParams: { g: null }, queryParamsHandling: 'merge' });
2079
+ this.feedbackGiven = { course_id: this.courseID, rating: rating, comments: comment };
2080
+ }
2081
+ else if (!response) {
2082
+ this.matSnackbarNew.open('Something is wrong. Please try again later.', 'X', { duration: SNACKBAR_DURATION, panelClass: ['error'] });
2083
+ }
2084
+ }
2085
+ playResumeForAI() {
2086
+ if (this.content) {
2087
+ if (this.firstResourceLink) {
2088
+ this.router.navigate([this.firstResourceLink.url], { queryParams: this.firstResourceLink.queryParams });
2089
+ }
2090
+ // this.getContinueLearningData(this.content.identifier)
2091
+ }
2092
+ }
2093
+ enrollUserToAI() {
2094
+ this.fromAITutor = true;
2095
+ this.handleAutoBatchAssign();
2096
+ }
2097
+ generatePreAssessmentQuery(type) {
2098
+ if (this.firstResourceLink && (type === 'START' || type === 'START_OVER')) {
2099
+ let qParams = {
2100
+ ...this.firstResourceLink.queryParams,
2101
+ viewMode: type,
2102
+ batchId: this.getBatchId(),
2103
+ };
2104
+ if (this.contextId && this.contextPath) {
2105
+ qParams = {
2106
+ ...qParams,
2107
+ collectionId: this.contextId,
2108
+ collectionType: this.contextPath,
2109
+ };
2110
+ }
2111
+ if (this.forPreview) {
2112
+ delete qParams.viewMode;
2113
+ }
2114
+ qParams = {
2115
+ ...qParams,
2116
+ channelId: this.channelId,
2117
+ };
2118
+ return qParams;
2119
+ }
2120
+ if (this.resumeDataLink && type === 'RESUME') {
2121
+ let qParams = {
2122
+ ...this.resumeDataLink.queryParams,
2123
+ batchId: this.getBatchId(),
2124
+ viewMode: 'RESUME',
2125
+ // courseName: this.content ? this.content.name : '',
2126
+ };
2127
+ if (this.contextId && this.contextPath) {
2128
+ qParams = {
2129
+ ...qParams,
2130
+ collectionId: this.contextId,
2131
+ collectionType: this.contextPath,
2132
+ };
2133
+ }
2134
+ if (this.forPreview) {
2135
+ delete qParams.viewMode;
2136
+ }
2137
+ qParams = {
2138
+ ...qParams,
2139
+ channelId: this.channelId,
2140
+ };
2141
+ return qParams;
2142
+ }
2143
+ if (this.forPreview) {
2144
+ return {};
2145
+ }
2146
+ return {
2147
+ batchId: this.getBatchId(),
2148
+ viewMode: type,
2149
+ };
2150
+ }
2151
+ routeToPreAssessent() {
2152
+ if (this.contentReadData) {
2153
+ console.log('this.content', this.contentReadData);
2154
+ console.log('this.content', this.contentReadData.preEnrolmentResources);
2155
+ // this.generatePreAssessmentQuery('START')
2156
+ let firstResource = this.contentReadData.preEnrolmentResources[0];
2157
+ this.firstResourceLink = viewerRouteGenerator(firstResource.identifier, firstResource.mimeType, this.contentReadData?.identifier, this.contentReadData?.courseCategory, this.forPreview, this.contentReadData.preEnrolmentResources[0]?.primaryCategory, '');
2158
+ console.log('this.firstResourceLink', this.firstResourceLink);
2159
+ let routerLink = this.firstResourceLink?.url;
2160
+ let queryParams = this.generatePreAssessmentQuery('START');
2161
+ queryParams = { ...queryParams, preAssessment: 'true' };
2162
+ this.router.navigate([`${routerLink}`], { queryParams });
2163
+ }
2164
+ }
2165
+ getPreAssessmentCompletionStatus() {
2166
+ this.preAssessmentCompletionStatus = false;
2167
+ let preEnrollmentResourcesArr = [];
2168
+ if (this.contentReadData?.preEnrolmentResources?.length) {
2169
+ this.contentReadData?.preEnrolmentResources?.forEach((item) => {
2170
+ if (item && item?.isMandatory) {
2171
+ preEnrollmentResourcesArr.push(item?.identifier);
2172
+ }
2173
+ });
2174
+ }
2175
+ if (preEnrollmentResourcesArr && preEnrollmentResourcesArr.length) {
2176
+ let req = {
2177
+ "request": {
2178
+ "contentIds": preEnrollmentResourcesArr,
2179
+ "fields": [
2180
+ // "lastAccessTime",
2181
+ // "completionPercentage"
2182
+ ]
2183
+ }
2184
+ };
2185
+ this.tocSvc.readPreEnrollmentResourcesState(req).subscribe((data) => {
2186
+ if (data && data.result && data.result.contentList) {
2187
+ for (let i = 0; i < data.result.contentList.length; i++) {
2188
+ if (Number(data.result.contentList[i]['completionPercentage']) === 100 ||
2189
+ data.result.contentList[i]['status'] === 2) {
2190
+ this.preAssessmentCompletionStatus = true;
2191
+ }
2192
+ }
2193
+ }
2194
+ });
2195
+ }
2196
+ }
2197
+ onLanguageSelect(lang) {
2198
+ this.selectedLanguage = lang;
2199
+ console.log('Selected language:', lang);
2200
+ // Add your language change logic here
2201
+ }
2202
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocHomeComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.WidgetContentService }, { token: i3.AppTocService }, { token: i4.LoggerService }, { token: i4.ConfigurationsService }, { token: i5.DomSanitizer }, { token: i6.AccessControlService }, { token: i7.MatLegacySnackBar }, { token: i8.MatLegacyDialog }, { token: i9.MobileAppsService }, { token: i4.UtilityService }, { token: i10.ActionService }, { token: i11.ViewerUtilService }, { token: i12.RatingService }, { token: i4.TelemetryService }, { token: i13.TranslateService }, { token: i4.MultilingualTranslationsService }, { token: i4.EventService }, { token: i7.MatLegacySnackBar }, { token: i14.LoadCheckService }, { token: i15.HandleClaimService }, { token: i16.ResetRatingsService }, { token: i17.TimerService }, { token: i4.WidgetEnrollService }, { token: i18.WidgetContentLibService }, { token: i4.DataTransferService }, { token: i19.MatSnackBar }, { token: i18.WidgetUserServiceLib }, { token: i20.NetCoreService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Component }); }
2203
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocHomeComponent, selector: "ws-app-app-toc-home", inputs: { forPreview: "forPreview" }, host: { listeners: { "window:scroll": "handleScroll($event)" } }, viewQueries: [{ propertyName: "menuElement", first: true, predicate: ["stickyMenu"], descendants: true, static: true }, { propertyName: "rcElement", first: true, predicate: ["rightContainer"], descendants: true }, { propertyName: "bannerElem", first: true, predicate: ["bannerDetails"], descendants: true, static: true }, { propertyName: "contentSource", first: true, predicate: ["contentSource"], descendants: true }], ngImport: i0, template: "<!-- \n Main Container - Displays course/content details with enrollment functionality\n Only displays content if courseID is available, otherwise shows \"not found\" message\n-->\n<ng-container *ngIf=\"courseID else noDataFound\">\n <!-- \n ENROLLMENT TEMPLATE - Handles all enrollment/start/resume button functionality\n Used in multiple places throughout the template\n -->\n <ng-template #enrollFunctionality>\n <div [hidden]=\"isResource && !content?.artifactUrl?.length\" class=\"flex flex-col gap-4 text-center\">\n <!-- SECTION: Regular course enrollment buttons -->\n <ng-container *ngIf=\"content?.primaryCategory !== primaryCategory.PROGRAM\n && content?.primaryCategory !== primaryCategory.CURATED_PROGRAM\n && content?.primaryCategory !== primaryCategory.STANDALONE_ASSESSMENT &&\n content?.primaryCategory !== primaryCategory.BLENDED_PROGRAM\">\n <!-- START/RESUME button for granted courses -->\n <ng-container *ngIf=\"(actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !(content?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 &&\n !content?.artifactUrl?.length) &&\n !(content?.primaryCategory === primaryCategory.COURSE && !batchData?.enrolled) &&\n !(content?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl) &&\n !(content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)) &&\n !(content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId)\">\n <a *ngIf=\"showStart.show && !isPostAssessment && !forPreview\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"(!content.completionPercentage || content.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData ? translateLabels('resume', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100 || certData\">\n {{ resumeData ? translateLabels('Start again', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n\n <!-- TAKE ASSESSMENT button (for post assessments) -->\n <button *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" (click)=\"raiseTelemetryForPublic()\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >{{ 'apptochome.takeAssessment' | translate }}</ng-container>\n </button>\n\n <!-- Commented karma points panel functionality -->\n </ng-container>\n \n <!-- ENROLL button for courses that require enrollment -->\n <ng-container *ngIf=\" (actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) && \n !( content?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 && !content?.artifactUrl?.length ) &&\n !( content?.primaryCategory === primaryCategory.COURSE && batchData?.enrolled ) &&\n !(content?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl)) &&\n !(content?.primaryCategory === primaryCategory.PROGRAM) &&\n !(content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)\">\n <ng-container *ngIf=\"content?.primaryCategory !== primaryCategory.RESOURCE && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\" (click)=\"handleAutoBatchAssign()\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL - Used across multiple sections -->\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: BLENDED_PROGRAM pre-enrollment functionality -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && !preAssessmentCompletionStatus\">\n <a class=\"flex action-button enroll-btn justify-center resume\" *ngIf=\"contentReadData?.preEnrolmentResources?.length\" (click)=\"routeToPreAssessent()\">\n <ng-container >\n {{ 'apptochome.preEnroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n \n <!-- SECTION: BLENDED_PROGRAM pre-enrollment completion message -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && preAssessmentCompletionStatus\">\n <a class=\"flex preenrolldone-btn justify-center resume\">\n <ng-container >\n {{ 'apptochome.preEnrollDone' | translate }}<img src=\"/assets/icons/Accept_icon.png\" alt=\"tick\" class=\"tick-icon\">\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: PROGRAM & MANDATORY_COURSE_GOAL handling -->\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.PROGRAM || content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL\">\n \n <!-- SECTION: Moderated program enrollment handling -->\n <ng-container *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && (contentReadData?.batches && !batchData?.enrolled)\">\n <ng-container *ngIf=\"((content?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && !contentReadData?.batches[0].endDate\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleAutoBatchAssign()\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >\n <!-- ENROLL BUTTON LABEL -->\n {{'apptochome.enroll' | translate}}\n </ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n <ng-container *ngIf=\"((content?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && contentReadData?.batches[0].endDate\">\n \n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" [analytics]=\"analytics\" (programEnrollCall)=\"programEnrollCall($event)\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: No batches message -->\n <ng-container *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && !contentReadData?.batches && !batchData?.enrolled && !enrollBtnLoading\">\n No Batches\n </ng-container>\n\n <!-- SECTION: Status messages for non-moderated programs -->\n <ng-container *ngIf=\"courseCategory?.MODERATED_PROGRAM !== contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container\n *ngIf=\"!(content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) && content?.primaryCategory !== primaryCategory.MANDATORY_COURSE_GOAL\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.youAreNotInvited' | translate }} </span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: Batch status messages for moderated programs -->\n <ng-container *ngIf=\"!isBatchInProgress && courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: In-progress batch with resume/start functionality -->\n <ng-container *ngIf=\"isBatchInProgress &&\n ( actionBtnStatus === 'grant' &&\n !(isMobile && content?.isInIntranet) &&\n (content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) ||\n (content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL && currentCourseBatchId)\n )\">\n <a *ngIf=\"showStart.show && !isPostAssessment\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content.completionPercentage || content.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100\">\n {{ resumeData || content.completionPercentage === 100 ? \"Start again\" : \"Start\" }}\n </ng-container>\n </a>\n <a *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >{{ 'apptochome.takeAssessment' | translate }}</ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: CURATED_PROGRAM in-progress handling -->\n <ng-container\n *ngIf=\"isBatchInProgress && (content?.primaryCategory === primaryCategory.CURATED_PROGRAM && batchData?.enrolled) && !enrollBtnLoading\">\n <a *ngIf=\"showStart.show && !isPostAssessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content.completionPercentage || content.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100\">\n {{ resumeData || content.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: Loading state for enrollment button -->\n <ng-container *ngIf=\"enrollBtnLoading\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'36px'\"\n [bindingClass]=\"'flex rounded h-8'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <!-- SECTION: CURATED_PROGRAM enrollment button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.CURATED_PROGRAM && !batchData?.enrolled && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"(click)=\"handleAutoBatchAssign()\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL -->\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: STANDALONE_ASSESSMENT enrollment button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && content?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleAutoBatchAssign()\" *ngIf=\"!forPreview || isInIFrame\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL -->\n {{ 'apptochome.enroll' | translate }} \n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: INVITE-ONLY STANDALONE_ASSESSMENT message --> \n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && content?.courseCategory === 'Invite-Only Assessment'\">\n \n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewForInviteOnlyAssessment\" >\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.youAreNotInvitedForAssessment' | translate }} </span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: Enrolled INVITE-ONLY STANDALONE_ASSESSMENT take test button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && isBatchInProgress && !enrollBtnLoading && content?.courseCategory === 'Invite-Only Assessment'\"> \n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate }}</ng-container>\n <ng-container *ngIf=\"content.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: Status messages for INVITE-ONLY STANDALONE_ASSESSMENT -->\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA' && content?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA' && content?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n \n <!-- SECTION: Regular STANDALONE_ASSESSMENT enrolled take test button -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && !enrollBtnLoading && content?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate }}</ng-container>\n <ng-container *ngIf=\"content.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: BLENDED_PROGRAM workflow status -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <!-- Review status message -->\n <ng-container *ngIf=\"batchData?.workFlow?.wfInitiated &&\n !(batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN)\">\n <div class=\"ws-mat-accent-text ws-mat-accent-light-bg flex items-center justify-center statusMsg\">\n <p class=\"margin-remove-bottom font-bold\">\n {{ 'apptochome.requestUnderReview' | translate }}\n </p>\n </div>\n </ng-container>\n\n <!-- Approved BLENDED_PROGRAM start/resume button -->\n <ng-container>\n <a\n *ngIf=\"showStart.show && batchData?.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED\"\n [routerLink]=\"isBatchInProgress? (resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url : '' \" (click)=\"raiseTelemetryForPublic()\"\n [queryParams]=\"isBatchInProgress ? (resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START') : '' \"\n class=\"flex action-button justify-center resume\" [ngClass]=\"{'disable-start-btn': !isBatchInProgress}\">\n <ng-container *ngIf=\"(!content.completionPercentage || content.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100 || certData\">\n {{ resumeData || content.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') : translateLabels('start', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: External registration link -->\n <ng-container *ngIf=\"actionBtnStatus == 'reject' && content?.registrationUrl\">\n <a [href]=\"content?.registrationUrl\" target=\"_blank\" class=\"flex action-button justify-center\" >{{ 'apptochome.register' | translate }}</a>\n </ng-container>\n\n </div>\n </ng-template>\n\n <!-- \n PROGRESS FUNCTIONALITY TEMPLATE\n Displays progress bar and rating button functionality\n -->\n <ng-template #progressFunctionality>\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row gap-4 text-sm\">\n <div class=\"flex-1 text-xs\">{{ 'apptocsinglepage.overallProgress' | translate }}</div>\n <div class=\"text-xs\" *ngIf=\"content?.completionPercentage > 0\"> {{ content?.completionPercentage }} %</div>\n </div>\n <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" [progress]=\"content?.completionPercentage\" [progressType]=\"'percentage'\"\n [customClassName]=\"'content-progress'\" >\n </ws-widget-content-progress>\n </div>\n </div>\n\n <ng-container *ngIf=\"content?.completionPercentage >= 50\">\n <button mat-stroked-button color=\"accent\" type=\"button\" class=\"rate-button\" (click)=\"openFeedbackDialog(content)\">\n <mat-icon class=\"nodtranslate\">star_purple500</mat-icon>\n <ng-container *ngIf=\"!userRating\">\n <div>{{ 'apptocsinglepage.rateNow' | translate }}</div>\n </ng-container>\n <ng-container *ngIf=\"userRating\">\n <div>{{ 'apptocsinglepage.editRating' | translate }}</div>\n </ng-container>\n </button>\n </ng-container>\n </div>\n </ng-template>\n\n <!-- \n MAIN CONTENT DISPLAY SECTION\n Banner, details, and content layout\n -->\n <div class=\"toc-banner\">\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"banner-details toc-content\" #bannerDetails>\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-center justify-between gap-4\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'140px'\" [height]=\"'24px'\" [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row gap-2\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{ translateLabel(content?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{ translateLabel(content?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n \n <div class=\"flex items-center\" *ngIf=\"cbPlanEndDate\">\n <div class=\"flex items-center due-tag text-xs leading-3\" [ngClass]=\"{'due-warning': cbPlanDuration === nsCardContentData.UPCOMING, 'due-overdue': cbPlanDuration === nsCardContentData.OVERDUE, 'due-success': cbPlanDuration === nsCardContentData.SUCCESS}\" >\n {{ 'common.dueBy' | translate }} - &nbsp;<span class=\"font-bold\">{{ cbPlanEndDate | date: 'd MMM, y'}}</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex items-center text-white mob-share\" *ngIf=\"canShare\">\n <mat-icon class=\"nodtranslate\" (click)=\"onClickOfShare()\">share</mat-icon>\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'90%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'70%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"banner-text text-base sm:text-4xl leading-6 sm:leading-10 font-bold nodtranslate\">{{ handleCapitalize(content?.name) }}</div>\n <div class=\"text-sm sm:text-base source-text font-semibold break-words nodtranslate\" #contentSource [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{content?.source}}\">{{ 'cardcontentv2.by' | translate }} {{ content?.source }}</div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'88px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex gap-4 items-center\" *ngIf=\"content?.averageRating || content?.additionalTags?.length\">\n <div class=\"flex flex-row rating-chip py-2 items-center cursor-pointer\" (click)=\"handleNavigateToReviews()\" *ngIf=\"content?.averageRating\">\n <div class=\"flex flex-row gap-1 margin-left-s items-center\">\n <mat-icon class=\"nodtranslate\">grade</mat-icon>\n <div class=\"text-white text-sm leading-4\">{{ content?.averageRating }}</div>\n </div>\n <div class=\"separator\"></div>\n <div class=\"text-white text-sm leading-4 margin-right-m\">{{ content?.totalRating | pipeCountTransform }}</div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"content?.additionalTags?.length\">\n <div class=\"most-enrolled-chip text-xs leading-3\">\n <span *ngIf=\"content?.additionalTags?.includes('mostTrending')\">{{ 'cardcontentv2.mostTrending' | translate }}</span>\n <span *ngIf=\"content?.additionalTags?.includes('mostEnrolled')\">{{ 'cardcontentv2.mostEnrolled' | translate }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'180px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && content?.sYS_INTERNAL_LAST_UPDATED_ON\">\n <div class=\"text-xs leading-4 source-text nodtranslate\">({{ 'apptoc.lastUpdatedOn' | translate }} {{ content?.sYS_INTERNAL_LAST_UPDATED_ON | date: 'MMM d, y' }})</div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"toc-content\">\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM &&\n selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails &&\n selectedBatchData?.content[0]?.enrollmentEndDate\">\n <div class=\"location-details mt-6\">\n <div class=\"flex items-center gap-4 pb-3\">\n <mat-icon class=\"location-icon nodtranslate\">\n location_on\n </mat-icon>\n <div class=\"loc-desc\">\n {{selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails}}\n </div>\n </div>\n <div class=\"flex items-center gap-4\">\n <mat-icon class=\"event-icon nodtranslate\">\n event</mat-icon>\n <div class=\"loc-desc\">\n Last date of enrollment - {{selectedBatchData?.content[0]?.enrollmentEndDate | date: 'dd/MM/yyyy'}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"recommendedCoursesId && !feedbackGiven\">\n <div class=\"px-4 py-3 mt-6 relevent-wrapper\">\n <div class=\"flex gap-4 items-center flex-wrap flex justify-center md:justify-start\">\n <img src=\"/assets/images/sakshamAI/lady-greet.svg\" alt=\"greet\" width=\"56.89\" height=\"64\">\n <div class=\"relevent-info\">\n <span class=\"font-bolder text-sm relevent-heading block mb-1\">{{ 'home.tocReleventHeading' | translate }}</span>\n <span class=\"relevent-subinfo font-normal text-sm block\">{{ 'home.tocReleventSubHeading' | translate }}</span>\n </div>\n <div class=\"flex flex-middle relevant-container\">\n <div class=\"flex flex-middle relevent-normal relevent-btn py-2 px-4 relevant-box\"\n (mouseenter)=\"isReleventBtnHovered = true\"\n (mouseleave)=\"isReleventBtnHovered = false\" (click)=\"handleAcceptRelevent()\">\n <img\n [src]=\"isReleventBtnHovered && !isRelevent ? SAKSHAMAI_ICON_LOADER : SAKSHAMAI_ICON_NORMAL\"\n alt=\"loader\" width=\"16\" height=\"16\" class=\"mr-2\">\n <span class=\"text-relevent ff-lato text-sm font-bold\">{{ 'home.relevent' | translate }}</span>\n </div>\n \n <div class=\"flex flex-middle no-button ml-8\" (click)=\"handleDeclineRelevent()\">\n <mat-icon class=\"mat-icon text-no mr-1 nodtranslate\">thumb_down</mat-icon>\n <span class=\"text-no ff-lato text-sm font-bold\">{{ 'home.no' | translate }}</span>\n </div> \n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"pb-4 lg:py-4\">\n <!-- Overall progress functionality -->\n <div class=\"mobile-progress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </div>\n <!-- Overall progress functionality -->\n\n <ws-widget-content-toc [content]=\"content\" [componentName]=\"'toc'\" [pathSet]=\"pathSet\" [tocStructure]=\"tocStructure\" \n [forPreview]=\"forPreview\" [isEnrolled]=\"batchData?.enrolled\" [resumeData]=\"resumeData\" [batchData]=\"selectedBatchData\" [skeletonLoader]=\"skeletonLoader\" \n [changeTab]=\"changeTab\" [hierarchyMapData]=\"tocSvc?.hashmap\" [selectedBatchData]=\"selectedBatchData\" [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\" [kparray]=\"kparray\"\n (playResumeForAI)=\"playResumeForAI()\" (enrollUserToAI)=\"enrollUserToAI()\" [contentReadData]=\"contentReadData\"></ws-widget-content-toc>\n <div class=\"mob-tip-for-learner\">\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n </div>\n </div>\n \n\n <div class=\"right-container\" >\n <!-- if needed sticky of right container add this to below div => #rightContainer -->\n <div class=\"right-content\">\n <div class=\"right-content-inner\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'384px'\" [height]=\"'224px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col image-div\" [ngStyle]=\"{\n 'background-image': 'url(' + content?.posterImage + ')', 'background-repeat': 'no-repeat', 'background-size': 'cover'}\" [ngClass]=\"{'image-backdrop': scrolled}\">\n <div class=\"flex flex-col justify-between text-container\">\n <div class=\"flex items-center gap-4 justify-between\" [ngClass]=\"{'justify-between': scrolled, 'justify-end': !scrolled}\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\" *ngIf=\"scrolled\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{ translateLabel(content?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{ translateLabel(content?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div (click)=\"onClickOfShare()\" class=\"flex flex-row items-center justify-end gap-2 share-tag\" *ngIf=\"canShare && !forPreview\">\n <mat-icon class=\"nodtranslate\">share</mat-icon>\n <div>{{ 'apptocsinglepage.share' | translate }}</div>\n </div>\n </div>\n <div class=\"flex flex-col gap-1\" *ngIf=\"scrolled\">\n <div class=\"text-xl leading-6 text-white font-bold\">{{ handleCapitalize(content?.name) }}\n </div>\n <div class=\"text-sm source-text font-semibold break-words\" #contentSource [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{content?.source}}\">{{ 'cardcontentv2.by' | translate }} {{ content?.source }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-col gap-4 p-5 border-bottom\">\n <div class=\"flex flex-col gap-4\" *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n <ng-container *ngIf=\"timer && timer.days >= 0 && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 batch-timer\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container *ngIf=\"!mobile1200 && preAssessmentCompletionStatus\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\" [analytics]=\"analytics\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'68px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"content?.isInIntranet && showIntranetMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>\n <ng-container >{{ 'apptochome.viewedInIntranet' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showInstructorLedMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container >{{ 'apptochome.notAvailableOnline' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showStart.msg === 'youtubeForbidden'\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container >{{ 'apptochome.youtubeContentBlocked' | translate }}</ng-container>\n </div>\n <div *ngIf=\"showBtn\">\n <a href=\"{{ cscmsUrl }}\" target=\"_blank\" class=\"flex action-button justify-center\">\n {{ 'apptochome.applyForPhysicalTraining' | translate }}</a>\n </div>\n\n <!-- Overall progress functionality -->\n <ng-container *ngIf=\"content?.completionStatus <= 2 && isBatchInProgress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </ng-container>\n <!-- Overall progress functionality -->\n\n <!-- <div *ngIf=\"resumeData && !userRating\"> -->\n <!-- <ws-app-karmapoints-panel [btntype]=\"'Rate this course'\" [data]=\"kparray\"\n [pCategory]=\"content?.primaryCategory\"></ws-app-karmapoints-panel> -->\n <!-- </div> -->\n\n <!-- <div *ngIf=\"resumeData && userRating\">\n <ws-app-karmapoints-panel [btntype]=\"'Edit rating'\" [data]=\"kparray\"\n [pCategory]=\"content?.primaryCategory\"></ws-app-karmapoints-panel>\n </div> -->\n\n <ng-container *ngIf=\"actionBtnStatus !== 'wait' && content?.status !== 'Deleted' && content?.status !== 'Expired'\">\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </ng-container>\n </div>\n\n <div class=\"karma-points-div\">\n <ws-widget-karma-points [data]=\"kparray\" (clickClaimKarmaPoints)=\"onClickOfClaim($event)\" [content] = \"content\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"></ws-widget-karma-points>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-wrap gap-6\">\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'40px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\" [showInstructorLedMsg]=\"showInstructorLedMsg\" [contentReadData]=\"contentReadData\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col gap-8 p-5\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\" [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorDetails)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authors' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\" [photoUrl]=\"author?.photo || ''\"\n [name]=\"author?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n </div>\n <!-- <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(content?.creatorContacts)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.curators' | translate }}</div>\n <div class=\"flex flex-row gap-4\" *ngFor=\"let creator of handleParseJsonData(content?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\" [photoUrl]=\"author?.photo || ''\"\n [name]=\"creator?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creator?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.curator' | translate }}</div>\n </div>\n </div>\n </div> -->\n <div class=\"flex flex-col gap-3\" *ngIf=\"content?.source && (contentCreatorData && contentCreatorData?.length)\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let creator of contentCreatorData\">\n <div class=\"flex provider-logo-div\">\n <img *ngIf=\"content?.creatorLogo\" [src]=\"content?.creatorLogo\" alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!content?.creatorLogo\" class=\"mat-icon\" src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\" alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm word-break cursor-pointer\" *ngIf=\"content?.createdFor?.length\" (click)=\"raiseTelemeteryForProvider(content?.source, content?.createdFor[0])\"\n [routerLink]=\"['/app/learn/browse-by/provider', content?.source, content?.createdFor[0], 'micro-sites']\">{{ handleCapitalize(content?.source, 'source') }}\n </div>\n <div class=\"text-sm word-break\" *ngIf=\"!content?.createdFor?.length\">{{ handleCapitalize(content?.source, 'source') }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n\n \n\n </div>\n</div>\n\n <!-- Mobile enrollment button container -->\n <div class=\"mobile-enroll-div\" [ngClass]=\"{'bg-white': content?.primaryCategory === primaryCategory.BLENDED_PROGRAM }\">\n <ng-container *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM \">\n <div class=\"mb-2\" *ngIf=\"mobile1200 && !forPreview || isInIFrame; else authViewBtn\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\" [analytics]=\"analytics\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </div>\n </ng-container>\n <!-- Reuse enrollment functionality template for mobile -->\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </div>\n\n <ws-app-share-toc *ngIf=\"enableShare\" [rootOrgId]=\"rootOrgId\" [content]=\"content\" (resetEnableShare)=\"resetEnableShare($event)\"></ws-app-share-toc>\n</ng-container>\n\n<!-- Template for when no data is found -->\n<ng-template #noDataFound>\n <div class=\"error-not-found flex flex-wrapped margin-left-m margin-top-xl margin-right-m flex-col justify-center align-items-center text-center\">\n <div class=\"error-logo\">\n <div class=\"error-message ws-mat-primary-text font-weight-bold\" >\n The page you requested cannot be found\n </div>\n </div>\n </div>\n</ng-template>\n\n<!-- Authentication view templates -->\n<ng-template #authView>{{'apptochome.view' | translate}}</ng-template>\n\n<ng-template #authViewBtn i18n>\n <a (click)=\"raiseTelemetryForPublic()\" [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\" [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n {{'apptochome.view' | translate}}\n </a>\n</ng-template>\n\n<ng-template #authViewForInviteOnlyAssessment>\n <ng-container\n *ngIf=\"forPreview && content?.courseCategory === 'Invite-Only Assessment'\"> \n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"> \n <ng-container>{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n</ng-template>\n", styles: [".source-text{color:#ffffffb3}.preenrolldone-btn{opacity:1;color:#1d8923;font-family:Lato-Bold,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:2px solid #1D8923;cursor:pointer;height:40px;box-sizing:border-box}.preenrolldone-btn img{margin-left:8px;margin-top:-2px}.toc-banner{background:#3a83cf;background:linear-gradient(135deg,#3a83cf,#1b4ca1);width:100%}.toc-banner .fixed-width{padding:0 16px}.toc-banner .banner-details{padding:36px 0}.toc-banner .banner-details .due-tag{padding:4px;color:#fff;border-radius:4px}.toc-banner .banner-details .due-warning{background-color:#ff9800;border:1px solid #FF9800}.toc-banner .banner-details .due-overdue{background-color:#f44336;border:1px solid #F44336}.toc-banner .banner-details .due-success{background-color:#4caf50;border:1px solid #4CAF50}.toc-banner .banner-details .rating-chip{border:1px solid rgba(0,0,0,.6);border-radius:20px;background-color:#0009}.toc-banner .banner-details .rating-chip mat-icon{width:16px;height:16px;color:#ff9800;font-size:16px}.toc-banner .banner-details .rating-chip .separator{width:1px;height:20px;border-right:1px solid rgba(255,255,255,.16);margin:0 8px}.toc-banner .banner-details .banner-text{color:#fffffff2}.toc-banner .info-div{max-width:384px;width:100%}.toc-banner .most-enrolled-chip{background-color:#ffea9e;border:1px solid #FFEA9E;padding:4px;border-radius:2px}.text-info-div{padding:8px;background-color:#fff;border-radius:64px}.tag-div{border:1px solid #FF9800;background-color:#00000080}.tag-div mat-icon{font-size:12px;width:12px;height:12px}.fixed-width{max-width:1200px;display:block;margin:0 auto}.mat-subheading-1{margin-bottom:4px!important}.initial-circle{width:36px;height:36px;border-radius:50%;background:#1b2133;color:#fff;text-transform:uppercase}.toc-content{max-width:792px;width:100%}.right-container .image-div{height:220px;background-color:#ccc;border-top-left-radius:12px;border-top-right-radius:12px}.right-container .image-div img{max-width:384px;width:100%;height:220px;border-top-left-radius:12px;border-top-right-radius:12px;position:relative;top:-42px}.right-container .image-div .share-container{position:relative;z-index:2;top:20px;margin-right:20px}.right-container .image-div .share-tag{font-weight:700;background-color:#000;border:1px solid #FFF;border-radius:20px;padding:6px 16px;color:#fff;cursor:pointer}.right-container .tag-div mat-icon{width:16px;height:16px;font-size:16px}.right-container .share-tag mat-icon{width:20px;height:20px;font-size:20px}.right-container .text-container{position:relative;z-index:2;height:220px;padding:16px}.right-container .right-content{position:absolute;z-index:10;top:132px;padding-bottom:1rem}.right-container .right-content-inner{background-color:#fff;border-radius:12px;width:384px;margin-bottom:1rem;box-shadow:0 2px 6px -1px #00000080,0 -4px 4px -2px #00000080}.right-container .border-bottom{border-bottom:1px solid rgba(0,0,0,.2)}.right-container .view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.right-container .view-more:hover{background-color:#dcdfe5}.right-container .info-div{background-color:#fef7ed;border:none;border-radius:8px;padding:8px 12px;font-size:14px}.right-container .info-div .mat-icon{width:18px;height:18px;font-size:18px}.right-container .kpi-values{width:64px;padding:8px;text-align:center}.right-container .kpi-values .timer-icon{color:#000000de;height:20px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.mob-tip-for-learner{display:none}@media screen and (max-width: 1000px){.mob-tip-for-learner{display:block;width:100%;padding:0 16px;overflow:hidden;box-sizing:border-box}}.button{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}@media screen and (max-width: 1200px){.right-container{display:none}.action-button:before{content:\"\";position:absolute;inset:-10px;background-color:#ffffff40;border-radius:inherit;filter:blur(10px);z-index:-1}.action-button:after{content:\"\";position:absolute;inset:-10px;box-shadow:0 0 -4px -4px #fff9;border-radius:inherit;z-index:-1}.karma-points-div{display:none}}.enroll-modal{max-width:600px!important;width:100%!important}.enroll-modal .mat-dialog-container{padding:0;border-radius:12px}.confirmation-modal{max-width:420px!important;width:100%!important}.confirmation-modal .mat-dialog-container{border-radius:12px;padding:0}.image-backdrop{background-color:#000!important;position:relative}.image-backdrop:after{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);content:\"\";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000000a6;border-top-left-radius:12px;border-top-right-radius:12px}@media screen and (max-width: 1000px){.confirmation-modal,.enroll-modal{max-width:90vw!important}}.kpi-loader-div{width:18%}a.action-button{color:#fff!important;width:auto;box-sizing:border-box;height:40px;line-height:24px!important}.rate-button{color:#000000de!important;font-size:.875rem;font-weight:700;border:none!important}.rate-button .mat-button-wrapper{display:flex;gap:8px;align-items:center}.mobile-enroll-div{padding:16px;position:fixed;z-index:1000;bottom:0;width:calc(100% - 32px)}.mobile-enroll-div .action-button,.mobile-enroll-div .preenrolldone-btn{min-width:320px;max-width:400px;margin:auto}@media screen and (min-width: 1201px){.mobile-enroll-div,.mob-share{display:none!important}.hideAbove1200{display:none}}.mobile-progress{padding:16px}@media screen and (min-width: 1200px){.mobile-progress{display:none}}.sourceEllipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.text-white{color:#fff!important}.custom-button,.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.sticky{top:56px;overflow:hidden;z-index:10;width:100%}.statusMsg{border-radius:4px;height:40px}.toc-body{padding-bottom:1rem}.toc-body .toc-links{width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links .mat-tab-link{text-align:left;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#0074b6!important}.tab:focus{outline:1px solid!important}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.blue-border{border:2px solid #0074b6!important}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:16px;box-shadow:none;padding-left:0}@media only screen and (max-width: 599px){.meta-section{width:100%}}.font-bold-imp{font-weight:700!important}.info-section{width:20%;min-width:250px}.info-section .custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0!important}}.info-section .glance-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-item .cs-icons .mat-icon{color:#666;vertical-align:middle;font-size:20px}.info-section .glance-container .info-item .cs-icons img{width:20px;height:20px;vertical-align:middle}.info-section .glance-container .info-item .item-heading{font:600 14px/21px Lato;margin:0 0 4px;letter-spacing:0px;color:#0074b6!important}.info-section .glance-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px}.divider-transparent{border-top-color:transparent!important}.scroll-to-top{position:fixed;bottom:15px;right:15px;opacity:0;transition:all .2s ease-in-out;border-radius:50%}.scroll-to-top .icon{font-size:24px!important}.show-scroll{opacity:1;transition:all .2s ease-in-out}.sticky-breadcrumbs{position:sticky;z-index:999;top:72px;width:100%}.sticky-banner{position:sticky;z-index:999}.sticky-navs{position:sticky!important;background:#fff;z-index:999;top:auto}.actbutton{border:1px solid rgba(0,0,0,.16);border-radius:4px;padding:0 15px;width:100%;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.actbutton .mat-icon{margin-right:6px}.disable-start-btn{cursor:not-allowed!important;pointer-events:none!important;opacity:.5!important}.cb-plan-wrap{opacity:1;color:#1b4ca1;font-family:Lato-Regular;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.cb-plan-wrap .cb-danger{border-radius:2px;padding:4px 8px;border:1px solid #d13924;background-color:#d13924!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-success{padding:4px 8px;border-radius:2px;border:1px solid #1d8922;background-color:#1d8922!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-warning{padding:4px 8px;border-radius:2px;border:1px solid #ef951e;background-color:#ef951e!important;color:#fff!important;opacity:1}.bg-white{background-color:#fff}.provider-logo-div{border-radius:4px;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.provider-logo-div img{display:flex;border-radius:4px;width:40px;height:40px;padding:4px}.location-details{background-color:#1b4ca114;padding:16px;border-radius:4px}.location-details .location-icon,.location-details .event-icon{color:#1b4ca1;height:20px;width:14px;font-size:22px}.location-details .loc-desc{font-family:Lato;font-weight:700;font-size:14px;line-height:20px;letter-spacing:.25}.location-details .mat-icon{overflow:visible!important}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.relevent-wrapper{background:#1b4ca129;border-radius:12px}.relevent-wrapper .relevent-info{max-width:400px;margin-right:auto}.relevent-wrapper .relevent-info .relevent-heading{font-family:Montserrat;line-height:17.07px;font-weight:600;color:#000!important}.relevent-wrapper .relevent-info .relevent-subinfo{font-family:Lato;line-height:16.8px;color:#545454}.relevent-normal.relevent-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#276de5;background-color:#fff;border-radius:21px;text-decoration:none;overflow:hidden;transition:all .3s ease-in-out}.relevent-normal.relevent-btn:hover{box-shadow:0 1px 10px #276de599}.relevent-normal.relevent-btn{cursor:pointer}.relevent-normal.relevent-btn:before{content:\"\";position:absolute;inset:0;padding:2px 2.5px;border-radius:21px;background:linear-gradient(89.96deg,#f3962f .04%,#276de5 99.96%);-webkit-mask:linear-gradient(white,white) content-box,linear-gradient(white,white);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .3s ease-in-out;cursor:pointer}.relevent-normal.relevent-btn:hover:before{opacity:1}.relevant-container{width:max-content}.no-button{opacity:1;transform:scale(1);transition:opacity .3s ease-in-out,transform .3s ease-in-out;color:#1b4ca1;cursor:pointer}\n"], encapsulation: i0.ViewEncapsulation.None }); }
2204
+ }
2205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocHomeComponent, decorators: [{
2206
+ type: Component,
2207
+ args: [{ selector: 'ws-app-app-toc-home', encapsulation: ViewEncapsulation.None, template: "<!-- \n Main Container - Displays course/content details with enrollment functionality\n Only displays content if courseID is available, otherwise shows \"not found\" message\n-->\n<ng-container *ngIf=\"courseID else noDataFound\">\n <!-- \n ENROLLMENT TEMPLATE - Handles all enrollment/start/resume button functionality\n Used in multiple places throughout the template\n -->\n <ng-template #enrollFunctionality>\n <div [hidden]=\"isResource && !content?.artifactUrl?.length\" class=\"flex flex-col gap-4 text-center\">\n <!-- SECTION: Regular course enrollment buttons -->\n <ng-container *ngIf=\"content?.primaryCategory !== primaryCategory.PROGRAM\n && content?.primaryCategory !== primaryCategory.CURATED_PROGRAM\n && content?.primaryCategory !== primaryCategory.STANDALONE_ASSESSMENT &&\n content?.primaryCategory !== primaryCategory.BLENDED_PROGRAM\">\n <!-- START/RESUME button for granted courses -->\n <ng-container *ngIf=\"(actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !(content?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 &&\n !content?.artifactUrl?.length) &&\n !(content?.primaryCategory === primaryCategory.COURSE && !batchData?.enrolled) &&\n !(content?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl) &&\n !(content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)) &&\n !(content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId)\">\n <a *ngIf=\"showStart.show && !isPostAssessment && !forPreview\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"(!content.completionPercentage || content.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData ? translateLabels('resume', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100 || certData\">\n {{ resumeData ? translateLabels('Start again', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n\n <!-- TAKE ASSESSMENT button (for post assessments) -->\n <button *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" (click)=\"raiseTelemetryForPublic()\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >{{ 'apptochome.takeAssessment' | translate }}</ng-container>\n </button>\n\n <!-- Commented karma points panel functionality -->\n </ng-container>\n \n <!-- ENROLL button for courses that require enrollment -->\n <ng-container *ngIf=\" (actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) && \n !( content?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 && !content?.artifactUrl?.length ) &&\n !( content?.primaryCategory === primaryCategory.COURSE && batchData?.enrolled ) &&\n !(content?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl)) &&\n !(content?.primaryCategory === primaryCategory.PROGRAM) &&\n !(content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)\">\n <ng-container *ngIf=\"content?.primaryCategory !== primaryCategory.RESOURCE && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\" (click)=\"handleAutoBatchAssign()\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL - Used across multiple sections -->\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: BLENDED_PROGRAM pre-enrollment functionality -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && !preAssessmentCompletionStatus\">\n <a class=\"flex action-button enroll-btn justify-center resume\" *ngIf=\"contentReadData?.preEnrolmentResources?.length\" (click)=\"routeToPreAssessent()\">\n <ng-container >\n {{ 'apptochome.preEnroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n \n <!-- SECTION: BLENDED_PROGRAM pre-enrollment completion message -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && preAssessmentCompletionStatus\">\n <a class=\"flex preenrolldone-btn justify-center resume\">\n <ng-container >\n {{ 'apptochome.preEnrollDone' | translate }}<img src=\"/assets/icons/Accept_icon.png\" alt=\"tick\" class=\"tick-icon\">\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: PROGRAM & MANDATORY_COURSE_GOAL handling -->\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.PROGRAM || content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL\">\n \n <!-- SECTION: Moderated program enrollment handling -->\n <ng-container *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && (contentReadData?.batches && !batchData?.enrolled)\">\n <ng-container *ngIf=\"((content?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && !contentReadData?.batches[0].endDate\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleAutoBatchAssign()\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >\n <!-- ENROLL BUTTON LABEL -->\n {{'apptochome.enroll' | translate}}\n </ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n <ng-container *ngIf=\"((content?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && contentReadData?.batches[0].endDate\">\n \n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" [analytics]=\"analytics\" (programEnrollCall)=\"programEnrollCall($event)\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: No batches message -->\n <ng-container *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && !contentReadData?.batches && !batchData?.enrolled && !enrollBtnLoading\">\n No Batches\n </ng-container>\n\n <!-- SECTION: Status messages for non-moderated programs -->\n <ng-container *ngIf=\"courseCategory?.MODERATED_PROGRAM !== contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container\n *ngIf=\"!(content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) && content?.primaryCategory !== primaryCategory.MANDATORY_COURSE_GOAL\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.youAreNotInvited' | translate }} </span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: Batch status messages for moderated programs -->\n <ng-container *ngIf=\"!isBatchInProgress && courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: In-progress batch with resume/start functionality -->\n <ng-container *ngIf=\"isBatchInProgress &&\n ( actionBtnStatus === 'grant' &&\n !(isMobile && content?.isInIntranet) &&\n (content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) ||\n (content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL && currentCourseBatchId)\n )\">\n <a *ngIf=\"showStart.show && !isPostAssessment\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content.completionPercentage || content.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100\">\n {{ resumeData || content.completionPercentage === 100 ? \"Start again\" : \"Start\" }}\n </ng-container>\n </a>\n <a *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >{{ 'apptochome.takeAssessment' | translate }}</ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: CURATED_PROGRAM in-progress handling -->\n <ng-container\n *ngIf=\"isBatchInProgress && (content?.primaryCategory === primaryCategory.CURATED_PROGRAM && batchData?.enrolled) && !enrollBtnLoading\">\n <a *ngIf=\"showStart.show && !isPostAssessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content.completionPercentage || content.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100\">\n {{ resumeData || content.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: Loading state for enrollment button -->\n <ng-container *ngIf=\"enrollBtnLoading\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'36px'\"\n [bindingClass]=\"'flex rounded h-8'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <!-- SECTION: CURATED_PROGRAM enrollment button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.CURATED_PROGRAM && !batchData?.enrolled && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"(click)=\"handleAutoBatchAssign()\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL -->\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: STANDALONE_ASSESSMENT enrollment button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && content?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleAutoBatchAssign()\" *ngIf=\"!forPreview || isInIFrame\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL -->\n {{ 'apptochome.enroll' | translate }} \n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: INVITE-ONLY STANDALONE_ASSESSMENT message --> \n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && content?.courseCategory === 'Invite-Only Assessment'\">\n \n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewForInviteOnlyAssessment\" >\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.youAreNotInvitedForAssessment' | translate }} </span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: Enrolled INVITE-ONLY STANDALONE_ASSESSMENT take test button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && isBatchInProgress && !enrollBtnLoading && content?.courseCategory === 'Invite-Only Assessment'\"> \n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate }}</ng-container>\n <ng-container *ngIf=\"content.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: Status messages for INVITE-ONLY STANDALONE_ASSESSMENT -->\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA' && content?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA' && content?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n \n <!-- SECTION: Regular STANDALONE_ASSESSMENT enrolled take test button -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && !enrollBtnLoading && content?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate }}</ng-container>\n <ng-container *ngIf=\"content.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: BLENDED_PROGRAM workflow status -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <!-- Review status message -->\n <ng-container *ngIf=\"batchData?.workFlow?.wfInitiated &&\n !(batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN)\">\n <div class=\"ws-mat-accent-text ws-mat-accent-light-bg flex items-center justify-center statusMsg\">\n <p class=\"margin-remove-bottom font-bold\">\n {{ 'apptochome.requestUnderReview' | translate }}\n </p>\n </div>\n </ng-container>\n\n <!-- Approved BLENDED_PROGRAM start/resume button -->\n <ng-container>\n <a\n *ngIf=\"showStart.show && batchData?.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED\"\n [routerLink]=\"isBatchInProgress? (resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url : '' \" (click)=\"raiseTelemetryForPublic()\"\n [queryParams]=\"isBatchInProgress ? (resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START') : '' \"\n class=\"flex action-button justify-center resume\" [ngClass]=\"{'disable-start-btn': !isBatchInProgress}\">\n <ng-container *ngIf=\"(!content.completionPercentage || content.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100 || certData\">\n {{ resumeData || content.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') : translateLabels('start', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: External registration link -->\n <ng-container *ngIf=\"actionBtnStatus == 'reject' && content?.registrationUrl\">\n <a [href]=\"content?.registrationUrl\" target=\"_blank\" class=\"flex action-button justify-center\" >{{ 'apptochome.register' | translate }}</a>\n </ng-container>\n\n </div>\n </ng-template>\n\n <!-- \n PROGRESS FUNCTIONALITY TEMPLATE\n Displays progress bar and rating button functionality\n -->\n <ng-template #progressFunctionality>\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row gap-4 text-sm\">\n <div class=\"flex-1 text-xs\">{{ 'apptocsinglepage.overallProgress' | translate }}</div>\n <div class=\"text-xs\" *ngIf=\"content?.completionPercentage > 0\"> {{ content?.completionPercentage }} %</div>\n </div>\n <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" [progress]=\"content?.completionPercentage\" [progressType]=\"'percentage'\"\n [customClassName]=\"'content-progress'\" >\n </ws-widget-content-progress>\n </div>\n </div>\n\n <ng-container *ngIf=\"content?.completionPercentage >= 50\">\n <button mat-stroked-button color=\"accent\" type=\"button\" class=\"rate-button\" (click)=\"openFeedbackDialog(content)\">\n <mat-icon class=\"nodtranslate\">star_purple500</mat-icon>\n <ng-container *ngIf=\"!userRating\">\n <div>{{ 'apptocsinglepage.rateNow' | translate }}</div>\n </ng-container>\n <ng-container *ngIf=\"userRating\">\n <div>{{ 'apptocsinglepage.editRating' | translate }}</div>\n </ng-container>\n </button>\n </ng-container>\n </div>\n </ng-template>\n\n <!-- \n MAIN CONTENT DISPLAY SECTION\n Banner, details, and content layout\n -->\n <div class=\"toc-banner\">\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"banner-details toc-content\" #bannerDetails>\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-center justify-between gap-4\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'140px'\" [height]=\"'24px'\" [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row gap-2\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{ translateLabel(content?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{ translateLabel(content?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n \n <div class=\"flex items-center\" *ngIf=\"cbPlanEndDate\">\n <div class=\"flex items-center due-tag text-xs leading-3\" [ngClass]=\"{'due-warning': cbPlanDuration === nsCardContentData.UPCOMING, 'due-overdue': cbPlanDuration === nsCardContentData.OVERDUE, 'due-success': cbPlanDuration === nsCardContentData.SUCCESS}\" >\n {{ 'common.dueBy' | translate }} - &nbsp;<span class=\"font-bold\">{{ cbPlanEndDate | date: 'd MMM, y'}}</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex items-center text-white mob-share\" *ngIf=\"canShare\">\n <mat-icon class=\"nodtranslate\" (click)=\"onClickOfShare()\">share</mat-icon>\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'90%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'70%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"banner-text text-base sm:text-4xl leading-6 sm:leading-10 font-bold nodtranslate\">{{ handleCapitalize(content?.name) }}</div>\n <div class=\"text-sm sm:text-base source-text font-semibold break-words nodtranslate\" #contentSource [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{content?.source}}\">{{ 'cardcontentv2.by' | translate }} {{ content?.source }}</div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'88px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex gap-4 items-center\" *ngIf=\"content?.averageRating || content?.additionalTags?.length\">\n <div class=\"flex flex-row rating-chip py-2 items-center cursor-pointer\" (click)=\"handleNavigateToReviews()\" *ngIf=\"content?.averageRating\">\n <div class=\"flex flex-row gap-1 margin-left-s items-center\">\n <mat-icon class=\"nodtranslate\">grade</mat-icon>\n <div class=\"text-white text-sm leading-4\">{{ content?.averageRating }}</div>\n </div>\n <div class=\"separator\"></div>\n <div class=\"text-white text-sm leading-4 margin-right-m\">{{ content?.totalRating | pipeCountTransform }}</div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"content?.additionalTags?.length\">\n <div class=\"most-enrolled-chip text-xs leading-3\">\n <span *ngIf=\"content?.additionalTags?.includes('mostTrending')\">{{ 'cardcontentv2.mostTrending' | translate }}</span>\n <span *ngIf=\"content?.additionalTags?.includes('mostEnrolled')\">{{ 'cardcontentv2.mostEnrolled' | translate }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'180px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && content?.sYS_INTERNAL_LAST_UPDATED_ON\">\n <div class=\"text-xs leading-4 source-text nodtranslate\">({{ 'apptoc.lastUpdatedOn' | translate }} {{ content?.sYS_INTERNAL_LAST_UPDATED_ON | date: 'MMM d, y' }})</div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"toc-content\">\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM &&\n selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails &&\n selectedBatchData?.content[0]?.enrollmentEndDate\">\n <div class=\"location-details mt-6\">\n <div class=\"flex items-center gap-4 pb-3\">\n <mat-icon class=\"location-icon nodtranslate\">\n location_on\n </mat-icon>\n <div class=\"loc-desc\">\n {{selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails}}\n </div>\n </div>\n <div class=\"flex items-center gap-4\">\n <mat-icon class=\"event-icon nodtranslate\">\n event</mat-icon>\n <div class=\"loc-desc\">\n Last date of enrollment - {{selectedBatchData?.content[0]?.enrollmentEndDate | date: 'dd/MM/yyyy'}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"recommendedCoursesId && !feedbackGiven\">\n <div class=\"px-4 py-3 mt-6 relevent-wrapper\">\n <div class=\"flex gap-4 items-center flex-wrap flex justify-center md:justify-start\">\n <img src=\"/assets/images/sakshamAI/lady-greet.svg\" alt=\"greet\" width=\"56.89\" height=\"64\">\n <div class=\"relevent-info\">\n <span class=\"font-bolder text-sm relevent-heading block mb-1\">{{ 'home.tocReleventHeading' | translate }}</span>\n <span class=\"relevent-subinfo font-normal text-sm block\">{{ 'home.tocReleventSubHeading' | translate }}</span>\n </div>\n <div class=\"flex flex-middle relevant-container\">\n <div class=\"flex flex-middle relevent-normal relevent-btn py-2 px-4 relevant-box\"\n (mouseenter)=\"isReleventBtnHovered = true\"\n (mouseleave)=\"isReleventBtnHovered = false\" (click)=\"handleAcceptRelevent()\">\n <img\n [src]=\"isReleventBtnHovered && !isRelevent ? SAKSHAMAI_ICON_LOADER : SAKSHAMAI_ICON_NORMAL\"\n alt=\"loader\" width=\"16\" height=\"16\" class=\"mr-2\">\n <span class=\"text-relevent ff-lato text-sm font-bold\">{{ 'home.relevent' | translate }}</span>\n </div>\n \n <div class=\"flex flex-middle no-button ml-8\" (click)=\"handleDeclineRelevent()\">\n <mat-icon class=\"mat-icon text-no mr-1 nodtranslate\">thumb_down</mat-icon>\n <span class=\"text-no ff-lato text-sm font-bold\">{{ 'home.no' | translate }}</span>\n </div> \n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"pb-4 lg:py-4\">\n <!-- Overall progress functionality -->\n <div class=\"mobile-progress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </div>\n <!-- Overall progress functionality -->\n\n <ws-widget-content-toc [content]=\"content\" [componentName]=\"'toc'\" [pathSet]=\"pathSet\" [tocStructure]=\"tocStructure\" \n [forPreview]=\"forPreview\" [isEnrolled]=\"batchData?.enrolled\" [resumeData]=\"resumeData\" [batchData]=\"selectedBatchData\" [skeletonLoader]=\"skeletonLoader\" \n [changeTab]=\"changeTab\" [hierarchyMapData]=\"tocSvc?.hashmap\" [selectedBatchData]=\"selectedBatchData\" [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\" [kparray]=\"kparray\"\n (playResumeForAI)=\"playResumeForAI()\" (enrollUserToAI)=\"enrollUserToAI()\" [contentReadData]=\"contentReadData\"></ws-widget-content-toc>\n <div class=\"mob-tip-for-learner\">\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n </div>\n </div>\n \n\n <div class=\"right-container\" >\n <!-- if needed sticky of right container add this to below div => #rightContainer -->\n <div class=\"right-content\">\n <div class=\"right-content-inner\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'384px'\" [height]=\"'224px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col image-div\" [ngStyle]=\"{\n 'background-image': 'url(' + content?.posterImage + ')', 'background-repeat': 'no-repeat', 'background-size': 'cover'}\" [ngClass]=\"{'image-backdrop': scrolled}\">\n <div class=\"flex flex-col justify-between text-container\">\n <div class=\"flex items-center gap-4 justify-between\" [ngClass]=\"{'justify-between': scrolled, 'justify-end': !scrolled}\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\" *ngIf=\"scrolled\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{ translateLabel(content?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{ translateLabel(content?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div (click)=\"onClickOfShare()\" class=\"flex flex-row items-center justify-end gap-2 share-tag\" *ngIf=\"canShare && !forPreview\">\n <mat-icon class=\"nodtranslate\">share</mat-icon>\n <div>{{ 'apptocsinglepage.share' | translate }}</div>\n </div>\n </div>\n <div class=\"flex flex-col gap-1\" *ngIf=\"scrolled\">\n <div class=\"text-xl leading-6 text-white font-bold\">{{ handleCapitalize(content?.name) }}\n </div>\n <div class=\"text-sm source-text font-semibold break-words\" #contentSource [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{content?.source}}\">{{ 'cardcontentv2.by' | translate }} {{ content?.source }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-col gap-4 p-5 border-bottom\">\n <div class=\"flex flex-col gap-4\" *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n <ng-container *ngIf=\"timer && timer.days >= 0 && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 batch-timer\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container *ngIf=\"!mobile1200 && preAssessmentCompletionStatus\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\" [analytics]=\"analytics\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'68px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"content?.isInIntranet && showIntranetMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>\n <ng-container >{{ 'apptochome.viewedInIntranet' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showInstructorLedMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container >{{ 'apptochome.notAvailableOnline' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showStart.msg === 'youtubeForbidden'\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container >{{ 'apptochome.youtubeContentBlocked' | translate }}</ng-container>\n </div>\n <div *ngIf=\"showBtn\">\n <a href=\"{{ cscmsUrl }}\" target=\"_blank\" class=\"flex action-button justify-center\">\n {{ 'apptochome.applyForPhysicalTraining' | translate }}</a>\n </div>\n\n <!-- Overall progress functionality -->\n <ng-container *ngIf=\"content?.completionStatus <= 2 && isBatchInProgress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </ng-container>\n <!-- Overall progress functionality -->\n\n <!-- <div *ngIf=\"resumeData && !userRating\"> -->\n <!-- <ws-app-karmapoints-panel [btntype]=\"'Rate this course'\" [data]=\"kparray\"\n [pCategory]=\"content?.primaryCategory\"></ws-app-karmapoints-panel> -->\n <!-- </div> -->\n\n <!-- <div *ngIf=\"resumeData && userRating\">\n <ws-app-karmapoints-panel [btntype]=\"'Edit rating'\" [data]=\"kparray\"\n [pCategory]=\"content?.primaryCategory\"></ws-app-karmapoints-panel>\n </div> -->\n\n <ng-container *ngIf=\"actionBtnStatus !== 'wait' && content?.status !== 'Deleted' && content?.status !== 'Expired'\">\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </ng-container>\n </div>\n\n <div class=\"karma-points-div\">\n <ws-widget-karma-points [data]=\"kparray\" (clickClaimKarmaPoints)=\"onClickOfClaim($event)\" [content] = \"content\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"></ws-widget-karma-points>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-wrap gap-6\">\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'40px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\" [showInstructorLedMsg]=\"showInstructorLedMsg\" [contentReadData]=\"contentReadData\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col gap-8 p-5\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\" [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorDetails)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authors' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\" [photoUrl]=\"author?.photo || ''\"\n [name]=\"author?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n </div>\n <!-- <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(content?.creatorContacts)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.curators' | translate }}</div>\n <div class=\"flex flex-row gap-4\" *ngFor=\"let creator of handleParseJsonData(content?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\" [photoUrl]=\"author?.photo || ''\"\n [name]=\"creator?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creator?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.curator' | translate }}</div>\n </div>\n </div>\n </div> -->\n <div class=\"flex flex-col gap-3\" *ngIf=\"content?.source && (contentCreatorData && contentCreatorData?.length)\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let creator of contentCreatorData\">\n <div class=\"flex provider-logo-div\">\n <img *ngIf=\"content?.creatorLogo\" [src]=\"content?.creatorLogo\" alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!content?.creatorLogo\" class=\"mat-icon\" src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\" alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm word-break cursor-pointer\" *ngIf=\"content?.createdFor?.length\" (click)=\"raiseTelemeteryForProvider(content?.source, content?.createdFor[0])\"\n [routerLink]=\"['/app/learn/browse-by/provider', content?.source, content?.createdFor[0], 'micro-sites']\">{{ handleCapitalize(content?.source, 'source') }}\n </div>\n <div class=\"text-sm word-break\" *ngIf=\"!content?.createdFor?.length\">{{ handleCapitalize(content?.source, 'source') }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n\n \n\n </div>\n</div>\n\n <!-- Mobile enrollment button container -->\n <div class=\"mobile-enroll-div\" [ngClass]=\"{'bg-white': content?.primaryCategory === primaryCategory.BLENDED_PROGRAM }\">\n <ng-container *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM \">\n <div class=\"mb-2\" *ngIf=\"mobile1200 && !forPreview || isInIFrame; else authViewBtn\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\" [analytics]=\"analytics\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </div>\n </ng-container>\n <!-- Reuse enrollment functionality template for mobile -->\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </div>\n\n <ws-app-share-toc *ngIf=\"enableShare\" [rootOrgId]=\"rootOrgId\" [content]=\"content\" (resetEnableShare)=\"resetEnableShare($event)\"></ws-app-share-toc>\n</ng-container>\n\n<!-- Template for when no data is found -->\n<ng-template #noDataFound>\n <div class=\"error-not-found flex flex-wrapped margin-left-m margin-top-xl margin-right-m flex-col justify-center align-items-center text-center\">\n <div class=\"error-logo\">\n <div class=\"error-message ws-mat-primary-text font-weight-bold\" >\n The page you requested cannot be found\n </div>\n </div>\n </div>\n</ng-template>\n\n<!-- Authentication view templates -->\n<ng-template #authView>{{'apptochome.view' | translate}}</ng-template>\n\n<ng-template #authViewBtn i18n>\n <a (click)=\"raiseTelemetryForPublic()\" [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\" [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n {{'apptochome.view' | translate}}\n </a>\n</ng-template>\n\n<ng-template #authViewForInviteOnlyAssessment>\n <ng-container\n *ngIf=\"forPreview && content?.courseCategory === 'Invite-Only Assessment'\"> \n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"> \n <ng-container>{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n</ng-template>\n", styles: [".source-text{color:#ffffffb3}.preenrolldone-btn{opacity:1;color:#1d8923;font-family:Lato-Bold,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:2px solid #1D8923;cursor:pointer;height:40px;box-sizing:border-box}.preenrolldone-btn img{margin-left:8px;margin-top:-2px}.toc-banner{background:#3a83cf;background:linear-gradient(135deg,#3a83cf,#1b4ca1);width:100%}.toc-banner .fixed-width{padding:0 16px}.toc-banner .banner-details{padding:36px 0}.toc-banner .banner-details .due-tag{padding:4px;color:#fff;border-radius:4px}.toc-banner .banner-details .due-warning{background-color:#ff9800;border:1px solid #FF9800}.toc-banner .banner-details .due-overdue{background-color:#f44336;border:1px solid #F44336}.toc-banner .banner-details .due-success{background-color:#4caf50;border:1px solid #4CAF50}.toc-banner .banner-details .rating-chip{border:1px solid rgba(0,0,0,.6);border-radius:20px;background-color:#0009}.toc-banner .banner-details .rating-chip mat-icon{width:16px;height:16px;color:#ff9800;font-size:16px}.toc-banner .banner-details .rating-chip .separator{width:1px;height:20px;border-right:1px solid rgba(255,255,255,.16);margin:0 8px}.toc-banner .banner-details .banner-text{color:#fffffff2}.toc-banner .info-div{max-width:384px;width:100%}.toc-banner .most-enrolled-chip{background-color:#ffea9e;border:1px solid #FFEA9E;padding:4px;border-radius:2px}.text-info-div{padding:8px;background-color:#fff;border-radius:64px}.tag-div{border:1px solid #FF9800;background-color:#00000080}.tag-div mat-icon{font-size:12px;width:12px;height:12px}.fixed-width{max-width:1200px;display:block;margin:0 auto}.mat-subheading-1{margin-bottom:4px!important}.initial-circle{width:36px;height:36px;border-radius:50%;background:#1b2133;color:#fff;text-transform:uppercase}.toc-content{max-width:792px;width:100%}.right-container .image-div{height:220px;background-color:#ccc;border-top-left-radius:12px;border-top-right-radius:12px}.right-container .image-div img{max-width:384px;width:100%;height:220px;border-top-left-radius:12px;border-top-right-radius:12px;position:relative;top:-42px}.right-container .image-div .share-container{position:relative;z-index:2;top:20px;margin-right:20px}.right-container .image-div .share-tag{font-weight:700;background-color:#000;border:1px solid #FFF;border-radius:20px;padding:6px 16px;color:#fff;cursor:pointer}.right-container .tag-div mat-icon{width:16px;height:16px;font-size:16px}.right-container .share-tag mat-icon{width:20px;height:20px;font-size:20px}.right-container .text-container{position:relative;z-index:2;height:220px;padding:16px}.right-container .right-content{position:absolute;z-index:10;top:132px;padding-bottom:1rem}.right-container .right-content-inner{background-color:#fff;border-radius:12px;width:384px;margin-bottom:1rem;box-shadow:0 2px 6px -1px #00000080,0 -4px 4px -2px #00000080}.right-container .border-bottom{border-bottom:1px solid rgba(0,0,0,.2)}.right-container .view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.right-container .view-more:hover{background-color:#dcdfe5}.right-container .info-div{background-color:#fef7ed;border:none;border-radius:8px;padding:8px 12px;font-size:14px}.right-container .info-div .mat-icon{width:18px;height:18px;font-size:18px}.right-container .kpi-values{width:64px;padding:8px;text-align:center}.right-container .kpi-values .timer-icon{color:#000000de;height:20px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.mob-tip-for-learner{display:none}@media screen and (max-width: 1000px){.mob-tip-for-learner{display:block;width:100%;padding:0 16px;overflow:hidden;box-sizing:border-box}}.button{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}@media screen and (max-width: 1200px){.right-container{display:none}.action-button:before{content:\"\";position:absolute;inset:-10px;background-color:#ffffff40;border-radius:inherit;filter:blur(10px);z-index:-1}.action-button:after{content:\"\";position:absolute;inset:-10px;box-shadow:0 0 -4px -4px #fff9;border-radius:inherit;z-index:-1}.karma-points-div{display:none}}.enroll-modal{max-width:600px!important;width:100%!important}.enroll-modal .mat-dialog-container{padding:0;border-radius:12px}.confirmation-modal{max-width:420px!important;width:100%!important}.confirmation-modal .mat-dialog-container{border-radius:12px;padding:0}.image-backdrop{background-color:#000!important;position:relative}.image-backdrop:after{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);content:\"\";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000000a6;border-top-left-radius:12px;border-top-right-radius:12px}@media screen and (max-width: 1000px){.confirmation-modal,.enroll-modal{max-width:90vw!important}}.kpi-loader-div{width:18%}a.action-button{color:#fff!important;width:auto;box-sizing:border-box;height:40px;line-height:24px!important}.rate-button{color:#000000de!important;font-size:.875rem;font-weight:700;border:none!important}.rate-button .mat-button-wrapper{display:flex;gap:8px;align-items:center}.mobile-enroll-div{padding:16px;position:fixed;z-index:1000;bottom:0;width:calc(100% - 32px)}.mobile-enroll-div .action-button,.mobile-enroll-div .preenrolldone-btn{min-width:320px;max-width:400px;margin:auto}@media screen and (min-width: 1201px){.mobile-enroll-div,.mob-share{display:none!important}.hideAbove1200{display:none}}.mobile-progress{padding:16px}@media screen and (min-width: 1200px){.mobile-progress{display:none}}.sourceEllipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.text-white{color:#fff!important}.custom-button,.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.sticky{top:56px;overflow:hidden;z-index:10;width:100%}.statusMsg{border-radius:4px;height:40px}.toc-body{padding-bottom:1rem}.toc-body .toc-links{width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links .mat-tab-link{text-align:left;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#0074b6!important}.tab:focus{outline:1px solid!important}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.blue-border{border:2px solid #0074b6!important}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:16px;box-shadow:none;padding-left:0}@media only screen and (max-width: 599px){.meta-section{width:100%}}.font-bold-imp{font-weight:700!important}.info-section{width:20%;min-width:250px}.info-section .custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0!important}}.info-section .glance-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-item .cs-icons .mat-icon{color:#666;vertical-align:middle;font-size:20px}.info-section .glance-container .info-item .cs-icons img{width:20px;height:20px;vertical-align:middle}.info-section .glance-container .info-item .item-heading{font:600 14px/21px Lato;margin:0 0 4px;letter-spacing:0px;color:#0074b6!important}.info-section .glance-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px}.divider-transparent{border-top-color:transparent!important}.scroll-to-top{position:fixed;bottom:15px;right:15px;opacity:0;transition:all .2s ease-in-out;border-radius:50%}.scroll-to-top .icon{font-size:24px!important}.show-scroll{opacity:1;transition:all .2s ease-in-out}.sticky-breadcrumbs{position:sticky;z-index:999;top:72px;width:100%}.sticky-banner{position:sticky;z-index:999}.sticky-navs{position:sticky!important;background:#fff;z-index:999;top:auto}.actbutton{border:1px solid rgba(0,0,0,.16);border-radius:4px;padding:0 15px;width:100%;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.actbutton .mat-icon{margin-right:6px}.disable-start-btn{cursor:not-allowed!important;pointer-events:none!important;opacity:.5!important}.cb-plan-wrap{opacity:1;color:#1b4ca1;font-family:Lato-Regular;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.cb-plan-wrap .cb-danger{border-radius:2px;padding:4px 8px;border:1px solid #d13924;background-color:#d13924!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-success{padding:4px 8px;border-radius:2px;border:1px solid #1d8922;background-color:#1d8922!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-warning{padding:4px 8px;border-radius:2px;border:1px solid #ef951e;background-color:#ef951e!important;color:#fff!important;opacity:1}.bg-white{background-color:#fff}.provider-logo-div{border-radius:4px;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.provider-logo-div img{display:flex;border-radius:4px;width:40px;height:40px;padding:4px}.location-details{background-color:#1b4ca114;padding:16px;border-radius:4px}.location-details .location-icon,.location-details .event-icon{color:#1b4ca1;height:20px;width:14px;font-size:22px}.location-details .loc-desc{font-family:Lato;font-weight:700;font-size:14px;line-height:20px;letter-spacing:.25}.location-details .mat-icon{overflow:visible!important}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.relevent-wrapper{background:#1b4ca129;border-radius:12px}.relevent-wrapper .relevent-info{max-width:400px;margin-right:auto}.relevent-wrapper .relevent-info .relevent-heading{font-family:Montserrat;line-height:17.07px;font-weight:600;color:#000!important}.relevent-wrapper .relevent-info .relevent-subinfo{font-family:Lato;line-height:16.8px;color:#545454}.relevent-normal.relevent-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#276de5;background-color:#fff;border-radius:21px;text-decoration:none;overflow:hidden;transition:all .3s ease-in-out}.relevent-normal.relevent-btn:hover{box-shadow:0 1px 10px #276de599}.relevent-normal.relevent-btn{cursor:pointer}.relevent-normal.relevent-btn:before{content:\"\";position:absolute;inset:0;padding:2px 2.5px;border-radius:21px;background:linear-gradient(89.96deg,#f3962f .04%,#276de5 99.96%);-webkit-mask:linear-gradient(white,white) content-box,linear-gradient(white,white);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .3s ease-in-out;cursor:pointer}.relevent-normal.relevent-btn:hover:before{opacity:1}.relevant-container{width:max-content}.no-button{opacity:1;transform:scale(1);transition:opacity .3s ease-in-out,transform .3s ease-in-out;color:#1b4ca1;cursor:pointer}\n"] }]
2208
+ }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.WidgetContentService }, { type: i3.AppTocService }, { type: i4.LoggerService }, { type: i4.ConfigurationsService }, { type: i5.DomSanitizer }, { type: i6.AccessControlService }, { type: i7.MatLegacySnackBar }, { type: i8.MatLegacyDialog }, { type: i9.MobileAppsService }, { type: i4.UtilityService }, { type: i10.ActionService }, { type: i11.ViewerUtilService }, { type: i12.RatingService }, { type: i4.TelemetryService }, { type: i13.TranslateService }, { type: i4.MultilingualTranslationsService }, { type: i4.EventService }, { type: i7.MatLegacySnackBar }, { type: i14.LoadCheckService }, { type: i15.HandleClaimService }, { type: i16.ResetRatingsService }, { type: i17.TimerService }, { type: i4.WidgetEnrollService }, { type: i18.WidgetContentLibService }, { type: i4.DataTransferService }, { type: i19.MatSnackBar }, { type: i18.WidgetUserServiceLib }, { type: i20.NetCoreService }, { type: undefined, decorators: [{
2209
+ type: Inject,
2210
+ args: ['environment']
2211
+ }] }]; }, propDecorators: { forPreview: [{
2212
+ type: Input
2213
+ }], menuElement: [{
2214
+ type: ViewChild,
2215
+ args: ['stickyMenu', { static: true }]
2216
+ }], rcElement: [{
2217
+ type: ViewChild,
2218
+ args: ['rightContainer']
2219
+ }], bannerElem: [{
2220
+ type: ViewChild,
2221
+ args: ['bannerDetails', { static: true }]
2222
+ }], contentSource: [{
2223
+ type: ViewChild,
2224
+ args: ['contentSource']
2225
+ }], handleScroll: [{
2226
+ type: HostListener,
2227
+ args: ['window:scroll', ['$event']]
2228
+ }] } });
2229
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1ob21lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9jb21wb25lbnRzL2FwcC10b2MtaG9tZS9hcHAtdG9jLWhvbWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL2NvbXBvbmVudHMvYXBwLXRvYy1ob21lL2FwcC10b2MtaG9tZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFBYyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FDdEUsTUFBTSxlQUFlLENBQUE7QUFFdEIsT0FBTyxFQUF1QyxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNwRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFHL0QsT0FBTyxFQUE0QixPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDeEQsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNqRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7QUFDekIsMkJBQTJCO0FBQzNCLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQTtBQUV0QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUE7QUFDM0IsT0FBTyxjQUFjLE1BQU0sNkJBQTZCLENBQUE7QUFFeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBRWhFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFBO0FBRXhFLE9BQU8sRUFJZ0MsUUFBUSxHQUM5QyxNQUFNLHNCQUFzQixDQUFBO0FBRzdCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0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QkFBc0IsQ0FBQyxDQUFDLEtBQUssR0FBRzs0QkFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUMxQzs0QkFDQSxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFBO3lCQUMxQztxQkFDRjtpQkFDRjtZQUNILENBQUMsQ0FBQyxDQUFBO1NBQ0g7SUFFSCxDQUFDO0lBR0QsZ0JBQWdCLENBQUMsSUFBUztRQUN4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEMsc0NBQXNDO0lBQ3hDLENBQUM7K0dBcDRFVSxtQkFBbUIscytCQTBPcEIsYUFBYTttR0ExT1osbUJBQW1CLHVrQkMvRWhDLDBua0RBaXhCQTs7NEZEbHNCYSxtQkFBbUI7a0JBUi9CLFNBQVM7K0JBQ0UscUJBQXFCLGlCQUloQixpQkFBaUIsQ0FBQyxJQUFJOzswQkE2T2xDLE1BQU07MkJBQUMsYUFBYTs0Q0FwTmQsVUFBVTtzQkFBbEIsS0FBSztnQkF3Q3FDLFdBQVc7c0JBQXJELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkF5RFosU0FBUztzQkFBckMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ21CLFVBQVU7c0JBQXZELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDaEIsYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQXlEMUIsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsXG4gIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiwgSW5wdXQsIEluamVjdCwgT3B0aW9uYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBTYWZlSHRtbCwgRG9tU2FuaXRpemVyLCBTYWZlU3R5bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJ1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIEV2ZW50LCBEYXRhLCBSb3V0ZXIsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3JtcydcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSdcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBzaGFyZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCdcbmRheWpzLmV4dGVuZChpc1NhbWVPckJlZm9yZSlcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50J1xuaW1wb3J0IGlzU2FtZU9yQmVmb3JlIGZyb20gJ2RheWpzL3BsdWdpbi9pc1NhbWVPckJlZm9yZSdcblxuaW1wb3J0IHsgTnNDb250ZW50IH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3dpZGdldC1jb250ZW50Lm1vZGVsJ1xuaW1wb3J0IHsgV2lkZ2V0Q29udGVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9fc2VydmljZXMvd2lkZ2V0LWNvbnRlbnQuc2VydmljZSdcbmltcG9ydCB7IHZpZXdlclJvdXRlR2VuZXJhdG9yIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3ZpZXdlci1yb3V0ZS11dGlsJ1xuaW1wb3J0IHsgTnNXaWRnZXRSZXNvbHZlciB9IGZyb20gJ0BzdW5iaXJkLWNiL3Jlc29sdmVyLXYyJ1xuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvbnNTZXJ2aWNlLCBEYXRhVHJhbnNmZXJTZXJ2aWNlLCBFdmVudFNlcnZpY2UsXG4gIExvZ2dlclNlcnZpY2UsIE11bHRpbGluZ3VhbFRyYW5zbGF0aW9uc1NlcnZpY2UsXG4gIE5zUGFnZSwgVEZldGNoU3RhdHVzLCBUZWxlbWV0cnlTZXJ2aWNlLFxuICBVdGlsaXR5U2VydmljZSwgV2lkZ2V0RW5yb2xsU2VydmljZSwgV3NFdmVudHMsXG59IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xuXG5pbXBvcnQgeyBXaWRnZXRDb250ZW50TGliU2VydmljZSwgV2lkZ2V0VXNlclNlcnZpY2VMaWIgfSBmcm9tICdAc3VuYmlyZC1jYi9jb25zdW1wdGlvbidcbmltcG9ydCB7IE5zQXBwVG9jIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FwcC10b2MubW9kZWwnXG5pbXBvcnQgeyBBcHBUb2NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXBwLXRvYy5zZXJ2aWNlJ1xuaW1wb3J0IHsgQWNjZXNzQ29udHJvbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hY2Nlc3MtY29udHJvbC5zZXJ2aWNlJ1xuaW1wb3J0IHsgTW9iaWxlQXBwc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2JpbGUtYXBwcy5zZXJ2aWNlJ1xuaW1wb3J0IHsgSGFuZGxlQ2xhaW1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX2NvbGxlY3Rpb24vX2NvbW1vbi9jb250ZW50LXRvYy9jb250ZW50LXNlcnZpY2VzL2hhbmRsZS1jbGFpbS5zZXJ2aWNlJ1xuaW1wb3J0IHsgQWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FjdGlvbi5zZXJ2aWNlJ1xuaW1wb3J0IHsgUmF0aW5nU2VydmljZSB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy9yYXRpbmcuc2VydmljZSdcbmltcG9ydCB7IFZpZXdlclV0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmlld2VyLXV0aWwuc2VydmljZSdcbmltcG9ydCB7IExvYWRDaGVja1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2FkLWNoZWNrLnNlcnZpY2UnXG5pbXBvcnQgeyBSZXNldFJhdGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9yZXNldC1yYXRpbmdzLnNlcnZpY2UnXG5cbmltcG9ydCB7IEFwcFRvY0RpYWxvZ0ludHJvVmlkZW9Db21wb25lbnQgfSBmcm9tICcuLi9hcHAtdG9jLWRpYWxvZy1pbnRyby12aWRlby9hcHAtdG9jLWRpYWxvZy1pbnRyby12aWRlby5jb21wb25lbnQnXG5pbXBvcnQgeyBDb250ZW50UmF0aW5nVjJEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9fY29sbGVjdGlvbi9fY29tbW9uL2NvbnRlbnQtcmF0aW5nLXYyLWRpYWxvZy9jb250ZW50LXJhdGluZy12Mi1kaWFsb2cuY29tcG9uZW50J1xuaW1wb3J0IHsgVGltZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGltZXIuc2VydmljZSdcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJ1xuaW1wb3J0IHsgTWF0TGVnYWN5U25hY2tCYXIgYXMgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktc25hY2stYmFyJ1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgYXMgTWF0U25hY2tiYXJOZXcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInXG5pbXBvcnQgeyBOZXRDb3JlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25ldGNvcmUuc2VydmljZSdcbmltcG9ydCB7IE5zQ2FyZENvbnRlbnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2FyZC1jb250ZW50Lm1vZGVsJ1xuaW1wb3J0IHsgTnNQbGF5bGlzdCB9IGZyb20gJy4uLy4uL21vZGVscy9wbGF5bGlzdC5tb2RlbCdcbmltcG9ydCB7IE5zR29hbCB9IGZyb20gJy4uLy4uL21vZGVscy9nb2FsLm1vZGVsJ1xuaW1wb3J0IHsgTm9uUmVsZXZlbnRGZWVkYmFja0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL25vbi1yZWxldmVudC1mZWVkYmFjay1kaWFsb2cvbm9uLXJlbGV2ZW50LWZlZWRiYWNrLWRpYWxvZy5jb21wb25lbnQnXG5cbmV4cG9ydCBlbnVtIEVycm9yVHlwZSB7XG4gIGludGVybmFsU2VydmVyID0gJ2ludGVybmFsU2VydmVyJyxcbiAgc2VydmljZVVuYXZhaWxhYmxlID0gJ3NlcnZpY2VVbmF2YWlsYWJsZScsXG4gIHNvbWV0aGluZ1dyb25nID0gJ3NvbWV0aGluZ1dyb25nJyxcbn1cblxuY29uc3QgZmxhdHRlbkl0ZW1zID0gKGl0ZW1zOiBhbnlbXSwga2V5OiBzdHJpbmcgfCBudW1iZXIpID0+IHtcbiAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoZmxhdHRlbmVkSXRlbXMsIGl0ZW0pID0+IHtcbiAgICBmbGF0dGVuZWRJdGVtcy5wdXNoKGl0ZW0pXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbVtrZXldKSkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICBmbGF0dGVuZWRJdGVtcyA9IGZsYXR0ZW5lZEl0ZW1zLmNvbmNhdChmbGF0dGVuSXRlbXMoaXRlbVtrZXldLCBrZXkpKVxuICAgIH1cbiAgICByZXR1cm4gZmxhdHRlbmVkSXRlbXNcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgfSwgW10pXG59XG5jb25zdCBTTkFDS0JBUl9EVVJBVElPTiA9IDMwMDBcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dzLWFwcC1hcHAtdG9jLWhvbWUnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXRvYy1ob21lLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXBwLXRvYy1ob21lLmNvbXBvbmVudC5zY3NzJ10sXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdXNlLWNvbXBvbmVudC12aWV3LWVuY2Fwc3VsYXRpb25cbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5cbmV4cG9ydCBjbGFzcyBBcHBUb2NIb21lQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQge1xuICBzaG93ID0gZmFsc2VcbiAgY2hhbmdlVGFiID0gZmFsc2VcbiAgc2tlbGV0b25Mb2FkZXIgPSB0cnVlXG4gIGJhbm5lcnM6IE5zQXBwVG9jLklUb2NCYW5uZXIgfCBudWxsID0gbnVsbFxuICBzaG93TW9yZUdsYW5jZSA9IGZhbHNlXG4gIGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBudWxsXG4gIGNvbnRlbnRSZWFkRGF0YTogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCA9IG51bGxcbiAgZXJyb3JDb2RlOiBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUgfCBudWxsID0gbnVsbFxuICByZXN1bWVEYXRhOiBhbnkgPSBudWxsXG4gIG5zQ2FyZENvbnRlbnREYXRhOiBhbnkgPSBOc0NhcmRDb250ZW50LkFDQlBDb25zdFxuICBiYXRjaERhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UgfCBudWxsID0gbnVsbFxuICBjdXJyZW50Q291cnNlQmF0Y2hJZDogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgdXNlckVucm9sbG1lbnRMaXN0ITogTnNDb250ZW50LklDb3Vyc2VbXVxuICByb3V0ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcbiAgcGFnZU5hdmJhcjogUGFydGlhbDxOc1BhZ2UuSU5hdkJhY2tncm91bmQ+ID0gdGhpcy5jb25maWdTdmMucGFnZU5hdkJhclxuICBpc0NvaG9ydHNSZXN0cmljdGVkID0gZmFsc2VcbiAgc3RpY2t5ID0gZmFsc2VcbiAgaXNJbklmcmFtZSA9IGZhbHNlXG4gIGNiUGxhbkVuZERhdGU6IGFueVxuICBjYlBsYW5EdXJhdGlvbjogYW55XG4gIGVucm9sbGVkQ291cnNlRGF0YTogYW55XG4gIEBJbnB1dCgpIGZvclByZXZpZXc6IGFueSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvcHVibGljLycpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvYXV0aG9yLycpXG4gIC8vIGZvclByZXZpZXcgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL2F1dGhvci8nKVxuICBhbmFseXRpY3MgPSB0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGEucGFnZURhdGEuZGF0YT8uYW5hbHl0aWNzXG4gIGVycm9yV2lkZ2V0RGF0YTogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aFR5cGVkRGF0YTxhbnk+ID0ge1xuICAgIHdpZGdldFR5cGU6ICdlcnJvclJlc29sdmVyJyxcbiAgICB3aWRnZXRTdWJUeXBlOiAnZXJyb3JSZXNvbHZlcicsXG4gICAgd2lkZ2V0RGF0YToge1xuICAgICAgZXJyb3JUeXBlOiAnaW50ZXJuYWxTZXJ2ZXInLFxuICAgIH0sXG4gIH1cbiAgaXNBdXRob3IgPSBmYWxzZVxuICBhdXRob3JCdG5XaWRnZXQ6IE5zUGFnZS5JTmF2TGluayA9IHtcbiAgICBhY3Rpb25CdG5JZDogJ2ZlYXR1cmVfYXV0aG9yaW5nJyxcbiAgICBjb25maWc6IHtcbiAgICAgIHR5cGU6ICdtYXQtYnV0dG9uJyxcbiAgICB9LFxuICB9XG4gIHRvY0NvbmZpZzogYW55ID0gbnVsbFxuICBwcmltYXJ5Q2F0ZWdvcnkgPSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeVxuICBjb3Vyc2VDYXRlZ29yeSA9IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnlcbiAgV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cyA9IE5zQ29udGVudC5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzXG4gIGFza0F1dGhvckVuYWJsZWQgPSB0cnVlXG4gIHRyYWluaW5nTEh1YkVuYWJsZWQgPSBmYWxzZVxuICB0cmFpbmluZ0xIdWJDb3VudCQ/OiBPYnNlcnZhYmxlPG51bWJlcj5cbiAgYm9keTogU2FmZUh0bWwgfCBudWxsID0gbnVsbFxuICB2aWV3TW9yZVJlbGF0ZWRUb3BpY3MgPSBmYWxzZVxuICBoYXNUb2NTdHJ1Y3R1cmUgPSBmYWxzZVxuICB0b2NTdHJ1Y3R1cmU6IE5zQXBwVG9jLklUb2NTdHJ1Y3R1cmUgfCBudWxsID0gbnVsbFxuICBjb250ZW50UGFyZW50czogeyBba2V5OiBzdHJpbmddOiBOc0FwcFRvYy5JQ29udGVudFBhcmVudFJlc3BvbnNlW10gfSA9IHt9XG4gIG9iaktleXMgPSBPYmplY3Qua2V5c1xuICBmcmFnbWVudCE6IHN0cmluZ1xuICBhY3RpdmVGcmFnbWVudCA9IHRoaXMucm91dGUuZnJhZ21lbnQucGlwZShzaGFyZSgpKVxuICBjdXJyZW50RnJhZ21lbnQgPSAnb3ZlcnZpZXcnXG4gIHNob3dTY3JvbGwhOiBib29sZWFuXG4gIHNob3dTY3JvbGxIZWlnaHQgPSAzMDBcbiAgaGlkZVNjcm9sbEhlaWdodCA9IDEwXG4gIGVsZW1lbnRQb3NpdGlvbjogYW55XG4gIGJhdGNoU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBiYXRjaERhdGFTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIHJlc3VtZURhdGFTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIEBWaWV3Q2hpbGQoJ3N0aWNreU1lbnUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBtZW51RWxlbWVudCE6IEVsZW1lbnRSZWZcbiAgYmF0Y2hDb250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZClcbiAgY29udGVudFByb2dyZXNzID0gMFxuICBiYW5uZXJVcmw6IFNhZmVTdHlsZSB8IG51bGwgPSBudWxsXG4gIHJvdXRlUGF0aCA9ICdvdmVydmlldydcbiAgdmFsaWRQYXRocyA9IG5ldyBTZXQoWydvdmVydmlldycsICdjb250ZW50cycsICdhbmFseXRpY3MnXSlcbiAgcm91dGVyUGFyYW1TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIGluaXRpYWxyb3V0ZURhdGE6IGFueVxuICBhY3Rpb25CdG5TdGF0dXMgPSAnd2FpdCdcbiAgaXNSZWdpc3RyYXRpb25TdXBwb3J0ZWQgPSBmYWxzZVxuICBzaG93SW50cmFuZXRNZXNzYWdlID0gZmFsc2VcbiAgZmlyc3RSZXNvdXJjZUxpbms6IHsgdXJsOiBzdHJpbmc7IHF1ZXJ5UGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IH0gfCBudWxsID0gbnVsbFxuICByZXN1bWVEYXRhTGluazogeyB1cmw6IHN0cmluZzsgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfSB8IG51bGwgPSBudWxsXG4gIHNob3dUYWtlQXNzZXNzbWVudDogTnNBcHBUb2MuSVBvc3RBc3Nlc3NtZW50IHwgbnVsbCA9IG51bGxcbiAgY2hlY2tSZWdpc3RyYXRpb25Tb3VyY2VzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdTa2lsbFNvZnQgRGlnaXRhbGl6YXRpb24nLFxuICAgICdTa2lsbFNvZnQgTGVhZGVyc2hpcCcsXG4gICAgJ1BsdXJhbHNpZ2h0JyxcbiAgXSlcbiAgYnRuUGxheWxpc3RDb25maWc6IE5zUGxheWxpc3QuSUJ0blBsYXlsaXN0IHwgbnVsbCA9IG51bGxcbiAgYnRuR29hbHNDb25maWc6IE5zR29hbC5JQnRuR29hbCB8IG51bGwgPSBudWxsXG4gIGV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzOiBURmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgcmVnaXN0ZXJGb3JFeHRlcm5hbCA9IGZhbHNlXG4gIGlzR29hbHNFbmFibGVkID0gZmFsc2VcbiAgY29udGV4dElkPzogc3RyaW5nXG4gIGNvbnRleHRQYXRoPzogc3RyaW5nXG4gIGRlZmF1bHRTTG9nbyA9ICcnXG4gIGRpc2FibGVFbnJvbGxCdG4gPSBmYWxzZVxuICBpc0Fzc2Vzc1Zpc2libGUgPSBmYWxzZVxuICBpc1ByYWN0aWNlVmlzaWJsZSA9IGZhbHNlXG4gIGNlcnRpZmljYXRlT3BlbiA9IGZhbHNlXG4gIGJyZWFkY3J1bWJzOiBhbnlcbiAgaGlzdG9yeURhdGE6IGFueVxuICBjb3Vyc2VDb21wbGV0ZVN0YXRlID0gMlxuICB1c2VySWQ6IGFueVxuICB1c2VyUmF0aW5nOiBhbnlcbiAgZW52aXJvbm1lbnQhOiBhbnlcbiAgZGFrc2h0YU5hbWUgPSAnJ1xuICBjc2Ntc1VybCA9ICcnXG4gIHNob3dCdG4gPSBmYWxzZVxuICBjaGFubmVsSWQ6IGFueVxuICBzZWxlY3RlZEJhdGNoRGF0YTogYW55XG4gIHNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb246IGFueVxuICBzZXJ2ZXJEYXRlU3Vic2NyaXB0aW9uOiBhbnlcbiAgc2VydmVyRGF0ZTogYW55XG4gIGtwYXJyYXk6IGFueSA9IFtdXG4gIGVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICBpc0FjYnBDb3Vyc2UgPSBmYWxzZVxuICBpc0FjYnBDbGFpbSA9IGZhbHNlXG4gIGNvdXJzZUlEOiBhbnlcbiAgaXNDbGFpbWVkID0gZmFsc2VcbiAgbW9udGhseUNhcEV4Y2VlZCA9IGZhbHNlXG4gIGlzQ29tcGxldGVkVGhpc01vbnRoID0gZmFsc2VcbiAgc3RhcnREYXRlOiBhbnlcbiAgZW5kRGF0ZTogYW55XG4gIHN0YXJ0RGF0ZURpZmZlcmVuY2U6IGFueVxuICBlbmREYXRlRGlmZmVyZW5jZTogYW55XG4gIEBWaWV3Q2hpbGQoJ3JpZ2h0Q29udGFpbmVyJykgcmNFbGVtZW50ITogRWxlbWVudFJlZlxuICBAVmlld0NoaWxkKCdiYW5uZXJEZXRhaWxzJywgeyBzdGF0aWM6IHRydWUgfSkgYmFubmVyRWxlbSE6IEVsZW1lbnRSZWZcbiAgQFZpZXdDaGlsZCgnY29udGVudFNvdXJjZScpIGNvbnRlbnRTb3VyY2UhOiBFbGVtZW50UmVmXG4gIHNvdXJjZUVsbGlwc2lzID0gZmFsc2VcbiAgc2Nyb2xsTGltaXQgPSAwXG4gIHJjRWxlbSA9IHtcbiAgICBvZmZTZXRUb3A6IDAsXG4gICAgQm90dG9tUG9zOiAwLFxuICB9XG4gIHNjcm9sbGVkID0gZmFsc2VcbiAgcGF0aFNldCA9IG5ldyBTZXQoKVxuICBjYW5TaGFyZSA9IGZhbHNlXG4gIGVuYWJsZVNoYXJlID0gZmFsc2VcbiAgcm9vdE9yZ0lkOiBhbnlcbiAgY2VydElkOiBhbnlcbiAgbW9iaWxlMTIwMDogYW55XG4gIGFzc2Vzc21lbnRTdHJpcDogYW55XG4gIGxlYXJuQWR2aXNvcnlEYXRhOiBhbnlcbiAgY29udGVudENyZWF0b3JEYXRhOiBhbnkgPSBbXVxuICAvLyByYW5kb21sZWFybkFkdmlzb3J5T2JqOiBhbnlcbiAgLy8gbGVhcm5BZHZpc29yeURhdGFMZW5ndGg6IGFueVxuXG4gIHByaXZhdGUgZGVzdHJveVN1YmplY3QkID0gbmV3IFN1YmplY3Q8YW55PigpXG4gIHRpbWVyVW5zdWJzY3JpYmU6IGFueVxuICB0aW1lcjogYW55XG4gIGlzUmVsZXZlbnRCdG5Ib3ZlcmVkID0gZmFsc2VcbiAgU0FLU0hBTUFJX0lDT05fTk9STUFMID0gJy9hc3NldHMvaW1hZ2VzL3Nha3NoYW1BSS9haS1pY29uLnN2ZydcbiAgU0FLU0hBTUFJX0lDT05fTE9BREVSID0gJy9hc3NldHMvaW1hZ2VzL3Nha3NoYW1BSS9zYWtzaGFtX2FpX2xvYWRlci5naWYnXG4gIHJlY29tbWVuZGVkQ291cnNlc0lkID0gJydcbiAgZmVlZGJhY2tHaXZlbjogYW55XG4gIHByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzID0gZmFsc2VcbiAgZnJvbUFJVHV0b3IgPSBmYWxzZVxuICBzZWxlY3RlZExhbmd1YWdlOiBhbnk7IC8vIFNldCB0aGlzIHRvIHRoZSBkZWZhdWx0L2luaXRpYWwgbGFuZ3VhZ2VcbiAgbGFuZ3VhZ2VMaXN0ID0gW1xuICAgIHsgbmFtZTogXCJFbmdsaXNoXCIsIHZhbHVlOiBcIkVuZ2xpc2hcIiB9LFxuICAgIHsgbmFtZTogXCLgspXgsqjgs43gsqjgsqEgKEthbm5hZGEpXCIsIHZhbHVlOiBcIkthbm5hZGFcIiB9LFxuICAgIHsgbmFtZTogXCLgsKTgsYbgsLLgsYHgsJfgsYEgKFRlbHVndSlcIiwgdmFsdWU6IFwiVGVsdWd1XCIgfSxcbiAgICB7IG5hbWU6IFwi4K6k4K6u4K6/4K604K+NIChUYW1pbClcIiwgdmFsdWU6IFwiVGFtaWxcIiB9LFxuICAgIHsgbmFtZTogXCLgtK7gtLLgtK/gtL7gtLPgtIIgKE1hbGF5YWxhbSlcIiwgdmFsdWU6IFwiTWFsYXlhbGFtXCIgfSxcbiAgICB7IG5hbWU6IFwi4KS54KS/4KSC4KSm4KWAIChIaW5kaSlcIiwgdmFsdWU6IFwiSGluZGlcIiB9LFxuICAgIHsgbmFtZTogXCLgpoXgprjgpq7gp4Dgpq/gprzgpr4gKEFzc2FtZXNlKVwiLCB2YWx1ZTogXCJBc3NhbWVzZVwiIH0sXG4gICAgeyBuYW1lOiBcIuCmrOCmvuCmguCmsuCmviAoQmVuZ2FsaSlcIiwgdmFsdWU6IFwiQmVuZ2FsaVwiIH0sXG4gICAgeyBuYW1lOiBcIuCql+CrgeCqnOCqsOCqvuCqpOCrgCAoR3VqYXJhdGkpXCIsIHZhbHVlOiBcIkd1amFyYXRpXCIgfSxcbiAgICB7IG5hbWU6IFwi4KSu4KSw4KS+4KSg4KWAIChNYXJhdGhpKVwiLCB2YWx1ZTogXCJNYXJhdGhpXCIgfSxcbiAgICB7IG5hbWU6IFwi4KyT4Kyh4Ky/4KyGIChPZGlhKVwiLCB2YWx1ZTogXCJPZGlhXCIgfSxcbiAgICB7IG5hbWU6IFwi4Kiq4Kmw4Kic4Ki+4Kis4KmAIChQdW5qYWJpKVwiLCB2YWx1ZTogXCJQdW5qYWJpXCIgfSxcbiAgICB7IG5hbWU6IFwi4KSV4KWL4KSC4KSV4KSj4KWAIChLb25rYW5pKVwiLCB2YWx1ZTogXCJLb25rYW5pXCIgfSxcbiAgICB7IG5hbWU6IFwi4KSs4KSh4KS84KWLIChCb2RvKVwiLCB2YWx1ZTogXCJCb2RvXCIgfSxcbiAgICB7IG5hbWU6IFwi4KSh4KWL4KSX4KSw4KWAIChEb2dyaSlcIiwgdmFsdWU6IFwiRG9ncmlcIiB9LFxuICAgIHsgbmFtZTogXCLZg9i02YXZitix2YogLyDgpJXgpLbgpY3gpK7gpYDgpLDgpYAgKEthc2htaXJpKVwiLCB2YWx1ZTogXCJLYXNobWlyaVwiIH0sXG4gICAgeyBuYW1lOiBcIuCkruCliOCkpeCkv+CksuClgCAoTWFpdGhpbGkpXCIsIHZhbHVlOiBcIk1haXRoaWxpXCIgfSxcbiAgICB7IG5hbWU6IFwi4Kau4KeI4Kak4KeI4Kay4KeL4Kao4KeNICAoTWFuaXB1cmkgKVwiLCB2YWx1ZTogXCJNYW5pcHVyaVwiIH0sXG4gICAgeyBuYW1lOiBcIuCkqOClh+CkquCkvuCksuClgCAoTmVwYWxpKVwiLCB2YWx1ZTogXCJOZXBhbGlcIiB9LFxuICAgIHsgbmFtZTogXCLgpLjgpILgpLjgpY3gpJXgpYPgpKTgpK7gpY0gKFNhbnNrcml0KVwiLCB2YWx1ZTogXCJTYW5za3JpdFwiIH0sXG4gICAgeyBuYW1lOiBcIuGxpeGxn+GxseGxm+Gxn+GxsuGxpCAoU2FudGFsaSlcIiwgdmFsdWU6IFwiU2FudGFsaVwiIH0sXG4gICAgeyBuYW1lOiBcItiz2YbajNmKIC8g4KS44KS/4KSC4KSn4KWAIChTaW5kaGkpXCIsIHZhbHVlOiBcIlNpbmRoaVwiIH0sXG4gICAgeyBuYW1lOiBcItin2Y/Ysdiv2Y/ZiCAoVXJkdSlcIiwgdmFsdWU6IFwiVXJkdVwiIH1cbiAgXVxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlU2Nyb2xsKCkge1xuICAgIGNvbnN0IHdpbmRvd1Njcm9sbCA9IHdpbmRvdy5wYWdlWU9mZnNldFxuICAgIGlmICh3aW5kb3dTY3JvbGwgPj0gdGhpcy5lbGVtZW50UG9zaXRpb24gLSAxMDApIHtcbiAgICAgIHRoaXMuc3RpY2t5ID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0aWNreSA9IGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2Nyb2xsTGltaXQpIHtcbiAgICAgIGlmICgod2luZG93LnNjcm9sbFkgKyB0aGlzLnJjRWxlbS5Cb3R0b21Qb3MpID49IHRoaXMuc2Nyb2xsTGltaXQpIHtcbiAgICAgICAgdGhpcy5yY0VsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdzdGlja3knXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJjRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJ1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIzNi4uLiAoT2Zmc2V0VG9wIG9mIHJpZ2h0IGNvbnRhaW5lciArIDEwNClcbiAgICBpZiAod2luZG93LnNjcm9sbFkgPiAodGhpcy5yY0VsZW0ub2ZmU2V0VG9wICsgMTA0KSkge1xuICAgICAgdGhpcy5zY3JvbGxlZCA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY3JvbGxlZCA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGNvbnRlbnRTdmM6IFdpZGdldENvbnRlbnRTZXJ2aWNlLFxuICAgIHB1YmxpYyB0b2NTdmM6IEFwcFRvY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2dnZXJTdmM6IExvZ2dlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTdmM6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgYXV0aEFjY2Vzc0NvbnRyb2xTdmM6IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBtb2JpbGVBcHBzU3ZjOiBNb2JpbGVBcHBzU2VydmljZSxcbiAgICBwcml2YXRlIHV0aWxpdHlTdmM6IFV0aWxpdHlTZXJ2aWNlLFxuICAgIC8vIHByaXZhdGUgcHJvZ3Jlc3NTdmM6IENvbnRlbnRQcm9ncmVzc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3Rpb25TVkM6IEFjdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSB2aWV3ZXJTdmM6IFZpZXdlclV0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmF0aW5nU3ZjOiBSYXRpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGVsZW1ldHJ5U2VydmljZTogVGVsZW1ldHJ5U2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGxhbmd0cmFuc2xhdGlvbnM6IE11bHRpbGluZ3VhbFRyYW5zbGF0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudHM6IEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIG1hdFNuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBwcml2YXRlIGxvYWRDaGVja1NlcnZpY2U6IExvYWRDaGVja1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBoYW5kbGVDbGFpbVNlcnZpY2U6IEhhbmRsZUNsYWltU2VydmljZSxcbiAgICBwcml2YXRlIHJlc2V0UmF0aW5nc1NlcnZpY2U6IFJlc2V0UmF0aW5nc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0aW1lclNlcnZpY2U6IFRpbWVyU2VydmljZSxcbiAgICBwdWJsaWMgZW5yb2xsU3ZjOiBXaWRnZXRFbnJvbGxTZXJ2aWNlLFxuICAgIHB1YmxpYyBjb250ZW50TGliU3ZjOiBXaWRnZXRDb250ZW50TGliU2VydmljZSxcbiAgICBwdWJsaWMgZGF0YVRyYW5zZmVyU3ZjOiBEYXRhVHJhbnNmZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWF0U25hY2tiYXJOZXc6IE1hdFNuYWNrYmFyTmV3LFxuICAgIHByaXZhdGUgdXNlclNlcnZpY2VMaWI6IFdpZGdldFVzZXJTZXJ2aWNlTGliLFxuICAgIHB1YmxpYyBuZXRDb3JlU2VydmljZTogTmV0Q29yZVNlcnZpY2UsXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBlbnZpcm9ubWVudDogYW55XG4gICkge1xuICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudFxuICAgIHRoaXMuZGFrc2h0YU5hbWUgPSB0aGlzLmVudmlyb25tZW50LmRha3NodGFOYW1lXG4gICAgdGhpcy5jc2Ntc1VybCA9IHRoaXMuZW52aXJvbm1lbnQuY3NjbXNVcmxcbiAgICB0aGlzLmhpc3RvcnlEYXRhID0gaGlzdG9yeS5zdGF0ZVxuICAgIHRoaXMuaGFuZGxlQnJlYWRjcnVtYnMoKVxuICAgIHRoaXMubW9iaWxlQXBwc1N2Yy5tb2JpbGVUb3BIZWFkZXJWaXNpYmlsaXR5U3RhdHVzLm5leHQodHJ1ZSlcbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3dlYnNpdGVMYW5ndWFnZScpKSB7XG4gICAgICB0aGlzLnRyYW5zbGF0ZS5zZXREZWZhdWx0TGFuZygnZW4nKVxuICAgICAgY29uc3QgbGFuZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3ZWJzaXRlTGFuZ3VhZ2UnKSFcbiAgICAgIHRoaXMudHJhbnNsYXRlLnVzZShsYW5nKVxuICAgIH1cblxuICAgIHRoaXMubG9hZENoZWNrU2VydmljZS5jaGlsZENvbXBvbmVudExvYWRlZCQuc3Vic2NyaWJlKF9pc0xvYWRlZCA9PiB7XG4gICAgICAvLyBQcmVzZW50IGluIGFwcC10b2MtYWJvdXQuY29tcG9uZW50XG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JhdGluZ3NEaXYnKSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCByYXRpbmdzRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JhdGluZ3NEaXYnKSBhcyBhbnlcbiAgICAgICAgICBpZiAocmF0aW5nc0Rpdikge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxMaW1pdCA9IHJhdGluZ3NEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIGFzIGFueVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgNTAwKVxuICAgICAgfVxuXG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRlbnRDb250YWluZXInKSkge1xuICAgICAgICBjb25zdCBjb250ZW50RGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRlbnRDb250YWluZXInKSBhcyBhbnlcbiAgICAgICAgaWYgKGNvbnRlbnREaXYpIHtcbiAgICAgICAgICB0aGlzLnNjcm9sbExpbWl0ID0gY29udGVudERpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gYXMgYW55XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5oYW5kbGVDbGFpbVNlcnZpY2UuZ2V0Q2xhaW1EYXRhKCkuc3Vic2NyaWJlKChfZXZlbnREYXRhOiBhbnkpID0+IHtcbiAgICAgIHRoaXMub25DbGlja09mQ2xhaW0oX2V2ZW50RGF0YSlcbiAgICB9KVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXJTdmMuc2V0RW5yb2xsRGF0YShudWxsKVxuICAgIHRoaXMubW9iaWxlMTIwMCA9IHdpbmRvdy5pbm5lcldpZHRoIDwgMTIwMVxuICAgIHRoaXMuY29uZmlnU3ZjLmxhbmd1YWdlVHJhbnNsYXRpb25GbGFnLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3dlYnNpdGVMYW5ndWFnZScpKSB7XG4gICAgICAgICAgdGhpcy50cmFuc2xhdGUuc2V0RGVmYXVsdExhbmcoJ2VuJylcbiAgICAgICAgICBjb25zdCBsYW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3dlYnNpdGVMYW5ndWFnZScpIVxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlLnVzZShsYW5nKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIGlmICh0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGEucGFnZURhdGEgJiYgdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhLnBhZ2VEYXRhLmRhdGEpIHtcbiAgICAgIHRoaXMubGVhcm5BZHZpc29yeURhdGEgPSB0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGEucGFnZURhdGEuZGF0YS5sZWFybmVyQWR2aXNvcnlcbiAgICAgIC8vIHRoaXMubGVhcm5BZHZpc29yeURhdGFMZW5ndGggPSB0aGlzLmxlYXJuQWR2aXNvcnlEYXRhLmxlbmd0aFxuXG4gICAgfVxuXG4gICAgdGhpcy5nZXRTZXJ2ZXJEYXRlVGltZSgpXG4gICAgLy8gdGhpcy5kaXNwbGF5UmFuZG9tbGVhcm5BZHZpc29yeURhdGEoKVxuXG4gICAgdGhpcy5zZWxlY3RlZEJhdGNoU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuZ2V0U2VsZWN0ZWRCYXRjaC5zdWJzY3JpYmUoYmF0Y2hEYXRhID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEgPSBiYXRjaERhdGFcbiAgICB9KVxuXG4gICAgdGhpcy5zZXJ2ZXJEYXRlU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuc2VydmVyRGF0ZS5zdWJzY3JpYmUoc2VydmVyRGF0ZSA9PiB7XG4gICAgICB0aGlzLnNlcnZlckRhdGUgPSBzZXJ2ZXJEYXRlXG4gICAgfSlcblxuICAgIHRoaXMuY2hhbm5lbElkID0gdGhpcy50ZWxlbWV0cnlTZXJ2aWNlLnRlbGVtZXRyeUNvbmZpZyA/IHRoaXMudGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlDb25maWcuY2hhbm5lbCA6ICcnXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaXNJbklmcmFtZSA9IHdpbmRvdy5zZWxmICE9PSB3aW5kb3cudG9wXG4gICAgfSBjYXRjaCAoX2V4KSB7XG4gICAgICB0aGlzLmlzSW5JZnJhbWUgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJvdXRlKSB7XG4gICAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gdHJ1ZVxuICAgICAgdGhpcy5yb3V0ZVN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGUuZGF0YS5zdWJzY3JpYmUoYXN5bmMgKGRhdGE6IERhdGEpID0+IHtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5jb250ZW50ICYmIGRhdGEuY29udGVudC5kYXRhICYmIGRhdGEuY29udGVudC5kYXRhLmlkZW50aWZpZXIpIHtcbiAgICAgICAgICB0aGlzLmNvdXJzZUlEID0gZGF0YS5jb250ZW50LmRhdGEuaWRlbnRpZmllclxuICAgICAgICAgIHRoaXMudG9jU3ZjLmZldGNoR2V0Q29udGVudERhdGEoZGF0YS5jb250ZW50LmRhdGEuaWRlbnRpZmllcikuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YSA9IHJlcy5yZXN1bHQuY29udGVudFxuICAgICAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuY29udGVudFJlYWREYXRhJywgdGhpcy5jb250ZW50UmVhZERhdGEpXG4gICAgICAgICAgICB0aGlzLmdldFByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzKClcbiAgICAgICAgICB9LCAoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWVycm9yLm9rKSB7XG4gICAgICAgICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbignVW5hYmxlIHRvIGZldGNoIGNvbnRlbnQgZGF0YSwgZHVlIHRvIHNvbWUgZXJyb3IhJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnN0IGluaXREYXRhID0gdGhpcy50b2NTdmMuaW5pdERhdGEoZGF0YSwgdHJ1ZSlcbiAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBpbml0RGF0YS5jb250ZW50XG4gICAgICAgICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgICAgICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnRvY1N2Yy5mZXRjaENvdXJzZUhlaXJhcmNoeSh0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jaGVja01vZHVsZVdpc2VEYXRhKHRoaXMuY29udGVudClcbiAgICAgICAgICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSBmYWxzZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZldGNoVXNlckVucm9sbG1lbnREYXRhKCk7XG5cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pbml0aWFscm91dGVEYXRhID0gZGF0YVxuICAgICAgICAgIHRoaXMuYmFubmVycyA9IGRhdGEucGFnZURhdGEuZGF0YS5iYW5uZXJzXG4gICAgICAgICAgdGhpcy50b2NTdmMuc3VidGl0bGVPbkJhbm5lcnMgPSBkYXRhLnBhZ2VEYXRhLmRhdGEuc3VidGl0bGVPbkJhbm5lcnMgfHwgZmFsc2VcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5zaG93RGVzY3JpcHRpb24gPSBkYXRhLnBhZ2VEYXRhLmRhdGEuc2hvd0Rlc2NyaXB0aW9uIHx8IGZhbHNlXG4gICAgICAgICAgdGhpcy50b2NDb25maWcgPSBkYXRhLnBhZ2VEYXRhLmRhdGFcbiAgICAgICAgICB0aGlzLmtwYXJyYXkgPSB0aGlzLnRvY0NvbmZpZy5rYXJtYVBvaW50c1xuICAgICAgICAgIHRoaXMudG9jQ29uZmlnID0gZGF0YS5wYWdlRGF0YS5kYXRhXG4gICAgICAgICAgdGhpcy5rcGFycmF5ID0gdGhpcy50b2NDb25maWcua2FybWFQb2ludHNcbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuaXNQb3N0QXNzZXNzbWVudCkge1xuICAgICAgICAgICAgdGhpcy50b2NTdmMuZmV0Y2hQb3N0QXNzZXNzbWVudFN0YXR1cyh0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGFzc2Vzc21lbnREYXRhID0gcmVzLnJlc3VsdFxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG8gb2YgYXNzZXNzbWVudERhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoby5jb250ZW50SWQgPT09ICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNob3dUYWtlQXNzZXNzbWVudCA9IG9cbiAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmluaXREYXRhKGRhdGEpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50RnJhZ21lbnQgPSAnb3ZlcnZpZXcnXG4gICAgdGhpcy5yb3V0ZS5mcmFnbWVudC5zdWJzY3JpYmUoKGZyYWdtZW50OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuY3VycmVudEZyYWdtZW50ID0gZnJhZ21lbnQgfHwgJ292ZXJ2aWV3J1xuICAgIH0pXG5cbiAgICB0aGlzLmJhdGNoU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuYmF0Y2hSZXBsYXlTdWJqZWN0LnN1YnNjcmliZShcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5mZXRjaEJhdGNoRGV0YWlscygpXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgKHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSkpIHtcbiAgICAgICAgICB0aGlzLmZldGNoVXNlcldGRm9yQmxlbmRlZCgpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmxvZygnZXJyb3Igb24gYmF0Y2hTdWJzY3JpcHRpb24nKVxuICAgICAgfSxcbiAgICApXG5cbiAgICB0aGlzLmJhdGNoRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLnNldEJhdGNoRGF0YVN1YmplY3Quc3Vic2NyaWJlKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50ICYmICh0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0pKSB7XG4gICAgICAgICAgdGhpcy5mZXRjaFVzZXJXRkZvckJsZW5kZWQoKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIG9uIGJhdGNoRGF0YVN1YnNjcmlwdGlvbicpXG4gICAgICB9LFxuICAgIClcblxuICAgIGNvbnN0IGluc3RhbmNlQ29uZmlnID0gdGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWdcbiAgICBpZiAoaW5zdGFuY2VDb25maWcgJiYgaW5zdGFuY2VDb25maWcubG9nb3MgJiYgaW5zdGFuY2VDb25maWcubG9nb3MuZGVmYXVsdFNvdXJjZUxvZ28pIHtcbiAgICAgIHRoaXMuZGVmYXVsdFNMb2dvID0gaW5zdGFuY2VDb25maWcubG9nb3MuZGVmYXVsdFNvdXJjZUxvZ29cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzKSB7XG4gICAgICB0aGlzLmlzR29hbHNFbmFibGVkID0gIXRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcy5oYXMoJ2dvYWxzJylcbiAgICB9XG5cbiAgICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZS5xdWVyeVBhcmFtTWFwLnN1YnNjcmliZShhc3luYyBxUGFyYW1zTWFwID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHRJZCA9IHFQYXJhbXNNYXAuZ2V0KCdjb250ZXh0SWQnKVxuICAgICAgY29uc3QgY29udGV4dFBhdGggPSBxUGFyYW1zTWFwLmdldCgnY29udGV4dFBhdGgnKVxuICAgICAgY29uc3QgcmVjb21tZW5kZWRDb3Vyc2VzSWQgPSBxUGFyYW1zTWFwLmdldCgncmVjb21tZW5kYXRpb25JZCcpXG4gICAgICBpZiAoY29udGV4dElkICYmIGNvbnRleHRQYXRoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dElkID0gY29udGV4dElkXG4gICAgICAgIHRoaXMuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aFxuICAgICAgfVxuICAgICAgaWYgKHJlY29tbWVuZGVkQ291cnNlc0lkKSB7XG4gICAgICAgIHRoaXMucmVjb21tZW5kZWRDb3Vyc2VzSWQgPSByZWNvbW1lbmRlZENvdXJzZXNJZFxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2VMaWIuZ2V0UmVjb21tZW5kZWRDb3Vyc2VzU2Frc2hhbUFJKHJlY29tbWVuZGVkQ291cnNlc0lkKS50b1Byb21pc2UoKVxuICAgICAgICBpZiAocmVzcG9uc2UuZmVlZGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZmVlZGJhY2tHaXZlbiA9IHJlc3BvbnNlLmZlZWRiYWNrcy5maW5kKChmZWVkYmFjazogYW55KSA9PiBmZWVkYmFjaz8uY291cnNlX2lkID09PSB0aGlzLmNvdXJzZUlEKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVjb21tZW5kZWRDb3Vyc2VzSWQpIHtcbiAgICAgICAgdGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCA9IHJlY29tbWVuZGVkQ291cnNlc0lkXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy51c2VyU2VydmljZUxpYi5nZXRSZWNvbW1lbmRlZENvdXJzZXNTYWtzaGFtQUkocmVjb21tZW5kZWRDb3Vyc2VzSWQpLnRvUHJvbWlzZSgpXG4gICAgICAgIGlmIChyZXNwb25zZS5mZWVkYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5mZWVkYmFja0dpdmVuID0gcmVzcG9uc2UuZmVlZGJhY2tzLmZpbmQoKGZlZWRiYWNrOiBhbnkpID0+IGZlZWRiYWNrPy5jb3Vyc2VfaWQgPT09IHRoaXMuY291cnNlSUQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcykge1xuICAgICAgdGhpcy5pc1JlZ2lzdHJhdGlvblN1cHBvcnRlZCA9IHRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcy5oYXMoJ3JlZ2lzdHJhdGlvbkV4dGVybmFsJylcbiAgICAgIHRoaXMuc2hvd0ludHJhbmV0TWVzc2FnZSA9ICF0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMuaGFzKFxuICAgICAgICAnc2hvd0ludHJhbmV0TWVzc2FnZURlc2t0b3AnLFxuICAgICAgKVxuICAgIH1cblxuICAgIHRoaXMuY2hlY2tSZWdpc3RyYXRpb25TdGF0dXMoKVxuICAgIHRoaXMucm91dGVyUGFyYW1TdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKChyb3V0ZXJFdmVudDogRXZlbnQpID0+IHtcbiAgICAgIGlmIChyb3V0ZXJFdmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgdGhpcy5hc3NpZ25QYXRoQW5kVXBkYXRlQmFubmVyKHJvdXRlckV2ZW50LnVybClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgY29uc3QgY29udGVudE5hbWUgPSB0aGlzLmNvbnRlbnQubmFtZS50cmltKClcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuY3JlYXRvckNvbnRhY3RzKSB7XG4gICAgICAgIHRoaXMuY29udGVudENyZWF0b3JEYXRhID0gdGhpcy5oYW5kbGVQYXJzZUpzb25EYXRhKHRoaXMuY29udGVudC5jcmVhdG9yQ29udGFjdHMpXG4gICAgICB9XG4gICAgICBpZiAoKGNvbnRlbnROYW1lKS50b0xvd2VyQ2FzZSgpID09PSB0aGlzLmRha3NodGFOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgdGhpcy5zaG93QnRuID0gdHJ1ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93QnRuID0gZmFsc2VcbiAgICAgIH1cbiAgICAgIHRoaXMuYnRuUGxheWxpc3RDb25maWcgPSB7XG4gICAgICAgIGNvbnRlbnRJZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgIGNvbnRlbnROYW1lOiB0aGlzLmNvbnRlbnQubmFtZSxcbiAgICAgICAgY29udGVudFR5cGU6IHRoaXMuY29udGVudC5jb250ZW50VHlwZSxcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5OiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICBtb2RlOiAnZGlhbG9nJyxcbiAgICAgIH1cbiAgICAgIHRoaXMuYnRuR29hbHNDb25maWcgPSB7XG4gICAgICAgIGNvbnRlbnRJZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgIGNvbnRlbnROYW1lOiB0aGlzLmNvbnRlbnQubmFtZSxcbiAgICAgICAgY29udGVudFR5cGU6IHRoaXMuY29udGVudC5jb250ZW50VHlwZSxcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5OiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50ICYmICFbXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9DT1VSU0UsXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9BU1NFU1NFTUVOVCxcbiAgICAgIE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0sXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LklOVklURV9PTkxZX1BST0dSQU0sXG4gICAgXS5pbmNsdWRlcyh0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkpKSB7XG4gICAgICB0aGlzLmNhblNoYXJlID0gdHJ1ZVxuICAgICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XG4gICAgICAgIHRoaXMucm9vdE9yZ0lkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUucm9vdE9yZ0lkXG4gICAgICB9XG4gICAgfVxuXG5cbiAgfVxuXG4gIC8vIGRpc3BsYXlSYW5kb21sZWFybkFkdmlzb3J5RGF0YSgpOiB2b2lkIHtcbiAgLy8gICBjb25zdCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMubGVhcm5BZHZpc29yeURhdGEubGVuZ3RoKVxuICAvLyAgIHRoaXMucmFuZG9tbGVhcm5BZHZpc29yeU9iaiA9IHRoaXMubGVhcm5BZHZpc29yeURhdGFbcmFuZG9tSW5kZXhdXG4gIC8vIH1cblxuICBnZXRLYXJtYXBvaW50c0xpbWl0KCkge1xuICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdmMudXNlckthcm1hUG9pbnRzKCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzICYmIHJlcy5rcExpc3QpIHtcbiAgICAgICAgICBjb25zdCBpbmZvID0gcmVzLmtwTGlzdC5hZGRpbmZvXG4gICAgICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgICAgIHRoaXMubW9udGhseUNhcEV4Y2VlZCA9IEpTT04ucGFyc2UoaW5mbykuY2xhaW1lZE5vbkFDQlBDb3Vyc2VLYXJtYVF1b3RhID49IDRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaXNDb3Vyc2VDb21wbGV0ZWRPblRoaXNNb250aCgpIHtcbiAgICBjb25zdCBub3cgPSBtb21lbnQodGhpcy5zZXJ2ZXJEYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGNvdXJzZURhdGEgPSB0aGlzLmVucm9sbGVkQ291cnNlRGF0YVxuICAgICAgaWYgKGNvdXJzZURhdGEgJiYgY291cnNlRGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwICYmIGNvdXJzZURhdGEuY29tcGxldGVkT24pIHtcbiAgICAgICAgY29uc3QgY29tcGxldGVkT24gPSBtb21lbnQoY291cnNlRGF0YS5jb21wbGV0ZWRPbikuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICAgICAgY29uc3QgY29tcGxldGVkTW9udGggPSBtb21lbnQoY29tcGxldGVkT24sICdZWVlZLU1NLUREJykubW9udGgoKVxuICAgICAgICBjb25zdCBjdXJyZW50TW9udGggPSBtb21lbnQobm93LCAnWVlZWS1NTS1ERCcpLm1vbnRoKClcbiAgICAgICAgdGhpcy5pc0NvbXBsZXRlZFRoaXNNb250aCA9IGNvbXBsZXRlZE1vbnRoID09PSBjdXJyZW50TW9udGhcbiAgICAgICAgdGhpcy5jb250ZW50Wyd2aWV3TW9yZSddID0gZmFsc2VcbiAgICAgICAgdGhpcy5jb250ZW50Wydjb21wbGV0ZWRPbiddID0gY291cnNlRGF0YS5jb21wbGV0ZWRPblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZpbHRlcmVkQWNicExpc3QocmVzOiBhbnkpIHtcbiAgICByZXR1cm4gcmVzLmZpbHRlcigodjogYW55KSA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuY291cnNlSUQpXG4gIH1cblxuICBmaW5kQUNQQigpIHtcbiAgICBjb25zdCBsb2NhbENicCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYnBEYXRhJylcbiAgICBpZiAobG9jYWxDYnApIHtcbiAgICAgIGNvbnN0IHN0b3JlYWdlQ2JwID0gSlNPTi5wYXJzZShsb2NhbENicClcbiAgICAgIGNvbnN0IGNicCA9IHRoaXMuZmlsdGVyZWRBY2JwTGlzdChzdG9yZWFnZUNicClcbiAgICAgIGlmIChjYnAubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGFjYnAgPSAnY2JQbGFuJ1xuICAgICAgICB0aGlzLmNiUGxhbkVuZERhdGUgPSBjYnBbMF0uZW5kRGF0ZVxuICAgICAgICBjb25zdCBzRGF0ZSA9IGRheWpzKHRoaXMuc2VydmVyRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICAgICAgY29uc3QgZGF5c0NvdW50ID0gZGF5anModGhpcy5jYlBsYW5FbmREYXRlKS5kaWZmKHRoaXMuc2VydmVyRGF0ZSwgJ2RheScpXG4gICAgICAgIHRoaXMuY2JQbGFuRHVyYXRpb24gPSBkYXlzQ291bnQgPCAwID8gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuT1ZFUkRVRSA6IGRheXNDb3VudCA+IDI5XG4gICAgICAgICAgPyBOc0NhcmRDb250ZW50LkFDQlBDb25zdC5TVUNDRVNTIDogTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuVVBDT01JTkdcbiAgICAgICAgaWYgKGFjYnAgJiYgdGhpcy5jYlBsYW5FbmREYXRlICYmIGFjYnAgPT09ICdjYlBsYW4nKSB7XG4gICAgICAgICAgdGhpcy5pc0FjYnBDb3Vyc2UgPSB0cnVlXG4gICAgICAgICAgY29uc3QgZURhdGUgPSBkYXlqcyh0aGlzLmNiUGxhbkVuZERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgICAgICAgaWYgKGRheWpzKHNEYXRlKS5pc1NhbWVPckJlZm9yZShlRGF0ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RPYmogPSB7XG4gICAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0VHlwZTogJ0NvdXJzZScsXG4gICAgICAgICAgICAgICAgICBjb250ZXh0SWQ6IHRoaXMuY291cnNlSUQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udGVudFN2Yy5nZXRDb3Vyc2VLYXJtYVBvaW50cyhyZXF1ZXN0T2JqKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmtwTGlzdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHJlcy5rcExpc3RcbiAgICAgICAgICAgICAgICBpZiAocm93LmFkZGluZm8pIHtcbiAgICAgICAgICAgICAgICAgIGlmIChKU09OLnBhcnNlKHJvdy5hZGRpbmZvKS5BQ0JQKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY2JwQ2xhaW0gPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2xhaW1lZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY2JwQ2xhaW0gPSB0cnVlXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY2JwQ2xhaW0gPSB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNBY2JwQ2xhaW0gPSB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmFpc2VUZWxlbWV0ZXJ5Rm9yUHJvdmlkZXIocHJvdmlkZXJOYW1lOiBzdHJpbmcsIHByaXZpZGVySWQ6IHN0cmluZykge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjbGljaycsXG4gICAgICAgIGlkOiAnYnRuLXByb3ZpZGVyJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBwcm92aWRlck5hbWUsXG4gICAgICAgIHR5cGU6IHByaXZpZGVySWQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYWdlSWRFeHQ6ICdidG4tcHJvdmlkZXInLFxuICAgICAgICBtb2R1bGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnltb2R1bGVzLkNPTlRFTlQsXG4gICAgICB9KVxuXG4gIH1cblxuICByYWlzZVRlbGVtZXRyeSgpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICBzdWJUeXBlOiAna2FybWFwb2ludHMtY2xhaW0nLFxuICAgICAgICBpZDogdGhpcy5jb3Vyc2VJRCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiB0aGlzLmNvdXJzZUlELFxuICAgICAgICB0eXBlOiAnY291cnNlJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhZ2VJZEV4dDogJ2J0bi1hY2JwLWNsYWltJyxcbiAgICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5LQVJNQVBPSU5UUyxcbiAgICAgIH0pXG4gIH1cblxuICBvbkNsaWNrT2ZDbGFpbShldmVudDogYW55KSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGU6bm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKGV2ZW50KVxuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICB1c2VySWQ6IHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyLFxuICAgICAgY291cnNlSWQ6IHRoaXMuY291cnNlSUQsXG4gICAgfVxuICAgIHRoaXMucmFpc2VUZWxlbWV0cnkoKVxuICAgIHRoaXMuY29udGVudFN2Yy5jbGFpbUthcm1hcG9pbnRzKHJlcXVlc3QpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKHJlcylcbiAgICAgIHRoaXMuaXNDbGFpbWVkID0gdHJ1ZVxuICAgICAgdGhpcy5vcGVuU25hY2tiYXIoJ0thcm1hIHBvaW50cyBhcmUgc3VjY2Vzc2Z1bGx5IGNsYWltZWQuJylcbiAgICAgIC8vIHRoaXMuZ2V0VXNlckVucm9sbG1lbnRMaXN0KClcbiAgICAgIHRoaXMuY2hlY2tJZlVzZXJFbnJvbGxlZCgpXG4gICAgfSwgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgICAgdGhpcy5vcGVuU25hY2tiYXIoJ3NvbWV0aGluZyB3ZW50IHdyb25nLicpXG4gICAgfSlcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy5yY0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucmNFbGVtLkJvdHRvbVBvcyA9IHRoaXMucmNFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wICsgdGhpcy5yY0VsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRcbiAgICAgIHRoaXMucmNFbGVtLm9mZlNldFRvcCA9IHRoaXMucmNFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wXG4gICAgfVxuICAgIC8vIEdldCBUaW1lIGZvciB0aGUgYmF0Y2hcbiAgICB0aGlzLnRpbWVyVW5zdWJzY3JpYmUgPSB0aGlzLnRpbWVyU2VydmljZS5nZXRUaW1lckRhdGEoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveVN1YmplY3QkKSlcbiAgICAgIC5zdWJzY3JpYmUoKF90aW1lcjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudGltZXIgPSBfdGltZXJcbiAgICAgIH0pXG4gIH1cblxuICBoYW5kbGVCcmVhZGNydW1icygpIHtcbiAgICBpZiAodGhpcy5oaXN0b3J5RGF0YSkge1xuICAgICAgaWYgKHRoaXMuaGlzdG9yeURhdGEucGF0aCA9PT0gJ1NlYXJjaCcpIHtcbiAgICAgICAgY29uc3Qgc2VhcmNodXJsID0gYC9hcHAvZ2xvYmFsc2VhcmNoYFxuICAgICAgICBjb25zdCBxUGFyYW0gPSB7XG4gICAgICAgICAgcTogdGhpcy5oaXN0b3J5RGF0YS5wYXJhbSxcbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiAnU2VhcmNoJywgdXJsOiBzZWFyY2h1cmwsIHF1ZXJ5UGFyYW1zOiBxUGFyYW0gfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaGlzdG9yeURhdGEucGF0aCA9PT0gJ2NvbXBldGVuY3ktZGV0YWlscycpIHtcbiAgICAgICAgY29uc3QgZmluYWxVcmwgPSBgL2FwcC9sZWFybi9icm93c2UtYnkvY29tcGV0ZW5jeS8ke3RoaXMuaGlzdG9yeURhdGEucGFyYW19YFxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgICB0aGlzLmJyZWFkY3J1bWJzID0geyB1cmw6ICdob21lJywgdGl0bGVzOiBbeyB0aXRsZTogdGhpcy5oaXN0b3J5RGF0YS5wYXJhbSwgdXJsOiBmaW5hbFVybCB9LCB7IHRpdGxlOiAnRGV0YWlscycsIHVybDogJ25vbmUnIH1dIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5oaXN0b3J5RGF0YS5wYXRoID09PSAnYWxsLUNCUCcpIHtcbiAgICAgICAgY29uc3QgZmluYWxVUkwgPSBgL2FwcC9sZWFybi9icm93c2UtYnkvcHJvdmlkZXIvJHt0aGlzLmhpc3RvcnlEYXRhLnBhcmFtfWBcbiAgICAgICAgdGhpcy5icmVhZGNydW1icyA9IHsgdXJsOiAnaG9tZScsIHRpdGxlczogW3sgdGl0bGU6IGBhbGwgQ0JQJ3NgLCB1cmw6IGZpbmFsVVJMIH0sIHsgdGl0bGU6ICdEZXRhaWxzJywgdXJsOiAnbm9uZScgfV0gfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmhpc3RvcnlEYXRhLnBhdGggPT09ICdhbGwtY29tcGV0ZW5jaWVzJykge1xuICAgICAgICBjb25zdCBmaW5hbFVybCA9IGAvYXBwL2xlYXJuL2Jyb3dzZS1ieS9jb21wZXRlbmN5L2FsbC1jb21wZXRlbmNpZXNgXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiAnYWxsIGNvbXBldGVuY2llcycsIHVybDogZmluYWxVcmwgfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaGlzdG9yeURhdGEucGF0aCA9PT0gJ2N1cmF0ZWRDb2xsZWN0aW9ucycpIHtcbiAgICAgICAgY29uc3QgZmluYWxVcmwgPSBgL2FwcC9jdXJhdGVkQ29sbGVjdGlvbnMvaG9tZWBcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICAgICAgdGhpcy5icmVhZGNydW1icyA9IHsgdXJsOiAnaG9tZScsIHRpdGxlczogW3sgdGl0bGU6ICdjdXJhdGVkIGNvbGxlY3Rpb25zJywgdXJsOiBmaW5hbFVybCB9LCB7IHRpdGxlOiAnRGV0YWlscycsIHVybDogJ25vbmUnIH1dIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgdGhpcy5icmVhZGNydW1icyA9IHsgdXJsOiAnaG9tZScsIHRpdGxlczogW3sgdGl0bGU6ICdMZWFybicsIHVybDogJy9wYWdlL2xlYXJuJywgaWNvbjogJ3NjaG9vbCcgfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5mcmFnbWVudCkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICBkb2N1bWVudCEucXVlcnlTZWxlY3RvcihgIyR7dGhpcy5mcmFnbWVudH1gKSEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogODAsXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgfVxuICB9XG5cbiAgZ2V0IGVuYWJsZUFuYWx5dGljcygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzKSB7XG4gICAgICByZXR1cm4gIXRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcy5oYXMoJ3RvY0FuYWx5dGljcycpXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZ2V0IGlzUmVzb3VyY2UoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgY29uc3QgaXNSZXNvdXJjZSA9IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LktOT1dMRURHRV9BUlRJRkFDVCB8fFxuICAgICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRVxuICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRVxuICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UXG4gICAgICAgIHx8IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPTVBfQVNTRVNTTUVOVFxuICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5PRkZMSU5FX1NFU1NJT05cbiAgICAgICAgfHwgISh0aGlzLmNvbnRlbnQuY2hpbGRyZW4gJiYgdGhpcy5jb250ZW50LmNoaWxkcmVuLmxlbmd0aClcbiAgICAgIGlmIChpc1Jlc291cmNlKSB7XG4gICAgICAgIHRoaXMubW9iaWxlQXBwc1N2Yy5zZW5kVmlld2VyRGF0YSh0aGlzLmNvbnRlbnQpXG4gICAgICB9XG4gICAgICByZXR1cm4gaXNSZXNvdXJjZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBnZXRTdGFydERhdGUoKSB7XG4gICAgaWYgKHRoaXMuZW5yb2xsZWRDb3Vyc2VEYXRhKSB7XG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgLy8gY29uc3QgYmF0Y2ggPSBfLmZpcnN0KF8uZmlsdGVyKHRoaXMuY29udGVudFsnYmF0Y2hlcyddLCB7IGJhdGNoSWQ6IHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQgfSkgfHwgW10pXG4gICAgICBjb25zdCBiYXRjaCA9IHRoaXMuZW5yb2xsZWRDb3Vyc2VEYXRhLmJhdGNoXG4gICAgICB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkID0gYmF0Y2guYmF0Y2hJZFxuICAgICAgaWYgKGJhdGNoICYmIHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQpIHtcbiAgICAgICAgdGhpcy5zdGFydERhdGUgPSAoXy5nZXQoYmF0Y2gsICdzdGFydERhdGUnKSlcbiAgICAgICAgLy8gY29uc3QgcGFyc2VkRGF0ZSA9IG1vbWVudCh0aGlzLnN0YXJ0RGF0ZSk7XG4gICAgICAgIC8vIGNvbnN0IGRhdGVPbmx5ID0gcGFyc2VkRGF0ZS5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgICBjb25zdCBzdGFydERhdGVUaW1lID0gdGhpcy5zdGFydERhdGUgJiYgbmV3IERhdGUodGhpcy5zdGFydERhdGUpLmdldFRpbWUoKVxuICAgICAgICB0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgPSBzdGFydERhdGVUaW1lIC0gbm93XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgJiYgdGhpcy5zdGFydERhdGVEaWZmZXJlbmNlID4gMCkge1xuICAgICAgICAgIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKHRoaXMuc3RhcnREYXRlRGlmZmVyZW5jZSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSlcbiAgICAgICAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IoKHRoaXMuc3RhcnREYXRlRGlmZmVyZW5jZSAlICgxMDAwICogNjAgKiA2MCAqIDI0KSkgLyAoMTAwMCAqIDYwICogNjApKVxuICAgICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKCh0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgJSAoMTAwMCAqIDYwICogNjApKSAvICgxMDAwICogNjApKVxuICAgICAgICAgIHJldHVybiAoYCR7ZGF5c30gRGF5cyA6ICR7aG91cnN9IEhvdXJzIDogJHttaW51dGVzfSBNaW51dGVzYClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ05BJ1xuICAgICAgfVxuICAgICAgcmV0dXJuICdOQSdcbiAgICAgIC8vIGlmIChfLmdldChiYXRjaCwgJ3N0YXJ0RGF0ZScpICYmIG1vbWVudChfLmdldChiYXRjaCwgJ3N0YXJ0RGF0ZScpKS5pc0FmdGVyKCkpIHtcbiAgICAgIC8vICAgcmV0dXJuIG1vbWVudChfLmdldChiYXRjaCwgJ3N0YXJ0RGF0ZScpKS5mcm9tKG5vdylcbiAgICAgIC8vIH1cbiAgICAgIC8vIGlmIChfLmdldChiYXRjaCwgJ2VuZERhdGUnKSAmJiBtb21lbnQoXy5nZXQoYmF0Y2gsICdlbmREYXRlJykpLmlzQmVmb3JlKCkpIHtcbiAgICAgIC8vICAgcmV0dXJuICdOQSdcbiAgICAgIC8vIH1cbiAgICAgIC8vIGlmIChzdGFydERhdGVUaW1lICYmIG1vbWVudChzdGFydERhdGVUaW1lKS5pc0FmdGVyKCkpICB7XG4gICAgICAvLyAgIHJldHVybiBtb21lbnQoc3RhcnREYXRlVGltZSkuZnJvbShub3cpXG4gICAgICAvLyB9XG4gICAgICAvLyBpZiAoZW5kRGF0ZVRpbWUgJiYgbW9tZW50KGVuZERhdGVUaW1lKS5pc0JlZm9yZSgpKSB7XG4gICAgICAvLyAgICAgcmV0dXJuICdOQSdcbiAgICAgIC8vICAgfVxuICAgICAgLy8gcmV0dXJuICdOQSdcbiAgICB9IHJldHVybiAnTkEnXG4gIH1cblxuICBnZXQgaXNCYXRjaEluUHJvZ3Jlc3MoKSB7XG4gICAgLy8gaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnRbJ2JhdGNoZXMnXSkge1xuICAgIC8vIGNvbnN0IGJhdGNoZXMgPSB0aGlzLmNvbnRlbnRbJ2JhdGNoZXMnXSBhcyBOc0NvbnRlbnQuSUJhdGNoXG4gICAgLy8gaWYgKHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQpIHtcbiAgICAvLyAgIC8vIGNvbnN0IG5vdyA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpXG4gICAgLy8gICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgIC8vICAgaWYgKHRoaXMuYmF0Y2hEYXRhICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQpIHtcbiAgICAvLyAgICAgY29uc3QgYmF0Y2ggPSBfLmZpcnN0KF8uZmlsdGVyKHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQsIHsgYmF0Y2hJZDogdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCB9KSB8fCBbXSlcbiAgICAvLyAgICAgaWYgKGJhdGNoKSB7XG4gICAgLy8gICAgICAgLy8gY29uc3Qgc3RhcnREYXRlID0gbW9tZW50KGJhdGNoLnN0YXJ0RGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJylcbiAgICAvLyAgICAgICAvLyBjb25zdCBlbmREYXRlID0gYmF0Y2guZW5kRGF0ZSA/IG1vbWVudChiYXRjaC5lbmREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKSA6IG5vd1xuICAgIC8vICAgICAgIC8vIHJldHVybiAoXG4gICAgLy8gICAgICAgLy8gICAvLyBiYXRjaC5zdGF0dXMgJiZcbiAgICAvLyAgICAgICAvLyAgIG1vbWVudChzdGFydERhdGUpLmlzU2FtZU9yQmVmb3JlKG5vdylcbiAgICAvLyAgICAgICAvLyAgICYmIG1vbWVudChlbmREYXRlKS5pc1NhbWVPckFmdGVyKG5vdylcbiAgICAvLyAgICAgICAvLyApXG4gICAgLy8gICAgICAgdGhpcy5zdGFydERhdGUgPSBiYXRjaCAmJiAoXy5nZXQoYmF0Y2gsICdzdGFydFRpbWUnKSlcbiAgICAvLyAgICAgICB0aGlzLmVuZERhdGUgPSBiYXRjaCAmJiAoXy5nZXQoYmF0Y2gsICdlbmRUaW1lJykpXG4gICAgLy8gICAgICAgY29uc3QgZW5kRGF0ZVRpbWUgPSBuZXcgRGF0ZSh0aGlzLmVuZERhdGUpLmdldFRpbWUoKVxuICAgIC8vICAgICAgIHRoaXMuZW5kRGF0ZURpZmZlcmVuY2UgPSBlbmREYXRlVGltZSAtIG5vd1xuICAgIC8vICAgICAgIGlmKHRoaXMuZW5kRGF0ZURpZmZlcmVuY2UgPiAwKSB7XG4gICAgLy8gICAgICAgcmV0dXJuICBiYXRjaC5zdGF0dXNcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlXG4gICAgLy8gICB9XG4gICAgLy8gICByZXR1cm4gZmFsc2VcbiAgICAvLyB9IHJldHVybiBmYWxzZVxuXG4gICAgaWYgKHRoaXMuZW5yb2xsZWRDb3Vyc2VEYXRhKSB7XG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgY29uc3QgYmF0Y2ggPSB0aGlzLmVucm9sbGVkQ291cnNlRGF0YS5iYXRjaFxuICAgICAgdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCA9IGJhdGNoLmJhdGNoSWRcbiAgICAgIGlmIChiYXRjaCAmJiB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkKSB7XG4gICAgICAgIHRoaXMuc3RhcnREYXRlID0gKF8uZ2V0KGJhdGNoLCAnc3RhcnREYXRlJykpXG4gICAgICAgIHRoaXMuZW5kRGF0ZSA9IChfLmdldChiYXRjaCwgJ2VuZERhdGUnKSlcbiAgICAgICAgaWYgKHRoaXMuZW5kRGF0ZSkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZVRpbWUgPSB0aGlzLnN0YXJ0RGF0ZSAmJiBuZXcgRGF0ZSh0aGlzLnN0YXJ0RGF0ZSkuZ2V0VGltZSgpXG4gICAgICAgICAgbGV0IGVuZERhdGUgPSB0aGlzLmVuZERhdGUgJiYgbmV3IERhdGUodGhpcy5lbmREYXRlKVxuICAgICAgICAgIGVuZERhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KVxuICAgICAgICAgIGNvbnN0IGVuZERhdGVUaW1lID0gZW5kRGF0ZS5nZXRUaW1lKClcbiAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgPSBub3cgLSBzdGFydERhdGVUaW1lXG4gICAgICAgICAgdGhpcy5lbmREYXRlRGlmZmVyZW5jZSA9IGVuZERhdGVUaW1lIC0gbm93XG4gICAgICAgICAgaWYgKHRoaXMuZW5kRGF0ZURpZmZlcmVuY2UgPiAwICYmIHRoaXMuc3RhcnREYXRlRGlmZmVyZW5jZSA+IDAgJiYgYmF0Y2guc3RhdHVzICE9PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0RGF0YShkYXRhOiBEYXRhKSB7XG4gICAgY29uc3QgaW5pdERhdGEgPSB0aGlzLnRvY1N2Yy5pbml0RGF0YShkYXRhLCB0cnVlKVxuICAgIHRoaXMuZXJyb3JDb2RlID0gaW5pdERhdGEuZXJyb3JDb2RlXG4gICAgc3dpdGNoICh0aGlzLmVycm9yQ29kZSkge1xuICAgICAgY2FzZSBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUuQVBJX0ZBSUxVUkU6IHtcbiAgICAgICAgdGhpcy5lcnJvcldpZGdldERhdGEud2lkZ2V0RGF0YS5lcnJvclR5cGUgPSBFcnJvclR5cGUuaW50ZXJuYWxTZXJ2ZXJcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlLklOVkFMSURfREFUQToge1xuICAgICAgICB0aGlzLmVycm9yV2lkZ2V0RGF0YS53aWRnZXREYXRhLmVycm9yVHlwZSA9IEVycm9yVHlwZS5pbnRlcm5hbFNlcnZlclxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUuTk9fREFUQToge1xuICAgICAgICB0aGlzLmVycm9yV2lkZ2V0RGF0YS53aWRnZXREYXRhLmVycm9yVHlwZSA9IEVycm9yVHlwZS5pbnRlcm5hbFNlcnZlclxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aGlzLmVycm9yV2lkZ2V0RGF0YS53aWRnZXREYXRhLmVycm9yVHlwZSA9IEVycm9yVHlwZS5zb21ldGhpbmdXcm9uZ1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgdGhpcy5nZXRVc2VyUmF0aW5nKGZhbHNlKVxuICAgICAgLy8gdGhpcy5nZXRVc2VyRW5yb2xsbWVudExpc3QoKVxuICAgIH1cbiAgICB0aGlzLmJvZHkgPSB0aGlzLmRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChcbiAgICAgIHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuYm9keVxuICAgICAgICA/IHRoaXMuZm9yUHJldmlld1xuICAgICAgICAgID8gdGhpcy5hdXRoQWNjZXNzQ29udHJvbFN2Yy5wcm94eVRvQXV0aG9yaW5nVXJsKHRoaXMuY29udGVudC5ib2R5KVxuICAgICAgICAgIDogdGhpcy5jb250ZW50LmJvZHlcbiAgICAgICAgOiAnJyxcbiAgICApXG5cbiAgICB0aGlzLmNvbnRlbnRQYXJlbnRzID0ge31cbiAgICB0aGlzLnRvY1N0cnVjdHVyZSA9IHtcbiAgICAgIGFzc2Vzc21lbnQ6IDAsXG4gICAgICBjb3Vyc2U6IDAsXG4gICAgICBoYW5kc09uOiAwLFxuICAgICAgaW50ZXJhY3RpdmVWaWRlbzogMCxcbiAgICAgIGxlYXJuaW5nTW9kdWxlOiAwLFxuICAgICAgb3RoZXI6IDAsXG4gICAgICBwZGY6IDAsXG4gICAgICBzdXJ2ZXk6IDAsXG4gICAgICBwb2RjYXN0OiAwLFxuICAgICAgcHJhY3RpY2VUZXN0OiAwLFxuICAgICAgZmluYWxUZXN0OiAwLFxuICAgICAgcXVpejogMCxcbiAgICAgIHZpZGVvOiAwLFxuICAgICAgd2ViTW9kdWxlOiAwLFxuICAgICAgd2ViUGFnZTogMCxcbiAgICAgIHlvdXR1YmU6IDAsXG4gICAgICBpbnRlcmFjdGl2ZWNvbnRlbnQ6IDAsXG4gICAgICBvZmZsaW5lU2Vzc2lvbjogMCxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmhhc1RvY1N0cnVjdHVyZSA9IGZhbHNlXG4gICAgICB0aGlzLnRvY1N0cnVjdHVyZS5sZWFybmluZ01vZHVsZSA9IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSA/IC0xIDogMFxuICAgICAgdGhpcy50b2NTdHJ1Y3R1cmUuY291cnNlID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFID8gLTEgOiAwXG4gICAgICB0aGlzLnRvY1N0cnVjdHVyZSA9IHRoaXMudG9jU3ZjLmdldFRvY1N0cnVjdHVyZSh0aGlzLmNvbnRlbnQsIHRoaXMudG9jU3RydWN0dXJlKVxuICAgICAgZm9yIChjb25zdCBwcm9nVHlwZSBpbiB0aGlzLnRvY1N0cnVjdHVyZSkge1xuICAgICAgICBpZiAodGhpcy50b2NTdHJ1Y3R1cmVbcHJvZ1R5cGVdID4gMCkge1xuICAgICAgICAgIHRoaXMuaGFzVG9jU3RydWN0dXJlID0gdHJ1ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZnJvbSBuZ09uQ2hhbmdlc1xuICAgICAgdGhpcy5mZXRjaEV4dGVybmFsQ29udGVudEFjY2VzcygpXG4gICAgICB0aGlzLm1vZGlmeVNlbnNpYmxlQ29udGVudFJhdGluZygpXG4gICAgICB0aGlzLmFzc2lnblBhdGhBbmRVcGRhdGVCYW5uZXIodGhpcy5yb3V0ZXIudXJsKVxuICAgICAgdGhpcy5nZXRMZWFybmluZ1VybHMoKVxuICAgIH1cblxuICAgIHRoaXMuYWN0aW9uU1ZDLmdldFVwZGF0ZUNvbXBHcm91cE8uc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yZXN1bWVEYXRhTGluayA9IHJlc1xuICAgIH0pXG5cbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuaXNQb3N0QXNzZXNzbWVudCkge1xuICAgICAgdGhpcy50b2NTdmMuZmV0Y2hQb3N0QXNzZXNzbWVudFN0YXR1cyh0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIGNvbnN0IGFzc2Vzc21lbnREYXRhID0gcmVzLnJlc3VsdFxuICAgICAgICBmb3IgKGNvbnN0IG8gb2YgYXNzZXNzbWVudERhdGEpIHtcbiAgICAgICAgICBpZiAoby5jb250ZW50SWQgPT09ICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dUYWtlQXNzZXNzbWVudCA9IG9cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIGZyb20gbmdPbkNoYW5nZXNcbiAgICB0aGlzLmJhdGNoQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChiYXRjaDogTnNDb250ZW50LklCYXRjaCkgPT4ge1xuICAgICAgdGhpcy5kaXNhYmxlRW5yb2xsQnRuID0gdHJ1ZVxuICAgICAgbGV0IHVzZXJJZCA9ICcnXG4gICAgICBpZiAoYmF0Y2gpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XG4gICAgICAgICAgdXNlcklkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkIHx8ICcnXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgdXNlcklkLFxuICAgICAgICAgICAgY291cnNlSWQ6IGJhdGNoLmNvdXJzZUlkLFxuICAgICAgICAgICAgYmF0Y2hJZDogYmF0Y2guYmF0Y2hJZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGVudFN2Yy5lbnJvbGxVc2VyVG9CYXRjaChyZXEpLnRoZW4oKGRhdGFiOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YWIgJiYgZGF0YWIucmVzdWx0ICYmIGRhdGFiLnJlc3VsdC5yZXNwb25zZSA9PT0gJ1NVQ0NFU1MnKSB7XG4gICAgICAgICAgICB0aGlzLmJhdGNoRGF0YSA9IHtcbiAgICAgICAgICAgICAgY29udGVudDogW2JhdGNoXSxcbiAgICAgICAgICAgICAgZW5yb2xsZWQ6IHRydWUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5nZXRTZWxlY3RlZEJhdGNoRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgICAgICAgICAgIHRoaXMudG9jU3ZjLm1hcFNlc3Npb25Db21wbGV0aW9uUGVyY2VudGFnZSh0aGlzLmJhdGNoRGF0YSlcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFxuICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgYmF0Y2hJZDogYmF0Y2guYmF0Y2hJZCB9LFxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aGlzLm9wZW5TbmFja2JhcignRW5yb2xsZWQgU3VjY2Vzc2Z1bGx5IScpXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVFbnJvbGxCdG4gPSBmYWxzZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5TbmFja2JhcignU29tZXRoaW5nIHdlbnQgd3JvbmcsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIhJylcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZUVucm9sbEJ0biA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG5cbiAgfVxuXG4gIGdldFVzZXJSYXRpbmcoZmlyZVVwZGF0ZTogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICBpZiAodGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUpIHtcbiAgICAgICAgdGhpcy51c2VySWQgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQgfHwgJydcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSkge1xuICAgICAgICB0aGlzLnJhdGluZ1N2Yy5nZXRSYXRpbmcodGhpcy5jb250ZW50LmlkZW50aWZpZXIsIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnksIHRoaXMudXNlcklkKS5zdWJzY3JpYmUoXG4gICAgICAgICAgKHJlczogYW55KSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLnJlc3VsdCAmJiByZXMucmVzdWx0LnJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgIHRoaXMudXNlclJhdGluZyA9IHJlcy5yZXN1bHQucmVzcG9uc2VcbiAgICAgICAgICAgICAgaWYgKGZpcmVVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvY1N2Yy5jaGFuZ2VVcGRhdGVSZXZpZXdzKHRydWUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udGVudFZpZXdFdmVudEZvck5ldENvcmUoJ3ZpZXcnKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignVVNFUiBSQVRJTkcgRkVUQ0ggRVJST1IgPicsIGVycilcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRTb3VyY2UgJiYgdGhpcy5jb250ZW50U291cmNlLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNDQpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VFbGxpcHNpcyA9IHRydWVcbiAgICAgIH1cbiAgICB9LCAyNTApXG4gIH1cblxuICAvLyBwcml2YXRlIGdldFVzZXJFbnJvbGxtZW50TGlzdCgpIHtcbiAgLy8gICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSB0cnVlXG4gIC8vICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gIC8vICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gIC8vICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciAmJiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiZcbiAgLy8gICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gJiZcbiAgLy8gICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTCAmJlxuICAvLyAgICAgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UICYmXG4gIC8vICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gJiZcbiAgLy8gICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSkge1xuICAvLyAgICAgLy8gY29uc3QgY29sbGVjdGlvbklkID0gdGhpcy5pc1Jlc291cmNlID8gJycgOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllclxuICAvLyAgICAgcmV0dXJuIHRoaXMuZ2V0Q29udGludWVMZWFybmluZ0RhdGEodGhpcy5jb250ZW50LmlkZW50aWZpZXIpXG4gIC8vICAgfVxuXG4gIC8vICAgdGhpcy51c2VyRW5yb2xsbWVudExpc3QgPSBbXVxuICAvLyAgIGxldCB1c2VySWQ6IGFueVxuXG4gIC8vICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XG4gIC8vICAgICB1c2VySWQgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQgfHwgJydcbiAgLy8gICB9XG5cbiAgLy8gICB0aGlzLnVzZXJTdmMuZmV0Y2hVc2VyQmF0Y2hMaXN0KHVzZXJJZCkudG9Qcm9taXNlKCkudGhlbihcbiAgLy8gICAgIGFzeW5jIChyZXN1bHQ6IGFueSkgPT4ge1xuICAvLyAgICAgICBjb25zdCBjb3Vyc2VzOiBOc0NvbnRlbnQuSUNvdXJzZVtdID0gcmVzdWx0ICYmIHJlc3VsdC5jb3Vyc2VzXG4gIC8vICAgICAgIHRoaXMudXNlckVucm9sbG1lbnRMaXN0ID0gY291cnNlc1xuICAvLyAgICAgICBsZXQgZW5yb2xsZWRDb3Vyc2U6IE5zQ29udGVudC5JQ291cnNlIHwgdW5kZWZpbmVkXG4gIC8vICAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIgJiYgIXRoaXMuZm9yUHJldmlldykge1xuICAvLyAgICAgICAgIGlmIChjb3Vyc2VzICYmIGNvdXJzZXMubGVuZ3RoKSB7XG4gIC8vICAgICAgICAgICBlbnJvbGxlZENvdXJzZSA9IGNvdXJzZXMuZmluZCgoY291cnNlOiBhbnkpID0+IHtcbiAgLy8gICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciB8fCAnJ1xuICAvLyAgICAgICAgICAgICBpZiAoY291cnNlLmNvdXJzZUlkICE9PSBpZGVudGlmaWVyKSB7XG4gIC8vICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAvLyAgICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICAgIHJldHVybiBjb3Vyc2VcbiAgLy8gICAgICAgICAgIH0pXG4gIC8vICAgICAgICAgfVxuXG4gIC8vICAgICAgICAgLy8gSWYgY3VycmVudCBjb3Vyc2UgaXMgcHJlc2VudCBpbiB0aGUgbGlzdCBvZiB1c2VyIGVucm9sbGVkIGNvdXJzZVxuICAvLyAgICAgICAgIGlmIChlbnJvbGxlZENvdXJzZSAmJiBlbnJvbGxlZENvdXJzZS5iYXRjaElkKSB7XG4gIC8vICAgICAgICAgICB0aGlzLnJlc3VtZURhdGFTdWJzY3JpcHRpb24gPSB0aGlzLnRvY1N2Yy5yZXN1bWVEYXRhLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgLy8gICAgICAgICAgICAgaWYgKHJlcykge1xuICAvLyAgICAgICAgICAgICAgIHRoaXMucmVzdW1lRGF0YSA9IHJlc1xuICAvLyAgICAgICAgICAgICAgIHRoaXMuZ2V0TGFzdFBsYXllZFJlc291cmNlKClcbiAgLy8gICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUmVzdW1lRGF0YUxpbmtOZXcoKVxuICAvLyAgICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICB9KVxuICAvLyAgICAgICAgICAgdGhpcy50b2NTdmMuY2hlY2tNb2R1bGVXaXNlRGF0YSh0aGlzLmNvbnRlbnQpXG4gIC8vICAgICAgICAgICB0aGlzLmVucm9sbGVkQ291cnNlRGF0YSA9IGVucm9sbGVkQ291cnNlXG4gIC8vICAgICAgICAgICB0aGlzLmlzQ291cnNlQ29tcGxldGVkT25UaGlzTW9udGgoKVxuICAvLyAgICAgICAgICAgdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCA9IGVucm9sbGVkQ291cnNlLmJhdGNoSWRcbiAgLy8gICAgICAgICAgIC8vIHRoaXMuZG93bmxvYWRDZXJ0KGVucm9sbGVkQ291cnNlLmlzc3VlZENlcnRpZmljYXRlcylcbiAgLy8gICAgICAgICAgIGlmIChlbnJvbGxlZENvdXJzZSAmJiBlbnJvbGxlZENvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXMgJiZcbiAgLy8gICAgICAgICAgICAgZW5yb2xsZWRDb3Vyc2UuaXNzdWVkQ2VydGlmaWNhdGVzLmxlbmd0aCkge1xuICAvLyAgICAgICAgICAgICBjb25zdCBjZXJ0aWZpY2F0ZTogYW55ID0gZW5yb2xsZWRDb3Vyc2UuaXNzdWVkQ2VydGlmaWNhdGVzLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PlxuICAvLyAgICAgICAgICAgICAgICBuZXcgRGF0ZShiLmxhc3RJc3N1ZWRPbikuZ2V0VGltZSgpIC0gbmV3IERhdGUoYS5sYXN0SXNzdWVkT24pLmdldFRpbWUoKSlcbiAgLy8gICAgICAgICAgICAgY29uc3QgY2VydElkID0gY2VydGlmaWNhdGVbMF0uaWRlbnRpZmllclxuICAvLyAgICAgICAgICAgICB0aGlzLmNlcnRJZCA9IGNlcnRJZFxuICAvLyAgICAgICAgICAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gIC8vICAgICAgICAgICAgICAgdGhpcy5jb250ZW50WydjZXJ0aWZpY2F0ZU9iaiddID0ge1xuICAvLyAgICAgICAgICAgICAgICAgY2VydElkLFxuICAvLyAgICAgICAgICAgICAgICAgY2VydERhdGE6ICcnLFxuICAvLyAgICAgICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgICAgfVxuICAvLyAgICAgICAgICAgfVxuICAvLyAgICAgICAgICAgdGhpcy5jb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID0gZW5yb2xsZWRDb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgMFxuICAvLyAgICAgICAgICAgdGhpcy5jb250ZW50LmNvbXBsZXRpb25TdGF0dXMgPSBlbnJvbGxlZENvdXJzZS5zdGF0dXMgfHwgMFxuICAvLyAgICAgICAgICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhICYmIHRoaXMuY29udGVudFJlYWREYXRhLmN1bXVsYXRpdmVUcmFja2luZykge1xuICAvLyAgICAgICAgICAgICBhd2FpdCB0aGlzLnRvY1N2Yy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZVByb2dyYW0odGhpcy5jb250ZW50LCB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdClcbiAgLy8gICAgICAgICAgICAgdGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMucmVzdW1lRGF0YS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gIC8vICAgICAgICAgICAgICAgaWYgKHJlcykge1xuICAvLyAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bWVEYXRhID0gcmVzXG4gIC8vICAgICAgICAgICAgICAgICB0aGlzLmdldExhc3RQbGF5ZWRSZXNvdXJjZSgpXG4gIC8vICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUmVzdW1lRGF0YUxpbmtOZXcoKVxuICAvLyAgICAgICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgICAgfSlcblxuICAvLyAgICAgICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAvLyAgICAgICAgICAgICAvLyB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gIC8vICAgICAgICAgICB9IGVsc2Uge1xuICAvLyAgICAgICAgICAgICB0aGlzLmdldENvbnRpbnVlTGVhcm5pbmdEYXRhKHRoaXMuY29udGVudC5pZGVudGlmaWVyLCBlbnJvbGxlZENvdXJzZS5iYXRjaElkKVxuICAvLyAgICAgICAgICAgICB0aGlzLmNvbnRlbnRbJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSBlbnJvbGxlZENvdXJzZS5jb21wbGV0aW9uUGVyY2VudGFnZVxuICAvLyAgICAgICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAvLyAgICAgICAgICAgICB0aGlzLnRvY1N2Yy5tYXBNb2R1bGVDb3VudCh0aGlzLmNvbnRlbnQpXG4gIC8vICAgICAgICAgICAgIC8vIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgLy8gICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgIHRoaXMuYmF0Y2hEYXRhID0ge1xuICAvLyAgICAgICAgICAgICBjb250ZW50OiBbZW5yb2xsZWRDb3Vyc2UuYmF0Y2hdLFxuICAvLyAgICAgICAgICAgICBlbnJvbGxlZDogdHJ1ZSxcbiAgLy8gICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgIHRoaXMudG9jU3ZjLnNldEJhdGNoRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgLy8gICAgICAgICAgIHRoaXMudG9jU3ZjLmdldFNlbGVjdGVkQmF0Y2hEYXRhKHRoaXMuYmF0Y2hEYXRhKVxuICAvLyAgICAgICAgICAgdGhpcy50b2NTdmMubWFwU2Vzc2lvbkNvbXBsZXRpb25QZXJjZW50YWdlKHRoaXMuYmF0Y2hEYXRhLCB0aGlzLnJlc3VtZURhdGEpXG4gIC8vICAgICAgICAgICBpZiAodGhpcy5nZXRCYXRjaElkKCkpIHtcbiAgLy8gICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXG4gIC8vICAgICAgICAgICAgICAgW10sXG4gIC8vICAgICAgICAgICAgICAge1xuICAvLyAgICAgICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgLy8gICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpIH0sXG4gIC8vICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxuICAvLyAgICAgICAgICAgICAgIH0pXG4gIC8vICAgICAgICAgICB9XG4gIC8vICAgICAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgICAgIHRoaXMudG9jU3ZjLmNoZWNrTW9kdWxlV2lzZURhdGEodGhpcy5jb250ZW50KVxuICAvLyAgICAgICAgICAgdGhpcy50b2NTdmMubWFwTW9kdWxlQ291bnQodGhpcy5jb250ZW50KVxuICAvLyAgICAgICAgICAgLy8gSXQncyB1bmRlcnN0b29kIHRoYXQgdXNlciBpcyBub3QgYWxyZWFkeSBlbnJvbGxlZFxuICAvLyAgICAgICAgICAgLy8gRmV0Y2ggdGhlIGF2YWlsYWJsZSBiYXRjaGVzIGFuZCBwcmVzZW50IHRvIHVzZXJcbiAgLy8gICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5DT1VSU0VcbiAgLy8gICAgICAgICAgICAgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSkge1xuICAvLyAgICAgICAgICAgICAvLyBEaXNhYmxpbmcgYXV0byBlbnJvbGxtZW50IHRvIGJhdGNoXG4gIC8vICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0pIHtcbiAgLy8gICAgICAgICAgICAgICB0aGlzLmZldGNoQmF0Y2hEZXRhaWxzKClcbiAgLy8gICAgICAgICAgICAgfVxuICAvLyAgICAgICAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgICAgICAgdGhpcy5mZXRjaEJhdGNoRGV0YWlscygpXG4gIC8vICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICB0aGlzLnRvY1N2Yy5jYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAodGhpcy5jb250ZW50KVxuICAvLyAgICAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgLy8gICAgICAgICAgIC8vIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH1cbiAgLy8gICAgICAgLy8gY29uc29sZS5sb2coJ2NhbGxpbmcgLS0tLS0tLS0tLS0tLS0tLSA9PT09PT09PT0nKVxuICAvLyAgICAgICAvLyB0aGlzLmdldExhc3RQbGF5ZWRSZXNvdXJjZSgpXG4gIC8vICAgICB9LFxuICAvLyAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgLy8gICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0NPTlRFTlQgSElTVE9SWSBGRVRDSCBFUlJPUiA+JywgZXJyb3IpXG4gIC8vICAgICB9LFxuICAvLyAgIClcbiAgLy8gfVxuXG4gIHB1YmxpYyBmZXRjaFVzZXJXRkZvckJsZW5kZWQoKSB7XG4gICAgY29uc3QgYXBwbGljYXRpb25JZHMgPSAodGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudCAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50Lm1hcChlID0+IGUuYmF0Y2hJZCkpIHx8IFtdXG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgYXBwbGljYXRpb25JZHMsXG4gICAgICBzZXJ2aWNlTmFtZTogJ2JsZW5kZWRwcm9ncmFtJyxcbiAgICAgIGxpbWl0OiAxMDAsXG4gICAgICBvZmZzZXQ6IDAsXG4gICAgfVxuXG4gICAgdGhpcy5jb250ZW50U3ZjLmZldGNoQmxlbmRlZFVzZXJXRihyZXEpLnRoZW4oXG4gICAgICAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0LmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgbGF0ZXN0V0YgPSBfLm1heEJ5KGRhdGEucmVzdWx0LmRhdGFbMF0ud2ZJbmZvLCAoZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGVsLmxhc3RVcGRhdGVkT24pLmdldFRpbWUoKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLy8gbGF0ZXN0V0YuY3VycmVudFN0YXR1cyA9IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRUpFQ1RFRFxuICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgICAgIHRoaXMuYmF0Y2hEYXRhIS53b3JrRmxvdyA9IHtcbiAgICAgICAgICAgIHdmSW5pdGlhdGVkOiB0cnVlLFxuICAgICAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICBiYXRjaDogdGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudCAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50LmZpbmQoKGU6IGFueSkgPT4gZS5iYXRjaElkID09PSBsYXRlc3RXRi5hcHBsaWNhdGlvbklkKSxcbiAgICAgICAgICAgIHdmSXRlbTogbGF0ZXN0V0YsXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudG9jU3ZjLnNldFdGRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nZ2VyU3ZjLmluZm8oJ2ZldGNoQmxlbmRlZFVzZXJXRiBkYXRhID09ICcsIGRhdGEpXG4gICAgICB9LFxuICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0NPTlRFTlQgSElTVE9SWSBGRVRDSCBFUlJPUiA+JywgZXJyb3IpXG4gICAgICB9LFxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBjaGVja0lmQmF0Y2hFeGlzdHMobGF0ZXN0OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuYmF0Y2hEYXRhIHx8ICF0aGlzLmJhdGNoRGF0YS5jb250ZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQuZmluZChiID0+IGIuYmF0Y2hJZCA9PT0gbGF0ZXN0LmJhdGNoSWQpXG4gIH1cblxuICBwdWJsaWMgZ2V0QmF0Y2hJZCgpOiBzdHJpbmcge1xuICAgIGxldCBiYXRjaElkID0gJydcbiAgICBpZiAodGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudCkge1xuICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiB0aGlzLmJhdGNoRGF0YS5jb250ZW50KSB7XG4gICAgICAgIGJhdGNoSWQgPSBiYXRjaC5iYXRjaElkXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYXRjaElkXG4gIH1cblxuICAvLyBkb3dubG9hZENlcnQoY2VydElkQXJyOiBhbnkpIHtcbiAgLy8gICBpZiAoY2VydElkQXJyICYmIGNlcnRJZEFyci5sZW5ndGggJiYgY2VydElkQXJyLmxlbmd0aCA+IDApIHtcbiAgLy8gICAgIGNlcnRJZEFyci5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gbmV3IERhdGUoYi5sYXN0SXNzdWVkT24pLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkpXG4gIC8vICAgICBjb25zdCBjZXJ0SWQgPSBjZXJ0SWRBcnJbMF0uaWRlbnRpZmllclxuICAvLyAgICAgdGhpcy5jZXJ0SWQgPSBjZXJ0SWRcblxuICAvLyAgICAgdGhpcy5jb250ZW50U3ZjLmRvd25sb2FkQ2VydChjZXJ0SWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gIC8vICAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgLy8gICAgICAgICB0aGlzLmNvbnRlbnRbJ2NlcnRpZmljYXRlT2JqJ10gPSB7XG4gIC8vICAgICAgICAgICBjZXJ0RGF0YTogcmVzcG9uc2UucmVzdWx0LnByaW50VXJpLFxuICAvLyAgICAgICAgICAgY2VydElkOiB0aGlzLmNlcnRJZCxcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH0pXG4gIC8vICAgfVxuICAvLyB9XG5cbiAgcHVibGljIGhhbmRsZUF1dG9CYXRjaEFzc2lnbigpIHtcbiAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICB0aGlzLm5hdmlnYXRlVG9QbGF5ZXJQYWdlKCcnKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSB0cnVlXG4gICAgICB0aGlzLmNoYW5nZVRhYiA9ICF0aGlzLmNoYW5nZVRhYlxuICAgICAgdGhpcy5yYWlzZUVucm9sbFRlbGVtZXRyeSgpXG4gICAgICBpZiAodGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCkge1xuICAgICAgICB0aGlzLnJhaXNlRW5yb2xsVGVsZW1lbnRyeUZvclNha3NoYW1BSUdlbmVyYXRlZCgpXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCkge1xuICAgICAgICB0aGlzLnJhaXNlRW5yb2xsVGVsZW1lbnRyeUZvclNha3NoYW1BSUdlbmVyYXRlZCgpXG4gICAgICB9XG4gICAgICBjb25zdCBiYXRjaERhdGEgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5iYXRjaGVzICYmIHRoaXMuY29udGVudFJlYWREYXRhLmJhdGNoZXNbMF1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ1VSQVRFRF9QUk9HUkFNKSB7XG4gICAgICAgIHRoaXMuYXV0b0Vucm9sbEN1cmF0ZWRQcm9ncmFtKE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuQ1VSQVRFRF9QUk9HUkFNLCBiYXRjaERhdGEpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkgPT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0pIHtcbiAgICAgICAgbGV0IG1vZGVyYXRlZEJhdGNoRGF0YTogYW55XG4gICAgICAgIGlmICh0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50ICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQubGVuZ3RoID4gMSkge1xuICAgICAgICAgIG1vZGVyYXRlZEJhdGNoRGF0YSA9IHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEgJiYgdGhpcy5zZWxlY3RlZEJhdGNoRGF0YS5jb250ZW50ICYmIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudFswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1vZGVyYXRlZEJhdGNoRGF0YSA9IHRoaXMuYmF0Y2hEYXRhICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudFswXVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXV0b0Vucm9sbEN1cmF0ZWRQcm9ncmFtKE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0sIG1vZGVyYXRlZEJhdGNoRGF0YSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXV0b0Fzc2lnbkVucm9sbCgpXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY29udGVudFZpZXdFdmVudEZvck5ldENvcmUoJ2Vucm9sbCcpXG4gIH1cblxuICBwdWJsaWMgYXV0b0Vucm9sbEN1cmF0ZWRQcm9ncmFtKHByb2dyYW1UeXBlOiBhbnksIGJhdGNoRGF0YTogYW55KSB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikge1xuICAgICAgbGV0IHVzZXJJZCA9ICcnXG4gICAgICBpZiAodGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUgJiYgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkKSB7XG4gICAgICAgIHVzZXJJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZFxuICAgICAgfVxuICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHByb2dyYW1JZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgICAgLy8gYXMgb2Ygbm93IGN1cmF0ZWQgcHJvZ3JhbSBvbmx5IG9uZSBiYXRjaCBpcyBjb21pbmcgbmVlZCB0byBjaGVjayBhbmQgbW9kaWZ5XG4gICAgICAgICAgYmF0Y2hJZDogYmF0Y2hEYXRhLmJhdGNoSWQsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgICB0aGlzLmNvbnRlbnRTdmMuYXV0b0Fzc2lnbkN1cmF0ZWRCYXRjaEFwaShyZXEsIHByb2dyYW1UeXBlKS5zdWJzY3JpYmUoXG4gICAgICAgIChkYXRhOiBOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChwcm9ncmFtVHlwZSA9PT0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5NT0RFUkFURURfUFJPR1JBTSAmJiBiYXRjaERhdGEuZW5kRGF0ZSkge1xuICAgICAgICAgICAgICB0aGlzLmJhdGNoRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbYmF0Y2hEYXRhXSxcbiAgICAgICAgICAgICAgICBlbnJvbGxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcbiAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgYmF0Y2hJZDogYmF0Y2hEYXRhLmJhdGNoSWQgfSxcbiAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRVc2VyRW5yb2xsbWVudExpc3QoKVxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tJZlVzZXJFbnJvbGxlZCgpXG4gICAgICAgICAgICAgIH0sIDIwMDApXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG9QbGF5ZXJQYWdlKHJlcS5yZXF1ZXN0LmJhdGNoSWQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoX2Vycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnX2Vycm9yJywgX2Vycm9yKVxuICAgICAgICAgIC8vIGlmKF9lcnJvciAmJiBfZXJyb3IuZXJyb3IgJiYgX2Vycm9yLmVycm9yLnBhcmFtcyAmJiBfZXJyb3IuZXJyb3IucGFyYW1zLmVyciAmJiBfZXJyb3IuZXJyb3IucGFyYW1zLmVyci5lcnJtc2cpIHtcbiAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihfLmdldChfZXJyb3IsICdlcnJvci5wYXJhbXMuZXJybXNnJykgfHwgJ1BsZWFzZSB0cnkgYWdhaW4gbGF0ZXInKTtcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhdXRvQXNzaWduRW5yb2xsKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMuY29udGVudFN2Yy5hdXRvQXNzaWduQmF0Y2hBcGkodGhpcy5jb250ZW50LmlkZW50aWZpZXIpLnN1YnNjcmliZShcbiAgICAgICAgKGRhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmJhdGNoRGF0YSA9IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IGRhdGEuY29udGVudCxcbiAgICAgICAgICAgIGVucm9sbGVkOiB0cnVlLFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBiYXRjaElkID0gdGhpcy5nZXRCYXRjaElkKClcbiAgICAgICAgICBpZiAoYmF0Y2hJZCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvUGxheWVyUGFnZShiYXRjaElkKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKF9lcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKF8uZ2V0KF9lcnJvciwgJ2Vycm9yLnBhcmFtcy5lcnJtc2cnKSB8fCAnUGxlYXNlIHRyeSBhZ2FpbiBsYXRlcicpO1xuICAgICAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBuYXZpZ2F0ZVRvUGxheWVyUGFnZShiYXRjaElkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSB0cnVlXG4gICAgICBjb25zdCBmaXJzdFBsYXlhYmxlQ29udGVudCA9IHRoaXMuY29udGVudFN2Yy5nZXRGaXJzdENoaWxkSW5IaWVyYXJjaHkodGhpcy5jb250ZW50KVxuICAgICAgbGV0IHByaW1hcnlDYXRlZ29yeVxuICAgICAgaWYgKHRoaXMuY29udGVudC5zZWN1cmVTZXR0aW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByaW1hcnlDYXRlZ29yeSA9ICdMZWFybmluZyBSZXNvdXJjZSdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByaW1hcnlDYXRlZ29yeSA9IGZpcnN0UGxheWFibGVDb250ZW50LnByaW1hcnlDYXRlZ29yeSB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5XG4gICAgICB9XG4gICAgICB0aGlzLmZpcnN0UmVzb3VyY2VMaW5rID0gdmlld2VyUm91dGVHZW5lcmF0b3IoXG4gICAgICAgIGZpcnN0UGxheWFibGVDb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgIGZpcnN0UGxheWFibGVDb250ZW50Lm1pbWVUeXBlLFxuICAgICAgICB0aGlzLmlzUmVzb3VyY2UgPyB1bmRlZmluZWQgOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcixcbiAgICAgICAgdGhpcy5pc1Jlc291cmNlID8gdW5kZWZpbmVkIDogdGhpcy5jb250ZW50LmNvbnRlbnRUeXBlLFxuICAgICAgICB0aGlzLmZvclByZXZpZXcsXG4gICAgICAgIHByaW1hcnlDYXRlZ29yeSxcbiAgICAgICAgYmF0Y2hJZCxcbiAgICAgIClcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgJHt0aGlzLmZpcnN0UmVzb3VyY2VMaW5rLnVybH1gXSwgeyBxdWVyeVBhcmFtczogeyAuLi50aGlzLmZpcnN0UmVzb3VyY2VMaW5rLnF1ZXJ5UGFyYW1zLCBmcm9tQUlUdXRvcjogdGhpcy5mcm9tQUlUdXRvciB9IH0pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZldGNoQmF0Y2hEZXRhaWxzKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpIHtcbiAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgIGNvdXJzZUlkOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcixcbiAgICAgICAgICAgIHN0YXR1czogWycwJywgJzEnLCAnMiddLFxuICAgICAgICAgICAgLy8gY3JlYXRlZEJ5OiAnZmNhMjkyNWYtMWVlZS00NjU0LTkxNzctZmVjZTNmZDZhZmM5JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvcnRfYnk6IHsgY3JlYXRlZERhdGU6ICdkZXNjJyB9LFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICAgdGhpcy5jb250ZW50U3ZjLmZldGNoQ291cnNlQmF0Y2hlcyhyZXEpLnN1YnNjcmliZShcbiAgICAgICAgKGRhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmJhdGNoRGF0YSA9IGRhdGFcbiAgICAgICAgICB0aGlzLmJhdGNoRGF0YS5lbnJvbGxlZCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy50b2NTdmMuc2V0QmF0Y2hEYXRhKHRoaXMuYmF0Y2hEYXRhKVxuICAgICAgICAgIGlmICh0aGlzLmdldEJhdGNoSWQoKSkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgICAgICAgICAvLyBxdWVyeVBhcmFtczogeyBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSB9LFxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdDT05URU5UIEhJU1RPUlkgRkVUQ0ggRVJST1IgPicsIGVycm9yKVxuICAgICAgICB9LFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udGludWVMZWFybmluZ0RhdGEoY29udGVudElkOiBzdHJpbmcsIGJhdGNoSWQ/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICB0aGlzLnJlc3VtZURhdGEgPSBudWxsXG4gICAgbGV0IHVzZXJJZFxuICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSkge1xuICAgICAgdXNlcklkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkIHx8ICcnXG4gICAgfVxuXG4gICAgY29uc3QgcmVxOiBOc0NvbnRlbnQuSUNvbnRpbnVlTGVhcm5pbmdEYXRhUmVxID0ge1xuICAgICAgcmVxdWVzdDoge1xuICAgICAgICBiYXRjaElkLFxuICAgICAgICB1c2VySWQsXG4gICAgICAgIGNvdXJzZUlkOiBjb250ZW50SWQgfHwgJycsXG4gICAgICAgIGNvbnRlbnRJZHM6IFtdLFxuICAgICAgICBmaWVsZHM6IFsncHJvZ3Jlc3NkZXRhaWxzJ10sXG4gICAgICB9LFxuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFKSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdmMuZmV0Y2hDb250ZW50SGlzdG9yeVYyKHJlcSkuc3Vic2NyaWJlKFxuICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnJlc3VsdCAmJiBkYXRhLnJlc3VsdC5jb250ZW50TGlzdCAmJiBkYXRhLnJlc3VsdC5jb250ZW50TGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBSZXN1bWVEYXRhID0gXy5nZXQoZGF0YSwgJ3Jlc3VsdC5jb250ZW50TGlzdCcpXG4gICAgICAgICAgICB0aGlzLnJlc3VtZURhdGEgPSBfLm1hcCh0ZW1wUmVzdW1lRGF0YSwgcnIgPT4ge1xuICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBfLmZpbHRlcihmbGF0dGVuSXRlbXMoXy5nZXQodGhpcy5jb250ZW50LCAnY2hpbGRyZW4nKSB8fCBbXSwgJ2NoaWxkcmVuJyksIHsgJ2lkZW50aWZpZXInOiByci5jb250ZW50SWQsIHByaW1hcnlDYXRlZ29yeTogJ0xlYXJuaW5nIFJlc291cmNlJyB9KVxuICAgICAgICAgICAgICBfLnNldChyciwgJ3Byb2dyZXNzZGV0YWlscy5taW1lVHlwZScsIF8uZ2V0KF8uZmlyc3QoaXRlbXMpLCAnbWltZVR5cGUnKSlcbiAgICAgICAgICAgICAgaWYgKCFfLmdldChyciwgJ2NvbXBsZXRpb25QZXJjZW50YWdlJykpIHtcbiAgICAgICAgICAgICAgICBpZiAoXy5nZXQocnIsICdzdGF0dXMnKSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgXy5zZXQocnIsICdjb21wbGV0aW9uUGVyY2VudGFnZScsIDEwMClcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgXy5zZXQocnIsICdjb21wbGV0aW9uUGVyY2VudGFnZScsIDApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByclxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnN0IHByb2dyZXNzID0gXy5tYXAodGhpcy5yZXN1bWVEYXRhLCAnY29tcGxldGlvblBlcmNlbnRhZ2UnKVxuICAgICAgICAgICAgY29uc3QgdG90YWxDb3VudCA9IF8udG9JbnRlZ2VyKF8uZ2V0KHRoaXMuY29udGVudCwgJ2xlYWZOb2Rlc0NvdW50JykpIHx8IDFcbiAgICAgICAgICAgIGlmIChwcm9ncmVzcy5sZW5ndGggPCB0b3RhbENvdW50KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSB0b3RhbENvdW50IC0gcHJvZ3Jlc3MubGVuZ3RoXG4gICAgICAgICAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgICAgXy5lYWNoKG5ldyBBcnJheShkaWZmKSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MucHVzaCgwKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVSZXN1bWVEYXRhTGlua05ldygpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy51cGRhdGVSZXN1bWFEYXRhKHRoaXMucmVzdW1lRGF0YSlcbiAgICAgICAgICAgIC8vIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUR1cmF0aW9uQW5kUHJvZ3Jlc3ModGhpcy5jb250ZW50LCB0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLmdldExhc3RQbGF5ZWRSZXNvdXJjZSgpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZSh0aGlzLmNvbnRlbnQsIHRoaXMucmVzdW1lRGF0YSlcbiAgICAgICAgICAgIHRoaXMudG9jU3ZjLmNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcCh0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzdW1lRGF0YSA9IG51bGxcbiAgICAgICAgICAgIHRoaXMudG9jU3ZjLmNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcCh0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb250ZW50U3ZjLnNldFByb2dyYW1DaGlsZFJlc3VtZURhdGEodGhpcy5yZXN1bWVEYXRhLCBjb250ZW50SWQpXG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0NPTlRFTlQgSElTVE9SWSBGRVRDSCBFUlJPUiA+JywgZXJyb3IpXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVSZXN1bWVEYXRhTGlua05ldygpIHtcbiAgICBpZiAodGhpcy5yZXN1bWVEYXRhICYmIHRoaXMuY29udGVudCkge1xuICAgICAgbGV0IHJlc3VtZURhdGFWMjogYW55XG4gICAgICBpZiAodGhpcy5jb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgcmVzdW1lRGF0YVYyID0gdGhpcy5nZXRSZXN1bWVEYXRhRnJvbUxpc3QoJ3N0YXJ0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VtZURhdGFWMiA9IHRoaXMuZ2V0UmVzdW1lRGF0YUZyb21MaXN0KClcbiAgICAgIH1cbiAgICAgIGlmICghcmVzdW1lRGF0YVYyLm1pbWVUeXBlKSB7XG4gICAgICAgIHJlc3VtZURhdGFWMi5taW1lVHlwZSA9IHRoaXMudG9jU3ZjLmdldE1pbWVUeXBlKHRoaXMuY29udGVudCwgcmVzdW1lRGF0YVYyLmlkZW50aWZpZXIpXG4gICAgICB9XG4gICAgICB0aGlzLnJlc3VtZURhdGFMaW5rID0gdmlld2VyUm91dGVHZW5lcmF0b3IoXG4gICAgICAgIHJlc3VtZURhdGFWMi5pZGVudGlmaWVyLFxuICAgICAgICByZXN1bWVEYXRhVjIubWltZVR5cGUsXG4gICAgICAgIHRoaXMuaXNSZXNvdXJjZSA/IHVuZGVmaW5lZCA6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICB0aGlzLmlzUmVzb3VyY2UgPyB1bmRlZmluZWQgOiB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUsXG4gICAgICAgIHRoaXMuZm9yUHJldmlldyxcbiAgICAgICAgJ0xlYXJuaW5nIFJlc291cmNlJyxcbiAgICAgICAgdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICAgIHRoaXMuY29udGVudC5uYW1lLFxuICAgICAgKVxuICAgICAgdGhpcy5hY3Rpb25TVkMuc2V0VXBkYXRlQ29tcEdyb3VwTyA9IHRoaXMucmVzdW1lRGF0YUxpbmtcbiAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICAgIH1cbiAgfVxuXG4gIHNjcm9sbFRvVG9wKCkge1xuICAgIChmdW5jdGlvbiBzbW9vdGhzY3JvbGwoKSB7XG4gICAgICBjb25zdCBjdXJyZW50U2Nyb2xsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcFxuICAgICAgaWYgKGN1cnJlbnRTY3JvbGwgPiAwKSB7XG4gICAgICAgIC8vIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc21vb3Roc2Nyb2xsKVxuICAgICAgICAvLyB3aW5kb3cuc2Nyb2xsVG8oMCwgY3VycmVudFNjcm9sbCAtIChjdXJyZW50U2Nyb2xsIC8gNSkpXG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7XG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KSgpXG4gIH1cblxuICBwdWJsaWMgZ2V0Q29tcGV0ZW5jaWVzKGNvbXBldGVuY2llczogYW55KSB7XG4gICAgY29uc3QgY29tcGV0ZW5jaWVzQXJyYXkgPSBKU09OLnBhcnNlKGNvbXBldGVuY2llcylcbiAgICBjb25zdCBjb21wZXRlbmN5U3RyaW5nQXJyYXk6IGFueVtdID0gW11cbiAgICBjb21wZXRlbmNpZXNBcnJheS5tYXAoKGM6IGFueSkgPT4ge1xuICAgICAgY29tcGV0ZW5jeVN0cmluZ0FycmF5LnB1c2goYy5uYW1lKVxuICAgIH0pXG4gICAgcmV0dXJuIGNvbXBldGVuY3lTdHJpbmdBcnJheVxuICB9XG5cbiAgZ2V0IHNob3dJbnRyYW5ldE1zZygpIHtcbiAgICBpZiAodGhpcy5pc01vYmlsZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hvd0ludHJhbmV0TWVzc2FnZVxuICB9XG5cbiAgZ2V0IHNob3dTdGFydCgpIHtcbiAgICByZXR1cm4gdGhpcy50b2NTdmMuc2hvd1N0YXJ0QnV0dG9uKHRoaXMuY29udGVudClcbiAgfVxuXG4gIGdldCBpc1Bvc3RBc3Nlc3NtZW50KCk6IGJvb2xlYW4ge1xuICAgIGlmICghKHRoaXMudG9jQ29uZmlnICYmIHRoaXMudG9jQ29uZmlnLnBvc3RBc3Nlc3NtZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPVVJTRSAmJlxuICAgICAgICB0aGlzLmNvbnRlbnQubGVhcm5pbmdNb2RlID09PSAnSW5zdHJ1Y3Rvci1MZWQnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZ2V0IGlzTW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnV0aWxpdHlTdmMuaXNNb2JpbGVcbiAgfVxuXG4gIGdldCBzaG93U3VidGl0bGVPbkJhbm5lcigpIHtcbiAgICByZXR1cm4gdGhpcy50b2NTdmMuc3VidGl0bGVPbkJhbm5lcnNcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVFbnJvbGxtZW50RW5kRGF0ZShiYXRjaDogYW55KSB7XG4gICAgY29uc3QgZW5yb2xsbWVudEVuZERhdGUgPSBkYXlqcyhfLmdldChiYXRjaCwgJ2Vucm9sbG1lbnRFbmREYXRlJykpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgY29uc3Qgc3lzdGVtRGF0ZSA9IGRheWpzKClcbiAgICByZXR1cm4gZW5yb2xsbWVudEVuZERhdGUgPyBkYXlqcyhlbnJvbGxtZW50RW5kRGF0ZSkuaXNCZWZvcmUoc3lzdGVtRGF0ZSkgOiBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuU25hY2tiYXIocHJpbWFyeU1zZzogc3RyaW5nLCBkdXJhdGlvbjogbnVtYmVyID0gNTAwMCkge1xuICAgIHRoaXMuc25hY2tCYXIub3BlbihwcmltYXJ5TXNnLCAnWCcsIHtcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0pXG4gIH1cblxuICBnZXQgc2hvd0luc3RydWN0b3JMZWRNc2coKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc2hvd0FjdGlvbkJ1dHRvbnMgJiZcbiAgICAgIHRoaXMuY29udGVudCAmJlxuICAgICAgdGhpcy5jb250ZW50LmxlYXJuaW5nTW9kZSA9PT0gJ0luc3RydWN0b3ItTGVkJyAmJlxuICAgICAgIXRoaXMuY29udGVudC5jaGlsZHJlbi5sZW5ndGggJiZcbiAgICAgICF0aGlzLmNvbnRlbnQuYXJ0aWZhY3RVcmxcbiAgICApXG4gIH1cblxuICBnZXQgaXNIZWFkZXJIaWRkZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZXNvdXJjZSAmJiB0aGlzLmNvbnRlbnQgJiYgIXRoaXMuY29udGVudC5hcnRpZmFjdFVybC5sZW5ndGhcbiAgfVxuXG4gIGdldCBzaG93QWN0aW9uQnV0dG9ucygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgIT09ICd3YWl0JyAmJlxuICAgICAgdGhpcy5jb250ZW50ICYmXG4gICAgICB0aGlzLmNvbnRlbnQuc3RhdHVzICE9PSAnRGVsZXRlZCcgJiZcbiAgICAgIHRoaXMuY29udGVudC5zdGF0dXMgIT09ICdFeHBpcmVkJ1xuICAgIClcbiAgfVxuXG4gIGdldCBzaG93QnV0dG9uQ29udGFpbmVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmFjdGlvbkJ0blN0YXR1cyA9PT0gJ2dyYW50JyAmJlxuICAgICAgISh0aGlzLmlzTW9iaWxlICYmIHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaXNJbkludHJhbmV0KSAmJlxuICAgICAgIShcbiAgICAgICAgdGhpcy5jb250ZW50ICYmXG4gICAgICAgIHRoaXMuY29udGVudC5jb250ZW50VHlwZSA9PT0gJ0NvdXJzZScgJiZcbiAgICAgICAgdGhpcy5jb250ZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAhdGhpcy5jb250ZW50LmFydGlmYWN0VXJsXG4gICAgICApICYmXG4gICAgICAhKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUgPT09ICdSZXNvdXJjZScgJiYgIXRoaXMuY29udGVudC5hcnRpZmFjdFVybClcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGdldFJlc3VtZURhdGFGcm9tTGlzdCh0eXBlPzogc3RyaW5nKTogYW55IHwgdm9pZCB7XG4gICAgY29uc3QgcmVzdW1lQ29weSA9IFsuLi50aGlzLnJlc3VtZURhdGFdXG4gICAgaWYgKHJlc3VtZUNvcHkgJiYgcmVzdW1lQ29weS5sZW5ndGgpIHtcbiAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG5cbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSByZXN1bWVDb3B5ICYmIHJlc3VtZUNvcHkuc29ydCgoYTogYW55LCBiOiBhbnkpID0+XG4gICAgICAgICAgbmV3IERhdGUoYi5sYXN0QWNjZXNzVGltZSkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYS5sYXN0QWNjZXNzVGltZSkuZ2V0VGltZSgpKS5zaGlmdCgpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWRlbnRpZmllcjogbGFzdEl0ZW0uY29udGVudElkLFxuICAgICAgICAgIG1pbWVUeXBlOiBsYXN0SXRlbS5wcm9ncmVzc2RldGFpbHMgJiYgbGFzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzLm1pbWVUeXBlLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBmaXJzdEl0ZW0gPSByZXN1bWVDb3B5ICYmIHJlc3VtZUNvcHkubGVuZ3RoICYmIHJlc3VtZUNvcHlbMF1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkZW50aWZpZXI6IGZpcnN0SXRlbS5jb250ZW50SWQsXG4gICAgICAgIG1pbWVUeXBlOiBmaXJzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzICYmIGZpcnN0SXRlbS5wcm9ncmVzc2RldGFpbHMubWltZVR5cGUsXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7fVxuICB9XG5cbiAgcHJpdmF0ZSBtb2RpZnlTZW5zaWJsZUNvbnRlbnRSYXRpbmcoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb250ZW50ICYmXG4gICAgICB0aGlzLmNvbnRlbnQuYXZlcmFnZVJhdGluZyAmJlxuICAgICAgdHlwZW9mIHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nICE9PSAnbnVtYmVyJ1xuICAgICkge1xuICAgICAgdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgPSAodGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgYXMgYW55KVt0aGlzLmNvbmZpZ1N2Yy5yb290T3JnIHx8ICcnXVxuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC50b3RhbFJhdGluZyAmJiB0eXBlb2YgdGhpcy5jb250ZW50LnRvdGFsUmF0aW5nICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5jb250ZW50LnRvdGFsUmF0aW5nID0gKHRoaXMuY29udGVudC50b3RhbFJhdGluZyBhcyBhbnkpW3RoaXMuY29uZmlnU3ZjLnJvb3RPcmcgfHwgJyddXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRMZWFybmluZ1VybHMoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5pc1ByYWN0aWNlVmlzaWJsZSA9IEJvb2xlYW4oXG4gICAgICAgIHRoaXMudG9jU3ZjLmZpbHRlclRvYyh0aGlzLmNvbnRlbnQsIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuUFJBQ1RJQ0UpLFxuICAgICAgKVxuXG4gICAgICB0aGlzLmlzQXNzZXNzVmlzaWJsZSA9IEJvb2xlYW4oXG4gICAgICAgIHRoaXMudG9jU3ZjLmZpbHRlclRvYyh0aGlzLmNvbnRlbnQsIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuQVNTRVNTKSxcbiAgICAgIClcblxuICAgICAgY29uc3QgZmlyc3RQbGF5YWJsZUNvbnRlbnQgPSB0aGlzLmNvbnRlbnRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KHRoaXMuY29udGVudClcbiAgICAgIGxldCBwcmltYXJ5Q2F0ZWdvcnlcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuc2VjdXJlU2V0dGluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnkgPSAnTGVhcm5pbmcgUmVzb3VyY2UnXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnkgPSBmaXJzdFBsYXlhYmxlQ29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeVxuICAgICAgfVxuICAgICAgdGhpcy5maXJzdFJlc291cmNlTGluayA9IHZpZXdlclJvdXRlR2VuZXJhdG9yKFxuICAgICAgICBmaXJzdFBsYXlhYmxlQ29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICBmaXJzdFBsYXlhYmxlQ29udGVudC5taW1lVHlwZSxcbiAgICAgICAgdGhpcy5pc1Jlc291cmNlID8gdW5kZWZpbmVkIDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgIHRoaXMuaXNSZXNvdXJjZSA/IHVuZGVmaW5lZCA6IHRoaXMuY29udGVudC5jb250ZW50VHlwZSxcbiAgICAgICAgdGhpcy5mb3JQcmV2aWV3LFxuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnksXG4gICAgICAgIHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgKVxuXG4gICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cblxuICAgICAgaWYgKGZpcnN0UGxheWFibGVDb250ZW50Lm9wdGlvbmFsUmVhZGluZyAmJiBmaXJzdFBsYXlhYmxlQ29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdMZWFybmluZyBSZXNvdXJjZScpIHtcbiAgICAgICAgdGhpcy51cGRhdGVQcm9ncmVzcygyLCBmaXJzdFBsYXlhYmxlQ29udGVudC5pZGVudGlmaWVyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXNzaWduUGF0aEFuZFVwZGF0ZUJhbm5lcih1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdGggPSB1cmwuc3BsaXQoJy8nKS5wb3AoKVxuICAgIGlmIChwYXRoICYmIHRoaXMudmFsaWRQYXRocy5oYXMocGF0aCkpIHtcbiAgICAgIHRoaXMucm91dGVQYXRoID0gcGF0aFxuICAgICAgdGhpcy51cGRhdGVCYW5uZXJVcmwoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQmFubmVyVXJsKCkge1xuICAgIGlmICh0aGlzLmJhbm5lcnMpIHtcbiAgICAgIHRoaXMuYmFubmVyVXJsID0gdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKFxuICAgICAgICBgdXJsKCR7dGhpcy5iYW5uZXJzW3RoaXMucm91dGVQYXRoXX0pYCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwbGF5SW50cm9WaWRlbygpIHtcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmRpYWxvZy5vcGVuKEFwcFRvY0RpYWxvZ0ludHJvVmlkZW9Db21wb25lbnQsIHtcbiAgICAgICAgZGF0YTogdGhpcy5jb250ZW50LmludHJvZHVjdG9yeVZpZGVvLFxuICAgICAgICBoZWlnaHQ6ICczNTBweCcsXG4gICAgICAgIHdpZHRoOiAnNjIwcHgnLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBnZXQgc2FuaXRpemVkSW50cm9kdWN0b3J5VmlkZW9JY29uKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmludHJvZHVjdG9yeVZpZGVvSWNvbikge1xuICAgICAgcmV0dXJuIHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShgdXJsKCR7dGhpcy5jb250ZW50LmludHJvZHVjdG9yeVZpZGVvSWNvbn0pYClcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hFeHRlcm5hbENvbnRlbnRBY2Nlc3MoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQucmVnaXN0cmF0aW9uVXJsKSB7XG4gICAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgICB0aGlzLmV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzID0gJ2ZldGNoaW5nJ1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRm9yRXh0ZXJuYWwgPSBmYWxzZVxuICAgICAgICB0aGlzLnRvY1N2Yy5mZXRjaEV4dGVybmFsQ29udGVudEFjY2Vzcyh0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikuc3Vic2NyaWJlKFxuICAgICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5leHRlcm5hbENvbnRlbnRGZXRjaFN0YXR1cyA9ICdkb25lJ1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlckZvckV4dGVybmFsID0gZGF0YS5oYXNBY2Nlc3NcbiAgICAgICAgICB9LFxuICAgICAgICAgIF9lcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLmV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzID0gJ2RvbmUnXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRm9yRXh0ZXJuYWwgPSBmYWxzZVxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxDb250ZW50RmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgICAgdGhpcy5yZWdpc3RlckZvckV4dGVybmFsID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFJhdGluZ0ljb24ocmF0aW5nSW5kZXg6IG51bWJlcik6ICdzdGFyJyB8ICdzdGFyX2JvcmRlcicgfCAnc3Rhcl9oYWxmJyB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuYXZlcmFnZVJhdGluZykge1xuICAgICAgY29uc3QgYXZnUmF0aW5nID0gdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmdcbiAgICAgIGNvbnN0IHJhdGluZ0Zsb29yID0gTWF0aC5mbG9vcihhdmdSYXRpbmcpXG4gICAgICBpZiAocmF0aW5nSW5kZXggPD0gcmF0aW5nRmxvb3IpIHtcbiAgICAgICAgcmV0dXJuICdzdGFyJ1xuICAgICAgfVxuICAgICAgaWYgKHJhdGluZ0Zsb29yID09PSByYXRpbmdJbmRleCAtIDEgJiYgYXZnUmF0aW5nICUgMSA+IDApIHtcbiAgICAgICAgcmV0dXJuICdzdGFyX2hhbGYnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnc3Rhcl9ib3JkZXInXG4gIH1cblxuICBwcml2YXRlIGNoZWNrUmVnaXN0cmF0aW9uU3RhdHVzKCkge1xuICAgIGNvbnN0IHNvdXJjZSA9ICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnNvdXJjZVNob3J0TmFtZSkgfHwgJydcbiAgICBpZiAoXG4gICAgICAhdGhpcy5mb3JQcmV2aWV3ICYmXG4gICAgICAhdGhpcy5pc1JlZ2lzdHJhdGlvblN1cHBvcnRlZCAmJlxuICAgICAgdGhpcy5jaGVja1JlZ2lzdHJhdGlvblNvdXJjZXMuaGFzKHNvdXJjZSlcbiAgICApIHtcbiAgICAgIHRoaXMuY29udGVudFN2Y1xuICAgICAgICAuZ2V0UmVnaXN0cmF0aW9uU3RhdHVzKHNvdXJjZSlcbiAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICBpZiAocmVzLmhhc0FjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgPSAnZ3JhbnQnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uQnRuU3RhdHVzID0gJ3JlamVjdCdcbiAgICAgICAgICAgIGlmIChyZXMucmVnaXN0cmF0aW9uVXJsICYmIHRoaXMuY29udGVudCkge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQucmVnaXN0cmF0aW9uVXJsID0gcmVzLnJlZ2lzdHJhdGlvblVybFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKF9lcnIgPT4geyB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGlvbkJ0blN0YXR1cyA9ICdncmFudCdcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZVF1ZXJ5KHR5cGU6ICdSRVNVTUUnIHwgJ1NUQVJUX09WRVInIHwgJ1NUQVJUJyk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGlmICh0aGlzLmZpcnN0UmVzb3VyY2VMaW5rICYmICh0eXBlID09PSAnU1RBUlQnIHx8IHR5cGUgPT09ICdTVEFSVF9PVkVSJykpIHtcbiAgICAgIGxldCBxUGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAuLi50aGlzLmZpcnN0UmVzb3VyY2VMaW5rLnF1ZXJ5UGFyYW1zLFxuICAgICAgICB2aWV3TW9kZTogdHlwZSxcbiAgICAgICAgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZXh0SWQgJiYgdGhpcy5jb250ZXh0UGF0aCkge1xuICAgICAgICBxUGFyYW1zID0ge1xuICAgICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgICAgY29sbGVjdGlvbklkOiB0aGlzLmNvbnRleHRJZCxcbiAgICAgICAgICBjb2xsZWN0aW9uVHlwZTogdGhpcy5jb250ZXh0UGF0aCxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgICBkZWxldGUgcVBhcmFtcy52aWV3TW9kZVxuICAgICAgfVxuICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgLi4ucVBhcmFtcyxcbiAgICAgICAgY2hhbm5lbElkOiB0aGlzLmNoYW5uZWxJZCxcbiAgICAgIH1cbiAgICAgIHJldHVybiBxUGFyYW1zXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdW1lRGF0YUxpbmsgJiYgdHlwZSA9PT0gJ1JFU1VNRScpIHtcbiAgICAgIGxldCBxUGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAuLi50aGlzLnJlc3VtZURhdGFMaW5rLnF1ZXJ5UGFyYW1zLFxuICAgICAgICBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgICAgdmlld01vZGU6ICdSRVNVTUUnLFxuICAgICAgICAvLyBjb3Vyc2VOYW1lOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQubmFtZSA6ICcnLFxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGV4dElkICYmIHRoaXMuY29udGV4dFBhdGgpIHtcbiAgICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogdGhpcy5jb250ZXh0SWQsXG4gICAgICAgICAgY29sbGVjdGlvblR5cGU6IHRoaXMuY29udGV4dFBhdGgsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgZGVsZXRlIHFQYXJhbXMudmlld01vZGVcbiAgICAgIH1cbiAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5jaGFubmVsSWQsXG4gICAgICB9XG4gICAgICByZXR1cm4gcVBhcmFtc1xuICAgIH1cbiAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgdmlld01vZGU6IHR5cGUsXG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzSW5JRnJhbWUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB3aW5kb3cuc2VsZiAhPT0gd2luZG93LnRvcFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgb3BlbkZlZWRiYWNrRGlhbG9nKGNvbnRlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29udGVudFJhdGluZ1YyRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzc2OHB4JyxcbiAgICAgIGRhdGE6IHsgY29udGVudCwgdXNlcklkOiB0aGlzLnVzZXJJZCwgdXNlclJhdGluZzogdGhpcy51c2VyUmF0aW5nIH0sXG4gICAgfSlcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5nZXRVc2VyUmF0aW5nKHRydWUpXG4gICAgICAgIC8vIHRoaXMuZ2V0VXNlckVucm9sbG1lbnRMaXN0KClcbiAgICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICAgICAgdGhpcy5yZXNldFJhdGluZ3NTZXJ2aWNlLnNldFJhdGluZ1NlcnZpY2VVcGRhdGUodHJ1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgdXBkYXRlUHJvZ3Jlc3Moc3RhdHVzOiBudW1iZXIsIHJlc291cmNlSWQ6IGFueSkge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25JZCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zLmlkID9cbiAgICAgIHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zLmlkIDogJydcbiAgICBjb25zdCBiYXRjaElkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5iYXRjaElkID9cbiAgICAgIHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuYmF0Y2hJZCA6ICcnXG4gICAgY29uc3QgaXNQcmVBc3Nlc3NtZW50ID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5wcmVBc3Nlc3NtZW50XG4gICAgaWYoaXNQcmVBc3Nlc3NtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdlclN2Y1xuICAgICAgICAgIC5yZWFsVGltZVByb2dyZXNzVXBkYXRlRm9yUHJlQXNzZXNzbWVudFF1aXoocmVzb3VyY2VJZCwgIHN0YXR1cylcbiAgICAgIFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy52aWV3ZXJTdmMucmVhbFRpbWVQcm9ncmVzc1VwZGF0ZVF1aXoocmVzb3VyY2VJZCwgY29sbGVjdGlvbklkLCBiYXRjaElkLCBzdGF0dXMpXG4gIH1cblxuICBnZXRQcm9ncmFtRHVyYXRpb24oYmF0Y2hEYXRhOiBhbnkpIHtcbiAgICBpZiAoYmF0Y2hEYXRhKSB7XG4gICAgICBjb25zdCBzdGFydERhdGUgPSBkYXlqcyhkYXlqcyhiYXRjaERhdGEuc3RhcnREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSlcbiAgICAgIGNvbnN0IGVuZERhdGUgPSBkYXlqcyhkYXlqcyhiYXRjaERhdGEuZW5kRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJykpXG4gICAgICAvLyBhZGRpbmcgMSB0byBpbmNsdWRlIHRoZSBzdGFydCBkYXRlXG4gICAgICByZXR1cm4gKGVuZERhdGUuZGlmZihzdGFydERhdGUsICdkYXlzJykgKyAxKVxuICAgIH1cbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHdpdGhkcmF3T3JFbnJvbGwoZGF0YTogc3RyaW5nKSB7XG4gICAgaWYgKGRhdGEgPT09IE5zQ29udGVudC5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLklOSVRJQVRFKSB7XG4gICAgICB0aGlzLmZldGNoVXNlcldGRm9yQmxlbmRlZCgpXG4gICAgfVxuICB9XG5cbiAgZ2V0U2VydmVyRGF0ZVRpbWUoKSB7XG4gICAgdGhpcy50b2NTdmMuZ2V0U2VydmVyRGF0ZSgpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnN5c3RlbURhdGUpIHtcbiAgICAgICAgdGhpcy50b2NTdmMuY2hhbmdlU2VydmVyRGF0ZShyZXNwb25zZS5zeXN0ZW1EYXRlKVxuICAgICAgICB0aGlzLnRvY1N2Yy5jaGFuZ2VTZXJ2ZXJEYXRlKHJlc3BvbnNlLnN5c3RlbURhdGUpXG4gICAgICAgIHRoaXMuc2VydmVyRGF0ZSA9IHJlc3BvbnNlLnN5c3RlbURhdGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9jU3ZjLmNoYW5nZVNlcnZlckRhdGUobmV3IERhdGUoKS5nZXRUaW1lKCkpXG4gICAgICB9XG4gICAgICB0aGlzLmZpbmRBQ1BCKClcbiAgICAgIHRoaXMuZ2V0S2FybWFwb2ludHNMaW1pdCgpXG4gICAgfSwgKF9lcnI6IGFueSkgPT4ge1xuICAgICAgdGhpcy50b2NTdmMuY2hhbmdlU2VydmVyRGF0ZShuZXcgRGF0ZSgpLmdldFRpbWUoKSlcbiAgICB9KVxuICB9XG5cbiAgaGFuZGxlQ2FwaXRhbGl6ZShzdHI6IHN0cmluZywgdHlwZT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gJydcbiAgICBpZiAoc3RyKSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ25hbWUnKSB7XG4gICAgICAgIHJldHVyblZhbHVlID0gc3RyLnNwbGl0KCcgJykubWFwKF9zdHIgPT4ge1xuICAgICAgICAgIHJldHVybiBfc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgX3N0ci5zbGljZSgxKVxuICAgICAgICB9KS5qb2luKCcgJylcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgcmV0dXJuVmFsdWUgPSBzdHIgJiYgKHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVyblZhbHVlXG4gIH1cblxuICBwdWJsaWMgaGFuZGxlUGFyc2VKc29uRGF0YShzOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkU3RyaW5nID0gSlNPTi5wYXJzZShzKVxuICAgICAgcmV0dXJuIHBhcnNlZFN0cmluZ1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTmF2aWdhdGVUb1Jldmlld3MoKTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudFRvVmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpZXdDb250YWluZXInKSBhcyBhbnlcblxuICAgIGlmIChlbGVtZW50VG9WaWV3KSB7XG4gICAgICB3aW5kb3cuc2Nyb2xsVG8oe1xuICAgICAgICB0b3A6IGVsZW1lbnRUb1ZpZXcub2Zmc2V0VG9wLFxuICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJhaXNlQ2VydEludHJlYWN0VGVsZW1ldHJ5KCkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFdzRXZlbnRzLkVudW1JbnRlcmFjdFR5cGVzLkNMSUNLLFxuICAgICAgICBpZDogJ3ZpZXctY2VydGlmaWNhdGUnLFxuICAgICAgICBzdWJUeXBlOiBXc0V2ZW50cy5FbnVtSW50ZXJhY3RTdWJUeXBlcy5DRVJUSUZJQ0FURSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiB0aGlzLmNlcnRJZCwgICAvLyBpZCBvZiB0aGUgY2VydGlmaWNhdGVcbiAgICAgICAgdHlwZTogV3NFdmVudHMuRW51bUludGVyYWN0U3ViVHlwZXMuQ0VSVElGSUNBVEUsXG4gICAgICB9KVxuICB9XG5cbiAgdHJhbnNsYXRlTGFiZWxzKGxhYmVsOiBzdHJpbmcsIHR5cGU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmxhbmd0cmFuc2xhdGlvbnMudHJhbnNsYXRlTGFiZWwobGFiZWwsIHR5cGUsICcnKVxuICB9XG5cbiAgLy8gY2hlY2tNb2R1bGVXaXNlRGF0YSgpIHtcbiAgLy8gICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jaGlsZHJlbikge1xuICAvLyAgICAgdGhpcy5jb250ZW50LmNoaWxkcmVuLmZvckVhY2goKGVsZTogYW55KSA9PiB7XG4gIC8vICAgICAgIGlmIChlbGUucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUpIHtcbiAgLy8gICAgICAgICBsZXQgbW9kdWxlUmVzb3Vyc2VDb3VudCA9IDBcbiAgLy8gICAgICAgICBsZXQgb2ZmbGluZVJlc291cnNlQ291bnQgPSAwXG4gIC8vICAgICAgICAgZWxlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkRWxlOiBhbnkpID0+IHtcbiAgLy8gICAgICAgICAgIGlmIChjaGlsZEVsZS5wcmltYXJ5Q2F0ZWdvcnkgIT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk9GRkxJTkVfU0VTU0lPTikge1xuICAvLyAgICAgICAgICAgICBtb2R1bGVSZXNvdXJzZUNvdW50ID0gbW9kdWxlUmVzb3Vyc2VDb3VudCArIDFcbiAgLy8gICAgICAgICAgIH0gZWxzZSB7XG4gIC8vICAgICAgICAgICAgIG9mZmxpbmVSZXNvdXJzZUNvdW50ID0gb2ZmbGluZVJlc291cnNlQ291bnQgKyAxXG4gIC8vICAgICAgICAgICB9XG4gIC8vICAgICAgICAgfSlcbiAgLy8gICAgICAgICBlbGVbJ21vZHVsZVJlc291cnNlQ291bnQnXSA9IG1vZHVsZVJlc291cnNlQ291bnRcbiAgLy8gICAgICAgICBlbGVbJ29mZmxpbmVSZXNvdXJzZUNvdW50J10gPSBvZmZsaW5lUmVzb3Vyc2VDb3VudFxuICAvLyAgICAgICB9XG4gIC8vICAgICB9KVxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIGdldExhc3RQbGF5ZWRSZXNvdXJjZSgpIHtcbiAgICBsZXQgZmlyc3RQbGF5YWJsZUNvbnRlbnRcbiAgICBsZXQgcmVzdW1lRGF0YVYyOiBhbnlcbiAgICBpZiAodGhpcy5yZXN1bWVEYXRhICYmIHRoaXMucmVzdW1lRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuY29udGVudCkge1xuICAgICAgaWYgKHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSB7XG4gICAgICAgIHJlc3VtZURhdGFWMiA9IHRoaXMuZ2V0UmVzdW1lRGF0YUZyb21MaXN0KCdzdGFydCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bWVEYXRhVjIgPSB0aGlzLmdldFJlc3VtZURhdGFGcm9tTGlzdCgpXG4gICAgICB9XG4gICAgICB0aGlzLmV4cGFuZFRoZVBhdGgocmVzdW1lRGF0YVYyLmlkZW50aWZpZXIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgZmlyc3RQbGF5YWJsZUNvbnRlbnQgPSB0aGlzLmNvbnRlbnRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KHRoaXMuY29udGVudClcbiAgICAgICAgdGhpcy5leHBhbmRUaGVQYXRoKGZpcnN0UGxheWFibGVDb250ZW50LmlkZW50aWZpZXIpXG5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBhbmRUaGVQYXRoKHJlc291cmNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgcmVzb3VyY2VJZCkge1xuICAgICAgY29uc3QgcGF0aCA9IHRoaXMudXRpbGl0eVN2Yy5nZXRQYXRoKHRoaXMuY29udGVudCwgcmVzb3VyY2VJZClcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdQYXRoIDo6IDo6IDogJywgcGF0aClcbiAgICAgIHRoaXMucGF0aFNldCA9IG5ldyBTZXQocGF0aC5tYXAoKHU6IHsgaWRlbnRpZmllcjogYW55IH0pID0+IHUuaWRlbnRpZmllcikpXG4gICAgICAvLyBjb25zb2xlLmxvZygncGF0aFNldCA6OjogJywgdGhpcy5wYXRoU2V0KVxuICAgICAgLy8gcGF0aC5mb3JFYWNoKChub2RlOiBJVmlld2VyVG9jQ2FyZCkgPT4ge1xuICAgICAgLy8gICB0aGlzLm5lc3RlZFRyZWVDb250cm9sLmV4cGFuZChub2RlKVxuICAgICAgLy8gfSlcbiAgICB9XG4gIH1cblxuICByYWlzZUVucm9sbFRlbGVtZXRyeSgpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICBzdWJUeXBlOiAnZW5yb2xsJyxcbiAgICAgICAgaWQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5pZGVudGlmaWVyIDogJycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LmlkZW50aWZpZXIgOiAnJyxcbiAgICAgICAgdHlwZTogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA6ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcGFnZUlkRXh0OiBgYnRuLWVucm9sbGAsXG4gICAgICAgIG1vZHVsZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeW1vZHVsZXMuQ09OVEVOVCxcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICByYWlzZUVucm9sbFRlbGVtZW50cnlGb3JTYWtzaGFtQUlHZW5lcmF0ZWQoKSB7XG4gICAgdGhpcy5ldmVudHMucmFpc2VJbnRlcmFjdFRlbGVtZXRyeShcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgICAgc3ViVHlwZTogJ2Vucm9sbCcsXG4gICAgICAgIGlkOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA6ICcnLFxuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICBpZDogdGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCxcbiAgICAgICAgICB2ZXI6IFwiMS4wXCIsXG4gICAgICAgICAgdHlwZTogXCJpZ290LWFpXCJcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgYW55LFxuICAgICAge1xuICAgICAgICBpZDogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LmlkZW50aWZpZXIgOiAnJyxcbiAgICAgICAgdHlwZTogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA6ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcGFnZUlkOiBgL2FwcC90b2MvJHt0aGlzLmNvbnRlbnQ/LmlkZW50aWZpZXJ9L292ZXJ2aWV3X2J0bi1lbnJvbGxgLFxuICAgICAgICBtb2R1bGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnltb2R1bGVzLkNPTlRFTlQsXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgb25DbGlja09mU2hhcmUoKSB7XG4gICAgdGhpcy5lbmFibGVTaGFyZSA9IHRydWVcbiAgICB0aGlzLnJhaXNlVGVsZW1ldHJ5Rm9yU2hhcmUoJ3NoYXJlQ29udGVudCcpXG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuICByYWlzZVRlbGVtZXRyeUZvclNoYXJlKHN1YlR5cGU6IGFueSkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjbGljaycsXG4gICAgICAgIHN1YlR5cGUsXG4gICAgICAgIGlkOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA6ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5pZGVudGlmaWVyIDogJycsXG4gICAgICAgIHR5cGU6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgOiAnJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhZ2VJZEV4dDogYGJ0bi0ke3N1YlR5cGV9YCxcbiAgICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5DT05URU5ULFxuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIHJlc2V0RW5hYmxlU2hhcmUoKSB7XG4gICAgdGhpcy5lbmFibGVTaGFyZSA9IGZhbHNlXG4gIH1cblxuICB0cmFuc2xhdGVMYWJlbChsYWJlbDogc3RyaW5nLCB0eXBlOiBhbnkpIHtcbiAgICBpZiAobGFiZWwgJiYgdHlwZSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZ3RyYW5zbGF0aW9ucy50cmFuc2xhdGVMYWJlbChsYWJlbCwgdHlwZSwgJycpXG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMucm91dGVTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucm91dGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZiAodGhpcy5iYXRjaFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5iYXRjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLmJhdGNoRGF0YVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5iYXRjaERhdGFTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICB0aGlzLnRvY1N2Yy5hbmFseXRpY3NGZXRjaFN0YXR1cyA9ICdub25lJ1xuICAgIGlmICh0aGlzLnJvdXRlclBhcmFtU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJvdXRlclBhcmFtU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRCYXRjaFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RlZEJhdGNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgaWYgKHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgaWYgKHRoaXMudGltZXJVbnN1YnNjcmliZSkge1xuICAgICAgdGhpcy50aW1lclVuc3Vic2NyaWJlLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gIH1cblxuICBwcm9ncmFtRW5yb2xsQ2FsbChiYXRjaERhdGE6IGFueSkge1xuICAgIHRoaXMuYXV0b0Vucm9sbEN1cmF0ZWRQcm9ncmFtKE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0sIGJhdGNoRGF0YSlcbiAgfVxuXG4gIHJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKCkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjbGljaycsXG4gICAgICAgIGlkOiBcInZpZXctYXNzZXNzbWVudFwiLFxuICAgICAgICBzdWJUeXBlOiBcImFub255bW91cy1hc3Nlc3NtZW50XCIsXG4gICAgICB9LCB7fSxcbiAgICAgIHtcbiAgICAgICAgbW9kdWxlOiAnTGFuZGluZyBQYWdlJyxcbiAgICAgIH0pXG4gIH1cblxuXG4gIGZldGNoVXNlckVucm9sbG1lbnREYXRhKCkge1xuICAgIGxldCBpZGVudGlmaWVyID0gdGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyIHx8ICcnXG4gICAgbGV0IHJlcXVlc3Q6IGFueSA9IHtcbiAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgIFwicmV0aXJlZENvdXJzZXNFbmFibGVkXCI6IHRydWUsXG4gICAgICAgIFwiY291cnNlSWRcIjogW2lkZW50aWZpZXJdXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZW5yb2xsU3ZjLmZldGNoRW5yb2xsQ29udGVudERhdGEocmVxdWVzdCkuc3Vic2NyaWJlKGFzeW5jIChyZXM6IGFueSkgPT4ge1xuXG5cbiAgICAgIGlmIChyZXMgJiYgcmVzLnJlc3VsdCAmJiByZXMucmVzdWx0LmNvdXJzZXMgJiYgcmVzLnJlc3VsdC5jb3Vyc2VzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCA9IHJlcy5yZXN1bHQuY291cnNlc1xuXG4gICAgICAgIGxldCBjb21wbGV0ZWRDb250ZW50RmxhZ0RhdGE6IGFueSA9IHRoaXMudXNlckVucm9sbG1lbnRMaXN0ICYmXG4gICAgICAgICAgdGhpcy51c2VyRW5yb2xsbWVudExpc3QuZmluZCgoZWw6IGFueSkgPT4gZWwuY29sbGVjdGlvbklkID09PSB0aGlzLmNvbnRlbnQ/LmlkZW50aWZpZXIpXG4gICAgICAgIGlmIChjb21wbGV0ZWRDb250ZW50RmxhZ0RhdGEgJiYgY29tcGxldGVkQ29udGVudEZsYWdEYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlICYmIGNvbXBsZXRlZENvbnRlbnRGbGFnRGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSB7XG4gICAgICAgICAgdGhpcy5jb250ZW50Vmlld0V2ZW50Rm9yTmV0Q29yZSgnY29tcGxldGUnKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVRyYW5zZmVyU3ZjLnNldEVucm9sbERhdGEodGhpcy51c2VyRW5yb2xsbWVudExpc3QpXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRMaWJTdmMgJiYgdGhpcy5jb250ZW50TGliU3ZjLm9uZVN0ZXBSZXN1bWVFbmFibGUpIHtcbiAgICAgICAgICAvLyBsZXQgdXJsRGF0YSA9IGF3YWl0IHRoaXMuY29udGVudExpYlN2Yy5nZXRSZXNvdXJzZUxpbmsodGhpcy5jb250ZW50LCB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCwgdHJ1ZSlcblxuICAgICAgICAgIGNvbnN0IGZvdW5kQ29udGVudCA9IHRoaXMudXNlckVucm9sbG1lbnRMaXN0ICYmXG4gICAgICAgICAgICB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5maW5kKChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IHRoaXMuY29udGVudD8uaWRlbnRpZmllcilcbiAgICAgICAgICBsZXQgdXJsRGF0YSA9IGF3YWl0IHRoaXMuY29udGVudExpYlN2Yy5nZXRSZXNvdXJzZUxpbmsodGhpcy5jb250ZW50LCBbZm91bmRDb250ZW50XSwgdHJ1ZSlcblxuICAgICAgICAgIC8vIGxldCB1cmxEYXRhID0gYXdhaXQgdGhpcy5jb250ZW50TGliU3ZjLmdldFJlc291cnNlTGluayh0aGlzLmNvbnRlbnQsIHRoaXMudXNlckVucm9sbG1lbnRMaXN0LCB0cnVlKVxuICAgICAgICAgIGlmICh1cmxEYXRhICYmIHVybERhdGEudXJsICYmIHVybERhdGEudXJsLmluY2x1ZGVzKCdhcHAvdG9jJykpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tJZlVzZXJFbnJvbGxlZCgpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudExpYlN2Yy5vbmVTdGVwUmVzdW1lRW5hYmxlID0gZmFsc2VcbiAgICAgICAgICAgIGlmICh1cmxEYXRhICYmIHVybERhdGEudXJsKSB7XG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFxuICAgICAgICAgICAgICAgIFt1cmxEYXRhLnVybF0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHVybERhdGEucXVlcnlQYXJhbXNcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2hlY2tJZlVzZXJFbnJvbGxlZCgpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXNlckVucm9sbG1lbnRMaXN0ID0gW11cbiAgICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxuICBhc3luYyBjaGVja0lmVXNlckVucm9sbGVkKCkge1xuICAgIHRoaXMuY29udGVudExpYlN2Yy5vbmVTdGVwUmVzdW1lRW5hYmxlID0gZmFsc2VcbiAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSB0cnVlXG4gICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciAmJiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiZcbiAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gJiZcbiAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTCAmJlxuICAgICAgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UICYmXG4gICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gJiZcbiAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSkge1xuICAgICAgLy8gY29uc3QgY29sbGVjdGlvbklkID0gdGhpcy5pc1Jlc291cmNlID8gJycgOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29udGludWVMZWFybmluZ0RhdGEodGhpcy5jb250ZW50LmlkZW50aWZpZXIpXG4gICAgfVxuXG4gICAgbGV0IGVucm9sbGVkQ291cnNlOiBOc0NvbnRlbnQuSUNvdXJzZSB8IHVuZGVmaW5lZFxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIgJiYgIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgaWYgKHRoaXMudXNlckVucm9sbG1lbnRMaXN0ICYmIHRoaXMudXNlckVucm9sbG1lbnRMaXN0Lmxlbmd0aCkge1xuICAgICAgICBlbnJvbGxlZENvdXJzZSA9IHRoaXMudXNlckVucm9sbG1lbnRMaXN0LmZpbmQoKGNvdXJzZTogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciB8fCAnJ1xuICAgICAgICAgIGlmIChjb3Vyc2UuY291cnNlSWQgIT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvdXJzZVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBjdXJyZW50IGNvdXJzZSBpcyBwcmVzZW50IGluIHRoZSBsaXN0IG9mIHVzZXIgZW5yb2xsZWQgY291cnNlXG4gICAgICBpZiAoZW5yb2xsZWRDb3Vyc2UgJiYgZW5yb2xsZWRDb3Vyc2UuYmF0Y2hJZCkge1xuICAgICAgICB0aGlzLnJlc3VtZURhdGFTdWJzY3JpcHRpb24gPSB0aGlzLnRvY1N2Yy5yZXN1bWVEYXRhLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VtZURhdGEgPSByZXNcbiAgICAgICAgICAgIHRoaXMuZ2V0TGFzdFBsYXllZFJlc291cmNlKClcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVSZXN1bWVEYXRhTGlua05ldygpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnRvY1N2Yy5jaGVja01vZHVsZVdpc2VEYXRhKHRoaXMuY29udGVudClcbiAgICAgICAgdGhpcy5lbnJvbGxlZENvdXJzZURhdGEgPSBlbnJvbGxlZENvdXJzZVxuICAgICAgICB0aGlzLmlzQ291cnNlQ29tcGxldGVkT25UaGlzTW9udGgoKVxuICAgICAgICB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkID0gZW5yb2xsZWRDb3Vyc2UuYmF0Y2hJZFxuICAgICAgICAvLyB0aGlzLmRvd25sb2FkQ2VydChlbnJvbGxlZENvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXMpXG4gICAgICAgIGlmIChlbnJvbGxlZENvdXJzZSAmJiBlbnJvbGxlZENvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXMgJiZcbiAgICAgICAgICBlbnJvbGxlZENvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgY2VydGlmaWNhdGU6IGFueSA9IGVucm9sbGVkQ291cnNlLmlzc3VlZENlcnRpZmljYXRlcy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT5cbiAgICAgICAgICAgIG5ldyBEYXRlKGIubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShhLmxhc3RJc3N1ZWRPbikuZ2V0VGltZSgpKVxuICAgICAgICAgIGNvbnN0IGNlcnRJZCA9IGNlcnRpZmljYXRlWzBdLmlkZW50aWZpZXJcbiAgICAgICAgICB0aGlzLmNlcnRJZCA9IGNlcnRJZFxuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudFsnY2VydGlmaWNhdGVPYmonXSA9IHtcbiAgICAgICAgICAgICAgY2VydElkLFxuICAgICAgICAgICAgICBjZXJ0RGF0YTogJycsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9IGVucm9sbGVkQ291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IDBcbiAgICAgICAgdGhpcy5jb250ZW50LmNvbXBsZXRpb25TdGF0dXMgPSBlbnJvbGxlZENvdXJzZS5zdGF0dXMgfHwgMFxuICAgICAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGEgJiYgdGhpcy5jb250ZW50UmVhZERhdGEuY3VtdWxhdGl2ZVRyYWNraW5nKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50b2NTdmMubWFwQ29tcGxldGlvblBlcmNlbnRhZ2VQcm9ncmFtKHRoaXMuY29udGVudCwgdGhpcy51c2VyRW5yb2xsbWVudExpc3QpXG4gICAgICAgICAgdGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMucmVzdW1lRGF0YS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVzdW1lRGF0YSA9IHJlc1xuICAgICAgICAgICAgICB0aGlzLmdldExhc3RQbGF5ZWRSZXNvdXJjZSgpXG4gICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVSZXN1bWVEYXRhTGlua05ldygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgLy8gdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZ2V0Q29udGludWVMZWFybmluZ0RhdGEodGhpcy5jb250ZW50LmlkZW50aWZpZXIsIGVucm9sbGVkQ291cnNlLmJhdGNoSWQpXG4gICAgICAgICAgdGhpcy5jb250ZW50Wydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gZW5yb2xsZWRDb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUNvdW50KHRoaXMuY29udGVudClcbiAgICAgICAgICAvLyB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYXRjaERhdGEgPSB7XG4gICAgICAgICAgY29udGVudDogW2Vucm9sbGVkQ291cnNlLmJhdGNoXSxcbiAgICAgICAgICBlbnJvbGxlZDogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvY1N2Yy5zZXRCYXRjaERhdGEodGhpcy5iYXRjaERhdGEpXG4gICAgICAgIHRoaXMudG9jU3ZjLmdldFNlbGVjdGVkQmF0Y2hEYXRhKHRoaXMuYmF0Y2hEYXRhKVxuICAgICAgICB0aGlzLnRvY1N2Yy5tYXBTZXNzaW9uQ29tcGxldGlvblBlcmNlbnRhZ2UodGhpcy5iYXRjaERhdGEsIHRoaXMucmVzdW1lRGF0YSlcbiAgICAgICAgaWYgKHRoaXMuZ2V0QmF0Y2hJZCgpKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCkgfSxcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9jU3ZjLmNoZWNrTW9kdWxlV2lzZURhdGEodGhpcy5jb250ZW50KVxuICAgICAgICB0aGlzLnRvY1N2Yy5tYXBNb2R1bGVDb3VudCh0aGlzLmNvbnRlbnQpXG4gICAgICAgIC8vIEl0J3MgdW5kZXJzdG9vZCB0aGF0IHVzZXIgaXMgbm90IGFscmVhZHkgZW5yb2xsZWRcbiAgICAgICAgLy8gRmV0Y2ggdGhlIGF2YWlsYWJsZSBiYXRjaGVzIGFuZCBwcmVzZW50IHRvIHVzZXJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkNPVVJTRVxuICAgICAgICAgIHx8IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LlBST0dSQU0pIHtcbiAgICAgICAgICAvLyBEaXNhYmxpbmcgYXV0byBlbnJvbGxtZW50IHRvIGJhdGNoXG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSkge1xuICAgICAgICAgICAgdGhpcy5mZXRjaEJhdGNoRGV0YWlscygpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZmV0Y2hCYXRjaERldGFpbHMoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9jU3ZjLmNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcCh0aGlzLmNvbnRlbnQpXG4gICAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgIH1cblxuXG4gICAgfVxuXG4gICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IGZhbHNlXG4gIH1cblxuICBoYW5kbGVBY2NlcHRSZWxldmVudCgpIHtcbiAgICB0aGlzLnNhdmVGZWVkYmFjaygnJywgMSk7XG4gIH1cblxuICBoYW5kbGVEZWNsaW5lUmVsZXZlbnQoKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihOb25SZWxldmVudEZlZWRiYWNrRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICB3aWR0aDogJzUwMnB4JyxcbiAgICAgIHBhbmVsQ2xhc3M6IFsncmVsZXZlbnQtZmVlZGJhY2stZGlhbG9nJ10sXG4gICAgfSlcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuc2F2ZUZlZWRiYWNrKHJlc3VsdCwgMCk7XG4gICAgICAgIGRpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGNvbnRlbnRWaWV3RXZlbnRGb3JOZXRDb3JlKGV2ZW50VHlwZTogYW55KSB7XG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLm5ldGNvcmVDb25maWcgJiYgdGhpcy5jb25maWdTdmMubmV0Y29yZUNvbmZpZy5uZXRjb3JlV2ViQ29uZmlnICAvLyBOT1NPTkFSXG4gICAgICAmJiB0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnLm5ldGNvcmVXZWJDb25maWcuaXNBY3RpdmUgLy8gTk9TT05BUlxuICAgICAgJiYgdGhpcy5jb25maWdTdmMubmV0Y29yZUNvbmZpZy5uZXRjb3JlV2ViQ29uZmlnLmV2ZW50cyAvLyBOT1NPTkFSXG4gICAgICAmJiB0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnLm5ldGNvcmVXZWJDb25maWcuZXZlbnRzLmNvbnRlbnRfdmlldyAvLyBOT1NPTkFSXG4gICAgICAmJiB0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnLm5ldGNvcmVXZWJDb25maWcuZXZlbnRzLmNvbnRlbnRfdmlldy5pc0FjdGl2ZSAvLyBOT1NPTkFSXG4gICAgKSB7XG4gICAgICBsZXQgcGF5bG9hZDogYW55ID0ge31cbiAgICAgIC8vIGlmICh0aGlzLmNvbmZpZ1N2YyAmJiB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIgJiYgdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLmlkZW50aWZpZXIpIHsgLy8gTk9TT05BUlxuICAgICAgLy8gICBwYXlsb2FkWydwa151c2VyaWQnXSA9IHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gICAgICAvLyB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5uYW1lKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfbmFtZSddID0gdGhpcy5jb250ZW50Lm5hbWVcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNvdXJzZUNhdGVnb3J5KSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfY2F0ZWdvcnknXSA9IHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X2lkJ10gPSB0aGlzLmNvbnRlbnQuaWRlbnRpZmllclxuICAgICAgfVxuICAgICAgLy8gaWYodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5uYW1lKSB7XG4gICAgICBwYXlsb2FkWydjb250ZW50X3VybCddID0gd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICAgIC8vIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmFwcEljb24pIHtcbiAgICAgICAgcGF5bG9hZFsnY29udGVudF9pbWFnZSddID0gdGhpcy5jb250ZW50LmFwcEljb25cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmR1cmF0aW9uKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfZHVyYXRpb24nXSA9IHRoaXMuY29udGVudC5kdXJhdGlvbiAmJiBOdW1iZXIodGhpcy5jb250ZW50LmR1cmF0aW9uKSA+IDAgPyBOdW1iZXIodGhpcy5jb250ZW50LmR1cmF0aW9uKSA6IDBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfZHVyYXRpb24nXSA9IDBcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmF2Z1JhdGluZ1xuICAgICAgKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfcmF0aW5nJ10gPSB0aGlzLmNvbnRlbnQuYXZnUmF0aW5nXG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnQgcmF0aW5nJ10gPSB0aGlzLmNvbnRlbnQuYXZnUmF0aW5nXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC50b3RhbE5vT2ZSYXRpbmcpIHtcbiAgICAgICAgcGF5bG9hZFsnbm9fdXNlcnNfcmF0ZWQnXSA9IHRoaXMuY29udGVudC50b3RhbE5vT2ZSYXRpbmdcbiAgICAgIH1cbiAgICAgIC8vIGlmKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQubmFtZSkge1xuICAgICAgcGF5bG9hZFsnbGVhcm5pbmdfcGF0aF9jb250ZW50J10gPSB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCAmJiB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5sZW5ndGggPyB0cnVlIDogZmFsc2VcbiAgICAgIHBheWxvYWRbJ2xlYXJuaW5nIHBhdGggY29udGVudCddID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QgJiYgdGhpcy51c2VyRW5yb2xsbWVudExpc3QubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAvLyB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5zb3VyY2UpIHtcbiAgICAgICAgcGF5bG9hZFsnY29udGVudF9wcm92aWRlcl9uYW1lJ10gPSB0aGlzLmNvbnRlbnQuc291cmNlXG4gICAgICB9XG4gICAgICAvLyBjb25zb2xlLmxvZygncGF5bG9hZCcsIHBheWxvYWQpXG4gICAgICBpZiAoZXZlbnRUeXBlID09PSAndmlldycpIHtcbiAgICAgICAgdGhpcy5uZXRDb3JlU2VydmljZS50cmFja0V2ZW50Rm9yQ29udGVudEFuZEV2ZW50KCdjb250ZW50X3ZpZXcnLCB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIuaWRlbnRpZmllci50cmltKCkudG9Mb3dlckNhc2UoKSwgcGF5bG9hZClcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnZW5yb2xsJykge1xuICAgICAgICB0aGlzLm5ldENvcmVTZXJ2aWNlLnRyYWNrRXZlbnRGb3JDb250ZW50QW5kRXZlbnQoJ2NvbnRlbnRfZW5yb2xtZW50JywgdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLmlkZW50aWZpZXIudHJpbSgpLnRvTG93ZXJDYXNlKCksIHBheWxvYWQpXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICB0aGlzLm5ldENvcmVTZXJ2aWNlLnRyYWNrRXZlbnRGb3JDb250ZW50QW5kRXZlbnQoJ2NvbnRlbnRfY29tcGxldGlvbicsIHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCBwYXlsb2FkKVxuICAgICAgfVxuXG4gICAgfVxuICB9XG5cbiAgc2Vjb25kc1RvVGltZShkOiBhbnkpIHtcbiAgICBkID0gTnVtYmVyKGQpO1xuICAgIHZhciBoID0gTWF0aC5mbG9vcihkIC8gMzYwMCk7XG4gICAgdmFyIG0gPSBNYXRoLmZsb29yKGQgJSAzNjAwIC8gNjApO1xuICAgIHZhciBzID0gTWF0aC5mbG9vcihkICUgMzYwMCAlIDYwKTtcblxuICAgIHZhciBoRGlzcGxheSA9IGggPiAwID8gaCArIChoID09IDEgPyBcIiBob3VyLCBcIiA6IFwiIGhvdXJzLCBcIikgOiBcIlwiO1xuICAgIHZhciBtRGlzcGxheSA9IG0gPiAwID8gbSArIChtID09IDEgPyBcIiBtaW51dGUsIFwiIDogXCIgbWludXRlcywgXCIpIDogXCJcIjtcbiAgICB2YXIgc0Rpc3BsYXkgPSBzID4gMCA/IHMgKyAocyA9PSAxID8gXCIgc2Vjb25kXCIgOiBcIiBzZWNvbmRzXCIpIDogXCJcIjtcbiAgICByZXR1cm4gaERpc3BsYXkgKyBtRGlzcGxheSArIHNEaXNwbGF5O1xuICB9XG5cblxuICBhc3luYyBzYXZlRmVlZGJhY2soY29tbWVudDogc3RyaW5nLCByYXRpbmcgPSAwKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIFwicmVjb21tZW5kYXRpb25faWRcIjogdGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCxcbiAgICAgIFwiY291cnNlX2lkXCI6IHRoaXMuY291cnNlSUQsXG4gICAgICBcInJhdGluZ1wiOiByYXRpbmcsXG4gICAgICBcImNvbW1lbnRzXCI6IGNvbW1lbnQsXG4gICAgICBcInVzZXJfaWRcIjogdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGU/LnVzZXJJZCB8fCAnJ1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29udGVudExpYlN2Yy5zYXZlRmVlZGJhY2tTYWtzaGFtQUkocGF5bG9hZCkudG9Qcm9taXNlKCkuY2F0Y2goKCkgPT4geyB9KVxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZT8ubWVzc2FnZSkge1xuICAgICAgdGhpcy5tYXRTbmFja2Jhck5ldy5vcGVuKFxuICAgICAgICAnVGhhbmsgeW91IGZvciB5b3VyIGZlZWRiYWNrLicsICdYJyxcbiAgICAgICAgeyBkdXJhdGlvbjogU05BQ0tCQVJfRFVSQVRJT04sIHBhbmVsQ2xhc3M6IFsnc3VjY2VzcyddIH1cbiAgICAgICk7XG4gICAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwgeyBxdWVyeVBhcmFtczogeyBnOiBudWxsIH0sIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScgfSk7XG4gICAgICB0aGlzLmZlZWRiYWNrR2l2ZW4gPSB7IGNvdXJzZV9pZDogdGhpcy5jb3Vyc2VJRCwgcmF0aW5nOiByYXRpbmcsIGNvbW1lbnRzOiBjb21tZW50IH1cblxuICAgIH0gZWxzZSBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICB0aGlzLm1hdFNuYWNrYmFyTmV3Lm9wZW4oXG4gICAgICAgICdTb21ldGhpbmcgaXMgd3JvbmcuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJywgJ1gnLFxuICAgICAgICB7IGR1cmF0aW9uOiBTTkFDS0JBUl9EVVJBVElPTiwgcGFuZWxDbGFzczogWydlcnJvciddIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcGxheVJlc3VtZUZvckFJKCkge1xuICAgIGlmKHRoaXMuY29udGVudCkge1xuICAgICAgaWYodGhpcy5maXJzdFJlc291cmNlTGluaykge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5maXJzdFJlc291cmNlTGluay51cmxdLHtxdWVyeVBhcmFtczogdGhpcy5maXJzdFJlc291cmNlTGluay5xdWVyeVBhcmFtc30gKVxuICAgICAgfVxuICAgICAgXG4gICAgIC8vIHRoaXMuZ2V0Q29udGludWVMZWFybmluZ0RhdGEodGhpcy5jb250ZW50LmlkZW50aWZpZXIpXG4gICAgfVxuICAgIFxuICB9XG5cbiAgZW5yb2xsVXNlclRvQUkoKSB7XG4gICAgdGhpcy5mcm9tQUlUdXRvciA9IHRydWVcbiAgICB0aGlzLmhhbmRsZUF1dG9CYXRjaEFzc2lnbigpXG4gIH1cblxuICBnZW5lcmF0ZVByZUFzc2Vzc21lbnRRdWVyeSh0eXBlOiAnUkVTVU1FJyB8ICdTVEFSVF9PVkVSJyB8ICdTVEFSVCcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBpZiAodGhpcy5maXJzdFJlc291cmNlTGluayAmJiAodHlwZSA9PT0gJ1NUQVJUJyB8fCB0eXBlID09PSAnU1RBUlRfT1ZFUicpKSB7XG4gICAgICBsZXQgcVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgLi4udGhpcy5maXJzdFJlc291cmNlTGluay5xdWVyeVBhcmFtcyxcbiAgICAgICAgdmlld01vZGU6IHR5cGUsXG4gICAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGV4dElkICYmIHRoaXMuY29udGV4dFBhdGgpIHtcbiAgICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogdGhpcy5jb250ZXh0SWQsXG4gICAgICAgICAgY29sbGVjdGlvblR5cGU6IHRoaXMuY29udGV4dFBhdGgsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgZGVsZXRlIHFQYXJhbXMudmlld01vZGVcbiAgICAgIH1cbiAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5jaGFubmVsSWQsXG4gICAgICB9XG4gICAgICByZXR1cm4gcVBhcmFtc1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc3VtZURhdGFMaW5rICYmIHR5cGUgPT09ICdSRVNVTUUnKSB7XG4gICAgICBsZXQgcVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgLi4udGhpcy5yZXN1bWVEYXRhTGluay5xdWVyeVBhcmFtcyxcbiAgICAgICAgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICAgIHZpZXdNb2RlOiAnUkVTVU1FJyxcbiAgICAgICAgLy8gY291cnNlTmFtZTogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50Lm5hbWUgOiAnJyxcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRleHRJZCAmJiB0aGlzLmNvbnRleHRQYXRoKSB7XG4gICAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgICAgLi4ucVBhcmFtcyxcbiAgICAgICAgICBjb2xsZWN0aW9uSWQ6IHRoaXMuY29udGV4dElkLFxuICAgICAgICAgIGNvbGxlY3Rpb25UeXBlOiB0aGlzLmNvbnRleHRQYXRoLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICAgIGRlbGV0ZSBxUGFyYW1zLnZpZXdNb2RlXG4gICAgICB9XG4gICAgICBxUGFyYW1zID0ge1xuICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICBjaGFubmVsSWQ6IHRoaXMuY2hhbm5lbElkLFxuICAgICAgfVxuICAgICAgcmV0dXJuIHFQYXJhbXNcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgIHZpZXdNb2RlOiB0eXBlLFxuICAgIH1cbiAgfVxuXG4gIHJvdXRlVG9QcmVBc3Nlc3NlbnQoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhKSB7IFxuICAgICAgY29uc29sZS5sb2coJ3RoaXMuY29udGVudCcsdGhpcy5jb250ZW50UmVhZERhdGEpICBcbiAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmNvbnRlbnQnLCB0aGlzLmNvbnRlbnRSZWFkRGF0YS5wcmVFbnJvbG1lbnRSZXNvdXJjZXMpIFxuICAgICAgLy8gdGhpcy5nZW5lcmF0ZVByZUFzc2Vzc21lbnRRdWVyeSgnU1RBUlQnKVxuICAgICAgbGV0IGZpcnN0UmVzb3VyY2UgID0gdGhpcy5jb250ZW50UmVhZERhdGEucHJlRW5yb2xtZW50UmVzb3VyY2VzWzBdXG5cbiAgICAgIHRoaXMuZmlyc3RSZXNvdXJjZUxpbmsgPSB2aWV3ZXJSb3V0ZUdlbmVyYXRvcihcbiAgICAgICAgZmlyc3RSZXNvdXJjZS5pZGVudGlmaWVyLFxuICAgICAgICBmaXJzdFJlc291cmNlLm1pbWVUeXBlLFxuICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllcixcbiAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5LFxuICAgICAgICB0aGlzLmZvclByZXZpZXcsXG4gICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhLnByZUVucm9sbWVudFJlc291cmNlc1swXT8ucHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICAnJyxcbiAgICAgIClcbiAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmZpcnN0UmVzb3VyY2VMaW5rJywgdGhpcy5maXJzdFJlc291cmNlTGluaylcbiAgICAgIGxldCByb3V0ZXJMaW5rID0gIHRoaXMuZmlyc3RSZXNvdXJjZUxpbms/LnVybCAgXG4gICAgICBsZXQgcXVlcnlQYXJhbXMgPSB0aGlzLmdlbmVyYXRlUHJlQXNzZXNzbWVudFF1ZXJ5KCdTVEFSVCcpXG4gICAgICBxdWVyeVBhcmFtcyA9IHsgLi4ucXVlcnlQYXJhbXMsICBwcmVBc3Nlc3NtZW50OiAndHJ1ZScgfVxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3JvdXRlckxpbmt9YF0sIHsgcXVlcnlQYXJhbXMgfSlcbiAgICB9XG4gIH1cblxuICBnZXRQcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cygpIHtcbiAgICB0aGlzLnByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzID0gZmFsc2VcbiAgICBsZXQgcHJlRW5yb2xsbWVudFJlc291cmNlc0FycjphbnkgPSBbXVxuICAgIGlmKHRoaXMuY29udGVudFJlYWREYXRhPy5wcmVFbnJvbG1lbnRSZXNvdXJjZXM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5jb250ZW50UmVhZERhdGE/LnByZUVucm9sbWVudFJlc291cmNlcz8uZm9yRWFjaCgoaXRlbTphbnkpPT57XG4gICAgICAgIGlmKGl0ZW0gJiYgaXRlbT8uaXNNYW5kYXRvcnkpIHtcbiAgICAgICAgICBwcmVFbnJvbGxtZW50UmVzb3VyY2VzQXJyLnB1c2goaXRlbT8uaWRlbnRpZmllcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgaWYocHJlRW5yb2xsbWVudFJlc291cmNlc0FyciAmJiBwcmVFbnJvbGxtZW50UmVzb3VyY2VzQXJyLmxlbmd0aCkge1xuICAgICAgbGV0IHJlcSA9e1xuICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgIFwiY29udGVudElkc1wiOiBwcmVFbnJvbGxtZW50UmVzb3VyY2VzQXJyLFxuICAgICAgICAgIFwiZmllbGRzXCI6IFtcbiAgICAgICAgICAgICAgLy8gXCJsYXN0QWNjZXNzVGltZVwiLFxuICAgICAgICAgICAgICAvLyBcImNvbXBsZXRpb25QZXJjZW50YWdlXCJcbiAgICAgICAgICBdXG4gICAgICB9XG4gICAgICB9IFxuICAgICAgdGhpcy50b2NTdmMucmVhZFByZUVucm9sbG1lbnRSZXNvdXJjZXNTdGF0ZShyZXEpLnN1YnNjcmliZSgoZGF0YTphbnkpPT57XG4gICAgICAgIGlmKGRhdGEgJiYgZGF0YS5yZXN1bHQgJiYgZGF0YS5yZXN1bHQuY29udGVudExpc3QpIHtcbiAgICAgICAgICBmb3IobGV0IGk9MDsgaTxkYXRhLnJlc3VsdC5jb250ZW50TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYoTnVtYmVyKGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0W2ldWydjb21wbGV0aW9uUGVyY2VudGFnZSddKSA9PT0gMTAwIHx8IFxuICAgICAgICAgICAgICBkYXRhLnJlc3VsdC5jb250ZW50TGlzdFtpXVsnc3RhdHVzJ10gPT09IDIgXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5wcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cyA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIFxuICB9XG5cblxuICBvbkxhbmd1YWdlU2VsZWN0KGxhbmc6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSA9IGxhbmc7XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIGxhbmd1YWdlOicsIGxhbmcpO1xuICAgIC8vIEFkZCB5b3VyIGxhbmd1YWdlIGNoYW5nZSBsb2dpYyBoZXJlXG4gIH1cblxufVxuIiwiPCEtLSBcbiAgTWFpbiBDb250YWluZXIgLSBEaXNwbGF5cyBjb3Vyc2UvY29udGVudCBkZXRhaWxzIHdpdGggZW5yb2xsbWVudCBmdW5jdGlvbmFsaXR5XG4gIE9ubHkgZGlzcGxheXMgY29udGVudCBpZiBjb3Vyc2VJRCBpcyBhdmFpbGFibGUsIG90aGVyd2lzZSBzaG93cyBcIm5vdCBmb3VuZFwiIG1lc3NhZ2Vcbi0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvdXJzZUlEIGVsc2Ugbm9EYXRhRm91bmRcIj5cbiAgPCEtLSBcbiAgICBFTlJPTExNRU5UIFRFTVBMQVRFIC0gSGFuZGxlcyBhbGwgZW5yb2xsbWVudC9zdGFydC9yZXN1bWUgYnV0dG9uIGZ1bmN0aW9uYWxpdHlcbiAgICBVc2VkIGluIG11bHRpcGxlIHBsYWNlcyB0aHJvdWdob3V0IHRoZSB0ZW1wbGF0ZVxuICAtLT5cbiAgPG5nLXRlbXBsYXRlICNlbnJvbGxGdW5jdGlvbmFsaXR5PlxuICAgIDxkaXYgW2hpZGRlbl09XCJpc1Jlc291cmNlICYmICFjb250ZW50Py5hcnRpZmFjdFVybD8ubGVuZ3RoXCIgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00IHRleHQtY2VudGVyXCI+XG4gICAgICA8IS0tIFNFQ1RJT046IFJlZ3VsYXIgY291cnNlIGVucm9sbG1lbnQgYnV0dG9ucyAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5QUk9HUkFNXG4gICAgICAgICAgICAgICAgICAgICYmIGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTVxuICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgJiZcbiAgICAgICAgICAgICAgICAgICAgY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgIDwhLS0gU1RBUlQvUkVTVU1FIGJ1dHRvbiBmb3IgZ3JhbnRlZCBjb3Vyc2VzIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGFjdGlvbkJ0blN0YXR1cyA9PT0gJ2dyYW50JyAmJiAhKGlzTW9iaWxlICYmIGNvbnRlbnQ/LmlzSW5JbnRyYW5ldCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNPVVJTRSAmJiBjb250ZW50Py5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhY29udGVudD8uYXJ0aWZhY3RVcmw/Lmxlbmd0aCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNPVVJTRSAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFICYmICFjb250ZW50Py5hcnRpZmFjdFVybCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTCkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5QUk9HUkFNICYmIGN1cnJlbnRDb3Vyc2VCYXRjaElkKVwiPlxuICAgICAgICAgIDxhICpuZ0lmPVwic2hvd1N0YXJ0LnNob3cgJiYgIWlzUG9zdEFzc2Vzc21lbnQgJiYgIWZvclByZXZpZXdcIiAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoKVwiXG4gICAgICAgICAgICBbcm91dGVyTGlua109XCIocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gcmVzdW1lRGF0YUxpbms/LnVybCA6IGZpcnN0UmVzb3VyY2VMaW5rPy51cmxcIlxuICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cIihyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcIlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIWNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCkgJiYgIWNlcnREYXRhXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCIgPlxuICAgICAgICAgICAgICAgIHt7IHJlc3VtZURhdGEgPyB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgOiB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgfHwgY2VydERhdGFcIj5cbiAgICAgICAgICAgICAge3sgcmVzdW1lRGF0YSA/IHRyYW5zbGF0ZUxhYmVscygnU3RhcnQgYWdhaW4nLCAnYXBwdG9jaG9tZScpIDogdHJhbnNsYXRlTGFiZWxzKCdyZXN1bWUnLCAnYXBwdG9jaG9tZScpIH19XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2E+XG5cbiAgICAgICAgICA8IS0tIFRBS0UgQVNTRVNTTUVOVCBidXR0b24gKGZvciBwb3N0IGFzc2Vzc21lbnRzKSAtLT5cbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNQb3N0QXNzZXNzbWVudCAmJiBzaG93VGFrZUFzc2Vzc21lbnQ/LnBvc3RfYXNzZXNzbWVudFwiICAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoKVwiIFtyb3V0ZXJMaW5rXT1cImZpcnN0UmVzb3VyY2VMaW5rPy51cmxcIlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCIgPnt7ICdhcHB0b2Nob21lLnRha2VBc3Nlc3NtZW50JyB8IHRyYW5zbGF0ZSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPCEtLSBDb21tZW50ZWQga2FybWEgcG9pbnRzIHBhbmVsIGZ1bmN0aW9uYWxpdHkgLS0+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICBcbiAgICAgICAgPCEtLSBFTlJPTEwgYnV0dG9uIGZvciBjb3Vyc2VzIHRoYXQgcmVxdWlyZSBlbnJvbGxtZW50IC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIChhY3Rpb25CdG5TdGF0dXMgPT09ICdncmFudCcgJiYgIShpc01vYmlsZSAmJiBjb250ZW50Py5pc0luSW50cmFuZXQpICYmIFxuICAgICAgICAgICAgICAgICAgICAgICEoIGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNPVVJTRSAmJiBjb250ZW50Py5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIWNvbnRlbnQ/LmFydGlmYWN0VXJsPy5sZW5ndGggKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoIGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNPVVJTRSAmJiBiYXRjaERhdGE/LmVucm9sbGVkICkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFICYmICFjb250ZW50Py5hcnRpZmFjdFVybCkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5QUk9HUkFNKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuTUFOREFUT1JZX0NPVVJTRV9HT0FMKVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSAgJiYgIWVucm9sbEJ0bkxvYWRpbmdcIj5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZVwiICAoY2xpY2spPVwiaGFuZGxlQXV0b0JhdGNoQXNzaWduKClcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciA+XG4gICAgICAgICAgICAgICAgPCEtLSBFTlJPTEwgQlVUVE9OIExBQkVMIC0gVXNlZCBhY3Jvc3MgbXVsdGlwbGUgc2VjdGlvbnMgLS0+XG4gICAgICAgICAgICAgICAge3sgJ2FwcHRvY2hvbWUuZW5yb2xsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwhLS0gQ29tbWVudGVkIGthcm1hIHBvaW50cyBwYW5lbCBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFNFQ1RJT046IEJMRU5ERURfUFJPR1JBTSBwcmUtZW5yb2xsbWVudCBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSAmJiAhcHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXNcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24gZW5yb2xsLWJ0biBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucHJlRW5yb2xtZW50UmVzb3VyY2VzPy5sZW5ndGhcIiAoY2xpY2spPVwicm91dGVUb1ByZUFzc2Vzc2VudCgpXCI+XG4gICAgICAgICAgICAgPG5nLWNvbnRhaW5lciA+XG4gICAgICAgICAgICAgICB7eyAnYXBwdG9jaG9tZS5wcmVFbnJvbGwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgIDwvYT5cbiAgICAgPC9uZy1jb250YWluZXI+XG4gICAgIFxuICAgICAgPCEtLSBTRUNUSU9OOiBCTEVOREVEX1BST0dSQU0gcHJlLWVucm9sbG1lbnQgY29tcGxldGlvbiBtZXNzYWdlIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSAmJiBwcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1c1wiPlxuICAgICAgICA8YSBjbGFzcz1cImZsZXggcHJlZW5yb2xsZG9uZS1idG4ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCI+XG4gICAgICAgICAgICAgPG5nLWNvbnRhaW5lciA+XG4gICAgICAgICAgICAgICB7eyAnYXBwdG9jaG9tZS5wcmVFbnJvbGxEb25lJyB8IHRyYW5zbGF0ZSB9fTxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9BY2NlcHRfaWNvbi5wbmdcIiBhbHQ9XCJ0aWNrXCIgY2xhc3M9XCJ0aWNrLWljb25cIj5cbiAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgPC9hPlxuICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBQUk9HUkFNICYgTUFOREFUT1JZX0NPVVJTRV9HT0FMIGhhbmRsaW5nIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWU7IGVsc2UgYXV0aFZpZXdCdG5cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSB8fCBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5NQU5EQVRPUllfQ09VUlNFX0dPQUxcIj5cbiAgICAgICAgICBcbiAgICAgICAgICA8IS0tIFNFQ1RJT046IE1vZGVyYXRlZCBwcm9ncmFtIGVucm9sbG1lbnQgaGFuZGxpbmcgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihjb3Vyc2VDYXRlZ29yeT8uTU9ERVJBVEVEX1BST0dSQU0gPT09IGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkpICYmIChjb250ZW50UmVhZERhdGE/LmJhdGNoZXMgJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKChjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSkgICYmICFlbnJvbGxCdG5Mb2FkaW5nKSAmJiAhY29udGVudFJlYWREYXRhPy5iYXRjaGVzWzBdLmVuZERhdGVcIj5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgKGNsaWNrKT1cImhhbmRsZUF1dG9CYXRjaEFzc2lnbigpXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIiA+XG4gICAgICAgICAgICAgICAgICA8IS0tIEVOUk9MTCBCVVRUT04gTEFCRUwgLS0+XG4gICAgICAgICAgICAgICAgICB7eydhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwhLS0gQ29tbWVudGVkIGthcm1hIHBvaW50cyBwYW5lbCBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKChjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSkgICYmICFlbnJvbGxCdG5Mb2FkaW5nKSAmJiBjb250ZW50UmVhZERhdGE/LmJhdGNoZXNbMF0uZW5kRGF0ZVwiPlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDx3cy1hcHAtdG9jLWJhbm5lciByb2xlPVwiYmFubmVyXCIgW2Jhbm5lcnNdPVwiYmFubmVyc1wiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAgICAgICAgICAgICBbdXNlckVucm9sbG1lbnRMaXN0XT1cInVzZXJFbnJvbGxtZW50TGlzdFwiICBbYW5hbHl0aWNzXT1cImFuYWx5dGljc1wiIChwcm9ncmFtRW5yb2xsQ2FsbCk9XCJwcm9ncmFtRW5yb2xsQ2FsbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbcmVzdW1lRGF0YV09XCJyZXN1bWVEYXRhXCIgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIiBbY29udGVudFJlYWREYXRhXT1cImNvbnRlbnRSZWFkRGF0YVwiPlxuICAgICAgICAgICAgICAgIDwvd3MtYXBwLXRvYy1iYW5uZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8IS0tIFNFQ1RJT046IE5vIGJhdGNoZXMgbWVzc2FnZSAtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGNvdXJzZUNhdGVnb3J5Py5NT0RFUkFURURfUFJPR1JBTSA9PT0gY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSkgJiYgIWNvbnRlbnRSZWFkRGF0YT8uYmF0Y2hlcyAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICAgICAgTm8gQmF0Y2hlc1xuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPCEtLSBTRUNUSU9OOiBTdGF0dXMgbWVzc2FnZXMgZm9yIG5vbi1tb2RlcmF0ZWQgcHJvZ3JhbXMgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvdXJzZUNhdGVnb3J5Py5NT0RFUkFURURfUFJPR1JBTSAhPT0gY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdJZj1cIiEoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCkgJiYgY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuTUFOREFUT1JZX0NPVVJTRV9HT0FMXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCIgPnt7ICdhcHB0b2Nob21lLnlvdUFyZU5vdEludml0ZWQnIHwgdHJhbnNsYXRlIH19IDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiAhIWN1cnJlbnRDb3Vyc2VCYXRjaElkICYmIGdldFN0YXJ0RGF0ZSA9PT0gJ05BJ1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZCBzaGFkb3ctbGcgdGV4dC1pbmZvLWRpdlwiID57eyAnYXBwdG9jaG9tZS5ub0FjdGl2ZUJhdGNoZXMnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQmF0Y2hJblByb2dyZXNzICYmIGN1cnJlbnRDb3Vyc2VCYXRjaElkICYmIGdldFN0YXJ0RGF0ZSAhPT0gJ05BJ1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZCBzaGFkb3ctbGcgdGV4dC1pbmZvLWRpdlwiID57eyAnYXBwdG9jaG9tZS5iYXRjaFdpbGxTdGFydCcgfCB0cmFuc2xhdGUgfX0ge3tnZXRTdGFydERhdGV9fSE8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDwhLS0gU0VDVElPTjogQmF0Y2ggc3RhdHVzIG1lc3NhZ2VzIGZvciBtb2RlcmF0ZWQgcHJvZ3JhbXMgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiBjb3Vyc2VDYXRlZ29yeT8uTU9ERVJBVEVEX1BST0dSQU0gPT09IGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkgJiYgIWVucm9sbEJ0bkxvYWRpbmdcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNCYXRjaEluUHJvZ3Jlc3MgJiYgY3VycmVudENvdXJzZUJhdGNoSWQgJiYgZ2V0U3RhcnREYXRlICE9PSAnTkEnXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCIgPnt7ICdhcHB0b2Nob21lLmJhdGNoV2lsbFN0YXJ0JyB8IHRyYW5zbGF0ZSB9fSB7e2dldFN0YXJ0RGF0ZX19ITwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPCEtLSBTRUNUSU9OOiBJbi1wcm9ncmVzcyBiYXRjaCB3aXRoIHJlc3VtZS9zdGFydCBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0JhdGNoSW5Qcm9ncmVzcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCBhY3Rpb25CdG5TdGF0dXMgPT09ICdncmFudCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIShpc01vYmlsZSAmJiBjb250ZW50Py5pc0luSW50cmFuZXQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5QUk9HUkFNICYmIGN1cnJlbnRDb3Vyc2VCYXRjaElkKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuTUFOREFUT1JZX0NPVVJTRV9HT0FMICYmIGN1cnJlbnRDb3Vyc2VCYXRjaElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVwiPlxuICAgICAgICAgICAgPGEgKm5nSWY9XCJzaG93U3RhcnQuc2hvdyAmJiAhaXNQb3N0QXNzZXNzbWVudFwiXG4gICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cInJlc3VtZURhdGEgPyByZXN1bWVEYXRhTGluaz8udXJsIDogZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJyZXN1bWVEYXRhID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIiA+XG4gICAgICAgICAgICAgICAgICB7eyByZXN1bWVEYXRhICYmIChjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwICYmIGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2U+IDApID8gdHJhbnNsYXRlTGFiZWxzKCdyZXN1bWUnLCAnYXBwdG9jaG9tZScpIDpcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlTGFiZWxzKCdzdGFydCcsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDBcIj5cbiAgICAgICAgICAgICAgICB7eyByZXN1bWVEYXRhIHx8IGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IFwiU3RhcnQgYWdhaW5cIiA6IFwiU3RhcnRcIiB9fVxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDxhICpuZ0lmPVwiaXNQb3N0QXNzZXNzbWVudCAmJiBzaG93VGFrZUFzc2Vzc21lbnQ/LnBvc3RfYXNzZXNzbWVudFwiIFtyb3V0ZXJMaW5rXT1cImZpcnN0UmVzb3VyY2VMaW5rPy51cmxcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIiA+e3sgJ2FwcHRvY2hvbWUudGFrZUFzc2Vzc21lbnQnIHwgdHJhbnNsYXRlIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8IS0tIENvbW1lbnRlZCBrYXJtYSBwb2ludHMgcGFuZWwgZnVuY3Rpb25hbGl0eSAtLT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBDVVJBVEVEX1BST0dSQU0gaW4tcHJvZ3Jlc3MgaGFuZGxpbmcgLS0+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiaXNCYXRjaEluUHJvZ3Jlc3MgJiYgKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSAmJiBiYXRjaERhdGE/LmVucm9sbGVkKSAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICA8YSAqbmdJZj1cInNob3dTdGFydC5zaG93ICYmICFpc1Bvc3RBc3Nlc3NtZW50XCIgIChjbGljayk9XCJyYWlzZVRlbGVtZXRyeUZvclB1YmxpYygpXCJcbiAgICAgICAgICBbcm91dGVyTGlua109XCJyZXN1bWVEYXRhID8gcmVzdW1lRGF0YUxpbms/LnVybCA6IGZpcnN0UmVzb3VyY2VMaW5rPy51cmxcIlxuICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJyZXN1bWVEYXRhID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXCJcbiAgICAgICAgICBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWU7IGVsc2UgYXV0aFZpZXdcIiA+XG4gICAgICAgICAgICAgIHt7IHJlc3VtZURhdGEgJiYgKGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPCAxMDAgJiYgY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZT4gMCkgPyB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgOlxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMFwiPlxuICAgICAgICAgICAge3sgcmVzdW1lRGF0YSB8fCBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgPyB0cmFuc2xhdGVMYWJlbHMoJ1N0YXJ0IGFnYWluJywgJ2FwcHRvY2hvbWUnKSA6IHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBMb2FkaW5nIHN0YXRlIGZvciBlbnJvbGxtZW50IGJ1dHRvbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbnJvbGxCdG5Mb2FkaW5nXCI+XG4gICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIiczNnB4J1wiXG4gICAgICAgICAgW2JpbmRpbmdDbGFzc109XCInZmxleCByb3VuZGVkIGgtOCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBDVVJBVEVEX1BST0dSQU0gZW5yb2xsbWVudCBidXR0b24gLS0+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQ1VSQVRFRF9QUk9HUkFNICYmICFiYXRjaERhdGE/LmVucm9sbGVkICYmICFlbnJvbGxCdG5Mb2FkaW5nXCI+XG4gICAgICAgIDxhIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZVwiKGNsaWNrKT1cImhhbmRsZUF1dG9CYXRjaEFzc2lnbigpXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciA+XG4gICAgICAgICAgICA8IS0tIEVOUk9MTCBCVVRUT04gTEFCRUwgLS0+XG4gICAgICAgICAgICB7eyAnYXBwdG9jaG9tZS5lbnJvbGwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFNFQ1RJT046IFNUQU5EQUxPTkVfQVNTRVNTTUVOVCBlbnJvbGxtZW50IGJ1dHRvbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQgJiYgIWVucm9sbEJ0bkxvYWRpbmcgJiYgY29udGVudD8uY291cnNlQ2F0ZWdvcnkgIT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiAoY2xpY2spPVwiaGFuZGxlQXV0b0JhdGNoQXNzaWduKClcIiAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyID5cbiAgICAgICAgICAgIDwhLS0gRU5ST0xMIEJVVFRPTiBMQUJFTCAtLT5cbiAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX0gXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFNFQ1RJT046IElOVklURS1PTkxZIFNUQU5EQUxPTkVfQVNTRVNTTUVOVCBtZXNzYWdlIC0tPiAgICAgIFxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZyAmJiBjb250ZW50Py5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0ludml0ZS1Pbmx5IEFzc2Vzc21lbnQnXCI+XG4gICAgXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWU7IGVsc2UgYXV0aFZpZXdGb3JJbnZpdGVPbmx5QXNzZXNzbWVudFwiID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCIgPnt7ICdhcHB0b2Nob21lLnlvdUFyZU5vdEludml0ZWRGb3JBc3Nlc3NtZW50JyB8IHRyYW5zbGF0ZSB9fSA8L3NwYW4+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBFbnJvbGxlZCBJTlZJVEUtT05MWSBTVEFOREFMT05FX0FTU0VTU01FTlQgdGFrZSB0ZXN0IGJ1dHRvbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgJiYgYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiBpc0JhdGNoSW5Qcm9ncmVzcyAmJiAhZW5yb2xsQnRuTG9hZGluZyAmJiBjb250ZW50Py5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0ludml0ZS1Pbmx5IEFzc2Vzc21lbnQnXCI+ICAgICAgICBcbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgW3JvdXRlckxpbmtdPVwiZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cIihyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwXCI+e3sgJ2FwcHRvY2hvbWUudGFrZVRlc3RBZ2FpbicgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMFwiPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0JyB8IHRyYW5zbGF0ZSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBTdGF0dXMgbWVzc2FnZXMgZm9yIElOVklURS1PTkxZIFNUQU5EQUxPTkVfQVNTRVNTTUVOVCAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNCYXRjaEluUHJvZ3Jlc3MgJiYgISFjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgPT09ICdOQScgJiYgY29udGVudD8uY291cnNlQ2F0ZWdvcnkgPT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZCBzaGFkb3ctbGcgdGV4dC1pbmZvLWRpdlwiID57eyAnYXBwdG9jaG9tZS5ub0FjdGl2ZUJhdGNoZXMnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQmF0Y2hJblByb2dyZXNzICYmIGN1cnJlbnRDb3Vyc2VCYXRjaElkICYmIGdldFN0YXJ0RGF0ZSAhPT0gJ05BJyAmJiBjb250ZW50Py5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0ludml0ZS1Pbmx5IEFzc2Vzc21lbnQnXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCIgPnt7ICdhcHB0b2Nob21lLmJhdGNoV2lsbFN0YXJ0JyB8IHRyYW5zbGF0ZSB9fSB7e2dldFN0YXJ0RGF0ZX19ITwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgXG4gICAgICA8IS0tIFNFQ1RJT046IFJlZ3VsYXIgU1RBTkRBTE9ORV9BU1NFU1NNRU5UIGVucm9sbGVkIHRha2UgdGVzdCBidXR0b24gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UICYmIGJhdGNoRGF0YT8uZW5yb2xsZWQgJiYgIWVucm9sbEJ0bkxvYWRpbmcgJiYgY29udGVudD8uY291cnNlQ2F0ZWdvcnkgIT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDBcIj57eyAnYXBwdG9jaG9tZS50YWtlVGVzdEFnYWluJyB8IHRyYW5zbGF0ZSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwXCI+e3sgJ2FwcHRvY2hvbWUudGFrZVRlc3QnIHwgdHJhbnNsYXRlIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFNFQ1RJT046IEJMRU5ERURfUFJPR1JBTSB3b3JrZmxvdyBzdGF0dXMgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgIDwhLS0gUmV2aWV3IHN0YXR1cyBtZXNzYWdlIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJbml0aWF0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGJhdGNoRGF0YT8ud29ya0Zsb3c/LndmSXRlbT8uY3VycmVudFN0YXR1cyA9PT0gV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5BUFBST1ZFRCB8fCBiYXRjaERhdGE/LndvcmtGbG93Py53Zkl0ZW0/LmN1cnJlbnRTdGF0dXMgPT09IFdGQmxlbmRlZFByb2dyYW1TdGF0dXMuUkVKRUNURUQgfHwgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLldJVEhEUkFXTilcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid3MtbWF0LWFjY2VudC10ZXh0IHdzLW1hdC1hY2NlbnQtbGlnaHQtYmcgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgc3RhdHVzTXNnXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvbnQtYm9sZFwiPlxuICAgICAgICAgICAgICB7eyAnYXBwdG9jaG9tZS5yZXF1ZXN0VW5kZXJSZXZpZXcnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gQXBwcm92ZWQgQkxFTkRFRF9QUk9HUkFNIHN0YXJ0L3Jlc3VtZSBidXR0b24gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd1N0YXJ0LnNob3cgJiYgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJbml0aWF0ZWQgJiYgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLkFQUFJPVkVEXCJcbiAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cImlzQmF0Y2hJblByb2dyZXNzPyAocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gcmVzdW1lRGF0YUxpbms/LnVybCA6IGZpcnN0UmVzb3VyY2VMaW5rPy51cmwgOiAnJyBcIiAgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKClcIlxuICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImlzQmF0Y2hJblByb2dyZXNzID8gKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKSA6ICcnIFwiXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiBbbmdDbGFzc109XCJ7J2Rpc2FibGUtc3RhcnQtYnRuJzogIWlzQmF0Y2hJblByb2dyZXNzfVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIighY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwKSAmJiAhY2VydERhdGFcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWU7IGVsc2UgYXV0aFZpZXdcIiA+XG4gICAgICAgICAgICAgICAge3sgcmVzdW1lRGF0YSAmJiAoY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCAmJiBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlPiAwKSA/IHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3N0YXJ0JywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCB8fCBjZXJ0RGF0YVwiPlxuICAgICAgICAgICAgICB7eyByZXN1bWVEYXRhIHx8IGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IHRyYW5zbGF0ZUxhYmVscygnU3RhcnQgYWdhaW4nLCAnYXBwdG9jaG9tZScpIDogdHJhbnNsYXRlTGFiZWxzKCdzdGFydCcsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBFeHRlcm5hbCByZWdpc3RyYXRpb24gbGluayAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3Rpb25CdG5TdGF0dXMgPT0gJ3JlamVjdCcgJiYgY29udGVudD8ucmVnaXN0cmF0aW9uVXJsXCI+XG4gICAgICAgIDxhIFtocmVmXT1cImNvbnRlbnQ/LnJlZ2lzdHJhdGlvblVybFwiIHRhcmdldD1cIl9ibGFua1wiIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyXCIgPnt7ICdhcHB0b2Nob21lLnJlZ2lzdGVyJyB8IHRyYW5zbGF0ZSB9fTwvYT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPCEtLSBcbiAgICBQUk9HUkVTUyBGVU5DVElPTkFMSVRZIFRFTVBMQVRFXG4gICAgRGlzcGxheXMgcHJvZ3Jlc3MgYmFyIGFuZCByYXRpbmcgYnV0dG9uIGZ1bmN0aW9uYWxpdHlcbiAgLS0+XG4gIDxuZy10ZW1wbGF0ZSAjcHJvZ3Jlc3NGdW5jdGlvbmFsaXR5PlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQgdGV4dC1zbVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSB0ZXh0LXhzXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2Uub3ZlcmFsbFByb2dyZXNzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHNcIiAqbmdJZj1cImNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID4gMFwiPiB7eyBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSB9fSAlPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHdzLXdpZGdldC1jb250ZW50LXByb2dyZXNzICpuZ0lmPVwiY29udGVudD8uaWRlbnRpZmllclwiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIlxuICAgICAgICAgICAgW2NvbnRlbnRJZF09XCJjb250ZW50Py5pZGVudGlmaWVyXCIgW3Byb2dyZXNzXT1cImNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlXCIgW3Byb2dyZXNzVHlwZV09XCIncGVyY2VudGFnZSdcIlxuICAgICAgICAgICAgW2N1c3RvbUNsYXNzTmFtZV09XCInY29udGVudC1wcm9ncmVzcydcIiA+XG4gICAgICAgICAgPC93cy13aWRnZXQtY29udGVudC1wcm9ncmVzcz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID49IDUwXCI+XG4gICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwiYWNjZW50XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicmF0ZS1idXR0b25cIiAoY2xpY2spPVwib3BlbkZlZWRiYWNrRGlhbG9nKGNvbnRlbnQpXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+c3Rhcl9wdXJwbGU1MDA8L21hdC1pY29uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdXNlclJhdGluZ1wiPlxuICAgICAgICAgICAgPGRpdj57eyAnYXBwdG9jc2luZ2xlcGFnZS5yYXRlTm93JyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VyUmF0aW5nXCI+XG4gICAgICAgICAgICA8ZGl2Pnt7ICdhcHB0b2NzaW5nbGVwYWdlLmVkaXRSYXRpbmcnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPCEtLSBcbiAgICBNQUlOIENPTlRFTlQgRElTUExBWSBTRUNUSU9OXG4gICAgQmFubmVyLCBkZXRhaWxzLCBhbmQgY29udGVudCBsYXlvdXRcbiAgLS0+XG4gIDxkaXYgY2xhc3M9XCJ0b2MtYmFubmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTYgZml4ZWQtd2lkdGhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJiYW5uZXItZGV0YWlscyB0b2MtY29udGVudFwiICNiYW5uZXJEZXRhaWxzPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEzMnB4J1wiIFtoZWlnaHRdPVwiJzMycHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzE0MHB4J1wiIFtoZWlnaHRdPVwiJzI0cHgnXCIgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCBibHVlLTItbG9hZGVyJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgdGFnLWRpdiByb3VuZGVkLTJ4bCBnYXAtMSBpdGVtcy1jZW50ZXIgcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ3cy1tYXQtb3JhbmdlLXRleHQgbm9kdHJhbnNsYXRlXCI+dmlkZW9fbGlicmFyeTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY291cnNlQ2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgZm9udC1ib2xkIHRleHQtd2hpdGUgbGVhZGluZy0zIG5vZHRyYW5zbGF0ZVwiPnt7IHRyYW5zbGF0ZUxhYmVsKGNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5LCAnc2VhcmNoZmlsdGVycycpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudD8uY291cnNlQ2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgZm9udC1ib2xkIHRleHQtd2hpdGUgbGVhZGluZy0zIG5vZHRyYW5zbGF0ZVwiPnt7IHRyYW5zbGF0ZUxhYmVsKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSwgJ3NlYXJjaGZpbHRlcnMnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJjYlBsYW5FbmREYXRlXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZHVlLXRhZyB0ZXh0LXhzIGxlYWRpbmctM1wiIFtuZ0NsYXNzXT1cInsnZHVlLXdhcm5pbmcnOiBjYlBsYW5EdXJhdGlvbiA9PT0gbnNDYXJkQ29udGVudERhdGEuVVBDT01JTkcsICdkdWUtb3ZlcmR1ZSc6IGNiUGxhbkR1cmF0aW9uID09PSBuc0NhcmRDb250ZW50RGF0YS5PVkVSRFVFLCAnZHVlLXN1Y2Nlc3MnOiBjYlBsYW5EdXJhdGlvbiA9PT0gbnNDYXJkQ29udGVudERhdGEuU1VDQ0VTU31cIiA+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdjb21tb24uZHVlQnknIHwgdHJhbnNsYXRlIH19IC0gJm5ic3A7PHNwYW4gY2xhc3M9XCJmb250LWJvbGRcIj57eyBjYlBsYW5FbmREYXRlIHwgZGF0ZTogJ2QgTU1NLCB5J319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXdoaXRlIG1vYi1zaGFyZVwiICpuZ0lmPVwiY2FuU2hhcmVcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCIgKGNsaWNrKT1cIm9uQ2xpY2tPZlNoYXJlKClcIj5zaGFyZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInOTAlJ1wiIFtoZWlnaHRdPVwiJzMycHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzcwJSdcIiBbaGVpZ2h0XT1cIiczMnB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCBibHVlLTItbG9hZGVyJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFubmVyLXRleHQgdGV4dC1iYXNlIHNtOnRleHQtNHhsIGxlYWRpbmctNiBzbTpsZWFkaW5nLTEwIGZvbnQtYm9sZCBub2R0cmFuc2xhdGVcIj57eyBoYW5kbGVDYXBpdGFsaXplKGNvbnRlbnQ/Lm5hbWUpIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHNtOnRleHQtYmFzZSBzb3VyY2UtdGV4dCBmb250LXNlbWlib2xkIGJyZWFrLXdvcmRzIG5vZHRyYW5zbGF0ZVwiICNjb250ZW50U291cmNlIFtuZ0NsYXNzXT1cInsnc291cmNlRWxsaXBzaXMnOiBzb3VyY2VFbGxpcHNpc31cIiB0aXRsZT1cInt7Y29udGVudD8uc291cmNlfX1cIj57eyAnY2FyZGNvbnRlbnR2Mi5ieScgfCB0cmFuc2xhdGUgfX0ge3sgY29udGVudD8uc291cmNlIH19PC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTIwcHgnXCIgW2hlaWdodF09XCInNDBweCdcIlxuICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODhweCdcIiBbaGVpZ2h0XT1cIicyNHB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCBibHVlLTItbG9hZGVyJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBpdGVtcy1jZW50ZXJcIiAqbmdJZj1cImNvbnRlbnQ/LmF2ZXJhZ2VSYXRpbmcgfHwgY29udGVudD8uYWRkaXRpb25hbFRhZ3M/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHJhdGluZy1jaGlwIHB5LTIgaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImhhbmRsZU5hdmlnYXRlVG9SZXZpZXdzKClcIiAqbmdJZj1cImNvbnRlbnQ/LmF2ZXJhZ2VSYXRpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIG1hcmdpbi1sZWZ0LXMgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPmdyYWRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtd2hpdGUgdGV4dC1zbSBsZWFkaW5nLTRcIj57eyBjb250ZW50Py5hdmVyYWdlUmF0aW5nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXBhcmF0b3JcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXdoaXRlIHRleHQtc20gbGVhZGluZy00IG1hcmdpbi1yaWdodC1tXCI+e3sgY29udGVudD8udG90YWxSYXRpbmcgfCBwaXBlQ291bnRUcmFuc2Zvcm0gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIiAqbmdJZj1cImNvbnRlbnQ/LmFkZGl0aW9uYWxUYWdzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb3N0LWVucm9sbGVkLWNoaXAgdGV4dC14cyBsZWFkaW5nLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb250ZW50Py5hZGRpdGlvbmFsVGFncz8uaW5jbHVkZXMoJ21vc3RUcmVuZGluZycpXCI+e3sgJ2NhcmRjb250ZW50djIubW9zdFRyZW5kaW5nJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb250ZW50Py5hZGRpdGlvbmFsVGFncz8uaW5jbHVkZXMoJ21vc3RFbnJvbGxlZCcpXCI+e3sgJ2NhcmRjb250ZW50djIubW9zdEVucm9sbGVkJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxODBweCdcIiBbaGVpZ2h0XT1cIicyMHB4J1wiXG4gICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlciAmJiBjb250ZW50Py5zWVNfSU5URVJOQUxfTEFTVF9VUERBVEVEX09OXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBsZWFkaW5nLTQgc291cmNlLXRleHQgbm9kdHJhbnNsYXRlXCI+KHt7ICdhcHB0b2MubGFzdFVwZGF0ZWRPbicgfCB0cmFuc2xhdGUgfX0ge3sgY29udGVudD8uc1lTX0lOVEVSTkFMX0xBU1RfVVBEQVRFRF9PTiB8IGRhdGU6ICdNTU0gZCwgeScgfX0pPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC02IGZpeGVkLXdpZHRoXCI+XG4gICAgPGRpdiBjbGFzcz1cInRvYy1jb250ZW50XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNICYmXG4gICAgICAgIHNlbGVjdGVkQmF0Y2hEYXRhPy5jb250ZW50WzBdPy5iYXRjaEF0dHJpYnV0ZXM/LmJhdGNoTG9jYXRpb25EZXRhaWxzICYmXG4gICAgICAgIHNlbGVjdGVkQmF0Y2hEYXRhPy5jb250ZW50WzBdPy5lbnJvbGxtZW50RW5kRGF0ZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tZGV0YWlscyBtdC02XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC00IHBiLTNcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImxvY2F0aW9uLWljb24gbm9kdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgICAgbG9jYXRpb25fb25cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jLWRlc2NcIj5cbiAgICAgICAgICAgICAge3tzZWxlY3RlZEJhdGNoRGF0YT8uY29udGVudFswXT8uYmF0Y2hBdHRyaWJ1dGVzPy5iYXRjaExvY2F0aW9uRGV0YWlsc319XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiZXZlbnQtaWNvbiBub2R0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICBldmVudDwvbWF0LWljb24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jLWRlc2NcIj5cbiAgICAgICAgICAgICAgTGFzdCBkYXRlIG9mIGVucm9sbG1lbnQgLSB7e3NlbGVjdGVkQmF0Y2hEYXRhPy5jb250ZW50WzBdPy5lbnJvbGxtZW50RW5kRGF0ZSB8IGRhdGU6ICdkZC9NTS95eXl5J319XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWNvbW1lbmRlZENvdXJzZXNJZCAmJiAhZmVlZGJhY2tHaXZlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHgtNCBweS0zIG10LTYgcmVsZXZlbnQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00IGl0ZW1zLWNlbnRlciBmbGV4LXdyYXAgZmxleCBqdXN0aWZ5LWNlbnRlciBtZDpqdXN0aWZ5LXN0YXJ0XCI+XG4gICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaW1hZ2VzL3Nha3NoYW1BSS9sYWR5LWdyZWV0LnN2Z1wiIGFsdD1cImdyZWV0XCIgd2lkdGg9XCI1Ni44OVwiIGhlaWdodD1cIjY0XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsZXZlbnQtaW5mb1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZGVyIHRleHQtc20gcmVsZXZlbnQtaGVhZGluZyBibG9jayBtYi0xXCI+e3sgJ2hvbWUudG9jUmVsZXZlbnRIZWFkaW5nJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWxldmVudC1zdWJpbmZvIGZvbnQtbm9ybWFsIHRleHQtc20gYmxvY2tcIj57eyAnaG9tZS50b2NSZWxldmVudFN1YkhlYWRpbmcnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LW1pZGRsZSByZWxldmFudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1taWRkbGUgcmVsZXZlbnQtbm9ybWFsIHJlbGV2ZW50LWJ0biBweS0yIHB4LTQgcmVsZXZhbnQtYm94XCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJpc1JlbGV2ZW50QnRuSG92ZXJlZCA9IHRydWVcIlxuICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImlzUmVsZXZlbnRCdG5Ib3ZlcmVkID0gZmFsc2VcIiAoY2xpY2spPVwiaGFuZGxlQWNjZXB0UmVsZXZlbnQoKVwiPlxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwiaXNSZWxldmVudEJ0bkhvdmVyZWQgJiYgIWlzUmVsZXZlbnQgPyBTQUtTSEFNQUlfSUNPTl9MT0FERVIgOiBTQUtTSEFNQUlfSUNPTl9OT1JNQUxcIlxuICAgICAgICAgICAgICAgICAgYWx0PVwibG9hZGVyXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgY2xhc3M9XCJtci0yXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXJlbGV2ZW50IGZmLWxhdG8gdGV4dC1zbSBmb250LWJvbGRcIj57eyAnaG9tZS5yZWxldmVudCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1taWRkbGUgbm8tYnV0dG9uIG1sLThcIiAoY2xpY2spPVwiaGFuZGxlRGVjbGluZVJlbGV2ZW50KClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbiB0ZXh0LW5vIG1yLTEgbm9kdHJhbnNsYXRlXCI+dGh1bWJfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW5vIGZmLWxhdG8gdGV4dC1zbSBmb250LWJvbGRcIj57eyAnaG9tZS5ubycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PiAgXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYi00IGxnOnB5LTRcIj5cbiAgICAgICAgPCEtLSBPdmVyYWxsIHByb2dyZXNzIGZ1bmN0aW9uYWxpdHkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtcHJvZ3Jlc3NcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInByb2dyZXNzRnVuY3Rpb25hbGl0eVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBPdmVyYWxsIHByb2dyZXNzIGZ1bmN0aW9uYWxpdHkgLS0+XG5cbiAgICAgICAgPHdzLXdpZGdldC1jb250ZW50LXRvYyBbY29udGVudF09XCJjb250ZW50XCIgW2NvbXBvbmVudE5hbWVdPVwiJ3RvYydcIiAgW3BhdGhTZXRdPVwicGF0aFNldFwiIFt0b2NTdHJ1Y3R1cmVdPVwidG9jU3RydWN0dXJlXCIgXG4gICAgICAgIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiAgW2lzRW5yb2xsZWRdPVwiYmF0Y2hEYXRhPy5lbnJvbGxlZFwiIFtyZXN1bWVEYXRhXT1cInJlc3VtZURhdGFcIiBbYmF0Y2hEYXRhXT1cInNlbGVjdGVkQmF0Y2hEYXRhXCIgW3NrZWxldG9uTG9hZGVyXT1cInNrZWxldG9uTG9hZGVyXCIgXG4gICAgICAgIFtjaGFuZ2VUYWJdPVwiY2hhbmdlVGFiXCIgW2hpZXJhcmNoeU1hcERhdGFdPVwidG9jU3ZjPy5oYXNobWFwXCIgW3NlbGVjdGVkQmF0Y2hEYXRhXT1cInNlbGVjdGVkQmF0Y2hEYXRhXCIgW2NvbmRpdGlvbl09XCJ7aXNQb3N0QXNzZXNzbWVudDogaXNQb3N0QXNzZXNzbWVudCwgY29udGVudDogY29udGVudCwgaXNBY2JwQ291cnNlOiBpc0FjYnBDb3Vyc2UsIGlzQ2xhaW1lZDogaXNDbGFpbWVkLCBtb250aGx5Q2FwRXhjZWVkOiBtb250aGx5Q2FwRXhjZWVkLCBpc0NvbXBsZXRlZFRoaXNNb250aDogaXNDb21wbGV0ZWRUaGlzTW9udGgsIHNob3dUYWtlQXNzZXNzbWVudDogc2hvd1Rha2VBc3Nlc3NtZW50LCB1c2VyRW5yb2xsbWVudExpc3Q6IHVzZXJFbnJvbGxtZW50TGlzdCwgcmVzdW1lRGF0YTogcmVzdW1lRGF0YSwgdXNlclJhdGluZzogdXNlclJhdGluZywgZW5yb2xsQnRuTG9hZGluZzogZW5yb2xsQnRuTG9hZGluZywgcHJpbWFyeUNhdGVnb3J5OiBwcmltYXJ5Q2F0ZWdvcnksIGN1cnJlbnRDb3Vyc2VCYXRjaElkOiBjdXJyZW50Q291cnNlQmF0Y2hJZCwgaXNBY2JwQ2xhaW06IGlzQWNicENsYWltfVwiIFtrcGFycmF5XT1cImtwYXJyYXlcIlxuICAgICAgICAocGxheVJlc3VtZUZvckFJKT1cInBsYXlSZXN1bWVGb3JBSSgpXCIgKGVucm9sbFVzZXJUb0FJKT1cImVucm9sbFVzZXJUb0FJKClcIiBbY29udGVudFJlYWREYXRhXT1cImNvbnRlbnRSZWFkRGF0YVwiPjwvd3Mtd2lkZ2V0LWNvbnRlbnQtdG9jPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9iLXRpcC1mb3ItbGVhcm5lclwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJsZWFybkFkdmlzb3J5RGF0YSAmJiBsZWFybkFkdmlzb3J5RGF0YT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXRpcHMtZm9yLWxlYXJuZXItY2FyZCBbbGVhcm5BZHZpc29yeURhdGFdPVwibGVhcm5BZHZpc29yeURhdGFcIj48L3dzLXdpZGdldC10aXBzLWZvci1sZWFybmVyLWNhcmQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIFxuXG4gICAgPGRpdiBjbGFzcz1cInJpZ2h0LWNvbnRhaW5lclwiID5cbiAgICAgIDwhLS0gaWYgbmVlZGVkIHN0aWNreSBvZiByaWdodCBjb250YWluZXIgYWRkIHRoaXMgdG8gYmVsb3cgZGl2ID0+ICNyaWdodENvbnRhaW5lciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1jb250ZW50LWlubmVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMzg0cHgnXCIgW2hlaWdodF09XCInMjI0cHgnXCJcbiAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGltYWdlLWRpdlwiIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgJ2JhY2tncm91bmQtaW1hZ2UnOiAndXJsKCcgKyBjb250ZW50Py5wb3N0ZXJJbWFnZSArICcpJywgJ2JhY2tncm91bmQtcmVwZWF0JzogJ25vLXJlcGVhdCcsICdiYWNrZ3JvdW5kLXNpemUnOiAnY292ZXInfVwiIFtuZ0NsYXNzXT1cInsnaW1hZ2UtYmFja2Ryb3AnOiBzY3JvbGxlZH1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiB0ZXh0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTQganVzdGlmeS1iZXR3ZWVuXCIgW25nQ2xhc3NdPVwieydqdXN0aWZ5LWJldHdlZW4nOiBzY3JvbGxlZCwgJ2p1c3RpZnktZW5kJzogIXNjcm9sbGVkfVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHRhZy1kaXYgcm91bmRlZC0yeGwgZ2FwLTEgaXRlbXMtY2VudGVyIHAtMlwiICpuZ0lmPVwic2Nyb2xsZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIndzLW1hdC1vcmFuZ2UtdGV4dCBub2R0cmFuc2xhdGVcIj52aWRlb19saWJyYXJ5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb3Vyc2VDYXRlZ29yeVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBmb250LWJvbGQgdGV4dC13aGl0ZSBsZWFkaW5nLTNcIj57eyB0cmFuc2xhdGVMYWJlbChjb250ZW50Py5jb3Vyc2VDYXRlZ29yeSwgJ3NlYXJjaGZpbHRlcnMnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGxlYWRpbmctM1wiPnt7IHRyYW5zbGF0ZUxhYmVsKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSwgJ3NlYXJjaGZpbHRlcnMnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25DbGlja09mU2hhcmUoKVwiIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmQgZ2FwLTIgc2hhcmUtdGFnXCIgKm5nSWY9XCJjYW5TaGFyZSAmJiAhZm9yUHJldmlld1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+c2hhcmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPGRpdj57eyAnYXBwdG9jc2luZ2xlcGFnZS5zaGFyZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xXCIgKm5nSWY9XCJzY3JvbGxlZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhsIGxlYWRpbmctNiB0ZXh0LXdoaXRlIGZvbnQtYm9sZFwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY29udGVudD8ubmFtZSkgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBzb3VyY2UtdGV4dCBmb250LXNlbWlib2xkIGJyZWFrLXdvcmRzXCIgI2NvbnRlbnRTb3VyY2UgW25nQ2xhc3NdPVwieydzb3VyY2VFbGxpcHNpcyc6IHNvdXJjZUVsbGlwc2lzfVwiIHRpdGxlPVwie3tjb250ZW50Py5zb3VyY2V9fVwiPnt7ICdjYXJkY29udGVudHYyLmJ5JyB8IHRyYW5zbGF0ZSB9fSB7eyBjb250ZW50Py5zb3VyY2UgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTQgcC01IGJvcmRlci1ib3R0b21cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiICpuZ0lmPVwiY29udGVudCAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0zIGp1c3RpZnktYXJvdW5kXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGRcIj57eyBzZWxlY3RlZEJhdGNoRGF0YT8uY29udGVudFswXT8uYmF0Y2hBdHRyaWJ1dGVzPy5jdXJyZW50QmF0Y2hTaXplIHx8ICcwJyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1sYWJlbFwiPnt7ICdhcHB0b2MuYmF0Y2hTaXplJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhdGNoLWluZm9cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1iYXNlIGZvbnQtYm9sZFwiPnt7IHNlbGVjdGVkQmF0Y2hEYXRhPy51c2VyQ291bnQ/LnRvdGFsQXBwbGllZCB8fCAnMCcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtbGFiZWxcIj57eyAnYXBwdG9jLnRvdGFsQXBwbGllZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGRcIj57eyBzZWxlY3RlZEJhdGNoRGF0YT8udXNlckNvdW50Py5lbnJvbGxlZCB8fCAnMCcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtbGFiZWxcIj57eyAnYXBwdG9jLnRvdGFsRW5yb2xsZWQnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGltZXIgJiYgdGltZXIuZGF5cyA+PSAwICYmIGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNiBiYXRjaC10aW1lclwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHVuZGVybGluZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmJhdGNoU3RhcnRzSW4nIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB1bmRlcmxpbmVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtNHhsIGxlYWRpbmctMTAgY291bnRlclwiPnt7IHRpbWVyLmRheXMgfHwgMCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmRheXMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvdW50ZXItbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIubWluID09PSA2MCA/IHRpbWVyLmhvdXJzICsgMSA6IHRpbWVyLmhvdXJzIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWxhYmVsXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuaG91cnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvdW50ZXItbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIubWluID09PSA2MCA/IDAwIDogdGltZXIubWluIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWxhYmVsXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UubWludXRlcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWU7IGVsc2UgYXV0aFZpZXdCdG5cIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb2JpbGUxMjAwICYmIHByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgPHdzLWFwcC10b2MtYmFubmVyIHJvbGU9XCJiYW5uZXJcIiBbYmFubmVyc109XCJiYW5uZXJzXCIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIFtjb250ZW50XT1cImNvbnRlbnRcIlxuICAgICAgICAgICAgICAgIFt1c2VyRW5yb2xsbWVudExpc3RdPVwidXNlckVucm9sbG1lbnRMaXN0XCIgKHdpdGhkcmF3T3JFbnJvbGwpPVwid2l0aGRyYXdPckVucm9sbCgkZXZlbnQpXCIgW2FuYWx5dGljc109XCJhbmFseXRpY3NcIlxuICAgICAgICAgICAgICAgIFtyZXN1bWVEYXRhXT1cInJlc3VtZURhdGFcIiBbYmF0Y2hEYXRhXT1cImJhdGNoRGF0YVwiIFtjb250ZW50UmVhZERhdGFdPVwiY29udGVudFJlYWREYXRhXCI+XG4gICAgICAgICAgICAgICAgPC93cy1hcHAtdG9jLWJhbm5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIiczMzZweCdcIiBbaGVpZ2h0XT1cIic0MHB4J1wiXG4gICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIiczMzZweCdcIiBbaGVpZ2h0XT1cIic2OHB4J1wiXG4gICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGdhcC0yIGluZm8tZGl2XCIgKm5nSWY9XCJjb250ZW50Py5pc0luSW50cmFuZXQgJiYgc2hvd0ludHJhbmV0TXNnXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciA+e3sgJ2FwcHRvY2hvbWUudmlld2VkSW5JbnRyYW5ldCcgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtMiBpbmZvLWRpdlwiICpuZ0lmPVwic2hvd0luc3RydWN0b3JMZWRNc2dcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5pbmZvPC9tYXQtaWNvbj4mbmJzcDtcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyID57eyAnYXBwdG9jaG9tZS5ub3RBdmFpbGFibGVPbmxpbmUnIHwgdHJhbnNsYXRlIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIgZ2FwLTIgaW5mby1kaXZcIiAqbmdJZj1cInNob3dTdGFydC5tc2cgPT09ICd5b3V0dWJlRm9yYmlkZGVuJ1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPmluZm88L21hdC1pY29uPiZuYnNwO1xuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgPnt7ICdhcHB0b2Nob21lLnlvdXR1YmVDb250ZW50QmxvY2tlZCcgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93QnRuXCI+XG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cInt7IGNzY21zVXJsIH19XCIgdGFyZ2V0PVwiX2JsYW5rXCIgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmFwcGx5Rm9yUGh5c2ljYWxUcmFpbmluZycgfCB0cmFuc2xhdGUgfX08L2E+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY29tcGxldGlvblN0YXR1cyA8PSAyICYmIGlzQmF0Y2hJblByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJwcm9ncmVzc0Z1bmN0aW9uYWxpdHlcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuXG4gICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInJlc3VtZURhdGEgJiYgIXVzZXJSYXRpbmdcIj4gLS0+XG4gICAgICAgICAgICAgICAgPCEtLSA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidSYXRlIHRoaXMgY291cnNlJ1wiIFtkYXRhXT1cImtwYXJyYXlcIlxuICAgICAgICAgICAgICAgICAgW3BDYXRlZ29yeV09XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD4gLS0+XG4gICAgICAgICAgICAgIDwhLS0gPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInJlc3VtZURhdGEgJiYgdXNlclJhdGluZ1wiPlxuICAgICAgICAgICAgICAgIDx3cy1hcHAta2FybWFwb2ludHMtcGFuZWwgW2J0bnR5cGVdPVwiJ0VkaXQgcmF0aW5nJ1wiIFtkYXRhXT1cImtwYXJyYXlcIlxuICAgICAgICAgICAgICAgICAgW3BDYXRlZ29yeV09XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3Rpb25CdG5TdGF0dXMgIT09ICd3YWl0JyAmJiBjb250ZW50Py5zdGF0dXMgIT09ICdEZWxldGVkJyAmJiBjb250ZW50Py5zdGF0dXMgIT09ICdFeHBpcmVkJ1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZW5yb2xsRnVuY3Rpb25hbGl0eVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2FybWEtcG9pbnRzLWRpdlwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWthcm1hLXBvaW50cyBbZGF0YV09XCJrcGFycmF5XCIgKGNsaWNrQ2xhaW1LYXJtYVBvaW50cyk9XCJvbkNsaWNrT2ZDbGFpbSgkZXZlbnQpXCIgW2NvbnRlbnRdID0gXCJjb250ZW50XCJcbiAgICAgICAgICAgICAgICBbY29uZGl0aW9uXT1cIntpc1Bvc3RBc3Nlc3NtZW50OiBpc1Bvc3RBc3Nlc3NtZW50LCBjb250ZW50OiBjb250ZW50LCBpc0FjYnBDb3Vyc2U6IGlzQWNicENvdXJzZSwgaXNDbGFpbWVkOiBpc0NsYWltZWQsIG1vbnRobHlDYXBFeGNlZWQ6IG1vbnRobHlDYXBFeGNlZWQsIGlzQ29tcGxldGVkVGhpc01vbnRoOiBpc0NvbXBsZXRlZFRoaXNNb250aCwgc2hvd1Rha2VBc3Nlc3NtZW50OiBzaG93VGFrZUFzc2Vzc21lbnQsIHVzZXJFbnJvbGxtZW50TGlzdDogdXNlckVucm9sbG1lbnRMaXN0LCBpc0NvbXBsZXRlZFRoaXNNb250aDogaXNDb21wbGV0ZWRUaGlzTW9udGgsIHJlc3VtZURhdGE6IHJlc3VtZURhdGEsIHVzZXJSYXRpbmc6IHVzZXJSYXRpbmcsIGVucm9sbEJ0bkxvYWRpbmc6IGVucm9sbEJ0bkxvYWRpbmcsIHByaW1hcnlDYXRlZ29yeTogcHJpbWFyeUNhdGVnb3J5LCBjdXJyZW50Q291cnNlQmF0Y2hJZDogY3VycmVudENvdXJzZUJhdGNoSWQsIGlzQWNicENsYWltOiBpc0FjYnBDbGFpbX1cIj48L3dzLXdpZGdldC1rYXJtYS1wb2ludHM+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC02XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMiBrcGktbG9hZGVyLWRpdlwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzQ4cHgnXCIgW2hlaWdodF09XCInOHB4J1wiIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0yIGtwaS1sb2FkZXItZGl2XCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicyOHB4J1wiIFtoZWlnaHRdPVwiJzI4cHgnXCJcbiAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNDhweCdcIiBbaGVpZ2h0XT1cIic4cHgnXCIgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzI4cHgnXCIgW2hlaWdodF09XCInMjhweCdcIlxuICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIiBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMiBrcGktbG9hZGVyLWRpdlwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzQ4cHgnXCIgW2hlaWdodF09XCInOHB4J1wiIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0yIGtwaS1sb2FkZXItZGl2XCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicyOHB4J1wiIFtoZWlnaHRdPVwiJzI4cHgnXCJcbiAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNDBweCdcIiBbaGVpZ2h0XT1cIic4cHgnXCIgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIiBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtdG9jLWtwaS12YWx1ZXMgW2NvbnRlbnRdPVwiY29udGVudFwiIFt0b2NTdHJ1Y3R1cmVdPVwidG9jU3RydWN0dXJlXCIgW3Nob3dJbnN0cnVjdG9yTGVkTXNnXT1cInNob3dJbnN0cnVjdG9yTGVkTXNnXCIgW2NvbnRlbnRSZWFkRGF0YV09XCJjb250ZW50UmVhZERhdGFcIj48L3dzLXdpZGdldC10b2Mta3BpLXZhbHVlcz5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTggcC01XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiICpuZ0Zvcj1cImxldCBpIG9mIFsxLCAyXVwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzcycHgnXCIgW2hlaWdodF09XCInMjBweCdcIiBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzM2cHgnXCIgW2hlaWdodF09XCInMzZweCdcIiBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkLWZ1bGwnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyNHB4J1wiIFtoZWlnaHRdPVwiJzIwcHgnXCIgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyNHB4J1wiIFtoZWlnaHRdPVwiJzEycHgnXCIgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiICpuZ0lmPVwiaGFuZGxlUGFyc2VKc29uRGF0YShjb250ZW50UmVhZERhdGE/LmNyZWF0b3JEZXRhaWxzKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1ib2xkXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuYXV0aG9ycycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQgaXRlbXMtY2VudGVyXCIgKm5nRm9yPVwibGV0IGF1dGhvciBvZiBoYW5kbGVQYXJzZUpzb25EYXRhKGNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckRldGFpbHMpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBbcmFuZG9tQ29sb3JdPVwidHJ1ZVwiIFtkYXRhbGVuXT1cIjFcIiBbc2l6ZV09XCIncm91bmQtbSdcIiBbcGhvdG9VcmxdPVwiYXV0aG9yPy5waG90byB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImF1dGhvcj8ubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtYXZhdGFyLXBob3RvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShhdXRob3I/Lm5hbWUsICduYW1lJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGxlYWRpbmctM1wiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmF1dGhvcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTNcIiAqbmdJZj1cImhhbmRsZVBhcnNlSnNvbkRhdGEoY29udGVudD8uY3JlYXRvckNvbnRhY3RzKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1ib2xkXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY3VyYXRvcnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00XCIgKm5nRm9yPVwibGV0IGNyZWF0b3Igb2YgaGFuZGxlUGFyc2VKc29uRGF0YShjb250ZW50Py5jcmVhdG9yQ29udGFjdHMpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBbcmFuZG9tQ29sb3JdPVwidHJ1ZVwiIFtkYXRhbGVuXT1cIjFcIiBbc2l6ZV09XCIncm91bmQtbSdcIiBbcGhvdG9VcmxdPVwiYXV0aG9yPy5waG90byB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImNyZWF0b3I/Lm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWF2YXRhci1waG90bz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZFwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY3JlYXRvcj8ubmFtZSwgJ25hbWUnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbGVhZGluZy0zXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY3VyYXRvcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiICpuZ0lmPVwiY29udGVudD8uc291cmNlICAmJiAoY29udGVudENyZWF0b3JEYXRhICYmIGNvbnRlbnRDcmVhdG9yRGF0YT8ubGVuZ3RoKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1iYXNlIGZvbnQtYm9sZFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLnByb3ZpZGVyJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNCBpdGVtcy1jZW50ZXJcIiAqbmdGb3I9XCJsZXQgY3JlYXRvciBvZiBjb250ZW50Q3JlYXRvckRhdGFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBwcm92aWRlci1sb2dvLWRpdlwiPlxuICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImNvbnRlbnQ/LmNyZWF0b3JMb2dvXCIgW3NyY109XCJjb250ZW50Py5jcmVhdG9yTG9nb1wiIGFsdD1cInt7ICdhcHB0b2NzaW5nbGVwYWdlLnByb3ZpZGVyJyB8IHRyYW5zbGF0ZSB9fVwiIC8+XG4gICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiIWNvbnRlbnQ/LmNyZWF0b3JMb2dvXCIgY2xhc3M9XCJtYXQtaWNvblwiIHNyYz1cIi9hc3NldHMvaW5zdGFuY2VzL2VhZ2xlL2FwcF9sb2dvcy9LYXJtYXlvZ2lCaGFyYXRfTG9nby5zdmdcIiBhbHQ9XCJ7eyAnYXBwdG9jc2luZ2xlcGFnZS5wcm92aWRlcicgfCB0cmFuc2xhdGUgfX1cIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHdvcmQtYnJlYWsgY3Vyc29yLXBvaW50ZXJcIiAqbmdJZj1cImNvbnRlbnQ/LmNyZWF0ZWRGb3I/Lmxlbmd0aFwiIChjbGljayk9XCJyYWlzZVRlbGVtZXRlcnlGb3JQcm92aWRlcihjb250ZW50Py5zb3VyY2UsIGNvbnRlbnQ/LmNyZWF0ZWRGb3JbMF0pXCJcbiAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnL2FwcC9sZWFybi9icm93c2UtYnkvcHJvdmlkZXInLCBjb250ZW50Py5zb3VyY2UsIGNvbnRlbnQ/LmNyZWF0ZWRGb3JbMF0sICdtaWNyby1zaXRlcyddXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShjb250ZW50Py5zb3VyY2UsICdzb3VyY2UnKSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHdvcmQtYnJlYWtcIiAqbmdJZj1cIiFjb250ZW50Py5jcmVhdGVkRm9yPy5sZW5ndGhcIj57eyBoYW5kbGVDYXBpdGFsaXplKGNvbnRlbnQ/LnNvdXJjZSwgJ3NvdXJjZScpIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwibGVhcm5BZHZpc29yeURhdGEgJiYgbGVhcm5BZHZpc29yeURhdGE/Lmxlbmd0aFwiPlxuICAgICAgPHdzLXdpZGdldC10aXBzLWZvci1sZWFybmVyLWNhcmQgW2xlYXJuQWR2aXNvcnlEYXRhXT1cImxlYXJuQWR2aXNvcnlEYXRhXCI+PC93cy13aWRnZXQtdGlwcy1mb3ItbGVhcm5lci1jYXJkPlxuICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgIFxuXG4gIDwvZGl2PlxuPC9kaXY+XG5cbiAgPCEtLSBNb2JpbGUgZW5yb2xsbWVudCBidXR0b24gY29udGFpbmVyIC0tPlxuICA8ZGl2IGNsYXNzPVwibW9iaWxlLWVucm9sbC1kaXZcIiBbbmdDbGFzc109XCJ7J2JnLXdoaXRlJzogY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNIH1cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudCAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItMlwiICpuZ0lmPVwibW9iaWxlMTIwMCAmJiAhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3QnRuXCI+XG4gICAgICAgIDx3cy1hcHAtdG9jLWJhbm5lciByb2xlPVwiYmFubmVyXCIgW2Jhbm5lcnNdPVwiYmFubmVyc1wiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAgICAgICBbdXNlckVucm9sbG1lbnRMaXN0XT1cInVzZXJFbnJvbGxtZW50TGlzdFwiICh3aXRoZHJhd09yRW5yb2xsKT1cIndpdGhkcmF3T3JFbnJvbGwoJGV2ZW50KVwiIFthbmFseXRpY3NdPVwiYW5hbHl0aWNzXCJcbiAgICAgICAgICBbcmVzdW1lRGF0YV09XCJyZXN1bWVEYXRhXCIgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIiBbY29udGVudFJlYWREYXRhXT1cImNvbnRlbnRSZWFkRGF0YVwiPlxuICAgICAgICA8L3dzLWFwcC10b2MtYmFubmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBSZXVzZSBlbnJvbGxtZW50IGZ1bmN0aW9uYWxpdHkgdGVtcGxhdGUgZm9yIG1vYmlsZSAtLT5cbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImVucm9sbEZ1bmN0aW9uYWxpdHlcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPHdzLWFwcC1zaGFyZS10b2MgKm5nSWY9XCJlbmFibGVTaGFyZVwiIFtyb290T3JnSWRdPVwicm9vdE9yZ0lkXCIgW2NvbnRlbnRdPVwiY29udGVudFwiIChyZXNldEVuYWJsZVNoYXJlKT1cInJlc2V0RW5hYmxlU2hhcmUoJGV2ZW50KVwiPjwvd3MtYXBwLXNoYXJlLXRvYz5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIFRlbXBsYXRlIGZvciB3aGVuIG5vIGRhdGEgaXMgZm91bmQgLS0+XG48bmctdGVtcGxhdGUgI25vRGF0YUZvdW5kPlxuICA8ZGl2IGNsYXNzPVwiZXJyb3Itbm90LWZvdW5kIGZsZXggZmxleC13cmFwcGVkIG1hcmdpbi1sZWZ0LW0gbWFyZ2luLXRvcC14bCBtYXJnaW4tcmlnaHQtbSBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZXJyb3ItbG9nb1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImVycm9yLW1lc3NhZ2Ugd3MtbWF0LXByaW1hcnktdGV4dCBmb250LXdlaWdodC1ib2xkXCIgPlxuICAgICAgICBUaGUgcGFnZSB5b3UgcmVxdWVzdGVkIGNhbm5vdCBiZSBmb3VuZFxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBBdXRoZW50aWNhdGlvbiB2aWV3IHRlbXBsYXRlcyAtLT5cbjxuZy10ZW1wbGF0ZSAjYXV0aFZpZXc+e3snYXBwdG9jaG9tZS52aWV3JyB8IHRyYW5zbGF0ZX19PC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNhdXRoVmlld0J0biBpMThuPlxuICA8YSAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoKVwiIFtyb3V0ZXJMaW5rXT1cIihyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyByZXN1bWVEYXRhTGluaz8udXJsIDogZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiIFtxdWVyeVBhcmFtc109XCIocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXCJcbiAgICBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlclwiPlxuICAgIHt7J2FwcHRvY2hvbWUudmlldycgfCB0cmFuc2xhdGV9fVxuICA8L2E+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2F1dGhWaWV3Rm9ySW52aXRlT25seUFzc2Vzc21lbnQ+XG4gIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJmb3JQcmV2aWV3ICYmIGNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5ID09PSAnSW52aXRlLU9ubHkgQXNzZXNzbWVudCdcIj4gICAgICAgIFxuICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVwiPiAgICAgICAgICBcbiAgICAgICAgICA8bmctY29udGFpbmVyPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0JyB8IHRyYW5zbGF0ZSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=