@sunbird-cb/toc 0.0.7 → 0.0.9

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 (331) hide show
  1. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.component.mjs +55 -55
  2. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.module.mjs +126 -126
  3. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.component.mjs +32 -32
  4. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.module.mjs +85 -85
  5. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.component.mjs +100 -100
  6. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.module.mjs +48 -48
  7. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +120 -120
  8. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +92 -92
  9. package/esm2022/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.mjs +48 -48
  10. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.component.mjs +25 -25
  11. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.module.mjs +41 -41
  12. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover-card.component.mjs +89 -89
  13. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.module.mjs +42 -42
  14. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.servive.mjs +41 -41
  15. package/esm2022/lib/_collection/_common/connection-name/connection-name.component.mjs +78 -78
  16. package/esm2022/lib/_collection/_common/connection-name/connection-name.module.mjs +45 -45
  17. package/esm2022/lib/_collection/_common/connection-name/profile-v2.model.mjs +2 -2
  18. package/esm2022/lib/_collection/_common/content-progress/content-progress.component.mjs +70 -70
  19. package/esm2022/lib/_collection/_common/content-progress/content-progress.module.mjs +28 -28
  20. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.mjs +187 -187
  21. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.mjs +86 -86
  22. package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +31 -31
  23. package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +941 -941
  24. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.mjs +183 -183
  25. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.mjs +327 -327
  26. package/esm2022/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.mjs +297 -297
  27. package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +248 -225
  28. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +1148 -1030
  29. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.mjs +16 -16
  30. package/esm2022/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.mjs +43 -43
  31. package/esm2022/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.mjs +133 -133
  32. package/esm2022/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.mjs +66 -66
  33. package/esm2022/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.mjs +278 -278
  34. package/esm2022/lib/_collection/_common/content-toc/content-services/handle-claim.service.mjs +21 -21
  35. package/esm2022/lib/_collection/_common/content-toc/content-services/review-component-data.service.mjs +21 -21
  36. package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +847 -847
  37. package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +219 -219
  38. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +209 -209
  39. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.module.mjs +26 -26
  40. package/esm2022/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.mjs +19 -19
  41. package/esm2022/lib/_collection/_common/content-toc/pipes/truncate.pipe.mjs +23 -23
  42. package/esm2022/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.mjs +113 -113
  43. package/esm2022/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.mjs +110 -110
  44. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.component.mjs +26 -26
  45. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.module.mjs +19 -19
  46. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.mjs +67 -67
  47. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.mjs +28 -28
  48. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.component.mjs +77 -77
  49. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.model.mjs +2 -2
  50. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.module.mjs +61 -61
  51. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.module.mjs +20 -20
  52. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +67 -67
  53. package/esm2022/lib/_collection/_common/player-brief/player-brief.component.mjs +139 -139
  54. package/esm2022/lib/_collection/_common/player-brief/player-brief.module.mjs +71 -71
  55. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.component.mjs +34 -34
  56. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.module.mjs +56 -56
  57. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.component.mjs +25 -25
  58. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.module.mjs +37 -37
  59. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.mjs +32 -32
  60. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner.module.mjs +30 -30
  61. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +38 -38
  62. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.mjs +51 -51
  63. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.component.mjs +115 -115
  64. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.model.mjs +12 -12
  65. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.module.mjs +51 -51
  66. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.service.mjs +61 -61
  67. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.component.mjs +87 -87
  68. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.module.mjs +36 -36
  69. package/esm2022/lib/_collection/_common/user-image/user-image.component.mjs +62 -62
  70. package/esm2022/lib/_collection/_common/user-image/user-image.module.mjs +24 -24
  71. package/esm2022/lib/_collection/btn-page-back/btn-page-back.component.mjs +192 -192
  72. package/esm2022/lib/_collection/btn-page-back/btn-page-back.module.mjs +44 -44
  73. package/esm2022/lib/_collection/btn-page-back/btn-page-back.service.mjs +99 -99
  74. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.component.mjs +58 -58
  75. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.module.mjs +67 -67
  76. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.component.mjs +112 -112
  77. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.model.mjs +2 -2
  78. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.module.mjs +69 -69
  79. package/esm2022/lib/_collection-api.mjs +57 -57
  80. package/esm2022/lib/_constants/widget-content.constants.mjs +19 -19
  81. package/esm2022/lib/_directives/tooltip.directive.mjs +68 -68
  82. package/esm2022/lib/_models/common.model.mjs +2 -2
  83. package/esm2022/lib/_models/error.model.mjs +2 -2
  84. package/esm2022/lib/_pipes/highlight.pipe.mjs +24 -24
  85. package/esm2022/lib/_services/rating.service.mjs +89 -89
  86. package/esm2022/lib/_services/samuhik-charcha.service.mjs +29 -29
  87. package/esm2022/lib/_services/viewer-route-util.mjs +103 -103
  88. package/esm2022/lib/_services/widget-content.model.mjs +247 -247
  89. package/esm2022/lib/_services/widget-content.service.mjs +594 -594
  90. package/esm2022/lib/_shared/translate-loader.factory.mjs +9 -9
  91. package/esm2022/lib/app-toc-lib.module.mjs +499 -499
  92. package/esm2022/lib/collection.config.mjs +161 -161
  93. package/esm2022/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.mjs +37 -37
  94. package/esm2022/lib/components/app-toc-banner/app-toc-banner.component.mjs +1436 -1436
  95. package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +475 -475
  96. package/esm2022/lib/components/app-toc-cios-home/consent-dialog.component.mjs +119 -119
  97. package/esm2022/lib/components/app-toc-cohorts/app-toc-cohorts.component.mjs +80 -80
  98. package/esm2022/lib/components/app-toc-content-card/app-toc-content-card.component.mjs +249 -249
  99. package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +39 -39
  100. package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +58 -58
  101. package/esm2022/lib/components/app-toc-home/app-toc-home.component.mjs +2229 -2229
  102. package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +2907 -2905
  103. package/esm2022/lib/components/app-toc-overview/app-toc-overview.component.mjs +157 -157
  104. package/esm2022/lib/components/app-toc-session-card/app-toc-session-card.component.mjs +48 -48
  105. package/esm2022/lib/components/app-toc-sessions/app-toc-sessions.component.mjs +47 -47
  106. package/esm2022/lib/components/app-toc-single-page/app-toc-single-page.component.mjs +766 -766
  107. package/esm2022/lib/components/completion-survey-form/completion-survey-form.component.mjs +243 -243
  108. package/esm2022/lib/components/create-batch-dialog/create-batch-dialog.component.mjs +116 -116
  109. package/esm2022/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.mjs +44 -44
  110. package/esm2022/lib/components/enroll-profile-form/enroll-profile-form.component.mjs +1838 -1838
  111. package/esm2022/lib/components/enroll-questionnaire/enroll-questionnaire.component.mjs +236 -236
  112. package/esm2022/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.mjs +213 -213
  113. package/esm2022/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.mjs +36 -36
  114. package/esm2022/lib/components/public-survey-form/public-survey-form.component.mjs +256 -256
  115. package/esm2022/lib/components/survey-form-question/survey-form-question.component.mjs +133 -133
  116. package/esm2022/lib/components/survey-form-section/survey-form-section.component.mjs +36 -36
  117. package/esm2022/lib/models/app-toc-analytics.model.mjs +2 -2
  118. package/esm2022/lib/models/app-toc.model.mjs +38 -38
  119. package/esm2022/lib/models/auto-complete.model.mjs +2 -2
  120. package/esm2022/lib/models/card-content.model.mjs +13 -13
  121. package/esm2022/lib/models/content-strip-with-tabs.model.mjs +2 -2
  122. package/esm2022/lib/models/discussion-forum.model.mjs +14 -14
  123. package/esm2022/lib/models/goal.model.mjs +2 -2
  124. package/esm2022/lib/models/meta-tag.model.mjs +8 -8
  125. package/esm2022/lib/models/playlist.model.mjs +2 -2
  126. package/esm2022/lib/models/profile-revamp.model.mjs +2 -2
  127. package/esm2022/lib/models/rating.model.mjs +2 -2
  128. package/esm2022/lib/models/user-profile.model.mjs +21 -21
  129. package/esm2022/lib/resolvers/app-toc-cios-resolver.service.mjs +24 -24
  130. package/esm2022/lib/resolvers/app-toc-cios-user-enroll-resolver.service.mjs +24 -24
  131. package/esm2022/lib/resolvers/app-toc-content-read-resolver.service.mjs +60 -60
  132. package/esm2022/lib/resolvers/app-toc-ext-public-resolver.service.mjs +25 -25
  133. package/esm2022/lib/resolvers/app-toc-resolver.service.mjs +106 -106
  134. package/esm2022/lib/resolvers/config-resolver.service.mjs +25 -25
  135. package/esm2022/lib/resolvers/profile-resolver.service.mjs +25 -25
  136. package/esm2022/lib/resolvers/restricted-features-resolver.service.mjs +25 -25
  137. package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +51 -51
  138. package/esm2022/lib/routes/app-toc-home/app-toc-home.directive.mjs +16 -16
  139. package/esm2022/lib/routes/app-toc-home/app-toc-home.service.mjs +18 -18
  140. package/esm2022/lib/services/access-control.service.mjs +56 -56
  141. package/esm2022/lib/services/action.service.mjs +23 -23
  142. package/esm2022/lib/services/app-toc-v2.service.mjs +313 -243
  143. package/esm2022/lib/services/app-toc.service.mjs +1613 -1387
  144. package/esm2022/lib/services/certificate.service.mjs +69 -69
  145. package/esm2022/lib/services/discuss-utils.service.mjs +58 -58
  146. package/esm2022/lib/services/editor.service.mjs +34 -34
  147. package/esm2022/lib/services/load-check.service.mjs +21 -21
  148. package/esm2022/lib/services/loader.service.mjs +33 -33
  149. package/esm2022/lib/services/mobile-apps.service.mjs +67 -67
  150. package/esm2022/lib/services/netcore.service.mjs +56 -56
  151. package/esm2022/lib/services/nps-grid.service.mjs +31 -31
  152. package/esm2022/lib/services/otp.service.mjs +43 -43
  153. package/esm2022/lib/services/profile-v2.service.mjs +43 -43
  154. package/esm2022/lib/services/reset-ratings.service.mjs +19 -19
  155. package/esm2022/lib/services/resource-download-helper.service.mjs +64 -64
  156. package/esm2022/lib/services/timer.service.mjs +23 -23
  157. package/esm2022/lib/services/title-tag.service.mjs +71 -71
  158. package/esm2022/lib/services/user-profile.service.mjs +55 -55
  159. package/esm2022/lib/services/viewer-data.service.mjs +64 -64
  160. package/esm2022/lib/services/viewer-util.service.mjs +590 -500
  161. package/esm2022/lib/share-toc/share-toc/share-toc.component.mjs +291 -291
  162. package/esm2022/lib/share-toc/share-toc.module.mjs +119 -119
  163. package/esm2022/public-api.mjs +71 -70
  164. package/esm2022/sunbird-cb-toc.mjs +4 -4
  165. package/fesm2022/sunbird-cb-toc.mjs +24777 -24250
  166. package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
  167. package/index.d.ts +5 -5
  168. package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +16 -16
  169. package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +31 -31
  170. package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +15 -15
  171. package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +20 -20
  172. package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +22 -22
  173. package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +15 -15
  174. package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +22 -22
  175. package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +22 -22
  176. package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +9 -9
  177. package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +11 -11
  178. package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +12 -12
  179. package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +18 -18
  180. package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +14 -14
  181. package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +11 -11
  182. package/lib/_collection/_common/connection-name/connection-name.component.d.ts +17 -17
  183. package/lib/_collection/_common/connection-name/connection-name.module.d.ts +14 -14
  184. package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +199 -199
  185. package/lib/_collection/_common/content-progress/content-progress.component.d.ts +16 -16
  186. package/lib/_collection/_common/content-progress/content-progress.module.d.ts +10 -10
  187. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +38 -38
  188. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +19 -19
  189. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +11 -11
  190. package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +183 -183
  191. package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +41 -41
  192. package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +54 -54
  193. package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +47 -47
  194. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +49 -48
  195. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +171 -154
  196. package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +8 -8
  197. package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +16 -16
  198. package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +40 -40
  199. package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +21 -21
  200. package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +45 -45
  201. package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +10 -10
  202. package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +10 -10
  203. package/lib/_collection/_common/content-toc/content-toc.component.d.ts +128 -128
  204. package/lib/_collection/_common/content-toc/content-toc.module.d.ts +51 -51
  205. package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +29 -29
  206. package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +9 -9
  207. package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +7 -7
  208. package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +7 -7
  209. package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +28 -28
  210. package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +24 -24
  211. package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +14 -14
  212. package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +9 -9
  213. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +12 -12
  214. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +10 -10
  215. package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +22 -22
  216. package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +8 -8
  217. package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +18 -18
  218. package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +8 -8
  219. package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +15 -15
  220. package/lib/_collection/_common/player-brief/player-brief.component.d.ts +35 -35
  221. package/lib/_collection/_common/player-brief/player-brief.module.d.ts +19 -19
  222. package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +14 -14
  223. package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +13 -13
  224. package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +11 -11
  225. package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +11 -11
  226. package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +15 -15
  227. package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +10 -10
  228. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +16 -16
  229. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +11 -11
  230. package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +34 -34
  231. package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +17 -17
  232. package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +15 -15
  233. package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +15 -15
  234. package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +21 -21
  235. package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +12 -12
  236. package/lib/_collection/_common/user-image/user-image.component.d.ts +21 -21
  237. package/lib/_collection/_common/user-image/user-image.module.d.ts +9 -9
  238. package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +47 -47
  239. package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +14 -14
  240. package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +22 -22
  241. package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +19 -19
  242. package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +15 -15
  243. package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +25 -25
  244. package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +21 -21
  245. package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +18 -18
  246. package/lib/_collection-api.d.ts +34 -34
  247. package/lib/_constants/widget-content.constants.d.ts +7 -7
  248. package/lib/_directives/tooltip.directive.d.ts +17 -17
  249. package/lib/_models/common.model.d.ts +3 -3
  250. package/lib/_models/error.model.d.ts +5 -5
  251. package/lib/_pipes/highlight.pipe.d.ts +10 -10
  252. package/lib/_services/rating.service.d.ts +18 -18
  253. package/lib/_services/samuhik-charcha.service.d.ts +13 -13
  254. package/lib/_services/viewer-route-util.d.ts +8 -8
  255. package/lib/_services/widget-content.model.d.ts +515 -515
  256. package/lib/_services/widget-content.service.d.ts +101 -101
  257. package/lib/_shared/translate-loader.factory.d.ts +7 -7
  258. package/lib/app-toc-lib.module.d.ts +88 -88
  259. package/lib/collection.config.d.ts +159 -159
  260. package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +17 -17
  261. package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +225 -225
  262. package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +78 -78
  263. package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +22 -22
  264. package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +31 -31
  265. package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +47 -47
  266. package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +14 -14
  267. package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +21 -21
  268. package/lib/components/app-toc-home/app-toc-home.component.d.ts +314 -314
  269. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +408 -408
  270. package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +47 -47
  271. package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +22 -22
  272. package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +14 -14
  273. package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +149 -149
  274. package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +42 -42
  275. package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +27 -27
  276. package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +15 -15
  277. package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +195 -195
  278. package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +44 -44
  279. package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +54 -54
  280. package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +18 -18
  281. package/lib/components/public-survey-form/public-survey-form.component.d.ts +43 -43
  282. package/lib/components/survey-form-question/survey-form-question.component.d.ts +20 -20
  283. package/lib/components/survey-form-section/survey-form-section.component.d.ts +13 -13
  284. package/lib/models/app-toc-analytics.model.d.ts +152 -152
  285. package/lib/models/app-toc.model.d.ts +84 -84
  286. package/lib/models/auto-complete.model.d.ts +27 -27
  287. package/lib/models/card-content.model.d.ts +19 -19
  288. package/lib/models/content-strip-with-tabs.model.d.ts +44 -44
  289. package/lib/models/discussion-forum.model.d.ts +40 -40
  290. package/lib/models/goal.model.d.ts +22 -22
  291. package/lib/models/meta-tag.model.d.ts +6 -6
  292. package/lib/models/playlist.model.d.ts +23 -23
  293. package/lib/models/profile-revamp.model.d.ts +14 -14
  294. package/lib/models/rating.model.d.ts +17 -17
  295. package/lib/models/user-profile.model.d.ts +37 -37
  296. package/lib/resolvers/app-toc-cios-resolver.service.d.ts +12 -12
  297. package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +12 -12
  298. package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +16 -16
  299. package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +12 -12
  300. package/lib/resolvers/app-toc-resolver.service.d.ts +16 -16
  301. package/lib/resolvers/config-resolver.service.d.ts +11 -11
  302. package/lib/resolvers/profile-resolver.service.d.ts +11 -11
  303. package/lib/resolvers/restricted-features-resolver.service.d.ts +11 -11
  304. package/lib/routes/app-toc-home/app-toc-home.component.d.ts +19 -19
  305. package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +8 -8
  306. package/lib/routes/app-toc-home/app-toc-home.service.d.ts +8 -8
  307. package/lib/services/access-control.service.d.ts +29 -29
  308. package/lib/services/action.service.d.ts +9 -9
  309. package/lib/services/app-toc-v2.service.d.ts +16 -14
  310. package/lib/services/app-toc.service.d.ts +235 -177
  311. package/lib/services/certificate.service.d.ts +42 -42
  312. package/lib/services/discuss-utils.service.d.ts +33 -33
  313. package/lib/services/editor.service.d.ts +17 -17
  314. package/lib/services/load-check.service.d.ts +8 -8
  315. package/lib/services/loader.service.d.ts +16 -16
  316. package/lib/services/mobile-apps.service.d.ts +38 -38
  317. package/lib/services/netcore.service.d.ts +33 -33
  318. package/lib/services/nps-grid.service.d.ts +15 -15
  319. package/lib/services/otp.service.d.ts +20 -20
  320. package/lib/services/profile-v2.service.d.ts +20 -20
  321. package/lib/services/reset-ratings.service.d.ts +8 -8
  322. package/lib/services/resource-download-helper.service.d.ts +29 -29
  323. package/lib/services/timer.service.d.ts +9 -9
  324. package/lib/services/title-tag.service.d.ts +21 -21
  325. package/lib/services/user-profile.service.d.ts +24 -24
  326. package/lib/services/viewer-data.service.d.ts +58 -58
  327. package/lib/services/viewer-util.service.d.ts +76 -62
  328. package/lib/share-toc/share-toc/share-toc.component.d.ts +56 -56
  329. package/lib/share-toc/share-toc.module.d.ts +32 -32
  330. package/package.json +1 -1
  331. package/public-api.d.ts +56 -55
@@ -1,1436 +1,1436 @@
1
- import { Component, EventEmitter, Inject, Input, Output, ViewChild } from '@angular/core';
2
- import { NavigationEnd } from '@angular/router';
3
- import { NsContent } from '../../_services/widget-content.model';
4
- import { viewerRouteGenerator } from '../../_services/viewer-route-util';
5
- import { WsEvents } from '@sunbird-cb/utils-v2';
6
- import { ConfirmDialogComponent } from '../../_collection/_common/confirm-dialog/confirm-dialog.component';
7
- import { AccessControlService } from '../../services/access-control.service';
8
- import { AppTocDialogIntroVideoComponent } from '../app-toc-dialog-intro-video/app-toc-dialog-intro-video.component';
9
- import { UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms';
10
- import dayjs from 'dayjs';
11
- import * as lodash from 'lodash';
12
- // tslint:disable-next-line
13
- import _ from 'lodash';
14
- import { DatePipe } from '@angular/common';
15
- import isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
16
- import isSameOrAfter from 'dayjs/plugin/isSameOrAfter';
17
- import { EnrollQuestionnaireComponent } from '../enroll-questionnaire/enroll-questionnaire.component';
18
- import { ENTER } from '@angular/cdk/keycodes';
19
- import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
20
- import { EnrollProfileFormComponent } from '../enroll-profile-form/enroll-profile-form.component';
21
- import * as i0 from "@angular/core";
22
- import * as i1 from "@angular/platform-browser";
23
- import * as i2 from "@angular/router";
24
- import * as i3 from "@angular/material/legacy-dialog";
25
- import * as i4 from "../../services/app-toc.service";
26
- import * as i5 from "../../_services/widget-content.service";
27
- import * as i6 from "@sunbird-cb/utils-v2";
28
- import * as i7 from "../../services/mobile-apps.service";
29
- import * as i8 from "@angular/material/legacy-snack-bar";
30
- import * as i9 from "../../services/title-tag.service";
31
- import * as i10 from "../../services/action.service";
32
- import * as i11 from "@angular/common";
33
- import * as i12 from "@ngx-translate/core";
34
- import * as i13 from "../../_collection/_common/user-autocomplete/user-autocomplete.service";
35
- import * as i14 from "../../services/timer.service";
36
- import * as i15 from "@angular/forms";
37
- import * as i16 from "@angular/material/icon";
38
- import * as i17 from "@angular/material/legacy-button";
39
- import * as i18 from "@angular/material/legacy-form-field";
40
- import * as i19 from "@angular/material/legacy-menu";
41
- import * as i20 from "@angular/material/legacy-chips";
42
- import * as i21 from "@angular/material/legacy-progress-spinner";
43
- import * as i22 from "@angular/material/legacy-select";
44
- import * as i23 from "@angular/material/legacy-core";
45
- import * as i24 from "@angular/material/legacy-autocomplete";
46
- dayjs.extend(isSameOrBefore);
47
- dayjs.extend(isSameOrAfter);
48
- export class AppTocBannerComponent {
49
- constructor(sanitizer, router, route, dialog, tocSvc, contentSvc, utilitySvc, mobileAppsSvc, snackBar, configSvc, tagSvc, actionSVC, logger, datePipe, translate, userAutoComplete, events, langtranslations, timerService, environment) {
50
- this.sanitizer = sanitizer;
51
- this.router = router;
52
- this.route = route;
53
- this.dialog = dialog;
54
- this.tocSvc = tocSvc;
55
- this.contentSvc = contentSvc;
56
- this.utilitySvc = utilitySvc;
57
- this.mobileAppsSvc = mobileAppsSvc;
58
- this.snackBar = snackBar;
59
- this.configSvc = configSvc;
60
- this.tagSvc = tagSvc;
61
- this.actionSVC = actionSVC;
62
- this.logger = logger;
63
- this.datePipe = datePipe;
64
- this.translate = translate;
65
- this.userAutoComplete = userAutoComplete;
66
- this.events = events;
67
- this.langtranslations = langtranslations;
68
- this.timerService = timerService;
69
- this.environment = environment;
70
- this.show = false;
71
- this.banners = null;
72
- this.content = null;
73
- this.resumeData = null;
74
- this.analytics = null;
75
- this.forPreview = false;
76
- this.batchData = null;
77
- this.userEnrollmentList = null;
78
- this.withdrawOrEnroll = new EventEmitter();
79
- this.contentReadData = null;
80
- this.clickToShare = false;
81
- this.programEnrollCall = new EventEmitter();
82
- this.nsContent = NsContent;
83
- this.batchControl = new UntypedFormControl('', Validators.required);
84
- this.primaryCategory = NsContent.EPrimaryCategory;
85
- this.WFBlendedProgramStatus = NsContent.WFBlendedProgramStatus;
86
- this.WFSTATUS_MSG_MAPPING = NsContent.WFSTATUS_MSG_MAPPING;
87
- this.contentProgress = 0;
88
- this.bannerUrl = null;
89
- this.routePath = 'overview';
90
- this.validPaths = new Set(['overview', 'contents', 'analytics']);
91
- this.routerParamSubscription = null;
92
- this.routeSubscription = null;
93
- this.batchWFDataSubscription = null;
94
- this.firstResourceLink = null;
95
- this.resumeDataLink = null;
96
- this.isAssessVisible = false;
97
- this.isPracticeVisible = false;
98
- this.editButton = false;
99
- this.reviewButton = false;
100
- this.analyticsDataClient = null;
101
- this.btnPlaylistConfig = null;
102
- this.btnGoalsConfig = null;
103
- this.isRegistrationSupported = false;
104
- this.showRejected = false;
105
- this.checkRegistrationSources = new Set([
106
- 'SkillSoft Digitalization',
107
- 'SkillSoft Leadership',
108
- 'Pluralsight',
109
- ]);
110
- this.isUserRegistered = false;
111
- this.actionBtnStatus = 'wait';
112
- this.showIntranetMessage = false;
113
- this.showTakeAssessment = null;
114
- this.externalContentFetchStatus = 'done';
115
- this.registerForExternal = false;
116
- this.isGoalsEnabled = false;
117
- this.tocConfig = null;
118
- this.defaultSLogo = '';
119
- this.disableEnrollBtn = false;
120
- this.helpEmail = '';
121
- this.difference = 0;
122
- this.serverDate = new Date();
123
- this.canShare = false;
124
- this.enableShare = false;
125
- this.selectable = true;
126
- this.removable = true;
127
- this.addOnBlur = true;
128
- this.separatorKeysCodes = [ENTER];
129
- this.userCtrl = new UntypedFormControl('');
130
- this.users = [];
131
- this.allUsers = [];
132
- this.doptEligibleServicesList = [];
133
- this.maxEmailsLimit = 30;
134
- this.showLoader = false;
135
- this.langtranslations.languageSelectedObservable.subscribe(() => {
136
- if (localStorage.getItem('websiteLanguage')) {
137
- this.translate.setDefaultLang('en');
138
- const lang = localStorage.getItem('websiteLanguage');
139
- this.translate.use(lang);
140
- }
141
- });
142
- this.helpEmail = this.environment.helpEmail;
143
- this.shareForm = new UntypedFormGroup({
144
- review: new UntypedFormControl(null, [Validators.minLength(1), Validators.maxLength(2000)]),
145
- });
146
- this.userCtrl.valueChanges.pipe(debounceTime(200), distinctUntilChanged()).subscribe((res) => {
147
- if (res) {
148
- this.filteredUsers = [];
149
- // this.allUsers = []
150
- this.getUsersToShare(res);
151
- }
152
- });
153
- }
154
- ngOnInit() {
155
- // this.serverDate = new Date().getTime()
156
- this.serverDateSubscription = this.tocSvc.serverDate.subscribe(serverDate => {
157
- this.serverDate = serverDate;
158
- this.clearAndCallTimer();
159
- });
160
- this.route.data.subscribe(data => {
161
- this.tocConfig = data.pageData.data;
162
- if (this.content && this.isPostAssessment) {
163
- this.tocSvc.fetchPostAssessmentStatus(this.content.identifier).subscribe(res => {
164
- const assessmentData = res.result;
165
- for (const o of assessmentData) {
166
- if (o.contentId === (this.content && this.content.identifier)) {
167
- this.showTakeAssessment = o;
168
- break;
169
- }
170
- }
171
- });
172
- }
173
- if (this.content && this.content.identifier) {
174
- // this.tocSvc.fetchGetContentData(this.content.identifier).subscribe(res => {
175
- // this.contentReadData = res.result.content
176
- // })
177
- }
178
- });
179
- const instanceConfig = this.configSvc.instanceConfig;
180
- if (instanceConfig && instanceConfig.logos && instanceConfig.logos.defaultSourceLogo) {
181
- this.defaultSLogo = instanceConfig.logos.defaultSourceLogo;
182
- }
183
- if (this.configSvc.restrictedFeatures) {
184
- this.isGoalsEnabled = !this.configSvc.restrictedFeatures.has('goals');
185
- }
186
- this.routeSubscription = this.route.queryParamMap.subscribe(qParamsMap => {
187
- const contextId = qParamsMap.get('contextId');
188
- const contextPath = qParamsMap.get('contextPath');
189
- if (contextId && contextPath) {
190
- this.contextId = contextId;
191
- this.contextPath = contextPath;
192
- }
193
- });
194
- this.batchWFDataSubscription = this.tocSvc.setWFDataSubject.subscribe(() => {
195
- this.setBatchControl();
196
- }, () => {
197
- // tslint:disable-next-line: no-console
198
- console.log('error on batchWFDataSubscription');
199
- });
200
- if (this.configSvc.restrictedFeatures) {
201
- this.isRegistrationSupported = this.configSvc.restrictedFeatures.has('registrationExternal');
202
- this.showIntranetMessage = !this.configSvc.restrictedFeatures.has('showIntranetMessageDesktop');
203
- }
204
- this.selectedBatchSubscription = this.tocSvc.getSelectedBatch.subscribe(batchData => {
205
- this.selectedBatchData = batchData;
206
- });
207
- this.checkRegistrationStatus();
208
- this.routerParamSubscription = this.router.events.subscribe((routerEvent) => {
209
- if (routerEvent instanceof NavigationEnd) {
210
- this.assignPathAndUpdateBanner(routerEvent.url);
211
- }
212
- });
213
- if (this.configSvc.restrictedFeatures) {
214
- this.isGoalsEnabled = !this.configSvc.restrictedFeatures.has('goals');
215
- }
216
- if (this.content) {
217
- this.btnPlaylistConfig = {
218
- contentId: this.content.identifier,
219
- contentName: this.content.name,
220
- contentType: this.content.contentType,
221
- primaryCategory: this.content.primaryCategory,
222
- mode: 'dialog',
223
- };
224
- this.btnGoalsConfig = {
225
- contentId: this.content.identifier,
226
- contentName: this.content.name,
227
- contentType: this.content.contentType,
228
- primaryCategory: this.content.primaryCategory,
229
- };
230
- }
231
- if (this.content && ![
232
- NsContent.ECourseCategory.MODERATED_COURSE,
233
- NsContent.ECourseCategory.MODERATED_ASSESSEMENT,
234
- NsContent.ECourseCategory.MODERATED_PROGRAM,
235
- NsContent.ECourseCategory.INVITE_ONLY_PROGRAM,
236
- ].includes(this.content.courseCategory)) {
237
- this.canShare = true;
238
- if (this.configSvc.userProfile) {
239
- this.rootOrgId = this.configSvc.userProfile.rootOrgId;
240
- this.userProfile = this.configSvc.userProfile;
241
- this.userProfileObject = this.configSvc.unMappedUser;
242
- // this.getUsersToShare('')
243
- }
244
- }
245
- }
246
- getUsersToShare(queryStr) {
247
- this.showLoader = true;
248
- this.userAutoComplete.searchUser(queryStr, this.rootOrgId).subscribe(data => {
249
- if (data.result && data.result.response) {
250
- this.apiResponse = data.result.response.content;
251
- let name = '';
252
- let pEmail = '';
253
- this.apiResponse.forEach((apiData) => {
254
- apiData.firstName.split(' ').forEach((d) => {
255
- name = name + d.substr(0, 1).toUpperCase();
256
- });
257
- if (apiData.profileDetails && apiData.profileDetails.personalDetails) {
258
- pEmail = apiData.profileDetails.personalDetails.primaryEmail;
259
- if (!this.allUsers.filter(user => user.email.toLowerCase().includes(pEmail.toLowerCase())).length) {
260
- this.allUsers.push({
261
- maskedEmail: apiData.maskedEmail,
262
- id: apiData.identifier,
263
- name: apiData.firstName,
264
- iconText: name,
265
- email: pEmail,
266
- });
267
- }
268
- }
269
- });
270
- this.showLoader = false;
271
- }
272
- if (this.allUsers.length === 0) {
273
- this.filteredUsers = [];
274
- }
275
- this.filteredUsers = this.filterSharedUsers(queryStr);
276
- });
277
- }
278
- get showIntranetMsg() {
279
- if (this.isMobile) {
280
- return true;
281
- }
282
- return this.showIntranetMessage;
283
- }
284
- get getBatchDuration() {
285
- const startDate = dayjs(dayjs(this.batchControl.value.startDate).format('YYYY-MM-DD'));
286
- const endDate = dayjs(dayjs(this.batchControl.value.endDate).format('YYYY-MM-DD'));
287
- // adding 1 to include the start date
288
- return (endDate.diff(startDate, 'days') + 1);
289
- }
290
- get showStart() {
291
- return this.tocSvc.showStartButton(this.content);
292
- }
293
- get isPostAssessment() {
294
- if (!(this.tocConfig && this.tocConfig.postAssessment)) {
295
- return false;
296
- }
297
- if (this.content) {
298
- return (this.content.primaryCategory === NsContent.EPrimaryCategory.COURSE &&
299
- this.content.learningMode === 'Instructor-Led');
300
- }
301
- return false;
302
- }
303
- get isMobile() {
304
- return this.utilitySvc.isMobile;
305
- }
306
- get showSubtitleOnBanner() {
307
- return this.tocSvc.subtitleOnBanners;
308
- }
309
- getDoptEligibleServicesList() {
310
- if (this.selectedBatch && this.selectedBatch.batchAttributes
311
- && this.selectedBatch.batchAttributes.cadreList
312
- && this.selectedBatch.batchAttributes.cadreList.length > 0) {
313
- this.doptEligibleServicesList = this.selectedBatch.batchAttributes.cadreList;
314
- }
315
- else {
316
- this.doptEligibleServicesList = [];
317
- }
318
- }
319
- ngOnChanges(_changes) {
320
- this.assignPathAndUpdateBanner(this.router.url);
321
- if (this.content) {
322
- this.fetchExternalContentAccess();
323
- this.modifySensibleContentRating();
324
- this.assignPathAndUpdateBanner(this.router.url);
325
- this.getLearningUrls();
326
- this.setBatchControl();
327
- }
328
- if (this.resumeData && this.resumeData.length > 0 && this.content) {
329
- let resumeDataV2;
330
- if (this.content.completionPercentage === 100) {
331
- resumeDataV2 = this.getResumeDataFromList('start');
332
- }
333
- else {
334
- resumeDataV2 = this.getResumeDataFromList();
335
- }
336
- if (!resumeDataV2.mimeType) {
337
- resumeDataV2.mimeType = this.getMimeType(this.content, resumeDataV2.identifier);
338
- }
339
- 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);
340
- this.actionSVC.setUpdateCompGroupO = this.resumeDataLink;
341
- }
342
- this.batchControlUnsubscribe = this.batchControl.valueChanges.subscribe((batch) => {
343
- this.selectedBatch = batch;
344
- if (batch) {
345
- if (this.checkRejected(batch)) {
346
- this.showRejected = true;
347
- return;
348
- }
349
- }
350
- this.showRejected = false;
351
- return;
352
- });
353
- }
354
- requestToWithdrawDialog() {
355
- const confirmDialog = this.dialog.open(ConfirmDialogComponent, {
356
- width: '434px',
357
- data: {
358
- title: 'Are you sure you want to withdraw your request?',
359
- message: 'You will miss the learning opportunity if you withdraw your enrolment.',
360
- acceptButton: 'Withdraw',
361
- cancelButton: 'Cancel',
362
- },
363
- disableClose: true,
364
- panelClass: ['animate__animated', 'animate__slideInLeft'],
365
- });
366
- confirmDialog.afterClosed().subscribe(result => {
367
- if (result) {
368
- // tslint:disable-next-line:max-line-length
369
- this.requestAndWithDrawEnroll(this.batchData.workFlow.wfItem.currentStatus, this.WFBlendedProgramStatus.WITHDRAW, this.batchData.workFlow.wfItem.wfId);
370
- }
371
- });
372
- }
373
- openConformationDialog(message) {
374
- this.dialog.open(ConfirmDialogComponent, {
375
- width: '600px',
376
- data: {
377
- message: message,
378
- acceptButton: 'Ok',
379
- disableClose: true
380
- }
381
- });
382
- }
383
- openRequestToEnroll(batchData) {
384
- const confirmDialog = this.dialog.open(ConfirmDialogComponent, {
385
- width: '434px',
386
- data: {
387
- title: 'You’re one step away from enrolling!',
388
- // tslint:disable-next-line:max-line-length
389
- message: `This batch is active from ${this.datePipe.transform(batchData.startDate, 'dd-MM-yyyy')} - ${this.datePipe.transform(batchData.endDate, 'dd-MM-yyyy')}, kindly go through the content and be prepared.`,
390
- acceptButton: 'Confirm',
391
- cancelButton: 'Cancel',
392
- },
393
- disableClose: true,
394
- panelClass: ['animate__animated', 'animate__slideInLeft'],
395
- });
396
- confirmDialog.afterClosed().subscribe(result => {
397
- if (result) {
398
- this.requestAndWithDrawEnroll('INITIATE', 'INITIATE');
399
- }
400
- });
401
- }
402
- callBPSurevy(batchData) {
403
- if (this.content) {
404
- const sID = this.content.wfSurveyLink.split('surveys/');
405
- const surveyId = sID[1];
406
- const courseId = this.content.identifier;
407
- const courseName = this.content.name;
408
- const wfClientVersion = _.get(this.content, 'wfClientVersion', '0');
409
- const apiData = {
410
- // tslint:disable-next-line:prefer-template
411
- getAPI: '/apis/proxies/v8/forms/getFormById?id=' + surveyId,
412
- // tslint:disable-next-line:prefer-template
413
- postAPI: '/apis/proxies/v8/forms/v1/saveFormSubmit',
414
- getAllApplications: '/apis/proxies/v8/forms/getAllApplications',
415
- customizedHeader: {},
416
- };
417
- const enrollQuestionnaire = this.dialog.open(EnrollQuestionnaireComponent, {
418
- width: '920px',
419
- maxHeight: '85vh',
420
- data: {
421
- surveyId,
422
- courseId,
423
- courseName,
424
- apiData,
425
- batchData,
426
- wfClientVersion
427
- },
428
- disableClose: false,
429
- panelClass: ['animate__animated', 'animate__slideInLeft'],
430
- });
431
- enrollQuestionnaire.afterClosed().subscribe(result => {
432
- if (result) {
433
- this.openRequestToEnroll(batchData);
434
- }
435
- });
436
- }
437
- }
438
- callBPProfileSurevy(batchData) {
439
- if (this.content) {
440
- const doptorgID = this.environment.doptOrg;
441
- const isDoptContent = _.get(this.content, 'createdFor', []).includes(doptorgID);
442
- // const isDptUser = _.get(this.userProfileObject, 'rootOrgId') === doptorgID
443
- this.getDoptEligibleServicesList();
444
- const userProfileObject = this.configSvc?.unMappedUser || {};
445
- const civilServiceName = _.get(userProfileObject, 'profileDetails.cadreDetails.civilServiceName', '');
446
- if (this.doptEligibleServicesList && this.doptEligibleServicesList.length > 0) {
447
- if (!civilServiceName) {
448
- this.openConformationDialog(`This program has eligibility criteria. Please update your service details in your profile before requesting to enroll.`);
449
- return;
450
- }
451
- else if (!this.doptEligibleServicesList.includes(civilServiceName)) {
452
- this.openConformationDialog(`You are not eligible for the ${this.content.name} with the current service in your profile. If your service details are incorrect, please update your profile and apply.`);
453
- return;
454
- }
455
- }
456
- const courseName = this.content.name;
457
- // const showDoptChanges = (isDoptContent && isDptUser) ? true : false
458
- const profileForm = this.dialog.open(EnrollProfileFormComponent, {
459
- width: '920px',
460
- maxHeight: '85vh',
461
- data: {
462
- courseName,
463
- batchData,
464
- showDoptChanges: isDoptContent,
465
- },
466
- disableClose: false,
467
- panelClass: ['animate__animated', 'animate__slideInLeft'],
468
- });
469
- profileForm.afterClosed().subscribe(result => {
470
- if (result) {
471
- if (this.content && this.content.wfSurveyLink) {
472
- this.callBPSurevy(batchData);
473
- }
474
- else {
475
- this.openRequestToEnroll(batchData);
476
- }
477
- }
478
- });
479
- }
480
- }
481
- requestToEnrollDialog() {
482
- const batchData = this.batchControl.value;
483
- if (this.content && this.content.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM) {
484
- // conflicts check start
485
- const userList = this.userEnrollmentList && this.userEnrollmentList.filter(ele => {
486
- if (ele.content.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM) {
487
- if (!(dayjs(batchData.startDate).isBefore(dayjs(ele.batch.startDate)) &&
488
- dayjs(batchData.endDate).isBefore(dayjs(ele.batch.startDate)) ||
489
- dayjs(batchData.startDate).isAfter(dayjs(ele.batch.endDate)) &&
490
- dayjs(batchData.endDate).isAfter(dayjs(ele.batch.endDate)))) {
491
- return true;
492
- }
493
- return false;
494
- }
495
- return false;
496
- });
497
- // conflicts check end
498
- if (userList && userList.length === 0) {
499
- if (this.content && batchData.batchAttributes && batchData.batchAttributes.userProfileFileds) {
500
- this.callBPProfileSurevy(batchData);
501
- }
502
- else if (this.content && this.content.wfSurveyLink) {
503
- this.callBPSurevy(batchData);
504
- }
505
- else {
506
- this.openRequestToEnroll(batchData);
507
- }
508
- }
509
- else {
510
- if (userList && userList.length > 0) {
511
- this.openSnackbar(`You cannot enroll in this blended program because it conflicts with your existing blended program.`);
512
- }
513
- }
514
- }
515
- else {
516
- this.programEnrollCall.emit(batchData);
517
- }
518
- }
519
- requestAndWithDrawEnroll(state, action, wfIdValue) {
520
- let userId = '';
521
- let rootOrgId = '';
522
- let username = '';
523
- let departmentName = '';
524
- if (this.configSvc.userProfile) {
525
- userId = this.configSvc.userProfile.userId || '';
526
- rootOrgId = this.configSvc.userProfile.rootOrgId || '';
527
- username = this.configSvc.userProfile.firstName || '';
528
- departmentName = this.configSvc.userProfile.departmentName || '';
529
- }
530
- const req = {
531
- rootOrgId,
532
- userId,
533
- state,
534
- action,
535
- actorUserId: userId,
536
- applicationId: this.selectedBatch.batchId,
537
- serviceName: 'blendedprogram',
538
- courseId: this.selectedBatch.courseId,
539
- deptName: departmentName,
540
- ...(wfIdValue ? { wfId: wfIdValue } : null),
541
- updateFieldValues: [
542
- {
543
- toValue: {
544
- name: username,
545
- },
546
- },
547
- ],
548
- };
549
- this.contentSvc.enrollAndUnenrollUserToBatchWF(req, action).then((data) => {
550
- if (data && data.result && data.result.status === 'OK') {
551
- this.batchData.workFlow = {
552
- wfInitiated: true,
553
- batch: this.selectedBatch,
554
- wfItem: { currentStatus: data.result.data.status },
555
- };
556
- this.withdrawOrEnroll.emit(action);
557
- this.getBatchUserCount(this.selectedBatch);
558
- this.openSnackbar(`Request ${action === this.WFBlendedProgramStatus.WITHDRAW ? 'withdrawn' : 'sent'} Successfully!`);
559
- this.disableEnrollBtn = false;
560
- }
561
- else {
562
- this.openSnackbar('Something went wrong, please try again later!');
563
- this.disableEnrollBtn = false;
564
- }
565
- }, (error) => {
566
- this.openSnackbar(_.get(error, 'error.params.errmsg') ||
567
- _.get(error, 'error.result.errmsg') ||
568
- 'Something went wrong, please try again later!');
569
- });
570
- }
571
- getMimeType(content, identifier) {
572
- if (content.identifier === identifier) {
573
- return content.mimeType;
574
- }
575
- if (content && content.children) {
576
- if (content.children.length === 0) {
577
- // big blunder in data
578
- this.logger.log(content.identifier, 'Wrong mime types for resume');
579
- return content.mimeType;
580
- }
581
- const flatList = [];
582
- const getAllItemsPerChildren = (item) => {
583
- flatList.push(item);
584
- if (item.children) {
585
- return item.children.map((i) => getAllItemsPerChildren(i));
586
- }
587
- return;
588
- };
589
- getAllItemsPerChildren(this.content);
590
- const chld = _.first(_.filter(flatList, { identifier }));
591
- return chld.mimeType;
592
- }
593
- // return chld.mimeType
594
- return NsContent.EMimeTypes.UNKNOWN;
595
- }
596
- getBatchId() {
597
- let batchId = '';
598
- if (this.batchData && this.batchData.content) {
599
- for (const batch of this.batchData.content) {
600
- batchId = batch.batchId;
601
- }
602
- }
603
- return batchId;
604
- }
605
- handleEnrollmentEndDate(batch) {
606
- const enrollmentEndDate = dayjs(lodash.get(batch, 'enrollmentEndDate')).format('YYYY-MM-DD');
607
- const systemDate = dayjs(this.serverDate).format('YYYY-MM-DD');
608
- return (enrollmentEndDate && enrollmentEndDate !== 'Invalid Date') ?
609
- (dayjs(enrollmentEndDate).isSame(systemDate, 'day') || dayjs(enrollmentEndDate).isAfter(systemDate)) : false;
610
- }
611
- checkRejected(batch) {
612
- if (batch &&
613
- this.batchData &&
614
- this.batchData.workFlow &&
615
- this.batchData.workFlow.wfItem) {
616
- // tslint:disable-next-line:max-line-length
617
- if (batch.batchId === this.batchData.workFlow.wfItem.applicationId && (this.batchData.workFlow.wfItem.currentStatus === this.WFBlendedProgramStatus.REJECTED || this.batchData.workFlow.wfItem.currentStatus === this.WFBlendedProgramStatus.REMOVED)) {
618
- return true;
619
- }
620
- return false;
621
- }
622
- return false;
623
- }
624
- checkWithdrawn(batch) {
625
- if (batch &&
626
- this.batchData &&
627
- this.batchData.workFlow &&
628
- this.batchData.workFlow.wfItem) {
629
- // tslint:disable-next-line:max-line-length
630
- if (this.selectedBatch.batchId === this.batchData.workFlow.wfItem.applicationId && (this.batchData.workFlow.wfItem.currentStatus === this.WFBlendedProgramStatus.WITHDRAWN || this.batchData.workFlow.wfItem.currentStatus === this.WFBlendedProgramStatus.WITHDRAWN)) {
631
- return true;
632
- }
633
- return false;
634
- }
635
- return false;
636
- }
637
- batchChange(event) {
638
- this.clearAndCallTimer();
639
- if (event && event.value) {
640
- const batchData = {
641
- content: [event.value],
642
- };
643
- this.getBatchUserCount(event.value);
644
- if (this.selectedBatchData && this.selectedBatchData.content) {
645
- this.selectedBatchData = {
646
- ...this.selectedBatchData,
647
- ...batchData,
648
- };
649
- }
650
- else {
651
- this.selectedBatchData = {
652
- ...batchData,
653
- };
654
- }
655
- if (this.checkRejected(event.value)) {
656
- this.showRejected = true;
657
- this.setbatchDateToCountDown(event.value.startDate);
658
- this.tocSvc.getSelectedBatchData(this.selectedBatchData);
659
- return;
660
- }
661
- this.setbatchDateToCountDown(event.value.startDate);
662
- this.tocSvc.getSelectedBatchData(this.selectedBatchData);
663
- }
664
- this.showRejected = false;
665
- this.checkBatchStartDate();
666
- return;
667
- }
668
- checkBatchStartDate() {
669
- const batchStartDate = this.selectedBatchData && this.selectedBatchData.content
670
- && this.selectedBatchData.content[0] && this.selectedBatchData.content[0].startDate;
671
- const workFlow = this.batchData && this.batchData.workFlow && this.batchData.workFlow.wfItem
672
- && this.batchData.workFlow.wfItem.currentStatus;
673
- const now = dayjs(this.serverDate).format('YYYY-MM-DD');
674
- const dateExtended = dayjs(now).isSameOrAfter(dayjs(batchStartDate));
675
- if (dateExtended && (workFlow && (workFlow !== this.WFBlendedProgramStatus.APPROVED)
676
- && workFlow !== this.WFBlendedProgramStatus.WITHDRAWN)) {
677
- const confirmDialog = this.dialog.open(ConfirmDialogComponent, {
678
- width: '434px',
679
- data: {
680
- title: 'Request not approved',
681
- message: 'Don\'t worry; withdraw this and request another batch.',
682
- acceptButton: 'Withdraw',
683
- cancelButton: 'Cancel',
684
- },
685
- disableClose: true,
686
- panelClass: ['animate__animated', 'animate__slideInLeft'],
687
- });
688
- confirmDialog.afterClosed().subscribe(result => {
689
- if (result) {
690
- // tslint:disable-next-line:max-line-length
691
- this.requestAndWithDrawEnroll(this.batchData.workFlow.wfItem.currentStatus, this.WFBlendedProgramStatus.WITHDRAW, this.batchData.workFlow.wfItem.wfId);
692
- }
693
- });
694
- }
695
- }
696
- setBatchControl() {
697
- // on first load select first value in the batch list if its having valid enrollment Date
698
- if (this.content && (this.content.primaryCategory === this.primaryCategory.BLENDED_PROGRAM ||
699
- this.content.primaryCategory === this.primaryCategory.PROGRAM)) {
700
- if (this.batchData && this.batchData.content.length) {
701
- if (!this.batchData.workFlow || (this.batchData.workFlow && !this.batchData.workFlow.wfInitiated)) {
702
- const batch = this.batchData.content.find((el) => {
703
- if (this.handleEnrollmentEndDate(el)) {
704
- return el;
705
- }
706
- });
707
- if (batch) {
708
- this.batchControl.setValue(batch);
709
- this.setbatchDateToCountDown(batch.startDate);
710
- }
711
- this.getBatchUserCount(this.batchControl.value);
712
- const batchData = {
713
- content: [this.batchControl.value],
714
- };
715
- if (this.selectedBatchData && this.selectedBatchData.content) {
716
- this.selectedBatchData = {
717
- ...this.selectedBatchData,
718
- ...batchData,
719
- };
720
- }
721
- else {
722
- this.selectedBatchData = {
723
- ...batchData,
724
- };
725
- }
726
- this.tocSvc.getSelectedBatchData(this.selectedBatchData);
727
- }
728
- else {
729
- const batch = this.batchData.content.find((el) => {
730
- if (el.batchId === this.batchData.workFlow.wfItem.applicationId) {
731
- return el;
732
- }
733
- });
734
- this.selectedBatch = batch;
735
- this.batchControl.patchValue(batch);
736
- this.batchChange({ value: batch });
737
- }
738
- }
739
- }
740
- }
741
- clearAndCallTimer() {
742
- if (this.timerIntervalClear) {
743
- clearInterval(this.timerIntervalClear);
744
- }
745
- this.callTimer();
746
- }
747
- // setting batch start date
748
- setbatchDateToCountDown(batchStartDate) {
749
- this.targetDate = new Date(batchStartDate);
750
- const convertedDate = dayjs(batchStartDate).format('YYYY-MM-DD HH:mm:ss');
751
- this.targetTime = new Date(convertedDate).getTime();
752
- }
753
- openSnackbar(primaryMsg, duration = 5000) {
754
- this.snackBar.open(primaryMsg, 'X', {
755
- duration,
756
- });
757
- }
758
- get disableWithdrawnBtn() {
759
- if (this.batchData &&
760
- this.batchData.workFlow &&
761
- this.batchData.workFlow.wfItem) {
762
- const status = this.batchData.workFlow.wfItem.currentStatus;
763
- if (NsContent.WFBlendedProgramApprovalTypes.TWO_STEP_MDO_PC === this.batchData.workFlow.wfItem.serviceName &&
764
- status === this.WFBlendedProgramStatus.SEND_FOR_PC_APPROVAL) {
765
- return true;
766
- }
767
- if (NsContent.WFBlendedProgramApprovalTypes.TWO_STEP_PC_MDO === this.batchData.workFlow.wfItem.serviceName &&
768
- status === this.WFBlendedProgramStatus.SEND_FOR_MDO_APPROVAL) {
769
- return true;
770
- }
771
- }
772
- return false;
773
- }
774
- get showInstructorLedMsg() {
775
- return (this.showActionButtons &&
776
- this.content &&
777
- this.content.learningMode === 'Instructor-Led' &&
778
- !this.content.children.length &&
779
- !this.content.artifactUrl);
780
- }
781
- get getWFMsg() {
782
- if (this.batchData &&
783
- this.batchData.workFlow &&
784
- this.batchData.workFlow.wfItem) {
785
- const status = this.batchData.workFlow.wfItem.currentStatus;
786
- const msg = this.WFSTATUS_MSG_MAPPING[status];
787
- return this.tocConfig[msg];
788
- }
789
- }
790
- get showIcon() {
791
- if (this.batchData &&
792
- this.batchData.workFlow &&
793
- this.batchData.workFlow.wfItem) {
794
- const status = this.batchData.workFlow.wfItem.currentStatus;
795
- if (status === this.WFBlendedProgramStatus.APPROVED ||
796
- status === this.WFBlendedProgramStatus.SEND_FOR_MDO_APPROVAL ||
797
- status === this.WFBlendedProgramStatus.SEND_FOR_PC_APPROVAL ||
798
- status === this.WFBlendedProgramStatus.WITHDRAWN ||
799
- status === this.WFBlendedProgramStatus.REJECTED ||
800
- status === this.WFBlendedProgramStatus.REMOVED) {
801
- return true;
802
- }
803
- }
804
- return false;
805
- }
806
- get showMsg() {
807
- if (this.batchData &&
808
- this.batchData.workFlow &&
809
- this.batchData.workFlow.wfItem) {
810
- const status = this.batchData.workFlow.wfItem.currentStatus;
811
- if (status === this.WFBlendedProgramStatus.APPROVED ||
812
- status === this.WFBlendedProgramStatus.SEND_FOR_MDO_APPROVAL ||
813
- status === this.WFBlendedProgramStatus.SEND_FOR_PC_APPROVAL ||
814
- (status === this.WFBlendedProgramStatus.WITHDRAWN && this.checkWithdrawn(this.batchData)) ||
815
- (status === this.WFBlendedProgramStatus.REMOVED && this.showRejected) ||
816
- (status === this.WFBlendedProgramStatus.REJECTED && this.showRejected)) {
817
- return true;
818
- }
819
- }
820
- return false;
821
- }
822
- get WFIcon() {
823
- if (this.batchData &&
824
- this.batchData.workFlow &&
825
- this.batchData.workFlow.wfItem) {
826
- const status = this.batchData.workFlow.wfItem.currentStatus;
827
- if (status === this.WFBlendedProgramStatus.APPROVED ||
828
- status === this.WFBlendedProgramStatus.SEND_FOR_MDO_APPROVAL ||
829
- status === this.WFBlendedProgramStatus.SEND_FOR_PC_APPROVAL ||
830
- status === this.WFBlendedProgramStatus.WITHDRAWN) {
831
- return 'circle';
832
- }
833
- if (status === this.WFBlendedProgramStatus.REJECTED ||
834
- status === this.WFBlendedProgramStatus.REMOVED) {
835
- return 'info';
836
- }
837
- }
838
- return '';
839
- }
840
- get iconColor() {
841
- if (this.batchData &&
842
- this.batchData.workFlow &&
843
- this.batchData.workFlow.wfItem) {
844
- const status = this.batchData.workFlow.wfItem.currentStatus;
845
- if (status === this.WFBlendedProgramStatus.APPROVED || status === this.WFBlendedProgramStatus.WITHDRAWN) {
846
- return 'ws-mat-green-text';
847
- }
848
- if (status === this.WFBlendedProgramStatus.SEND_FOR_MDO_APPROVAL ||
849
- status === this.WFBlendedProgramStatus.SEND_FOR_PC_APPROVAL) {
850
- return 'ws-mat-orange-text';
851
- }
852
- return '';
853
- }
854
- return ' ';
855
- }
856
- get isHeaderHidden() {
857
- return this.isResource && this.content && !this.content.artifactUrl.length;
858
- }
859
- get showActionButtons() {
860
- return (this.actionBtnStatus !== 'wait' &&
861
- this.content &&
862
- this.content.status !== 'Deleted' &&
863
- this.content.status !== 'Expired');
864
- }
865
- get showButtonContainer() {
866
- return (this.actionBtnStatus === 'grant' &&
867
- !(this.isMobile && this.content && this.content.isInIntranet) &&
868
- !(this.content &&
869
- this.content.contentType === 'Course' &&
870
- this.content.children.length === 0 &&
871
- !this.content.artifactUrl) &&
872
- !(this.content && this.content.contentType === 'Resource' && !this.content.artifactUrl));
873
- }
874
- get isResource() {
875
- if (this.content) {
876
- const isResource = this.content.contentType === NsContent.EContentTypes.KNOWLEDGE_ARTIFACT ||
877
- this.content.contentType === NsContent.EContentTypes.RESOURCE || !this.content.children.length;
878
- if (isResource) {
879
- this.mobileAppsSvc.sendViewerData(this.content);
880
- }
881
- return isResource;
882
- }
883
- return false;
884
- }
885
- getBatchUserCount(batchData) {
886
- if (batchData && batchData.batchId) {
887
- const req = {
888
- serviceName: 'blendedprogram',
889
- applicationStatus: '',
890
- applicationIds: [
891
- batchData.batchId,
892
- ],
893
- limit: 100,
894
- offset: 0,
895
- };
896
- const usercount = {
897
- enrolled: 0,
898
- totalApplied: 0,
899
- rejected: 0,
900
- };
901
- this.contentSvc.fetchBlendedUserCOUNT(req).then((res) => {
902
- if (res.result && res.result.data) {
903
- res.result.data.forEach((ele) => {
904
- if (ele.currentStatus === 'APPROVED') {
905
- usercount.enrolled = ele.statusCount;
906
- }
907
- else if (ele.currentStatus === 'REJECTED') {
908
- usercount.rejected = ele.statusCount;
909
- }
910
- if (ele.currentStatus !== 'WITHDRAWN') {
911
- usercount.totalApplied = usercount.totalApplied + ele.statusCount;
912
- }
913
- });
914
- if (this.selectedBatchData) {
915
- this.selectedBatchData = {
916
- ...this.selectedBatchData,
917
- userCount: usercount,
918
- };
919
- }
920
- this.tocSvc.getSelectedBatchData(this.selectedBatchData);
921
- }
922
- });
923
- }
924
- }
925
- getResumeDataFromList(type) {
926
- if (!type) {
927
- // tslint:disable-next-line:max-line-length
928
- const lastItem = this.resumeData && this.resumeData.sort((a, b) => new Date(b.lastAccessTime).getTime() - new Date(a.lastAccessTime).getTime()).shift();
929
- return {
930
- identifier: lastItem.contentId,
931
- mimeType: lastItem.progressdetails && lastItem.progressdetails.mimeType,
932
- };
933
- }
934
- const firstItem = this.resumeData && this.resumeData.length && this.resumeData[0];
935
- return {
936
- identifier: firstItem.contentId,
937
- mimeType: firstItem.progressdetails && firstItem.progressdetails.mimeType,
938
- };
939
- }
940
- modifySensibleContentRating() {
941
- if (this.content &&
942
- this.content.averageRating &&
943
- typeof this.content.averageRating !== 'number') {
944
- this.content.averageRating = this.content.averageRating[this.configSvc.rootOrg || ''];
945
- }
946
- if (this.content && this.content.totalRating && typeof this.content.totalRating !== 'number') {
947
- this.content.totalRating = this.content.totalRating[this.configSvc.rootOrg || ''];
948
- }
949
- }
950
- getLearningUrls() {
951
- if (this.content) {
952
- if (!this.forPreview) {
953
- // this.progressSvc.getProgressFor(this.content.identifier).subscribe(data => {
954
- // this.contentProgress = data
955
- // })
956
- }
957
- this.isPracticeVisible = Boolean(this.tocSvc.filterToc(this.content, NsContent.EFilterCategory.PRACTICE));
958
- this.isAssessVisible = Boolean(this.tocSvc.filterToc(this.content, NsContent.EFilterCategory.ASSESS));
959
- const firstPlayableContent = this.contentSvc.getFirstChildInHierarchy(this.content);
960
- this.firstResourceLink = viewerRouteGenerator(firstPlayableContent.identifier, firstPlayableContent.mimeType, this.isResource ? undefined : this.content.identifier, this.isResource ? undefined : this.content.contentType, this.forPreview, this.content.primaryCategory, this.getBatchId());
961
- }
962
- }
963
- assignPathAndUpdateBanner(url) {
964
- const path = url.split('/').pop();
965
- if (path && this.validPaths.has(path)) {
966
- this.routePath = path;
967
- this.updateBannerUrl();
968
- }
969
- }
970
- updateBannerUrl() {
971
- if (this.banners) {
972
- this.bannerUrl = this.sanitizer.bypassSecurityTrustStyle(`url(${this.banners[this.routePath]})`);
973
- }
974
- }
975
- playIntroVideo() {
976
- if (this.content) {
977
- this.dialog.open(AppTocDialogIntroVideoComponent, {
978
- data: this.content.introductoryVideo,
979
- height: '350px',
980
- width: '620px',
981
- });
982
- }
983
- }
984
- get sanitizedIntroductoryVideoIcon() {
985
- if (this.content && this.content.introductoryVideoIcon) {
986
- return this.sanitizer.bypassSecurityTrustStyle(`url(${this.content.introductoryVideoIcon})`);
987
- }
988
- return null;
989
- }
990
- fetchExternalContentAccess() {
991
- if (this.content && this.content.registrationUrl) {
992
- if (!this.forPreview) {
993
- this.externalContentFetchStatus = 'fetching';
994
- this.registerForExternal = false;
995
- this.tocSvc.fetchExternalContentAccess(this.content.identifier).subscribe(data => {
996
- this.externalContentFetchStatus = 'done';
997
- this.registerForExternal = data.hasAccess;
998
- }, _error => {
999
- this.externalContentFetchStatus = 'done';
1000
- this.registerForExternal = false;
1001
- });
1002
- }
1003
- else {
1004
- this.externalContentFetchStatus = 'done';
1005
- this.registerForExternal = true;
1006
- }
1007
- }
1008
- }
1009
- getRatingIcon(ratingIndex) {
1010
- if (this.content && this.content.averageRating) {
1011
- const avgRating = this.content.averageRating;
1012
- const ratingFloor = Math.floor(avgRating);
1013
- if (ratingIndex <= ratingFloor) {
1014
- return 'star';
1015
- }
1016
- if (ratingFloor === ratingIndex - 1 && avgRating % 1 >= 0.29 && avgRating % 1 < 0.71) {
1017
- return 'star_half';
1018
- }
1019
- if (ratingFloor === ratingIndex - 1 && avgRating % 1 > 0.71) {
1020
- return 'star';
1021
- }
1022
- if (ratingFloor === ratingIndex - 1 && avgRating % 1 < 0.29) {
1023
- return 'star_border';
1024
- }
1025
- }
1026
- return 'star_border';
1027
- }
1028
- checkRegistrationStatus() {
1029
- const source = (this.content && this.content.sourceShortName) || '';
1030
- if (!this.forPreview &&
1031
- !this.isRegistrationSupported &&
1032
- this.checkRegistrationSources.has(source)) {
1033
- this.contentSvc
1034
- .getRegistrationStatus(source)
1035
- .then(res => {
1036
- if (res.hasAccess) {
1037
- this.actionBtnStatus = 'grant';
1038
- }
1039
- else {
1040
- this.actionBtnStatus = 'reject';
1041
- if (res.registrationUrl && this.content) {
1042
- this.content.registrationUrl = res.registrationUrl;
1043
- }
1044
- }
1045
- })
1046
- .catch(_err => { });
1047
- }
1048
- else {
1049
- this.actionBtnStatus = 'grant';
1050
- }
1051
- }
1052
- generateQuery(type) {
1053
- if (this.firstResourceLink && (type === 'START' || type === 'START_OVER')) {
1054
- let qParams = {
1055
- ...this.firstResourceLink.queryParams,
1056
- viewMode: type,
1057
- batchId: this.getBatchId(),
1058
- };
1059
- if (this.contextId && this.contextPath) {
1060
- qParams = {
1061
- ...qParams,
1062
- collectionId: this.contextId,
1063
- collectionType: this.contextPath,
1064
- };
1065
- }
1066
- if (this.forPreview) {
1067
- delete qParams.viewMode;
1068
- }
1069
- return qParams;
1070
- }
1071
- if (this.resumeDataLink && type === 'RESUME') {
1072
- let qParams = {
1073
- ...this.resumeDataLink.queryParams,
1074
- batchId: this.getBatchId(),
1075
- viewMode: 'RESUME',
1076
- };
1077
- if (this.contextId && this.contextPath) {
1078
- qParams = {
1079
- ...qParams,
1080
- collectionId: this.contextId,
1081
- collectionType: this.contextPath,
1082
- };
1083
- }
1084
- if (this.forPreview) {
1085
- delete qParams.viewMode;
1086
- }
1087
- return qParams;
1088
- }
1089
- if (this.forPreview) {
1090
- return {};
1091
- }
1092
- return {
1093
- batchId: this.getBatchId(),
1094
- viewMode: type,
1095
- };
1096
- }
1097
- get isInIFrame() {
1098
- try {
1099
- return window.self !== window.top;
1100
- }
1101
- catch (e) {
1102
- return true;
1103
- }
1104
- }
1105
- getBgColor(tagTitle) {
1106
- const bgColor = this.tagSvc.stringToColor(tagTitle.toLowerCase());
1107
- const color = this.tagSvc.getContrast(bgColor);
1108
- return { color, 'background-color': bgColor };
1109
- }
1110
- getTargetTime() {
1111
- if (this.selectedBatch.startDate) {
1112
- this.targetDate = new Date(this.selectedBatch.startDate);
1113
- const convertedDate = dayjs(this.selectedBatch.startDate).format('YYYY-MM-DD HH:mm:ss');
1114
- return new Date(convertedDate).getTime();
1115
- }
1116
- // this.targetTime = ''
1117
- return '';
1118
- }
1119
- callTimer() {
1120
- // this.targetTime = this.getTargetTime()
1121
- if (this.serverDate) {
1122
- // let timerInterval = timer(1000, 1000)
1123
- // setTimeout(()=>{
1124
- // if (this.timerIntervalClear) {
1125
- // this.timerIntervalClear.unsubscribe()
1126
- // }
1127
- // this.timerIntervalClear = timerInterval.subscribe((t: any) => {
1128
- // console.log(this.selectedBatch.startDate,'----')
1129
- // console.log(this.batchControl.value.startDate,'hiiii')
1130
- // this.targetDate = new Date(this.selectedBatch.startDate)
1131
- // const convertedDate = dayjs(this.selectedBatch.startDate).format('YYYY-MM-DD HH:mm:ss')
1132
- // this.targetTime = ''
1133
- // this.targetTime=new Date(convertedDate).getTime()
1134
- // this.timerFunc(t,this.serverDate + t * 1000)
1135
- // })
1136
- // },100)
1137
- let t = 0;
1138
- if (this.timerIntervalClear) {
1139
- clearInterval(this.timerIntervalClear);
1140
- }
1141
- this.timerIntervalClear = setInterval(() => {
1142
- this.targetTime = '';
1143
- if (this.batchControl && this.batchControl.value && this.batchControl.value.startDate) {
1144
- // console.log(this.selectedBatch.startDate,'----')
1145
- this.targetDate = new Date(this.batchControl.value.startDate);
1146
- const convertedDate = dayjs(this.batchControl.value.startDate).format('YYYY-MM-DD HH:mm:ss');
1147
- this.targetTime = new Date(convertedDate).getTime();
1148
- }
1149
- this.timerFunc(this.serverDate + t * 1000);
1150
- t = t + 1;
1151
- }, 1000);
1152
- }
1153
- }
1154
- timerFunc(serverDate) {
1155
- // serverDate = serverDate + timeer
1156
- if (serverDate && this.targetTime) {
1157
- let timerLocal = {
1158
- days: 0,
1159
- hours: 0,
1160
- min: 0,
1161
- seconds: 0,
1162
- };
1163
- // serverDate = serverDate + 1000
1164
- this.date = new Date(serverDate);
1165
- this.now = this.date.getTime();
1166
- this.difference = this.targetTime - this.now;
1167
- this.difference = this.difference / (1000 * 60 * 60 * 24);
1168
- this.days = Math.floor(this.difference);
1169
- this.hours = 23 - this.date.getHours();
1170
- this.minutes = 60 - this.date.getMinutes();
1171
- this.seconds = 60 - this.date.getSeconds();
1172
- Number(this.hours);
1173
- !isNaN(this.days)
1174
- ? (this.days = Math.floor(this.difference))
1175
- : (this.days = `<img src="https://i.gifer.com/VAyR.gif" />`);
1176
- timerLocal = {
1177
- days: this.days,
1178
- hours: this.hours,
1179
- min: this.minutes,
1180
- seconds: this.seconds,
1181
- };
1182
- this.timerService.setTimerData(timerLocal);
1183
- }
1184
- }
1185
- get showDisableMsg() {
1186
- const allBatches = this.batchData.content;
1187
- const status = [];
1188
- if (allBatches) {
1189
- allBatches.forEach((ele) => {
1190
- if (!this.handleEnrollmentEndDate(ele) || this.disableEnrollBtn) {
1191
- status.push(ele);
1192
- }
1193
- });
1194
- return status.length === allBatches.length;
1195
- }
1196
- return false;
1197
- }
1198
- get findMessage() {
1199
- if (this.showDisableMsg) {
1200
- const msg = this.WFSTATUS_MSG_MAPPING.EXPIRED;
1201
- return this.tocConfig[msg];
1202
- }
1203
- return '';
1204
- }
1205
- onClickOfShare() {
1206
- this.enableShare = true;
1207
- this.raiseTelemetry('shareContent');
1208
- }
1209
- add(event) {
1210
- // this.getUsersToShare(event.value)
1211
- if (event.value && this.matAutocomplete && !this.matAutocomplete.isOpen) {
1212
- const input = event.input;
1213
- const value = event.value;
1214
- if (this.users.length === this.maxEmailsLimit) {
1215
- this.openSnackbar(this.translateLabels('maxLimit', 'contentSharing', ''));
1216
- return;
1217
- }
1218
- if (this.users.includes(value.trim())) {
1219
- this.openSnackbar(this.translateLabels('dulicateEmail', 'contentSharing', ''));
1220
- return;
1221
- }
1222
- // tslint:disable-next-line: max-line-length
1223
- const ePattern = new RegExp(/^(?!.*\.\.)(?!.*\._)(?!.*\._\.)(?!.*\.\.$)(?!.*\.$)[a-zA-Z0-9_]+(?:\.[a-zA-Z0-9_]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?$/);
1224
- if (ePattern.test(value)) {
1225
- if ((value || '').trim()) {
1226
- this.users.push(value.trim());
1227
- }
1228
- if (input) {
1229
- input.value = '';
1230
- }
1231
- this.userCtrl.setValue('');
1232
- const el = document.getElementsByClassName('mat-chip-list-wrapper');
1233
- if (el != null) {
1234
- setTimeout(() => {
1235
- el[0].scrollTop = el[0].scrollHeight;
1236
- }, 200);
1237
- }
1238
- }
1239
- else {
1240
- this.openSnackbar(this.translateLabels('invalidEmail', 'contentSharing', ''));
1241
- return;
1242
- }
1243
- }
1244
- }
1245
- remove(user) {
1246
- const index = this.users.indexOf(user);
1247
- if (index >= 0) {
1248
- this.users.splice(index, 1);
1249
- }
1250
- }
1251
- selected(event) {
1252
- if (this.users.length === this.maxEmailsLimit) {
1253
- this.openSnackbar(this.translateLabels('maxLimit', 'contentSharing', ''));
1254
- return;
1255
- }
1256
- if (this.users.includes(event.option.value)) {
1257
- this.openSnackbar(this.translateLabels('dulicateUser', 'contentSharing', ''));
1258
- return;
1259
- }
1260
- this.users.push(event.option.value);
1261
- if (this.userInput) {
1262
- this.userInput.nativeElement.value = '';
1263
- }
1264
- this.userCtrl.setValue('');
1265
- const el = document.getElementsByClassName('mat-chip-list-wrapper');
1266
- if (el != null) {
1267
- setTimeout(() => {
1268
- el[0].scrollTop = el[0].scrollHeight;
1269
- }, 200);
1270
- }
1271
- }
1272
- filterSharedUsers(value) {
1273
- if (value) {
1274
- const filterValue = value.toLowerCase();
1275
- return this.allUsers.filter(user => user.name.toLowerCase().includes(filterValue));
1276
- }
1277
- return [];
1278
- }
1279
- submitSharing() {
1280
- let courseId = '';
1281
- let courseName = '';
1282
- let coursePosterImageUrl = '';
1283
- let courseProvider = '';
1284
- let primaryCategory = '';
1285
- if (this.configSvc.userProfile) {
1286
- courseProvider = this.configSvc.userProfile.rootOrgName || '';
1287
- }
1288
- if (this.content) {
1289
- courseId = this.content.identifier,
1290
- courseName = this.content.name,
1291
- coursePosterImageUrl = this.content.posterImage || '',
1292
- primaryCategory = this.content.primaryCategory;
1293
- }
1294
- const obj = {
1295
- request: {
1296
- courseId,
1297
- courseName,
1298
- coursePosterImageUrl,
1299
- courseProvider,
1300
- primaryCategory,
1301
- recipients: '',
1302
- },
1303
- };
1304
- const recipients = [];
1305
- this.users.forEach((selectedUser) => {
1306
- if (selectedUser.includes('@') && selectedUser.includes('.')) {
1307
- recipients.push({ email: selectedUser });
1308
- }
1309
- else {
1310
- const selectedUserObj = this.allUsers.filter(user => user.name === selectedUser);
1311
- if (selectedUserObj.length) {
1312
- recipients.push({ userId: selectedUserObj[0].id, email: selectedUserObj[0].email });
1313
- }
1314
- }
1315
- });
1316
- if (recipients.length) {
1317
- obj.request.recipients = recipients;
1318
- this.tocSvc.shareContent(obj).subscribe(result => {
1319
- if (result.responseCode === 'OK') {
1320
- this.openSnackbar(this.translateLabels('success', 'contentSharing', ''));
1321
- }
1322
- this.users = [];
1323
- this.filteredUsers = [];
1324
- this.allUsers = [];
1325
- this.enableShare = false;
1326
- this.userCtrl.setValue('');
1327
- }, error => {
1328
- // tslint:disable
1329
- console.log(error);
1330
- this.openSnackbar(this.translateLabels('error', 'contentSharing', ''));
1331
- });
1332
- }
1333
- }
1334
- onClose() {
1335
- this.enableShare = false;
1336
- this.users = [];
1337
- this.filteredUsers = [];
1338
- this.allUsers = [];
1339
- this.userCtrl.setValue('');
1340
- this.raiseTelemetry('shareClose');
1341
- }
1342
- copyToClipboard() {
1343
- const textArea = document.createElement('textarea');
1344
- textArea.value = window.location.href;
1345
- document.body.appendChild(textArea);
1346
- //textArea.focus()
1347
- textArea.select();
1348
- document.execCommand('copy');
1349
- document.body.removeChild(textArea);
1350
- this.openSnackbar(this.translateLabels('linkCopied', 'contentSharing', ''));
1351
- this.raiseTelemetry('copyToClipboard');
1352
- }
1353
- raiseTelemetry(subType) {
1354
- this.events.raiseInteractTelemetry({
1355
- type: 'click',
1356
- subType: subType,
1357
- id: this.content ? this.content.identifier : '',
1358
- }, {
1359
- id: this.content ? this.content.identifier : '',
1360
- type: this.content ? this.content.primaryCategory : '',
1361
- }, {
1362
- pageIdExt: `btn-${subType}`,
1363
- module: WsEvents.EnumTelemetrymodules.CONTENT,
1364
- });
1365
- }
1366
- translateLabels(label, type, subtype) {
1367
- return this.langtranslations.translateActualLabel(label, type, subtype);
1368
- }
1369
- ngOnDestroy() {
1370
- this.tocSvc.analyticsFetchStatus = 'none';
1371
- if (this.routerParamSubscription) {
1372
- this.routerParamSubscription.unsubscribe();
1373
- }
1374
- if (this.routeSubscription) {
1375
- this.routeSubscription.unsubscribe();
1376
- }
1377
- if (this.batchWFDataSubscription) {
1378
- this.batchWFDataSubscription.unsubscribe();
1379
- }
1380
- if (this.selectedBatchSubscription) {
1381
- this.selectedBatchSubscription.unsubscribe();
1382
- }
1383
- if (this.timerIntervalClear) {
1384
- clearInterval(this.timerIntervalClear);
1385
- // this.timerIntervalClear.unsubscribe()
1386
- this.targetTime = '';
1387
- }
1388
- if (this.selectedBatchSubscription) {
1389
- this.batchControlUnsubscribe.unsubscribe();
1390
- }
1391
- this.batchControl.setValue({});
1392
- this.batchControl.updateValueAndValidity();
1393
- this.selectedBatch = {};
1394
- }
1395
- translateLabel(label, type) {
1396
- return this.langtranslations.translateLabel(label, type, '');
1397
- }
1398
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocBannerComponent, deps: [{ token: i1.DomSanitizer }, { token: i2.Router }, { token: i2.ActivatedRoute }, { token: i3.MatLegacyDialog }, { token: i4.AppTocService }, { token: i5.WidgetContentService }, { token: i6.UtilityService }, { token: i7.MobileAppsService }, { token: i8.MatLegacySnackBar }, { token: i6.ConfigurationsService }, { token: i9.TitleTagService }, { token: i10.ActionService }, { token: i6.LoggerService }, { token: i11.DatePipe }, { token: i12.TranslateService }, { token: i13.UserAutocompleteService }, { token: i6.EventService }, { token: i6.MultilingualTranslationsService }, { token: i14.TimerService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Component }); }
1399
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocBannerComponent, selector: "ws-app-toc-banner", inputs: { banners: "banners", content: "content", resumeData: "resumeData", analytics: "analytics", forPreview: "forPreview", batchData: "batchData", userEnrollmentList: "userEnrollmentList", contentReadData: "contentReadData", clickToShare: "clickToShare" }, outputs: { withdrawOrEnroll: "withdrawOrEnroll", programEnrollCall: "programEnrollCall" }, providers: [AccessControlService, DatePipe], viewQueries: [{ propertyName: "userInput", first: true, predicate: ["userInput"], descendants: true }, { propertyName: "matAutocomplete", first: true, predicate: ["auto"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"header-synopsis fixed-width margin-top-xl\" [ngClass]=\"{ 'header-synopsis-gradient': bannerUrl }\"\n *ngIf=\"show\">\n <div class=\"flex flex-row\">\n <div class=\"flex-auto\">\n <div class=\"header-title flex-col sm:flex-row\">\n <!-- image -->\n <div *ngIf=\"content?.posterImage\" class=\"float-left\">\n <img [src]=\"content?.posterImage | pipePublicURL\" [id]=\"'source_' + content.identifier\" class=\"app-icon\"\n [wsUtilsDefaultThumbnail]=\"defaultSLogo\" [alt]=\"content.sourceName || iGOT\" />\n </div>\n <div *ngIf=\"!content?.posterImage\" class=\"float-left\">\n <ng-container *ngIf=\"content?.appIcon; else defaultImg\">\n <img [src]=\"content?.appIcon | pipePublicURL\" [id]=\"'source_' + content.identifier\" class=\"app-icon\"\n [wsUtilsDefaultThumbnail]=\"defaultSLogo\" [alt]=\"content.sourceName || iGOT\" />\n </ng-container>\n <ng-template #defaultImg>\n <img src=\"/assets/instances/eagle/app_logos/default.png\" [id]=\"'source_' + content.identifier\"\n class=\"app-icon\" [alt]=\"content.sourceName || iGOT\" />\n </ng-template>\n </div>\n <div class=\"sm:ml-5 flex flex-auto\" [id]=\"'m-c-'+ content.identifier\">\n <div class=\"sm:ml-5 flex flex-col flex-auto\">\n <h1 class=\"mat-headline margin-remove-bottom padding-bottom-xs hidden sm:block\"\n [title]=\"contentReadData?.name\">\n {{ contentReadData?.name }}\n <div class=\"float-right cursor-pointer flex\" (click)=\"onClickOfShare()\" *ngIf=\"canShare\">\n <mat-icon class=\"ws-mat-accent-text padding-top-xs\">share</mat-icon>\n </div>\n </h1>\n <h1 class=\"mat-headline margin-remove-bottom padding-bottom-xs block sm:hidden\"\n [title]=\"contentReadData?.name\">\n {{ contentReadData?.name }}\n </h1>\n <span *ngIf=\"contentProgress === 1\" class=\"margin-left-s\">\n <mat-icon class=\"ws-mat-accent-text\">check_circle</mat-icon>\n </span>\n <div *ngIf=\"content?.primaryCategory\" class=\"apIcon float-left mb-4\">\n <img src=\"/assets/icons/content/course.svg\" [id]=\"'source_' + content.identifier\" class=\"source-icon\"\n [wsUtilsDefaultThumbnail]=\"defaultSLogo\" [alt]=\"content.sourceName || iGOT\" />\n <span>{{ translateLabel(content?.primaryCategory, 'searchfilters') }}</span>\n </div>\n <div *ngIf=\"content?.appIcon\" class=\"apIcon float-left mb-4\">\n <img [src]=\"content?.creatorLogo | pipePublicURL\" [id]=\"'source_' + content.identifier\"\n class=\"source-icon\" [wsUtilsDefaultThumbnail]=\"defaultSLogo\" [alt]=\"content.sourceName || iGOT\" />\n </div>\n <div [ngSwitch]=\"routePath\" class=\"header-meta\" [ngClass]=\"{ 'header-meta-banner': bannerUrl }\">\n <!-- Overview Section -->\n <div class=\"banner-overview-container\" [hidden]=\"!content?.purpose && showSubtitleOnBanner\"\n *ngSwitchCase=\"'overview'\">\n <h3 class=\"overview-description mat-body-1\" *ngIf=\"showSubtitleOnBanner\" i18n-title title=\"Subtitle\">\n {{ content?.source | pipeLimitTo: 250 }}\n </h3>\n <p class=\"overview-description mat-body-1\" *ngIf=\"!showSubtitleOnBanner\" i18n-title title=\"Description\">\n {{ content?.instructions | pipeLimitTo: 450 }}\n </p>\n <div *ngIf=\"sanitizedIntroductoryVideoIcon\" class=\"overview-intro ws-mat-primary-lite-background\"\n [style.backgroundImage]=\"sanitizedIntroductoryVideoIcon\" role=\"button\" (click)=\"playIntroVideo()\">\n <mat-icon role=\"button\" class=\"overview-intro-overlay\">play_arrow</mat-icon>\n </div>\n </div>\n <!-- Toc Section -->\n <div *ngSwitchCase=\"'contents'\">\n <!-- Contents Banner -->\n </div>\n <!-- Analytics Section -->\n <div class=\"banner-overview-container mat-body-1\" [hidden]=\"!content?.purpose && showSubtitleOnBanner\"\n *ngSwitchCase=\"'analytics'\">\n <h3 class=\"overview-description mat-body-1\" *ngIf=\"showSubtitleOnBanner\" i18n-title title=\"Subtitle\">\n {{ content?.purpose | pipeLimitTo: 250 }}\n </h3>\n <p class=\"overview-description mat-body-1\" *ngIf=\"!showSubtitleOnBanner\" i18n-title title=\"Description\">\n {{ content?.instructions | pipeLimitTo: 450 }}\n </p>\n <div *ngIf=\"sanitizedIntroductoryVideoIcon\" class=\"overview-intro ws-mat-primary-lite-background\"\n [style.backgroundImage]=\"sanitizedIntroductoryVideoIcon\" role=\"button\" (click)=\"playIntroVideo()\">\n <mat-icon role=\"button\" class=\"overview-intro-overlay\">play_arrow</mat-icon>\n </div>\n </div>\n </div>\n <div *ngIf=\"content?.averageRating\" class=\"flex items-center rating margin-bottom-m\">\n <span class=\"rating-number mat-body-2\">{{ content?.averageRating }}&nbsp;</span>\n <mat-icon class=\"mat-icon material-icons\" *ngFor=\"let rating of [1, 2, 3, 4, 5]\">\n {{ getRatingIcon(rating) }}</mat-icon>\n <span class=\"margin-left-xs rating-count mat-body-2\" *ngIf=\"content?.totalRating\">\n ( {{ content?.totalRating | pipeCountTransform }} )</span>\n </div>\n <div *ngIf=\"!content?.averageRating\" class=\"flex items-center rating margin-bottom-m\">\n <span class=\"rating-number mat-body-2\"> 0.0 &nbsp;</span>\n <mat-icon class=\"mat-icon material-icons\" *ngFor=\"let rating of [1, 2, 3, 4, 5]\">\n {{ getRatingIcon(rating) }}</mat-icon>\n <span class=\"margin-left-xs rating-count mat-body-2\" *ngIf=\"!content?.totalRating\">\n ( {{ 0 | pipeCountTransform }} )</span>\n </div>\n <!-- tags -->\n <div class=\"tags margin-bottom-s\" *ngIf=\"content?.keywords && content?.keywords?.length > 0\">\n <span *ngFor=\"let tag of content.keywords\" class=\"tag\">\n {{tag}}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"batch-div\">\n <div class=\"request-block\">\n <ng-container *ngIf=\"content\" [ngTemplateOutlet]=\"batchDropdown\"></ng-container>\n <ng-container\n *ngIf=\"batchData && !batchData?.enrolled && batchData?.workFlow?.wfInitiated &&\n (batchData?.workFlow?.wfItem?.currentStatus !== WFBlendedProgramStatus.REJECTED) && (batchData?.workFlow?.wfItem?.currentStatus !== WFBlendedProgramStatus.REMOVED) &&\n (batchData?.workFlow?.wfItem?.currentStatus !== WFBlendedProgramStatus.WITHDRAWN) &&\n (batchData?.workFlow?.wfItem?.currentStatus !== WFBlendedProgramStatus.APPROVED) && batchData?.content?.length\">\n <p class=\"margin-remove-bottom mat-body-1 padding-m bg-white\">\n {{batchData?.workFlow?.batch?.name}} - ({{batchData?.workFlow?.batch?.startDate | date: 'dd-MM-yyyy'}} -\n {{batchData?.workFlow?.batch?.endDate | date: 'dd-MM-yyyy' || 'present'}})\n </p>\n <ng-container>\n <button class=\"withdraw-batch\" (click)=\"!disableWithdrawnBtn && requestToWithdrawDialog()\"\n [disabled]=\"disableWithdrawnBtn\" [ngClass]=\"{ 'disable-btn': disableWithdrawnBtn }\">\n <ng-container> {{ 'apptocbanner.withDrawYourRequest' | translate }} </ng-container>\n </button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"batchData && batchData?.enrolled && batchData?.content?.length\">\n <h3 class=\"margin-remove-bottom p-4 bg-white mat-body-1\" *ngFor=\"let batch of batchData.content\">\n {{batch?.name}} ({{batch?.startDate | date: 'dd-MM-yyyy' }} - {{batch?.endDate | date: 'dd-MM-yyyy' ||\n 'present'}})\n </h3>\n <ng-container [ngTemplateOutlet]=\"statusMsg\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"batchData && !batchData?.enrolled && !batchData?.content?.length\">\n <h3 class=\"margin-remove-bottom mat-body-2 ws-default-text\">\n No batches\n </h3>\n </ng-container>\n </div>\n <!-- <ng-container *ngIf=\"batchData && batchData?.content?.length && batchData?.content[0]?.batchAttributes?.batchLocationDetails\">\n <div class=\"flex items-center location-wrapper\">\n <div>\n <mat-icon class=\"location-icon\">\n location_on</mat-icon>\n </div>\n <div class=\"loc-details\">\n {{batchData?.content[0]?.batchAttributes?.batchLocationDetails}}\n </div>\n </div>\n </ng-container> -->\n </div>\n <ng-container *ngIf=\"batchData && !batchData?.enrolled && batchData?.content?.length\"\n [ngTemplateOutlet]=\"statusMsg\"></ng-container>\n</ng-container>\n<ng-container *ngIf=\"content?.courseCategory === nsContent.ECourseCategory.MODERATED_PROGRAM\">\n <div class=\"request-batch\">\n <div class=\"batch-div\">\n <ng-container *ngIf=\"content\" [ngTemplateOutlet]=\"batchDropdown\"></ng-container>\n </div>\n </div>\n</ng-container>\n<!-- <div class=\"header-synopsis fixed-width margin-top-l\" [ngClass]=\"{ 'header-synopsis-gradient': bannerUrl }\" *ngIf=\"content && batchControl?.value?.batchAttributes?.batchLocationDetails\">\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <h2>{{'apptocbanner.batchLocation' | translate}}</h2>\n <p>{{batchControl?.value?.batchAttributes?.batchLocationDetails}}</p>\n </ng-container>\n</div> -->\n\n<mat-menu #actionMenu=\"matMenu\">\n <div mat-menu-item>\n <ng-container *ngIf=\"content\" [ngTemplateOutlet]=\"actions\"></ng-container>\n </div>\n</mat-menu>\n\n<ng-template #actions>\n <a i18n-aria-label aria-label=\"Take Action\" mat-icon-button *ngIf=\"reviewButton\"\n [routerLink]=\"['/author/editor/' + content?.identifier]\">\n <mat-icon>publish</mat-icon>\n </a>\n <ws-widget-btn-content-download id=\"prevfordownload\" [forPreview]=\"forPreview\"\n [widgetData]=\"content | pipePartialContent : ['identifier', 'contentType', 'resourceType', 'mimeType', 'downloadUrl', 'isExternal', 'artifactUrl']\">\n </ws-widget-btn-content-download>\n <ws-widget-btn-content-share id=\"prevforshare\" [forPreview]=\"forPreview\" [widgetData]=\"content\">\n </ws-widget-btn-content-share>\n <ws-widget-btn-kb [forPreview]=\"forPreview\" id=\"prev\" [contentId]=\"content?.identifier\"\n [contentName]=\"contentReadData?.name\" [contentType]=\"content?.contentType\" [status]=\"content?.status\">\n </ws-widget-btn-kb>\n <ws-widget-btn-goals [forPreview]=\"forPreview\" id=\"goalsforprev\" *ngIf=\"isGoalsEnabled && btnGoalsConfig\"\n [widgetData]=\"btnGoalsConfig\">\n </ws-widget-btn-goals>\n <ws-widget-btn-playlist [forPreview]=\"forPreview\" id=\"playlistforprev\" *ngIf=\"btnPlaylistConfig\"\n [widgetData]=\"btnPlaylistConfig\">\n </ws-widget-btn-playlist>\n <ws-widget-btn-content-feedback-v2 [forPreview]=\"forPreview\" id=\"feedbackforprev\"\n [widgetData]=\"content | pipePartialContent: ['identifier', 'name']\">\n </ws-widget-btn-content-feedback-v2>\n</ng-template>\n<ng-template #authView>{{'apptocbanner.view' | translate}}</ng-template>\n<ng-template #statusMsg>\n <div class=\"status-container mt-2 mb-2\"\n *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && batchData?.workFlow?.wfInitiated\">\n <div class=\"flex\" *ngIf=\"showMsg\">\n <ng-container *ngIf=\"showIcon\">\n <mat-icon class=\"mr-4\" [ngClass]=\"iconColor\" *ngIf=\"WFIcon === 'circle'\">check_circle</mat-icon>\n <mat-icon class=\"mr-4 ws-mat-red-text visibility-show\" style=\"transform: rotate(180deg);\"\n *ngIf=\"WFIcon === 'info'\">info</mat-icon>\n </ng-container>\n <div class=\"mat-body-1\">{{ getWFMsg }}</div>\n </div>\n </div>\n <div class=\"status-container mt-5\"\n *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && showDisableMsg && !showMsg && findMessage.length > 0\">\n <div class=\"flex\">\n <ng-container>\n <mat-icon class=\"mr-3 ws-mat-red-text\" style=\"transform: rotate(180deg);\">info</mat-icon>\n </ng-container>\n <div class=\"mat-body-1\">\n <p class=\"margin-remove-bottom \">{{findMessage}}</p>\n </div>\n </div>\n </div>\n</ng-template>\n\n<div class=\"share-container\" *ngIf=\"enableShare\">\n <div *ngIf=\"showLoader\" class=\"text-center my-2 loader\">\n <mat-spinner class=\"inline-block\"></mat-spinner>\n </div>\n <div class=\"cursor-pointer close-share-dialog\"><mat-icon (click)=\"onClose()\" class=\"close-icon\">close</mat-icon></div>\n <div class=\"share-modal\">\n <div class=\"karmasahayogi-icon\"><img alt=\"karmasahayogi-icon\" src=\"/assets/icons/KarmaSahayogi.svg\"></div>\n <div class=\"content-div\">\n <div class=\"triangle-left hidden md:block\"></div>\n <div class=\"contnet\">\n <section class=\"w-full flex align-center justify-between \">\n <div class=\"mb-2\">\n <h2 class=\"mat-headline margin-remove-bottom ws-mat-black-text\">{{'contentSharing.header' | translate}}</h2>\n </div>\n </section>\n <form [formGroup]=\"shareForm\">\n <div class=\"mat-body-2\">\n <div class=\"md-5\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-chip-list #chipList aria-label=\"user selection\" appearance=\"outline\">\n <mat-chip *ngFor=\"let user of users\" [selectable]=\"selectable\" [removable]=\"removable\"\n (removed)=\"remove(user)\">\n {{user}}\n <mat-icon matChipRemove *ngIf=\"removable\">close</mat-icon>\n </mat-chip>\n <input tabindex=\"-1\" class=\"inputTextBox\"\n placeholder=\"{{users.length === 0 ? translateLabels('placehoderText', 'contentSharing') : ''}}\"\n #userInput formControlName=\"review\" [formControl]=\"userCtrl\" [matAutocomplete]=\"auto\"\n [matChipInputFor]=\"chipList\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [matChipInputAddOnBlur]=\"addOnBlur\" (matChipInputTokenEnd)=\"add($event)\">\n </mat-chip-list>\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\n <mat-option *ngFor=\"let user of filteredUsers\" [value]=\"user.name\">\n <div class=\"flex\">\n <div class=\"iconDiv\">\n <span class=\"iconText\">{{user.iconText.substring(0,2)}}</span>\n </div>\n <div>\n <div>{{user.name}}</div>\n <div class=\"emailText\">{{user.maskedEmail}}</div>\n </div>\n </div>\n </mat-option>\n </mat-autocomplete>\n <mat-hint align=\"start\" class=\"left-over-emails\">{{'contentSharing.note' | translate}}</mat-hint>\n <mat-hint align=\"end\" class=\"left-over-emails\">{{ users.length }} /{{maxEmailsLimit}}\n {{'contentSharing.remaingEmails' | translate}}</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"flex mt-5\">\n <div class=\"flex flex-1 flex-end\">\n <span class=\"copy-link-btn cursor-pointer\" (click)=\"copyToClipboard()\">{{'contentSharing.copyLink' |\n translate}} &nbsp;&nbsp;<mat-icon>link</mat-icon></span>\n <button mat-stroked-button type=\"submit\"\n [ngClass]=\"{'disable-send-btn': users.length === 0 || users.length}\"\n class=\"text-white ws-mat-primary-background flex-auto-display send-btn\"\n [disabled]=\"userCtrl.value.length || users.length === 0 || users.length > maxEmailsLimit\"\n (click)=\"submitSharing()\">\n {{'contentSharing.send' | translate}} &nbsp; <mat-icon>send</mat-icon>\n </button>\n </div>\n </div>\n\n </div>\n </form>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #batchDropdown>\n <form class=\"flex flex-col gap-4\">\n <ng-container *ngIf=\"batchData && !batchData?.enrolled\n && (!batchData.workFlow?.wfInitiated || (batchData.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REMOVED))\n && batchData?.content?.length\">\n <mat-form-field appearance=\"outline\" class=\"w-full batch-form-field\">\n <mat-select #batchControlData [formControl]=\"batchControl\" required autoSelctFirstOption\n (selectionChange)=\"batchChange($event)\" panelClass=\"batch-dropdown\">\n <mat-option *ngFor=\"let batch of batchData.content; let i=index\" [value]=\"batch\" selected=\"index === 0\"\n [disabled]=\"!handleEnrollmentEndDate(batch) || disableEnrollBtn \">\n <div class=\"flex flex-row items-center gap-2\">\n <div class=\"flex-1 text-sm batch-timings\">\n {{ batch.name }} ( {{ batch.startDate | date: 'd MMM, yyyy' }} - {{ batch.endDate | date: 'd MMM, yyyy'\n || 'present' }} )\n </div>\n <div class=\"expired\" *ngIf=\"!handleEnrollmentEndDate(batch) || disableEnrollBtn\">\n Expired\n </div>\n </div>\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"batchControl.hasError('required')\">Please choose a batch to start course</mat-error>\n </mat-form-field>\n <div class=\"flex flex-wrap gap-3\">\n <ng-container *ngIf=\"!showRejected\">\n <div class=\"flex-1\">\n <div class=\"flex flex-col gap-1\" *ngIf=\"selectedBatch && selectedBatch.enrollmentEndDate \">\n <p class=\"text-xs leading-4 mb-0\">Last enroll date</p>\n <p class=\"font-bold mb-0\">{{ selectedBatch.enrollmentEndDate | date: 'd MMM, y' }}</p>\n </div>\n </div>\n <div class=\"flex flex-row justify-center items-center\">\n <button class=\"enroll-button\"\n [ngClass]=\"{ 'disable-btn': disableEnrollBtn || batchControl.hasError('required') || !handleEnrollmentEndDate(selectedBatch) }\"\n [disabled]=\"disableEnrollBtn || batchControl.hasError('required')|| !handleEnrollmentEndDate(selectedBatch)\"\n (click)=\"requestToEnrollDialog()\">\n <ng-container>\n Request to enroll\n </ng-container>\n </button>\n </div>\n </ng-container>\n <ng-container *ngIf=\"showRejected && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <h3 class=\"margin-remove-bottom mat-body-2 ws-default-text\">\n Your enrollment request is {{batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REMOVED\n ?'removed':'rejected'}}.</h3>\n </ng-container>\n </div>\n </ng-container>\n </form>\n</ng-template>", styles: [".button,.batch-div .enroll-button,.batch-div .withdraw-batch{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}.batch-div{border-radius:8px;background-color:#fdead5;max-width:400px;margin:0 auto}.batch-div .request-block{padding:16px}.batch-div .batch-details{padding:16px;border:1px solid #FF9800;border-radius:8px;background-color:#fff;cursor:pointer}.batch-div .batch-enrolled{font-weight:700;color:#4caf50;font-size:.75rem}.batch-div .withdraw-batch{color:#000000de;border:1px solid rgba(0,0,0,.8705882353);background-color:#fff;width:100%;margin-top:16px}.batch-div .enroll-button{color:#fff;background-color:#ff9800;border:1px solid #FF9800}::ng-deep .batch-dropdown{margin-top:3rem!important}::ng-deep .batch-dropdown .mat-option{height:fit-content!important;padding:12px 16px!important}::ng-deep .batch-form-field{height:64px}::ng-deep .batch-form-field .mat-form-field-wrapper{margin:0;padding-bottom:0;height:inherit}::ng-deep .batch-form-field .mat-form-field-wrapper .mat-form-field-flex{height:inherit}::ng-deep .batch-form-field .mat-form-field-outline{border-radius:8px;height:inherit}::ng-deep .batch-form-field .mat-form-field-infix{display:flex;align-items:center;font-size:14px;border-top:.35rem solid transparent;padding:8px 0;height:44px}::ng-deep .batch-form-field .mat-form-field-infix .mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:translateY(0)!important}::ng-deep .batch-form-field .mat-form-field-subscript-wrapper{padding:8px 4px!important}::ng-deep .batch-form-field .mat-form-field-subscript-wrapper .mat-error{margin-top:6px}::ng-deep .batch-form-field .mat-select-value-text{white-space:pre-line!important;line-height:21px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.disable-btn{opacity:.5}.mb-0{margin-bottom:0!important}.batch-timings{text-transform:uppercase;line-height:20px}.header-synopsis{padding:32px 64px}@media only screen and (max-width: 599px){.header-synopsis{padding:32px 24px}}.app-icon{height:180px;width:280px;border-radius:4px}.banner-container{position:relative;background-repeat:no-repeat;background-position:center;background-size:cover}.header-synopsis-gradient{background:inherit}.category-text{margin-left:8px}.fixed-width{max-width:1230px;display:block;margin:0 auto;padding:0!important}@media only screen and (min-width: 600px) and (max-width: 959px){.fixed-width{padding:0 15px!important}}@media only screen and (max-width: 599px){.fixed-width{padding:0 15px!important}}.fluid-width{width:100%}.header-synopsis{box-sizing:border-box}.header-synopsis .apIcon{background-color:#fff;margin-right:16px;padding:4px 8px;border-radius:16px;display:flex;align-items:center;justify-content:flex-start}.header-synopsis .apIcon img{height:15px;object-fit:contain}.header-synopsis .apIcon span{opacity:1;color:#0009;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.header-synopsis .header-title{display:flex}.header-synopsis .header-title .text-truncate-title{max-width:100%;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important}.header-synopsis .rating .mat-icon{width:16px;height:16px;display:inline-table;color:#f69953;font-size:18px}.header-synopsis .rating .rating-number{letter-spacing:0px;color:#f69953}.header-synopsis .rating .rating-count{letter-spacing:.36px;color:#f69953}.header-synopsis .rating .rating mat-icon{color:#f69953}.header-synopsis .header-meta{line-height:1.5}.header-synopsis .resumeButton{height:52px;min-width:160px;display:flex;align-items:center;justify-content:center;background:#34d6a4 0% 0% no-repeat padding-box;box-shadow:0 10px 30px #9993;color:#fff!important}.header-synopsis .resumeButton ::ng-deep .mat-button-wrapper{letter-spacing:0px;color:#fff;text-transform:capitalize}.header-synopsis .header-actions{display:flex}.header-synopsis .header-actions .custom-button{background:#0074b6 0% 0% no-repeat padding-box;border-radius:4px}.header-synopsis .header-actions.top{margin-top:0;margin-bottom:40px}.header-synopsis .header-actions .action-btns{margin-left:auto;order:2}.banner-overview-container{display:flex;justify-content:space-between}.banner-overview-container .overview-description{flex:1;min-width:1px;margin-right:24px;margin-bottom:12px;opacity:1;color:#000000de;font-size:16px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:24px}@media only screen and (max-width: 599px){.banner-overview-container .overview-description{margin-right:0}}.banner-overview-container .overview-intro{width:240px;height:135px;border:1px solid;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover;background-attachment:fixed;position:relative}.banner-overview-container .overview-intro .overview-intro-overlay{cursor:pointer;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;width:48px;height:48px;font-size:48px;background-color:#00000080;border-radius:50%;padding:8px}.banner-overview-container .overview-intro .overview-intro-overlay:active{background-color:#000000b3}@media only screen and (max-width: 599px){.banner-overview-container .overview-intro{display:none}}.analytics-meta{font-weight:500;margin-bottom:12px;line-height:1.2}.hidden-block-xs{display:block}@media only screen and (max-width: 599px){.hidden-block-xs{display:none}}.visible-block-xs{display:none}@media only screen and (max-width: 599px){.visible-block-xs{display:block}}.hidden-block-s{display:block}@media only screen and (min-width: 600px) and (max-width: 959px){.hidden-block-s{display:none}}.visible-block-s{display:none}@media only screen and (min-width: 600px) and (max-width: 959px){.visible-block-s{display:block}}.info-msg{color:#fff!important}.info-msg mat-icon{color:#fff!important}.tags{display:flex;flex:1;flex-direction:row;flex-wrap:wrap;position:relative;z-index:1}.tags .tag{display:inline-block;border-radius:100px 4px 4px 100px;padding:1px 12px;width:auto;justify-content:space-between;margin:0 8px 8px 0;background-color:#0000000a;border:1px solid rgba(0,0,0,.08);box-sizing:border-box}.batch-container{max-width:435px;border-radius:4px;width:40%}.custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px;max-width:auto!important;height:42px!important}.sticky-banner{z-index:999;position:sticky;top:128px}.sticky-banner .header-title h1{font:normal normal 300 24px/35px}.sticky-banner .overview-description{font:normal normal 300 14px/21px}.batch-wrapper{display:flex;justify-content:space-between;gap:25px;width:100%}.batch-timer{width:60%;background-color:#fff;align-items:center}.batch-timer .timer-title{opacity:1;color:#0006;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.25px;text-align:left;line-height:20px}.batch-timer .time-wrapper div p.count{border-radius:4px;background-color:#000000de;opacity:1;color:#fff;font-size:36px;font-weight:600;font-style:normal;letter-spacing:-.2px;text-align:center;line-height:48px;width:67px;height:47px;margin-bottom:4px}.batch-timer .time-wrapper div p.time-label{opacity:1;color:#000000de;font-size:10px;font-weight:400;font-style:normal;letter-spacing:.5px;text-align:center;line-height:12px}.batch-timer .time-wrapper span{padding:8px;font-size:36px}.batch-timer .help{width:100%}.batch-timer .help .batch-duration-wrap{padding:0 24px}.batch-timer .help .batch-duration-wrap .duration-days{opacity:1;color:#000000de;font-family:Montserrat-SemiBold;font-size:36px;font-weight:600;font-style:normal;letter-spacing:-.2px;text-align:left;line-height:48px;padding-bottom:16px}.batch-info{opacity:1;color:#000000de;font-size:14px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:20px;padding:26px}.disable-send-btn[disabled]{background-color:#000!important}@media (max-width: 768px){.batch-wrapper{flex-wrap:wrap}.batch-timer{width:100%;flex-wrap:wrap;justify-content:center}.batch-container{width:100%}}.share-container{position:fixed;height:100vh;background:#131313a3;width:100vw;top:0;left:0;z-index:1000}.share-modal{display:flex;align-items:center;justify-content:center;height:inherit;width:inherit}.karmasahayogi-icon{position:absolute;bottom:-5px;left:calc(50% - 464px)}.triangle-left{transform:translateY(100%);position:absolute;bottom:28%;left:-24px;width:0;height:0;border-top:24px solid transparent;border-right:48px solid #ffffff;border-bottom:24px solid transparent}.contnet{background-color:#fff;width:612px;border-radius:12px;padding:16px}.content-div{position:relative}.copy-link-btn{display:flex;align-items:center;margin-right:20px;color:red;color:#0074b6!important;font-weight:600}.copy-link-btn:hover{background-color:none!important}.send-btn{border-radius:20px}.send-btn .mat-icon{margin-bottom:2.5px}::ng-deep .mat-chip-list-wrapper{height:100px;overflow:auto;display:block!important;scroll-behavior:smooth}.iconText{border-radius:50%;background-color:#000;color:#fff;width:30px;display:inline-block;text-align:center;height:30px;display:flex;align-items:center;justify-content:center}.iconDiv{margin-right:8px}.emailText{opacity:.6}button:disabled{pointer-events:none;opacity:.5;color:#000}::ng-deep .mat-autocomplete-panel{z-index:99999}::ng-deep .cdk-overlay-pane{z-index:9999!important}::ng-deep .close-icon{background-color:#000;color:#fff;border-radius:16px;padding:4px}::ng-deep .mat-chip-input{padding-bottom:8px!important}::ng-deep .theme-igot.day-mode .mat-chip.mat-standard-chip{color:#0074b6!important}::ng-deep .theme-igot.day-mode .mat-chip.mat-standard-chip mat-icon{color:#0074b6!important}::ng-deep .inputTextBox{width:95%!important;overflow-x:hidden}.close-share-dialog{position:absolute;right:30px;top:30px}.left-over-emails{font-weight:600}.loader{position:absolute;top:42%;left:45%;z-index:1000}@media (max-width: 768px){.content-div{width:100%}.contnet{width:unset;margin-bottom:18%}.left-over-emails{display:none}.karmasahayogi-icon{left:8%;bottom:20%}.share-modal{align-items:self-end}}@media only screen and (min-device-width: 820px) and (max-device-width: 1180px){.karmasahayogi-icon{left:calc(50% - 387px)}.content{width:500px}}@media only screen and (min-device-width: 768px) and (max-device-width: 819px){.triangle-left{display:none}}.location-wrapper{padding:16px;border-top:1px solid rgba(0,0,0,.16)}.location-wrapper .location-icon{color:#1b4ca1;height:32px;width:32px;font-size:32px;padding-right:8px}.location-wrapper .loc-details{opacity:1;color:#000000de;font-family:Lato-Bold;font-size:14px;font-weight:700;font-style:Bold;letter-spacing:.25px;text-align:left;line-height:20px}.visibility-show{overflow:visible!important}\n"], dependencies: [{ kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i11.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i11.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i15.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i15.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i15.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i15.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i15.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i15.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i15.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i15.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i15.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i16.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i17.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i17.MatLegacyAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab], a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: i18.MatLegacyError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i18.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i18.MatLegacyHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "component", type: i19.MatLegacyMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i19.MatLegacyMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "component", type: i20.MatLegacyChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i20.MatLegacyChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i20.MatLegacyChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i20.MatLegacyChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i21.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i22.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i23.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i6.DefaultThumbnailDirective, selector: "[wsUtilsDefaultThumbnail]", inputs: ["wsUtilsDefaultThumbnail", "src"] }, { kind: "component", type: i24.MatLegacyAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i24.MatLegacyAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "pipe", type: i11.DatePipe, name: "date" }, { kind: "pipe", type: i6.PipeLimitToPipe, name: "pipeLimitTo" }, { kind: "pipe", type: i6.PipeCountTransformPipe, name: "pipeCountTransform" }, { kind: "pipe", type: i6.PipePartialContentPipe, name: "pipePartialContent" }, { kind: "pipe", type: i6.PipePublicURL, name: "pipePublicURL" }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }] }); }
1400
- }
1401
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocBannerComponent, decorators: [{
1402
- type: Component,
1403
- args: [{ selector: 'ws-app-toc-banner', providers: [AccessControlService, DatePipe], template: "<div class=\"header-synopsis fixed-width margin-top-xl\" [ngClass]=\"{ 'header-synopsis-gradient': bannerUrl }\"\n *ngIf=\"show\">\n <div class=\"flex flex-row\">\n <div class=\"flex-auto\">\n <div class=\"header-title flex-col sm:flex-row\">\n <!-- image -->\n <div *ngIf=\"content?.posterImage\" class=\"float-left\">\n <img [src]=\"content?.posterImage | pipePublicURL\" [id]=\"'source_' + content.identifier\" class=\"app-icon\"\n [wsUtilsDefaultThumbnail]=\"defaultSLogo\" [alt]=\"content.sourceName || iGOT\" />\n </div>\n <div *ngIf=\"!content?.posterImage\" class=\"float-left\">\n <ng-container *ngIf=\"content?.appIcon; else defaultImg\">\n <img [src]=\"content?.appIcon | pipePublicURL\" [id]=\"'source_' + content.identifier\" class=\"app-icon\"\n [wsUtilsDefaultThumbnail]=\"defaultSLogo\" [alt]=\"content.sourceName || iGOT\" />\n </ng-container>\n <ng-template #defaultImg>\n <img src=\"/assets/instances/eagle/app_logos/default.png\" [id]=\"'source_' + content.identifier\"\n class=\"app-icon\" [alt]=\"content.sourceName || iGOT\" />\n </ng-template>\n </div>\n <div class=\"sm:ml-5 flex flex-auto\" [id]=\"'m-c-'+ content.identifier\">\n <div class=\"sm:ml-5 flex flex-col flex-auto\">\n <h1 class=\"mat-headline margin-remove-bottom padding-bottom-xs hidden sm:block\"\n [title]=\"contentReadData?.name\">\n {{ contentReadData?.name }}\n <div class=\"float-right cursor-pointer flex\" (click)=\"onClickOfShare()\" *ngIf=\"canShare\">\n <mat-icon class=\"ws-mat-accent-text padding-top-xs\">share</mat-icon>\n </div>\n </h1>\n <h1 class=\"mat-headline margin-remove-bottom padding-bottom-xs block sm:hidden\"\n [title]=\"contentReadData?.name\">\n {{ contentReadData?.name }}\n </h1>\n <span *ngIf=\"contentProgress === 1\" class=\"margin-left-s\">\n <mat-icon class=\"ws-mat-accent-text\">check_circle</mat-icon>\n </span>\n <div *ngIf=\"content?.primaryCategory\" class=\"apIcon float-left mb-4\">\n <img src=\"/assets/icons/content/course.svg\" [id]=\"'source_' + content.identifier\" class=\"source-icon\"\n [wsUtilsDefaultThumbnail]=\"defaultSLogo\" [alt]=\"content.sourceName || iGOT\" />\n <span>{{ translateLabel(content?.primaryCategory, 'searchfilters') }}</span>\n </div>\n <div *ngIf=\"content?.appIcon\" class=\"apIcon float-left mb-4\">\n <img [src]=\"content?.creatorLogo | pipePublicURL\" [id]=\"'source_' + content.identifier\"\n class=\"source-icon\" [wsUtilsDefaultThumbnail]=\"defaultSLogo\" [alt]=\"content.sourceName || iGOT\" />\n </div>\n <div [ngSwitch]=\"routePath\" class=\"header-meta\" [ngClass]=\"{ 'header-meta-banner': bannerUrl }\">\n <!-- Overview Section -->\n <div class=\"banner-overview-container\" [hidden]=\"!content?.purpose && showSubtitleOnBanner\"\n *ngSwitchCase=\"'overview'\">\n <h3 class=\"overview-description mat-body-1\" *ngIf=\"showSubtitleOnBanner\" i18n-title title=\"Subtitle\">\n {{ content?.source | pipeLimitTo: 250 }}\n </h3>\n <p class=\"overview-description mat-body-1\" *ngIf=\"!showSubtitleOnBanner\" i18n-title title=\"Description\">\n {{ content?.instructions | pipeLimitTo: 450 }}\n </p>\n <div *ngIf=\"sanitizedIntroductoryVideoIcon\" class=\"overview-intro ws-mat-primary-lite-background\"\n [style.backgroundImage]=\"sanitizedIntroductoryVideoIcon\" role=\"button\" (click)=\"playIntroVideo()\">\n <mat-icon role=\"button\" class=\"overview-intro-overlay\">play_arrow</mat-icon>\n </div>\n </div>\n <!-- Toc Section -->\n <div *ngSwitchCase=\"'contents'\">\n <!-- Contents Banner -->\n </div>\n <!-- Analytics Section -->\n <div class=\"banner-overview-container mat-body-1\" [hidden]=\"!content?.purpose && showSubtitleOnBanner\"\n *ngSwitchCase=\"'analytics'\">\n <h3 class=\"overview-description mat-body-1\" *ngIf=\"showSubtitleOnBanner\" i18n-title title=\"Subtitle\">\n {{ content?.purpose | pipeLimitTo: 250 }}\n </h3>\n <p class=\"overview-description mat-body-1\" *ngIf=\"!showSubtitleOnBanner\" i18n-title title=\"Description\">\n {{ content?.instructions | pipeLimitTo: 450 }}\n </p>\n <div *ngIf=\"sanitizedIntroductoryVideoIcon\" class=\"overview-intro ws-mat-primary-lite-background\"\n [style.backgroundImage]=\"sanitizedIntroductoryVideoIcon\" role=\"button\" (click)=\"playIntroVideo()\">\n <mat-icon role=\"button\" class=\"overview-intro-overlay\">play_arrow</mat-icon>\n </div>\n </div>\n </div>\n <div *ngIf=\"content?.averageRating\" class=\"flex items-center rating margin-bottom-m\">\n <span class=\"rating-number mat-body-2\">{{ content?.averageRating }}&nbsp;</span>\n <mat-icon class=\"mat-icon material-icons\" *ngFor=\"let rating of [1, 2, 3, 4, 5]\">\n {{ getRatingIcon(rating) }}</mat-icon>\n <span class=\"margin-left-xs rating-count mat-body-2\" *ngIf=\"content?.totalRating\">\n ( {{ content?.totalRating | pipeCountTransform }} )</span>\n </div>\n <div *ngIf=\"!content?.averageRating\" class=\"flex items-center rating margin-bottom-m\">\n <span class=\"rating-number mat-body-2\"> 0.0 &nbsp;</span>\n <mat-icon class=\"mat-icon material-icons\" *ngFor=\"let rating of [1, 2, 3, 4, 5]\">\n {{ getRatingIcon(rating) }}</mat-icon>\n <span class=\"margin-left-xs rating-count mat-body-2\" *ngIf=\"!content?.totalRating\">\n ( {{ 0 | pipeCountTransform }} )</span>\n </div>\n <!-- tags -->\n <div class=\"tags margin-bottom-s\" *ngIf=\"content?.keywords && content?.keywords?.length > 0\">\n <span *ngFor=\"let tag of content.keywords\" class=\"tag\">\n {{tag}}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"batch-div\">\n <div class=\"request-block\">\n <ng-container *ngIf=\"content\" [ngTemplateOutlet]=\"batchDropdown\"></ng-container>\n <ng-container\n *ngIf=\"batchData && !batchData?.enrolled && batchData?.workFlow?.wfInitiated &&\n (batchData?.workFlow?.wfItem?.currentStatus !== WFBlendedProgramStatus.REJECTED) && (batchData?.workFlow?.wfItem?.currentStatus !== WFBlendedProgramStatus.REMOVED) &&\n (batchData?.workFlow?.wfItem?.currentStatus !== WFBlendedProgramStatus.WITHDRAWN) &&\n (batchData?.workFlow?.wfItem?.currentStatus !== WFBlendedProgramStatus.APPROVED) && batchData?.content?.length\">\n <p class=\"margin-remove-bottom mat-body-1 padding-m bg-white\">\n {{batchData?.workFlow?.batch?.name}} - ({{batchData?.workFlow?.batch?.startDate | date: 'dd-MM-yyyy'}} -\n {{batchData?.workFlow?.batch?.endDate | date: 'dd-MM-yyyy' || 'present'}})\n </p>\n <ng-container>\n <button class=\"withdraw-batch\" (click)=\"!disableWithdrawnBtn && requestToWithdrawDialog()\"\n [disabled]=\"disableWithdrawnBtn\" [ngClass]=\"{ 'disable-btn': disableWithdrawnBtn }\">\n <ng-container> {{ 'apptocbanner.withDrawYourRequest' | translate }} </ng-container>\n </button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"batchData && batchData?.enrolled && batchData?.content?.length\">\n <h3 class=\"margin-remove-bottom p-4 bg-white mat-body-1\" *ngFor=\"let batch of batchData.content\">\n {{batch?.name}} ({{batch?.startDate | date: 'dd-MM-yyyy' }} - {{batch?.endDate | date: 'dd-MM-yyyy' ||\n 'present'}})\n </h3>\n <ng-container [ngTemplateOutlet]=\"statusMsg\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"batchData && !batchData?.enrolled && !batchData?.content?.length\">\n <h3 class=\"margin-remove-bottom mat-body-2 ws-default-text\">\n No batches\n </h3>\n </ng-container>\n </div>\n <!-- <ng-container *ngIf=\"batchData && batchData?.content?.length && batchData?.content[0]?.batchAttributes?.batchLocationDetails\">\n <div class=\"flex items-center location-wrapper\">\n <div>\n <mat-icon class=\"location-icon\">\n location_on</mat-icon>\n </div>\n <div class=\"loc-details\">\n {{batchData?.content[0]?.batchAttributes?.batchLocationDetails}}\n </div>\n </div>\n </ng-container> -->\n </div>\n <ng-container *ngIf=\"batchData && !batchData?.enrolled && batchData?.content?.length\"\n [ngTemplateOutlet]=\"statusMsg\"></ng-container>\n</ng-container>\n<ng-container *ngIf=\"content?.courseCategory === nsContent.ECourseCategory.MODERATED_PROGRAM\">\n <div class=\"request-batch\">\n <div class=\"batch-div\">\n <ng-container *ngIf=\"content\" [ngTemplateOutlet]=\"batchDropdown\"></ng-container>\n </div>\n </div>\n</ng-container>\n<!-- <div class=\"header-synopsis fixed-width margin-top-l\" [ngClass]=\"{ 'header-synopsis-gradient': bannerUrl }\" *ngIf=\"content && batchControl?.value?.batchAttributes?.batchLocationDetails\">\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <h2>{{'apptocbanner.batchLocation' | translate}}</h2>\n <p>{{batchControl?.value?.batchAttributes?.batchLocationDetails}}</p>\n </ng-container>\n</div> -->\n\n<mat-menu #actionMenu=\"matMenu\">\n <div mat-menu-item>\n <ng-container *ngIf=\"content\" [ngTemplateOutlet]=\"actions\"></ng-container>\n </div>\n</mat-menu>\n\n<ng-template #actions>\n <a i18n-aria-label aria-label=\"Take Action\" mat-icon-button *ngIf=\"reviewButton\"\n [routerLink]=\"['/author/editor/' + content?.identifier]\">\n <mat-icon>publish</mat-icon>\n </a>\n <ws-widget-btn-content-download id=\"prevfordownload\" [forPreview]=\"forPreview\"\n [widgetData]=\"content | pipePartialContent : ['identifier', 'contentType', 'resourceType', 'mimeType', 'downloadUrl', 'isExternal', 'artifactUrl']\">\n </ws-widget-btn-content-download>\n <ws-widget-btn-content-share id=\"prevforshare\" [forPreview]=\"forPreview\" [widgetData]=\"content\">\n </ws-widget-btn-content-share>\n <ws-widget-btn-kb [forPreview]=\"forPreview\" id=\"prev\" [contentId]=\"content?.identifier\"\n [contentName]=\"contentReadData?.name\" [contentType]=\"content?.contentType\" [status]=\"content?.status\">\n </ws-widget-btn-kb>\n <ws-widget-btn-goals [forPreview]=\"forPreview\" id=\"goalsforprev\" *ngIf=\"isGoalsEnabled && btnGoalsConfig\"\n [widgetData]=\"btnGoalsConfig\">\n </ws-widget-btn-goals>\n <ws-widget-btn-playlist [forPreview]=\"forPreview\" id=\"playlistforprev\" *ngIf=\"btnPlaylistConfig\"\n [widgetData]=\"btnPlaylistConfig\">\n </ws-widget-btn-playlist>\n <ws-widget-btn-content-feedback-v2 [forPreview]=\"forPreview\" id=\"feedbackforprev\"\n [widgetData]=\"content | pipePartialContent: ['identifier', 'name']\">\n </ws-widget-btn-content-feedback-v2>\n</ng-template>\n<ng-template #authView>{{'apptocbanner.view' | translate}}</ng-template>\n<ng-template #statusMsg>\n <div class=\"status-container mt-2 mb-2\"\n *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && batchData?.workFlow?.wfInitiated\">\n <div class=\"flex\" *ngIf=\"showMsg\">\n <ng-container *ngIf=\"showIcon\">\n <mat-icon class=\"mr-4\" [ngClass]=\"iconColor\" *ngIf=\"WFIcon === 'circle'\">check_circle</mat-icon>\n <mat-icon class=\"mr-4 ws-mat-red-text visibility-show\" style=\"transform: rotate(180deg);\"\n *ngIf=\"WFIcon === 'info'\">info</mat-icon>\n </ng-container>\n <div class=\"mat-body-1\">{{ getWFMsg }}</div>\n </div>\n </div>\n <div class=\"status-container mt-5\"\n *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && showDisableMsg && !showMsg && findMessage.length > 0\">\n <div class=\"flex\">\n <ng-container>\n <mat-icon class=\"mr-3 ws-mat-red-text\" style=\"transform: rotate(180deg);\">info</mat-icon>\n </ng-container>\n <div class=\"mat-body-1\">\n <p class=\"margin-remove-bottom \">{{findMessage}}</p>\n </div>\n </div>\n </div>\n</ng-template>\n\n<div class=\"share-container\" *ngIf=\"enableShare\">\n <div *ngIf=\"showLoader\" class=\"text-center my-2 loader\">\n <mat-spinner class=\"inline-block\"></mat-spinner>\n </div>\n <div class=\"cursor-pointer close-share-dialog\"><mat-icon (click)=\"onClose()\" class=\"close-icon\">close</mat-icon></div>\n <div class=\"share-modal\">\n <div class=\"karmasahayogi-icon\"><img alt=\"karmasahayogi-icon\" src=\"/assets/icons/KarmaSahayogi.svg\"></div>\n <div class=\"content-div\">\n <div class=\"triangle-left hidden md:block\"></div>\n <div class=\"contnet\">\n <section class=\"w-full flex align-center justify-between \">\n <div class=\"mb-2\">\n <h2 class=\"mat-headline margin-remove-bottom ws-mat-black-text\">{{'contentSharing.header' | translate}}</h2>\n </div>\n </section>\n <form [formGroup]=\"shareForm\">\n <div class=\"mat-body-2\">\n <div class=\"md-5\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-chip-list #chipList aria-label=\"user selection\" appearance=\"outline\">\n <mat-chip *ngFor=\"let user of users\" [selectable]=\"selectable\" [removable]=\"removable\"\n (removed)=\"remove(user)\">\n {{user}}\n <mat-icon matChipRemove *ngIf=\"removable\">close</mat-icon>\n </mat-chip>\n <input tabindex=\"-1\" class=\"inputTextBox\"\n placeholder=\"{{users.length === 0 ? translateLabels('placehoderText', 'contentSharing') : ''}}\"\n #userInput formControlName=\"review\" [formControl]=\"userCtrl\" [matAutocomplete]=\"auto\"\n [matChipInputFor]=\"chipList\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [matChipInputAddOnBlur]=\"addOnBlur\" (matChipInputTokenEnd)=\"add($event)\">\n </mat-chip-list>\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\n <mat-option *ngFor=\"let user of filteredUsers\" [value]=\"user.name\">\n <div class=\"flex\">\n <div class=\"iconDiv\">\n <span class=\"iconText\">{{user.iconText.substring(0,2)}}</span>\n </div>\n <div>\n <div>{{user.name}}</div>\n <div class=\"emailText\">{{user.maskedEmail}}</div>\n </div>\n </div>\n </mat-option>\n </mat-autocomplete>\n <mat-hint align=\"start\" class=\"left-over-emails\">{{'contentSharing.note' | translate}}</mat-hint>\n <mat-hint align=\"end\" class=\"left-over-emails\">{{ users.length }} /{{maxEmailsLimit}}\n {{'contentSharing.remaingEmails' | translate}}</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"flex mt-5\">\n <div class=\"flex flex-1 flex-end\">\n <span class=\"copy-link-btn cursor-pointer\" (click)=\"copyToClipboard()\">{{'contentSharing.copyLink' |\n translate}} &nbsp;&nbsp;<mat-icon>link</mat-icon></span>\n <button mat-stroked-button type=\"submit\"\n [ngClass]=\"{'disable-send-btn': users.length === 0 || users.length}\"\n class=\"text-white ws-mat-primary-background flex-auto-display send-btn\"\n [disabled]=\"userCtrl.value.length || users.length === 0 || users.length > maxEmailsLimit\"\n (click)=\"submitSharing()\">\n {{'contentSharing.send' | translate}} &nbsp; <mat-icon>send</mat-icon>\n </button>\n </div>\n </div>\n\n </div>\n </form>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #batchDropdown>\n <form class=\"flex flex-col gap-4\">\n <ng-container *ngIf=\"batchData && !batchData?.enrolled\n && (!batchData.workFlow?.wfInitiated || (batchData.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REMOVED))\n && batchData?.content?.length\">\n <mat-form-field appearance=\"outline\" class=\"w-full batch-form-field\">\n <mat-select #batchControlData [formControl]=\"batchControl\" required autoSelctFirstOption\n (selectionChange)=\"batchChange($event)\" panelClass=\"batch-dropdown\">\n <mat-option *ngFor=\"let batch of batchData.content; let i=index\" [value]=\"batch\" selected=\"index === 0\"\n [disabled]=\"!handleEnrollmentEndDate(batch) || disableEnrollBtn \">\n <div class=\"flex flex-row items-center gap-2\">\n <div class=\"flex-1 text-sm batch-timings\">\n {{ batch.name }} ( {{ batch.startDate | date: 'd MMM, yyyy' }} - {{ batch.endDate | date: 'd MMM, yyyy'\n || 'present' }} )\n </div>\n <div class=\"expired\" *ngIf=\"!handleEnrollmentEndDate(batch) || disableEnrollBtn\">\n Expired\n </div>\n </div>\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"batchControl.hasError('required')\">Please choose a batch to start course</mat-error>\n </mat-form-field>\n <div class=\"flex flex-wrap gap-3\">\n <ng-container *ngIf=\"!showRejected\">\n <div class=\"flex-1\">\n <div class=\"flex flex-col gap-1\" *ngIf=\"selectedBatch && selectedBatch.enrollmentEndDate \">\n <p class=\"text-xs leading-4 mb-0\">Last enroll date</p>\n <p class=\"font-bold mb-0\">{{ selectedBatch.enrollmentEndDate | date: 'd MMM, y' }}</p>\n </div>\n </div>\n <div class=\"flex flex-row justify-center items-center\">\n <button class=\"enroll-button\"\n [ngClass]=\"{ 'disable-btn': disableEnrollBtn || batchControl.hasError('required') || !handleEnrollmentEndDate(selectedBatch) }\"\n [disabled]=\"disableEnrollBtn || batchControl.hasError('required')|| !handleEnrollmentEndDate(selectedBatch)\"\n (click)=\"requestToEnrollDialog()\">\n <ng-container>\n Request to enroll\n </ng-container>\n </button>\n </div>\n </ng-container>\n <ng-container *ngIf=\"showRejected && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <h3 class=\"margin-remove-bottom mat-body-2 ws-default-text\">\n Your enrollment request is {{batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REMOVED\n ?'removed':'rejected'}}.</h3>\n </ng-container>\n </div>\n </ng-container>\n </form>\n</ng-template>", styles: [".button,.batch-div .enroll-button,.batch-div .withdraw-batch{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}.batch-div{border-radius:8px;background-color:#fdead5;max-width:400px;margin:0 auto}.batch-div .request-block{padding:16px}.batch-div .batch-details{padding:16px;border:1px solid #FF9800;border-radius:8px;background-color:#fff;cursor:pointer}.batch-div .batch-enrolled{font-weight:700;color:#4caf50;font-size:.75rem}.batch-div .withdraw-batch{color:#000000de;border:1px solid rgba(0,0,0,.8705882353);background-color:#fff;width:100%;margin-top:16px}.batch-div .enroll-button{color:#fff;background-color:#ff9800;border:1px solid #FF9800}::ng-deep .batch-dropdown{margin-top:3rem!important}::ng-deep .batch-dropdown .mat-option{height:fit-content!important;padding:12px 16px!important}::ng-deep .batch-form-field{height:64px}::ng-deep .batch-form-field .mat-form-field-wrapper{margin:0;padding-bottom:0;height:inherit}::ng-deep .batch-form-field .mat-form-field-wrapper .mat-form-field-flex{height:inherit}::ng-deep .batch-form-field .mat-form-field-outline{border-radius:8px;height:inherit}::ng-deep .batch-form-field .mat-form-field-infix{display:flex;align-items:center;font-size:14px;border-top:.35rem solid transparent;padding:8px 0;height:44px}::ng-deep .batch-form-field .mat-form-field-infix .mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:translateY(0)!important}::ng-deep .batch-form-field .mat-form-field-subscript-wrapper{padding:8px 4px!important}::ng-deep .batch-form-field .mat-form-field-subscript-wrapper .mat-error{margin-top:6px}::ng-deep .batch-form-field .mat-select-value-text{white-space:pre-line!important;line-height:21px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.disable-btn{opacity:.5}.mb-0{margin-bottom:0!important}.batch-timings{text-transform:uppercase;line-height:20px}.header-synopsis{padding:32px 64px}@media only screen and (max-width: 599px){.header-synopsis{padding:32px 24px}}.app-icon{height:180px;width:280px;border-radius:4px}.banner-container{position:relative;background-repeat:no-repeat;background-position:center;background-size:cover}.header-synopsis-gradient{background:inherit}.category-text{margin-left:8px}.fixed-width{max-width:1230px;display:block;margin:0 auto;padding:0!important}@media only screen and (min-width: 600px) and (max-width: 959px){.fixed-width{padding:0 15px!important}}@media only screen and (max-width: 599px){.fixed-width{padding:0 15px!important}}.fluid-width{width:100%}.header-synopsis{box-sizing:border-box}.header-synopsis .apIcon{background-color:#fff;margin-right:16px;padding:4px 8px;border-radius:16px;display:flex;align-items:center;justify-content:flex-start}.header-synopsis .apIcon img{height:15px;object-fit:contain}.header-synopsis .apIcon span{opacity:1;color:#0009;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.header-synopsis .header-title{display:flex}.header-synopsis .header-title .text-truncate-title{max-width:100%;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important}.header-synopsis .rating .mat-icon{width:16px;height:16px;display:inline-table;color:#f69953;font-size:18px}.header-synopsis .rating .rating-number{letter-spacing:0px;color:#f69953}.header-synopsis .rating .rating-count{letter-spacing:.36px;color:#f69953}.header-synopsis .rating .rating mat-icon{color:#f69953}.header-synopsis .header-meta{line-height:1.5}.header-synopsis .resumeButton{height:52px;min-width:160px;display:flex;align-items:center;justify-content:center;background:#34d6a4 0% 0% no-repeat padding-box;box-shadow:0 10px 30px #9993;color:#fff!important}.header-synopsis .resumeButton ::ng-deep .mat-button-wrapper{letter-spacing:0px;color:#fff;text-transform:capitalize}.header-synopsis .header-actions{display:flex}.header-synopsis .header-actions .custom-button{background:#0074b6 0% 0% no-repeat padding-box;border-radius:4px}.header-synopsis .header-actions.top{margin-top:0;margin-bottom:40px}.header-synopsis .header-actions .action-btns{margin-left:auto;order:2}.banner-overview-container{display:flex;justify-content:space-between}.banner-overview-container .overview-description{flex:1;min-width:1px;margin-right:24px;margin-bottom:12px;opacity:1;color:#000000de;font-size:16px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:24px}@media only screen and (max-width: 599px){.banner-overview-container .overview-description{margin-right:0}}.banner-overview-container .overview-intro{width:240px;height:135px;border:1px solid;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover;background-attachment:fixed;position:relative}.banner-overview-container .overview-intro .overview-intro-overlay{cursor:pointer;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;width:48px;height:48px;font-size:48px;background-color:#00000080;border-radius:50%;padding:8px}.banner-overview-container .overview-intro .overview-intro-overlay:active{background-color:#000000b3}@media only screen and (max-width: 599px){.banner-overview-container .overview-intro{display:none}}.analytics-meta{font-weight:500;margin-bottom:12px;line-height:1.2}.hidden-block-xs{display:block}@media only screen and (max-width: 599px){.hidden-block-xs{display:none}}.visible-block-xs{display:none}@media only screen and (max-width: 599px){.visible-block-xs{display:block}}.hidden-block-s{display:block}@media only screen and (min-width: 600px) and (max-width: 959px){.hidden-block-s{display:none}}.visible-block-s{display:none}@media only screen and (min-width: 600px) and (max-width: 959px){.visible-block-s{display:block}}.info-msg{color:#fff!important}.info-msg mat-icon{color:#fff!important}.tags{display:flex;flex:1;flex-direction:row;flex-wrap:wrap;position:relative;z-index:1}.tags .tag{display:inline-block;border-radius:100px 4px 4px 100px;padding:1px 12px;width:auto;justify-content:space-between;margin:0 8px 8px 0;background-color:#0000000a;border:1px solid rgba(0,0,0,.08);box-sizing:border-box}.batch-container{max-width:435px;border-radius:4px;width:40%}.custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px;max-width:auto!important;height:42px!important}.sticky-banner{z-index:999;position:sticky;top:128px}.sticky-banner .header-title h1{font:normal normal 300 24px/35px}.sticky-banner .overview-description{font:normal normal 300 14px/21px}.batch-wrapper{display:flex;justify-content:space-between;gap:25px;width:100%}.batch-timer{width:60%;background-color:#fff;align-items:center}.batch-timer .timer-title{opacity:1;color:#0006;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.25px;text-align:left;line-height:20px}.batch-timer .time-wrapper div p.count{border-radius:4px;background-color:#000000de;opacity:1;color:#fff;font-size:36px;font-weight:600;font-style:normal;letter-spacing:-.2px;text-align:center;line-height:48px;width:67px;height:47px;margin-bottom:4px}.batch-timer .time-wrapper div p.time-label{opacity:1;color:#000000de;font-size:10px;font-weight:400;font-style:normal;letter-spacing:.5px;text-align:center;line-height:12px}.batch-timer .time-wrapper span{padding:8px;font-size:36px}.batch-timer .help{width:100%}.batch-timer .help .batch-duration-wrap{padding:0 24px}.batch-timer .help .batch-duration-wrap .duration-days{opacity:1;color:#000000de;font-family:Montserrat-SemiBold;font-size:36px;font-weight:600;font-style:normal;letter-spacing:-.2px;text-align:left;line-height:48px;padding-bottom:16px}.batch-info{opacity:1;color:#000000de;font-size:14px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:20px;padding:26px}.disable-send-btn[disabled]{background-color:#000!important}@media (max-width: 768px){.batch-wrapper{flex-wrap:wrap}.batch-timer{width:100%;flex-wrap:wrap;justify-content:center}.batch-container{width:100%}}.share-container{position:fixed;height:100vh;background:#131313a3;width:100vw;top:0;left:0;z-index:1000}.share-modal{display:flex;align-items:center;justify-content:center;height:inherit;width:inherit}.karmasahayogi-icon{position:absolute;bottom:-5px;left:calc(50% - 464px)}.triangle-left{transform:translateY(100%);position:absolute;bottom:28%;left:-24px;width:0;height:0;border-top:24px solid transparent;border-right:48px solid #ffffff;border-bottom:24px solid transparent}.contnet{background-color:#fff;width:612px;border-radius:12px;padding:16px}.content-div{position:relative}.copy-link-btn{display:flex;align-items:center;margin-right:20px;color:red;color:#0074b6!important;font-weight:600}.copy-link-btn:hover{background-color:none!important}.send-btn{border-radius:20px}.send-btn .mat-icon{margin-bottom:2.5px}::ng-deep .mat-chip-list-wrapper{height:100px;overflow:auto;display:block!important;scroll-behavior:smooth}.iconText{border-radius:50%;background-color:#000;color:#fff;width:30px;display:inline-block;text-align:center;height:30px;display:flex;align-items:center;justify-content:center}.iconDiv{margin-right:8px}.emailText{opacity:.6}button:disabled{pointer-events:none;opacity:.5;color:#000}::ng-deep .mat-autocomplete-panel{z-index:99999}::ng-deep .cdk-overlay-pane{z-index:9999!important}::ng-deep .close-icon{background-color:#000;color:#fff;border-radius:16px;padding:4px}::ng-deep .mat-chip-input{padding-bottom:8px!important}::ng-deep .theme-igot.day-mode .mat-chip.mat-standard-chip{color:#0074b6!important}::ng-deep .theme-igot.day-mode .mat-chip.mat-standard-chip mat-icon{color:#0074b6!important}::ng-deep .inputTextBox{width:95%!important;overflow-x:hidden}.close-share-dialog{position:absolute;right:30px;top:30px}.left-over-emails{font-weight:600}.loader{position:absolute;top:42%;left:45%;z-index:1000}@media (max-width: 768px){.content-div{width:100%}.contnet{width:unset;margin-bottom:18%}.left-over-emails{display:none}.karmasahayogi-icon{left:8%;bottom:20%}.share-modal{align-items:self-end}}@media only screen and (min-device-width: 820px) and (max-device-width: 1180px){.karmasahayogi-icon{left:calc(50% - 387px)}.content{width:500px}}@media only screen and (min-device-width: 768px) and (max-device-width: 819px){.triangle-left{display:none}}.location-wrapper{padding:16px;border-top:1px solid rgba(0,0,0,.16)}.location-wrapper .location-icon{color:#1b4ca1;height:32px;width:32px;font-size:32px;padding-right:8px}.location-wrapper .loc-details{opacity:1;color:#000000de;font-family:Lato-Bold;font-size:14px;font-weight:700;font-style:Bold;letter-spacing:.25px;text-align:left;line-height:20px}.visibility-show{overflow:visible!important}\n"] }]
1404
- }], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i3.MatLegacyDialog }, { type: i4.AppTocService }, { type: i5.WidgetContentService }, { type: i6.UtilityService }, { type: i7.MobileAppsService }, { type: i8.MatLegacySnackBar }, { type: i6.ConfigurationsService }, { type: i9.TitleTagService }, { type: i10.ActionService }, { type: i6.LoggerService }, { type: i11.DatePipe }, { type: i12.TranslateService }, { type: i13.UserAutocompleteService }, { type: i6.EventService }, { type: i6.MultilingualTranslationsService }, { type: i14.TimerService }, { type: undefined, decorators: [{
1405
- type: Inject,
1406
- args: ['environment']
1407
- }] }]; }, propDecorators: { banners: [{
1408
- type: Input
1409
- }], content: [{
1410
- type: Input
1411
- }], resumeData: [{
1412
- type: Input
1413
- }], analytics: [{
1414
- type: Input
1415
- }], forPreview: [{
1416
- type: Input
1417
- }], batchData: [{
1418
- type: Input
1419
- }], userEnrollmentList: [{
1420
- type: Input
1421
- }], withdrawOrEnroll: [{
1422
- type: Output
1423
- }], contentReadData: [{
1424
- type: Input
1425
- }], clickToShare: [{
1426
- type: Input
1427
- }], programEnrollCall: [{
1428
- type: Output
1429
- }], userInput: [{
1430
- type: ViewChild,
1431
- args: ['userInput']
1432
- }], matAutocomplete: [{
1433
- type: ViewChild,
1434
- args: ['auto']
1435
- }] } });
1436
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1iYW5uZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL2NvbXBvbmVudHMvYXBwLXRvYy1iYW5uZXIvYXBwLXRvYy1iYW5uZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL2NvbXBvbmVudHMvYXBwLXRvYy1iYW5uZXIvYXBwLXRvYy1iYW5uZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBMEMsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFHNUosT0FBTyxFQUF5QixhQUFhLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0NBQXNDLENBQUE7QUFFaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUE7QUFDeEUsT0FBTyxFQUFzRSxRQUFRLEVBQWlELE1BQU0sc0JBQXNCLENBQUE7QUFDbEssT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sbUVBQW1FLENBQUE7QUFDMUcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUE7QUFRNUUsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sb0VBQW9FLENBQUE7QUFFcEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ2pGLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLEtBQU0sTUFBTSxNQUFNLFFBQVEsQ0FBQTtBQUdqQywyQkFBMkI7QUFDM0IsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFB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QUs7Z0JBQ0ksaUJBQWlCO3NCQUExQixNQUFNO2dCQStIaUIsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNILGVBQWU7c0JBQWpDLFNBQVM7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuLy8gaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlLCBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50LCBNYXRDaGlwSW5wdXRFdmVudCwgTWF0RGlhbG9nLCBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJ1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlU3R5bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJ1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIEV2ZW50LCBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInXG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICcuLi8uLi9fc2VydmljZXMvd2lkZ2V0LWNvbnRlbnQubW9kZWwnXG5pbXBvcnQgeyBXaWRnZXRDb250ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5zZXJ2aWNlJ1xuaW1wb3J0IHsgdmlld2VyUm91dGVHZW5lcmF0b3IgfSBmcm9tICcuLi8uLi9fc2VydmljZXMvdmlld2VyLXJvdXRlLXV0aWwnXG5pbXBvcnQgeyBURmV0Y2hTdGF0dXMsIFV0aWxpdHlTZXJ2aWNlLCBDb25maWd1cmF0aW9uc1NlcnZpY2UsIExvZ2dlclNlcnZpY2UsIFdzRXZlbnRzLCBFdmVudFNlcnZpY2UsIE11bHRpbGluZ3VhbFRyYW5zbGF0aW9uc1NlcnZpY2UgfSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12MidcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9fY29sbGVjdGlvbi9fY29tbW9uL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudCdcbmltcG9ydCB7IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWNjZXNzLWNvbnRyb2wuc2VydmljZSdcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBOc0FuYWx5dGljcyB9IGZyb20gJy4uLy4uL21vZGVscy9hcHAtdG9jLWFuYWx5dGljcy5tb2RlbCdcbmltcG9ydCB7IE5zQXBwVG9jIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FwcC10b2MubW9kZWwnXG5pbXBvcnQgeyBOc1BsYXlsaXN0IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BsYXlsaXN0Lm1vZGVsJ1xuaW1wb3J0IHsgTnNHb2FsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dvYWwubW9kZWwnXG5pbXBvcnQgeyBBcHBUb2NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXBwLXRvYy5zZXJ2aWNlJ1xuaW1wb3J0IHsgVXNlckF1dG9jb21wbGV0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9fY29sbGVjdGlvbi9fY29tbW9uL3VzZXItYXV0b2NvbXBsZXRlL3VzZXItYXV0b2NvbXBsZXRlLnNlcnZpY2UnXG5pbXBvcnQgeyBBcHBUb2NEaWFsb2dJbnRyb1ZpZGVvQ29tcG9uZW50IH0gZnJvbSAnLi4vYXBwLXRvYy1kaWFsb2ctaW50cm8tdmlkZW8vYXBwLXRvYy1kaWFsb2ctaW50cm8tdmlkZW8uY29tcG9uZW50J1xuaW1wb3J0IHsgTW9iaWxlQXBwc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2JpbGUtYXBwcy5zZXJ2aWNlJ1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXG5pbXBvcnQgKiBhcyAgbG9kYXNoIGZyb20gJ2xvZGFzaCdcbmltcG9ydCB7IFRpdGxlVGFnU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RpdGxlLXRhZy5zZXJ2aWNlJ1xuaW1wb3J0IHsgQWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FjdGlvbi5zZXJ2aWNlJ1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbidcbmltcG9ydCBpc1NhbWVPckJlZm9yZSBmcm9tICdkYXlqcy9wbHVnaW4vaXNTYW1lT3JCZWZvcmUnXG5pbXBvcnQgaXNTYW1lT3JBZnRlciBmcm9tICdkYXlqcy9wbHVnaW4vaXNTYW1lT3JBZnRlcidcbmltcG9ydCB7IEVucm9sbFF1ZXN0aW9ubmFpcmVDb21wb25lbnQgfSBmcm9tICcuLi9lbnJvbGwtcXVlc3Rpb25uYWlyZS9lbnJvbGwtcXVlc3Rpb25uYWlyZS5jb21wb25lbnQnXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSdcbmltcG9ydCB7IEVOVEVSIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJ1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgVGltZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGltZXIuc2VydmljZSdcbmltcG9ydCB7IE1hdExlZ2FjeUF1dG9jb21wbGV0ZSBhcyBNYXRBdXRvY29tcGxldGUsIE1hdExlZ2FjeUF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQgYXMgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1hdXRvY29tcGxldGUnXG5pbXBvcnQgeyBNYXRMZWdhY3lDaGlwSW5wdXRFdmVudCBhcyBNYXRDaGlwSW5wdXRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1jaGlwcydcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJ1xuaW1wb3J0IHsgTWF0TGVnYWN5U25hY2tCYXIgYXMgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktc25hY2stYmFyJ1xuaW1wb3J0IHsgRW5yb2xsUHJvZmlsZUZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9lbnJvbGwtcHJvZmlsZS1mb3JtL2Vucm9sbC1wcm9maWxlLWZvcm0uY29tcG9uZW50J1xuXG5kYXlqcy5leHRlbmQoaXNTYW1lT3JCZWZvcmUpXG5kYXlqcy5leHRlbmQoaXNTYW1lT3JBZnRlcilcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd3MtYXBwLXRvYy1iYW5uZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXRvYy1iYW5uZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hcHAtdG9jLWJhbm5lci5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtBY2Nlc3NDb250cm9sU2VydmljZSwgRGF0ZVBpcGVdLFxufSlcblxuZXhwb3J0IGNsYXNzIEFwcFRvY0Jhbm5lckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBzaG93ID0gZmFsc2VcbiAgQElucHV0KCkgYmFubmVyczogTnNBcHBUb2MuSVRvY0Jhbm5lciB8IG51bGwgPSBudWxsXG4gIEBJbnB1dCgpIGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBudWxsXG4gIEBJbnB1dCgpIHJlc3VtZURhdGE6IE5zQ29udGVudC5JQ29udGludWVMZWFybmluZ0RhdGEgfCBudWxsID0gbnVsbFxuICBASW5wdXQoKSBhbmFseXRpY3M6IE5zQW5hbHl0aWNzLklBbmFseXRpY3MgfCBudWxsID0gbnVsbFxuICBASW5wdXQoKSBmb3JQcmV2aWV3ID0gZmFsc2VcbiAgQElucHV0KCkgYmF0Y2hEYXRhOiAvKipOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlICovIGFueSB8IG51bGwgPSBudWxsXG4gIEBJbnB1dCgpIHVzZXJFbnJvbGxtZW50TGlzdDogTnNDb250ZW50LklDb3Vyc2VbXSB8IG51bGwgPSBudWxsXG4gIEBPdXRwdXQoKSB3aXRoZHJhd09yRW5yb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KClcbiAgQElucHV0KCkgY29udGVudFJlYWREYXRhOiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxuICBASW5wdXQoKSBjbGlja1RvU2hhcmUgPSBmYWxzZVxuICBAT3V0cHV0KCkgcHJvZ3JhbUVucm9sbENhbGwgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKVxuICB0aW1lcjogYW55XG4gIG5zQ29udGVudCA9IE5zQ29udGVudFxuICBiYXRjaENvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuICBwcmltYXJ5Q2F0ZWdvcnkgPSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeVxuICBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzID0gTnNDb250ZW50LldGQmxlbmRlZFByb2dyYW1TdGF0dXNcbiAgV0ZTVEFUVVNfTVNHX01BUFBJTkcgPSBOc0NvbnRlbnQuV0ZTVEFUVVNfTVNHX01BUFBJTkdcbiAgY29udGVudFByb2dyZXNzID0gMFxuICBiYW5uZXJVcmw6IFNhZmVTdHlsZSB8IG51bGwgPSBudWxsXG4gIHJvdXRlUGF0aCA9ICdvdmVydmlldydcbiAgdmFsaWRQYXRocyA9IG5ldyBTZXQoWydvdmVydmlldycsICdjb250ZW50cycsICdhbmFseXRpY3MnXSlcbiAgcm91dGVyUGFyYW1TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIHJvdXRlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBiYXRjaFdGRGF0YVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcbiAgZmlyc3RSZXNvdXJjZUxpbms6IHsgdXJsOiBzdHJpbmc7IHF1ZXJ5UGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IH0gfCBudWxsID0gbnVsbFxuICByZXN1bWVEYXRhTGluazogeyB1cmw6IHN0cmluZzsgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfSB8IG51bGwgPSBudWxsXG4gIGlzQXNzZXNzVmlzaWJsZSA9IGZhbHNlXG4gIGlzUHJhY3RpY2VWaXNpYmxlID0gZmFsc2VcbiAgZWRpdEJ1dHRvbiA9IGZhbHNlXG4gIHJldmlld0J1dHRvbiA9IGZhbHNlXG4gIGFuYWx5dGljc0RhdGFDbGllbnQ6IGFueSA9IG51bGxcbiAgYnRuUGxheWxpc3RDb25maWc6IE5zUGxheWxpc3QuSUJ0blBsYXlsaXN0IHwgbnVsbCA9IG51bGxcbiAgYnRuR29hbHNDb25maWc6IE5zR29hbC5JQnRuR29hbCB8IG51bGwgPSBudWxsXG4gIGlzUmVnaXN0cmF0aW9uU3VwcG9ydGVkID0gZmFsc2VcbiAgc2hvd1JlamVjdGVkID0gZmFsc2VcbiAgY2hlY2tSZWdpc3RyYXRpb25Tb3VyY2VzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdTa2lsbFNvZnQgRGlnaXRhbGl6YXRpb24nLFxuICAgICdTa2lsbFNvZnQgTGVhZGVyc2hpcCcsXG4gICAgJ1BsdXJhbHNpZ2h0JyxcbiAgXSlcbiAgaXNVc2VyUmVnaXN0ZXJlZCA9IGZhbHNlXG4gIGFjdGlvbkJ0blN0YXR1cyA9ICd3YWl0J1xuICBzaG93SW50cmFuZXRNZXNzYWdlID0gZmFsc2VcbiAgc2hvd1Rha2VBc3Nlc3NtZW50OiBOc0FwcFRvYy5JUG9zdEFzc2Vzc21lbnQgfCBudWxsID0gbnVsbFxuICBleHRlcm5hbENvbnRlbnRGZXRjaFN0YXR1czogVEZldGNoU3RhdHVzID0gJ2RvbmUnXG4gIHJlZ2lzdGVyRm9yRXh0ZXJuYWwgPSBmYWxzZVxuICBpc0dvYWxzRW5hYmxlZCA9IGZhbHNlXG4gIGNvbnRleHRJZD86IHN0cmluZ1xuICBjb250ZXh0UGF0aD86IHN0cmluZ1xuICB0b2NDb25maWc6IGFueSA9IG51bGxcbiAgZGVmYXVsdFNMb2dvID0gJydcbiAgZGlzYWJsZUVucm9sbEJ0biA9IGZhbHNlXG4gIHNlbGVjdGVkQmF0Y2ghOiBhbnlcbiAgaGVscEVtYWlsID0gJydcbiAgc2VsZWN0ZWRCYXRjaFN1YnNjcmlwdGlvbjogYW55XG4gIHNlbGVjdGVkQmF0Y2hEYXRhOiBhbnlcbiAgYmF0Y2hDb250cm9sVW5zdWJzY3JpYmU6IGFueVxuICBkYXRlOiBhbnlcbiAgbm93OiBhbnlcbiAgdGFyZ2V0RGF0ZTogYW55XG4gIHRhcmdldFRpbWU6IGFueVxuICBkaWZmZXJlbmNlID0gMFxuICBkYXlzOiBhbnlcbiAgaG91cnM6IGFueVxuICBtaW51dGVzOiBhbnlcbiAgc2Vjb25kczogYW55XG4gIHNlcnZlckRhdGVTdWJzY3JpcHRpb246IGFueVxuICBzZXJ2ZXJEYXRlOiBhbnkgPSBuZXcgRGF0ZSgpXG4gIGNhblNoYXJlID0gZmFsc2VcbiAgZW5hYmxlU2hhcmUgPSBmYWxzZVxuICByb290T3JnSWQ6IGFueVxuICB0aW1lckludGVydmFsQ2xlYXI6IGFueVxuXG4gIC8vIHNoYXJlIGNvbnRlbnRcbiAgc2hhcmVGb3JtOiBVbnR5cGVkRm9ybUdyb3VwIHwgdW5kZWZpbmVkXG4gIHNlbGVjdGFibGUgPSB0cnVlXG4gIHJlbW92YWJsZSA9IHRydWVcbiAgYWRkT25CbHVyID0gdHJ1ZVxuICBzZXBhcmF0b3JLZXlzQ29kZXM6IG51bWJlcltdID0gW0VOVEVSXVxuICB1c2VyQ3RybCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woJycpXG4gIGZpbHRlcmVkVXNlcnM6IGFueVtdIHwgdW5kZWZpbmVkXG4gIHVzZXJzOiBhbnlbXSA9IFtdXG4gIGFsbFVzZXJzOiBhbnlbXSA9IFtdXG4gIGFwaVJlc3BvbnNlOiBhbnlcbiAgY291cnNlRGV0YWlsczogYW55XG4gIHVzZXJQcm9maWxlOiBhbnlcbiAgdXNlclByb2ZpbGVPYmplY3Q6IGFueVxuICBkb3B0RWxpZ2libGVTZXJ2aWNlc0xpc3Q6IHN0cmluZ1tdID0gW11cbiAgbWF4RW1haWxzTGltaXQgPSAzMFxuICBzaG93TG9hZGVyID0gZmFsc2VcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSB0b2NTdmM6IEFwcFRvY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb250ZW50U3ZjOiBXaWRnZXRDb250ZW50U2VydmljZSxcbiAgICBwcml2YXRlIHV0aWxpdHlTdmM6IFV0aWxpdHlTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9iaWxlQXBwc1N2YzogTW9iaWxlQXBwc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICAgcHVibGljIGNvbmZpZ1N2YzogQ29uZmlndXJhdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGFnU3ZjOiBUaXRsZVRhZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3Rpb25TVkM6IEFjdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyQXV0b0NvbXBsZXRlOiBVc2VyQXV0b2NvbXBsZXRlU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50czogRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3RyYW5zbGF0aW9uczogTXVsdGlsaW5ndWFsVHJhbnNsYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHRpbWVyU2VydmljZTogVGltZXJTZXJ2aWNlLFxuICAgIEBJbmplY3QoJ2Vudmlyb25tZW50JykgcHJpdmF0ZSBlbnZpcm9ubWVudDogYW55LFxuICApIHtcbiAgICB0aGlzLmxhbmd0cmFuc2xhdGlvbnMubGFuZ3VhZ2VTZWxlY3RlZE9ic2VydmFibGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2Vic2l0ZUxhbmd1YWdlJykpIHtcbiAgICAgICAgdGhpcy50cmFuc2xhdGUuc2V0RGVmYXVsdExhbmcoJ2VuJylcbiAgICAgICAgY29uc3QgbGFuZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3ZWJzaXRlTGFuZ3VhZ2UnKSFcbiAgICAgICAgdGhpcy50cmFuc2xhdGUudXNlKGxhbmcpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuaGVscEVtYWlsID0gdGhpcy5lbnZpcm9ubWVudC5oZWxwRW1haWxcbiAgICB0aGlzLnNoYXJlRm9ybSA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHtcbiAgICAgIHJldmlldzogbmV3IFVudHlwZWRGb3JtQ29udHJvbChudWxsLCBbVmFsaWRhdG9ycy5taW5MZW5ndGgoMSksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDIwMDApXSksXG4gICAgfSlcblxuICAgIHRoaXMudXNlckN0cmwudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICApLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZFVzZXJzID0gW11cbiAgICAgICAgLy8gdGhpcy5hbGxVc2VycyA9IFtdXG4gICAgICAgIHRoaXMuZ2V0VXNlcnNUb1NoYXJlKHJlcylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgQFZpZXdDaGlsZCgndXNlcklucHV0JykgdXNlcklucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+IHwgdW5kZWZpbmVkXG4gIEBWaWV3Q2hpbGQoJ2F1dG8nKSBtYXRBdXRvY29tcGxldGU6IE1hdEF1dG9jb21wbGV0ZSB8IHVuZGVmaW5lZFxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIHRoaXMuc2VydmVyRGF0ZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgdGhpcy5zZXJ2ZXJEYXRlU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuc2VydmVyRGF0ZS5zdWJzY3JpYmUoc2VydmVyRGF0ZSA9PiB7XG4gICAgICB0aGlzLnNlcnZlckRhdGUgPSBzZXJ2ZXJEYXRlXG4gICAgICB0aGlzLmNsZWFyQW5kQ2FsbFRpbWVyKClcbiAgICB9KVxuICAgIHRoaXMucm91dGUuZGF0YS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLnRvY0NvbmZpZyA9IGRhdGEucGFnZURhdGEuZGF0YVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmlzUG9zdEFzc2Vzc21lbnQpIHtcbiAgICAgICAgdGhpcy50b2NTdmMuZmV0Y2hQb3N0QXNzZXNzbWVudFN0YXR1cyh0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgY29uc3QgYXNzZXNzbWVudERhdGEgPSByZXMucmVzdWx0XG4gICAgICAgICAgZm9yIChjb25zdCBvIG9mIGFzc2Vzc21lbnREYXRhKSB7XG4gICAgICAgICAgICBpZiAoby5jb250ZW50SWQgPT09ICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2hvd1Rha2VBc3Nlc3NtZW50ID0gb1xuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikge1xuICAgICAgICAvLyB0aGlzLnRvY1N2Yy5mZXRjaEdldENvbnRlbnREYXRhKHRoaXMuY29udGVudC5pZGVudGlmaWVyKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgLy8gICB0aGlzLmNvbnRlbnRSZWFkRGF0YSA9IHJlcy5yZXN1bHQuY29udGVudFxuICAgICAgICAvLyB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBpbnN0YW5jZUNvbmZpZyA9IHRoaXMuY29uZmlnU3ZjLmluc3RhbmNlQ29uZmlnXG4gICAgaWYgKGluc3RhbmNlQ29uZmlnICYmIGluc3RhbmNlQ29uZmlnLmxvZ29zICYmIGluc3RhbmNlQ29uZmlnLmxvZ29zLmRlZmF1bHRTb3VyY2VMb2dvKSB7XG4gICAgICB0aGlzLmRlZmF1bHRTTG9nbyA9IGluc3RhbmNlQ29uZmlnLmxvZ29zLmRlZmF1bHRTb3VyY2VMb2dvXG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMpIHtcbiAgICAgIHRoaXMuaXNHb2Fsc0VuYWJsZWQgPSAhdGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzLmhhcygnZ29hbHMnKVxuICAgIH1cblxuICAgIHRoaXMucm91dGVTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1NYXAuc3Vic2NyaWJlKHFQYXJhbXNNYXAgPT4ge1xuICAgICAgY29uc3QgY29udGV4dElkID0gcVBhcmFtc01hcC5nZXQoJ2NvbnRleHRJZCcpXG4gICAgICBjb25zdCBjb250ZXh0UGF0aCA9IHFQYXJhbXNNYXAuZ2V0KCdjb250ZXh0UGF0aCcpXG4gICAgICBpZiAoY29udGV4dElkICYmIGNvbnRleHRQYXRoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dElkID0gY29udGV4dElkXG4gICAgICAgIHRoaXMuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aFxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLmJhdGNoV0ZEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuc2V0V0ZEYXRhU3ViamVjdC5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0QmF0Y2hDb250cm9sKClcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmxvZygnZXJyb3Igb24gYmF0Y2hXRkRhdGFTdWJzY3JpcHRpb24nKVxuICAgICAgfSxcbiAgICApXG5cbiAgICBpZiAodGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzKSB7XG4gICAgICB0aGlzLmlzUmVnaXN0cmF0aW9uU3VwcG9ydGVkID0gdGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzLmhhcygncmVnaXN0cmF0aW9uRXh0ZXJuYWwnKVxuICAgICAgdGhpcy5zaG93SW50cmFuZXRNZXNzYWdlID0gIXRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcy5oYXMoXG4gICAgICAgICdzaG93SW50cmFuZXRNZXNzYWdlRGVza3RvcCcsXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZEJhdGNoU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuZ2V0U2VsZWN0ZWRCYXRjaC5zdWJzY3JpYmUoYmF0Y2hEYXRhID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEgPSBiYXRjaERhdGFcbiAgICB9KVxuXG4gICAgdGhpcy5jaGVja1JlZ2lzdHJhdGlvblN0YXR1cygpXG4gICAgdGhpcy5yb3V0ZXJQYXJhbVN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKHJvdXRlckV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgaWYgKHJvdXRlckV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICB0aGlzLmFzc2lnblBhdGhBbmRVcGRhdGVCYW5uZXIocm91dGVyRXZlbnQudXJsKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAodGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzKSB7XG4gICAgICB0aGlzLmlzR29hbHNFbmFibGVkID0gIXRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcy5oYXMoJ2dvYWxzJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmJ0blBsYXlsaXN0Q29uZmlnID0ge1xuICAgICAgICBjb250ZW50SWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICBjb250ZW50TmFtZTogdGhpcy5jb250ZW50Lm5hbWUsXG4gICAgICAgIGNvbnRlbnRUeXBlOiB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUsXG4gICAgICAgIHByaW1hcnlDYXRlZ29yeTogdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSxcbiAgICAgICAgbW9kZTogJ2RpYWxvZycsXG4gICAgICB9XG4gICAgICB0aGlzLmJ0bkdvYWxzQ29uZmlnID0ge1xuICAgICAgICBjb250ZW50SWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICBjb250ZW50TmFtZTogdGhpcy5jb250ZW50Lm5hbWUsXG4gICAgICAgIGNvbnRlbnRUeXBlOiB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUsXG4gICAgICAgIHByaW1hcnlDYXRlZ29yeTogdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250ZW50ICYmICFbXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9DT1VSU0UsXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9BU1NFU1NFTUVOVCxcbiAgICAgIE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0sXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LklOVklURV9PTkxZX1BST0dSQU0sXG4gICAgXS5pbmNsdWRlcyh0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkpKSB7XG4gICAgICB0aGlzLmNhblNoYXJlID0gdHJ1ZVxuICAgICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XG4gICAgICAgIHRoaXMucm9vdE9yZ0lkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUucm9vdE9yZ0lkXG4gICAgICAgIHRoaXMudXNlclByb2ZpbGUgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZVxuICAgICAgICB0aGlzLnVzZXJQcm9maWxlT2JqZWN0ID0gdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyXG4gICAgICAgIC8vIHRoaXMuZ2V0VXNlcnNUb1NoYXJlKCcnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFVzZXJzVG9TaGFyZShxdWVyeVN0cjogc3RyaW5nKSB7XG4gICAgdGhpcy5zaG93TG9hZGVyID0gdHJ1ZVxuICAgIHRoaXMudXNlckF1dG9Db21wbGV0ZS5zZWFyY2hVc2VyKHF1ZXJ5U3RyLCB0aGlzLnJvb3RPcmdJZCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgaWYgKGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0LnJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuYXBpUmVzcG9uc2UgPSBkYXRhLnJlc3VsdC5yZXNwb25zZS5jb250ZW50XG4gICAgICAgIGxldCBuYW1lID0gJydcbiAgICAgICAgbGV0IHBFbWFpbCA9ICcnXG4gICAgICAgIHRoaXMuYXBpUmVzcG9uc2UuZm9yRWFjaCgoYXBpRGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgYXBpRGF0YS5maXJzdE5hbWUuc3BsaXQoJyAnKS5mb3JFYWNoKChkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgZC5zdWJzdHIoMCwgMSkudG9VcHBlckNhc2UoKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKGFwaURhdGEucHJvZmlsZURldGFpbHMgJiYgYXBpRGF0YS5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMpIHtcbiAgICAgICAgICAgIHBFbWFpbCA9IGFwaURhdGEucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLnByaW1hcnlFbWFpbFxuICAgICAgICAgICAgaWYgKCF0aGlzLmFsbFVzZXJzLmZpbHRlcih1c2VyID0+IHVzZXIuZW1haWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhwRW1haWwudG9Mb3dlckNhc2UoKSkpLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLmFsbFVzZXJzLnB1c2goXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbWFza2VkRW1haWw6IGFwaURhdGEubWFza2VkRW1haWwsXG4gICAgICAgICAgICAgICAgICBpZDogYXBpRGF0YS5pZGVudGlmaWVyLFxuICAgICAgICAgICAgICAgICAgbmFtZTogYXBpRGF0YS5maXJzdE5hbWUsXG4gICAgICAgICAgICAgICAgICBpY29uVGV4dDogbmFtZSxcbiAgICAgICAgICAgICAgICAgIGVtYWlsOiBwRW1haWwsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnNob3dMb2FkZXIgPSBmYWxzZVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYWxsVXNlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRVc2VycyA9IFtdXG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlcmVkVXNlcnMgPSB0aGlzLmZpbHRlclNoYXJlZFVzZXJzKHF1ZXJ5U3RyKVxuICAgIH0pXG4gIH1cblxuICBnZXQgc2hvd0ludHJhbmV0TXNnKCkge1xuICAgIGlmICh0aGlzLmlzTW9iaWxlKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaG93SW50cmFuZXRNZXNzYWdlXG4gIH1cblxuICBnZXQgZ2V0QmF0Y2hEdXJhdGlvbigpIHtcbiAgICBjb25zdCBzdGFydERhdGUgPSBkYXlqcyhkYXlqcyh0aGlzLmJhdGNoQ29udHJvbC52YWx1ZS5zdGFydERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpKVxuICAgIGNvbnN0IGVuZERhdGUgPSBkYXlqcyhkYXlqcyh0aGlzLmJhdGNoQ29udHJvbC52YWx1ZS5lbmREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSlcbiAgICAvLyBhZGRpbmcgMSB0byBpbmNsdWRlIHRoZSBzdGFydCBkYXRlXG4gICAgcmV0dXJuIChlbmREYXRlLmRpZmYoc3RhcnREYXRlLCAnZGF5cycpICsgMSlcbiAgfVxuXG4gIGdldCBzaG93U3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9jU3ZjLnNob3dTdGFydEJ1dHRvbih0aGlzLmNvbnRlbnQpXG4gIH1cblxuICBnZXQgaXNQb3N0QXNzZXNzbWVudCgpOiBib29sZWFuIHtcbiAgICBpZiAoISh0aGlzLnRvY0NvbmZpZyAmJiB0aGlzLnRvY0NvbmZpZy5wb3N0QXNzZXNzbWVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiZcbiAgICAgICAgdGhpcy5jb250ZW50LmxlYXJuaW5nTW9kZSA9PT0gJ0luc3RydWN0b3ItTGVkJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBpc01vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51dGlsaXR5U3ZjLmlzTW9iaWxlXG4gIH1cblxuICBnZXQgc2hvd1N1YnRpdGxlT25CYW5uZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9jU3ZjLnN1YnRpdGxlT25CYW5uZXJzXG4gIH1cblxuICBnZXREb3B0RWxpZ2libGVTZXJ2aWNlc0xpc3QoKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRCYXRjaCAmJiB0aGlzLnNlbGVjdGVkQmF0Y2guYmF0Y2hBdHRyaWJ1dGVzIFxuICAgICAgJiYgdGhpcy5zZWxlY3RlZEJhdGNoLmJhdGNoQXR0cmlidXRlcy5jYWRyZUxpc3RcbiAgICAgICYmIHRoaXMuc2VsZWN0ZWRCYXRjaC5iYXRjaEF0dHJpYnV0ZXMuY2FkcmVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5kb3B0RWxpZ2libGVTZXJ2aWNlc0xpc3QgPSB0aGlzLnNlbGVjdGVkQmF0Y2guYmF0Y2hBdHRyaWJ1dGVzLmNhZHJlTGlzdFxuICAgICAgfSBlbHNle1xuICAgICAgdGhpcy5kb3B0RWxpZ2libGVTZXJ2aWNlc0xpc3QgPSBbXVxuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKF9jaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgdGhpcy5hc3NpZ25QYXRoQW5kVXBkYXRlQmFubmVyKHRoaXMucm91dGVyLnVybClcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmZldGNoRXh0ZXJuYWxDb250ZW50QWNjZXNzKClcbiAgICAgIHRoaXMubW9kaWZ5U2Vuc2libGVDb250ZW50UmF0aW5nKClcbiAgICAgIHRoaXMuYXNzaWduUGF0aEFuZFVwZGF0ZUJhbm5lcih0aGlzLnJvdXRlci51cmwpXG4gICAgICB0aGlzLmdldExlYXJuaW5nVXJscygpXG4gICAgICB0aGlzLnNldEJhdGNoQ29udHJvbCgpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdW1lRGF0YSAmJiB0aGlzLnJlc3VtZURhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGxldCByZXN1bWVEYXRhVjI6IGFueVxuICAgICAgaWYgKHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSB7XG4gICAgICAgIHJlc3VtZURhdGFWMiA9IHRoaXMuZ2V0UmVzdW1lRGF0YUZyb21MaXN0KCdzdGFydCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bWVEYXRhVjIgPSB0aGlzLmdldFJlc3VtZURhdGFGcm9tTGlzdCgpXG4gICAgICB9XG5cbiAgICAgIGlmICghcmVzdW1lRGF0YVYyLm1pbWVUeXBlKSB7XG4gICAgICAgIHJlc3VtZURhdGFWMi5taW1lVHlwZSA9IHRoaXMuZ2V0TWltZVR5cGUodGhpcy5jb250ZW50LCByZXN1bWVEYXRhVjIuaWRlbnRpZmllcilcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXN1bWVEYXRhTGluayA9IHZpZXdlclJvdXRlR2VuZXJhdG9yKFxuICAgICAgICByZXN1bWVEYXRhVjIuaWRlbnRpZmllcixcbiAgICAgICAgcmVzdW1lRGF0YVYyLm1pbWVUeXBlLFxuICAgICAgICB0aGlzLmlzUmVzb3VyY2UgPyB1bmRlZmluZWQgOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcixcbiAgICAgICAgdGhpcy5pc1Jlc291cmNlID8gdW5kZWZpbmVkIDogdGhpcy5jb250ZW50LmNvbnRlbnRUeXBlLFxuICAgICAgICB0aGlzLmZvclByZXZpZXcsXG4gICAgICAgICdMZWFybmluZyBSZXNvdXJjZScsXG4gICAgICAgIHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgICB0aGlzLmNvbnRlbnQubmFtZSxcbiAgICAgIClcbiAgICAgIHRoaXMuYWN0aW9uU1ZDLnNldFVwZGF0ZUNvbXBHcm91cE8gPSB0aGlzLnJlc3VtZURhdGFMaW5rXG4gICAgfVxuXG4gICAgdGhpcy5iYXRjaENvbnRyb2xVbnN1YnNjcmliZSA9IHRoaXMuYmF0Y2hDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGJhdGNoOiBOc0NvbnRlbnQuSUJhdGNoKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkQmF0Y2ggPSBiYXRjaFxuICAgICAgaWYgKGJhdGNoKSB7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrUmVqZWN0ZWQoYmF0Y2gpKSB7XG4gICAgICAgICAgdGhpcy5zaG93UmVqZWN0ZWQgPSB0cnVlXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc2hvd1JlamVjdGVkID0gZmFsc2VcbiAgICAgIHJldHVyblxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgcmVxdWVzdFRvV2l0aGRyYXdEaWFsb2coKSB7XG4gICAgY29uc3QgY29uZmlybURpYWxvZyA9IHRoaXMuZGlhbG9nLm9wZW4oQ29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc0MzRweCcsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHRpdGxlOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHdpdGhkcmF3IHlvdXIgcmVxdWVzdD8nLFxuICAgICAgICBtZXNzYWdlOiAnWW91IHdpbGwgbWlzcyB0aGUgbGVhcm5pbmcgb3Bwb3J0dW5pdHkgaWYgeW91IHdpdGhkcmF3IHlvdXIgZW5yb2xtZW50LicsXG4gICAgICAgIGFjY2VwdEJ1dHRvbjogJ1dpdGhkcmF3JyxcbiAgICAgICAgY2FuY2VsQnV0dG9uOiAnQ2FuY2VsJyxcbiAgICAgIH0sXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICBwYW5lbENsYXNzOiBbJ2FuaW1hdGVfX2FuaW1hdGVkJywgJ2FuaW1hdGVfX3NsaWRlSW5MZWZ0J10sXG4gICAgfSlcblxuICAgIGNvbmZpcm1EaWFsb2cuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICB0aGlzLnJlcXVlc3RBbmRXaXRoRHJhd0Vucm9sbCh0aGlzLmJhdGNoRGF0YS53b3JrRmxvdy53Zkl0ZW0uY3VycmVudFN0YXR1cywgdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLldJVEhEUkFXLCB0aGlzLmJhdGNoRGF0YS53b3JrRmxvdy53Zkl0ZW0ud2ZJZClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb3BlbkNvbmZvcm1hdGlvbkRpYWxvZyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNjAwcHgnLFxuICAgICAgZGF0YToge1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICBhY2NlcHRCdXR0b246ICdPaycsXG4gICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgb3BlblJlcXVlc3RUb0Vucm9sbChiYXRjaERhdGE6IGFueSkge1xuICAgIGNvbnN0IGNvbmZpcm1EaWFsb2cgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNDM0cHgnLFxuICAgICAgZGF0YToge1xuICAgICAgICB0aXRsZTogJ1lvdeKAmXJlIG9uZSBzdGVwIGF3YXkgZnJvbSBlbnJvbGxpbmchJyxcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICBtZXNzYWdlOiBgVGhpcyBiYXRjaCBpcyBhY3RpdmUgZnJvbSAke3RoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGJhdGNoRGF0YS5zdGFydERhdGUsICdkZC1NTS15eXl5Jyl9ICAtICAke3RoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGJhdGNoRGF0YS5lbmREYXRlLCAnZGQtTU0teXl5eScpfSwga2luZGx5IGdvIHRocm91Z2ggdGhlIGNvbnRlbnQgYW5kIGJlIHByZXBhcmVkLmAsXG4gICAgICAgIGFjY2VwdEJ1dHRvbjogJ0NvbmZpcm0nLFxuICAgICAgICBjYW5jZWxCdXR0b246ICdDYW5jZWwnLFxuICAgICAgfSxcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcbiAgICAgIHBhbmVsQ2xhc3M6IFsnYW5pbWF0ZV9fYW5pbWF0ZWQnLCAnYW5pbWF0ZV9fc2xpZGVJbkxlZnQnXSxcbiAgICB9KVxuICAgIGNvbmZpcm1EaWFsb2cuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0QW5kV2l0aERyYXdFbnJvbGwoJ0lOSVRJQVRFJywgJ0lOSVRJQVRFJylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY2FsbEJQU3VyZXZ5KGJhdGNoRGF0YTogYW55KSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgY29uc3Qgc0lEID0gdGhpcy5jb250ZW50LndmU3VydmV5TGluay5zcGxpdCgnc3VydmV5cy8nKVxuICAgICAgY29uc3Qgc3VydmV5SWQgPSBzSURbMV1cbiAgICAgIGNvbnN0IGNvdXJzZUlkID0gdGhpcy5jb250ZW50LmlkZW50aWZpZXJcbiAgICAgIGNvbnN0IGNvdXJzZU5hbWUgPSB0aGlzLmNvbnRlbnQubmFtZVxuICAgICAgY29uc3Qgd2ZDbGllbnRWZXJzaW9uID0gXy5nZXQodGhpcy5jb250ZW50LCAnd2ZDbGllbnRWZXJzaW9uJywgJzAnKVxuICAgICAgY29uc3QgYXBpRGF0YSA9IHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnByZWZlci10ZW1wbGF0ZVxuICAgICAgICBnZXRBUEk6ICcvYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL2dldEZvcm1CeUlkP2lkPScgKyBzdXJ2ZXlJZCxcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnByZWZlci10ZW1wbGF0ZVxuICAgICAgICBwb3N0QVBJOiAnL2FwaXMvcHJveGllcy92OC9mb3Jtcy92MS9zYXZlRm9ybVN1Ym1pdCcsXG4gICAgICAgIGdldEFsbEFwcGxpY2F0aW9uczogJy9hcGlzL3Byb3hpZXMvdjgvZm9ybXMvZ2V0QWxsQXBwbGljYXRpb25zJyxcbiAgICAgICAgY3VzdG9taXplZEhlYWRlcjoge30sXG4gICAgICB9XG4gICAgICBjb25zdCBlbnJvbGxRdWVzdGlvbm5haXJlID0gdGhpcy5kaWFsb2cub3BlbihFbnJvbGxRdWVzdGlvbm5haXJlQ29tcG9uZW50LCB7XG4gICAgICAgIHdpZHRoOiAnOTIwcHgnLFxuICAgICAgICBtYXhIZWlnaHQ6ICc4NXZoJyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHN1cnZleUlkLFxuICAgICAgICAgIGNvdXJzZUlkLFxuICAgICAgICAgIGNvdXJzZU5hbWUsXG4gICAgICAgICAgYXBpRGF0YSxcbiAgICAgICAgICBiYXRjaERhdGEsXG4gICAgICAgICAgd2ZDbGllbnRWZXJzaW9uXG5cbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcbiAgICAgICAgcGFuZWxDbGFzczogWydhbmltYXRlX19hbmltYXRlZCcsICdhbmltYXRlX19zbGlkZUluTGVmdCddLFxuICAgICAgfSlcbiAgICAgIGVucm9sbFF1ZXN0aW9ubmFpcmUuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHRoaXMub3BlblJlcXVlc3RUb0Vucm9sbChiYXRjaERhdGEpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgY2FsbEJQUHJvZmlsZVN1cmV2eShiYXRjaERhdGE6IGFueSkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGRvcHRvcmdJRCA9IHRoaXMuZW52aXJvbm1lbnQuZG9wdE9yZ1xuICAgICAgY29uc3QgaXNEb3B0Q29udGVudCA9IF8uZ2V0KHRoaXMuY29udGVudCwgJ2NyZWF0ZWRGb3InLCBbXSkuaW5jbHVkZXMoZG9wdG9yZ0lEKVxuICAgICAgLy8gY29uc3QgaXNEcHRVc2VyID0gXy5nZXQodGhpcy51c2VyUHJvZmlsZU9iamVjdCwgJ3Jvb3RPcmdJZCcpID09PSBkb3B0b3JnSURcblxuICAgIHRoaXMuZ2V0RG9wdEVsaWdpYmxlU2VydmljZXNMaXN0KClcbiAgICBjb25zdCB1c2VyUHJvZmlsZU9iamVjdCA9IHRoaXMuY29uZmlnU3ZjPy51bk1hcHBlZFVzZXIgfHwge31cbiAgICAgIGNvbnN0IGNpdmlsU2VydmljZU5hbWUgPSBfLmdldCh1c2VyUHJvZmlsZU9iamVjdCwgJ3Byb2ZpbGVEZXRhaWxzLmNhZHJlRGV0YWlscy5jaXZpbFNlcnZpY2VOYW1lJywgJycpXG4gICAgICBpZiAodGhpcy5kb3B0RWxpZ2libGVTZXJ2aWNlc0xpc3QgJiYgdGhpcy5kb3B0RWxpZ2libGVTZXJ2aWNlc0xpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoIWNpdmlsU2VydmljZU5hbWUpIHtcbiAgICAgICAgICB0aGlzLm9wZW5Db25mb3JtYXRpb25EaWFsb2coYFRoaXMgcHJvZ3JhbSBoYXMgZWxpZ2liaWxpdHkgY3JpdGVyaWEuIFBsZWFzZSB1cGRhdGUgeW91ciBzZXJ2aWNlIGRldGFpbHMgaW4geW91ciBwcm9maWxlIGJlZm9yZSByZXF1ZXN0aW5nIHRvIGVucm9sbC5gKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRvcHRFbGlnaWJsZVNlcnZpY2VzTGlzdC5pbmNsdWRlcyhjaXZpbFNlcnZpY2VOYW1lKSkge1xuICAgICAgICAgIHRoaXMub3BlbkNvbmZvcm1hdGlvbkRpYWxvZyhgWW91IGFyZSBub3QgZWxpZ2libGUgZm9yIHRoZSAke3RoaXMuY29udGVudC5uYW1lfSB3aXRoIHRoZSBjdXJyZW50IHNlcnZpY2UgaW4geW91ciBwcm9maWxlLiBJZiB5b3VyIHNlcnZpY2UgZGV0YWlscyBhcmUgaW5jb3JyZWN0LCBwbGVhc2UgdXBkYXRlIHlvdXIgcHJvZmlsZSBhbmQgYXBwbHkuYClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgY291cnNlTmFtZSA9IHRoaXMuY29udGVudC5uYW1lXG4gICAgICAvLyBjb25zdCBzaG93RG9wdENoYW5nZXMgPSAoaXNEb3B0Q29udGVudCAmJiBpc0RwdFVzZXIpID8gdHJ1ZSA6IGZhbHNlXG4gICAgICBjb25zdCBwcm9maWxlRm9ybSA9IHRoaXMuZGlhbG9nLm9wZW4oRW5yb2xsUHJvZmlsZUZvcm1Db21wb25lbnQsIHtcbiAgICAgICAgd2lkdGg6ICc5MjBweCcsXG4gICAgICAgIG1heEhlaWdodDogJzg1dmgnLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgY291cnNlTmFtZSxcbiAgICAgICAgICBiYXRjaERhdGEsXG4gICAgICAgICAgc2hvd0RvcHRDaGFuZ2VzOiBpc0RvcHRDb250ZW50LFxuICAgICAgICB9LFxuICAgICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxuICAgICAgICBwYW5lbENsYXNzOiBbJ2FuaW1hdGVfX2FuaW1hdGVkJywgJ2FuaW1hdGVfX3NsaWRlSW5MZWZ0J10sXG4gICAgICB9KVxuICAgICAgcHJvZmlsZUZvcm0uYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LndmU3VydmV5TGluaykge1xuICAgICAgICAgICAgdGhpcy5jYWxsQlBTdXJldnkoYmF0Y2hEYXRhKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0VG9FbnJvbGwoYmF0Y2hEYXRhKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVxdWVzdFRvRW5yb2xsRGlhbG9nKCkge1xuXG4gICAgY29uc3QgYmF0Y2hEYXRhID0gdGhpcy5iYXRjaENvbnRyb2wudmFsdWVcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSkge1xuICAgICAgLy8gY29uZmxpY3RzIGNoZWNrIHN0YXJ0XG4gICAgICBjb25zdCB1c2VyTGlzdDogYW55ID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QgJiYgdGhpcy51c2VyRW5yb2xsbWVudExpc3QuZmlsdGVyKGVsZSA9PiB7XG4gICAgICAgIGlmIChlbGUuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSkge1xuICAgICAgICAgIGlmICghKGRheWpzKGJhdGNoRGF0YS5zdGFydERhdGUpLmlzQmVmb3JlKGRheWpzKGVsZS5iYXRjaC5zdGFydERhdGUpKSAmJlxuICAgICAgICAgICAgZGF5anMoYmF0Y2hEYXRhLmVuZERhdGUpLmlzQmVmb3JlKGRheWpzKGVsZS5iYXRjaC5zdGFydERhdGUpKSB8fFxuICAgICAgICAgICAgZGF5anMoYmF0Y2hEYXRhLnN0YXJ0RGF0ZSkuaXNBZnRlcihkYXlqcyhlbGUuYmF0Y2guZW5kRGF0ZSkpICYmXG4gICAgICAgICAgICBkYXlqcyhiYXRjaERhdGEuZW5kRGF0ZSkuaXNBZnRlcihkYXlqcyhlbGUuYmF0Y2guZW5kRGF0ZSkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9KVxuXG4gICAgICAvLyBjb25mbGljdHMgY2hlY2sgZW5kXG4gICAgICBpZiAodXNlckxpc3QgJiYgdXNlckxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgYmF0Y2hEYXRhLmJhdGNoQXR0cmlidXRlcyAmJiBiYXRjaERhdGEuYmF0Y2hBdHRyaWJ1dGVzLnVzZXJQcm9maWxlRmlsZWRzKSB7XG4gICAgICAgICAgdGhpcy5jYWxsQlBQcm9maWxlU3VyZXZ5KGJhdGNoRGF0YSlcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LndmU3VydmV5TGluaykge1xuICAgICAgICAgIHRoaXMuY2FsbEJQU3VyZXZ5KGJhdGNoRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0VG9FbnJvbGwoYmF0Y2hEYXRhKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodXNlckxpc3QgJiYgdXNlckxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMub3BlblNuYWNrYmFyKGBZb3UgY2Fubm90IGVucm9sbCBpbiB0aGlzIGJsZW5kZWQgcHJvZ3JhbSBiZWNhdXNlIGl0IGNvbmZsaWN0cyB3aXRoIHlvdXIgZXhpc3RpbmcgYmxlbmRlZCBwcm9ncmFtLmApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9ncmFtRW5yb2xsQ2FsbC5lbWl0KGJhdGNoRGF0YSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVxdWVzdEFuZFdpdGhEcmF3RW5yb2xsKHN0YXRlOiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCB3ZklkVmFsdWU/OiBzdHJpbmcpIHtcbiAgICBsZXQgdXNlcklkID0gJydcbiAgICBsZXQgcm9vdE9yZ0lkID0gJydcbiAgICBsZXQgdXNlcm5hbWUgPSAnJ1xuICAgIGxldCBkZXBhcnRtZW50TmFtZSA9ICcnXG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XG4gICAgICB1c2VySWQgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQgfHwgJydcbiAgICAgIHJvb3RPcmdJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnJvb3RPcmdJZCB8fCAnJ1xuICAgICAgdXNlcm5hbWUgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS5maXJzdE5hbWUgfHwgJydcbiAgICAgIGRlcGFydG1lbnROYW1lID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUuZGVwYXJ0bWVudE5hbWUgfHwgJydcbiAgICB9XG5cbiAgICBjb25zdCByZXEgPSB7XG4gICAgICByb290T3JnSWQsXG4gICAgICB1c2VySWQsXG4gICAgICBzdGF0ZSxcbiAgICAgIGFjdGlvbixcbiAgICAgIGFjdG9yVXNlcklkOiB1c2VySWQsXG4gICAgICBhcHBsaWNhdGlvbklkOiB0aGlzLnNlbGVjdGVkQmF0Y2guYmF0Y2hJZCxcbiAgICAgIHNlcnZpY2VOYW1lOiAnYmxlbmRlZHByb2dyYW0nLFxuICAgICAgY291cnNlSWQ6IHRoaXMuc2VsZWN0ZWRCYXRjaC5jb3Vyc2VJZCxcbiAgICAgIGRlcHROYW1lOiBkZXBhcnRtZW50TmFtZSxcbiAgICAgIC4uLih3ZklkVmFsdWUgPyB7IHdmSWQ6IHdmSWRWYWx1ZSB9IDogbnVsbCksXG4gICAgICB1cGRhdGVGaWVsZFZhbHVlczogW1xuICAgICAgICB7XG4gICAgICAgICAgdG9WYWx1ZToge1xuICAgICAgICAgICAgbmFtZTogdXNlcm5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgdGhpcy5jb250ZW50U3ZjLmVucm9sbEFuZFVuZW5yb2xsVXNlclRvQmF0Y2hXRihyZXEsIGFjdGlvbikudGhlbigoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLnJlc3VsdCAmJiBkYXRhLnJlc3VsdC5zdGF0dXMgPT09ICdPSycpIHtcbiAgICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cgPSB7XG4gICAgICAgICAgd2ZJbml0aWF0ZWQ6IHRydWUsXG4gICAgICAgICAgYmF0Y2g6IHRoaXMuc2VsZWN0ZWRCYXRjaCxcbiAgICAgICAgICB3Zkl0ZW06IHsgY3VycmVudFN0YXR1czogZGF0YS5yZXN1bHQuZGF0YS5zdGF0dXMgfSxcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndpdGhkcmF3T3JFbnJvbGwuZW1pdChhY3Rpb24pXG4gICAgICAgIHRoaXMuZ2V0QmF0Y2hVc2VyQ291bnQodGhpcy5zZWxlY3RlZEJhdGNoKVxuICAgICAgICB0aGlzLm9wZW5TbmFja2JhcihgUmVxdWVzdCAke2FjdGlvbiA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLldJVEhEUkFXID8gJ3dpdGhkcmF3bicgOiAnc2VudCd9IFN1Y2Nlc3NmdWxseSFgKVxuICAgICAgICB0aGlzLmRpc2FibGVFbnJvbGxCdG4gPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcGVuU25hY2tiYXIoJ1NvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIScpXG4gICAgICAgIHRoaXMuZGlzYWJsZUVucm9sbEJ0biA9IGZhbHNlXG4gICAgICB9XG4gICAgfSwgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIHRoaXMub3BlblNuYWNrYmFyKF8uZ2V0KGVycm9yLCAnZXJyb3IucGFyYW1zLmVycm1zZycpIHx8XG4gICAgICAgIF8uZ2V0KGVycm9yLCAnZXJyb3IucmVzdWx0LmVycm1zZycpIHx8XG4gICAgICAgICdTb21ldGhpbmcgd2VudCB3cm9uZywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlciEnKVxuICAgIH0pXG4gIH1cblxuICBnZXRNaW1lVHlwZShjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQsIGlkZW50aWZpZXI6IHN0cmluZyk6IE5zQ29udGVudC5FTWltZVR5cGVzIHtcbiAgICBpZiAoY29udGVudC5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXR1cm4gY29udGVudC5taW1lVHlwZVxuICAgIH1cbiAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICBpZiAoY29udGVudC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gYmlnIGJsdW5kZXIgaW4gZGF0YVxuICAgICAgICB0aGlzLmxvZ2dlci5sb2coY29udGVudC5pZGVudGlmaWVyLCAnV3JvbmcgbWltZSB0eXBlcyBmb3IgcmVzdW1lJylcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQubWltZVR5cGVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmxhdExpc3Q6IGFueVtdID0gW11cbiAgICAgIGNvbnN0IGdldEFsbEl0ZW1zUGVyQ2hpbGRyZW46IGFueSA9IChpdGVtOiBOc0NvbnRlbnQuSUNvbnRlbnQpID0+IHtcbiAgICAgICAgZmxhdExpc3QucHVzaChpdGVtKVxuICAgICAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgIHJldHVybiBpdGVtLmNoaWxkcmVuLm1hcCgoaTogTnNDb250ZW50LklDb250ZW50KSA9PiBnZXRBbGxJdGVtc1BlckNoaWxkcmVuKGkpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBnZXRBbGxJdGVtc1BlckNoaWxkcmVuKHRoaXMuY29udGVudClcbiAgICAgIGNvbnN0IGNobGQgPSBfLmZpcnN0KF8uZmlsdGVyKGZsYXRMaXN0LCB7IGlkZW50aWZpZXIgfSkpXG4gICAgICByZXR1cm4gY2hsZC5taW1lVHlwZVxuICAgIH1cbiAgICAvLyByZXR1cm4gY2hsZC5taW1lVHlwZVxuICAgIHJldHVybiBOc0NvbnRlbnQuRU1pbWVUeXBlcy5VTktOT1dOXG4gIH1cblxuICBwcml2YXRlIGdldEJhdGNoSWQoKTogc3RyaW5nIHtcbiAgICBsZXQgYmF0Y2hJZCA9ICcnXG4gICAgaWYgKHRoaXMuYmF0Y2hEYXRhICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQpIHtcbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgdGhpcy5iYXRjaERhdGEuY29udGVudCkge1xuICAgICAgICBiYXRjaElkID0gYmF0Y2guYmF0Y2hJZFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmF0Y2hJZFxuICB9XG5cbiAgcHVibGljIGhhbmRsZUVucm9sbG1lbnRFbmREYXRlKGJhdGNoOiBhbnkpIHtcbiAgICBjb25zdCBlbnJvbGxtZW50RW5kRGF0ZSA9IGRheWpzKGxvZGFzaC5nZXQoYmF0Y2gsICdlbnJvbGxtZW50RW5kRGF0ZScpKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgIGNvbnN0IHN5c3RlbURhdGUgPSBkYXlqcyh0aGlzLnNlcnZlckRhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgcmV0dXJuIChlbnJvbGxtZW50RW5kRGF0ZSAmJiBlbnJvbGxtZW50RW5kRGF0ZSAhPT0gJ0ludmFsaWQgRGF0ZScpID9cbiAgICAgIChkYXlqcyhlbnJvbGxtZW50RW5kRGF0ZSkuaXNTYW1lKHN5c3RlbURhdGUsICdkYXknKSB8fCBkYXlqcyhlbnJvbGxtZW50RW5kRGF0ZSkuaXNBZnRlcihzeXN0ZW1EYXRlKSkgOiBmYWxzZVxuICB9XG5cbiAgcHVibGljIGNoZWNrUmVqZWN0ZWQoYmF0Y2g6IGFueSkge1xuICAgIGlmIChcbiAgICAgIGJhdGNoICYmXG4gICAgICB0aGlzLmJhdGNoRGF0YSAmJlxuICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cgJiZcbiAgICAgIHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbVxuICAgICkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgaWYgKGJhdGNoLmJhdGNoSWQgPT09IHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbS5hcHBsaWNhdGlvbklkICYmICh0aGlzLmJhdGNoRGF0YS53b3JrRmxvdy53Zkl0ZW0uY3VycmVudFN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlJFSkVDVEVEIHx8IHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbS5jdXJyZW50U3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuUkVNT1ZFRCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHB1YmxpYyBjaGVja1dpdGhkcmF3bihiYXRjaDogYW55KSB7XG4gICAgaWYgKFxuICAgICAgYmF0Y2ggJiZcbiAgICAgIHRoaXMuYmF0Y2hEYXRhICYmXG4gICAgICB0aGlzLmJhdGNoRGF0YS53b3JrRmxvdyAmJlxuICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtXG4gICAgKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEJhdGNoLmJhdGNoSWQgPT09IHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbS5hcHBsaWNhdGlvbklkICYmICh0aGlzLmJhdGNoRGF0YS53b3JrRmxvdy53Zkl0ZW0uY3VycmVudFN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLldJVEhEUkFXTiB8fCB0aGlzLmJhdGNoRGF0YS53b3JrRmxvdy53Zkl0ZW0uY3VycmVudFN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLldJVEhEUkFXTikpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHB1YmxpYyBiYXRjaENoYW5nZShldmVudDogYW55KSB7XG4gICAgdGhpcy5jbGVhckFuZENhbGxUaW1lcigpXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnZhbHVlKSB7XG4gICAgICBjb25zdCBiYXRjaERhdGEgPSB7XG4gICAgICAgIGNvbnRlbnQ6IFtldmVudC52YWx1ZV0sXG4gICAgICB9XG4gICAgICB0aGlzLmdldEJhdGNoVXNlckNvdW50KGV2ZW50LnZhbHVlKVxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEgJiYgdGhpcy5zZWxlY3RlZEJhdGNoRGF0YS5jb250ZW50KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEgPSB7XG4gICAgICAgICAgLi4udGhpcy5zZWxlY3RlZEJhdGNoRGF0YSxcbiAgICAgICAgICAuLi5iYXRjaERhdGEsXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEgPSB7XG4gICAgICAgICAgLi4uYmF0Y2hEYXRhLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jaGVja1JlamVjdGVkKGV2ZW50LnZhbHVlKSkge1xuICAgICAgICB0aGlzLnNob3dSZWplY3RlZCA9IHRydWVcbiAgICAgICAgdGhpcy5zZXRiYXRjaERhdGVUb0NvdW50RG93bihldmVudC52YWx1ZS5zdGFydERhdGUpXG4gICAgICAgIHRoaXMudG9jU3ZjLmdldFNlbGVjdGVkQmF0Y2hEYXRhKHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgdGhpcy5zZXRiYXRjaERhdGVUb0NvdW50RG93bihldmVudC52YWx1ZS5zdGFydERhdGUpXG4gICAgICB0aGlzLnRvY1N2Yy5nZXRTZWxlY3RlZEJhdGNoRGF0YSh0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhKVxuICAgIH1cbiAgICB0aGlzLnNob3dSZWplY3RlZCA9IGZhbHNlXG4gICAgdGhpcy5jaGVja0JhdGNoU3RhcnREYXRlKClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNoZWNrQmF0Y2hTdGFydERhdGUoKSB7XG4gICAgY29uc3QgYmF0Y2hTdGFydERhdGUgPSB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhICYmIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudFxuICAgICAgJiYgdGhpcy5zZWxlY3RlZEJhdGNoRGF0YS5jb250ZW50WzBdICYmIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudFswXS5zdGFydERhdGVcbiAgICBjb25zdCB3b3JrRmxvdyA9IHRoaXMuYmF0Y2hEYXRhICYmIHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93ICYmIHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbVxuICAgICAgJiYgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLmN1cnJlbnRTdGF0dXNcbiAgICBjb25zdCBub3cgPSBkYXlqcyh0aGlzLnNlcnZlckRhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgY29uc3QgZGF0ZUV4dGVuZGVkID0gZGF5anMobm93KS5pc1NhbWVPckFmdGVyKGRheWpzKGJhdGNoU3RhcnREYXRlKSlcbiAgICBpZiAoZGF0ZUV4dGVuZGVkICYmICh3b3JrRmxvdyAmJiAod29ya0Zsb3cgIT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5BUFBST1ZFRClcbiAgICAgICYmIHdvcmtGbG93ICE9PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuV0lUSERSQVdOKSkge1xuICAgICAgY29uc3QgY29uZmlybURpYWxvZyA9IHRoaXMuZGlhbG9nLm9wZW4oQ29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICB3aWR0aDogJzQzNHB4JyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHRpdGxlOiAnUmVxdWVzdCBub3QgYXBwcm92ZWQnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdEb25cXCd0IHdvcnJ5OyB3aXRoZHJhdyB0aGlzIGFuZCByZXF1ZXN0IGFub3RoZXIgYmF0Y2guJyxcbiAgICAgICAgICBhY2NlcHRCdXR0b246ICdXaXRoZHJhdycsXG4gICAgICAgICAgY2FuY2VsQnV0dG9uOiAnQ2FuY2VsJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgICBwYW5lbENsYXNzOiBbJ2FuaW1hdGVfX2FuaW1hdGVkJywgJ2FuaW1hdGVfX3NsaWRlSW5MZWZ0J10sXG4gICAgICB9KVxuICAgICAgY29uZmlybURpYWxvZy5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAgIHRoaXMucmVxdWVzdEFuZFdpdGhEcmF3RW5yb2xsKHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbS5jdXJyZW50U3RhdHVzLCB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuV0lUSERSQVcsIHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbS53ZklkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRCYXRjaENvbnRyb2woKSB7XG4gICAgLy8gb24gZmlyc3QgbG9hZCBzZWxlY3QgZmlyc3QgdmFsdWUgaW4gdGhlIGJhdGNoIGxpc3QgaWYgaXRzIGhhdmluZyB2YWxpZCBlbnJvbGxtZW50IERhdGVcbiAgICBpZiAodGhpcy5jb250ZW50ICYmICh0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gfHxcbiAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LlBST0dSQU0pKSB7XG4gICAgICBpZiAodGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJhdGNoRGF0YS53b3JrRmxvdyB8fCAodGhpcy5iYXRjaERhdGEud29ya0Zsb3cgJiYgIXRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSW5pdGlhdGVkKSkge1xuICAgICAgICAgIGNvbnN0IGJhdGNoID0gdGhpcy5iYXRjaERhdGEuY29udGVudC5maW5kKChlbDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYW5kbGVFbnJvbGxtZW50RW5kRGF0ZShlbCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChiYXRjaCkge1xuICAgICAgICAgICAgdGhpcy5iYXRjaENvbnRyb2wuc2V0VmFsdWUoYmF0Y2gpXG4gICAgICAgICAgICB0aGlzLnNldGJhdGNoRGF0ZVRvQ291bnREb3duKGJhdGNoLnN0YXJ0RGF0ZSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmdldEJhdGNoVXNlckNvdW50KHRoaXMuYmF0Y2hDb250cm9sLnZhbHVlKVxuICAgICAgICAgIGNvbnN0IGJhdGNoRGF0YSA9IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt0aGlzLmJhdGNoQ29udHJvbC52YWx1ZV0sXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEgJiYgdGhpcy5zZWxlY3RlZEJhdGNoRGF0YS5jb250ZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhID0ge1xuICAgICAgICAgICAgICAuLi50aGlzLnNlbGVjdGVkQmF0Y2hEYXRhLFxuICAgICAgICAgICAgICAuLi5iYXRjaERhdGEsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEgPSB7XG4gICAgICAgICAgICAgIC4uLmJhdGNoRGF0YSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnRvY1N2Yy5nZXRTZWxlY3RlZEJhdGNoRGF0YSh0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGJhdGNoID0gdGhpcy5iYXRjaERhdGEuY29udGVudC5maW5kKChlbDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWwuYmF0Y2hJZCA9PT0gdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLmFwcGxpY2F0aW9uSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQmF0Y2ggPSBiYXRjaFxuICAgICAgICAgIHRoaXMuYmF0Y2hDb250cm9sLnBhdGNoVmFsdWUoYmF0Y2gpXG4gICAgICAgICAgdGhpcy5iYXRjaENoYW5nZSh7IHZhbHVlOiBiYXRjaCB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNsZWFyQW5kQ2FsbFRpbWVyKCkge1xuICAgIGlmICh0aGlzLnRpbWVySW50ZXJ2YWxDbGVhcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVySW50ZXJ2YWxDbGVhcilcbiAgICB9XG4gICAgdGhpcy5jYWxsVGltZXIoKVxuICB9XG5cbiAgLy8gc2V0dGluZyBiYXRjaCBzdGFydCBkYXRlXG4gIHNldGJhdGNoRGF0ZVRvQ291bnREb3duKGJhdGNoU3RhcnREYXRlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRhcmdldERhdGUgPSBuZXcgRGF0ZShiYXRjaFN0YXJ0RGF0ZSlcbiAgICBjb25zdCBjb252ZXJ0ZWREYXRlID0gZGF5anMoYmF0Y2hTdGFydERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpXG4gICAgdGhpcy50YXJnZXRUaW1lID0gbmV3IERhdGUoY29udmVydGVkRGF0ZSkuZ2V0VGltZSgpXG4gIH1cblxuICBwcml2YXRlIG9wZW5TbmFja2JhcihwcmltYXJ5TXNnOiBzdHJpbmcsIGR1cmF0aW9uOiBudW1iZXIgPSA1MDAwKSB7XG4gICAgdGhpcy5zbmFja0Jhci5vcGVuKHByaW1hcnlNc2csICdYJywge1xuICAgICAgZHVyYXRpb24sXG4gICAgfSlcbiAgfVxuXG4gIGdldCBkaXNhYmxlV2l0aGRyYXduQnRuKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuYmF0Y2hEYXRhICYmXG4gICAgICB0aGlzLmJhdGNoRGF0YS53b3JrRmxvdyAmJlxuICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtXG4gICAgKSB7XG4gICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmJhdGNoRGF0YS53b3JrRmxvdy53Zkl0ZW0uY3VycmVudFN0YXR1c1xuICAgICAgaWYgKE5zQ29udGVudC5XRkJsZW5kZWRQcm9ncmFtQXBwcm92YWxUeXBlcy5UV09fU1RFUF9NRE9fUEMgPT09IHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbS5zZXJ2aWNlTmFtZSAmJlxuICAgICAgICBzdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5TRU5EX0ZPUl9QQ19BUFBST1ZBTCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSBpZiAoTnNDb250ZW50LldGQmxlbmRlZFByb2dyYW1BcHByb3ZhbFR5cGVzLlRXT19TVEVQX1BDX01ETyA9PT0gdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLnNlcnZpY2VOYW1lICYmXG4gICAgICAgIHN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlNFTkRfRk9SX01ET19BUFBST1ZBTCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBzaG93SW5zdHJ1Y3RvckxlZE1zZygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zaG93QWN0aW9uQnV0dG9ucyAmJlxuICAgICAgdGhpcy5jb250ZW50ICYmXG4gICAgICB0aGlzLmNvbnRlbnQubGVhcm5pbmdNb2RlID09PSAnSW5zdHJ1Y3Rvci1MZWQnICYmXG4gICAgICAhdGhpcy5jb250ZW50LmNoaWxkcmVuLmxlbmd0aCAmJlxuICAgICAgIXRoaXMuY29udGVudC5hcnRpZmFjdFVybFxuICAgIClcbiAgfVxuXG4gIGdldCBnZXRXRk1zZygpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmJhdGNoRGF0YSAmJlxuICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cgJiZcbiAgICAgIHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbVxuICAgICkge1xuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLmN1cnJlbnRTdGF0dXNcbiAgICAgIGNvbnN0IG1zZyA9IHRoaXMuV0ZTVEFUVVNfTVNHX01BUFBJTkdbc3RhdHVzXVxuICAgICAgcmV0dXJuIHRoaXMudG9jQ29uZmlnW21zZ11cbiAgICB9XG4gIH1cblxuICBnZXQgc2hvd0ljb24oKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5iYXRjaERhdGEgJiZcbiAgICAgIHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93ICYmXG4gICAgICB0aGlzLmJhdGNoRGF0YS53b3JrRmxvdy53Zkl0ZW1cbiAgICApIHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbS5jdXJyZW50U3RhdHVzXG4gICAgICBpZiAoc3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuQVBQUk9WRUQgfHxcbiAgICAgICAgc3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuU0VORF9GT1JfTURPX0FQUFJPVkFMIHx8XG4gICAgICAgIHN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlNFTkRfRk9SX1BDX0FQUFJPVkFMIHx8XG4gICAgICAgIHN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLldJVEhEUkFXTiB8fFxuICAgICAgICBzdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRUpFQ1RFRCB8fFxuICAgICAgICBzdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRU1PVkVEKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZ2V0IHNob3dNc2coKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5iYXRjaERhdGEgJiZcbiAgICAgIHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93ICYmXG4gICAgICB0aGlzLmJhdGNoRGF0YS53b3JrRmxvdy53Zkl0ZW1cbiAgICApIHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbS5jdXJyZW50U3RhdHVzXG4gICAgICBpZiAoc3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuQVBQUk9WRUQgfHxcbiAgICAgICAgc3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuU0VORF9GT1JfTURPX0FQUFJPVkFMIHx8XG4gICAgICAgIHN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlNFTkRfRk9SX1BDX0FQUFJPVkFMIHx8XG4gICAgICAgIChzdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5XSVRIRFJBV04gJiYgdGhpcy5jaGVja1dpdGhkcmF3bih0aGlzLmJhdGNoRGF0YSkpIHx8XG4gICAgICAgIChzdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRU1PVkVEICYmIHRoaXMuc2hvd1JlamVjdGVkKSB8fFxuICAgICAgICAoc3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuUkVKRUNURUQgJiYgdGhpcy5zaG93UmVqZWN0ZWQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZ2V0IFdGSWNvbigpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmJhdGNoRGF0YSAmJlxuICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cgJiZcbiAgICAgIHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbVxuICAgICkge1xuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLmN1cnJlbnRTdGF0dXNcbiAgICAgIGlmIChzdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5BUFBST1ZFRCB8fFxuICAgICAgICBzdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5TRU5EX0ZPUl9NRE9fQVBQUk9WQUwgfHxcbiAgICAgICAgc3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuU0VORF9GT1JfUENfQVBQUk9WQUwgfHxcbiAgICAgICAgc3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuV0lUSERSQVdOXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuICdjaXJjbGUnXG4gICAgICB9XG4gICAgICBpZiAoc3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuUkVKRUNURUQgfHxcbiAgICAgICAgc3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuUkVNT1ZFRCkge1xuICAgICAgICByZXR1cm4gJ2luZm8nXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgZ2V0IGljb25Db2xvcigpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmJhdGNoRGF0YSAmJlxuICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cgJiZcbiAgICAgIHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbVxuICAgICkge1xuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLmN1cnJlbnRTdGF0dXNcbiAgICAgIGlmIChzdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5BUFBST1ZFRCB8fCBzdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5XSVRIRFJBV04pIHtcbiAgICAgICAgcmV0dXJuICd3cy1tYXQtZ3JlZW4tdGV4dCdcbiAgICAgIH0gaWYgKHN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlNFTkRfRk9SX01ET19BUFBST1ZBTCB8fFxuICAgICAgICBzdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5TRU5EX0ZPUl9QQ19BUFBST1ZBTCkge1xuICAgICAgICByZXR1cm4gJ3dzLW1hdC1vcmFuZ2UtdGV4dCdcbiAgICAgIH1cbiAgICAgIHJldHVybiAnJ1xuXG4gICAgfVxuICAgIHJldHVybiAnICdcbiAgfVxuXG4gIGdldCBpc0hlYWRlckhpZGRlbigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1Jlc291cmNlICYmIHRoaXMuY29udGVudCAmJiAhdGhpcy5jb250ZW50LmFydGlmYWN0VXJsLmxlbmd0aFxuICB9XG5cbiAgZ2V0IHNob3dBY3Rpb25CdXR0b25zKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmFjdGlvbkJ0blN0YXR1cyAhPT0gJ3dhaXQnICYmXG4gICAgICB0aGlzLmNvbnRlbnQgJiZcbiAgICAgIHRoaXMuY29udGVudC5zdGF0dXMgIT09ICdEZWxldGVkJyAmJlxuICAgICAgdGhpcy5jb250ZW50LnN0YXR1cyAhPT0gJ0V4cGlyZWQnXG4gICAgKVxuICB9XG5cbiAgZ2V0IHNob3dCdXR0b25Db250YWluZXIoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWN0aW9uQnRuU3RhdHVzID09PSAnZ3JhbnQnICYmXG4gICAgICAhKHRoaXMuaXNNb2JpbGUgJiYgdGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pc0luSW50cmFuZXQpICYmXG4gICAgICAhKFxuICAgICAgICB0aGlzLmNvbnRlbnQgJiZcbiAgICAgICAgdGhpcy5jb250ZW50LmNvbnRlbnRUeXBlID09PSAnQ291cnNlJyAmJlxuICAgICAgICB0aGlzLmNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmXG4gICAgICAgICF0aGlzLmNvbnRlbnQuYXJ0aWZhY3RVcmxcbiAgICAgICkgJiZcbiAgICAgICEodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jb250ZW50VHlwZSA9PT0gJ1Jlc291cmNlJyAmJiAhdGhpcy5jb250ZW50LmFydGlmYWN0VXJsKVxuICAgIClcbiAgfVxuXG4gIGdldCBpc1Jlc291cmNlKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGlzUmVzb3VyY2UgPSB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUgPT09IE5zQ29udGVudC5FQ29udGVudFR5cGVzLktOT1dMRURHRV9BUlRJRkFDVCB8fFxuICAgICAgICB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUgPT09IE5zQ29udGVudC5FQ29udGVudFR5cGVzLlJFU09VUkNFIHx8ICF0aGlzLmNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoXG4gICAgICBpZiAoaXNSZXNvdXJjZSkge1xuICAgICAgICB0aGlzLm1vYmlsZUFwcHNTdmMuc2VuZFZpZXdlckRhdGEodGhpcy5jb250ZW50KVxuICAgICAgfVxuICAgICAgcmV0dXJuIGlzUmVzb3VyY2VcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBnZXRCYXRjaFVzZXJDb3VudChiYXRjaERhdGE6IGFueSkge1xuICAgIGlmIChiYXRjaERhdGEgJiYgYmF0Y2hEYXRhLmJhdGNoSWQpIHtcbiAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgc2VydmljZU5hbWU6ICdibGVuZGVkcHJvZ3JhbScsXG4gICAgICAgIGFwcGxpY2F0aW9uU3RhdHVzOiAnJyxcbiAgICAgICAgYXBwbGljYXRpb25JZHM6IFtcbiAgICAgICAgICBiYXRjaERhdGEuYmF0Y2hJZCxcbiAgICAgICAgXSxcbiAgICAgICAgbGltaXQ6IDEwMCxcbiAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgfVxuICAgICAgY29uc3QgdXNlcmNvdW50ID0ge1xuICAgICAgICBlbnJvbGxlZDogMCxcbiAgICAgICAgdG90YWxBcHBsaWVkOiAwLFxuICAgICAgICByZWplY3RlZDogMCxcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGVudFN2Yy5mZXRjaEJsZW5kZWRVc2VyQ09VTlQocmVxKS50aGVuKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzLnJlc3VsdCAmJiByZXMucmVzdWx0LmRhdGEpIHtcbiAgICAgICAgICByZXMucmVzdWx0LmRhdGEuZm9yRWFjaCgoZWxlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGUuY3VycmVudFN0YXR1cyA9PT0gJ0FQUFJPVkVEJykge1xuICAgICAgICAgICAgICB1c2VyY291bnQuZW5yb2xsZWQgPSBlbGUuc3RhdHVzQ291bnRcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlLmN1cnJlbnRTdGF0dXMgPT09ICdSRUpFQ1RFRCcpIHtcbiAgICAgICAgICAgICAgdXNlcmNvdW50LnJlamVjdGVkID0gZWxlLnN0YXR1c0NvdW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlLmN1cnJlbnRTdGF0dXMgIT09ICdXSVRIRFJBV04nKSB7XG4gICAgICAgICAgICAgIHVzZXJjb3VudC50b3RhbEFwcGxpZWQgPSB1c2VyY291bnQudG90YWxBcHBsaWVkICsgZWxlLnN0YXR1c0NvdW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEJhdGNoRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEJhdGNoRGF0YSA9IHtcbiAgICAgICAgICAgICAgLi4udGhpcy5zZWxlY3RlZEJhdGNoRGF0YSxcbiAgICAgICAgICAgICAgdXNlckNvdW50OiB1c2VyY291bnQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudG9jU3ZjLmdldFNlbGVjdGVkQmF0Y2hEYXRhKHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZXN1bWVEYXRhRnJvbUxpc3QodHlwZT86IHN0cmluZykge1xuICAgIGlmICghdHlwZSkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgY29uc3QgbGFzdEl0ZW0gPSB0aGlzLnJlc3VtZURhdGEgJiYgdGhpcy5yZXN1bWVEYXRhLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiBuZXcgRGF0ZShiLmxhc3RBY2Nlc3NUaW1lKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShhLmxhc3RBY2Nlc3NUaW1lKS5nZXRUaW1lKCkpLnNoaWZ0KClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkZW50aWZpZXI6IGxhc3RJdGVtLmNvbnRlbnRJZCxcbiAgICAgICAgbWltZVR5cGU6IGxhc3RJdGVtLnByb2dyZXNzZGV0YWlscyAmJiBsYXN0SXRlbS5wcm9ncmVzc2RldGFpbHMubWltZVR5cGUsXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3RJdGVtID0gdGhpcy5yZXN1bWVEYXRhICYmIHRoaXMucmVzdW1lRGF0YS5sZW5ndGggJiYgdGhpcy5yZXN1bWVEYXRhWzBdXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkZW50aWZpZXI6IGZpcnN0SXRlbS5jb250ZW50SWQsXG4gICAgICBtaW1lVHlwZTogZmlyc3RJdGVtLnByb2dyZXNzZGV0YWlscyAmJiBmaXJzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzLm1pbWVUeXBlLFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbW9kaWZ5U2Vuc2libGVDb250ZW50UmF0aW5nKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29udGVudCAmJlxuICAgICAgdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgJiZcbiAgICAgIHR5cGVvZiB0aGlzLmNvbnRlbnQuYXZlcmFnZVJhdGluZyAhPT0gJ251bWJlcidcbiAgICApIHtcbiAgICAgIHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nID0gKHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nIGFzIGFueSlbdGhpcy5jb25maWdTdmMucm9vdE9yZyB8fCAnJ11cbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQudG90YWxSYXRpbmcgJiYgdHlwZW9mIHRoaXMuY29udGVudC50b3RhbFJhdGluZyAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuY29udGVudC50b3RhbFJhdGluZyA9ICh0aGlzLmNvbnRlbnQudG90YWxSYXRpbmcgYXMgYW55KVt0aGlzLmNvbmZpZ1N2Yy5yb290T3JnIHx8ICcnXVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGVhcm5pbmdVcmxzKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICAgIC8vIHRoaXMucHJvZ3Jlc3NTdmMuZ2V0UHJvZ3Jlc3NGb3IodGhpcy5jb250ZW50LmlkZW50aWZpZXIpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgLy8gICB0aGlzLmNvbnRlbnRQcm9ncmVzcyA9IGRhdGFcbiAgICAgICAgLy8gfSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc1ByYWN0aWNlVmlzaWJsZSA9IEJvb2xlYW4oXG4gICAgICAgIHRoaXMudG9jU3ZjLmZpbHRlclRvYyh0aGlzLmNvbnRlbnQsIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuUFJBQ1RJQ0UpLFxuICAgICAgKVxuXG4gICAgICB0aGlzLmlzQXNzZXNzVmlzaWJsZSA9IEJvb2xlYW4oXG4gICAgICAgIHRoaXMudG9jU3ZjLmZpbHRlclRvYyh0aGlzLmNvbnRlbnQsIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuQVNTRVNTKSxcbiAgICAgIClcblxuICAgICAgY29uc3QgZmlyc3RQbGF5YWJsZUNvbnRlbnQgPSB0aGlzLmNvbnRlbnRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KHRoaXMuY29udGVudClcbiAgICAgIHRoaXMuZmlyc3RSZXNvdXJjZUxpbmsgPSB2aWV3ZXJSb3V0ZUdlbmVyYXRvcihcbiAgICAgICAgZmlyc3RQbGF5YWJsZUNvbnRlbnQuaWRlbnRpZmllcixcbiAgICAgICAgZmlyc3RQbGF5YWJsZUNvbnRlbnQubWltZVR5cGUsXG4gICAgICAgIHRoaXMuaXNSZXNvdXJjZSA/IHVuZGVmaW5lZCA6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICB0aGlzLmlzUmVzb3VyY2UgPyB1bmRlZmluZWQgOiB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUsXG4gICAgICAgIHRoaXMuZm9yUHJldmlldyxcbiAgICAgICAgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSxcbiAgICAgICAgdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3NpZ25QYXRoQW5kVXBkYXRlQmFubmVyKHVybDogc3RyaW5nKSB7XG4gICAgY29uc3QgcGF0aCA9IHVybC5zcGxpdCgnLycpLnBvcCgpXG4gICAgaWYgKHBhdGggJiYgdGhpcy52YWxpZFBhdGhzLmhhcyhwYXRoKSkge1xuICAgICAgdGhpcy5yb3V0ZVBhdGggPSBwYXRoXG4gICAgICB0aGlzLnVwZGF0ZUJhbm5lclVybCgpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVCYW5uZXJVcmwoKSB7XG4gICAgaWYgKHRoaXMuYmFubmVycykge1xuICAgICAgdGhpcy5iYW5uZXJVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoXG4gICAgICAgIGB1cmwoJHt0aGlzLmJhbm5lcnNbdGhpcy5yb3V0ZVBhdGhdfSlgLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHBsYXlJbnRyb1ZpZGVvKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuZGlhbG9nLm9wZW4oQXBwVG9jRGlhbG9nSW50cm9WaWRlb0NvbXBvbmVudCwge1xuICAgICAgICBkYXRhOiB0aGlzLmNvbnRlbnQuaW50cm9kdWN0b3J5VmlkZW8sXG4gICAgICAgIGhlaWdodDogJzM1MHB4JyxcbiAgICAgICAgd2lkdGg6ICc2MjBweCcsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGdldCBzYW5pdGl6ZWRJbnRyb2R1Y3RvcnlWaWRlb0ljb24oKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaW50cm9kdWN0b3J5VmlkZW9JY29uKSB7XG4gICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKGB1cmwoJHt0aGlzLmNvbnRlbnQuaW50cm9kdWN0b3J5VmlkZW9JY29ufSlgKVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaEV4dGVybmFsQ29udGVudEFjY2VzcygpIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5yZWdpc3RyYXRpb25VcmwpIHtcbiAgICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxDb250ZW50RmV0Y2hTdGF0dXMgPSAnZmV0Y2hpbmcnXG4gICAgICAgIHRoaXMucmVnaXN0ZXJGb3JFeHRlcm5hbCA9IGZhbHNlXG4gICAgICAgIHRoaXMudG9jU3ZjLmZldGNoRXh0ZXJuYWxDb250ZW50QWNjZXNzKHRoaXMuY29udGVudC5pZGVudGlmaWVyKS5zdWJzY3JpYmUoXG4gICAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLmV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzID0gJ2RvbmUnXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRm9yRXh0ZXJuYWwgPSBkYXRhLmhhc0FjY2Vzc1xuICAgICAgICAgIH0sXG4gICAgICAgICAgX2Vycm9yID0+IHtcbiAgICAgICAgICAgIHRoaXMuZXh0ZXJuYWxDb250ZW50RmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJGb3JFeHRlcm5hbCA9IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5leHRlcm5hbENvbnRlbnRGZXRjaFN0YXR1cyA9ICdkb25lJ1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRm9yRXh0ZXJuYWwgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0UmF0aW5nSWNvbihyYXRpbmdJbmRleDogbnVtYmVyKTogJ3N0YXInIHwgJ3N0YXJfYm9yZGVyJyB8ICdzdGFyX2hhbGYnIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nKSB7XG4gICAgICBjb25zdCBhdmdSYXRpbmcgPSB0aGlzLmNvbnRlbnQuYXZlcmFnZVJhdGluZ1xuICAgICAgY29uc3QgcmF0aW5nRmxvb3IgPSBNYXRoLmZsb29yKGF2Z1JhdGluZylcbiAgICAgIGlmIChyYXRpbmdJbmRleCA8PSByYXRpbmdGbG9vcikge1xuICAgICAgICByZXR1cm4gJ3N0YXInXG4gICAgICB9XG4gICAgICBpZiAocmF0aW5nRmxvb3IgPT09IHJhdGluZ0luZGV4IC0gMSAmJiBhdmdSYXRpbmcgJSAxID49IDAuMjkgJiYgYXZnUmF0aW5nICUgMSA8IDAuNzEpIHtcbiAgICAgICAgcmV0dXJuICdzdGFyX2hhbGYnXG4gICAgICB9XG4gICAgICBpZiAocmF0aW5nRmxvb3IgPT09IHJhdGluZ0luZGV4IC0gMSAmJiBhdmdSYXRpbmcgJSAxID4gMC43MSkge1xuICAgICAgICByZXR1cm4gJ3N0YXInXG4gICAgICB9XG4gICAgICBpZiAocmF0aW5nRmxvb3IgPT09IHJhdGluZ0luZGV4IC0gMSAmJiBhdmdSYXRpbmcgJSAxIDwgMC4yOSkge1xuICAgICAgICByZXR1cm4gJ3N0YXJfYm9yZGVyJ1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJ3N0YXJfYm9yZGVyJ1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1JlZ2lzdHJhdGlvblN0YXR1cygpIHtcbiAgICBjb25zdCBzb3VyY2UgPSAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5zb3VyY2VTaG9ydE5hbWUpIHx8ICcnXG4gICAgaWYgKFxuICAgICAgIXRoaXMuZm9yUHJldmlldyAmJlxuICAgICAgIXRoaXMuaXNSZWdpc3RyYXRpb25TdXBwb3J0ZWQgJiZcbiAgICAgIHRoaXMuY2hlY2tSZWdpc3RyYXRpb25Tb3VyY2VzLmhhcyhzb3VyY2UpXG4gICAgKSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdmNcbiAgICAgICAgLmdldFJlZ2lzdHJhdGlvblN0YXR1cyhzb3VyY2UpXG4gICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5oYXNBY2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uQnRuU3RhdHVzID0gJ2dyYW50J1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbkJ0blN0YXR1cyA9ICdyZWplY3QnXG4gICAgICAgICAgICBpZiAocmVzLnJlZ2lzdHJhdGlvblVybCAmJiB0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50LnJlZ2lzdHJhdGlvblVybCA9IHJlcy5yZWdpc3RyYXRpb25VcmxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChfZXJyID0+IHsgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgPSAnZ3JhbnQnXG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVRdWVyeSh0eXBlOiAnUkVTVU1FJyB8ICdTVEFSVF9PVkVSJyB8ICdTVEFSVCcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBpZiAodGhpcy5maXJzdFJlc291cmNlTGluayAmJiAodHlwZSA9PT0gJ1NUQVJUJyB8fCB0eXBlID09PSAnU1RBUlRfT1ZFUicpKSB7XG4gICAgICBsZXQgcVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgLi4udGhpcy5maXJzdFJlc291cmNlTGluay5xdWVyeVBhcmFtcyxcbiAgICAgICAgdmlld01vZGU6IHR5cGUsXG4gICAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGV4dElkICYmIHRoaXMuY29udGV4dFBhdGgpIHtcbiAgICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogdGhpcy5jb250ZXh0SWQsXG4gICAgICAgICAgY29sbGVjdGlvblR5cGU6IHRoaXMuY29udGV4dFBhdGgsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgZGVsZXRlIHFQYXJhbXMudmlld01vZGVcbiAgICAgIH1cbiAgICAgIHJldHVybiBxUGFyYW1zXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdW1lRGF0YUxpbmsgJiYgdHlwZSA9PT0gJ1JFU1VNRScpIHtcbiAgICAgIGxldCBxUGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAuLi50aGlzLnJlc3VtZURhdGFMaW5rLnF1ZXJ5UGFyYW1zLFxuICAgICAgICBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgICAgdmlld01vZGU6ICdSRVNVTUUnLFxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGV4dElkICYmIHRoaXMuY29udGV4dFBhdGgpIHtcbiAgICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogdGhpcy5jb250ZXh0SWQsXG4gICAgICAgICAgY29sbGVjdGlvblR5cGU6IHRoaXMuY29udGV4dFBhdGgsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgZGVsZXRlIHFQYXJhbXMudmlld01vZGVcbiAgICAgIH1cbiAgICAgIHJldHVybiBxUGFyYW1zXG4gICAgfVxuICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICB2aWV3TW9kZTogdHlwZSxcbiAgICB9XG4gIH1cblxuICBnZXQgaXNJbklGcmFtZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHdpbmRvdy5zZWxmICE9PSB3aW5kb3cudG9wXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0QmdDb2xvcih0YWdUaXRsZTogYW55KSB7XG4gICAgY29uc3QgYmdDb2xvciA9IHRoaXMudGFnU3ZjLnN0cmluZ1RvQ29sb3IodGFnVGl0bGUudG9Mb3dlckNhc2UoKSlcbiAgICBjb25zdCBjb2xvciA9IHRoaXMudGFnU3ZjLmdldENvbnRyYXN0KGJnQ29sb3IpXG4gICAgcmV0dXJuIHsgY29sb3IsICdiYWNrZ3JvdW5kLWNvbG9yJzogYmdDb2xvciB9XG4gIH1cbiAgZ2V0VGFyZ2V0VGltZSgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEJhdGNoLnN0YXJ0RGF0ZSkge1xuICAgICAgdGhpcy50YXJnZXREYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZEJhdGNoLnN0YXJ0RGF0ZSlcbiAgICAgIGNvbnN0IGNvbnZlcnRlZERhdGUgPSBkYXlqcyh0aGlzLnNlbGVjdGVkQmF0Y2guc3RhcnREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKVxuICAgICAgcmV0dXJuIG5ldyBEYXRlKGNvbnZlcnRlZERhdGUpLmdldFRpbWUoKVxuICAgIH1cbiAgICAvLyB0aGlzLnRhcmdldFRpbWUgPSAnJ1xuICAgIHJldHVybiAnJ1xuICB9XG4gIGNhbGxUaW1lcigpIHtcbiAgICAvLyB0aGlzLnRhcmdldFRpbWUgPSB0aGlzLmdldFRhcmdldFRpbWUoKVxuICAgIGlmICh0aGlzLnNlcnZlckRhdGUpIHtcbiAgICAgIC8vIGxldCB0aW1lckludGVydmFsID0gdGltZXIoMTAwMCwgMTAwMClcbiAgICAgIC8vIHNldFRpbWVvdXQoKCk9PntcbiAgICAgIC8vICAgaWYgKHRoaXMudGltZXJJbnRlcnZhbENsZWFyKSB7XG4gICAgICAvLyAgICAgdGhpcy50aW1lckludGVydmFsQ2xlYXIudW5zdWJzY3JpYmUoKVxuICAgICAgLy8gICB9XG4gICAgICAvLyAgIHRoaXMudGltZXJJbnRlcnZhbENsZWFyID0gdGltZXJJbnRlcnZhbC5zdWJzY3JpYmUoKHQ6IGFueSkgPT4ge1xuXG4gICAgICAvLyAgICAgY29uc29sZS5sb2codGhpcy5zZWxlY3RlZEJhdGNoLnN0YXJ0RGF0ZSwnLS0tLScpXG4gICAgICAvLyAgICAgY29uc29sZS5sb2codGhpcy5iYXRjaENvbnRyb2wudmFsdWUuc3RhcnREYXRlLCdoaWlpaScpXG4gICAgICAvLyAgICAgdGhpcy50YXJnZXREYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZEJhdGNoLnN0YXJ0RGF0ZSlcbiAgICAgIC8vICAgICBjb25zdCBjb252ZXJ0ZWREYXRlID0gZGF5anModGhpcy5zZWxlY3RlZEJhdGNoLnN0YXJ0RGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJylcbiAgICAgIC8vICAgICB0aGlzLnRhcmdldFRpbWUgPSAnJ1xuICAgICAgLy8gICAgIHRoaXMudGFyZ2V0VGltZT1uZXcgRGF0ZShjb252ZXJ0ZWREYXRlKS5nZXRUaW1lKClcbiAgICAgIC8vICAgICB0aGlzLnRpbWVyRnVuYyh0LHRoaXMuc2VydmVyRGF0ZSArIHQgKiAxMDAwKVxuXG4gICAgICAvLyAgIH0pXG4gICAgICAvLyB9LDEwMClcbiAgICAgIGxldCB0ID0gMFxuICAgICAgaWYgKHRoaXMudGltZXJJbnRlcnZhbENsZWFyKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lckludGVydmFsQ2xlYXIpXG4gICAgICB9XG4gICAgICB0aGlzLnRpbWVySW50ZXJ2YWxDbGVhciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy50YXJnZXRUaW1lID0gJydcbiAgICAgICAgaWYgKHRoaXMuYmF0Y2hDb250cm9sICYmIHRoaXMuYmF0Y2hDb250cm9sLnZhbHVlICYmIHRoaXMuYmF0Y2hDb250cm9sLnZhbHVlLnN0YXJ0RGF0ZSkge1xuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5zZWxlY3RlZEJhdGNoLnN0YXJ0RGF0ZSwnLS0tLScpXG4gICAgICAgICAgdGhpcy50YXJnZXREYXRlID0gbmV3IERhdGUodGhpcy5iYXRjaENvbnRyb2wudmFsdWUuc3RhcnREYXRlKVxuICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZERhdGUgPSBkYXlqcyh0aGlzLmJhdGNoQ29udHJvbC52YWx1ZS5zdGFydERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpXG5cbiAgICAgICAgICB0aGlzLnRhcmdldFRpbWUgPSBuZXcgRGF0ZShjb252ZXJ0ZWREYXRlKS5nZXRUaW1lKClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpbWVyRnVuYyh0aGlzLnNlcnZlckRhdGUgKyB0ICogMTAwMClcbiAgICAgICAgdCA9IHQgKyAxXG4gICAgICB9LCAxMDAwKVxuXG4gICAgfVxuICB9XG5cbiAgdGltZXJGdW5jKHNlcnZlckRhdGU6IGFueSkge1xuICAgIC8vIHNlcnZlckRhdGUgPSBzZXJ2ZXJEYXRlICsgdGltZWVyXG4gICAgaWYgKHNlcnZlckRhdGUgJiYgdGhpcy50YXJnZXRUaW1lKSB7XG4gICAgICBsZXQgdGltZXJMb2NhbCA9IHtcbiAgICAgICAgZGF5czogMCxcbiAgICAgICAgaG91cnM6IDAsXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgc2Vjb25kczogMCxcbiAgICAgIH1cbiAgICAgIC8vIHNlcnZlckRhdGUgPSBzZXJ2ZXJEYXRlICArICAxMDAwXG4gICAgICB0aGlzLmRhdGUgPSBuZXcgRGF0ZShzZXJ2ZXJEYXRlKVxuICAgICAgdGhpcy5ub3cgPSB0aGlzLmRhdGUuZ2V0VGltZSgpXG4gICAgICB0aGlzLmRpZmZlcmVuY2UgPSB0aGlzLnRhcmdldFRpbWUgLSB0aGlzLm5vd1xuICAgICAgdGhpcy5kaWZmZXJlbmNlID0gdGhpcy5kaWZmZXJlbmNlIC8gKDEwMDAgKiA2MCAqIDYwICogMjQpXG5cbiAgICAgIHRoaXMuZGF5cyA9IE1hdGguZmxvb3IodGhpcy5kaWZmZXJlbmNlKVxuICAgICAgdGhpcy5ob3VycyA9IDIzIC0gdGhpcy5kYXRlLmdldEhvdXJzKClcbiAgICAgIHRoaXMubWludXRlcyA9IDYwIC0gdGhpcy5kYXRlLmdldE1pbnV0ZXMoKVxuICAgICAgdGhpcy5zZWNvbmRzID0gNjAgLSB0aGlzLmRhdGUuZ2V0U2Vjb25kcygpXG4gICAgICBOdW1iZXIodGhpcy5ob3VycylcbiAgICAgICFpc05hTih0aGlzLmRheXMpXG4gICAgICAgID8gKHRoaXMuZGF5cyA9IE1hdGguZmxvb3IodGhpcy5kaWZmZXJlbmNlKSlcbiAgICAgICAgOiAodGhpcy5kYXlzID0gYDxpbWcgc3JjPVwiaHR0cHM6Ly9pLmdpZmVyLmNvbS9WQXlSLmdpZlwiIC8+YClcblxuICAgICAgdGltZXJMb2NhbCA9IHtcbiAgICAgICAgZGF5czogdGhpcy5kYXlzLFxuICAgICAgICBob3VyczogdGhpcy5ob3VycyxcbiAgICAgICAgbWluOiB0aGlzLm1pbnV0ZXMsXG4gICAgICAgIHNlY29uZHM6IHRoaXMuc2Vjb25kcyxcbiAgICAgIH1cbiAgICAgIHRoaXMudGltZXJTZXJ2aWNlLnNldFRpbWVyRGF0YSh0aW1lckxvY2FsKVxuICAgIH1cbiAgfVxuXG4gIGdldCBzaG93RGlzYWJsZU1zZygpIHtcbiAgICBjb25zdCBhbGxCYXRjaGVzID0gdGhpcy5iYXRjaERhdGEuY29udGVudFxuICAgIGNvbnN0IHN0YXR1czogYW55ID0gW11cbiAgICBpZiAoYWxsQmF0Y2hlcykge1xuICAgICAgYWxsQmF0Y2hlcy5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlRW5yb2xsbWVudEVuZERhdGUoZWxlKSB8fCB0aGlzLmRpc2FibGVFbnJvbGxCdG4pIHtcbiAgICAgICAgICBzdGF0dXMucHVzaChlbGUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICByZXR1cm4gc3RhdHVzLmxlbmd0aCA9PT0gYWxsQmF0Y2hlcy5sZW5ndGhcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBnZXQgZmluZE1lc3NhZ2UoKSB7XG4gICAgaWYgKHRoaXMuc2hvd0Rpc2FibGVNc2cpIHtcbiAgICAgIGNvbnN0IG1zZyA9IHRoaXMuV0ZTVEFUVVNfTVNHX01BUFBJTkcuRVhQSVJFRFxuICAgICAgcmV0dXJuIHRoaXMudG9jQ29uZmlnW21zZ11cbiAgICB9XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBvbkNsaWNrT2ZTaGFyZSgpIHtcbiAgICB0aGlzLmVuYWJsZVNoYXJlID0gdHJ1ZVxuICAgIHRoaXMucmFpc2VUZWxlbWV0cnkoJ3NoYXJlQ29udGVudCcpXG4gIH1cblxuICBhZGQoZXZlbnQ6IE1hdENoaXBJbnB1dEV2ZW50KTogdm9pZCB7XG4gICAgLy8gdGhpcy5nZXRVc2Vyc1RvU2hhcmUoZXZlbnQudmFsdWUpXG4gICAgaWYgKGV2ZW50LnZhbHVlICYmIHRoaXMubWF0QXV0b2NvbXBsZXRlICYmICF0aGlzLm1hdEF1dG9jb21wbGV0ZS5pc09wZW4pIHtcbiAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQuaW5wdXRcbiAgICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudmFsdWVcbiAgICAgIGlmICh0aGlzLnVzZXJzLmxlbmd0aCA9PT0gdGhpcy5tYXhFbWFpbHNMaW1pdCkge1xuICAgICAgICB0aGlzLm9wZW5TbmFja2Jhcih0aGlzLnRyYW5zbGF0ZUxhYmVscygnbWF4TGltaXQnLCAnY29udGVudFNoYXJpbmcnLCAnJykpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKHRoaXMudXNlcnMuaW5jbHVkZXModmFsdWUudHJpbSgpKSkge1xuICAgICAgICB0aGlzLm9wZW5TbmFja2Jhcih0aGlzLnRyYW5zbGF0ZUxhYmVscygnZHVsaWNhdGVFbWFpbCcsICdjb250ZW50U2hhcmluZycsICcnKSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgY29uc3QgZVBhdHRlcm4gPSBuZXcgUmVnRXhwKC9eKD8hLipcXC5cXC4pKD8hLipcXC5fKSg/IS4qXFwuX1xcLikoPyEuKlxcLlxcLiQpKD8hLipcXC4kKVthLXpBLVowLTlfXSsoPzpcXC5bYS16QS1aMC05X10rKSpAKD86W2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV0qW2EtekEtWjAtOV0pP1xcLikrW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV0qW2EtekEtWjAtOV0pPyQvKVxuICAgICAgaWYgKGVQYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIGlmICgodmFsdWUgfHwgJycpLnRyaW0oKSkge1xuICAgICAgICAgIHRoaXMudXNlcnMucHVzaCh2YWx1ZS50cmltKCkpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgaW5wdXQudmFsdWUgPSAnJ1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckN0cmwuc2V0VmFsdWUoJycpXG4gICAgICAgIGNvbnN0IGVsOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdtYXQtY2hpcC1saXN0LXdyYXBwZXInKVxuICAgICAgICBpZiAoZWwgIT0gbnVsbCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZWxbMF0uc2Nyb2xsVG9wID0gZWxbMF0uc2Nyb2xsSGVpZ2h0XG4gICAgICAgICAgfSwgMjAwKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wZW5TbmFja2Jhcih0aGlzLnRyYW5zbGF0ZUxhYmVscygnaW52YWxpZEVtYWlsJywgJ2NvbnRlbnRTaGFyaW5nJywgJycpKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmUodXNlcjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnVzZXJzLmluZGV4T2YodXNlcilcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB0aGlzLnVzZXJzLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH1cblxuICBzZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVzZXJzLmxlbmd0aCA9PT0gdGhpcy5tYXhFbWFpbHNMaW1pdCkge1xuICAgICAgdGhpcy5vcGVuU25hY2tiYXIodGhpcy50cmFuc2xhdGVMYWJlbHMoJ21heExpbWl0JywgJ2NvbnRlbnRTaGFyaW5nJywgJycpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0aGlzLnVzZXJzLmluY2x1ZGVzKGV2ZW50Lm9wdGlvbi52YWx1ZSkpIHtcbiAgICAgIHRoaXMub3BlblNuYWNrYmFyKHRoaXMudHJhbnNsYXRlTGFiZWxzKCdkdWxpY2F0ZVVzZXInLCAnY29udGVudFNoYXJpbmcnLCAnJykpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy51c2Vycy5wdXNoKGV2ZW50Lm9wdGlvbi52YWx1ZSlcbiAgICBpZiAodGhpcy51c2VySW5wdXQpIHtcbiAgICAgIHRoaXMudXNlcklucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJ1xuICAgIH1cbiAgICB0aGlzLnVzZXJDdHJsLnNldFZhbHVlKCcnKVxuICAgIGNvbnN0IGVsOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdtYXQtY2hpcC1saXN0LXdyYXBwZXInKVxuICAgIGlmIChlbCAhPSBudWxsKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWxbMF0uc2Nyb2xsVG9wID0gZWxbMF0uc2Nyb2xsSGVpZ2h0XG4gICAgICB9LCAyMDApXG4gICAgfVxuICB9XG5cbiAgZmlsdGVyU2hhcmVkVXNlcnModmFsdWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKVxuICAgICAgcmV0dXJuIHRoaXMuYWxsVXNlcnMuZmlsdGVyKHVzZXIgPT4gdXNlci5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKVxuICAgIH1cbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHN1Ym1pdFNoYXJpbmcoKSB7XG4gICAgbGV0IGNvdXJzZUlkID0gJydcbiAgICBsZXQgY291cnNlTmFtZSA9ICcnXG4gICAgbGV0IGNvdXJzZVBvc3RlckltYWdlVXJsID0gJydcbiAgICBsZXQgY291cnNlUHJvdmlkZXIgPSAnJ1xuICAgIGxldCBwcmltYXJ5Q2F0ZWdvcnkgPSAnJ1xuICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSkge1xuICAgICAgY291cnNlUHJvdmlkZXIgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS5yb290T3JnTmFtZSB8fCAnJ1xuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICBjb3Vyc2VJZCA9IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICBjb3Vyc2VOYW1lID0gdGhpcy5jb250ZW50Lm5hbWUsXG4gICAgICAgIGNvdXJzZVBvc3RlckltYWdlVXJsID0gdGhpcy5jb250ZW50LnBvc3RlckltYWdlIHx8ICcnLFxuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnkgPSB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5XG4gICAgfVxuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgY291cnNlSWQsXG4gICAgICAgIGNvdXJzZU5hbWUsXG4gICAgICAgIGNvdXJzZVBvc3RlckltYWdlVXJsLFxuICAgICAgICBjb3Vyc2VQcm92aWRlcixcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICByZWNpcGllbnRzOiAnJyxcbiAgICAgIH0sXG4gICAgfVxuICAgIGNvbnN0IHJlY2lwaWVudHM6IGFueSA9IFtdXG4gICAgdGhpcy51c2Vycy5mb3JFYWNoKChzZWxlY3RlZFVzZXI6IGFueSkgPT4ge1xuICAgICAgaWYgKHNlbGVjdGVkVXNlci5pbmNsdWRlcygnQCcpICYmIHNlbGVjdGVkVXNlci5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgIHJlY2lwaWVudHMucHVzaCh7IGVtYWlsOiBzZWxlY3RlZFVzZXIgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVXNlck9iajogYW55ID0gdGhpcy5hbGxVc2Vycy5maWx0ZXIodXNlciA9PiB1c2VyLm5hbWUgPT09IHNlbGVjdGVkVXNlcilcbiAgICAgICAgaWYgKHNlbGVjdGVkVXNlck9iai5sZW5ndGgpIHtcbiAgICAgICAgICByZWNpcGllbnRzLnB1c2goeyB1c2VySWQ6IHNlbGVjdGVkVXNlck9ialswXS5pZCwgZW1haWw6IHNlbGVjdGVkVXNlck9ialswXS5lbWFpbCB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9KVxuICAgIGlmIChyZWNpcGllbnRzLmxlbmd0aCkge1xuICAgICAgb2JqLnJlcXVlc3QucmVjaXBpZW50cyA9IHJlY2lwaWVudHNcbiAgICAgIHRoaXMudG9jU3ZjLnNoYXJlQ29udGVudChvYmopLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnJlc3BvbnNlQ29kZSA9PT0gJ09LJykge1xuICAgICAgICAgIHRoaXMub3BlblNuYWNrYmFyKHRoaXMudHJhbnNsYXRlTGFiZWxzKCdzdWNjZXNzJywgJ2NvbnRlbnRTaGFyaW5nJywgJycpKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlcnMgPSBbXVxuICAgICAgICB0aGlzLmZpbHRlcmVkVXNlcnMgPSBbXVxuICAgICAgICB0aGlzLmFsbFVzZXJzID0gW11cbiAgICAgICAgdGhpcy5lbmFibGVTaGFyZSA9IGZhbHNlXG4gICAgICAgIHRoaXMudXNlckN0cmwuc2V0VmFsdWUoJycpXG4gICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgICAgICB0aGlzLm9wZW5TbmFja2Jhcih0aGlzLnRyYW5zbGF0ZUxhYmVscygnZXJyb3InLCAnY29udGVudFNoYXJpbmcnLCAnJykpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIG9uQ2xvc2UoKSB7XG4gICAgdGhpcy5lbmFibGVTaGFyZSA9IGZhbHNlXG4gICAgdGhpcy51c2VycyA9IFtdXG4gICAgdGhpcy5maWx0ZXJlZFVzZXJzID0gW11cbiAgICB0aGlzLmFsbFVzZXJzID0gW11cbiAgICB0aGlzLnVzZXJDdHJsLnNldFZhbHVlKCcnKVxuICAgIHRoaXMucmFpc2VUZWxlbWV0cnkoJ3NoYXJlQ2xvc2UnKVxuICB9XG5cbiAgY29weVRvQ2xpcGJvYXJkKCkge1xuICAgIGNvbnN0IHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKVxuICAgIHRleHRBcmVhLnZhbHVlID0gd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRleHRBcmVhKVxuICAgIC8vdGV4dEFyZWEuZm9jdXMoKVxuICAgIHRleHRBcmVhLnNlbGVjdCgpXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKVxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGV4dEFyZWEpXG4gICAgdGhpcy5vcGVuU25hY2tiYXIodGhpcy50cmFuc2xhdGVMYWJlbHMoJ2xpbmtDb3BpZWQnLCAnY29udGVudFNoYXJpbmcnLCAnJykpXG4gICAgdGhpcy5yYWlzZVRlbGVtZXRyeSgnY29weVRvQ2xpcGJvYXJkJylcbiAgfVxuXG4gIHJhaXNlVGVsZW1ldHJ5KHN1YlR5cGU6IGFueSkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjbGljaycsXG4gICAgICAgIHN1YlR5cGU6IHN1YlR5cGUsXG4gICAgICAgIGlkOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA6ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5pZGVudGlmaWVyIDogJycsXG4gICAgICAgIHR5cGU6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgOiAnJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhZ2VJZEV4dDogYGJ0bi0ke3N1YlR5cGV9YCxcbiAgICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5DT05URU5ULFxuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIHRyYW5zbGF0ZUxhYmVscyhsYWJlbDogc3RyaW5nLCB0eXBlOiBhbnksIHN1YnR5cGU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmxhbmd0cmFuc2xhdGlvbnMudHJhbnNsYXRlQWN0dWFsTGFiZWwobGFiZWwsIHR5cGUsIHN1YnR5cGUpXG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnRvY1N2Yy5hbmFseXRpY3NGZXRjaFN0YXR1cyA9ICdub25lJ1xuICAgIGlmICh0aGlzLnJvdXRlclBhcmFtU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJvdXRlclBhcmFtU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgaWYgKHRoaXMucm91dGVTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucm91dGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZiAodGhpcy5iYXRjaFdGRGF0YVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5iYXRjaFdGRGF0YVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLnRpbWVySW50ZXJ2YWxDbGVhcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVySW50ZXJ2YWxDbGVhcik7XG4gICAgICAvLyB0aGlzLnRpbWVySW50ZXJ2YWxDbGVhci51bnN1YnNjcmliZSgpXG4gICAgICB0aGlzLnRhcmdldFRpbWUgPSAnJ1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuYmF0Y2hDb250cm9sVW5zdWJzY3JpYmUudW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICB0aGlzLmJhdGNoQ29udHJvbC5zZXRWYWx1ZSh7fSlcbiAgICB0aGlzLmJhdGNoQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClcbiAgICB0aGlzLnNlbGVjdGVkQmF0Y2ggPSB7fVxuICB9XG5cbiAgdHJhbnNsYXRlTGFiZWwobGFiZWw6IHN0cmluZywgdHlwZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMubGFuZ3RyYW5zbGF0aW9ucy50cmFuc2xhdGVMYWJlbChsYWJlbCwgdHlwZSwgJycpXG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJoZWFkZXItc3lub3BzaXMgZml4ZWQtd2lkdGggbWFyZ2luLXRvcC14bFwiIFtuZ0NsYXNzXT1cInsgJ2hlYWRlci1zeW5vcHNpcy1ncmFkaWVudCc6IGJhbm5lclVybCB9XCJcbiAgKm5nSWY9XCJzaG93XCI+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgtYXV0b1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci10aXRsZSBmbGV4LWNvbCBzbTpmbGV4LXJvd1wiPlxuICAgICAgICA8IS0tIGltYWdlIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udGVudD8ucG9zdGVySW1hZ2VcIiBjbGFzcz1cImZsb2F0LWxlZnRcIj5cbiAgICAgICAgICA8aW1nIFtzcmNdPVwiY29udGVudD8ucG9zdGVySW1hZ2UgfCBwaXBlUHVibGljVVJMXCIgW2lkXT1cIidzb3VyY2VfJyArIGNvbnRlbnQuaWRlbnRpZmllclwiIGNsYXNzPVwiYXBwLWljb25cIlxuICAgICAgICAgICAgW3dzVXRpbHNEZWZhdWx0VGh1bWJuYWlsXT1cImRlZmF1bHRTTG9nb1wiIFthbHRdPVwiY29udGVudC5zb3VyY2VOYW1lIHx8IGlHT1RcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFjb250ZW50Py5wb3N0ZXJJbWFnZVwiIGNsYXNzPVwiZmxvYXQtbGVmdFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5hcHBJY29uOyBlbHNlIGRlZmF1bHRJbWdcIj5cbiAgICAgICAgICAgIDxpbWcgW3NyY109XCJjb250ZW50Py5hcHBJY29uIHwgcGlwZVB1YmxpY1VSTFwiIFtpZF09XCInc291cmNlXycgKyBjb250ZW50LmlkZW50aWZpZXJcIiBjbGFzcz1cImFwcC1pY29uXCJcbiAgICAgICAgICAgICAgW3dzVXRpbHNEZWZhdWx0VGh1bWJuYWlsXT1cImRlZmF1bHRTTG9nb1wiIFthbHRdPVwiY29udGVudC5zb3VyY2VOYW1lIHx8IGlHT1RcIiAvPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEltZz5cbiAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pbnN0YW5jZXMvZWFnbGUvYXBwX2xvZ29zL2RlZmF1bHQucG5nXCIgW2lkXT1cIidzb3VyY2VfJyArIGNvbnRlbnQuaWRlbnRpZmllclwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYXBwLWljb25cIiBbYWx0XT1cImNvbnRlbnQuc291cmNlTmFtZSB8fCBpR09UXCIgLz5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNtOm1sLTUgZmxleCBmbGV4LWF1dG9cIiBbaWRdPVwiJ20tYy0nKyBjb250ZW50LmlkZW50aWZpZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic206bWwtNSBmbGV4IGZsZXgtY29sIGZsZXgtYXV0b1wiPlxuICAgICAgICAgICAgPGgxIGNsYXNzPVwibWF0LWhlYWRsaW5lIG1hcmdpbi1yZW1vdmUtYm90dG9tIHBhZGRpbmctYm90dG9tLXhzIGhpZGRlbiBzbTpibG9ja1wiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCJjb250ZW50UmVhZERhdGE/Lm5hbWVcIj5cbiAgICAgICAgICAgICAge3sgY29udGVudFJlYWREYXRhPy5uYW1lIH19XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbG9hdC1yaWdodCBjdXJzb3ItcG9pbnRlciBmbGV4XCIgKGNsaWNrKT1cIm9uQ2xpY2tPZlNoYXJlKClcIiAqbmdJZj1cImNhblNoYXJlXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwid3MtbWF0LWFjY2VudC10ZXh0IHBhZGRpbmctdG9wLXhzXCI+c2hhcmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICA8aDEgY2xhc3M9XCJtYXQtaGVhZGxpbmUgbWFyZ2luLXJlbW92ZS1ib3R0b20gcGFkZGluZy1ib3R0b20teHMgYmxvY2sgc206aGlkZGVuXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cImNvbnRlbnRSZWFkRGF0YT8ubmFtZVwiPlxuICAgICAgICAgICAgICB7eyBjb250ZW50UmVhZERhdGE/Lm5hbWUgfX1cbiAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbnRlbnRQcm9ncmVzcyA9PT0gMVwiIGNsYXNzPVwibWFyZ2luLWxlZnQtc1wiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ3cy1tYXQtYWNjZW50LXRleHRcIj5jaGVja19jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeVwiIGNsYXNzPVwiYXBJY29uIGZsb2F0LWxlZnQgbWItNFwiPlxuICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9jb3Vyc2Uuc3ZnXCIgW2lkXT1cIidzb3VyY2VfJyArIGNvbnRlbnQuaWRlbnRpZmllclwiIGNsYXNzPVwic291cmNlLWljb25cIlxuICAgICAgICAgICAgICAgIFt3c1V0aWxzRGVmYXVsdFRodW1ibmFpbF09XCJkZWZhdWx0U0xvZ29cIiBbYWx0XT1cImNvbnRlbnQuc291cmNlTmFtZSB8fCBpR09UXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgdHJhbnNsYXRlTGFiZWwoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5LCAnc2VhcmNoZmlsdGVycycpIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udGVudD8uYXBwSWNvblwiIGNsYXNzPVwiYXBJY29uIGZsb2F0LWxlZnQgbWItNFwiPlxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiY29udGVudD8uY3JlYXRvckxvZ28gfCBwaXBlUHVibGljVVJMXCIgW2lkXT1cIidzb3VyY2VfJyArIGNvbnRlbnQuaWRlbnRpZmllclwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzb3VyY2UtaWNvblwiIFt3c1V0aWxzRGVmYXVsdFRodW1ibmFpbF09XCJkZWZhdWx0U0xvZ29cIiBbYWx0XT1cImNvbnRlbnQuc291cmNlTmFtZSB8fCBpR09UXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwicm91dGVQYXRoXCIgY2xhc3M9XCJoZWFkZXItbWV0YVwiIFtuZ0NsYXNzXT1cInsgJ2hlYWRlci1tZXRhLWJhbm5lcic6IGJhbm5lclVybCB9XCI+XG4gICAgICAgICAgICAgIDwhLS0gT3ZlcnZpZXcgU2VjdGlvbiAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhbm5lci1vdmVydmlldy1jb250YWluZXJcIiBbaGlkZGVuXT1cIiFjb250ZW50Py5wdXJwb3NlICYmIHNob3dTdWJ0aXRsZU9uQmFubmVyXCJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ292ZXJ2aWV3J1wiPlxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cIm92ZXJ2aWV3LWRlc2NyaXB0aW9uIG1hdC1ib2R5LTFcIiAqbmdJZj1cInNob3dTdWJ0aXRsZU9uQmFubmVyXCIgaTE4bi10aXRsZSB0aXRsZT1cIlN1YnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICB7eyBjb250ZW50Py5zb3VyY2UgfCBwaXBlTGltaXRUbzogMjUwIH19XG4gICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm92ZXJ2aWV3LWRlc2NyaXB0aW9uIG1hdC1ib2R5LTFcIiAqbmdJZj1cIiFzaG93U3VidGl0bGVPbkJhbm5lclwiIGkxOG4tdGl0bGUgdGl0bGU9XCJEZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAge3sgY29udGVudD8uaW5zdHJ1Y3Rpb25zIHwgcGlwZUxpbWl0VG86IDQ1MCB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2FuaXRpemVkSW50cm9kdWN0b3J5VmlkZW9JY29uXCIgY2xhc3M9XCJvdmVydmlldy1pbnRybyB3cy1tYXQtcHJpbWFyeS1saXRlLWJhY2tncm91bmRcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRJbWFnZV09XCJzYW5pdGl6ZWRJbnRyb2R1Y3RvcnlWaWRlb0ljb25cIiByb2xlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInBsYXlJbnRyb1ZpZGVvKClcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiByb2xlPVwiYnV0dG9uXCIgY2xhc3M9XCJvdmVydmlldy1pbnRyby1vdmVybGF5XCI+cGxheV9hcnJvdzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8IS0tIFRvYyBTZWN0aW9uIC0tPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInY29udGVudHMnXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBDb250ZW50cyBCYW5uZXIgLS0+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8IS0tIEFuYWx5dGljcyBTZWN0aW9uIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFubmVyLW92ZXJ2aWV3LWNvbnRhaW5lciBtYXQtYm9keS0xXCIgW2hpZGRlbl09XCIhY29udGVudD8ucHVycG9zZSAmJiBzaG93U3VidGl0bGVPbkJhbm5lclwiXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidhbmFseXRpY3MnXCI+XG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwib3ZlcnZpZXctZGVzY3JpcHRpb24gbWF0LWJvZHktMVwiICpuZ0lmPVwic2hvd1N1YnRpdGxlT25CYW5uZXJcIiBpMThuLXRpdGxlIHRpdGxlPVwiU3VidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGNvbnRlbnQ/LnB1cnBvc2UgfCBwaXBlTGltaXRUbzogMjUwIH19XG4gICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm92ZXJ2aWV3LWRlc2NyaXB0aW9uIG1hdC1ib2R5LTFcIiAqbmdJZj1cIiFzaG93U3VidGl0bGVPbkJhbm5lclwiIGkxOG4tdGl0bGUgdGl0bGU9XCJEZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAge3sgY29udGVudD8uaW5zdHJ1Y3Rpb25zIHwgcGlwZUxpbWl0VG86IDQ1MCB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2FuaXRpemVkSW50cm9kdWN0b3J5VmlkZW9JY29uXCIgY2xhc3M9XCJvdmVydmlldy1pbnRybyB3cy1tYXQtcHJpbWFyeS1saXRlLWJhY2tncm91bmRcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRJbWFnZV09XCJzYW5pdGl6ZWRJbnRyb2R1Y3RvcnlWaWRlb0ljb25cIiByb2xlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInBsYXlJbnRyb1ZpZGVvKClcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiByb2xlPVwiYnV0dG9uXCIgY2xhc3M9XCJvdmVydmlldy1pbnRyby1vdmVybGF5XCI+cGxheV9hcnJvdzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udGVudD8uYXZlcmFnZVJhdGluZ1wiIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcmF0aW5nIG1hcmdpbi1ib3R0b20tbVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJhdGluZy1udW1iZXIgbWF0LWJvZHktMlwiPnt7IGNvbnRlbnQ/LmF2ZXJhZ2VSYXRpbmcgfX0mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1pY29uIG1hdGVyaWFsLWljb25zXCIgKm5nRm9yPVwibGV0IHJhdGluZyBvZiBbMSwgMiwgMywgNCwgNV1cIj5cbiAgICAgICAgICAgICAgICB7eyBnZXRSYXRpbmdJY29uKHJhdGluZykgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hcmdpbi1sZWZ0LXhzIHJhdGluZy1jb3VudCBtYXQtYm9keS0yXCIgKm5nSWY9XCJjb250ZW50Py50b3RhbFJhdGluZ1wiPlxuICAgICAgICAgICAgICAgICgge3sgY29udGVudD8udG90YWxSYXRpbmcgfCBwaXBlQ291bnRUcmFuc2Zvcm0gfX0gKTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb250ZW50Py5hdmVyYWdlUmF0aW5nXCIgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciByYXRpbmcgbWFyZ2luLWJvdHRvbS1tXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmF0aW5nLW51bWJlciBtYXQtYm9keS0yXCI+IDAuMCAmbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1pY29uIG1hdGVyaWFsLWljb25zXCIgKm5nRm9yPVwibGV0IHJhdGluZyBvZiBbMSwgMiwgMywgNCwgNV1cIj5cbiAgICAgICAgICAgICAgICB7eyBnZXRSYXRpbmdJY29uKHJhdGluZykgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hcmdpbi1sZWZ0LXhzIHJhdGluZy1jb3VudCBtYXQtYm9keS0yXCIgKm5nSWY9XCIhY29udGVudD8udG90YWxSYXRpbmdcIj5cbiAgICAgICAgICAgICAgICAoIHt7IDAgfCBwaXBlQ291bnRUcmFuc2Zvcm0gfX0gKTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSB0YWdzIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhZ3MgbWFyZ2luLWJvdHRvbS1zXCIgKm5nSWY9XCJjb250ZW50Py5rZXl3b3JkcyAmJiBjb250ZW50Py5rZXl3b3Jkcz8ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgdGFnIG9mIGNvbnRlbnQua2V5d29yZHNcIiBjbGFzcz1cInRhZ1wiPlxuICAgICAgICAgICAgICAgIHt7dGFnfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG48bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNXCI+XG4gIDxkaXYgY2xhc3M9XCJiYXRjaC1kaXZcIj5cbiAgICA8ZGl2IGNsYXNzPVwicmVxdWVzdC1ibG9ja1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJiYXRjaERyb3Bkb3duXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiYmF0Y2hEYXRhICYmICFiYXRjaERhdGE/LmVucm9sbGVkICAmJiBiYXRjaERhdGE/LndvcmtGbG93Py53ZkluaXRpYXRlZCAmJlxuICAgICAgICAoYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzICE9PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlJFSkVDVEVEKSAmJiAoYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzICE9PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlJFTU9WRUQpICYmXG4gICAgICAgIChiYXRjaERhdGE/LndvcmtGbG93Py53Zkl0ZW0/LmN1cnJlbnRTdGF0dXMgIT09IFdGQmxlbmRlZFByb2dyYW1TdGF0dXMuV0lUSERSQVdOKSAmJlxuICAgICAgICAoYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzICE9PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLkFQUFJPVkVEKSAmJiBiYXRjaERhdGE/LmNvbnRlbnQ/Lmxlbmd0aFwiPlxuICAgICAgICA8cCBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIG1hdC1ib2R5LTEgcGFkZGluZy1tIGJnLXdoaXRlXCI+XG4gICAgICAgICAge3tiYXRjaERhdGE/LndvcmtGbG93Py5iYXRjaD8ubmFtZX19IC0gKHt7YmF0Y2hEYXRhPy53b3JrRmxvdz8uYmF0Y2g/LnN0YXJ0RGF0ZSB8IGRhdGU6ICdkZC1NTS15eXl5J319IC1cbiAgICAgICAgICB7e2JhdGNoRGF0YT8ud29ya0Zsb3c/LmJhdGNoPy5lbmREYXRlIHwgZGF0ZTogJ2RkLU1NLXl5eXknIHx8ICdwcmVzZW50J319KVxuICAgICAgICA8L3A+XG4gICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIndpdGhkcmF3LWJhdGNoXCIgKGNsaWNrKT1cIiFkaXNhYmxlV2l0aGRyYXduQnRuICYmIHJlcXVlc3RUb1dpdGhkcmF3RGlhbG9nKClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVXaXRoZHJhd25CdG5cIiBbbmdDbGFzc109XCJ7ICdkaXNhYmxlLWJ0bic6IGRpc2FibGVXaXRoZHJhd25CdG4gfVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj4ge3sgJ2FwcHRvY2Jhbm5lci53aXRoRHJhd1lvdXJSZXF1ZXN0JyB8IHRyYW5zbGF0ZSB9fSA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJiYXRjaERhdGEgJiYgYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiBiYXRjaERhdGE/LmNvbnRlbnQ/Lmxlbmd0aFwiPlxuICAgICAgICA8aDMgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBwLTQgYmctd2hpdGUgbWF0LWJvZHktMVwiICpuZ0Zvcj1cImxldCBiYXRjaCBvZiBiYXRjaERhdGEuY29udGVudFwiPlxuICAgICAgICAgIHt7YmF0Y2g/Lm5hbWV9fSAoe3tiYXRjaD8uc3RhcnREYXRlIHwgZGF0ZTogJ2RkLU1NLXl5eXknIH19IC0ge3tiYXRjaD8uZW5kRGF0ZSB8IGRhdGU6ICdkZC1NTS15eXl5JyB8fFxuICAgICAgICAgICdwcmVzZW50J319KVxuICAgICAgICA8L2gzPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInN0YXR1c01zZ1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYmF0Y2hEYXRhICYmICFiYXRjaERhdGE/LmVucm9sbGVkICYmICFiYXRjaERhdGE/LmNvbnRlbnQ/Lmxlbmd0aFwiPlxuICAgICAgICA8aDMgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBtYXQtYm9keS0yIHdzLWRlZmF1bHQtdGV4dFwiPlxuICAgICAgICAgIE5vIGJhdGNoZXNcbiAgICAgICAgPC9oMz5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImJhdGNoRGF0YSAmJiBiYXRjaERhdGE/LmNvbnRlbnQ/Lmxlbmd0aCAmJiBiYXRjaERhdGE/LmNvbnRlbnRbMF0/LmJhdGNoQXR0cmlidXRlcz8uYmF0Y2hMb2NhdGlvbkRldGFpbHNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBsb2NhdGlvbi13cmFwcGVyXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibG9jYXRpb24taWNvblwiPlxuICAgICAgICAgICAgbG9jYXRpb25fb248L21hdC1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvYy1kZXRhaWxzXCI+XG4gICAgICAgICAgICB7e2JhdGNoRGF0YT8uY29udGVudFswXT8uYmF0Y2hBdHRyaWJ1dGVzPy5iYXRjaExvY2F0aW9uRGV0YWlsc319XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+IC0tPlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJhdGNoRGF0YSAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiBiYXRjaERhdGE/LmNvbnRlbnQ/Lmxlbmd0aFwiXG4gICAgW25nVGVtcGxhdGVPdXRsZXRdPVwic3RhdHVzTXNnXCI+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb3Vyc2VDYXRlZ29yeSA9PT0gbnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5NT0RFUkFURURfUFJPR1JBTVwiPlxuICA8ZGl2IGNsYXNzPVwicmVxdWVzdC1iYXRjaFwiPlxuICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1kaXZcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50XCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYmF0Y2hEcm9wZG93blwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuPCEtLSA8ZGl2IGNsYXNzPVwiaGVhZGVyLXN5bm9wc2lzIGZpeGVkLXdpZHRoIG1hcmdpbi10b3AtbFwiIFtuZ0NsYXNzXT1cInsgJ2hlYWRlci1zeW5vcHNpcy1ncmFkaWVudCc6IGJhbm5lclVybCB9XCIgKm5nSWY9XCJjb250ZW50ICYmIGJhdGNoQ29udHJvbD8udmFsdWU/LmJhdGNoQXR0cmlidXRlcz8uYmF0Y2hMb2NhdGlvbkRldGFpbHNcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgIDxoMj57eydhcHB0b2NiYW5uZXIuYmF0Y2hMb2NhdGlvbicgfCB0cmFuc2xhdGV9fTwvaDI+XG4gICAgPHA+e3tiYXRjaENvbnRyb2w/LnZhbHVlPy5iYXRjaEF0dHJpYnV0ZXM/LmJhdGNoTG9jYXRpb25EZXRhaWxzfX08L3A+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+IC0tPlxuXG48bWF0LW1lbnUgI2FjdGlvbk1lbnU9XCJtYXRNZW51XCI+XG4gIDxkaXYgbWF0LW1lbnUtaXRlbT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudFwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFjdGlvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L21hdC1tZW51PlxuXG48bmctdGVtcGxhdGUgI2FjdGlvbnM+XG4gIDxhIGkxOG4tYXJpYS1sYWJlbCBhcmlhLWxhYmVsPVwiVGFrZSBBY3Rpb25cIiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCJyZXZpZXdCdXR0b25cIlxuICAgIFtyb3V0ZXJMaW5rXT1cIlsnL2F1dGhvci9lZGl0b3IvJyArIGNvbnRlbnQ/LmlkZW50aWZpZXJdXCI+XG4gICAgPG1hdC1pY29uPnB1Ymxpc2g8L21hdC1pY29uPlxuICA8L2E+XG4gIDx3cy13aWRnZXQtYnRuLWNvbnRlbnQtZG93bmxvYWQgaWQ9XCJwcmV2Zm9yZG93bmxvYWRcIiBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCJcbiAgICBbd2lkZ2V0RGF0YV09XCJjb250ZW50IHwgcGlwZVBhcnRpYWxDb250ZW50IDogWydpZGVudGlmaWVyJywgJ2NvbnRlbnRUeXBlJywgJ3Jlc291cmNlVHlwZScsICdtaW1lVHlwZScsICdkb3dubG9hZFVybCcsICdpc0V4dGVybmFsJywgJ2FydGlmYWN0VXJsJ11cIj5cbiAgPC93cy13aWRnZXQtYnRuLWNvbnRlbnQtZG93bmxvYWQ+XG4gIDx3cy13aWRnZXQtYnRuLWNvbnRlbnQtc2hhcmUgaWQ9XCJwcmV2Zm9yc2hhcmVcIiBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCIgW3dpZGdldERhdGFdPVwiY29udGVudFwiPlxuICA8L3dzLXdpZGdldC1idG4tY29udGVudC1zaGFyZT5cbiAgPHdzLXdpZGdldC1idG4ta2IgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIGlkPVwicHJldlwiIFtjb250ZW50SWRdPVwiY29udGVudD8uaWRlbnRpZmllclwiXG4gICAgW2NvbnRlbnROYW1lXT1cImNvbnRlbnRSZWFkRGF0YT8ubmFtZVwiIFtjb250ZW50VHlwZV09XCJjb250ZW50Py5jb250ZW50VHlwZVwiIFtzdGF0dXNdPVwiY29udGVudD8uc3RhdHVzXCI+XG4gIDwvd3Mtd2lkZ2V0LWJ0bi1rYj5cbiAgPHdzLXdpZGdldC1idG4tZ29hbHMgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIGlkPVwiZ29hbHNmb3JwcmV2XCIgKm5nSWY9XCJpc0dvYWxzRW5hYmxlZCAmJiBidG5Hb2Fsc0NvbmZpZ1wiXG4gICAgW3dpZGdldERhdGFdPVwiYnRuR29hbHNDb25maWdcIj5cbiAgPC93cy13aWRnZXQtYnRuLWdvYWxzPlxuICA8d3Mtd2lkZ2V0LWJ0bi1wbGF5bGlzdCBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCIgaWQ9XCJwbGF5bGlzdGZvcnByZXZcIiAqbmdJZj1cImJ0blBsYXlsaXN0Q29uZmlnXCJcbiAgICBbd2lkZ2V0RGF0YV09XCJidG5QbGF5bGlzdENvbmZpZ1wiPlxuICA8L3dzLXdpZGdldC1idG4tcGxheWxpc3Q+XG4gIDx3cy13aWRnZXQtYnRuLWNvbnRlbnQtZmVlZGJhY2stdjIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIGlkPVwiZmVlZGJhY2tmb3JwcmV2XCJcbiAgICBbd2lkZ2V0RGF0YV09XCJjb250ZW50IHwgcGlwZVBhcnRpYWxDb250ZW50OiBbJ2lkZW50aWZpZXInLCAnbmFtZSddXCI+XG4gIDwvd3Mtd2lkZ2V0LWJ0bi1jb250ZW50LWZlZWRiYWNrLXYyPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjYXV0aFZpZXc+e3snYXBwdG9jYmFubmVyLnZpZXcnIHwgdHJhbnNsYXRlfX08L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNzdGF0dXNNc2c+XG4gIDxkaXYgY2xhc3M9XCJzdGF0dXMtY29udGFpbmVyIG10LTIgbWItMlwiXG4gICAgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gJiYgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJbml0aWF0ZWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleFwiICpuZ0lmPVwic2hvd01zZ1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dJY29uXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1yLTRcIiBbbmdDbGFzc109XCJpY29uQ29sb3JcIiAqbmdJZj1cIldGSWNvbiA9PT0gJ2NpcmNsZSdcIj5jaGVja19jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtci00IHdzLW1hdC1yZWQtdGV4dCB2aXNpYmlsaXR5LXNob3dcIiBzdHlsZT1cInRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XCJcbiAgICAgICAgICAqbmdJZj1cIldGSWNvbiA9PT0gJ2luZm8nXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXQtYm9keS0xXCI+e3sgZ2V0V0ZNc2cgfX08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzdGF0dXMtY29udGFpbmVyIG10LTVcIlxuICAgICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNICYmIHNob3dEaXNhYmxlTXNnICYmICFzaG93TXNnICYmIGZpbmRNZXNzYWdlLmxlbmd0aCA+IDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibXItMyB3cy1tYXQtcmVkLXRleHRcIiBzdHlsZT1cInRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XCI+aW5mbzwvbWF0LWljb24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXQtYm9keS0xXCI+XG4gICAgICAgIDxwIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gXCI+e3tmaW5kTWVzc2FnZX19PC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdiBjbGFzcz1cInNoYXJlLWNvbnRhaW5lclwiICpuZ0lmPVwiZW5hYmxlU2hhcmVcIj5cbiAgPGRpdiAqbmdJZj1cInNob3dMb2FkZXJcIiBjbGFzcz1cInRleHQtY2VudGVyIG15LTIgbG9hZGVyXCI+XG4gICAgPG1hdC1zcGlubmVyIGNsYXNzPVwiaW5saW5lLWJsb2NrXCI+PC9tYXQtc3Bpbm5lcj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBjbG9zZS1zaGFyZS1kaWFsb2dcIj48bWF0LWljb24gKGNsaWNrKT1cIm9uQ2xvc2UoKVwiIGNsYXNzPVwiY2xvc2UtaWNvblwiPmNsb3NlPC9tYXQtaWNvbj48L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNoYXJlLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cImthcm1hc2FoYXlvZ2ktaWNvblwiPjxpbWcgYWx0PVwia2FybWFzYWhheW9naS1pY29uXCIgc3JjPVwiL2Fzc2V0cy9pY29ucy9LYXJtYVNhaGF5b2dpLnN2Z1wiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWRpdlwiPlxuICAgICAgPGRpdiBjbGFzcz1cInRyaWFuZ2xlLWxlZnQgaGlkZGVuIG1kOmJsb2NrXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udG5ldFwiPlxuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cInctZnVsbCBmbGV4IGFsaWduLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC1oZWFkbGluZSBtYXJnaW4tcmVtb3ZlLWJvdHRvbSB3cy1tYXQtYmxhY2stdGV4dFwiPnt7J2NvbnRlbnRTaGFyaW5nLmhlYWRlcicgfCB0cmFuc2xhdGV9fTwvaDI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJzaGFyZUZvcm1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LWJvZHktMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1kLTVcIj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdCAjY2hpcExpc3QgYXJpYS1sYWJlbD1cInVzZXIgc2VsZWN0aW9uXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcCAqbmdGb3I9XCJsZXQgdXNlciBvZiB1c2Vyc1wiIFtzZWxlY3RhYmxlXT1cInNlbGVjdGFibGVcIiBbcmVtb3ZhYmxlXT1cInJlbW92YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgIChyZW1vdmVkKT1cInJlbW92ZSh1c2VyKVwiPlxuICAgICAgICAgICAgICAgICAgICB7e3VzZXJ9fVxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0Q2hpcFJlbW92ZSAqbmdJZj1cInJlbW92YWJsZVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXA+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdGFiaW5kZXg9XCItMVwiIGNsYXNzPVwiaW5wdXRUZXh0Qm94XCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e3VzZXJzLmxlbmd0aCA9PT0gMCA/IHRyYW5zbGF0ZUxhYmVscygncGxhY2Vob2RlclRleHQnLCAnY29udGVudFNoYXJpbmcnKSA6ICcnfX1cIlxuICAgICAgICAgICAgICAgICAgICAjdXNlcklucHV0IGZvcm1Db250cm9sTmFtZT1cInJldmlld1wiIFtmb3JtQ29udHJvbF09XCJ1c2VyQ3RybFwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcExpc3RcIiBbbWF0Q2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXNdPVwic2VwYXJhdG9yS2V5c0NvZGVzXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEFkZE9uQmx1cl09XCJhZGRPbkJsdXJcIiAobWF0Q2hpcElucHV0VG9rZW5FbmQpPVwiYWRkKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L21hdC1jaGlwLWxpc3Q+XG4gICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwic2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHVzZXIgb2YgZmlsdGVyZWRVc2Vyc1wiIFt2YWx1ZV09XCJ1c2VyLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbkRpdlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uVGV4dFwiPnt7dXNlci5pY29uVGV4dC5zdWJzdHJpbmcoMCwyKX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7dXNlci5uYW1lfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbWFpbFRleHRcIj57e3VzZXIubWFza2VkRW1haWx9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgICAgICAgPG1hdC1oaW50IGFsaWduPVwic3RhcnRcIiBjbGFzcz1cImxlZnQtb3Zlci1lbWFpbHNcIj57eydjb250ZW50U2hhcmluZy5ub3RlJyB8IHRyYW5zbGF0ZX19PC9tYXQtaGludD5cbiAgICAgICAgICAgICAgICA8bWF0LWhpbnQgYWxpZ249XCJlbmRcIiBjbGFzcz1cImxlZnQtb3Zlci1lbWFpbHNcIj57eyB1c2Vycy5sZW5ndGggfX0gL3t7bWF4RW1haWxzTGltaXR9fVxuICAgICAgICAgICAgICAgICAge3snY29udGVudFNoYXJpbmcucmVtYWluZ0VtYWlscycgfCB0cmFuc2xhdGV9fTwvbWF0LWhpbnQ+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG10LTVcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC0xIGZsZXgtZW5kXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb3B5LWxpbmstYnRuIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImNvcHlUb0NsaXBib2FyZCgpXCI+e3snY29udGVudFNoYXJpbmcuY29weUxpbmsnIHxcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19ICZuYnNwOyZuYnNwOzxtYXQtaWNvbj5saW5rPC9tYXQtaWNvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGUtc2VuZC1idG4nOiB1c2Vycy5sZW5ndGggPT09IDAgfHwgdXNlcnMubGVuZ3RofVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtd2hpdGUgd3MtbWF0LXByaW1hcnktYmFja2dyb3VuZCBmbGV4LWF1dG8tZGlzcGxheSBzZW5kLWJ0blwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidXNlckN0cmwudmFsdWUubGVuZ3RoIHx8IHVzZXJzLmxlbmd0aCA9PT0gMCB8fCB1c2Vycy5sZW5ndGggPiBtYXhFbWFpbHNMaW1pdFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3VibWl0U2hhcmluZygpXCI+XG4gICAgICAgICAgICAgICAgICB7eydjb250ZW50U2hhcmluZy5zZW5kJyB8IHRyYW5zbGF0ZX19ICZuYnNwOyA8bWF0LWljb24+c2VuZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjYmF0Y2hEcm9wZG93bj5cbiAgPGZvcm0gY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJhdGNoRGF0YSAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZFxuICAgICAgJiYgKCFiYXRjaERhdGEud29ya0Zsb3c/LndmSW5pdGlhdGVkIHx8IChiYXRjaERhdGEud29ya0Zsb3c/LndmSW5pdGlhdGVkICYmIGJhdGNoRGF0YT8ud29ya0Zsb3c/LndmSXRlbT8uY3VycmVudFN0YXR1cyA9PT0gV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRUpFQ1RFRCB8fCAgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLldJVEhEUkFXTiB8fCBiYXRjaERhdGE/LndvcmtGbG93Py53Zkl0ZW0/LmN1cnJlbnRTdGF0dXMgPT09IFdGQmxlbmRlZFByb2dyYW1TdGF0dXMuUkVNT1ZFRCkpXG4gICAgICAmJiBiYXRjaERhdGE/LmNvbnRlbnQ/Lmxlbmd0aFwiPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGwgYmF0Y2gtZm9ybS1maWVsZFwiPlxuICAgICAgICA8bWF0LXNlbGVjdCAjYmF0Y2hDb250cm9sRGF0YSBbZm9ybUNvbnRyb2xdPVwiYmF0Y2hDb250cm9sXCIgcmVxdWlyZWQgYXV0b1NlbGN0Rmlyc3RPcHRpb25cbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImJhdGNoQ2hhbmdlKCRldmVudClcIiBwYW5lbENsYXNzPVwiYmF0Y2gtZHJvcGRvd25cIj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgYmF0Y2ggb2YgYmF0Y2hEYXRhLmNvbnRlbnQ7IGxldCBpPWluZGV4XCIgW3ZhbHVlXT1cImJhdGNoXCIgc2VsZWN0ZWQ9XCJpbmRleCA9PT0gMFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhbmRsZUVucm9sbG1lbnRFbmREYXRlKGJhdGNoKSB8fCBkaXNhYmxlRW5yb2xsQnRuIFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgdGV4dC1zbSBiYXRjaC10aW1pbmdzXCI+XG4gICAgICAgICAgICAgICAge3sgYmF0Y2gubmFtZSB9fSAoIHt7IGJhdGNoLnN0YXJ0RGF0ZSB8IGRhdGU6ICdkIE1NTSwgeXl5eScgfX0gLSB7eyBiYXRjaC5lbmREYXRlIHwgZGF0ZTogJ2QgTU1NLCB5eXl5J1xuICAgICAgICAgICAgICAgIHx8ICdwcmVzZW50JyB9fSApXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhwaXJlZFwiICpuZ0lmPVwiIWhhbmRsZUVucm9sbG1lbnRFbmREYXRlKGJhdGNoKSB8fCBkaXNhYmxlRW5yb2xsQnRuXCI+XG4gICAgICAgICAgICAgICAgRXhwaXJlZFxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiYmF0Y2hDb250cm9sLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+UGxlYXNlIGNob29zZSBhIGJhdGNoIHRvIHN0YXJ0IGNvdXJzZTwvbWF0LWVycm9yPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtM1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNob3dSZWplY3RlZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xXCIgKm5nSWY9XCJzZWxlY3RlZEJhdGNoICYmIHNlbGVjdGVkQmF0Y2guZW5yb2xsbWVudEVuZERhdGUgXCI+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC14cyBsZWFkaW5nLTQgbWItMFwiPkxhc3QgZW5yb2xsIGRhdGU8L3A+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1ib2xkIG1iLTBcIj57eyBzZWxlY3RlZEJhdGNoLmVucm9sbG1lbnRFbmREYXRlIHwgZGF0ZTogJ2QgTU1NLCB5JyB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImVucm9sbC1idXR0b25cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdkaXNhYmxlLWJ0bic6IGRpc2FibGVFbnJvbGxCdG4gfHwgYmF0Y2hDb250cm9sLmhhc0Vycm9yKCdyZXF1aXJlZCcpIHx8ICFoYW5kbGVFbnJvbGxtZW50RW5kRGF0ZShzZWxlY3RlZEJhdGNoKSB9XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVFbnJvbGxCdG4gfHwgYmF0Y2hDb250cm9sLmhhc0Vycm9yKCdyZXF1aXJlZCcpfHwgIWhhbmRsZUVucm9sbG1lbnRFbmREYXRlKHNlbGVjdGVkQmF0Y2gpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlcXVlc3RUb0Vucm9sbERpYWxvZygpXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgUmVxdWVzdCB0byBlbnJvbGxcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93UmVqZWN0ZWQgJiYgY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgICAgPGgzIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gbWF0LWJvZHktMiB3cy1kZWZhdWx0LXRleHRcIj5cbiAgICAgICAgICAgIFlvdXIgZW5yb2xsbWVudCByZXF1ZXN0IGlzIHt7YmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlJFTU9WRURcbiAgICAgICAgICAgID8ncmVtb3ZlZCc6J3JlamVjdGVkJ319LjwvaDM+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZm9ybT5cbjwvbmctdGVtcGxhdGU+Il19
1
+ import { Component, EventEmitter, Inject, Input, Output, ViewChild } from '@angular/core';
2
+ import { NavigationEnd } from '@angular/router';
3
+ import { NsContent } from '../../_services/widget-content.model';
4
+ import { viewerRouteGenerator } from '../../_services/viewer-route-util';
5
+ import { WsEvents } from '@sunbird-cb/utils-v2';
6
+ import { ConfirmDialogComponent } from '../../_collection/_common/confirm-dialog/confirm-dialog.component';
7
+ import { AccessControlService } from '../../services/access-control.service';
8
+ import { AppTocDialogIntroVideoComponent } from '../app-toc-dialog-intro-video/app-toc-dialog-intro-video.component';
9
+ import { UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms';
10
+ import dayjs from 'dayjs';
11
+ import * as lodash from 'lodash';
12
+ // tslint:disable-next-line
13
+ import _ from 'lodash';
14
+ import { DatePipe } from '@angular/common';
15
+ import isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
16
+ import isSameOrAfter from 'dayjs/plugin/isSameOrAfter';
17
+ import { EnrollQuestionnaireComponent } from '../enroll-questionnaire/enroll-questionnaire.component';
18
+ import { ENTER } from '@angular/cdk/keycodes';
19
+ import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
20
+ import { EnrollProfileFormComponent } from '../enroll-profile-form/enroll-profile-form.component';
21
+ import * as i0 from "@angular/core";
22
+ import * as i1 from "@angular/platform-browser";
23
+ import * as i2 from "@angular/router";
24
+ import * as i3 from "@angular/material/legacy-dialog";
25
+ import * as i4 from "../../services/app-toc.service";
26
+ import * as i5 from "../../_services/widget-content.service";
27
+ import * as i6 from "@sunbird-cb/utils-v2";
28
+ import * as i7 from "../../services/mobile-apps.service";
29
+ import * as i8 from "@angular/material/legacy-snack-bar";
30
+ import * as i9 from "../../services/title-tag.service";
31
+ import * as i10 from "../../services/action.service";
32
+ import * as i11 from "@angular/common";
33
+ import * as i12 from "@ngx-translate/core";
34
+ import * as i13 from "../../_collection/_common/user-autocomplete/user-autocomplete.service";
35
+ import * as i14 from "../../services/timer.service";
36
+ import * as i15 from "@angular/forms";
37
+ import * as i16 from "@angular/material/icon";
38
+ import * as i17 from "@angular/material/legacy-button";
39
+ import * as i18 from "@angular/material/legacy-form-field";
40
+ import * as i19 from "@angular/material/legacy-menu";
41
+ import * as i20 from "@angular/material/legacy-chips";
42
+ import * as i21 from "@angular/material/legacy-progress-spinner";
43
+ import * as i22 from "@angular/material/legacy-select";
44
+ import * as i23 from "@angular/material/legacy-core";
45
+ import * as i24 from "@angular/material/legacy-autocomplete";
46
+ dayjs.extend(isSameOrBefore);
47
+ dayjs.extend(isSameOrAfter);
48
+ export class AppTocBannerComponent {
49
+ constructor(sanitizer, router, route, dialog, tocSvc, contentSvc, utilitySvc, mobileAppsSvc, snackBar, configSvc, tagSvc, actionSVC, logger, datePipe, translate, userAutoComplete, events, langtranslations, timerService, environment) {
50
+ this.sanitizer = sanitizer;
51
+ this.router = router;
52
+ this.route = route;
53
+ this.dialog = dialog;
54
+ this.tocSvc = tocSvc;
55
+ this.contentSvc = contentSvc;
56
+ this.utilitySvc = utilitySvc;
57
+ this.mobileAppsSvc = mobileAppsSvc;
58
+ this.snackBar = snackBar;
59
+ this.configSvc = configSvc;
60
+ this.tagSvc = tagSvc;
61
+ this.actionSVC = actionSVC;
62
+ this.logger = logger;
63
+ this.datePipe = datePipe;
64
+ this.translate = translate;
65
+ this.userAutoComplete = userAutoComplete;
66
+ this.events = events;
67
+ this.langtranslations = langtranslations;
68
+ this.timerService = timerService;
69
+ this.environment = environment;
70
+ this.show = false;
71
+ this.banners = null;
72
+ this.content = null;
73
+ this.resumeData = null;
74
+ this.analytics = null;
75
+ this.forPreview = false;
76
+ this.batchData = null;
77
+ this.userEnrollmentList = null;
78
+ this.withdrawOrEnroll = new EventEmitter();
79
+ this.contentReadData = null;
80
+ this.clickToShare = false;
81
+ this.programEnrollCall = new EventEmitter();
82
+ this.nsContent = NsContent;
83
+ this.batchControl = new UntypedFormControl('', Validators.required);
84
+ this.primaryCategory = NsContent.EPrimaryCategory;
85
+ this.WFBlendedProgramStatus = NsContent.WFBlendedProgramStatus;
86
+ this.WFSTATUS_MSG_MAPPING = NsContent.WFSTATUS_MSG_MAPPING;
87
+ this.contentProgress = 0;
88
+ this.bannerUrl = null;
89
+ this.routePath = 'overview';
90
+ this.validPaths = new Set(['overview', 'contents', 'analytics']);
91
+ this.routerParamSubscription = null;
92
+ this.routeSubscription = null;
93
+ this.batchWFDataSubscription = null;
94
+ this.firstResourceLink = null;
95
+ this.resumeDataLink = null;
96
+ this.isAssessVisible = false;
97
+ this.isPracticeVisible = false;
98
+ this.editButton = false;
99
+ this.reviewButton = false;
100
+ this.analyticsDataClient = null;
101
+ this.btnPlaylistConfig = null;
102
+ this.btnGoalsConfig = null;
103
+ this.isRegistrationSupported = false;
104
+ this.showRejected = false;
105
+ this.checkRegistrationSources = new Set([
106
+ 'SkillSoft Digitalization',
107
+ 'SkillSoft Leadership',
108
+ 'Pluralsight',
109
+ ]);
110
+ this.isUserRegistered = false;
111
+ this.actionBtnStatus = 'wait';
112
+ this.showIntranetMessage = false;
113
+ this.showTakeAssessment = null;
114
+ this.externalContentFetchStatus = 'done';
115
+ this.registerForExternal = false;
116
+ this.isGoalsEnabled = false;
117
+ this.tocConfig = null;
118
+ this.defaultSLogo = '';
119
+ this.disableEnrollBtn = false;
120
+ this.helpEmail = '';
121
+ this.difference = 0;
122
+ this.serverDate = new Date();
123
+ this.canShare = false;
124
+ this.enableShare = false;
125
+ this.selectable = true;
126
+ this.removable = true;
127
+ this.addOnBlur = true;
128
+ this.separatorKeysCodes = [ENTER];
129
+ this.userCtrl = new UntypedFormControl('');
130
+ this.users = [];
131
+ this.allUsers = [];
132
+ this.doptEligibleServicesList = [];
133
+ this.maxEmailsLimit = 30;
134
+ this.showLoader = false;
135
+ this.langtranslations.languageSelectedObservable.subscribe(() => {
136
+ if (localStorage.getItem('websiteLanguage')) {
137
+ this.translate.setDefaultLang('en');
138
+ const lang = localStorage.getItem('websiteLanguage');
139
+ this.translate.use(lang);
140
+ }
141
+ });
142
+ this.helpEmail = this.environment.helpEmail;
143
+ this.shareForm = new UntypedFormGroup({
144
+ review: new UntypedFormControl(null, [Validators.minLength(1), Validators.maxLength(2000)]),
145
+ });
146
+ this.userCtrl.valueChanges.pipe(debounceTime(200), distinctUntilChanged()).subscribe((res) => {
147
+ if (res) {
148
+ this.filteredUsers = [];
149
+ // this.allUsers = []
150
+ this.getUsersToShare(res);
151
+ }
152
+ });
153
+ }
154
+ ngOnInit() {
155
+ // this.serverDate = new Date().getTime()
156
+ this.serverDateSubscription = this.tocSvc.serverDate.subscribe(serverDate => {
157
+ this.serverDate = serverDate;
158
+ this.clearAndCallTimer();
159
+ });
160
+ this.route.data.subscribe(data => {
161
+ this.tocConfig = data.pageData.data;
162
+ if (this.content && this.isPostAssessment) {
163
+ this.tocSvc.fetchPostAssessmentStatus(this.content.identifier).subscribe(res => {
164
+ const assessmentData = res.result;
165
+ for (const o of assessmentData) {
166
+ if (o.contentId === (this.content && this.content.identifier)) {
167
+ this.showTakeAssessment = o;
168
+ break;
169
+ }
170
+ }
171
+ });
172
+ }
173
+ if (this.content && this.content.identifier) {
174
+ // this.tocSvc.fetchGetContentData(this.content.identifier).subscribe(res => {
175
+ // this.contentReadData = res.result.content
176
+ // })
177
+ }
178
+ });
179
+ const instanceConfig = this.configSvc.instanceConfig;
180
+ if (instanceConfig && instanceConfig.logos && instanceConfig.logos.defaultSourceLogo) {
181
+ this.defaultSLogo = instanceConfig.logos.defaultSourceLogo;
182
+ }
183
+ if (this.configSvc.restrictedFeatures) {
184
+ this.isGoalsEnabled = !this.configSvc.restrictedFeatures.has('goals');
185
+ }
186
+ this.routeSubscription = this.route.queryParamMap.subscribe(qParamsMap => {
187
+ const contextId = qParamsMap.get('contextId');
188
+ const contextPath = qParamsMap.get('contextPath');
189
+ if (contextId && contextPath) {
190
+ this.contextId = contextId;
191
+ this.contextPath = contextPath;
192
+ }
193
+ });
194
+ this.batchWFDataSubscription = this.tocSvc.setWFDataSubject.subscribe(() => {
195
+ this.setBatchControl();
196
+ }, () => {
197
+ // tslint:disable-next-line: no-console
198
+ console.log('error on batchWFDataSubscription');
199
+ });
200
+ if (this.configSvc.restrictedFeatures) {
201
+ this.isRegistrationSupported = this.configSvc.restrictedFeatures.has('registrationExternal');
202
+ this.showIntranetMessage = !this.configSvc.restrictedFeatures.has('showIntranetMessageDesktop');
203
+ }
204
+ this.selectedBatchSubscription = this.tocSvc.getSelectedBatch.subscribe(batchData => {
205
+ this.selectedBatchData = batchData;
206
+ });
207
+ this.checkRegistrationStatus();
208
+ this.routerParamSubscription = this.router.events.subscribe((routerEvent) => {
209
+ if (routerEvent instanceof NavigationEnd) {
210
+ this.assignPathAndUpdateBanner(routerEvent.url);
211
+ }
212
+ });
213
+ if (this.configSvc.restrictedFeatures) {
214
+ this.isGoalsEnabled = !this.configSvc.restrictedFeatures.has('goals');
215
+ }
216
+ if (this.content) {
217
+ this.btnPlaylistConfig = {
218
+ contentId: this.content.identifier,
219
+ contentName: this.content.name,
220
+ contentType: this.content.contentType,
221
+ primaryCategory: this.content.primaryCategory,
222
+ mode: 'dialog',
223
+ };
224
+ this.btnGoalsConfig = {
225
+ contentId: this.content.identifier,
226
+ contentName: this.content.name,
227
+ contentType: this.content.contentType,
228
+ primaryCategory: this.content.primaryCategory,
229
+ };
230
+ }
231
+ if (this.content && ![
232
+ NsContent.ECourseCategory.MODERATED_COURSE,
233
+ NsContent.ECourseCategory.MODERATED_ASSESSEMENT,
234
+ NsContent.ECourseCategory.MODERATED_PROGRAM,
235
+ NsContent.ECourseCategory.INVITE_ONLY_PROGRAM,
236
+ ].includes(this.content.courseCategory)) {
237
+ this.canShare = true;
238
+ if (this.configSvc.userProfile) {
239
+ this.rootOrgId = this.configSvc.userProfile.rootOrgId;
240
+ this.userProfile = this.configSvc.userProfile;
241
+ this.userProfileObject = this.configSvc.unMappedUser;
242
+ // this.getUsersToShare('')
243
+ }
244
+ }
245
+ }
246
+ getUsersToShare(queryStr) {
247
+ this.showLoader = true;
248
+ this.userAutoComplete.searchUser(queryStr, this.rootOrgId).subscribe(data => {
249
+ if (data.result && data.result.response) {
250
+ this.apiResponse = data.result.response.content;
251
+ let name = '';
252
+ let pEmail = '';
253
+ this.apiResponse.forEach((apiData) => {
254
+ apiData.firstName.split(' ').forEach((d) => {
255
+ name = name + d.substr(0, 1).toUpperCase();
256
+ });
257
+ if (apiData.profileDetails && apiData.profileDetails.personalDetails) {
258
+ pEmail = apiData.profileDetails.personalDetails.primaryEmail;
259
+ if (!this.allUsers.filter(user => user.email.toLowerCase().includes(pEmail.toLowerCase())).length) {
260
+ this.allUsers.push({
261
+ maskedEmail: apiData.maskedEmail,
262
+ id: apiData.identifier,
263
+ name: apiData.firstName,
264
+ iconText: name,
265
+ email: pEmail,
266
+ });
267
+ }
268
+ }
269
+ });
270
+ this.showLoader = false;
271
+ }
272
+ if (this.allUsers.length === 0) {
273
+ this.filteredUsers = [];
274
+ }
275
+ this.filteredUsers = this.filterSharedUsers(queryStr);
276
+ });
277
+ }
278
+ get showIntranetMsg() {
279
+ if (this.isMobile) {
280
+ return true;
281
+ }
282
+ return this.showIntranetMessage;
283
+ }
284
+ get getBatchDuration() {
285
+ const startDate = dayjs(dayjs(this.batchControl.value.startDate).format('YYYY-MM-DD'));
286
+ const endDate = dayjs(dayjs(this.batchControl.value.endDate).format('YYYY-MM-DD'));
287
+ // adding 1 to include the start date
288
+ return (endDate.diff(startDate, 'days') + 1);
289
+ }
290
+ get showStart() {
291
+ return this.tocSvc.showStartButton(this.content);
292
+ }
293
+ get isPostAssessment() {
294
+ if (!(this.tocConfig && this.tocConfig.postAssessment)) {
295
+ return false;
296
+ }
297
+ if (this.content) {
298
+ return (this.content.primaryCategory === NsContent.EPrimaryCategory.COURSE &&
299
+ this.content.learningMode === 'Instructor-Led');
300
+ }
301
+ return false;
302
+ }
303
+ get isMobile() {
304
+ return this.utilitySvc.isMobile;
305
+ }
306
+ get showSubtitleOnBanner() {
307
+ return this.tocSvc.subtitleOnBanners;
308
+ }
309
+ getDoptEligibleServicesList() {
310
+ if (this.selectedBatch && this.selectedBatch.batchAttributes
311
+ && this.selectedBatch.batchAttributes.cadreList
312
+ && this.selectedBatch.batchAttributes.cadreList.length > 0) {
313
+ this.doptEligibleServicesList = this.selectedBatch.batchAttributes.cadreList;
314
+ }
315
+ else {
316
+ this.doptEligibleServicesList = [];
317
+ }
318
+ }
319
+ ngOnChanges(_changes) {
320
+ this.assignPathAndUpdateBanner(this.router.url);
321
+ if (this.content) {
322
+ this.fetchExternalContentAccess();
323
+ this.modifySensibleContentRating();
324
+ this.assignPathAndUpdateBanner(this.router.url);
325
+ this.getLearningUrls();
326
+ this.setBatchControl();
327
+ }
328
+ if (this.resumeData && this.resumeData.length > 0 && this.content) {
329
+ let resumeDataV2;
330
+ if (this.content.completionPercentage === 100) {
331
+ resumeDataV2 = this.getResumeDataFromList('start');
332
+ }
333
+ else {
334
+ resumeDataV2 = this.getResumeDataFromList();
335
+ }
336
+ if (!resumeDataV2.mimeType) {
337
+ resumeDataV2.mimeType = this.getMimeType(this.content, resumeDataV2.identifier);
338
+ }
339
+ 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);
340
+ this.actionSVC.setUpdateCompGroupO = this.resumeDataLink;
341
+ }
342
+ this.batchControlUnsubscribe = this.batchControl.valueChanges.subscribe((batch) => {
343
+ this.selectedBatch = batch;
344
+ if (batch) {
345
+ if (this.checkRejected(batch)) {
346
+ this.showRejected = true;
347
+ return;
348
+ }
349
+ }
350
+ this.showRejected = false;
351
+ return;
352
+ });
353
+ }
354
+ requestToWithdrawDialog() {
355
+ const confirmDialog = this.dialog.open(ConfirmDialogComponent, {
356
+ width: '434px',
357
+ data: {
358
+ title: 'Are you sure you want to withdraw your request?',
359
+ message: 'You will miss the learning opportunity if you withdraw your enrolment.',
360
+ acceptButton: 'Withdraw',
361
+ cancelButton: 'Cancel',
362
+ },
363
+ disableClose: true,
364
+ panelClass: ['animate__animated', 'animate__slideInLeft'],
365
+ });
366
+ confirmDialog.afterClosed().subscribe(result => {
367
+ if (result) {
368
+ // tslint:disable-next-line:max-line-length
369
+ this.requestAndWithDrawEnroll(this.batchData.workFlow.wfItem.currentStatus, this.WFBlendedProgramStatus.WITHDRAW, this.batchData.workFlow.wfItem.wfId);
370
+ }
371
+ });
372
+ }
373
+ openConformationDialog(message) {
374
+ this.dialog.open(ConfirmDialogComponent, {
375
+ width: '600px',
376
+ data: {
377
+ message: message,
378
+ acceptButton: 'Ok',
379
+ disableClose: true
380
+ }
381
+ });
382
+ }
383
+ openRequestToEnroll(batchData) {
384
+ const confirmDialog = this.dialog.open(ConfirmDialogComponent, {
385
+ width: '434px',
386
+ data: {
387
+ title: 'You’re one step away from enrolling!',
388
+ // tslint:disable-next-line:max-line-length
389
+ message: `This batch is active from ${this.datePipe.transform(batchData.startDate, 'dd-MM-yyyy')} - ${this.datePipe.transform(batchData.endDate, 'dd-MM-yyyy')}, kindly go through the content and be prepared.`,
390
+ acceptButton: 'Confirm',
391
+ cancelButton: 'Cancel',
392
+ },
393
+ disableClose: true,
394
+ panelClass: ['animate__animated', 'animate__slideInLeft'],
395
+ });
396
+ confirmDialog.afterClosed().subscribe(result => {
397
+ if (result) {
398
+ this.requestAndWithDrawEnroll('INITIATE', 'INITIATE');
399
+ }
400
+ });
401
+ }
402
+ callBPSurevy(batchData) {
403
+ if (this.content) {
404
+ const sID = this.content.wfSurveyLink.split('surveys/');
405
+ const surveyId = sID[1];
406
+ const courseId = this.content.identifier;
407
+ const courseName = this.content.name;
408
+ const wfClientVersion = _.get(this.content, 'wfClientVersion', '0');
409
+ const apiData = {
410
+ // tslint:disable-next-line:prefer-template
411
+ getAPI: '/apis/proxies/v8/forms/getFormById?id=' + surveyId,
412
+ // tslint:disable-next-line:prefer-template
413
+ postAPI: '/apis/proxies/v8/forms/v1/saveFormSubmit',
414
+ getAllApplications: '/apis/proxies/v8/forms/getAllApplications',
415
+ customizedHeader: {},
416
+ };
417
+ const enrollQuestionnaire = this.dialog.open(EnrollQuestionnaireComponent, {
418
+ width: '920px',
419
+ maxHeight: '85vh',
420
+ data: {
421
+ surveyId,
422
+ courseId,
423
+ courseName,
424
+ apiData,
425
+ batchData,
426
+ wfClientVersion
427
+ },
428
+ disableClose: false,
429
+ panelClass: ['animate__animated', 'animate__slideInLeft'],
430
+ });
431
+ enrollQuestionnaire.afterClosed().subscribe(result => {
432
+ if (result) {
433
+ this.openRequestToEnroll(batchData);
434
+ }
435
+ });
436
+ }
437
+ }
438
+ callBPProfileSurevy(batchData) {
439
+ if (this.content) {
440
+ const doptorgID = this.environment.doptOrg;
441
+ const isDoptContent = _.get(this.content, 'createdFor', []).includes(doptorgID);
442
+ // const isDptUser = _.get(this.userProfileObject, 'rootOrgId') === doptorgID
443
+ this.getDoptEligibleServicesList();
444
+ const userProfileObject = this.configSvc?.unMappedUser || {};
445
+ const civilServiceName = _.get(userProfileObject, 'profileDetails.cadreDetails.civilServiceName', '');
446
+ if (this.doptEligibleServicesList && this.doptEligibleServicesList.length > 0) {
447
+ if (!civilServiceName) {
448
+ this.openConformationDialog(`This program has eligibility criteria. Please update your service details in your profile before requesting to enroll.`);
449
+ return;
450
+ }
451
+ else if (!this.doptEligibleServicesList.includes(civilServiceName)) {
452
+ this.openConformationDialog(`You are not eligible for the ${this.content.name} with the current service in your profile. If your service details are incorrect, please update your profile and apply.`);
453
+ return;
454
+ }
455
+ }
456
+ const courseName = this.content.name;
457
+ // const showDoptChanges = (isDoptContent && isDptUser) ? true : false
458
+ const profileForm = this.dialog.open(EnrollProfileFormComponent, {
459
+ width: '920px',
460
+ maxHeight: '85vh',
461
+ data: {
462
+ courseName,
463
+ batchData,
464
+ showDoptChanges: isDoptContent,
465
+ },
466
+ disableClose: false,
467
+ panelClass: ['animate__animated', 'animate__slideInLeft'],
468
+ });
469
+ profileForm.afterClosed().subscribe(result => {
470
+ if (result) {
471
+ if (this.content && this.content.wfSurveyLink) {
472
+ this.callBPSurevy(batchData);
473
+ }
474
+ else {
475
+ this.openRequestToEnroll(batchData);
476
+ }
477
+ }
478
+ });
479
+ }
480
+ }
481
+ requestToEnrollDialog() {
482
+ const batchData = this.batchControl.value;
483
+ if (this.content && this.content.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM) {
484
+ // conflicts check start
485
+ const userList = this.userEnrollmentList && this.userEnrollmentList.filter(ele => {
486
+ if (ele.content.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM) {
487
+ if (!(dayjs(batchData.startDate).isBefore(dayjs(ele.batch.startDate)) &&
488
+ dayjs(batchData.endDate).isBefore(dayjs(ele.batch.startDate)) ||
489
+ dayjs(batchData.startDate).isAfter(dayjs(ele.batch.endDate)) &&
490
+ dayjs(batchData.endDate).isAfter(dayjs(ele.batch.endDate)))) {
491
+ return true;
492
+ }
493
+ return false;
494
+ }
495
+ return false;
496
+ });
497
+ // conflicts check end
498
+ if (userList && userList.length === 0) {
499
+ if (this.content && batchData.batchAttributes && batchData.batchAttributes.userProfileFileds) {
500
+ this.callBPProfileSurevy(batchData);
501
+ }
502
+ else if (this.content && this.content.wfSurveyLink) {
503
+ this.callBPSurevy(batchData);
504
+ }
505
+ else {
506
+ this.openRequestToEnroll(batchData);
507
+ }
508
+ }
509
+ else {
510
+ if (userList && userList.length > 0) {
511
+ this.openSnackbar(`You cannot enroll in this blended program because it conflicts with your existing blended program.`);
512
+ }
513
+ }
514
+ }
515
+ else {
516
+ this.programEnrollCall.emit(batchData);
517
+ }
518
+ }
519
+ requestAndWithDrawEnroll(state, action, wfIdValue) {
520
+ let userId = '';
521
+ let rootOrgId = '';
522
+ let username = '';
523
+ let departmentName = '';
524
+ if (this.configSvc.userProfile) {
525
+ userId = this.configSvc.userProfile.userId || '';
526
+ rootOrgId = this.configSvc.userProfile.rootOrgId || '';
527
+ username = this.configSvc.userProfile.firstName || '';
528
+ departmentName = this.configSvc.userProfile.departmentName || '';
529
+ }
530
+ const req = {
531
+ rootOrgId,
532
+ userId,
533
+ state,
534
+ action,
535
+ actorUserId: userId,
536
+ applicationId: this.selectedBatch.batchId,
537
+ serviceName: 'blendedprogram',
538
+ courseId: this.selectedBatch.courseId,
539
+ deptName: departmentName,
540
+ ...(wfIdValue ? { wfId: wfIdValue } : null),
541
+ updateFieldValues: [
542
+ {
543
+ toValue: {
544
+ name: username,
545
+ },
546
+ },
547
+ ],
548
+ };
549
+ this.contentSvc.enrollAndUnenrollUserToBatchWF(req, action).then((data) => {
550
+ if (data && data.result && data.result.status === 'OK') {
551
+ this.batchData.workFlow = {
552
+ wfInitiated: true,
553
+ batch: this.selectedBatch,
554
+ wfItem: { currentStatus: data.result.data.status },
555
+ };
556
+ this.withdrawOrEnroll.emit(action);
557
+ this.getBatchUserCount(this.selectedBatch);
558
+ this.openSnackbar(`Request ${action === this.WFBlendedProgramStatus.WITHDRAW ? 'withdrawn' : 'sent'} Successfully!`);
559
+ this.disableEnrollBtn = false;
560
+ }
561
+ else {
562
+ this.openSnackbar('Something went wrong, please try again later!');
563
+ this.disableEnrollBtn = false;
564
+ }
565
+ }, (error) => {
566
+ this.openSnackbar(_.get(error, 'error.params.errmsg') ||
567
+ _.get(error, 'error.result.errmsg') ||
568
+ 'Something went wrong, please try again later!');
569
+ });
570
+ }
571
+ getMimeType(content, identifier) {
572
+ if (content.identifier === identifier) {
573
+ return content.mimeType;
574
+ }
575
+ if (content && content.children) {
576
+ if (content.children.length === 0) {
577
+ // big blunder in data
578
+ this.logger.log(content.identifier, 'Wrong mime types for resume');
579
+ return content.mimeType;
580
+ }
581
+ const flatList = [];
582
+ const getAllItemsPerChildren = (item) => {
583
+ flatList.push(item);
584
+ if (item.children) {
585
+ return item.children.map((i) => getAllItemsPerChildren(i));
586
+ }
587
+ return;
588
+ };
589
+ getAllItemsPerChildren(this.content);
590
+ const chld = _.first(_.filter(flatList, { identifier }));
591
+ return chld.mimeType;
592
+ }
593
+ // return chld.mimeType
594
+ return NsContent.EMimeTypes.UNKNOWN;
595
+ }
596
+ getBatchId() {
597
+ let batchId = '';
598
+ if (this.batchData && this.batchData.content) {
599
+ for (const batch of this.batchData.content) {
600
+ batchId = batch.batchId;
601
+ }
602
+ }
603
+ return batchId;
604
+ }
605
+ handleEnrollmentEndDate(batch) {
606
+ const enrollmentEndDate = dayjs(lodash.get(batch, 'enrollmentEndDate')).format('YYYY-MM-DD');
607
+ const systemDate = dayjs(this.serverDate).format('YYYY-MM-DD');
608
+ return (enrollmentEndDate && enrollmentEndDate !== 'Invalid Date') ?
609
+ (dayjs(enrollmentEndDate).isSame(systemDate, 'day') || dayjs(enrollmentEndDate).isAfter(systemDate)) : false;
610
+ }
611
+ checkRejected(batch) {
612
+ if (batch &&
613
+ this.batchData &&
614
+ this.batchData.workFlow &&
615
+ this.batchData.workFlow.wfItem) {
616
+ // tslint:disable-next-line:max-line-length
617
+ if (batch.batchId === this.batchData.workFlow.wfItem.applicationId && (this.batchData.workFlow.wfItem.currentStatus === this.WFBlendedProgramStatus.REJECTED || this.batchData.workFlow.wfItem.currentStatus === this.WFBlendedProgramStatus.REMOVED)) {
618
+ return true;
619
+ }
620
+ return false;
621
+ }
622
+ return false;
623
+ }
624
+ checkWithdrawn(batch) {
625
+ if (batch &&
626
+ this.batchData &&
627
+ this.batchData.workFlow &&
628
+ this.batchData.workFlow.wfItem) {
629
+ // tslint:disable-next-line:max-line-length
630
+ if (this.selectedBatch.batchId === this.batchData.workFlow.wfItem.applicationId && (this.batchData.workFlow.wfItem.currentStatus === this.WFBlendedProgramStatus.WITHDRAWN || this.batchData.workFlow.wfItem.currentStatus === this.WFBlendedProgramStatus.WITHDRAWN)) {
631
+ return true;
632
+ }
633
+ return false;
634
+ }
635
+ return false;
636
+ }
637
+ batchChange(event) {
638
+ this.clearAndCallTimer();
639
+ if (event && event.value) {
640
+ const batchData = {
641
+ content: [event.value],
642
+ };
643
+ this.getBatchUserCount(event.value);
644
+ if (this.selectedBatchData && this.selectedBatchData.content) {
645
+ this.selectedBatchData = {
646
+ ...this.selectedBatchData,
647
+ ...batchData,
648
+ };
649
+ }
650
+ else {
651
+ this.selectedBatchData = {
652
+ ...batchData,
653
+ };
654
+ }
655
+ if (this.checkRejected(event.value)) {
656
+ this.showRejected = true;
657
+ this.setbatchDateToCountDown(event.value.startDate);
658
+ this.tocSvc.getSelectedBatchData(this.selectedBatchData);
659
+ return;
660
+ }
661
+ this.setbatchDateToCountDown(event.value.startDate);
662
+ this.tocSvc.getSelectedBatchData(this.selectedBatchData);
663
+ }
664
+ this.showRejected = false;
665
+ this.checkBatchStartDate();
666
+ return;
667
+ }
668
+ checkBatchStartDate() {
669
+ const batchStartDate = this.selectedBatchData && this.selectedBatchData.content
670
+ && this.selectedBatchData.content[0] && this.selectedBatchData.content[0].startDate;
671
+ const workFlow = this.batchData && this.batchData.workFlow && this.batchData.workFlow.wfItem
672
+ && this.batchData.workFlow.wfItem.currentStatus;
673
+ const now = dayjs(this.serverDate).format('YYYY-MM-DD');
674
+ const dateExtended = dayjs(now).isSameOrAfter(dayjs(batchStartDate));
675
+ if (dateExtended && (workFlow && (workFlow !== this.WFBlendedProgramStatus.APPROVED)
676
+ && workFlow !== this.WFBlendedProgramStatus.WITHDRAWN)) {
677
+ const confirmDialog = this.dialog.open(ConfirmDialogComponent, {
678
+ width: '434px',
679
+ data: {
680
+ title: 'Request not approved',
681
+ message: 'Don\'t worry; withdraw this and request another batch.',
682
+ acceptButton: 'Withdraw',
683
+ cancelButton: 'Cancel',
684
+ },
685
+ disableClose: true,
686
+ panelClass: ['animate__animated', 'animate__slideInLeft'],
687
+ });
688
+ confirmDialog.afterClosed().subscribe(result => {
689
+ if (result) {
690
+ // tslint:disable-next-line:max-line-length
691
+ this.requestAndWithDrawEnroll(this.batchData.workFlow.wfItem.currentStatus, this.WFBlendedProgramStatus.WITHDRAW, this.batchData.workFlow.wfItem.wfId);
692
+ }
693
+ });
694
+ }
695
+ }
696
+ setBatchControl() {
697
+ // on first load select first value in the batch list if its having valid enrollment Date
698
+ if (this.content && (this.content.primaryCategory === this.primaryCategory.BLENDED_PROGRAM ||
699
+ this.content.primaryCategory === this.primaryCategory.PROGRAM)) {
700
+ if (this.batchData && this.batchData.content.length) {
701
+ if (!this.batchData.workFlow || (this.batchData.workFlow && !this.batchData.workFlow.wfInitiated)) {
702
+ const batch = this.batchData.content.find((el) => {
703
+ if (this.handleEnrollmentEndDate(el)) {
704
+ return el;
705
+ }
706
+ });
707
+ if (batch) {
708
+ this.batchControl.setValue(batch);
709
+ this.setbatchDateToCountDown(batch.startDate);
710
+ }
711
+ this.getBatchUserCount(this.batchControl.value);
712
+ const batchData = {
713
+ content: [this.batchControl.value],
714
+ };
715
+ if (this.selectedBatchData && this.selectedBatchData.content) {
716
+ this.selectedBatchData = {
717
+ ...this.selectedBatchData,
718
+ ...batchData,
719
+ };
720
+ }
721
+ else {
722
+ this.selectedBatchData = {
723
+ ...batchData,
724
+ };
725
+ }
726
+ this.tocSvc.getSelectedBatchData(this.selectedBatchData);
727
+ }
728
+ else {
729
+ const batch = this.batchData.content.find((el) => {
730
+ if (el.batchId === this.batchData.workFlow.wfItem.applicationId) {
731
+ return el;
732
+ }
733
+ });
734
+ this.selectedBatch = batch;
735
+ this.batchControl.patchValue(batch);
736
+ this.batchChange({ value: batch });
737
+ }
738
+ }
739
+ }
740
+ }
741
+ clearAndCallTimer() {
742
+ if (this.timerIntervalClear) {
743
+ clearInterval(this.timerIntervalClear);
744
+ }
745
+ this.callTimer();
746
+ }
747
+ // setting batch start date
748
+ setbatchDateToCountDown(batchStartDate) {
749
+ this.targetDate = new Date(batchStartDate);
750
+ const convertedDate = dayjs(batchStartDate).format('YYYY-MM-DD HH:mm:ss');
751
+ this.targetTime = new Date(convertedDate).getTime();
752
+ }
753
+ openSnackbar(primaryMsg, duration = 5000) {
754
+ this.snackBar.open(primaryMsg, 'X', {
755
+ duration,
756
+ });
757
+ }
758
+ get disableWithdrawnBtn() {
759
+ if (this.batchData &&
760
+ this.batchData.workFlow &&
761
+ this.batchData.workFlow.wfItem) {
762
+ const status = this.batchData.workFlow.wfItem.currentStatus;
763
+ if (NsContent.WFBlendedProgramApprovalTypes.TWO_STEP_MDO_PC === this.batchData.workFlow.wfItem.serviceName &&
764
+ status === this.WFBlendedProgramStatus.SEND_FOR_PC_APPROVAL) {
765
+ return true;
766
+ }
767
+ if (NsContent.WFBlendedProgramApprovalTypes.TWO_STEP_PC_MDO === this.batchData.workFlow.wfItem.serviceName &&
768
+ status === this.WFBlendedProgramStatus.SEND_FOR_MDO_APPROVAL) {
769
+ return true;
770
+ }
771
+ }
772
+ return false;
773
+ }
774
+ get showInstructorLedMsg() {
775
+ return (this.showActionButtons &&
776
+ this.content &&
777
+ this.content.learningMode === 'Instructor-Led' &&
778
+ !this.content.children.length &&
779
+ !this.content.artifactUrl);
780
+ }
781
+ get getWFMsg() {
782
+ if (this.batchData &&
783
+ this.batchData.workFlow &&
784
+ this.batchData.workFlow.wfItem) {
785
+ const status = this.batchData.workFlow.wfItem.currentStatus;
786
+ const msg = this.WFSTATUS_MSG_MAPPING[status];
787
+ return this.tocConfig[msg];
788
+ }
789
+ }
790
+ get showIcon() {
791
+ if (this.batchData &&
792
+ this.batchData.workFlow &&
793
+ this.batchData.workFlow.wfItem) {
794
+ const status = this.batchData.workFlow.wfItem.currentStatus;
795
+ if (status === this.WFBlendedProgramStatus.APPROVED ||
796
+ status === this.WFBlendedProgramStatus.SEND_FOR_MDO_APPROVAL ||
797
+ status === this.WFBlendedProgramStatus.SEND_FOR_PC_APPROVAL ||
798
+ status === this.WFBlendedProgramStatus.WITHDRAWN ||
799
+ status === this.WFBlendedProgramStatus.REJECTED ||
800
+ status === this.WFBlendedProgramStatus.REMOVED) {
801
+ return true;
802
+ }
803
+ }
804
+ return false;
805
+ }
806
+ get showMsg() {
807
+ if (this.batchData &&
808
+ this.batchData.workFlow &&
809
+ this.batchData.workFlow.wfItem) {
810
+ const status = this.batchData.workFlow.wfItem.currentStatus;
811
+ if (status === this.WFBlendedProgramStatus.APPROVED ||
812
+ status === this.WFBlendedProgramStatus.SEND_FOR_MDO_APPROVAL ||
813
+ status === this.WFBlendedProgramStatus.SEND_FOR_PC_APPROVAL ||
814
+ (status === this.WFBlendedProgramStatus.WITHDRAWN && this.checkWithdrawn(this.batchData)) ||
815
+ (status === this.WFBlendedProgramStatus.REMOVED && this.showRejected) ||
816
+ (status === this.WFBlendedProgramStatus.REJECTED && this.showRejected)) {
817
+ return true;
818
+ }
819
+ }
820
+ return false;
821
+ }
822
+ get WFIcon() {
823
+ if (this.batchData &&
824
+ this.batchData.workFlow &&
825
+ this.batchData.workFlow.wfItem) {
826
+ const status = this.batchData.workFlow.wfItem.currentStatus;
827
+ if (status === this.WFBlendedProgramStatus.APPROVED ||
828
+ status === this.WFBlendedProgramStatus.SEND_FOR_MDO_APPROVAL ||
829
+ status === this.WFBlendedProgramStatus.SEND_FOR_PC_APPROVAL ||
830
+ status === this.WFBlendedProgramStatus.WITHDRAWN) {
831
+ return 'circle';
832
+ }
833
+ if (status === this.WFBlendedProgramStatus.REJECTED ||
834
+ status === this.WFBlendedProgramStatus.REMOVED) {
835
+ return 'info';
836
+ }
837
+ }
838
+ return '';
839
+ }
840
+ get iconColor() {
841
+ if (this.batchData &&
842
+ this.batchData.workFlow &&
843
+ this.batchData.workFlow.wfItem) {
844
+ const status = this.batchData.workFlow.wfItem.currentStatus;
845
+ if (status === this.WFBlendedProgramStatus.APPROVED || status === this.WFBlendedProgramStatus.WITHDRAWN) {
846
+ return 'ws-mat-green-text';
847
+ }
848
+ if (status === this.WFBlendedProgramStatus.SEND_FOR_MDO_APPROVAL ||
849
+ status === this.WFBlendedProgramStatus.SEND_FOR_PC_APPROVAL) {
850
+ return 'ws-mat-orange-text';
851
+ }
852
+ return '';
853
+ }
854
+ return ' ';
855
+ }
856
+ get isHeaderHidden() {
857
+ return this.isResource && this.content && !this.content.artifactUrl.length;
858
+ }
859
+ get showActionButtons() {
860
+ return (this.actionBtnStatus !== 'wait' &&
861
+ this.content &&
862
+ this.content.status !== 'Deleted' &&
863
+ this.content.status !== 'Expired');
864
+ }
865
+ get showButtonContainer() {
866
+ return (this.actionBtnStatus === 'grant' &&
867
+ !(this.isMobile && this.content && this.content.isInIntranet) &&
868
+ !(this.content &&
869
+ this.content.contentType === 'Course' &&
870
+ this.content.children.length === 0 &&
871
+ !this.content.artifactUrl) &&
872
+ !(this.content && this.content.contentType === 'Resource' && !this.content.artifactUrl));
873
+ }
874
+ get isResource() {
875
+ if (this.content) {
876
+ const isResource = this.content.contentType === NsContent.EContentTypes.KNOWLEDGE_ARTIFACT ||
877
+ this.content.contentType === NsContent.EContentTypes.RESOURCE || !this.content.children.length;
878
+ if (isResource) {
879
+ this.mobileAppsSvc.sendViewerData(this.content);
880
+ }
881
+ return isResource;
882
+ }
883
+ return false;
884
+ }
885
+ getBatchUserCount(batchData) {
886
+ if (batchData && batchData.batchId) {
887
+ const req = {
888
+ serviceName: 'blendedprogram',
889
+ applicationStatus: '',
890
+ applicationIds: [
891
+ batchData.batchId,
892
+ ],
893
+ limit: 100,
894
+ offset: 0,
895
+ };
896
+ const usercount = {
897
+ enrolled: 0,
898
+ totalApplied: 0,
899
+ rejected: 0,
900
+ };
901
+ this.contentSvc.fetchBlendedUserCOUNT(req).then((res) => {
902
+ if (res.result && res.result.data) {
903
+ res.result.data.forEach((ele) => {
904
+ if (ele.currentStatus === 'APPROVED') {
905
+ usercount.enrolled = ele.statusCount;
906
+ }
907
+ else if (ele.currentStatus === 'REJECTED') {
908
+ usercount.rejected = ele.statusCount;
909
+ }
910
+ if (ele.currentStatus !== 'WITHDRAWN') {
911
+ usercount.totalApplied = usercount.totalApplied + ele.statusCount;
912
+ }
913
+ });
914
+ if (this.selectedBatchData) {
915
+ this.selectedBatchData = {
916
+ ...this.selectedBatchData,
917
+ userCount: usercount,
918
+ };
919
+ }
920
+ this.tocSvc.getSelectedBatchData(this.selectedBatchData);
921
+ }
922
+ });
923
+ }
924
+ }
925
+ getResumeDataFromList(type) {
926
+ if (!type) {
927
+ // tslint:disable-next-line:max-line-length
928
+ const lastItem = this.resumeData && this.resumeData.sort((a, b) => new Date(b.lastAccessTime).getTime() - new Date(a.lastAccessTime).getTime()).shift();
929
+ return {
930
+ identifier: lastItem.contentId,
931
+ mimeType: lastItem.progressdetails && lastItem.progressdetails.mimeType,
932
+ };
933
+ }
934
+ const firstItem = this.resumeData && this.resumeData.length && this.resumeData[0];
935
+ return {
936
+ identifier: firstItem.contentId,
937
+ mimeType: firstItem.progressdetails && firstItem.progressdetails.mimeType,
938
+ };
939
+ }
940
+ modifySensibleContentRating() {
941
+ if (this.content &&
942
+ this.content.averageRating &&
943
+ typeof this.content.averageRating !== 'number') {
944
+ this.content.averageRating = this.content.averageRating[this.configSvc.rootOrg || ''];
945
+ }
946
+ if (this.content && this.content.totalRating && typeof this.content.totalRating !== 'number') {
947
+ this.content.totalRating = this.content.totalRating[this.configSvc.rootOrg || ''];
948
+ }
949
+ }
950
+ getLearningUrls() {
951
+ if (this.content) {
952
+ if (!this.forPreview) {
953
+ // this.progressSvc.getProgressFor(this.content.identifier).subscribe(data => {
954
+ // this.contentProgress = data
955
+ // })
956
+ }
957
+ this.isPracticeVisible = Boolean(this.tocSvc.filterToc(this.content, NsContent.EFilterCategory.PRACTICE));
958
+ this.isAssessVisible = Boolean(this.tocSvc.filterToc(this.content, NsContent.EFilterCategory.ASSESS));
959
+ const firstPlayableContent = this.contentSvc.getFirstChildInHierarchy(this.content);
960
+ this.firstResourceLink = viewerRouteGenerator(firstPlayableContent.identifier, firstPlayableContent.mimeType, this.isResource ? undefined : this.content.identifier, this.isResource ? undefined : this.content.contentType, this.forPreview, this.content.primaryCategory, this.getBatchId());
961
+ }
962
+ }
963
+ assignPathAndUpdateBanner(url) {
964
+ const path = url.split('/').pop();
965
+ if (path && this.validPaths.has(path)) {
966
+ this.routePath = path;
967
+ this.updateBannerUrl();
968
+ }
969
+ }
970
+ updateBannerUrl() {
971
+ if (this.banners) {
972
+ this.bannerUrl = this.sanitizer.bypassSecurityTrustStyle(`url(${this.banners[this.routePath]})`);
973
+ }
974
+ }
975
+ playIntroVideo() {
976
+ if (this.content) {
977
+ this.dialog.open(AppTocDialogIntroVideoComponent, {
978
+ data: this.content.introductoryVideo,
979
+ height: '350px',
980
+ width: '620px',
981
+ });
982
+ }
983
+ }
984
+ get sanitizedIntroductoryVideoIcon() {
985
+ if (this.content && this.content.introductoryVideoIcon) {
986
+ return this.sanitizer.bypassSecurityTrustStyle(`url(${this.content.introductoryVideoIcon})`);
987
+ }
988
+ return null;
989
+ }
990
+ fetchExternalContentAccess() {
991
+ if (this.content && this.content.registrationUrl) {
992
+ if (!this.forPreview) {
993
+ this.externalContentFetchStatus = 'fetching';
994
+ this.registerForExternal = false;
995
+ this.tocSvc.fetchExternalContentAccess(this.content.identifier).subscribe(data => {
996
+ this.externalContentFetchStatus = 'done';
997
+ this.registerForExternal = data.hasAccess;
998
+ }, _error => {
999
+ this.externalContentFetchStatus = 'done';
1000
+ this.registerForExternal = false;
1001
+ });
1002
+ }
1003
+ else {
1004
+ this.externalContentFetchStatus = 'done';
1005
+ this.registerForExternal = true;
1006
+ }
1007
+ }
1008
+ }
1009
+ getRatingIcon(ratingIndex) {
1010
+ if (this.content && this.content.averageRating) {
1011
+ const avgRating = this.content.averageRating;
1012
+ const ratingFloor = Math.floor(avgRating);
1013
+ if (ratingIndex <= ratingFloor) {
1014
+ return 'star';
1015
+ }
1016
+ if (ratingFloor === ratingIndex - 1 && avgRating % 1 >= 0.29 && avgRating % 1 < 0.71) {
1017
+ return 'star_half';
1018
+ }
1019
+ if (ratingFloor === ratingIndex - 1 && avgRating % 1 > 0.71) {
1020
+ return 'star';
1021
+ }
1022
+ if (ratingFloor === ratingIndex - 1 && avgRating % 1 < 0.29) {
1023
+ return 'star_border';
1024
+ }
1025
+ }
1026
+ return 'star_border';
1027
+ }
1028
+ checkRegistrationStatus() {
1029
+ const source = (this.content && this.content.sourceShortName) || '';
1030
+ if (!this.forPreview &&
1031
+ !this.isRegistrationSupported &&
1032
+ this.checkRegistrationSources.has(source)) {
1033
+ this.contentSvc
1034
+ .getRegistrationStatus(source)
1035
+ .then(res => {
1036
+ if (res.hasAccess) {
1037
+ this.actionBtnStatus = 'grant';
1038
+ }
1039
+ else {
1040
+ this.actionBtnStatus = 'reject';
1041
+ if (res.registrationUrl && this.content) {
1042
+ this.content.registrationUrl = res.registrationUrl;
1043
+ }
1044
+ }
1045
+ })
1046
+ .catch(_err => { });
1047
+ }
1048
+ else {
1049
+ this.actionBtnStatus = 'grant';
1050
+ }
1051
+ }
1052
+ generateQuery(type) {
1053
+ if (this.firstResourceLink && (type === 'START' || type === 'START_OVER')) {
1054
+ let qParams = {
1055
+ ...this.firstResourceLink.queryParams,
1056
+ viewMode: type,
1057
+ batchId: this.getBatchId(),
1058
+ };
1059
+ if (this.contextId && this.contextPath) {
1060
+ qParams = {
1061
+ ...qParams,
1062
+ collectionId: this.contextId,
1063
+ collectionType: this.contextPath,
1064
+ };
1065
+ }
1066
+ if (this.forPreview) {
1067
+ delete qParams.viewMode;
1068
+ }
1069
+ return qParams;
1070
+ }
1071
+ if (this.resumeDataLink && type === 'RESUME') {
1072
+ let qParams = {
1073
+ ...this.resumeDataLink.queryParams,
1074
+ batchId: this.getBatchId(),
1075
+ viewMode: 'RESUME',
1076
+ };
1077
+ if (this.contextId && this.contextPath) {
1078
+ qParams = {
1079
+ ...qParams,
1080
+ collectionId: this.contextId,
1081
+ collectionType: this.contextPath,
1082
+ };
1083
+ }
1084
+ if (this.forPreview) {
1085
+ delete qParams.viewMode;
1086
+ }
1087
+ return qParams;
1088
+ }
1089
+ if (this.forPreview) {
1090
+ return {};
1091
+ }
1092
+ return {
1093
+ batchId: this.getBatchId(),
1094
+ viewMode: type,
1095
+ };
1096
+ }
1097
+ get isInIFrame() {
1098
+ try {
1099
+ return window.self !== window.top;
1100
+ }
1101
+ catch (e) {
1102
+ return true;
1103
+ }
1104
+ }
1105
+ getBgColor(tagTitle) {
1106
+ const bgColor = this.tagSvc.stringToColor(tagTitle.toLowerCase());
1107
+ const color = this.tagSvc.getContrast(bgColor);
1108
+ return { color, 'background-color': bgColor };
1109
+ }
1110
+ getTargetTime() {
1111
+ if (this.selectedBatch.startDate) {
1112
+ this.targetDate = new Date(this.selectedBatch.startDate);
1113
+ const convertedDate = dayjs(this.selectedBatch.startDate).format('YYYY-MM-DD HH:mm:ss');
1114
+ return new Date(convertedDate).getTime();
1115
+ }
1116
+ // this.targetTime = ''
1117
+ return '';
1118
+ }
1119
+ callTimer() {
1120
+ // this.targetTime = this.getTargetTime()
1121
+ if (this.serverDate) {
1122
+ // let timerInterval = timer(1000, 1000)
1123
+ // setTimeout(()=>{
1124
+ // if (this.timerIntervalClear) {
1125
+ // this.timerIntervalClear.unsubscribe()
1126
+ // }
1127
+ // this.timerIntervalClear = timerInterval.subscribe((t: any) => {
1128
+ // console.log(this.selectedBatch.startDate,'----')
1129
+ // console.log(this.batchControl.value.startDate,'hiiii')
1130
+ // this.targetDate = new Date(this.selectedBatch.startDate)
1131
+ // const convertedDate = dayjs(this.selectedBatch.startDate).format('YYYY-MM-DD HH:mm:ss')
1132
+ // this.targetTime = ''
1133
+ // this.targetTime=new Date(convertedDate).getTime()
1134
+ // this.timerFunc(t,this.serverDate + t * 1000)
1135
+ // })
1136
+ // },100)
1137
+ let t = 0;
1138
+ if (this.timerIntervalClear) {
1139
+ clearInterval(this.timerIntervalClear);
1140
+ }
1141
+ this.timerIntervalClear = setInterval(() => {
1142
+ this.targetTime = '';
1143
+ if (this.batchControl && this.batchControl.value && this.batchControl.value.startDate) {
1144
+ // console.log(this.selectedBatch.startDate,'----')
1145
+ this.targetDate = new Date(this.batchControl.value.startDate);
1146
+ const convertedDate = dayjs(this.batchControl.value.startDate).format('YYYY-MM-DD HH:mm:ss');
1147
+ this.targetTime = new Date(convertedDate).getTime();
1148
+ }
1149
+ this.timerFunc(this.serverDate + t * 1000);
1150
+ t = t + 1;
1151
+ }, 1000);
1152
+ }
1153
+ }
1154
+ timerFunc(serverDate) {
1155
+ // serverDate = serverDate + timeer
1156
+ if (serverDate && this.targetTime) {
1157
+ let timerLocal = {
1158
+ days: 0,
1159
+ hours: 0,
1160
+ min: 0,
1161
+ seconds: 0,
1162
+ };
1163
+ // serverDate = serverDate + 1000
1164
+ this.date = new Date(serverDate);
1165
+ this.now = this.date.getTime();
1166
+ this.difference = this.targetTime - this.now;
1167
+ this.difference = this.difference / (1000 * 60 * 60 * 24);
1168
+ this.days = Math.floor(this.difference);
1169
+ this.hours = 23 - this.date.getHours();
1170
+ this.minutes = 60 - this.date.getMinutes();
1171
+ this.seconds = 60 - this.date.getSeconds();
1172
+ Number(this.hours);
1173
+ !isNaN(this.days)
1174
+ ? (this.days = Math.floor(this.difference))
1175
+ : (this.days = `<img src="https://i.gifer.com/VAyR.gif" />`);
1176
+ timerLocal = {
1177
+ days: this.days,
1178
+ hours: this.hours,
1179
+ min: this.minutes,
1180
+ seconds: this.seconds,
1181
+ };
1182
+ this.timerService.setTimerData(timerLocal);
1183
+ }
1184
+ }
1185
+ get showDisableMsg() {
1186
+ const allBatches = this.batchData.content;
1187
+ const status = [];
1188
+ if (allBatches) {
1189
+ allBatches.forEach((ele) => {
1190
+ if (!this.handleEnrollmentEndDate(ele) || this.disableEnrollBtn) {
1191
+ status.push(ele);
1192
+ }
1193
+ });
1194
+ return status.length === allBatches.length;
1195
+ }
1196
+ return false;
1197
+ }
1198
+ get findMessage() {
1199
+ if (this.showDisableMsg) {
1200
+ const msg = this.WFSTATUS_MSG_MAPPING.EXPIRED;
1201
+ return this.tocConfig[msg];
1202
+ }
1203
+ return '';
1204
+ }
1205
+ onClickOfShare() {
1206
+ this.enableShare = true;
1207
+ this.raiseTelemetry('shareContent');
1208
+ }
1209
+ add(event) {
1210
+ // this.getUsersToShare(event.value)
1211
+ if (event.value && this.matAutocomplete && !this.matAutocomplete.isOpen) {
1212
+ const input = event.input;
1213
+ const value = event.value;
1214
+ if (this.users.length === this.maxEmailsLimit) {
1215
+ this.openSnackbar(this.translateLabels('maxLimit', 'contentSharing', ''));
1216
+ return;
1217
+ }
1218
+ if (this.users.includes(value.trim())) {
1219
+ this.openSnackbar(this.translateLabels('dulicateEmail', 'contentSharing', ''));
1220
+ return;
1221
+ }
1222
+ // tslint:disable-next-line: max-line-length
1223
+ const ePattern = new RegExp(/^(?!.*\.\.)(?!.*\._)(?!.*\._\.)(?!.*\.\.$)(?!.*\.$)[a-zA-Z0-9_]+(?:\.[a-zA-Z0-9_]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?$/);
1224
+ if (ePattern.test(value)) {
1225
+ if ((value || '').trim()) {
1226
+ this.users.push(value.trim());
1227
+ }
1228
+ if (input) {
1229
+ input.value = '';
1230
+ }
1231
+ this.userCtrl.setValue('');
1232
+ const el = document.getElementsByClassName('mat-chip-list-wrapper');
1233
+ if (el != null) {
1234
+ setTimeout(() => {
1235
+ el[0].scrollTop = el[0].scrollHeight;
1236
+ }, 200);
1237
+ }
1238
+ }
1239
+ else {
1240
+ this.openSnackbar(this.translateLabels('invalidEmail', 'contentSharing', ''));
1241
+ return;
1242
+ }
1243
+ }
1244
+ }
1245
+ remove(user) {
1246
+ const index = this.users.indexOf(user);
1247
+ if (index >= 0) {
1248
+ this.users.splice(index, 1);
1249
+ }
1250
+ }
1251
+ selected(event) {
1252
+ if (this.users.length === this.maxEmailsLimit) {
1253
+ this.openSnackbar(this.translateLabels('maxLimit', 'contentSharing', ''));
1254
+ return;
1255
+ }
1256
+ if (this.users.includes(event.option.value)) {
1257
+ this.openSnackbar(this.translateLabels('dulicateUser', 'contentSharing', ''));
1258
+ return;
1259
+ }
1260
+ this.users.push(event.option.value);
1261
+ if (this.userInput) {
1262
+ this.userInput.nativeElement.value = '';
1263
+ }
1264
+ this.userCtrl.setValue('');
1265
+ const el = document.getElementsByClassName('mat-chip-list-wrapper');
1266
+ if (el != null) {
1267
+ setTimeout(() => {
1268
+ el[0].scrollTop = el[0].scrollHeight;
1269
+ }, 200);
1270
+ }
1271
+ }
1272
+ filterSharedUsers(value) {
1273
+ if (value) {
1274
+ const filterValue = value.toLowerCase();
1275
+ return this.allUsers.filter(user => user.name.toLowerCase().includes(filterValue));
1276
+ }
1277
+ return [];
1278
+ }
1279
+ submitSharing() {
1280
+ let courseId = '';
1281
+ let courseName = '';
1282
+ let coursePosterImageUrl = '';
1283
+ let courseProvider = '';
1284
+ let primaryCategory = '';
1285
+ if (this.configSvc.userProfile) {
1286
+ courseProvider = this.configSvc.userProfile.rootOrgName || '';
1287
+ }
1288
+ if (this.content) {
1289
+ courseId = this.content.identifier,
1290
+ courseName = this.content.name,
1291
+ coursePosterImageUrl = this.content.posterImage || '',
1292
+ primaryCategory = this.content.primaryCategory;
1293
+ }
1294
+ const obj = {
1295
+ request: {
1296
+ courseId,
1297
+ courseName,
1298
+ coursePosterImageUrl,
1299
+ courseProvider,
1300
+ primaryCategory,
1301
+ recipients: '',
1302
+ },
1303
+ };
1304
+ const recipients = [];
1305
+ this.users.forEach((selectedUser) => {
1306
+ if (selectedUser.includes('@') && selectedUser.includes('.')) {
1307
+ recipients.push({ email: selectedUser });
1308
+ }
1309
+ else {
1310
+ const selectedUserObj = this.allUsers.filter(user => user.name === selectedUser);
1311
+ if (selectedUserObj.length) {
1312
+ recipients.push({ userId: selectedUserObj[0].id, email: selectedUserObj[0].email });
1313
+ }
1314
+ }
1315
+ });
1316
+ if (recipients.length) {
1317
+ obj.request.recipients = recipients;
1318
+ this.tocSvc.shareContent(obj).subscribe(result => {
1319
+ if (result.responseCode === 'OK') {
1320
+ this.openSnackbar(this.translateLabels('success', 'contentSharing', ''));
1321
+ }
1322
+ this.users = [];
1323
+ this.filteredUsers = [];
1324
+ this.allUsers = [];
1325
+ this.enableShare = false;
1326
+ this.userCtrl.setValue('');
1327
+ }, error => {
1328
+ // tslint:disable
1329
+ console.log(error);
1330
+ this.openSnackbar(this.translateLabels('error', 'contentSharing', ''));
1331
+ });
1332
+ }
1333
+ }
1334
+ onClose() {
1335
+ this.enableShare = false;
1336
+ this.users = [];
1337
+ this.filteredUsers = [];
1338
+ this.allUsers = [];
1339
+ this.userCtrl.setValue('');
1340
+ this.raiseTelemetry('shareClose');
1341
+ }
1342
+ copyToClipboard() {
1343
+ const textArea = document.createElement('textarea');
1344
+ textArea.value = window.location.href;
1345
+ document.body.appendChild(textArea);
1346
+ //textArea.focus()
1347
+ textArea.select();
1348
+ document.execCommand('copy');
1349
+ document.body.removeChild(textArea);
1350
+ this.openSnackbar(this.translateLabels('linkCopied', 'contentSharing', ''));
1351
+ this.raiseTelemetry('copyToClipboard');
1352
+ }
1353
+ raiseTelemetry(subType) {
1354
+ this.events.raiseInteractTelemetry({
1355
+ type: 'click',
1356
+ subType: subType,
1357
+ id: this.content ? this.content.identifier : '',
1358
+ }, {
1359
+ id: this.content ? this.content.identifier : '',
1360
+ type: this.content ? this.content.primaryCategory : '',
1361
+ }, {
1362
+ pageIdExt: `btn-${subType}`,
1363
+ module: WsEvents.EnumTelemetrymodules.CONTENT,
1364
+ });
1365
+ }
1366
+ translateLabels(label, type, subtype) {
1367
+ return this.langtranslations.translateActualLabel(label, type, subtype);
1368
+ }
1369
+ ngOnDestroy() {
1370
+ this.tocSvc.analyticsFetchStatus = 'none';
1371
+ if (this.routerParamSubscription) {
1372
+ this.routerParamSubscription.unsubscribe();
1373
+ }
1374
+ if (this.routeSubscription) {
1375
+ this.routeSubscription.unsubscribe();
1376
+ }
1377
+ if (this.batchWFDataSubscription) {
1378
+ this.batchWFDataSubscription.unsubscribe();
1379
+ }
1380
+ if (this.selectedBatchSubscription) {
1381
+ this.selectedBatchSubscription.unsubscribe();
1382
+ }
1383
+ if (this.timerIntervalClear) {
1384
+ clearInterval(this.timerIntervalClear);
1385
+ // this.timerIntervalClear.unsubscribe()
1386
+ this.targetTime = '';
1387
+ }
1388
+ if (this.selectedBatchSubscription) {
1389
+ this.batchControlUnsubscribe.unsubscribe();
1390
+ }
1391
+ this.batchControl.setValue({});
1392
+ this.batchControl.updateValueAndValidity();
1393
+ this.selectedBatch = {};
1394
+ }
1395
+ translateLabel(label, type) {
1396
+ return this.langtranslations.translateLabel(label, type, '');
1397
+ }
1398
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocBannerComponent, deps: [{ token: i1.DomSanitizer }, { token: i2.Router }, { token: i2.ActivatedRoute }, { token: i3.MatLegacyDialog }, { token: i4.AppTocService }, { token: i5.WidgetContentService }, { token: i6.UtilityService }, { token: i7.MobileAppsService }, { token: i8.MatLegacySnackBar }, { token: i6.ConfigurationsService }, { token: i9.TitleTagService }, { token: i10.ActionService }, { token: i6.LoggerService }, { token: i11.DatePipe }, { token: i12.TranslateService }, { token: i13.UserAutocompleteService }, { token: i6.EventService }, { token: i6.MultilingualTranslationsService }, { token: i14.TimerService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Component }); }
1399
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocBannerComponent, selector: "ws-app-toc-banner", inputs: { banners: "banners", content: "content", resumeData: "resumeData", analytics: "analytics", forPreview: "forPreview", batchData: "batchData", userEnrollmentList: "userEnrollmentList", contentReadData: "contentReadData", clickToShare: "clickToShare" }, outputs: { withdrawOrEnroll: "withdrawOrEnroll", programEnrollCall: "programEnrollCall" }, providers: [AccessControlService, DatePipe], viewQueries: [{ propertyName: "userInput", first: true, predicate: ["userInput"], descendants: true }, { propertyName: "matAutocomplete", first: true, predicate: ["auto"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"header-synopsis fixed-width margin-top-xl\" [ngClass]=\"{ 'header-synopsis-gradient': bannerUrl }\"\r\n *ngIf=\"show\">\r\n <div class=\"flex flex-row\">\r\n <div class=\"flex-auto\">\r\n <div class=\"header-title flex-col sm:flex-row\">\r\n <!-- image -->\r\n <div *ngIf=\"content?.posterImage\" class=\"float-left\">\r\n <img [src]=\"content?.posterImage | pipePublicURL\" [id]=\"'source_' + content.identifier\" class=\"app-icon\"\r\n [wsUtilsDefaultThumbnail]=\"defaultSLogo\" [alt]=\"content.sourceName || iGOT\" />\r\n </div>\r\n <div *ngIf=\"!content?.posterImage\" class=\"float-left\">\r\n <ng-container *ngIf=\"content?.appIcon; else defaultImg\">\r\n <img [src]=\"content?.appIcon | pipePublicURL\" [id]=\"'source_' + content.identifier\" class=\"app-icon\"\r\n [wsUtilsDefaultThumbnail]=\"defaultSLogo\" [alt]=\"content.sourceName || iGOT\" />\r\n </ng-container>\r\n <ng-template #defaultImg>\r\n <img src=\"/assets/instances/eagle/app_logos/default.png\" [id]=\"'source_' + content.identifier\"\r\n class=\"app-icon\" [alt]=\"content.sourceName || iGOT\" />\r\n </ng-template>\r\n </div>\r\n <div class=\"sm:ml-5 flex flex-auto\" [id]=\"'m-c-'+ content.identifier\">\r\n <div class=\"sm:ml-5 flex flex-col flex-auto\">\r\n <h1 class=\"mat-headline margin-remove-bottom padding-bottom-xs hidden sm:block\"\r\n [title]=\"contentReadData?.name\">\r\n {{ contentReadData?.name }}\r\n <div class=\"float-right cursor-pointer flex\" (click)=\"onClickOfShare()\" *ngIf=\"canShare\">\r\n <mat-icon class=\"ws-mat-accent-text padding-top-xs\">share</mat-icon>\r\n </div>\r\n </h1>\r\n <h1 class=\"mat-headline margin-remove-bottom padding-bottom-xs block sm:hidden\"\r\n [title]=\"contentReadData?.name\">\r\n {{ contentReadData?.name }}\r\n </h1>\r\n <span *ngIf=\"contentProgress === 1\" class=\"margin-left-s\">\r\n <mat-icon class=\"ws-mat-accent-text\">check_circle</mat-icon>\r\n </span>\r\n <div *ngIf=\"content?.primaryCategory\" class=\"apIcon float-left mb-4\">\r\n <img src=\"/assets/icons/content/course.svg\" [id]=\"'source_' + content.identifier\" class=\"source-icon\"\r\n [wsUtilsDefaultThumbnail]=\"defaultSLogo\" [alt]=\"content.sourceName || iGOT\" />\r\n <span>{{ translateLabel(content?.primaryCategory, 'searchfilters') }}</span>\r\n </div>\r\n <div *ngIf=\"content?.appIcon\" class=\"apIcon float-left mb-4\">\r\n <img [src]=\"content?.creatorLogo | pipePublicURL\" [id]=\"'source_' + content.identifier\"\r\n class=\"source-icon\" [wsUtilsDefaultThumbnail]=\"defaultSLogo\" [alt]=\"content.sourceName || iGOT\" />\r\n </div>\r\n <div [ngSwitch]=\"routePath\" class=\"header-meta\" [ngClass]=\"{ 'header-meta-banner': bannerUrl }\">\r\n <!-- Overview Section -->\r\n <div class=\"banner-overview-container\" [hidden]=\"!content?.purpose && showSubtitleOnBanner\"\r\n *ngSwitchCase=\"'overview'\">\r\n <h3 class=\"overview-description mat-body-1\" *ngIf=\"showSubtitleOnBanner\" i18n-title title=\"Subtitle\">\r\n {{ content?.source | pipeLimitTo: 250 }}\r\n </h3>\r\n <p class=\"overview-description mat-body-1\" *ngIf=\"!showSubtitleOnBanner\" i18n-title title=\"Description\">\r\n {{ content?.instructions | pipeLimitTo: 450 }}\r\n </p>\r\n <div *ngIf=\"sanitizedIntroductoryVideoIcon\" class=\"overview-intro ws-mat-primary-lite-background\"\r\n [style.backgroundImage]=\"sanitizedIntroductoryVideoIcon\" role=\"button\" (click)=\"playIntroVideo()\">\r\n <mat-icon role=\"button\" class=\"overview-intro-overlay\">play_arrow</mat-icon>\r\n </div>\r\n </div>\r\n <!-- Toc Section -->\r\n <div *ngSwitchCase=\"'contents'\">\r\n <!-- Contents Banner -->\r\n </div>\r\n <!-- Analytics Section -->\r\n <div class=\"banner-overview-container mat-body-1\" [hidden]=\"!content?.purpose && showSubtitleOnBanner\"\r\n *ngSwitchCase=\"'analytics'\">\r\n <h3 class=\"overview-description mat-body-1\" *ngIf=\"showSubtitleOnBanner\" i18n-title title=\"Subtitle\">\r\n {{ content?.purpose | pipeLimitTo: 250 }}\r\n </h3>\r\n <p class=\"overview-description mat-body-1\" *ngIf=\"!showSubtitleOnBanner\" i18n-title title=\"Description\">\r\n {{ content?.instructions | pipeLimitTo: 450 }}\r\n </p>\r\n <div *ngIf=\"sanitizedIntroductoryVideoIcon\" class=\"overview-intro ws-mat-primary-lite-background\"\r\n [style.backgroundImage]=\"sanitizedIntroductoryVideoIcon\" role=\"button\" (click)=\"playIntroVideo()\">\r\n <mat-icon role=\"button\" class=\"overview-intro-overlay\">play_arrow</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"content?.averageRating\" class=\"flex items-center rating margin-bottom-m\">\r\n <span class=\"rating-number mat-body-2\">{{ content?.averageRating }}&nbsp;</span>\r\n <mat-icon class=\"mat-icon material-icons\" *ngFor=\"let rating of [1, 2, 3, 4, 5]\">\r\n {{ getRatingIcon(rating) }}</mat-icon>\r\n <span class=\"margin-left-xs rating-count mat-body-2\" *ngIf=\"content?.totalRating\">\r\n ( {{ content?.totalRating | pipeCountTransform }} )</span>\r\n </div>\r\n <div *ngIf=\"!content?.averageRating\" class=\"flex items-center rating margin-bottom-m\">\r\n <span class=\"rating-number mat-body-2\"> 0.0 &nbsp;</span>\r\n <mat-icon class=\"mat-icon material-icons\" *ngFor=\"let rating of [1, 2, 3, 4, 5]\">\r\n {{ getRatingIcon(rating) }}</mat-icon>\r\n <span class=\"margin-left-xs rating-count mat-body-2\" *ngIf=\"!content?.totalRating\">\r\n ( {{ 0 | pipeCountTransform }} )</span>\r\n </div>\r\n <!-- tags -->\r\n <div class=\"tags margin-bottom-s\" *ngIf=\"content?.keywords && content?.keywords?.length > 0\">\r\n <span *ngFor=\"let tag of content.keywords\" class=\"tag\">\r\n {{tag}}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\r\n <div class=\"batch-div\">\r\n <div class=\"request-block\">\r\n <ng-container *ngIf=\"content\" [ngTemplateOutlet]=\"batchDropdown\"></ng-container>\r\n <ng-container\r\n *ngIf=\"batchData && !batchData?.enrolled && batchData?.workFlow?.wfInitiated &&\r\n (batchData?.workFlow?.wfItem?.currentStatus !== WFBlendedProgramStatus.REJECTED) && (batchData?.workFlow?.wfItem?.currentStatus !== WFBlendedProgramStatus.REMOVED) &&\r\n (batchData?.workFlow?.wfItem?.currentStatus !== WFBlendedProgramStatus.WITHDRAWN) &&\r\n (batchData?.workFlow?.wfItem?.currentStatus !== WFBlendedProgramStatus.APPROVED) && batchData?.content?.length\">\r\n <p class=\"margin-remove-bottom mat-body-1 padding-m bg-white\">\r\n {{batchData?.workFlow?.batch?.name}} - ({{batchData?.workFlow?.batch?.startDate | date: 'dd-MM-yyyy'}} -\r\n {{batchData?.workFlow?.batch?.endDate | date: 'dd-MM-yyyy' || 'present'}})\r\n </p>\r\n <ng-container>\r\n <button class=\"withdraw-batch\" (click)=\"!disableWithdrawnBtn && requestToWithdrawDialog()\"\r\n [disabled]=\"disableWithdrawnBtn\" [ngClass]=\"{ 'disable-btn': disableWithdrawnBtn }\">\r\n <ng-container> {{ 'apptocbanner.withDrawYourRequest' | translate }} </ng-container>\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"batchData && batchData?.enrolled && batchData?.content?.length\">\r\n <h3 class=\"margin-remove-bottom p-4 bg-white mat-body-1\" *ngFor=\"let batch of batchData.content\">\r\n {{batch?.name}} ({{batch?.startDate | date: 'dd-MM-yyyy' }} - {{batch?.endDate | date: 'dd-MM-yyyy' ||\r\n 'present'}})\r\n </h3>\r\n <ng-container [ngTemplateOutlet]=\"statusMsg\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"batchData && !batchData?.enrolled && !batchData?.content?.length\">\r\n <h3 class=\"margin-remove-bottom mat-body-2 ws-default-text\">\r\n No batches\r\n </h3>\r\n </ng-container>\r\n </div>\r\n <!-- <ng-container *ngIf=\"batchData && batchData?.content?.length && batchData?.content[0]?.batchAttributes?.batchLocationDetails\">\r\n <div class=\"flex items-center location-wrapper\">\r\n <div>\r\n <mat-icon class=\"location-icon\">\r\n location_on</mat-icon>\r\n </div>\r\n <div class=\"loc-details\">\r\n {{batchData?.content[0]?.batchAttributes?.batchLocationDetails}}\r\n </div>\r\n </div>\r\n </ng-container> -->\r\n </div>\r\n <ng-container *ngIf=\"batchData && !batchData?.enrolled && batchData?.content?.length\"\r\n [ngTemplateOutlet]=\"statusMsg\"></ng-container>\r\n</ng-container>\r\n<ng-container *ngIf=\"content?.courseCategory === nsContent.ECourseCategory.MODERATED_PROGRAM\">\r\n <div class=\"request-batch\">\r\n <div class=\"batch-div\">\r\n <ng-container *ngIf=\"content\" [ngTemplateOutlet]=\"batchDropdown\"></ng-container>\r\n </div>\r\n </div>\r\n</ng-container>\r\n<!-- <div class=\"header-synopsis fixed-width margin-top-l\" [ngClass]=\"{ 'header-synopsis-gradient': bannerUrl }\" *ngIf=\"content && batchControl?.value?.batchAttributes?.batchLocationDetails\">\r\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\r\n <h2>{{'apptocbanner.batchLocation' | translate}}</h2>\r\n <p>{{batchControl?.value?.batchAttributes?.batchLocationDetails}}</p>\r\n </ng-container>\r\n</div> -->\r\n\r\n<mat-menu #actionMenu=\"matMenu\">\r\n <div mat-menu-item>\r\n <ng-container *ngIf=\"content\" [ngTemplateOutlet]=\"actions\"></ng-container>\r\n </div>\r\n</mat-menu>\r\n\r\n<ng-template #actions>\r\n <a i18n-aria-label aria-label=\"Take Action\" mat-icon-button *ngIf=\"reviewButton\"\r\n [routerLink]=\"['/author/editor/' + content?.identifier]\">\r\n <mat-icon>publish</mat-icon>\r\n </a>\r\n <ws-widget-btn-content-download id=\"prevfordownload\" [forPreview]=\"forPreview\"\r\n [widgetData]=\"content | pipePartialContent : ['identifier', 'contentType', 'resourceType', 'mimeType', 'downloadUrl', 'isExternal', 'artifactUrl']\">\r\n </ws-widget-btn-content-download>\r\n <ws-widget-btn-content-share id=\"prevforshare\" [forPreview]=\"forPreview\" [widgetData]=\"content\">\r\n </ws-widget-btn-content-share>\r\n <ws-widget-btn-kb [forPreview]=\"forPreview\" id=\"prev\" [contentId]=\"content?.identifier\"\r\n [contentName]=\"contentReadData?.name\" [contentType]=\"content?.contentType\" [status]=\"content?.status\">\r\n </ws-widget-btn-kb>\r\n <ws-widget-btn-goals [forPreview]=\"forPreview\" id=\"goalsforprev\" *ngIf=\"isGoalsEnabled && btnGoalsConfig\"\r\n [widgetData]=\"btnGoalsConfig\">\r\n </ws-widget-btn-goals>\r\n <ws-widget-btn-playlist [forPreview]=\"forPreview\" id=\"playlistforprev\" *ngIf=\"btnPlaylistConfig\"\r\n [widgetData]=\"btnPlaylistConfig\">\r\n </ws-widget-btn-playlist>\r\n <ws-widget-btn-content-feedback-v2 [forPreview]=\"forPreview\" id=\"feedbackforprev\"\r\n [widgetData]=\"content | pipePartialContent: ['identifier', 'name']\">\r\n </ws-widget-btn-content-feedback-v2>\r\n</ng-template>\r\n<ng-template #authView>{{'apptocbanner.view' | translate}}</ng-template>\r\n<ng-template #statusMsg>\r\n <div class=\"status-container mt-2 mb-2\"\r\n *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && batchData?.workFlow?.wfInitiated\">\r\n <div class=\"flex\" *ngIf=\"showMsg\">\r\n <ng-container *ngIf=\"showIcon\">\r\n <mat-icon class=\"mr-4\" [ngClass]=\"iconColor\" *ngIf=\"WFIcon === 'circle'\">check_circle</mat-icon>\r\n <mat-icon class=\"mr-4 ws-mat-red-text visibility-show\" style=\"transform: rotate(180deg);\"\r\n *ngIf=\"WFIcon === 'info'\">info</mat-icon>\r\n </ng-container>\r\n <div class=\"mat-body-1\">{{ getWFMsg }}</div>\r\n </div>\r\n </div>\r\n <div class=\"status-container mt-5\"\r\n *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && showDisableMsg && !showMsg && findMessage.length > 0\">\r\n <div class=\"flex\">\r\n <ng-container>\r\n <mat-icon class=\"mr-3 ws-mat-red-text\" style=\"transform: rotate(180deg);\">info</mat-icon>\r\n </ng-container>\r\n <div class=\"mat-body-1\">\r\n <p class=\"margin-remove-bottom \">{{findMessage}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"share-container\" *ngIf=\"enableShare\">\r\n <div *ngIf=\"showLoader\" class=\"text-center my-2 loader\">\r\n <mat-spinner class=\"inline-block\"></mat-spinner>\r\n </div>\r\n <div class=\"cursor-pointer close-share-dialog\"><mat-icon (click)=\"onClose()\" class=\"close-icon\">close</mat-icon></div>\r\n <div class=\"share-modal\">\r\n <div class=\"karmasahayogi-icon\"><img alt=\"karmasahayogi-icon\" src=\"/assets/icons/KarmaSahayogi.svg\"></div>\r\n <div class=\"content-div\">\r\n <div class=\"triangle-left hidden md:block\"></div>\r\n <div class=\"contnet\">\r\n <section class=\"w-full flex align-center justify-between \">\r\n <div class=\"mb-2\">\r\n <h2 class=\"mat-headline margin-remove-bottom ws-mat-black-text\">{{'contentSharing.header' | translate}}</h2>\r\n </div>\r\n </section>\r\n <form [formGroup]=\"shareForm\">\r\n <div class=\"mat-body-2\">\r\n <div class=\"md-5\">\r\n <mat-form-field appearance=\"outline\" class=\"w-full\">\r\n <mat-chip-list #chipList aria-label=\"user selection\" appearance=\"outline\">\r\n <mat-chip *ngFor=\"let user of users\" [selectable]=\"selectable\" [removable]=\"removable\"\r\n (removed)=\"remove(user)\">\r\n {{user}}\r\n <mat-icon matChipRemove *ngIf=\"removable\">close</mat-icon>\r\n </mat-chip>\r\n <input tabindex=\"-1\" class=\"inputTextBox\"\r\n placeholder=\"{{users.length === 0 ? translateLabels('placehoderText', 'contentSharing') : ''}}\"\r\n #userInput formControlName=\"review\" [formControl]=\"userCtrl\" [matAutocomplete]=\"auto\"\r\n [matChipInputFor]=\"chipList\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"addOnBlur\" (matChipInputTokenEnd)=\"add($event)\">\r\n </mat-chip-list>\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\r\n <mat-option *ngFor=\"let user of filteredUsers\" [value]=\"user.name\">\r\n <div class=\"flex\">\r\n <div class=\"iconDiv\">\r\n <span class=\"iconText\">{{user.iconText.substring(0,2)}}</span>\r\n </div>\r\n <div>\r\n <div>{{user.name}}</div>\r\n <div class=\"emailText\">{{user.maskedEmail}}</div>\r\n </div>\r\n </div>\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-hint align=\"start\" class=\"left-over-emails\">{{'contentSharing.note' | translate}}</mat-hint>\r\n <mat-hint align=\"end\" class=\"left-over-emails\">{{ users.length }} /{{maxEmailsLimit}}\r\n {{'contentSharing.remaingEmails' | translate}}</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"flex mt-5\">\r\n <div class=\"flex flex-1 flex-end\">\r\n <span class=\"copy-link-btn cursor-pointer\" (click)=\"copyToClipboard()\">{{'contentSharing.copyLink' |\r\n translate}} &nbsp;&nbsp;<mat-icon>link</mat-icon></span>\r\n <button mat-stroked-button type=\"submit\"\r\n [ngClass]=\"{'disable-send-btn': users.length === 0 || users.length}\"\r\n class=\"text-white ws-mat-primary-background flex-auto-display send-btn\"\r\n [disabled]=\"userCtrl.value.length || users.length === 0 || users.length > maxEmailsLimit\"\r\n (click)=\"submitSharing()\">\r\n {{'contentSharing.send' | translate}} &nbsp; <mat-icon>send</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #batchDropdown>\r\n <form class=\"flex flex-col gap-4\">\r\n <ng-container *ngIf=\"batchData && !batchData?.enrolled\r\n && (!batchData.workFlow?.wfInitiated || (batchData.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REMOVED))\r\n && batchData?.content?.length\">\r\n <mat-form-field appearance=\"outline\" class=\"w-full batch-form-field\">\r\n <mat-select #batchControlData [formControl]=\"batchControl\" required autoSelctFirstOption\r\n (selectionChange)=\"batchChange($event)\" panelClass=\"batch-dropdown\">\r\n <mat-option *ngFor=\"let batch of batchData.content; let i=index\" [value]=\"batch\" selected=\"index === 0\"\r\n [disabled]=\"!handleEnrollmentEndDate(batch) || disableEnrollBtn \">\r\n <div class=\"flex flex-row items-center gap-2\">\r\n <div class=\"flex-1 text-sm batch-timings\">\r\n {{ batch.name }} ( {{ batch.startDate | date: 'd MMM, yyyy' }} - {{ batch.endDate | date: 'd MMM, yyyy'\r\n || 'present' }} )\r\n </div>\r\n <div class=\"expired\" *ngIf=\"!handleEnrollmentEndDate(batch) || disableEnrollBtn\">\r\n Expired\r\n </div>\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"batchControl.hasError('required')\">Please choose a batch to start course</mat-error>\r\n </mat-form-field>\r\n <div class=\"flex flex-wrap gap-3\">\r\n <ng-container *ngIf=\"!showRejected\">\r\n <div class=\"flex-1\">\r\n <div class=\"flex flex-col gap-1\" *ngIf=\"selectedBatch && selectedBatch.enrollmentEndDate \">\r\n <p class=\"text-xs leading-4 mb-0\">Last enroll date</p>\r\n <p class=\"font-bold mb-0\">{{ selectedBatch.enrollmentEndDate | date: 'd MMM, y' }}</p>\r\n </div>\r\n </div>\r\n <div class=\"flex flex-row justify-center items-center\">\r\n <button class=\"enroll-button\"\r\n [ngClass]=\"{ 'disable-btn': disableEnrollBtn || batchControl.hasError('required') || !handleEnrollmentEndDate(selectedBatch) }\"\r\n [disabled]=\"disableEnrollBtn || batchControl.hasError('required')|| !handleEnrollmentEndDate(selectedBatch)\"\r\n (click)=\"requestToEnrollDialog()\">\r\n <ng-container>\r\n Request to enroll\r\n </ng-container>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"showRejected && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\r\n <h3 class=\"margin-remove-bottom mat-body-2 ws-default-text\">\r\n Your enrollment request is {{batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REMOVED\r\n ?'removed':'rejected'}}.</h3>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </form>\r\n</ng-template>", styles: [".button,.batch-div .enroll-button,.batch-div .withdraw-batch{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}.batch-div{border-radius:8px;background-color:#fdead5;max-width:400px;margin:0 auto}.batch-div .request-block{padding:16px}.batch-div .batch-details{padding:16px;border:1px solid #FF9800;border-radius:8px;background-color:#fff;cursor:pointer}.batch-div .batch-enrolled{font-weight:700;color:#4caf50;font-size:.75rem}.batch-div .withdraw-batch{color:#000000de;border:1px solid rgba(0,0,0,.8705882353);background-color:#fff;width:100%;margin-top:16px}.batch-div .enroll-button{color:#fff;background-color:#ff9800;border:1px solid #FF9800}::ng-deep .batch-dropdown{margin-top:3rem!important}::ng-deep .batch-dropdown .mat-option{height:-moz-fit-content!important;height:fit-content!important;padding:12px 16px!important}::ng-deep .batch-form-field{height:64px}::ng-deep .batch-form-field .mat-form-field-wrapper{margin:0;padding-bottom:0;height:inherit}::ng-deep .batch-form-field .mat-form-field-wrapper .mat-form-field-flex{height:inherit}::ng-deep .batch-form-field .mat-form-field-outline{border-radius:8px;height:inherit}::ng-deep .batch-form-field .mat-form-field-infix{display:flex;align-items:center;font-size:14px;border-top:.35rem solid transparent;padding:8px 0;height:44px}::ng-deep .batch-form-field .mat-form-field-infix .mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:translateY(0)!important}::ng-deep .batch-form-field .mat-form-field-subscript-wrapper{padding:8px 4px!important}::ng-deep .batch-form-field .mat-form-field-subscript-wrapper .mat-error{margin-top:6px}::ng-deep .batch-form-field .mat-select-value-text{white-space:pre-line!important;line-height:21px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.disable-btn{opacity:.5}.mb-0{margin-bottom:0!important}.batch-timings{text-transform:uppercase;line-height:20px}.header-synopsis{padding:32px 64px}@media only screen and (max-width: 599px){.header-synopsis{padding:32px 24px}}.app-icon{height:180px;width:280px;border-radius:4px}.banner-container{position:relative;background-repeat:no-repeat;background-position:center;background-size:cover}.header-synopsis-gradient{background:inherit}.category-text{margin-left:8px}.fixed-width{max-width:1230px;display:block;margin:0 auto;padding:0!important}@media only screen and (min-width: 600px) and (max-width: 959px){.fixed-width{padding:0 15px!important}}@media only screen and (max-width: 599px){.fixed-width{padding:0 15px!important}}.fluid-width{width:100%}.header-synopsis{box-sizing:border-box}.header-synopsis .apIcon{background-color:#fff;margin-right:16px;padding:4px 8px;border-radius:16px;display:flex;align-items:center;justify-content:flex-start}.header-synopsis .apIcon img{height:15px;object-fit:contain}.header-synopsis .apIcon span{opacity:1;color:#0009;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.header-synopsis .header-title{display:flex}.header-synopsis .header-title .text-truncate-title{max-width:100%;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important}.header-synopsis .rating .mat-icon{width:16px;height:16px;display:inline-table;color:#f69953;font-size:18px}.header-synopsis .rating .rating-number{letter-spacing:0px;color:#f69953}.header-synopsis .rating .rating-count{letter-spacing:.36px;color:#f69953}.header-synopsis .rating .rating mat-icon{color:#f69953}.header-synopsis .header-meta{line-height:1.5}.header-synopsis .resumeButton{height:52px;min-width:160px;display:flex;align-items:center;justify-content:center;background:#34d6a4 0% 0% no-repeat padding-box;box-shadow:0 10px 30px #9993;color:#fff!important}.header-synopsis .resumeButton ::ng-deep .mat-button-wrapper{letter-spacing:0px;color:#fff;text-transform:capitalize}.header-synopsis .header-actions{display:flex}.header-synopsis .header-actions .custom-button{background:#0074b6 0% 0% no-repeat padding-box;border-radius:4px}.header-synopsis .header-actions.top{margin-top:0;margin-bottom:40px}.header-synopsis .header-actions .action-btns{margin-left:auto;order:2}.banner-overview-container{display:flex;justify-content:space-between}.banner-overview-container .overview-description{flex:1;min-width:1px;margin-right:24px;margin-bottom:12px;opacity:1;color:#000000de;font-size:16px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:24px}@media only screen and (max-width: 599px){.banner-overview-container .overview-description{margin-right:0}}.banner-overview-container .overview-intro{width:240px;height:135px;border:1px solid;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover;background-attachment:fixed;position:relative}.banner-overview-container .overview-intro .overview-intro-overlay{cursor:pointer;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;width:48px;height:48px;font-size:48px;background-color:#00000080;border-radius:50%;padding:8px}.banner-overview-container .overview-intro .overview-intro-overlay:active{background-color:#000000b3}@media only screen and (max-width: 599px){.banner-overview-container .overview-intro{display:none}}.analytics-meta{font-weight:500;margin-bottom:12px;line-height:1.2}.hidden-block-xs{display:block}@media only screen and (max-width: 599px){.hidden-block-xs{display:none}}.visible-block-xs{display:none}@media only screen and (max-width: 599px){.visible-block-xs{display:block}}.hidden-block-s{display:block}@media only screen and (min-width: 600px) and (max-width: 959px){.hidden-block-s{display:none}}.visible-block-s{display:none}@media only screen and (min-width: 600px) and (max-width: 959px){.visible-block-s{display:block}}.info-msg{color:#fff!important}.info-msg mat-icon{color:#fff!important}.tags{display:flex;flex:1;flex-direction:row;flex-wrap:wrap;position:relative;z-index:1}.tags .tag{display:inline-block;border-radius:100px 4px 4px 100px;padding:1px 12px;width:auto;justify-content:space-between;margin:0 8px 8px 0;background-color:#0000000a;border:1px solid rgba(0,0,0,.08);box-sizing:border-box}.batch-container{max-width:435px;border-radius:4px;width:40%}.custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px;max-width:auto!important;height:42px!important}.sticky-banner{z-index:999;position:sticky;top:128px}.sticky-banner .header-title h1{font:normal normal 300 24px/35px}.sticky-banner .overview-description{font:normal normal 300 14px/21px}.batch-wrapper{display:flex;justify-content:space-between;gap:25px;width:100%}.batch-timer{width:60%;background-color:#fff;align-items:center}.batch-timer .timer-title{opacity:1;color:#0006;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.25px;text-align:left;line-height:20px}.batch-timer .time-wrapper div p.count{border-radius:4px;background-color:#000000de;opacity:1;color:#fff;font-size:36px;font-weight:600;font-style:normal;letter-spacing:-.2px;text-align:center;line-height:48px;width:67px;height:47px;margin-bottom:4px}.batch-timer .time-wrapper div p.time-label{opacity:1;color:#000000de;font-size:10px;font-weight:400;font-style:normal;letter-spacing:.5px;text-align:center;line-height:12px}.batch-timer .time-wrapper span{padding:8px;font-size:36px}.batch-timer .help{width:100%}.batch-timer .help .batch-duration-wrap{padding:0 24px}.batch-timer .help .batch-duration-wrap .duration-days{opacity:1;color:#000000de;font-family:Montserrat-SemiBold;font-size:36px;font-weight:600;font-style:normal;letter-spacing:-.2px;text-align:left;line-height:48px;padding-bottom:16px}.batch-info{opacity:1;color:#000000de;font-size:14px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:20px;padding:26px}.disable-send-btn[disabled]{background-color:#000!important}@media (max-width: 768px){.batch-wrapper{flex-wrap:wrap}.batch-timer{width:100%;flex-wrap:wrap;justify-content:center}.batch-container{width:100%}}.share-container{position:fixed;height:100vh;background:#131313a3;width:100vw;top:0;left:0;z-index:1000}.share-modal{display:flex;align-items:center;justify-content:center;height:inherit;width:inherit}.karmasahayogi-icon{position:absolute;bottom:-5px;left:calc(50% - 464px)}.triangle-left{transform:translateY(100%);position:absolute;bottom:28%;left:-24px;width:0;height:0;border-top:24px solid transparent;border-right:48px solid #ffffff;border-bottom:24px solid transparent}.contnet{background-color:#fff;width:612px;border-radius:12px;padding:16px}.content-div{position:relative}.copy-link-btn{display:flex;align-items:center;margin-right:20px;color:red;color:#0074b6!important;font-weight:600}.copy-link-btn:hover{background-color:none!important}.send-btn{border-radius:20px}.send-btn .mat-icon{margin-bottom:2.5px}::ng-deep .mat-chip-list-wrapper{height:100px;overflow:auto;display:block!important;scroll-behavior:smooth}.iconText{border-radius:50%;background-color:#000;color:#fff;width:30px;display:inline-block;text-align:center;height:30px;display:flex;align-items:center;justify-content:center}.iconDiv{margin-right:8px}.emailText{opacity:.6}button:disabled{pointer-events:none;opacity:.5;color:#000}::ng-deep .mat-autocomplete-panel{z-index:99999}::ng-deep .cdk-overlay-pane{z-index:9999!important}::ng-deep .close-icon{background-color:#000;color:#fff;border-radius:16px;padding:4px}::ng-deep .mat-chip-input{padding-bottom:8px!important}::ng-deep .theme-igot.day-mode .mat-chip.mat-standard-chip{color:#0074b6!important}::ng-deep .theme-igot.day-mode .mat-chip.mat-standard-chip mat-icon{color:#0074b6!important}::ng-deep .inputTextBox{width:95%!important;overflow-x:hidden}.close-share-dialog{position:absolute;right:30px;top:30px}.left-over-emails{font-weight:600}.loader{position:absolute;top:42%;left:45%;z-index:1000}@media (max-width: 768px){.content-div{width:100%}.contnet{width:unset;margin-bottom:18%}.left-over-emails{display:none}.karmasahayogi-icon{left:8%;bottom:20%}.share-modal{align-items:self-end}}@media only screen and (min-device-width: 820px) and (max-device-width: 1180px){.karmasahayogi-icon{left:calc(50% - 387px)}.content{width:500px}}@media only screen and (min-device-width: 768px) and (max-device-width: 819px){.triangle-left{display:none}}.location-wrapper{padding:16px;border-top:1px solid rgba(0,0,0,.16)}.location-wrapper .location-icon{color:#1b4ca1;height:32px;width:32px;font-size:32px;padding-right:8px}.location-wrapper .loc-details{opacity:1;color:#000000de;font-family:Lato-Bold;font-size:14px;font-weight:700;font-style:Bold;letter-spacing:.25px;text-align:left;line-height:20px}.visibility-show{overflow:visible!important}\n"], dependencies: [{ kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i11.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i11.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i15.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i15.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i15.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i15.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i15.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i15.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i15.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i15.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i15.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i16.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i17.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i17.MatLegacyAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab], a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: i18.MatLegacyError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i18.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i18.MatLegacyHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "component", type: i19.MatLegacyMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i19.MatLegacyMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "component", type: i20.MatLegacyChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i20.MatLegacyChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i20.MatLegacyChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i20.MatLegacyChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i21.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i22.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i23.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i6.DefaultThumbnailDirective, selector: "[wsUtilsDefaultThumbnail]", inputs: ["wsUtilsDefaultThumbnail", "src"] }, { kind: "component", type: i24.MatLegacyAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i24.MatLegacyAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "pipe", type: i11.DatePipe, name: "date" }, { kind: "pipe", type: i6.PipeLimitToPipe, name: "pipeLimitTo" }, { kind: "pipe", type: i6.PipeCountTransformPipe, name: "pipeCountTransform" }, { kind: "pipe", type: i6.PipePartialContentPipe, name: "pipePartialContent" }, { kind: "pipe", type: i6.PipePublicURL, name: "pipePublicURL" }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }] }); }
1400
+ }
1401
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocBannerComponent, decorators: [{
1402
+ type: Component,
1403
+ args: [{ selector: 'ws-app-toc-banner', providers: [AccessControlService, DatePipe], template: "<div class=\"header-synopsis fixed-width margin-top-xl\" [ngClass]=\"{ 'header-synopsis-gradient': bannerUrl }\"\r\n *ngIf=\"show\">\r\n <div class=\"flex flex-row\">\r\n <div class=\"flex-auto\">\r\n <div class=\"header-title flex-col sm:flex-row\">\r\n <!-- image -->\r\n <div *ngIf=\"content?.posterImage\" class=\"float-left\">\r\n <img [src]=\"content?.posterImage | pipePublicURL\" [id]=\"'source_' + content.identifier\" class=\"app-icon\"\r\n [wsUtilsDefaultThumbnail]=\"defaultSLogo\" [alt]=\"content.sourceName || iGOT\" />\r\n </div>\r\n <div *ngIf=\"!content?.posterImage\" class=\"float-left\">\r\n <ng-container *ngIf=\"content?.appIcon; else defaultImg\">\r\n <img [src]=\"content?.appIcon | pipePublicURL\" [id]=\"'source_' + content.identifier\" class=\"app-icon\"\r\n [wsUtilsDefaultThumbnail]=\"defaultSLogo\" [alt]=\"content.sourceName || iGOT\" />\r\n </ng-container>\r\n <ng-template #defaultImg>\r\n <img src=\"/assets/instances/eagle/app_logos/default.png\" [id]=\"'source_' + content.identifier\"\r\n class=\"app-icon\" [alt]=\"content.sourceName || iGOT\" />\r\n </ng-template>\r\n </div>\r\n <div class=\"sm:ml-5 flex flex-auto\" [id]=\"'m-c-'+ content.identifier\">\r\n <div class=\"sm:ml-5 flex flex-col flex-auto\">\r\n <h1 class=\"mat-headline margin-remove-bottom padding-bottom-xs hidden sm:block\"\r\n [title]=\"contentReadData?.name\">\r\n {{ contentReadData?.name }}\r\n <div class=\"float-right cursor-pointer flex\" (click)=\"onClickOfShare()\" *ngIf=\"canShare\">\r\n <mat-icon class=\"ws-mat-accent-text padding-top-xs\">share</mat-icon>\r\n </div>\r\n </h1>\r\n <h1 class=\"mat-headline margin-remove-bottom padding-bottom-xs block sm:hidden\"\r\n [title]=\"contentReadData?.name\">\r\n {{ contentReadData?.name }}\r\n </h1>\r\n <span *ngIf=\"contentProgress === 1\" class=\"margin-left-s\">\r\n <mat-icon class=\"ws-mat-accent-text\">check_circle</mat-icon>\r\n </span>\r\n <div *ngIf=\"content?.primaryCategory\" class=\"apIcon float-left mb-4\">\r\n <img src=\"/assets/icons/content/course.svg\" [id]=\"'source_' + content.identifier\" class=\"source-icon\"\r\n [wsUtilsDefaultThumbnail]=\"defaultSLogo\" [alt]=\"content.sourceName || iGOT\" />\r\n <span>{{ translateLabel(content?.primaryCategory, 'searchfilters') }}</span>\r\n </div>\r\n <div *ngIf=\"content?.appIcon\" class=\"apIcon float-left mb-4\">\r\n <img [src]=\"content?.creatorLogo | pipePublicURL\" [id]=\"'source_' + content.identifier\"\r\n class=\"source-icon\" [wsUtilsDefaultThumbnail]=\"defaultSLogo\" [alt]=\"content.sourceName || iGOT\" />\r\n </div>\r\n <div [ngSwitch]=\"routePath\" class=\"header-meta\" [ngClass]=\"{ 'header-meta-banner': bannerUrl }\">\r\n <!-- Overview Section -->\r\n <div class=\"banner-overview-container\" [hidden]=\"!content?.purpose && showSubtitleOnBanner\"\r\n *ngSwitchCase=\"'overview'\">\r\n <h3 class=\"overview-description mat-body-1\" *ngIf=\"showSubtitleOnBanner\" i18n-title title=\"Subtitle\">\r\n {{ content?.source | pipeLimitTo: 250 }}\r\n </h3>\r\n <p class=\"overview-description mat-body-1\" *ngIf=\"!showSubtitleOnBanner\" i18n-title title=\"Description\">\r\n {{ content?.instructions | pipeLimitTo: 450 }}\r\n </p>\r\n <div *ngIf=\"sanitizedIntroductoryVideoIcon\" class=\"overview-intro ws-mat-primary-lite-background\"\r\n [style.backgroundImage]=\"sanitizedIntroductoryVideoIcon\" role=\"button\" (click)=\"playIntroVideo()\">\r\n <mat-icon role=\"button\" class=\"overview-intro-overlay\">play_arrow</mat-icon>\r\n </div>\r\n </div>\r\n <!-- Toc Section -->\r\n <div *ngSwitchCase=\"'contents'\">\r\n <!-- Contents Banner -->\r\n </div>\r\n <!-- Analytics Section -->\r\n <div class=\"banner-overview-container mat-body-1\" [hidden]=\"!content?.purpose && showSubtitleOnBanner\"\r\n *ngSwitchCase=\"'analytics'\">\r\n <h3 class=\"overview-description mat-body-1\" *ngIf=\"showSubtitleOnBanner\" i18n-title title=\"Subtitle\">\r\n {{ content?.purpose | pipeLimitTo: 250 }}\r\n </h3>\r\n <p class=\"overview-description mat-body-1\" *ngIf=\"!showSubtitleOnBanner\" i18n-title title=\"Description\">\r\n {{ content?.instructions | pipeLimitTo: 450 }}\r\n </p>\r\n <div *ngIf=\"sanitizedIntroductoryVideoIcon\" class=\"overview-intro ws-mat-primary-lite-background\"\r\n [style.backgroundImage]=\"sanitizedIntroductoryVideoIcon\" role=\"button\" (click)=\"playIntroVideo()\">\r\n <mat-icon role=\"button\" class=\"overview-intro-overlay\">play_arrow</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"content?.averageRating\" class=\"flex items-center rating margin-bottom-m\">\r\n <span class=\"rating-number mat-body-2\">{{ content?.averageRating }}&nbsp;</span>\r\n <mat-icon class=\"mat-icon material-icons\" *ngFor=\"let rating of [1, 2, 3, 4, 5]\">\r\n {{ getRatingIcon(rating) }}</mat-icon>\r\n <span class=\"margin-left-xs rating-count mat-body-2\" *ngIf=\"content?.totalRating\">\r\n ( {{ content?.totalRating | pipeCountTransform }} )</span>\r\n </div>\r\n <div *ngIf=\"!content?.averageRating\" class=\"flex items-center rating margin-bottom-m\">\r\n <span class=\"rating-number mat-body-2\"> 0.0 &nbsp;</span>\r\n <mat-icon class=\"mat-icon material-icons\" *ngFor=\"let rating of [1, 2, 3, 4, 5]\">\r\n {{ getRatingIcon(rating) }}</mat-icon>\r\n <span class=\"margin-left-xs rating-count mat-body-2\" *ngIf=\"!content?.totalRating\">\r\n ( {{ 0 | pipeCountTransform }} )</span>\r\n </div>\r\n <!-- tags -->\r\n <div class=\"tags margin-bottom-s\" *ngIf=\"content?.keywords && content?.keywords?.length > 0\">\r\n <span *ngFor=\"let tag of content.keywords\" class=\"tag\">\r\n {{tag}}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\r\n <div class=\"batch-div\">\r\n <div class=\"request-block\">\r\n <ng-container *ngIf=\"content\" [ngTemplateOutlet]=\"batchDropdown\"></ng-container>\r\n <ng-container\r\n *ngIf=\"batchData && !batchData?.enrolled && batchData?.workFlow?.wfInitiated &&\r\n (batchData?.workFlow?.wfItem?.currentStatus !== WFBlendedProgramStatus.REJECTED) && (batchData?.workFlow?.wfItem?.currentStatus !== WFBlendedProgramStatus.REMOVED) &&\r\n (batchData?.workFlow?.wfItem?.currentStatus !== WFBlendedProgramStatus.WITHDRAWN) &&\r\n (batchData?.workFlow?.wfItem?.currentStatus !== WFBlendedProgramStatus.APPROVED) && batchData?.content?.length\">\r\n <p class=\"margin-remove-bottom mat-body-1 padding-m bg-white\">\r\n {{batchData?.workFlow?.batch?.name}} - ({{batchData?.workFlow?.batch?.startDate | date: 'dd-MM-yyyy'}} -\r\n {{batchData?.workFlow?.batch?.endDate | date: 'dd-MM-yyyy' || 'present'}})\r\n </p>\r\n <ng-container>\r\n <button class=\"withdraw-batch\" (click)=\"!disableWithdrawnBtn && requestToWithdrawDialog()\"\r\n [disabled]=\"disableWithdrawnBtn\" [ngClass]=\"{ 'disable-btn': disableWithdrawnBtn }\">\r\n <ng-container> {{ 'apptocbanner.withDrawYourRequest' | translate }} </ng-container>\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"batchData && batchData?.enrolled && batchData?.content?.length\">\r\n <h3 class=\"margin-remove-bottom p-4 bg-white mat-body-1\" *ngFor=\"let batch of batchData.content\">\r\n {{batch?.name}} ({{batch?.startDate | date: 'dd-MM-yyyy' }} - {{batch?.endDate | date: 'dd-MM-yyyy' ||\r\n 'present'}})\r\n </h3>\r\n <ng-container [ngTemplateOutlet]=\"statusMsg\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"batchData && !batchData?.enrolled && !batchData?.content?.length\">\r\n <h3 class=\"margin-remove-bottom mat-body-2 ws-default-text\">\r\n No batches\r\n </h3>\r\n </ng-container>\r\n </div>\r\n <!-- <ng-container *ngIf=\"batchData && batchData?.content?.length && batchData?.content[0]?.batchAttributes?.batchLocationDetails\">\r\n <div class=\"flex items-center location-wrapper\">\r\n <div>\r\n <mat-icon class=\"location-icon\">\r\n location_on</mat-icon>\r\n </div>\r\n <div class=\"loc-details\">\r\n {{batchData?.content[0]?.batchAttributes?.batchLocationDetails}}\r\n </div>\r\n </div>\r\n </ng-container> -->\r\n </div>\r\n <ng-container *ngIf=\"batchData && !batchData?.enrolled && batchData?.content?.length\"\r\n [ngTemplateOutlet]=\"statusMsg\"></ng-container>\r\n</ng-container>\r\n<ng-container *ngIf=\"content?.courseCategory === nsContent.ECourseCategory.MODERATED_PROGRAM\">\r\n <div class=\"request-batch\">\r\n <div class=\"batch-div\">\r\n <ng-container *ngIf=\"content\" [ngTemplateOutlet]=\"batchDropdown\"></ng-container>\r\n </div>\r\n </div>\r\n</ng-container>\r\n<!-- <div class=\"header-synopsis fixed-width margin-top-l\" [ngClass]=\"{ 'header-synopsis-gradient': bannerUrl }\" *ngIf=\"content && batchControl?.value?.batchAttributes?.batchLocationDetails\">\r\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\r\n <h2>{{'apptocbanner.batchLocation' | translate}}</h2>\r\n <p>{{batchControl?.value?.batchAttributes?.batchLocationDetails}}</p>\r\n </ng-container>\r\n</div> -->\r\n\r\n<mat-menu #actionMenu=\"matMenu\">\r\n <div mat-menu-item>\r\n <ng-container *ngIf=\"content\" [ngTemplateOutlet]=\"actions\"></ng-container>\r\n </div>\r\n</mat-menu>\r\n\r\n<ng-template #actions>\r\n <a i18n-aria-label aria-label=\"Take Action\" mat-icon-button *ngIf=\"reviewButton\"\r\n [routerLink]=\"['/author/editor/' + content?.identifier]\">\r\n <mat-icon>publish</mat-icon>\r\n </a>\r\n <ws-widget-btn-content-download id=\"prevfordownload\" [forPreview]=\"forPreview\"\r\n [widgetData]=\"content | pipePartialContent : ['identifier', 'contentType', 'resourceType', 'mimeType', 'downloadUrl', 'isExternal', 'artifactUrl']\">\r\n </ws-widget-btn-content-download>\r\n <ws-widget-btn-content-share id=\"prevforshare\" [forPreview]=\"forPreview\" [widgetData]=\"content\">\r\n </ws-widget-btn-content-share>\r\n <ws-widget-btn-kb [forPreview]=\"forPreview\" id=\"prev\" [contentId]=\"content?.identifier\"\r\n [contentName]=\"contentReadData?.name\" [contentType]=\"content?.contentType\" [status]=\"content?.status\">\r\n </ws-widget-btn-kb>\r\n <ws-widget-btn-goals [forPreview]=\"forPreview\" id=\"goalsforprev\" *ngIf=\"isGoalsEnabled && btnGoalsConfig\"\r\n [widgetData]=\"btnGoalsConfig\">\r\n </ws-widget-btn-goals>\r\n <ws-widget-btn-playlist [forPreview]=\"forPreview\" id=\"playlistforprev\" *ngIf=\"btnPlaylistConfig\"\r\n [widgetData]=\"btnPlaylistConfig\">\r\n </ws-widget-btn-playlist>\r\n <ws-widget-btn-content-feedback-v2 [forPreview]=\"forPreview\" id=\"feedbackforprev\"\r\n [widgetData]=\"content | pipePartialContent: ['identifier', 'name']\">\r\n </ws-widget-btn-content-feedback-v2>\r\n</ng-template>\r\n<ng-template #authView>{{'apptocbanner.view' | translate}}</ng-template>\r\n<ng-template #statusMsg>\r\n <div class=\"status-container mt-2 mb-2\"\r\n *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && batchData?.workFlow?.wfInitiated\">\r\n <div class=\"flex\" *ngIf=\"showMsg\">\r\n <ng-container *ngIf=\"showIcon\">\r\n <mat-icon class=\"mr-4\" [ngClass]=\"iconColor\" *ngIf=\"WFIcon === 'circle'\">check_circle</mat-icon>\r\n <mat-icon class=\"mr-4 ws-mat-red-text visibility-show\" style=\"transform: rotate(180deg);\"\r\n *ngIf=\"WFIcon === 'info'\">info</mat-icon>\r\n </ng-container>\r\n <div class=\"mat-body-1\">{{ getWFMsg }}</div>\r\n </div>\r\n </div>\r\n <div class=\"status-container mt-5\"\r\n *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && showDisableMsg && !showMsg && findMessage.length > 0\">\r\n <div class=\"flex\">\r\n <ng-container>\r\n <mat-icon class=\"mr-3 ws-mat-red-text\" style=\"transform: rotate(180deg);\">info</mat-icon>\r\n </ng-container>\r\n <div class=\"mat-body-1\">\r\n <p class=\"margin-remove-bottom \">{{findMessage}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"share-container\" *ngIf=\"enableShare\">\r\n <div *ngIf=\"showLoader\" class=\"text-center my-2 loader\">\r\n <mat-spinner class=\"inline-block\"></mat-spinner>\r\n </div>\r\n <div class=\"cursor-pointer close-share-dialog\"><mat-icon (click)=\"onClose()\" class=\"close-icon\">close</mat-icon></div>\r\n <div class=\"share-modal\">\r\n <div class=\"karmasahayogi-icon\"><img alt=\"karmasahayogi-icon\" src=\"/assets/icons/KarmaSahayogi.svg\"></div>\r\n <div class=\"content-div\">\r\n <div class=\"triangle-left hidden md:block\"></div>\r\n <div class=\"contnet\">\r\n <section class=\"w-full flex align-center justify-between \">\r\n <div class=\"mb-2\">\r\n <h2 class=\"mat-headline margin-remove-bottom ws-mat-black-text\">{{'contentSharing.header' | translate}}</h2>\r\n </div>\r\n </section>\r\n <form [formGroup]=\"shareForm\">\r\n <div class=\"mat-body-2\">\r\n <div class=\"md-5\">\r\n <mat-form-field appearance=\"outline\" class=\"w-full\">\r\n <mat-chip-list #chipList aria-label=\"user selection\" appearance=\"outline\">\r\n <mat-chip *ngFor=\"let user of users\" [selectable]=\"selectable\" [removable]=\"removable\"\r\n (removed)=\"remove(user)\">\r\n {{user}}\r\n <mat-icon matChipRemove *ngIf=\"removable\">close</mat-icon>\r\n </mat-chip>\r\n <input tabindex=\"-1\" class=\"inputTextBox\"\r\n placeholder=\"{{users.length === 0 ? translateLabels('placehoderText', 'contentSharing') : ''}}\"\r\n #userInput formControlName=\"review\" [formControl]=\"userCtrl\" [matAutocomplete]=\"auto\"\r\n [matChipInputFor]=\"chipList\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"addOnBlur\" (matChipInputTokenEnd)=\"add($event)\">\r\n </mat-chip-list>\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\r\n <mat-option *ngFor=\"let user of filteredUsers\" [value]=\"user.name\">\r\n <div class=\"flex\">\r\n <div class=\"iconDiv\">\r\n <span class=\"iconText\">{{user.iconText.substring(0,2)}}</span>\r\n </div>\r\n <div>\r\n <div>{{user.name}}</div>\r\n <div class=\"emailText\">{{user.maskedEmail}}</div>\r\n </div>\r\n </div>\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-hint align=\"start\" class=\"left-over-emails\">{{'contentSharing.note' | translate}}</mat-hint>\r\n <mat-hint align=\"end\" class=\"left-over-emails\">{{ users.length }} /{{maxEmailsLimit}}\r\n {{'contentSharing.remaingEmails' | translate}}</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"flex mt-5\">\r\n <div class=\"flex flex-1 flex-end\">\r\n <span class=\"copy-link-btn cursor-pointer\" (click)=\"copyToClipboard()\">{{'contentSharing.copyLink' |\r\n translate}} &nbsp;&nbsp;<mat-icon>link</mat-icon></span>\r\n <button mat-stroked-button type=\"submit\"\r\n [ngClass]=\"{'disable-send-btn': users.length === 0 || users.length}\"\r\n class=\"text-white ws-mat-primary-background flex-auto-display send-btn\"\r\n [disabled]=\"userCtrl.value.length || users.length === 0 || users.length > maxEmailsLimit\"\r\n (click)=\"submitSharing()\">\r\n {{'contentSharing.send' | translate}} &nbsp; <mat-icon>send</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #batchDropdown>\r\n <form class=\"flex flex-col gap-4\">\r\n <ng-container *ngIf=\"batchData && !batchData?.enrolled\r\n && (!batchData.workFlow?.wfInitiated || (batchData.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REMOVED))\r\n && batchData?.content?.length\">\r\n <mat-form-field appearance=\"outline\" class=\"w-full batch-form-field\">\r\n <mat-select #batchControlData [formControl]=\"batchControl\" required autoSelctFirstOption\r\n (selectionChange)=\"batchChange($event)\" panelClass=\"batch-dropdown\">\r\n <mat-option *ngFor=\"let batch of batchData.content; let i=index\" [value]=\"batch\" selected=\"index === 0\"\r\n [disabled]=\"!handleEnrollmentEndDate(batch) || disableEnrollBtn \">\r\n <div class=\"flex flex-row items-center gap-2\">\r\n <div class=\"flex-1 text-sm batch-timings\">\r\n {{ batch.name }} ( {{ batch.startDate | date: 'd MMM, yyyy' }} - {{ batch.endDate | date: 'd MMM, yyyy'\r\n || 'present' }} )\r\n </div>\r\n <div class=\"expired\" *ngIf=\"!handleEnrollmentEndDate(batch) || disableEnrollBtn\">\r\n Expired\r\n </div>\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"batchControl.hasError('required')\">Please choose a batch to start course</mat-error>\r\n </mat-form-field>\r\n <div class=\"flex flex-wrap gap-3\">\r\n <ng-container *ngIf=\"!showRejected\">\r\n <div class=\"flex-1\">\r\n <div class=\"flex flex-col gap-1\" *ngIf=\"selectedBatch && selectedBatch.enrollmentEndDate \">\r\n <p class=\"text-xs leading-4 mb-0\">Last enroll date</p>\r\n <p class=\"font-bold mb-0\">{{ selectedBatch.enrollmentEndDate | date: 'd MMM, y' }}</p>\r\n </div>\r\n </div>\r\n <div class=\"flex flex-row justify-center items-center\">\r\n <button class=\"enroll-button\"\r\n [ngClass]=\"{ 'disable-btn': disableEnrollBtn || batchControl.hasError('required') || !handleEnrollmentEndDate(selectedBatch) }\"\r\n [disabled]=\"disableEnrollBtn || batchControl.hasError('required')|| !handleEnrollmentEndDate(selectedBatch)\"\r\n (click)=\"requestToEnrollDialog()\">\r\n <ng-container>\r\n Request to enroll\r\n </ng-container>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"showRejected && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\r\n <h3 class=\"margin-remove-bottom mat-body-2 ws-default-text\">\r\n Your enrollment request is {{batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REMOVED\r\n ?'removed':'rejected'}}.</h3>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </form>\r\n</ng-template>", styles: [".button,.batch-div .enroll-button,.batch-div .withdraw-batch{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}.batch-div{border-radius:8px;background-color:#fdead5;max-width:400px;margin:0 auto}.batch-div .request-block{padding:16px}.batch-div .batch-details{padding:16px;border:1px solid #FF9800;border-radius:8px;background-color:#fff;cursor:pointer}.batch-div .batch-enrolled{font-weight:700;color:#4caf50;font-size:.75rem}.batch-div .withdraw-batch{color:#000000de;border:1px solid rgba(0,0,0,.8705882353);background-color:#fff;width:100%;margin-top:16px}.batch-div .enroll-button{color:#fff;background-color:#ff9800;border:1px solid #FF9800}::ng-deep .batch-dropdown{margin-top:3rem!important}::ng-deep .batch-dropdown .mat-option{height:-moz-fit-content!important;height:fit-content!important;padding:12px 16px!important}::ng-deep .batch-form-field{height:64px}::ng-deep .batch-form-field .mat-form-field-wrapper{margin:0;padding-bottom:0;height:inherit}::ng-deep .batch-form-field .mat-form-field-wrapper .mat-form-field-flex{height:inherit}::ng-deep .batch-form-field .mat-form-field-outline{border-radius:8px;height:inherit}::ng-deep .batch-form-field .mat-form-field-infix{display:flex;align-items:center;font-size:14px;border-top:.35rem solid transparent;padding:8px 0;height:44px}::ng-deep .batch-form-field .mat-form-field-infix .mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:translateY(0)!important}::ng-deep .batch-form-field .mat-form-field-subscript-wrapper{padding:8px 4px!important}::ng-deep .batch-form-field .mat-form-field-subscript-wrapper .mat-error{margin-top:6px}::ng-deep .batch-form-field .mat-select-value-text{white-space:pre-line!important;line-height:21px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.disable-btn{opacity:.5}.mb-0{margin-bottom:0!important}.batch-timings{text-transform:uppercase;line-height:20px}.header-synopsis{padding:32px 64px}@media only screen and (max-width: 599px){.header-synopsis{padding:32px 24px}}.app-icon{height:180px;width:280px;border-radius:4px}.banner-container{position:relative;background-repeat:no-repeat;background-position:center;background-size:cover}.header-synopsis-gradient{background:inherit}.category-text{margin-left:8px}.fixed-width{max-width:1230px;display:block;margin:0 auto;padding:0!important}@media only screen and (min-width: 600px) and (max-width: 959px){.fixed-width{padding:0 15px!important}}@media only screen and (max-width: 599px){.fixed-width{padding:0 15px!important}}.fluid-width{width:100%}.header-synopsis{box-sizing:border-box}.header-synopsis .apIcon{background-color:#fff;margin-right:16px;padding:4px 8px;border-radius:16px;display:flex;align-items:center;justify-content:flex-start}.header-synopsis .apIcon img{height:15px;object-fit:contain}.header-synopsis .apIcon span{opacity:1;color:#0009;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.header-synopsis .header-title{display:flex}.header-synopsis .header-title .text-truncate-title{max-width:100%;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important}.header-synopsis .rating .mat-icon{width:16px;height:16px;display:inline-table;color:#f69953;font-size:18px}.header-synopsis .rating .rating-number{letter-spacing:0px;color:#f69953}.header-synopsis .rating .rating-count{letter-spacing:.36px;color:#f69953}.header-synopsis .rating .rating mat-icon{color:#f69953}.header-synopsis .header-meta{line-height:1.5}.header-synopsis .resumeButton{height:52px;min-width:160px;display:flex;align-items:center;justify-content:center;background:#34d6a4 0% 0% no-repeat padding-box;box-shadow:0 10px 30px #9993;color:#fff!important}.header-synopsis .resumeButton ::ng-deep .mat-button-wrapper{letter-spacing:0px;color:#fff;text-transform:capitalize}.header-synopsis .header-actions{display:flex}.header-synopsis .header-actions .custom-button{background:#0074b6 0% 0% no-repeat padding-box;border-radius:4px}.header-synopsis .header-actions.top{margin-top:0;margin-bottom:40px}.header-synopsis .header-actions .action-btns{margin-left:auto;order:2}.banner-overview-container{display:flex;justify-content:space-between}.banner-overview-container .overview-description{flex:1;min-width:1px;margin-right:24px;margin-bottom:12px;opacity:1;color:#000000de;font-size:16px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:24px}@media only screen and (max-width: 599px){.banner-overview-container .overview-description{margin-right:0}}.banner-overview-container .overview-intro{width:240px;height:135px;border:1px solid;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover;background-attachment:fixed;position:relative}.banner-overview-container .overview-intro .overview-intro-overlay{cursor:pointer;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;width:48px;height:48px;font-size:48px;background-color:#00000080;border-radius:50%;padding:8px}.banner-overview-container .overview-intro .overview-intro-overlay:active{background-color:#000000b3}@media only screen and (max-width: 599px){.banner-overview-container .overview-intro{display:none}}.analytics-meta{font-weight:500;margin-bottom:12px;line-height:1.2}.hidden-block-xs{display:block}@media only screen and (max-width: 599px){.hidden-block-xs{display:none}}.visible-block-xs{display:none}@media only screen and (max-width: 599px){.visible-block-xs{display:block}}.hidden-block-s{display:block}@media only screen and (min-width: 600px) and (max-width: 959px){.hidden-block-s{display:none}}.visible-block-s{display:none}@media only screen and (min-width: 600px) and (max-width: 959px){.visible-block-s{display:block}}.info-msg{color:#fff!important}.info-msg mat-icon{color:#fff!important}.tags{display:flex;flex:1;flex-direction:row;flex-wrap:wrap;position:relative;z-index:1}.tags .tag{display:inline-block;border-radius:100px 4px 4px 100px;padding:1px 12px;width:auto;justify-content:space-between;margin:0 8px 8px 0;background-color:#0000000a;border:1px solid rgba(0,0,0,.08);box-sizing:border-box}.batch-container{max-width:435px;border-radius:4px;width:40%}.custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px;max-width:auto!important;height:42px!important}.sticky-banner{z-index:999;position:sticky;top:128px}.sticky-banner .header-title h1{font:normal normal 300 24px/35px}.sticky-banner .overview-description{font:normal normal 300 14px/21px}.batch-wrapper{display:flex;justify-content:space-between;gap:25px;width:100%}.batch-timer{width:60%;background-color:#fff;align-items:center}.batch-timer .timer-title{opacity:1;color:#0006;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.25px;text-align:left;line-height:20px}.batch-timer .time-wrapper div p.count{border-radius:4px;background-color:#000000de;opacity:1;color:#fff;font-size:36px;font-weight:600;font-style:normal;letter-spacing:-.2px;text-align:center;line-height:48px;width:67px;height:47px;margin-bottom:4px}.batch-timer .time-wrapper div p.time-label{opacity:1;color:#000000de;font-size:10px;font-weight:400;font-style:normal;letter-spacing:.5px;text-align:center;line-height:12px}.batch-timer .time-wrapper span{padding:8px;font-size:36px}.batch-timer .help{width:100%}.batch-timer .help .batch-duration-wrap{padding:0 24px}.batch-timer .help .batch-duration-wrap .duration-days{opacity:1;color:#000000de;font-family:Montserrat-SemiBold;font-size:36px;font-weight:600;font-style:normal;letter-spacing:-.2px;text-align:left;line-height:48px;padding-bottom:16px}.batch-info{opacity:1;color:#000000de;font-size:14px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:20px;padding:26px}.disable-send-btn[disabled]{background-color:#000!important}@media (max-width: 768px){.batch-wrapper{flex-wrap:wrap}.batch-timer{width:100%;flex-wrap:wrap;justify-content:center}.batch-container{width:100%}}.share-container{position:fixed;height:100vh;background:#131313a3;width:100vw;top:0;left:0;z-index:1000}.share-modal{display:flex;align-items:center;justify-content:center;height:inherit;width:inherit}.karmasahayogi-icon{position:absolute;bottom:-5px;left:calc(50% - 464px)}.triangle-left{transform:translateY(100%);position:absolute;bottom:28%;left:-24px;width:0;height:0;border-top:24px solid transparent;border-right:48px solid #ffffff;border-bottom:24px solid transparent}.contnet{background-color:#fff;width:612px;border-radius:12px;padding:16px}.content-div{position:relative}.copy-link-btn{display:flex;align-items:center;margin-right:20px;color:red;color:#0074b6!important;font-weight:600}.copy-link-btn:hover{background-color:none!important}.send-btn{border-radius:20px}.send-btn .mat-icon{margin-bottom:2.5px}::ng-deep .mat-chip-list-wrapper{height:100px;overflow:auto;display:block!important;scroll-behavior:smooth}.iconText{border-radius:50%;background-color:#000;color:#fff;width:30px;display:inline-block;text-align:center;height:30px;display:flex;align-items:center;justify-content:center}.iconDiv{margin-right:8px}.emailText{opacity:.6}button:disabled{pointer-events:none;opacity:.5;color:#000}::ng-deep .mat-autocomplete-panel{z-index:99999}::ng-deep .cdk-overlay-pane{z-index:9999!important}::ng-deep .close-icon{background-color:#000;color:#fff;border-radius:16px;padding:4px}::ng-deep .mat-chip-input{padding-bottom:8px!important}::ng-deep .theme-igot.day-mode .mat-chip.mat-standard-chip{color:#0074b6!important}::ng-deep .theme-igot.day-mode .mat-chip.mat-standard-chip mat-icon{color:#0074b6!important}::ng-deep .inputTextBox{width:95%!important;overflow-x:hidden}.close-share-dialog{position:absolute;right:30px;top:30px}.left-over-emails{font-weight:600}.loader{position:absolute;top:42%;left:45%;z-index:1000}@media (max-width: 768px){.content-div{width:100%}.contnet{width:unset;margin-bottom:18%}.left-over-emails{display:none}.karmasahayogi-icon{left:8%;bottom:20%}.share-modal{align-items:self-end}}@media only screen and (min-device-width: 820px) and (max-device-width: 1180px){.karmasahayogi-icon{left:calc(50% - 387px)}.content{width:500px}}@media only screen and (min-device-width: 768px) and (max-device-width: 819px){.triangle-left{display:none}}.location-wrapper{padding:16px;border-top:1px solid rgba(0,0,0,.16)}.location-wrapper .location-icon{color:#1b4ca1;height:32px;width:32px;font-size:32px;padding-right:8px}.location-wrapper .loc-details{opacity:1;color:#000000de;font-family:Lato-Bold;font-size:14px;font-weight:700;font-style:Bold;letter-spacing:.25px;text-align:left;line-height:20px}.visibility-show{overflow:visible!important}\n"] }]
1404
+ }], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i3.MatLegacyDialog }, { type: i4.AppTocService }, { type: i5.WidgetContentService }, { type: i6.UtilityService }, { type: i7.MobileAppsService }, { type: i8.MatLegacySnackBar }, { type: i6.ConfigurationsService }, { type: i9.TitleTagService }, { type: i10.ActionService }, { type: i6.LoggerService }, { type: i11.DatePipe }, { type: i12.TranslateService }, { type: i13.UserAutocompleteService }, { type: i6.EventService }, { type: i6.MultilingualTranslationsService }, { type: i14.TimerService }, { type: undefined, decorators: [{
1405
+ type: Inject,
1406
+ args: ['environment']
1407
+ }] }]; }, propDecorators: { banners: [{
1408
+ type: Input
1409
+ }], content: [{
1410
+ type: Input
1411
+ }], resumeData: [{
1412
+ type: Input
1413
+ }], analytics: [{
1414
+ type: Input
1415
+ }], forPreview: [{
1416
+ type: Input
1417
+ }], batchData: [{
1418
+ type: Input
1419
+ }], userEnrollmentList: [{
1420
+ type: Input
1421
+ }], withdrawOrEnroll: [{
1422
+ type: Output
1423
+ }], contentReadData: [{
1424
+ type: Input
1425
+ }], clickToShare: [{
1426
+ type: Input
1427
+ }], programEnrollCall: [{
1428
+ type: Output
1429
+ }], userInput: [{
1430
+ type: ViewChild,
1431
+ args: ['userInput']
1432
+ }], matAutocomplete: [{
1433
+ type: ViewChild,
1434
+ args: ['auto']
1435
+ }] } });
1436
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1iYW5uZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL2NvbXBvbmVudHMvYXBwLXRvYy1iYW5uZXIvYXBwLXRvYy1iYW5uZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL2NvbXBvbmVudHMvYXBwLXRvYy1iYW5uZXIvYXBwLXRvYy1iYW5uZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBMEMsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFHNUosT0FBTyxFQUF5QixhQUFhLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0NBQXNDLENBQUE7QUFFaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUE7QUFDeEUsT0FBTyxFQUFzRSxRQUFRLEVBQWlELE1BQU0sc0JBQXNCLENBQUE7QUFDbEssT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sbUVBQW1FLENBQUE7QUFDMUcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUE7QUFRNUUsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sb0VBQW9FLENBQUE7QUFFcEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ2pGLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLEtBQU0sTUFBTSxNQUFNLFFBQVEsQ0FBQTtBQUdqQywyQkFBMkI7QUFDM0IsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFB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QUs7Z0JBQ0ksaUJBQWlCO3NCQUExQixNQUFNO2dCQStIaUIsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNILGVBQWU7c0JBQWpDLFNBQVM7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG4vLyBpbXBvcnQgeyBNYXRBdXRvY29tcGxldGUsIE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQsIE1hdENoaXBJbnB1dEV2ZW50LCBNYXREaWFsb2csIE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnXHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVN0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlcidcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIEV2ZW50LCBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInXHJcbmltcG9ydCB7IE5zQ29udGVudCB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5tb2RlbCdcclxuaW1wb3J0IHsgV2lkZ2V0Q29udGVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9fc2VydmljZXMvd2lkZ2V0LWNvbnRlbnQuc2VydmljZSdcclxuaW1wb3J0IHsgdmlld2VyUm91dGVHZW5lcmF0b3IgfSBmcm9tICcuLi8uLi9fc2VydmljZXMvdmlld2VyLXJvdXRlLXV0aWwnXHJcbmltcG9ydCB7IFRGZXRjaFN0YXR1cywgVXRpbGl0eVNlcnZpY2UsIENvbmZpZ3VyYXRpb25zU2VydmljZSwgTG9nZ2VyU2VydmljZSwgV3NFdmVudHMsIEV2ZW50U2VydmljZSwgTXVsdGlsaW5ndWFsVHJhbnNsYXRpb25zU2VydmljZSB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xyXG5pbXBvcnQgeyBDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vX2NvbGxlY3Rpb24vX2NvbW1vbi9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy5jb21wb25lbnQnXHJcbmltcG9ydCB7IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWNjZXNzLWNvbnRyb2wuc2VydmljZSdcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcydcclxuaW1wb3J0IHsgTnNBbmFseXRpY3MgfSBmcm9tICcuLi8uLi9tb2RlbHMvYXBwLXRvYy1hbmFseXRpY3MubW9kZWwnXHJcbmltcG9ydCB7IE5zQXBwVG9jIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FwcC10b2MubW9kZWwnXHJcbmltcG9ydCB7IE5zUGxheWxpc3QgfSBmcm9tICcuLi8uLi9tb2RlbHMvcGxheWxpc3QubW9kZWwnXHJcbmltcG9ydCB7IE5zR29hbCB9IGZyb20gJy4uLy4uL21vZGVscy9nb2FsLm1vZGVsJ1xyXG5pbXBvcnQgeyBBcHBUb2NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXBwLXRvYy5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBVc2VyQXV0b2NvbXBsZXRlU2VydmljZSB9IGZyb20gJy4uLy4uL19jb2xsZWN0aW9uL19jb21tb24vdXNlci1hdXRvY29tcGxldGUvdXNlci1hdXRvY29tcGxldGUuc2VydmljZSdcclxuaW1wb3J0IHsgQXBwVG9jRGlhbG9nSW50cm9WaWRlb0NvbXBvbmVudCB9IGZyb20gJy4uL2FwcC10b2MtZGlhbG9nLWludHJvLXZpZGVvL2FwcC10b2MtZGlhbG9nLWludHJvLXZpZGVvLmNvbXBvbmVudCdcclxuaW1wb3J0IHsgTW9iaWxlQXBwc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2JpbGUtYXBwcy5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3JtcydcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xyXG5pbXBvcnQgKiBhcyAgbG9kYXNoIGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IHsgVGl0bGVUYWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGl0bGUtdGFnLnNlcnZpY2UnXHJcbmltcG9ydCB7IEFjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hY3Rpb24uc2VydmljZSdcclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXHJcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nXHJcbmltcG9ydCBpc1NhbWVPckJlZm9yZSBmcm9tICdkYXlqcy9wbHVnaW4vaXNTYW1lT3JCZWZvcmUnXHJcbmltcG9ydCBpc1NhbWVPckFmdGVyIGZyb20gJ2RheWpzL3BsdWdpbi9pc1NhbWVPckFmdGVyJ1xyXG5pbXBvcnQgeyBFbnJvbGxRdWVzdGlvbm5haXJlQ29tcG9uZW50IH0gZnJvbSAnLi4vZW5yb2xsLXF1ZXN0aW9ubmFpcmUvZW5yb2xsLXF1ZXN0aW9ubmFpcmUuY29tcG9uZW50J1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSdcclxuaW1wb3J0IHsgRU5URVIgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnXHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcclxuaW1wb3J0IHsgVGltZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGltZXIuc2VydmljZSdcclxuaW1wb3J0IHsgTWF0TGVnYWN5QXV0b2NvbXBsZXRlIGFzIE1hdEF1dG9jb21wbGV0ZSwgTWF0TGVnYWN5QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCBhcyBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWF1dG9jb21wbGV0ZSdcclxuaW1wb3J0IHsgTWF0TGVnYWN5Q2hpcElucHV0RXZlbnQgYXMgTWF0Q2hpcElucHV0RXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktY2hpcHMnXHJcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJ1xyXG5pbXBvcnQgeyBNYXRMZWdhY3lTbmFja0JhciBhcyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1zbmFjay1iYXInXHJcbmltcG9ydCB7IEVucm9sbFByb2ZpbGVGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZW5yb2xsLXByb2ZpbGUtZm9ybS9lbnJvbGwtcHJvZmlsZS1mb3JtLmNvbXBvbmVudCdcclxuXHJcbmRheWpzLmV4dGVuZChpc1NhbWVPckJlZm9yZSlcclxuZGF5anMuZXh0ZW5kKGlzU2FtZU9yQWZ0ZXIpXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3dzLWFwcC10b2MtYmFubmVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXRvYy1iYW5uZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2FwcC10b2MtYmFubmVyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbQWNjZXNzQ29udHJvbFNlcnZpY2UsIERhdGVQaXBlXSxcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBBcHBUb2NCYW5uZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICBzaG93ID0gZmFsc2VcclxuICBASW5wdXQoKSBiYW5uZXJzOiBOc0FwcFRvYy5JVG9jQmFubmVyIHwgbnVsbCA9IG51bGxcclxuICBASW5wdXQoKSBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxyXG4gIEBJbnB1dCgpIHJlc3VtZURhdGE6IE5zQ29udGVudC5JQ29udGludWVMZWFybmluZ0RhdGEgfCBudWxsID0gbnVsbFxyXG4gIEBJbnB1dCgpIGFuYWx5dGljczogTnNBbmFseXRpY3MuSUFuYWx5dGljcyB8IG51bGwgPSBudWxsXHJcbiAgQElucHV0KCkgZm9yUHJldmlldyA9IGZhbHNlXHJcbiAgQElucHV0KCkgYmF0Y2hEYXRhOiAvKipOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlICovIGFueSB8IG51bGwgPSBudWxsXHJcbiAgQElucHV0KCkgdXNlckVucm9sbG1lbnRMaXN0OiBOc0NvbnRlbnQuSUNvdXJzZVtdIHwgbnVsbCA9IG51bGxcclxuICBAT3V0cHV0KCkgd2l0aGRyYXdPckVucm9sbCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpXHJcbiAgQElucHV0KCkgY29udGVudFJlYWREYXRhOiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxyXG4gIEBJbnB1dCgpIGNsaWNrVG9TaGFyZSA9IGZhbHNlXHJcbiAgQE91dHB1dCgpIHByb2dyYW1FbnJvbGxDYWxsID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KClcclxuICB0aW1lcjogYW55XHJcbiAgbnNDb250ZW50ID0gTnNDb250ZW50XHJcbiAgYmF0Y2hDb250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZClcclxuICBwcmltYXJ5Q2F0ZWdvcnkgPSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeVxyXG4gIFdGQmxlbmRlZFByb2dyYW1TdGF0dXMgPSBOc0NvbnRlbnQuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1c1xyXG4gIFdGU1RBVFVTX01TR19NQVBQSU5HID0gTnNDb250ZW50LldGU1RBVFVTX01TR19NQVBQSU5HXHJcbiAgY29udGVudFByb2dyZXNzID0gMFxyXG4gIGJhbm5lclVybDogU2FmZVN0eWxlIHwgbnVsbCA9IG51bGxcclxuICByb3V0ZVBhdGggPSAnb3ZlcnZpZXcnXHJcbiAgdmFsaWRQYXRocyA9IG5ldyBTZXQoWydvdmVydmlldycsICdjb250ZW50cycsICdhbmFseXRpY3MnXSlcclxuICByb3V0ZXJQYXJhbVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcclxuICByb3V0ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcclxuICBiYXRjaFdGRGF0YVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcclxuICBmaXJzdFJlc291cmNlTGluazogeyB1cmw6IHN0cmluZzsgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfSB8IG51bGwgPSBudWxsXHJcbiAgcmVzdW1lRGF0YUxpbms6IHsgdXJsOiBzdHJpbmc7IHF1ZXJ5UGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IH0gfCBudWxsID0gbnVsbFxyXG4gIGlzQXNzZXNzVmlzaWJsZSA9IGZhbHNlXHJcbiAgaXNQcmFjdGljZVZpc2libGUgPSBmYWxzZVxyXG4gIGVkaXRCdXR0b24gPSBmYWxzZVxyXG4gIHJldmlld0J1dHRvbiA9IGZhbHNlXHJcbiAgYW5hbHl0aWNzRGF0YUNsaWVudDogYW55ID0gbnVsbFxyXG4gIGJ0blBsYXlsaXN0Q29uZmlnOiBOc1BsYXlsaXN0LklCdG5QbGF5bGlzdCB8IG51bGwgPSBudWxsXHJcbiAgYnRuR29hbHNDb25maWc6IE5zR29hbC5JQnRuR29hbCB8IG51bGwgPSBudWxsXHJcbiAgaXNSZWdpc3RyYXRpb25TdXBwb3J0ZWQgPSBmYWxzZVxyXG4gIHNob3dSZWplY3RlZCA9IGZhbHNlXHJcbiAgY2hlY2tSZWdpc3RyYXRpb25Tb3VyY2VzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xyXG4gICAgJ1NraWxsU29mdCBEaWdpdGFsaXphdGlvbicsXHJcbiAgICAnU2tpbGxTb2Z0IExlYWRlcnNoaXAnLFxyXG4gICAgJ1BsdXJhbHNpZ2h0JyxcclxuICBdKVxyXG4gIGlzVXNlclJlZ2lzdGVyZWQgPSBmYWxzZVxyXG4gIGFjdGlvbkJ0blN0YXR1cyA9ICd3YWl0J1xyXG4gIHNob3dJbnRyYW5ldE1lc3NhZ2UgPSBmYWxzZVxyXG4gIHNob3dUYWtlQXNzZXNzbWVudDogTnNBcHBUb2MuSVBvc3RBc3Nlc3NtZW50IHwgbnVsbCA9IG51bGxcclxuICBleHRlcm5hbENvbnRlbnRGZXRjaFN0YXR1czogVEZldGNoU3RhdHVzID0gJ2RvbmUnXHJcbiAgcmVnaXN0ZXJGb3JFeHRlcm5hbCA9IGZhbHNlXHJcbiAgaXNHb2Fsc0VuYWJsZWQgPSBmYWxzZVxyXG4gIGNvbnRleHRJZD86IHN0cmluZ1xyXG4gIGNvbnRleHRQYXRoPzogc3RyaW5nXHJcbiAgdG9jQ29uZmlnOiBhbnkgPSBudWxsXHJcbiAgZGVmYXVsdFNMb2dvID0gJydcclxuICBkaXNhYmxlRW5yb2xsQnRuID0gZmFsc2VcclxuICBzZWxlY3RlZEJhdGNoITogYW55XHJcbiAgaGVscEVtYWlsID0gJydcclxuICBzZWxlY3RlZEJhdGNoU3Vic2NyaXB0aW9uOiBhbnlcclxuICBzZWxlY3RlZEJhdGNoRGF0YTogYW55XHJcbiAgYmF0Y2hDb250cm9sVW5zdWJzY3JpYmU6IGFueVxyXG4gIGRhdGU6IGFueVxyXG4gIG5vdzogYW55XHJcbiAgdGFyZ2V0RGF0ZTogYW55XHJcbiAgdGFyZ2V0VGltZTogYW55XHJcbiAgZGlmZmVyZW5jZSA9IDBcclxuICBkYXlzOiBhbnlcclxuICBob3VyczogYW55XHJcbiAgbWludXRlczogYW55XHJcbiAgc2Vjb25kczogYW55XHJcbiAgc2VydmVyRGF0ZVN1YnNjcmlwdGlvbjogYW55XHJcbiAgc2VydmVyRGF0ZTogYW55ID0gbmV3IERhdGUoKVxyXG4gIGNhblNoYXJlID0gZmFsc2VcclxuICBlbmFibGVTaGFyZSA9IGZhbHNlXHJcbiAgcm9vdE9yZ0lkOiBhbnlcclxuICB0aW1lckludGVydmFsQ2xlYXI6IGFueVxyXG5cclxuICAvLyBzaGFyZSBjb250ZW50XHJcbiAgc2hhcmVGb3JtOiBVbnR5cGVkRm9ybUdyb3VwIHwgdW5kZWZpbmVkXHJcbiAgc2VsZWN0YWJsZSA9IHRydWVcclxuICByZW1vdmFibGUgPSB0cnVlXHJcbiAgYWRkT25CbHVyID0gdHJ1ZVxyXG4gIHNlcGFyYXRvcktleXNDb2RlczogbnVtYmVyW10gPSBbRU5URVJdXHJcbiAgdXNlckN0cmwgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCcnKVxyXG4gIGZpbHRlcmVkVXNlcnM6IGFueVtdIHwgdW5kZWZpbmVkXHJcbiAgdXNlcnM6IGFueVtdID0gW11cclxuICBhbGxVc2VyczogYW55W10gPSBbXVxyXG4gIGFwaVJlc3BvbnNlOiBhbnlcclxuICBjb3Vyc2VEZXRhaWxzOiBhbnlcclxuICB1c2VyUHJvZmlsZTogYW55XHJcbiAgdXNlclByb2ZpbGVPYmplY3Q6IGFueVxyXG4gIGRvcHRFbGlnaWJsZVNlcnZpY2VzTGlzdDogc3RyaW5nW10gPSBbXVxyXG4gIG1heEVtYWlsc0xpbWl0ID0gMzBcclxuICBzaG93TG9hZGVyID0gZmFsc2VcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSB0b2NTdmM6IEFwcFRvY1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbnRlbnRTdmM6IFdpZGdldENvbnRlbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1dGlsaXR5U3ZjOiBVdGlsaXR5U2VydmljZSxcclxuICAgIHByaXZhdGUgbW9iaWxlQXBwc1N2YzogTW9iaWxlQXBwc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhcixcclxuICAgIHB1YmxpYyBjb25maWdTdmM6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcclxuICAgIHByaXZhdGUgdGFnU3ZjOiBUaXRsZVRhZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFjdGlvblNWQzogQWN0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgdXNlckF1dG9Db21wbGV0ZTogVXNlckF1dG9jb21wbGV0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGV2ZW50czogRXZlbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsYW5ndHJhbnNsYXRpb25zOiBNdWx0aWxpbmd1YWxUcmFuc2xhdGlvbnNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0aW1lclNlcnZpY2U6IFRpbWVyU2VydmljZSxcclxuICAgIEBJbmplY3QoJ2Vudmlyb25tZW50JykgcHJpdmF0ZSBlbnZpcm9ubWVudDogYW55LFxyXG4gICkge1xyXG4gICAgdGhpcy5sYW5ndHJhbnNsYXRpb25zLmxhbmd1YWdlU2VsZWN0ZWRPYnNlcnZhYmxlLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2Vic2l0ZUxhbmd1YWdlJykpIHtcclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZS5zZXREZWZhdWx0TGFuZygnZW4nKVxyXG4gICAgICAgIGNvbnN0IGxhbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2Vic2l0ZUxhbmd1YWdlJykhXHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGUudXNlKGxhbmcpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5oZWxwRW1haWwgPSB0aGlzLmVudmlyb25tZW50LmhlbHBFbWFpbFxyXG4gICAgdGhpcy5zaGFyZUZvcm0gPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7XHJcbiAgICAgIHJldmlldzogbmV3IFVudHlwZWRGb3JtQ29udHJvbChudWxsLCBbVmFsaWRhdG9ycy5taW5MZW5ndGgoMSksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDIwMDApXSksXHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMudXNlckN0cmwudmFsdWVDaGFuZ2VzLnBpcGUoXHJcbiAgICAgIGRlYm91bmNlVGltZSgyMDApLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXHJcbiAgICApLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRVc2VycyA9IFtdXHJcbiAgICAgICAgLy8gdGhpcy5hbGxVc2VycyA9IFtdXHJcbiAgICAgICAgdGhpcy5nZXRVc2Vyc1RvU2hhcmUocmVzKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgQFZpZXdDaGlsZCgndXNlcklucHV0JykgdXNlcklucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+IHwgdW5kZWZpbmVkXHJcbiAgQFZpZXdDaGlsZCgnYXV0bycpIG1hdEF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlIHwgdW5kZWZpbmVkXHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy8gdGhpcy5zZXJ2ZXJEYXRlID0gbmV3IERhdGUoKS5nZXRUaW1lKClcclxuICAgIHRoaXMuc2VydmVyRGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLnNlcnZlckRhdGUuc3Vic2NyaWJlKHNlcnZlckRhdGUgPT4ge1xyXG4gICAgICB0aGlzLnNlcnZlckRhdGUgPSBzZXJ2ZXJEYXRlXHJcbiAgICAgIHRoaXMuY2xlYXJBbmRDYWxsVGltZXIoKVxyXG4gICAgfSlcclxuICAgIHRoaXMucm91dGUuZGF0YS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMudG9jQ29uZmlnID0gZGF0YS5wYWdlRGF0YS5kYXRhXHJcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5pc1Bvc3RBc3Nlc3NtZW50KSB7XHJcbiAgICAgICAgdGhpcy50b2NTdmMuZmV0Y2hQb3N0QXNzZXNzbWVudFN0YXR1cyh0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgICBjb25zdCBhc3Nlc3NtZW50RGF0YSA9IHJlcy5yZXN1bHRcclxuICAgICAgICAgIGZvciAoY29uc3QgbyBvZiBhc3Nlc3NtZW50RGF0YSkge1xyXG4gICAgICAgICAgICBpZiAoby5jb250ZW50SWQgPT09ICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zaG93VGFrZUFzc2Vzc21lbnQgPSBvXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpIHtcclxuICAgICAgICAvLyB0aGlzLnRvY1N2Yy5mZXRjaEdldENvbnRlbnREYXRhKHRoaXMuY29udGVudC5pZGVudGlmaWVyKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAvLyAgIHRoaXMuY29udGVudFJlYWREYXRhID0gcmVzLnJlc3VsdC5jb250ZW50XHJcbiAgICAgICAgLy8gfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBjb25zdCBpbnN0YW5jZUNvbmZpZyA9IHRoaXMuY29uZmlnU3ZjLmluc3RhbmNlQ29uZmlnXHJcbiAgICBpZiAoaW5zdGFuY2VDb25maWcgJiYgaW5zdGFuY2VDb25maWcubG9nb3MgJiYgaW5zdGFuY2VDb25maWcubG9nb3MuZGVmYXVsdFNvdXJjZUxvZ28pIHtcclxuICAgICAgdGhpcy5kZWZhdWx0U0xvZ28gPSBpbnN0YW5jZUNvbmZpZy5sb2dvcy5kZWZhdWx0U291cmNlTG9nb1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcykge1xyXG4gICAgICB0aGlzLmlzR29hbHNFbmFibGVkID0gIXRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcy5oYXMoJ2dvYWxzJylcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZS5xdWVyeVBhcmFtTWFwLnN1YnNjcmliZShxUGFyYW1zTWFwID0+IHtcclxuICAgICAgY29uc3QgY29udGV4dElkID0gcVBhcmFtc01hcC5nZXQoJ2NvbnRleHRJZCcpXHJcbiAgICAgIGNvbnN0IGNvbnRleHRQYXRoID0gcVBhcmFtc01hcC5nZXQoJ2NvbnRleHRQYXRoJylcclxuICAgICAgaWYgKGNvbnRleHRJZCAmJiBjb250ZXh0UGF0aCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dElkID0gY29udGV4dElkXHJcbiAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5iYXRjaFdGRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLnNldFdGRGF0YVN1YmplY3Quc3Vic2NyaWJlKFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRCYXRjaENvbnRyb2woKVxyXG4gICAgICB9LFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIG9uIGJhdGNoV0ZEYXRhU3Vic2NyaXB0aW9uJylcclxuICAgICAgfSxcclxuICAgIClcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzKSB7XHJcbiAgICAgIHRoaXMuaXNSZWdpc3RyYXRpb25TdXBwb3J0ZWQgPSB0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMuaGFzKCdyZWdpc3RyYXRpb25FeHRlcm5hbCcpXHJcbiAgICAgIHRoaXMuc2hvd0ludHJhbmV0TWVzc2FnZSA9ICF0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMuaGFzKFxyXG4gICAgICAgICdzaG93SW50cmFuZXRNZXNzYWdlRGVza3RvcCcsXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb24gPSB0aGlzLnRvY1N2Yy5nZXRTZWxlY3RlZEJhdGNoLnN1YnNjcmliZShiYXRjaERhdGEgPT4ge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhID0gYmF0Y2hEYXRhXHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuY2hlY2tSZWdpc3RyYXRpb25TdGF0dXMoKVxyXG4gICAgdGhpcy5yb3V0ZXJQYXJhbVN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKHJvdXRlckV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICBpZiAocm91dGVyRXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XHJcbiAgICAgICAgdGhpcy5hc3NpZ25QYXRoQW5kVXBkYXRlQmFubmVyKHJvdXRlckV2ZW50LnVybClcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzKSB7XHJcbiAgICAgIHRoaXMuaXNHb2Fsc0VuYWJsZWQgPSAhdGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzLmhhcygnZ29hbHMnKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgdGhpcy5idG5QbGF5bGlzdENvbmZpZyA9IHtcclxuICAgICAgICBjb250ZW50SWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxyXG4gICAgICAgIGNvbnRlbnROYW1lOiB0aGlzLmNvbnRlbnQubmFtZSxcclxuICAgICAgICBjb250ZW50VHlwZTogdGhpcy5jb250ZW50LmNvbnRlbnRUeXBlLFxyXG4gICAgICAgIHByaW1hcnlDYXRlZ29yeTogdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSxcclxuICAgICAgICBtb2RlOiAnZGlhbG9nJyxcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmJ0bkdvYWxzQ29uZmlnID0ge1xyXG4gICAgICAgIGNvbnRlbnRJZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXHJcbiAgICAgICAgY29udGVudE5hbWU6IHRoaXMuY29udGVudC5uYW1lLFxyXG4gICAgICAgIGNvbnRlbnRUeXBlOiB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUsXHJcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5OiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LFxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiAhW1xyXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9DT1VSU0UsXHJcbiAgICAgIE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX0FTU0VTU0VNRU5ULFxyXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9QUk9HUkFNLFxyXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LklOVklURV9PTkxZX1BST0dSQU0sXHJcbiAgICBdLmluY2x1ZGVzKHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeSkpIHtcclxuICAgICAgdGhpcy5jYW5TaGFyZSA9IHRydWVcclxuICAgICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XHJcbiAgICAgICAgdGhpcy5yb290T3JnSWQgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS5yb290T3JnSWRcclxuICAgICAgICB0aGlzLnVzZXJQcm9maWxlID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGVcclxuICAgICAgICB0aGlzLnVzZXJQcm9maWxlT2JqZWN0ID0gdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyXHJcbiAgICAgICAgLy8gdGhpcy5nZXRVc2Vyc1RvU2hhcmUoJycpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFVzZXJzVG9TaGFyZShxdWVyeVN0cjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNob3dMb2FkZXIgPSB0cnVlXHJcbiAgICB0aGlzLnVzZXJBdXRvQ29tcGxldGUuc2VhcmNoVXNlcihxdWVyeVN0ciwgdGhpcy5yb290T3JnSWQpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgaWYgKGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0LnJlc3BvbnNlKSB7XHJcbiAgICAgICAgdGhpcy5hcGlSZXNwb25zZSA9IGRhdGEucmVzdWx0LnJlc3BvbnNlLmNvbnRlbnRcclxuICAgICAgICBsZXQgbmFtZSA9ICcnXHJcbiAgICAgICAgbGV0IHBFbWFpbCA9ICcnXHJcbiAgICAgICAgdGhpcy5hcGlSZXNwb25zZS5mb3JFYWNoKChhcGlEYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgIGFwaURhdGEuZmlyc3ROYW1lLnNwbGl0KCcgJykuZm9yRWFjaCgoZDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgZC5zdWJzdHIoMCwgMSkudG9VcHBlckNhc2UoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGlmIChhcGlEYXRhLnByb2ZpbGVEZXRhaWxzICYmIGFwaURhdGEucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzKSB7XHJcbiAgICAgICAgICAgIHBFbWFpbCA9IGFwaURhdGEucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLnByaW1hcnlFbWFpbFxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuYWxsVXNlcnMuZmlsdGVyKHVzZXIgPT4gdXNlci5lbWFpbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHBFbWFpbC50b0xvd2VyQ2FzZSgpKSkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hbGxVc2Vycy5wdXNoKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBtYXNrZWRFbWFpbDogYXBpRGF0YS5tYXNrZWRFbWFpbCxcclxuICAgICAgICAgICAgICAgICAgaWQ6IGFwaURhdGEuaWRlbnRpZmllcixcclxuICAgICAgICAgICAgICAgICAgbmFtZTogYXBpRGF0YS5maXJzdE5hbWUsXHJcbiAgICAgICAgICAgICAgICAgIGljb25UZXh0OiBuYW1lLFxyXG4gICAgICAgICAgICAgICAgICBlbWFpbDogcEVtYWlsLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2VcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5hbGxVc2Vycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkVXNlcnMgPSBbXVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRVc2VycyA9IHRoaXMuZmlsdGVyU2hhcmVkVXNlcnMocXVlcnlTdHIpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNob3dJbnRyYW5ldE1zZygpIHtcclxuICAgIGlmICh0aGlzLmlzTW9iaWxlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5zaG93SW50cmFuZXRNZXNzYWdlXHJcbiAgfVxyXG5cclxuICBnZXQgZ2V0QmF0Y2hEdXJhdGlvbigpIHtcclxuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGRheWpzKGRheWpzKHRoaXMuYmF0Y2hDb250cm9sLnZhbHVlLnN0YXJ0RGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJykpXHJcbiAgICBjb25zdCBlbmREYXRlID0gZGF5anMoZGF5anModGhpcy5iYXRjaENvbnRyb2wudmFsdWUuZW5kRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJykpXHJcbiAgICAvLyBhZGRpbmcgMSB0byBpbmNsdWRlIHRoZSBzdGFydCBkYXRlXHJcbiAgICByZXR1cm4gKGVuZERhdGUuZGlmZihzdGFydERhdGUsICdkYXlzJykgKyAxKVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNob3dTdGFydCgpIHtcclxuICAgIHJldHVybiB0aGlzLnRvY1N2Yy5zaG93U3RhcnRCdXR0b24odGhpcy5jb250ZW50KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGlzUG9zdEFzc2Vzc21lbnQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoISh0aGlzLnRvY0NvbmZpZyAmJiB0aGlzLnRvY0NvbmZpZy5wb3N0QXNzZXNzbWVudCkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFICYmXHJcbiAgICAgICAgdGhpcy5jb250ZW50LmxlYXJuaW5nTW9kZSA9PT0gJ0luc3RydWN0b3ItTGVkJ1xyXG4gICAgICApXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIGdldCBpc01vYmlsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnV0aWxpdHlTdmMuaXNNb2JpbGVcclxuICB9XHJcblxyXG4gIGdldCBzaG93U3VidGl0bGVPbkJhbm5lcigpIHtcclxuICAgIHJldHVybiB0aGlzLnRvY1N2Yy5zdWJ0aXRsZU9uQmFubmVyc1xyXG4gIH1cclxuXHJcbiAgZ2V0RG9wdEVsaWdpYmxlU2VydmljZXNMaXN0KCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRCYXRjaCAmJiB0aGlzLnNlbGVjdGVkQmF0Y2guYmF0Y2hBdHRyaWJ1dGVzIFxyXG4gICAgICAmJiB0aGlzLnNlbGVjdGVkQmF0Y2guYmF0Y2hBdHRyaWJ1dGVzLmNhZHJlTGlzdFxyXG4gICAgICAmJiB0aGlzLnNlbGVjdGVkQmF0Y2guYmF0Y2hBdHRyaWJ1dGVzLmNhZHJlTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5kb3B0RWxpZ2libGVTZXJ2aWNlc0xpc3QgPSB0aGlzLnNlbGVjdGVkQmF0Y2guYmF0Y2hBdHRyaWJ1dGVzLmNhZHJlTGlzdFxyXG4gICAgICB9IGVsc2V7XHJcbiAgICAgIHRoaXMuZG9wdEVsaWdpYmxlU2VydmljZXNMaXN0ID0gW11cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKF9jaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICB0aGlzLmFzc2lnblBhdGhBbmRVcGRhdGVCYW5uZXIodGhpcy5yb3V0ZXIudXJsKVxyXG4gICAgaWYgKHRoaXMuY29udGVudCkge1xyXG4gICAgICB0aGlzLmZldGNoRXh0ZXJuYWxDb250ZW50QWNjZXNzKClcclxuICAgICAgdGhpcy5tb2RpZnlTZW5zaWJsZUNvbnRlbnRSYXRpbmcoKVxyXG4gICAgICB0aGlzLmFzc2lnblBhdGhBbmRVcGRhdGVCYW5uZXIodGhpcy5yb3V0ZXIudXJsKVxyXG4gICAgICB0aGlzLmdldExlYXJuaW5nVXJscygpXHJcbiAgICAgIHRoaXMuc2V0QmF0Y2hDb250cm9sKClcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5yZXN1bWVEYXRhICYmIHRoaXMucmVzdW1lRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuY29udGVudCkge1xyXG4gICAgICBsZXQgcmVzdW1lRGF0YVYyOiBhbnlcclxuICAgICAgaWYgKHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSB7XHJcbiAgICAgICAgcmVzdW1lRGF0YVYyID0gdGhpcy5nZXRSZXN1bWVEYXRhRnJvbUxpc3QoJ3N0YXJ0JylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bWVEYXRhVjIgPSB0aGlzLmdldFJlc3VtZURhdGFGcm9tTGlzdCgpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghcmVzdW1lRGF0YVYyLm1pbWVUeXBlKSB7XHJcbiAgICAgICAgcmVzdW1lRGF0YVYyLm1pbWVUeXBlID0gdGhpcy5nZXRNaW1lVHlwZSh0aGlzLmNvbnRlbnQsIHJlc3VtZURhdGFWMi5pZGVudGlmaWVyKVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJlc3VtZURhdGFMaW5rID0gdmlld2VyUm91dGVHZW5lcmF0b3IoXHJcbiAgICAgICAgcmVzdW1lRGF0YVYyLmlkZW50aWZpZXIsXHJcbiAgICAgICAgcmVzdW1lRGF0YVYyLm1pbWVUeXBlLFxyXG4gICAgICAgIHRoaXMuaXNSZXNvdXJjZSA/IHVuZGVmaW5lZCA6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxyXG4gICAgICAgIHRoaXMuaXNSZXNvdXJjZSA/IHVuZGVmaW5lZCA6IHRoaXMuY29udGVudC5jb250ZW50VHlwZSxcclxuICAgICAgICB0aGlzLmZvclByZXZpZXcsXHJcbiAgICAgICAgJ0xlYXJuaW5nIFJlc291cmNlJyxcclxuICAgICAgICB0aGlzLmdldEJhdGNoSWQoKSxcclxuICAgICAgICB0aGlzLmNvbnRlbnQubmFtZSxcclxuICAgICAgKVxyXG4gICAgICB0aGlzLmFjdGlvblNWQy5zZXRVcGRhdGVDb21wR3JvdXBPID0gdGhpcy5yZXN1bWVEYXRhTGlua1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYmF0Y2hDb250cm9sVW5zdWJzY3JpYmUgPSB0aGlzLmJhdGNoQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChiYXRjaDogTnNDb250ZW50LklCYXRjaCkgPT4ge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQmF0Y2ggPSBiYXRjaFxyXG4gICAgICBpZiAoYmF0Y2gpIHtcclxuICAgICAgICBpZiAodGhpcy5jaGVja1JlamVjdGVkKGJhdGNoKSkge1xyXG4gICAgICAgICAgdGhpcy5zaG93UmVqZWN0ZWQgPSB0cnVlXHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zaG93UmVqZWN0ZWQgPSBmYWxzZVxyXG4gICAgICByZXR1cm5cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVxdWVzdFRvV2l0aGRyYXdEaWFsb2coKSB7XHJcbiAgICBjb25zdCBjb25maXJtRGlhbG9nID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgIHdpZHRoOiAnNDM0cHgnLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgdGl0bGU6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gd2l0aGRyYXcgeW91ciByZXF1ZXN0PycsXHJcbiAgICAgICAgbWVzc2FnZTogJ1lvdSB3aWxsIG1pc3MgdGhlIGxlYXJuaW5nIG9wcG9ydHVuaXR5IGlmIHlvdSB3aXRoZHJhdyB5b3VyIGVucm9sbWVudC4nLFxyXG4gICAgICAgIGFjY2VwdEJ1dHRvbjogJ1dpdGhkcmF3JyxcclxuICAgICAgICBjYW5jZWxCdXR0b246ICdDYW5jZWwnLFxyXG4gICAgICB9LFxyXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXHJcbiAgICAgIHBhbmVsQ2xhc3M6IFsnYW5pbWF0ZV9fYW5pbWF0ZWQnLCAnYW5pbWF0ZV9fc2xpZGVJbkxlZnQnXSxcclxuICAgIH0pXHJcblxyXG4gICAgY29uZmlybURpYWxvZy5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICAgIHRoaXMucmVxdWVzdEFuZFdpdGhEcmF3RW5yb2xsKHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbS5jdXJyZW50U3RhdHVzLCB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuV0lUSERSQVcsIHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbS53ZklkKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgb3BlbkNvbmZvcm1hdGlvbkRpYWxvZyhtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGlhbG9nLm9wZW4oQ29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICB3aWR0aDogJzYwMHB4JyxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXHJcbiAgICAgICAgYWNjZXB0QnV0dG9uOiAnT2snLFxyXG4gICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5SZXF1ZXN0VG9FbnJvbGwoYmF0Y2hEYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGNvbmZpcm1EaWFsb2cgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgd2lkdGg6ICc0MzRweCcsXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICB0aXRsZTogJ1lvdeKAmXJlIG9uZSBzdGVwIGF3YXkgZnJvbSBlbnJvbGxpbmchJyxcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICAgbWVzc2FnZTogYFRoaXMgYmF0Y2ggaXMgYWN0aXZlIGZyb20gJHt0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShiYXRjaERhdGEuc3RhcnREYXRlLCAnZGQtTU0teXl5eScpfSAgLSAgJHt0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShiYXRjaERhdGEuZW5kRGF0ZSwgJ2RkLU1NLXl5eXknKX0sIGtpbmRseSBnbyB0aHJvdWdoIHRoZSBjb250ZW50IGFuZCBiZSBwcmVwYXJlZC5gLFxyXG4gICAgICAgIGFjY2VwdEJ1dHRvbjogJ0NvbmZpcm0nLFxyXG4gICAgICAgIGNhbmNlbEJ1dHRvbjogJ0NhbmNlbCcsXHJcbiAgICAgIH0sXHJcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAgICAgcGFuZWxDbGFzczogWydhbmltYXRlX19hbmltYXRlZCcsICdhbmltYXRlX19zbGlkZUluTGVmdCddLFxyXG4gICAgfSlcclxuICAgIGNvbmZpcm1EaWFsb2cuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIHRoaXMucmVxdWVzdEFuZFdpdGhEcmF3RW5yb2xsKCdJTklUSUFURScsICdJTklUSUFURScpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjYWxsQlBTdXJldnkoYmF0Y2hEYXRhOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgY29uc3Qgc0lEID0gdGhpcy5jb250ZW50LndmU3VydmV5TGluay5zcGxpdCgnc3VydmV5cy8nKVxyXG4gICAgICBjb25zdCBzdXJ2ZXlJZCA9IHNJRFsxXVxyXG4gICAgICBjb25zdCBjb3Vyc2VJZCA9IHRoaXMuY29udGVudC5pZGVudGlmaWVyXHJcbiAgICAgIGNvbnN0IGNvdXJzZU5hbWUgPSB0aGlzLmNvbnRlbnQubmFtZVxyXG4gICAgICBjb25zdCB3ZkNsaWVudFZlcnNpb24gPSBfLmdldCh0aGlzLmNvbnRlbnQsICd3ZkNsaWVudFZlcnNpb24nLCAnMCcpXHJcbiAgICAgIGNvbnN0IGFwaURhdGEgPSB7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnByZWZlci10ZW1wbGF0ZVxyXG4gICAgICAgIGdldEFQSTogJy9hcGlzL3Byb3hpZXMvdjgvZm9ybXMvZ2V0Rm9ybUJ5SWQ/aWQ9JyArIHN1cnZleUlkLFxyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpwcmVmZXItdGVtcGxhdGVcclxuICAgICAgICBwb3N0QVBJOiAnL2FwaXMvcHJveGllcy92OC9mb3Jtcy92MS9zYXZlRm9ybVN1Ym1pdCcsXHJcbiAgICAgICAgZ2V0QWxsQXBwbGljYXRpb25zOiAnL2FwaXMvcHJveGllcy92OC9mb3Jtcy9nZXRBbGxBcHBsaWNhdGlvbnMnLFxyXG4gICAgICAgIGN1c3RvbWl6ZWRIZWFkZXI6IHt9LFxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGVucm9sbFF1ZXN0aW9ubmFpcmUgPSB0aGlzLmRpYWxvZy5vcGVuKEVucm9sbFF1ZXN0aW9ubmFpcmVDb21wb25lbnQsIHtcclxuICAgICAgICB3aWR0aDogJzkyMHB4JyxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc4NXZoJyxcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBzdXJ2ZXlJZCxcclxuICAgICAgICAgIGNvdXJzZUlkLFxyXG4gICAgICAgICAgY291cnNlTmFtZSxcclxuICAgICAgICAgIGFwaURhdGEsXHJcbiAgICAgICAgICBiYXRjaERhdGEsXHJcbiAgICAgICAgICB3ZkNsaWVudFZlcnNpb25cclxuXHJcbiAgICAgICAgfSxcclxuICAgICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxyXG4gICAgICAgIHBhbmVsQ2xhc3M6IFsnYW5pbWF0ZV9fYW5pbWF0ZWQnLCAnYW5pbWF0ZV9fc2xpZGVJbkxlZnQnXSxcclxuICAgICAgfSlcclxuICAgICAgZW5yb2xsUXVlc3Rpb25uYWlyZS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgIHRoaXMub3BlblJlcXVlc3RUb0Vucm9sbChiYXRjaERhdGEpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsbEJQUHJvZmlsZVN1cmV2eShiYXRjaERhdGE6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuY29udGVudCkge1xyXG4gICAgICBjb25zdCBkb3B0b3JnSUQgPSB0aGlzLmVudmlyb25tZW50LmRvcHRPcmdcclxuICAgICAgY29uc3QgaXNEb3B0Q29udGVudCA9IF8uZ2V0KHRoaXMuY29udGVudCwgJ2NyZWF0ZWRGb3InLCBbXSkuaW5jbHVkZXMoZG9wdG9yZ0lEKVxyXG4gICAgICAvLyBjb25zdCBpc0RwdFVzZXIgPSBfLmdldCh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LCAncm9vdE9yZ0lkJykgPT09IGRvcHRvcmdJRFxyXG5cclxuICAgIHRoaXMuZ2V0RG9wdEVsaWdpYmxlU2VydmljZXNMaXN0KClcclxuICAgIGNvbnN0IHVzZXJQcm9maWxlT2JqZWN0ID0gdGhpcy5jb25maWdTdmM/LnVuTWFwcGVkVXNlciB8fCB7fVxyXG4gICAgICBjb25zdCBjaXZpbFNlcnZpY2VOYW1lID0gXy5nZXQodXNlclByb2ZpbGVPYmplY3QsICdwcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMuY2l2aWxTZXJ2aWNlTmFtZScsICcnKVxyXG4gICAgICBpZiAodGhpcy5kb3B0RWxpZ2libGVTZXJ2aWNlc0xpc3QgJiYgdGhpcy5kb3B0RWxpZ2libGVTZXJ2aWNlc0xpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGlmICghY2l2aWxTZXJ2aWNlTmFtZSkge1xyXG4gICAgICAgICAgdGhpcy5vcGVuQ29uZm9ybWF0aW9uRGlhbG9nKGBUaGlzIHByb2dyYW0gaGFzIGVsaWdpYmlsaXR5IGNyaXRlcmlhLiBQbGVhc2UgdXBkYXRlIHlvdXIgc2VydmljZSBkZXRhaWxzIGluIHlvdXIgcHJvZmlsZSBiZWZvcmUgcmVxdWVzdGluZyB0byBlbnJvbGwuYClcclxuICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZG9wdEVsaWdpYmxlU2VydmljZXNMaXN0LmluY2x1ZGVzKGNpdmlsU2VydmljZU5hbWUpKSB7XHJcbiAgICAgICAgICB0aGlzLm9wZW5Db25mb3JtYXRpb25EaWFsb2coYFlvdSBhcmUgbm90IGVsaWdpYmxlIGZvciB0aGUgJHt0aGlzLmNvbnRlbnQubmFtZX0gd2l0aCB0aGUgY3VycmVudCBzZXJ2aWNlIGluIHlvdXIgcHJvZmlsZS4gSWYgeW91ciBzZXJ2aWNlIGRldGFpbHMgYXJlIGluY29ycmVjdCwgcGxlYXNlIHVwZGF0ZSB5b3VyIHByb2ZpbGUgYW5kIGFwcGx5LmApXHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY291cnNlTmFtZSA9IHRoaXMuY29udGVudC5uYW1lXHJcbiAgICAgIC8vIGNvbnN0IHNob3dEb3B0Q2hhbmdlcyA9IChpc0RvcHRDb250ZW50ICYmIGlzRHB0VXNlcikgPyB0cnVlIDogZmFsc2VcclxuICAgICAgY29uc3QgcHJvZmlsZUZvcm0gPSB0aGlzLmRpYWxvZy5vcGVuKEVucm9sbFByb2ZpbGVGb3JtQ29tcG9uZW50LCB7XHJcbiAgICAgICAgd2lkdGg6ICc5MjBweCcsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnODV2aCcsXHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgY291cnNlTmFtZSxcclxuICAgICAgICAgIGJhdGNoRGF0YSxcclxuICAgICAgICAgIHNob3dEb3B0Q2hhbmdlczogaXNEb3B0Q29udGVudCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXHJcbiAgICAgICAgcGFuZWxDbGFzczogWydhbmltYXRlX19hbmltYXRlZCcsICdhbmltYXRlX19zbGlkZUluTGVmdCddLFxyXG4gICAgICB9KVxyXG4gICAgICBwcm9maWxlRm9ybS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LndmU3VydmV5TGluaykge1xyXG4gICAgICAgICAgICB0aGlzLmNhbGxCUFN1cmV2eShiYXRjaERhdGEpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0VG9FbnJvbGwoYmF0Y2hEYXRhKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXF1ZXN0VG9FbnJvbGxEaWFsb2coKSB7XHJcblxyXG4gICAgY29uc3QgYmF0Y2hEYXRhID0gdGhpcy5iYXRjaENvbnRyb2wudmFsdWVcclxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNKSB7XHJcbiAgICAgIC8vIGNvbmZsaWN0cyBjaGVjayBzdGFydFxyXG4gICAgICBjb25zdCB1c2VyTGlzdDogYW55ID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QgJiYgdGhpcy51c2VyRW5yb2xsbWVudExpc3QuZmlsdGVyKGVsZSA9PiB7XHJcbiAgICAgICAgaWYgKGVsZS5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNKSB7XHJcbiAgICAgICAgICBpZiAoIShkYXlqcyhiYXRjaERhdGEuc3RhcnREYXRlKS5pc0JlZm9yZShkYXlqcyhlbGUuYmF0Y2guc3RhcnREYXRlKSkgJiZcclxuICAgICAgICAgICAgZGF5anMoYmF0Y2hEYXRhLmVuZERhdGUpLmlzQmVmb3JlKGRheWpzKGVsZS5iYXRjaC5zdGFydERhdGUpKSB8fFxyXG4gICAgICAgICAgICBkYXlqcyhiYXRjaERhdGEuc3RhcnREYXRlKS5pc0FmdGVyKGRheWpzKGVsZS5iYXRjaC5lbmREYXRlKSkgJiZcclxuICAgICAgICAgICAgZGF5anMoYmF0Y2hEYXRhLmVuZERhdGUpLmlzQWZ0ZXIoZGF5anMoZWxlLmJhdGNoLmVuZERhdGUpKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgfSlcclxuXHJcbiAgICAgIC8vIGNvbmZsaWN0cyBjaGVjayBlbmRcclxuICAgICAgaWYgKHVzZXJMaXN0ICYmIHVzZXJMaXN0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgYmF0Y2hEYXRhLmJhdGNoQXR0cmlidXRlcyAmJiBiYXRjaERhdGEuYmF0Y2hBdHRyaWJ1dGVzLnVzZXJQcm9maWxlRmlsZWRzKSB7XHJcbiAgICAgICAgICB0aGlzLmNhbGxCUFByb2ZpbGVTdXJldnkoYmF0Y2hEYXRhKVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC53ZlN1cnZleUxpbmspIHtcclxuICAgICAgICAgIHRoaXMuY2FsbEJQU3VyZXZ5KGJhdGNoRGF0YSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFRvRW5yb2xsKGJhdGNoRGF0YSlcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHVzZXJMaXN0ICYmIHVzZXJMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMub3BlblNuYWNrYmFyKGBZb3UgY2Fubm90IGVucm9sbCBpbiB0aGlzIGJsZW5kZWQgcHJvZ3JhbSBiZWNhdXNlIGl0IGNvbmZsaWN0cyB3aXRoIHlvdXIgZXhpc3RpbmcgYmxlbmRlZCBwcm9ncmFtLmApXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnByb2dyYW1FbnJvbGxDYWxsLmVtaXQoYmF0Y2hEYXRhKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlcXVlc3RBbmRXaXRoRHJhd0Vucm9sbChzdGF0ZTogc3RyaW5nLCBhY3Rpb246IHN0cmluZywgd2ZJZFZhbHVlPzogc3RyaW5nKSB7XHJcbiAgICBsZXQgdXNlcklkID0gJydcclxuICAgIGxldCByb290T3JnSWQgPSAnJ1xyXG4gICAgbGV0IHVzZXJuYW1lID0gJydcclxuICAgIGxldCBkZXBhcnRtZW50TmFtZSA9ICcnXHJcbiAgICBpZiAodGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUpIHtcclxuICAgICAgdXNlcklkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkIHx8ICcnXHJcbiAgICAgIHJvb3RPcmdJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnJvb3RPcmdJZCB8fCAnJ1xyXG4gICAgICB1c2VybmFtZSA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLmZpcnN0TmFtZSB8fCAnJ1xyXG4gICAgICBkZXBhcnRtZW50TmFtZSA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLmRlcGFydG1lbnROYW1lIHx8ICcnXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVxID0ge1xyXG4gICAgICByb290T3JnSWQsXHJcbiAgICAgIHVzZXJJZCxcclxuICAgICAgc3RhdGUsXHJcbiAgICAgIGFjdGlvbixcclxuICAgICAgYWN0b3JVc2VySWQ6IHVzZXJJZCxcclxuICAgICAgYXBwbGljYXRpb25JZDogdGhpcy5zZWxlY3RlZEJhdGNoLmJhdGNoSWQsXHJcbiAgICAgIHNlcnZpY2VOYW1lOiAnYmxlbmRlZHByb2dyYW0nLFxyXG4gICAgICBjb3Vyc2VJZDogdGhpcy5zZWxlY3RlZEJhdGNoLmNvdXJzZUlkLFxyXG4gICAgICBkZXB0TmFtZTogZGVwYXJ0bWVudE5hbWUsXHJcbiAgICAgIC4uLih3ZklkVmFsdWUgPyB7IHdmSWQ6IHdmSWRWYWx1ZSB9IDogbnVsbCksXHJcbiAgICAgIHVwZGF0ZUZpZWxkVmFsdWVzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdG9WYWx1ZToge1xyXG4gICAgICAgICAgICBuYW1lOiB1c2VybmFtZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbnRlbnRTdmMuZW5yb2xsQW5kVW5lbnJvbGxVc2VyVG9CYXRjaFdGKHJlcSwgYWN0aW9uKS50aGVuKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5yZXN1bHQgJiYgZGF0YS5yZXN1bHQuc3RhdHVzID09PSAnT0snKSB7XHJcbiAgICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cgPSB7XHJcbiAgICAgICAgICB3ZkluaXRpYXRlZDogdHJ1ZSxcclxuICAgICAgICAgIGJhdGNoOiB0aGlzLnNlbGVjdGVkQmF0Y2gsXHJcbiAgICAgICAgICB3Zkl0ZW06IHsgY3VycmVudFN0YXR1czogZGF0YS5yZXN1bHQuZGF0YS5zdGF0dXMgfSxcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy53aXRoZHJhd09yRW5yb2xsLmVtaXQoYWN0aW9uKVxyXG4gICAgICAgIHRoaXMuZ2V0QmF0Y2hVc2VyQ291bnQodGhpcy5zZWxlY3RlZEJhdGNoKVxyXG4gICAgICAgIHRoaXMub3BlblNuYWNrYmFyKGBSZXF1ZXN0ICR7YWN0aW9uID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuV0lUSERSQVcgPyAnd2l0aGRyYXduJyA6ICdzZW50J30gU3VjY2Vzc2Z1bGx5IWApXHJcbiAgICAgICAgdGhpcy5kaXNhYmxlRW5yb2xsQnRuID0gZmFsc2VcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm9wZW5TbmFja2JhcignU29tZXRoaW5nIHdlbnQgd3JvbmcsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIhJylcclxuICAgICAgICB0aGlzLmRpc2FibGVFbnJvbGxCdG4gPSBmYWxzZVxyXG4gICAgICB9XHJcbiAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLm9wZW5TbmFja2JhcihfLmdldChlcnJvciwgJ2Vycm9yLnBhcmFtcy5lcnJtc2cnKSB8fFxyXG4gICAgICAgIF8uZ2V0KGVycm9yLCAnZXJyb3IucmVzdWx0LmVycm1zZycpIHx8XHJcbiAgICAgICAgJ1NvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIScpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0TWltZVR5cGUoY29udGVudDogTnNDb250ZW50LklDb250ZW50LCBpZGVudGlmaWVyOiBzdHJpbmcpOiBOc0NvbnRlbnQuRU1pbWVUeXBlcyB7XHJcbiAgICBpZiAoY29udGVudC5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XHJcbiAgICAgIHJldHVybiBjb250ZW50Lm1pbWVUeXBlXHJcbiAgICB9XHJcbiAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XHJcbiAgICAgIGlmIChjb250ZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIC8vIGJpZyBibHVuZGVyIGluIGRhdGFcclxuICAgICAgICB0aGlzLmxvZ2dlci5sb2coY29udGVudC5pZGVudGlmaWVyLCAnV3JvbmcgbWltZSB0eXBlcyBmb3IgcmVzdW1lJylcclxuICAgICAgICByZXR1cm4gY29udGVudC5taW1lVHlwZVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBmbGF0TGlzdDogYW55W10gPSBbXVxyXG4gICAgICBjb25zdCBnZXRBbGxJdGVtc1BlckNoaWxkcmVuOiBhbnkgPSAoaXRlbTogTnNDb250ZW50LklDb250ZW50KSA9PiB7XHJcbiAgICAgICAgZmxhdExpc3QucHVzaChpdGVtKVxyXG4gICAgICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICByZXR1cm4gaXRlbS5jaGlsZHJlbi5tYXAoKGk6IE5zQ29udGVudC5JQ29udGVudCkgPT4gZ2V0QWxsSXRlbXNQZXJDaGlsZHJlbihpKSlcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGdldEFsbEl0ZW1zUGVyQ2hpbGRyZW4odGhpcy5jb250ZW50KVxyXG4gICAgICBjb25zdCBjaGxkID0gXy5maXJzdChfLmZpbHRlcihmbGF0TGlzdCwgeyBpZGVudGlmaWVyIH0pKVxyXG4gICAgICByZXR1cm4gY2hsZC5taW1lVHlwZVxyXG4gICAgfVxyXG4gICAgLy8gcmV0dXJuIGNobGQubWltZVR5cGVcclxuICAgIHJldHVybiBOc0NvbnRlbnQuRU1pbWVUeXBlcy5VTktOT1dOXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEJhdGNoSWQoKTogc3RyaW5nIHtcclxuICAgIGxldCBiYXRjaElkID0gJydcclxuICAgIGlmICh0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50KSB7XHJcbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgdGhpcy5iYXRjaERhdGEuY29udGVudCkge1xyXG4gICAgICAgIGJhdGNoSWQgPSBiYXRjaC5iYXRjaElkXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBiYXRjaElkXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlRW5yb2xsbWVudEVuZERhdGUoYmF0Y2g6IGFueSkge1xyXG4gICAgY29uc3QgZW5yb2xsbWVudEVuZERhdGUgPSBkYXlqcyhsb2Rhc2guZ2V0KGJhdGNoLCAnZW5yb2xsbWVudEVuZERhdGUnKSkuZm9ybWF0KCdZWVlZLU1NLUREJylcclxuICAgIGNvbnN0IHN5c3RlbURhdGUgPSBkYXlqcyh0aGlzLnNlcnZlckRhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXHJcbiAgICByZXR1cm4gKGVucm9sbG1lbnRFbmREYXRlICYmIGVucm9sbG1lbnRFbmREYXRlICE9PSAnSW52YWxpZCBEYXRlJykgP1xyXG4gICAgICAoZGF5anMoZW5yb2xsbWVudEVuZERhdGUpLmlzU2FtZShzeXN0ZW1EYXRlLCAnZGF5JykgfHwgZGF5anMoZW5yb2xsbWVudEVuZERhdGUpLmlzQWZ0ZXIoc3lzdGVtRGF0ZSkpIDogZmFsc2VcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjaGVja1JlamVjdGVkKGJhdGNoOiBhbnkpIHtcclxuICAgIGlmIChcclxuICAgICAgYmF0Y2ggJiZcclxuICAgICAgdGhpcy5iYXRjaERhdGEgJiZcclxuICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cgJiZcclxuICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtXHJcbiAgICApIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICBpZiAoYmF0Y2guYmF0Y2hJZCA9PT0gdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLmFwcGxpY2F0aW9uSWQgJiYgKHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbS5jdXJyZW50U3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuUkVKRUNURUQgfHwgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLmN1cnJlbnRTdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRU1PVkVEKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjaGVja1dpdGhkcmF3bihiYXRjaDogYW55KSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIGJhdGNoICYmXHJcbiAgICAgIHRoaXMuYmF0Y2hEYXRhICYmXHJcbiAgICAgIHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93ICYmXHJcbiAgICAgIHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbVxyXG4gICAgKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRCYXRjaC5iYXRjaElkID09PSB0aGlzLmJhdGNoRGF0YS53b3JrRmxvdy53Zkl0ZW0uYXBwbGljYXRpb25JZCAmJiAodGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLmN1cnJlbnRTdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5XSVRIRFJBV04gfHwgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLmN1cnJlbnRTdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5XSVRIRFJBV04pKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGJhdGNoQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuY2xlYXJBbmRDYWxsVGltZXIoKVxyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IGJhdGNoRGF0YSA9IHtcclxuICAgICAgICBjb250ZW50OiBbZXZlbnQudmFsdWVdLFxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ2V0QmF0Y2hVc2VyQ291bnQoZXZlbnQudmFsdWUpXHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhICYmIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEgPSB7XHJcbiAgICAgICAgICAuLi50aGlzLnNlbGVjdGVkQmF0Y2hEYXRhLFxyXG4gICAgICAgICAgLi4uYmF0Y2hEYXRhLFxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhID0ge1xyXG4gICAgICAgICAgLi4uYmF0Y2hEYXRhLFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5jaGVja1JlamVjdGVkKGV2ZW50LnZhbHVlKSkge1xyXG4gICAgICAgIHRoaXMuc2hvd1JlamVjdGVkID0gdHJ1ZVxyXG4gICAgICAgIHRoaXMuc2V0YmF0Y2hEYXRlVG9Db3VudERvd24oZXZlbnQudmFsdWUuc3RhcnREYXRlKVxyXG4gICAgICAgIHRoaXMudG9jU3ZjLmdldFNlbGVjdGVkQmF0Y2hEYXRhKHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRiYXRjaERhdGVUb0NvdW50RG93bihldmVudC52YWx1ZS5zdGFydERhdGUpXHJcbiAgICAgIHRoaXMudG9jU3ZjLmdldFNlbGVjdGVkQmF0Y2hEYXRhKHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEpXHJcbiAgICB9XHJcbiAgICB0aGlzLnNob3dSZWplY3RlZCA9IGZhbHNlXHJcbiAgICB0aGlzLmNoZWNrQmF0Y2hTdGFydERhdGUoKVxyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICBjaGVja0JhdGNoU3RhcnREYXRlKCkge1xyXG4gICAgY29uc3QgYmF0Y2hTdGFydERhdGUgPSB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhICYmIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudFxyXG4gICAgICAmJiB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhLmNvbnRlbnRbMF0gJiYgdGhpcy5zZWxlY3RlZEJhdGNoRGF0YS5jb250ZW50WzBdLnN0YXJ0RGF0ZVxyXG4gICAgY29uc3Qgd29ya0Zsb3cgPSB0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS53b3JrRmxvdyAmJiB0aGlzLmJhdGNoRGF0YS53b3JrRmxvdy53Zkl0ZW1cclxuICAgICAgJiYgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLmN1cnJlbnRTdGF0dXNcclxuICAgIGNvbnN0IG5vdyA9IGRheWpzKHRoaXMuc2VydmVyRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJylcclxuICAgIGNvbnN0IGRhdGVFeHRlbmRlZCA9IGRheWpzKG5vdykuaXNTYW1lT3JBZnRlcihkYXlqcyhiYXRjaFN0YXJ0RGF0ZSkpXHJcbiAgICBpZiAoZGF0ZUV4dGVuZGVkICYmICh3b3JrRmxvdyAmJiAod29ya0Zsb3cgIT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5BUFBST1ZFRClcclxuICAgICAgJiYgd29ya0Zsb3cgIT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5XSVRIRFJBV04pKSB7XHJcbiAgICAgIGNvbnN0IGNvbmZpcm1EaWFsb2cgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgICB3aWR0aDogJzQzNHB4JyxcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICB0aXRsZTogJ1JlcXVlc3Qgbm90IGFwcHJvdmVkJyxcclxuICAgICAgICAgIG1lc3NhZ2U6ICdEb25cXCd0IHdvcnJ5OyB3aXRoZHJhdyB0aGlzIGFuZCByZXF1ZXN0IGFub3RoZXIgYmF0Y2guJyxcclxuICAgICAgICAgIGFjY2VwdEJ1dHRvbjogJ1dpdGhkcmF3JyxcclxuICAgICAgICAgIGNhbmNlbEJ1dHRvbjogJ0NhbmNlbCcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXHJcbiAgICAgICAgcGFuZWxDbGFzczogWydhbmltYXRlX19hbmltYXRlZCcsICdhbmltYXRlX19zbGlkZUluTGVmdCddLFxyXG4gICAgICB9KVxyXG4gICAgICBjb25maXJtRGlhbG9nLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICAgICAgdGhpcy5yZXF1ZXN0QW5kV2l0aERyYXdFbnJvbGwodGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLmN1cnJlbnRTdGF0dXMsIHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5XSVRIRFJBVywgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLndmSWQpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJhdGNoQ29udHJvbCgpIHtcclxuICAgIC8vIG9uIGZpcnN0IGxvYWQgc2VsZWN0IGZpcnN0IHZhbHVlIGluIHRoZSBiYXRjaCBsaXN0IGlmIGl0cyBoYXZpbmcgdmFsaWQgZW5yb2xsbWVudCBEYXRlXHJcbiAgICBpZiAodGhpcy5jb250ZW50ICYmICh0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gfHxcclxuICAgICAgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSkpIHtcclxuICAgICAgaWYgKHRoaXMuYmF0Y2hEYXRhICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQubGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmJhdGNoRGF0YS53b3JrRmxvdyB8fCAodGhpcy5iYXRjaERhdGEud29ya0Zsb3cgJiYgIXRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSW5pdGlhdGVkKSkge1xyXG4gICAgICAgICAgY29uc3QgYmF0Y2ggPSB0aGlzLmJhdGNoRGF0YS5jb250ZW50LmZpbmQoKGVsOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaGFuZGxlRW5yb2xsbWVudEVuZERhdGUoZWwpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGVsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgaWYgKGJhdGNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmF0Y2hDb250cm9sLnNldFZhbHVlKGJhdGNoKVxyXG4gICAgICAgICAgICB0aGlzLnNldGJhdGNoRGF0ZVRvQ291bnREb3duKGJhdGNoLnN0YXJ0RGF0ZSlcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmdldEJhdGNoVXNlckNvdW50KHRoaXMuYmF0Y2hDb250cm9sLnZhbHVlKVxyXG4gICAgICAgICAgY29uc3QgYmF0Y2hEYXRhID0ge1xyXG4gICAgICAgICAgICBjb250ZW50OiBbdGhpcy5iYXRjaENvbnRyb2wudmFsdWVdLFxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhICYmIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhID0ge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMuc2VsZWN0ZWRCYXRjaERhdGEsXHJcbiAgICAgICAgICAgICAgLi4uYmF0Y2hEYXRhLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhID0ge1xyXG4gICAgICAgICAgICAgIC4uLmJhdGNoRGF0YSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMudG9jU3ZjLmdldFNlbGVjdGVkQmF0Y2hEYXRhKHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGJhdGNoID0gdGhpcy5iYXRjaERhdGEuY29udGVudC5maW5kKChlbDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlbC5iYXRjaElkID09PSB0aGlzLmJhdGNoRGF0YS53b3JrRmxvdy53Zkl0ZW0uYXBwbGljYXRpb25JZCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBlbFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEJhdGNoID0gYmF0Y2hcclxuICAgICAgICAgIHRoaXMuYmF0Y2hDb250cm9sLnBhdGNoVmFsdWUoYmF0Y2gpXHJcbiAgICAgICAgICB0aGlzLmJhdGNoQ2hhbmdlKHsgdmFsdWU6IGJhdGNoIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNsZWFyQW5kQ2FsbFRpbWVyKCkge1xyXG4gICAgaWYgKHRoaXMudGltZXJJbnRlcnZhbENsZWFyKSB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lckludGVydmFsQ2xlYXIpXHJcbiAgICB9XHJcbiAgICB0aGlzLmNhbGxUaW1lcigpXHJcbiAgfVxyXG5cclxuICAvLyBzZXR0aW5nIGJhdGNoIHN0YXJ0IGRhdGVcclxuICBzZXRiYXRjaERhdGVUb0NvdW50RG93bihiYXRjaFN0YXJ0RGF0ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRhcmdldERhdGUgPSBuZXcgRGF0ZShiYXRjaFN0YXJ0RGF0ZSlcclxuICAgIGNvbnN0IGNvbnZlcnRlZERhdGUgPSBkYXlqcyhiYXRjaFN0YXJ0RGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJylcclxuICAgIHRoaXMudGFyZ2V0VGltZSA9IG5ldyBEYXRlKGNvbnZlcnRlZERhdGUpLmdldFRpbWUoKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvcGVuU25hY2tiYXIocHJpbWFyeU1zZzogc3RyaW5nLCBkdXJhdGlvbjogbnVtYmVyID0gNTAwMCkge1xyXG4gICAgdGhpcy5zbmFja0Jhci5vcGVuKHByaW1hcnlNc2csICdYJywge1xyXG4gICAgICBkdXJhdGlvbixcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgZGlzYWJsZVdpdGhkcmF3bkJ0bigpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5iYXRjaERhdGEgJiZcclxuICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cgJiZcclxuICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtXHJcbiAgICApIHtcclxuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLmN1cnJlbnRTdGF0dXNcclxuICAgICAgaWYgKE5zQ29udGVudC5XRkJsZW5kZWRQcm9ncmFtQXBwcm92YWxUeXBlcy5UV09fU1RFUF9NRE9fUEMgPT09IHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbS5zZXJ2aWNlTmFtZSAmJlxyXG4gICAgICAgIHN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlNFTkRfRk9SX1BDX0FQUFJPVkFMKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgfSBpZiAoTnNDb250ZW50LldGQmxlbmRlZFByb2dyYW1BcHByb3ZhbFR5cGVzLlRXT19TVEVQX1BDX01ETyA9PT0gdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLnNlcnZpY2VOYW1lICYmXHJcbiAgICAgICAgc3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuU0VORF9GT1JfTURPX0FQUFJPVkFMKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG5cclxuICBnZXQgc2hvd0luc3RydWN0b3JMZWRNc2coKSB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLnNob3dBY3Rpb25CdXR0b25zICYmXHJcbiAgICAgIHRoaXMuY29udGVudCAmJlxyXG4gICAgICB0aGlzLmNvbnRlbnQubGVhcm5pbmdNb2RlID09PSAnSW5zdHJ1Y3Rvci1MZWQnICYmXHJcbiAgICAgICF0aGlzLmNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoICYmXHJcbiAgICAgICF0aGlzLmNvbnRlbnQuYXJ0aWZhY3RVcmxcclxuICAgIClcclxuICB9XHJcblxyXG4gIGdldCBnZXRXRk1zZygpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5iYXRjaERhdGEgJiZcclxuICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cgJiZcclxuICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtXHJcbiAgICApIHtcclxuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLmN1cnJlbnRTdGF0dXNcclxuICAgICAgY29uc3QgbXNnID0gdGhpcy5XRlNUQVRVU19NU0dfTUFQUElOR1tzdGF0dXNdXHJcbiAgICAgIHJldHVybiB0aGlzLnRvY0NvbmZpZ1ttc2ddXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc2hvd0ljb24oKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuYmF0Y2hEYXRhICYmXHJcbiAgICAgIHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93ICYmXHJcbiAgICAgIHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbS5jdXJyZW50U3RhdHVzXHJcbiAgICAgIGlmIChzdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5BUFBST1ZFRCB8fFxyXG4gICAgICAgIHN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlNFTkRfRk9SX01ET19BUFBST1ZBTCB8fFxyXG4gICAgICAgIHN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlNFTkRfRk9SX1BDX0FQUFJPVkFMIHx8XHJcbiAgICAgICAgc3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuV0lUSERSQVdOIHx8XHJcbiAgICAgICAgc3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuUkVKRUNURUQgfHxcclxuICAgICAgICBzdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRU1PVkVEKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG5cclxuICBnZXQgc2hvd01zZygpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5iYXRjaERhdGEgJiZcclxuICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cgJiZcclxuICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtXHJcbiAgICApIHtcclxuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLmN1cnJlbnRTdGF0dXNcclxuICAgICAgaWYgKHN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLkFQUFJPVkVEIHx8XHJcbiAgICAgICAgc3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuU0VORF9GT1JfTURPX0FQUFJPVkFMIHx8XHJcbiAgICAgICAgc3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuU0VORF9GT1JfUENfQVBQUk9WQUwgfHxcclxuICAgICAgICAoc3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuV0lUSERSQVdOICYmIHRoaXMuY2hlY2tXaXRoZHJhd24odGhpcy5iYXRjaERhdGEpKSB8fFxyXG4gICAgICAgIChzdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRU1PVkVEICYmIHRoaXMuc2hvd1JlamVjdGVkKSB8fFxyXG4gICAgICAgIChzdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRUpFQ1RFRCAmJiB0aGlzLnNob3dSZWplY3RlZCkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIGdldCBXRkljb24oKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuYmF0Y2hEYXRhICYmXHJcbiAgICAgIHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93ICYmXHJcbiAgICAgIHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuYmF0Y2hEYXRhLndvcmtGbG93LndmSXRlbS5jdXJyZW50U3RhdHVzXHJcbiAgICAgIGlmIChzdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5BUFBST1ZFRCB8fFxyXG4gICAgICAgIHN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlNFTkRfRk9SX01ET19BUFBST1ZBTCB8fFxyXG4gICAgICAgIHN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlNFTkRfRk9SX1BDX0FQUFJPVkFMIHx8XHJcbiAgICAgICAgc3RhdHVzID09PSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuV0lUSERSQVdOXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybiAnY2lyY2xlJ1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzdGF0dXMgPT09IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRUpFQ1RFRCB8fFxyXG4gICAgICAgIHN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlJFTU9WRUQpIHtcclxuICAgICAgICByZXR1cm4gJ2luZm8nXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAnJ1xyXG4gIH1cclxuXHJcbiAgZ2V0IGljb25Db2xvcigpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5iYXRjaERhdGEgJiZcclxuICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cgJiZcclxuICAgICAgdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtXHJcbiAgICApIHtcclxuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5iYXRjaERhdGEud29ya0Zsb3cud2ZJdGVtLmN1cnJlbnRTdGF0dXNcclxuICAgICAgaWYgKHN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLkFQUFJPVkVEIHx8IHN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLldJVEhEUkFXTikge1xyXG4gICAgICAgIHJldHVybiAnd3MtbWF0LWdyZWVuLXRleHQnXHJcbiAgICAgIH0gaWYgKHN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlNFTkRfRk9SX01ET19BUFBST1ZBTCB8fFxyXG4gICAgICAgIHN0YXR1cyA9PT0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlNFTkRfRk9SX1BDX0FQUFJPVkFMKSB7XHJcbiAgICAgICAgcmV0dXJuICd3cy1tYXQtb3JhbmdlLXRleHQnXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuICcnXHJcblxyXG4gICAgfVxyXG4gICAgcmV0dXJuICcgJ1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzSGVhZGVySGlkZGVuKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNSZXNvdXJjZSAmJiB0aGlzLmNvbnRlbnQgJiYgIXRoaXMuY29udGVudC5hcnRpZmFjdFVybC5sZW5ndGhcclxuICB9XHJcblxyXG4gIGdldCBzaG93QWN0aW9uQnV0dG9ucygpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuYWN0aW9uQnRuU3RhdHVzICE9PSAnd2FpdCcgJiZcclxuICAgICAgdGhpcy5jb250ZW50ICYmXHJcbiAgICAgIHRoaXMuY29udGVudC5zdGF0dXMgIT09ICdEZWxldGVkJyAmJlxyXG4gICAgICB0aGlzLmNvbnRlbnQuc3RhdHVzICE9PSAnRXhwaXJlZCdcclxuICAgIClcclxuICB9XHJcblxyXG4gIGdldCBzaG93QnV0dG9uQ29udGFpbmVyKCkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgPT09ICdncmFudCcgJiZcclxuICAgICAgISh0aGlzLmlzTW9iaWxlICYmIHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaXNJbkludHJhbmV0KSAmJlxyXG4gICAgICAhKFxyXG4gICAgICAgIHRoaXMuY29udGVudCAmJlxyXG4gICAgICAgIHRoaXMuY29udGVudC5jb250ZW50VHlwZSA9PT0gJ0NvdXJzZScgJiZcclxuICAgICAgICB0aGlzLmNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmXHJcbiAgICAgICAgIXRoaXMuY29udGVudC5hcnRpZmFjdFVybFxyXG4gICAgICApICYmXHJcbiAgICAgICEodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jb250ZW50VHlwZSA9PT0gJ1Jlc291cmNlJyAmJiAhdGhpcy5jb250ZW50LmFydGlmYWN0VXJsKVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgZ2V0IGlzUmVzb3VyY2UoKSB7XHJcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XHJcbiAgICAgIGNvbnN0IGlzUmVzb3VyY2UgPSB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUgPT09IE5zQ29udGVudC5FQ29udGVudFR5cGVzLktOT1dMRURHRV9BUlRJRkFDVCB8fFxyXG4gICAgICAgIHRoaXMuY29udGVudC5jb250ZW50VHlwZSA9PT0gTnNDb250ZW50LkVDb250ZW50VHlwZXMuUkVTT1VSQ0UgfHwgIXRoaXMuY29udGVudC5jaGlsZHJlbi5sZW5ndGhcclxuICAgICAgaWYgKGlzUmVzb3VyY2UpIHtcclxuICAgICAgICB0aGlzLm1vYmlsZUFwcHNTdmMuc2VuZFZpZXdlckRhdGEodGhpcy5jb250ZW50KVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBpc1Jlc291cmNlXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIGdldEJhdGNoVXNlckNvdW50KGJhdGNoRGF0YTogYW55KSB7XHJcbiAgICBpZiAoYmF0Y2hEYXRhICYmIGJhdGNoRGF0YS5iYXRjaElkKSB7XHJcbiAgICAgIGNvbnN0IHJlcSA9IHtcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ2JsZW5kZWRwcm9ncmFtJyxcclxuICAgICAgICBhcHBsaWNhdGlvblN0YXR1czogJycsXHJcbiAgICAgICAgYXBwbGljYXRpb25JZHM6IFtcclxuICAgICAgICAgIGJhdGNoRGF0YS5iYXRjaElkLFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgbGltaXQ6IDEwMCxcclxuICAgICAgICBvZmZzZXQ6IDAsXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdXNlcmNvdW50ID0ge1xyXG4gICAgICAgIGVucm9sbGVkOiAwLFxyXG4gICAgICAgIHRvdGFsQXBwbGllZDogMCxcclxuICAgICAgICByZWplY3RlZDogMCxcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNvbnRlbnRTdmMuZmV0Y2hCbGVuZGVkVXNlckNPVU5UKHJlcSkudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzLnJlc3VsdCAmJiByZXMucmVzdWx0LmRhdGEpIHtcclxuICAgICAgICAgIHJlcy5yZXN1bHQuZGF0YS5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZWxlLmN1cnJlbnRTdGF0dXMgPT09ICdBUFBST1ZFRCcpIHtcclxuICAgICAgICAgICAgICB1c2VyY291bnQuZW5yb2xsZWQgPSBlbGUuc3RhdHVzQ291bnRcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGUuY3VycmVudFN0YXR1cyA9PT0gJ1JFSkVDVEVEJykge1xyXG4gICAgICAgICAgICAgIHVzZXJjb3VudC5yZWplY3RlZCA9IGVsZS5zdGF0dXNDb3VudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChlbGUuY3VycmVudFN0YXR1cyAhPT0gJ1dJVEhEUkFXTicpIHtcclxuICAgICAgICAgICAgICB1c2VyY291bnQudG90YWxBcHBsaWVkID0gdXNlcmNvdW50LnRvdGFsQXBwbGllZCArIGVsZS5zdGF0dXNDb3VudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEJhdGNoRGF0YSA9IHtcclxuICAgICAgICAgICAgICAuLi50aGlzLnNlbGVjdGVkQmF0Y2hEYXRhLFxyXG4gICAgICAgICAgICAgIHVzZXJDb3VudDogdXNlcmNvdW50LFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5nZXRTZWxlY3RlZEJhdGNoRGF0YSh0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UmVzdW1lRGF0YUZyb21MaXN0KHR5cGU/OiBzdHJpbmcpIHtcclxuICAgIGlmICghdHlwZSkge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIGNvbnN0IGxhc3RJdGVtID0gdGhpcy5yZXN1bWVEYXRhICYmIHRoaXMucmVzdW1lRGF0YS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gbmV3IERhdGUoYi5sYXN0QWNjZXNzVGltZSkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYS5sYXN0QWNjZXNzVGltZSkuZ2V0VGltZSgpKS5zaGlmdCgpXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgaWRlbnRpZmllcjogbGFzdEl0ZW0uY29udGVudElkLFxyXG4gICAgICAgIG1pbWVUeXBlOiBsYXN0SXRlbS5wcm9ncmVzc2RldGFpbHMgJiYgbGFzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzLm1pbWVUeXBlLFxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZmlyc3RJdGVtID0gdGhpcy5yZXN1bWVEYXRhICYmIHRoaXMucmVzdW1lRGF0YS5sZW5ndGggJiYgdGhpcy5yZXN1bWVEYXRhWzBdXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpZGVudGlmaWVyOiBmaXJzdEl0ZW0uY29udGVudElkLFxyXG4gICAgICBtaW1lVHlwZTogZmlyc3RJdGVtLnByb2dyZXNzZGV0YWlscyAmJiBmaXJzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzLm1pbWVUeXBlLFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtb2RpZnlTZW5zaWJsZUNvbnRlbnRSYXRpbmcoKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY29udGVudCAmJlxyXG4gICAgICB0aGlzLmNvbnRlbnQuYXZlcmFnZVJhdGluZyAmJlxyXG4gICAgICB0eXBlb2YgdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgIT09ICdudW1iZXInXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgPSAodGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgYXMgYW55KVt0aGlzLmNvbmZpZ1N2Yy5yb290T3JnIHx8ICcnXVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQudG90YWxSYXRpbmcgJiYgdHlwZW9mIHRoaXMuY29udGVudC50b3RhbFJhdGluZyAhPT0gJ251bWJlcicpIHtcclxuICAgICAgdGhpcy5jb250ZW50LnRvdGFsUmF0aW5nID0gKHRoaXMuY29udGVudC50b3RhbFJhdGluZyBhcyBhbnkpW3RoaXMuY29uZmlnU3ZjLnJvb3RPcmcgfHwgJyddXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExlYXJuaW5nVXJscygpIHtcclxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcclxuICAgICAgICAvLyB0aGlzLnByb2dyZXNzU3ZjLmdldFByb2dyZXNzRm9yKHRoaXMuY29udGVudC5pZGVudGlmaWVyKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgLy8gICB0aGlzLmNvbnRlbnRQcm9ncmVzcyA9IGRhdGFcclxuICAgICAgICAvLyB9KVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmlzUHJhY3RpY2VWaXNpYmxlID0gQm9vbGVhbihcclxuICAgICAgICB0aGlzLnRvY1N2Yy5maWx0ZXJUb2ModGhpcy5jb250ZW50LCBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LlBSQUNUSUNFKSxcclxuICAgICAgKVxyXG5cclxuICAgICAgdGhpcy5pc0Fzc2Vzc1Zpc2libGUgPSBCb29sZWFuKFxyXG4gICAgICAgIHRoaXMudG9jU3ZjLmZpbHRlclRvYyh0aGlzLmNvbnRlbnQsIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuQVNTRVNTKSxcclxuICAgICAgKVxyXG5cclxuICAgICAgY29uc3QgZmlyc3RQbGF5YWJsZUNvbnRlbnQgPSB0aGlzLmNvbnRlbnRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KHRoaXMuY29udGVudClcclxuICAgICAgdGhpcy5maXJzdFJlc291cmNlTGluayA9IHZpZXdlclJvdXRlR2VuZXJhdG9yKFxyXG4gICAgICAgIGZpcnN0UGxheWFibGVDb250ZW50LmlkZW50aWZpZXIsXHJcbiAgICAgICAgZmlyc3RQbGF5YWJsZUNvbnRlbnQubWltZVR5cGUsXHJcbiAgICAgICAgdGhpcy5pc1Jlc291cmNlID8gdW5kZWZpbmVkIDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXHJcbiAgICAgICAgdGhpcy5pc1Jlc291cmNlID8gdW5kZWZpbmVkIDogdGhpcy5jb250ZW50LmNvbnRlbnRUeXBlLFxyXG4gICAgICAgIHRoaXMuZm9yUHJldmlldyxcclxuICAgICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LFxyXG4gICAgICAgIHRoaXMuZ2V0QmF0Y2hJZCgpLFxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzc2lnblBhdGhBbmRVcGRhdGVCYW5uZXIodXJsOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHBhdGggPSB1cmwuc3BsaXQoJy8nKS5wb3AoKVxyXG4gICAgaWYgKHBhdGggJiYgdGhpcy52YWxpZFBhdGhzLmhhcyhwYXRoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlUGF0aCA9IHBhdGhcclxuICAgICAgdGhpcy51cGRhdGVCYW5uZXJVcmwoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVCYW5uZXJVcmwoKSB7XHJcbiAgICBpZiAodGhpcy5iYW5uZXJzKSB7XHJcbiAgICAgIHRoaXMuYmFubmVyVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKFxyXG4gICAgICAgIGB1cmwoJHt0aGlzLmJhbm5lcnNbdGhpcy5yb3V0ZVBhdGhdfSlgLFxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwbGF5SW50cm9WaWRlbygpIHtcclxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgdGhpcy5kaWFsb2cub3BlbihBcHBUb2NEaWFsb2dJbnRyb1ZpZGVvQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YTogdGhpcy5jb250ZW50LmludHJvZHVjdG9yeVZpZGVvLFxyXG4gICAgICAgIGhlaWdodDogJzM1MHB4JyxcclxuICAgICAgICB3aWR0aDogJzYyMHB4JyxcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBzYW5pdGl6ZWRJbnRyb2R1Y3RvcnlWaWRlb0ljb24oKSB7XHJcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pbnRyb2R1Y3RvcnlWaWRlb0ljb24pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShgdXJsKCR7dGhpcy5jb250ZW50LmludHJvZHVjdG9yeVZpZGVvSWNvbn0pYClcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZldGNoRXh0ZXJuYWxDb250ZW50QWNjZXNzKCkge1xyXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQucmVnaXN0cmF0aW9uVXJsKSB7XHJcbiAgICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XHJcbiAgICAgICAgdGhpcy5leHRlcm5hbENvbnRlbnRGZXRjaFN0YXR1cyA9ICdmZXRjaGluZydcclxuICAgICAgICB0aGlzLnJlZ2lzdGVyRm9yRXh0ZXJuYWwgPSBmYWxzZVxyXG4gICAgICAgIHRoaXMudG9jU3ZjLmZldGNoRXh0ZXJuYWxDb250ZW50QWNjZXNzKHRoaXMuY29udGVudC5pZGVudGlmaWVyKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICBkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5leHRlcm5hbENvbnRlbnRGZXRjaFN0YXR1cyA9ICdkb25lJ1xyXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRm9yRXh0ZXJuYWwgPSBkYXRhLmhhc0FjY2Vzc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIF9lcnJvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZXJuYWxDb250ZW50RmV0Y2hTdGF0dXMgPSAnZG9uZSdcclxuICAgICAgICAgICAgdGhpcy5yZWdpc3RlckZvckV4dGVybmFsID0gZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZXh0ZXJuYWxDb250ZW50RmV0Y2hTdGF0dXMgPSAnZG9uZSdcclxuICAgICAgICB0aGlzLnJlZ2lzdGVyRm9yRXh0ZXJuYWwgPSB0cnVlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJhdGluZ0ljb24ocmF0aW5nSW5kZXg6IG51bWJlcik6ICdzdGFyJyB8ICdzdGFyX2JvcmRlcicgfCAnc3Rhcl9oYWxmJyB7XHJcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nKSB7XHJcbiAgICAgIGNvbnN0IGF2Z1JhdGluZyA9IHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nXHJcbiAgICAgIGNvbnN0IHJhdGluZ0Zsb29yID0gTWF0aC5mbG9vcihhdmdSYXRpbmcpXHJcbiAgICAgIGlmIChyYXRpbmdJbmRleCA8PSByYXRpbmdGbG9vcikge1xyXG4gICAgICAgIHJldHVybiAnc3RhcidcclxuICAgICAgfVxyXG4gICAgICBpZiAocmF0aW5nRmxvb3IgPT09IHJhdGluZ0luZGV4IC0gMSAmJiBhdmdSYXRpbmcgJSAxID49IDAuMjkgJiYgYXZnUmF0aW5nICUgMSA8IDAuNzEpIHtcclxuICAgICAgICByZXR1cm4gJ3N0YXJfaGFsZidcclxuICAgICAgfVxyXG4gICAgICBpZiAocmF0aW5nRmxvb3IgPT09IHJhdGluZ0luZGV4IC0gMSAmJiBhdmdSYXRpbmcgJSAxID4gMC43MSkge1xyXG4gICAgICAgIHJldHVybiAnc3RhcidcclxuICAgICAgfVxyXG4gICAgICBpZiAocmF0aW5nRmxvb3IgPT09IHJhdGluZ0luZGV4IC0gMSAmJiBhdmdSYXRpbmcgJSAxIDwgMC4yOSkge1xyXG4gICAgICAgIHJldHVybiAnc3Rhcl9ib3JkZXInXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAnc3Rhcl9ib3JkZXInXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrUmVnaXN0cmF0aW9uU3RhdHVzKCkge1xyXG4gICAgY29uc3Qgc291cmNlID0gKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuc291cmNlU2hvcnROYW1lKSB8fCAnJ1xyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5mb3JQcmV2aWV3ICYmXHJcbiAgICAgICF0aGlzLmlzUmVnaXN0cmF0aW9uU3VwcG9ydGVkICYmXHJcbiAgICAgIHRoaXMuY2hlY2tSZWdpc3RyYXRpb25Tb3VyY2VzLmhhcyhzb3VyY2UpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5jb250ZW50U3ZjXHJcbiAgICAgICAgLmdldFJlZ2lzdHJhdGlvblN0YXR1cyhzb3VyY2UpXHJcbiAgICAgICAgLnRoZW4ocmVzID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuaGFzQWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uQnRuU3RhdHVzID0gJ2dyYW50J1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgPSAncmVqZWN0J1xyXG4gICAgICAgICAgICBpZiAocmVzLnJlZ2lzdHJhdGlvblVybCAmJiB0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQucmVnaXN0cmF0aW9uVXJsID0gcmVzLnJlZ2lzdHJhdGlvblVybFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goX2VyciA9PiB7IH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFjdGlvbkJ0blN0YXR1cyA9ICdncmFudCdcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdlbmVyYXRlUXVlcnkodHlwZTogJ1JFU1VNRScgfCAnU1RBUlRfT1ZFUicgfCAnU1RBUlQnKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XHJcbiAgICBpZiAodGhpcy5maXJzdFJlc291cmNlTGluayAmJiAodHlwZSA9PT0gJ1NUQVJUJyB8fCB0eXBlID09PSAnU1RBUlRfT1ZFUicpKSB7XHJcbiAgICAgIGxldCBxUGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gICAgICAgIC4uLnRoaXMuZmlyc3RSZXNvdXJjZUxpbmsucXVlcnlQYXJhbXMsXHJcbiAgICAgICAgdmlld01vZGU6IHR5cGUsXHJcbiAgICAgICAgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCksXHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuY29udGV4dElkICYmIHRoaXMuY29udGV4dFBhdGgpIHtcclxuICAgICAgICBxUGFyYW1zID0ge1xyXG4gICAgICAgICAgLi4ucVBhcmFtcyxcclxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogdGhpcy5jb250ZXh0SWQsXHJcbiAgICAgICAgICBjb2xsZWN0aW9uVHlwZTogdGhpcy5jb250ZXh0UGF0aCxcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xyXG4gICAgICAgIGRlbGV0ZSBxUGFyYW1zLnZpZXdNb2RlXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHFQYXJhbXNcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5yZXN1bWVEYXRhTGluayAmJiB0eXBlID09PSAnUkVTVU1FJykge1xyXG4gICAgICBsZXQgcVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcclxuICAgICAgICAuLi50aGlzLnJlc3VtZURhdGFMaW5rLnF1ZXJ5UGFyYW1zLFxyXG4gICAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxyXG4gICAgICAgIHZpZXdNb2RlOiAnUkVTVU1FJyxcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5jb250ZXh0SWQgJiYgdGhpcy5jb250ZXh0UGF0aCkge1xyXG4gICAgICAgIHFQYXJhbXMgPSB7XHJcbiAgICAgICAgICAuLi5xUGFyYW1zLFxyXG4gICAgICAgICAgY29sbGVjdGlvbklkOiB0aGlzLmNvbnRleHRJZCxcclxuICAgICAgICAgIGNvbGxlY3Rpb25UeXBlOiB0aGlzLmNvbnRleHRQYXRoLFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XHJcbiAgICAgICAgZGVsZXRlIHFQYXJhbXMudmlld01vZGVcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcVBhcmFtc1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xyXG4gICAgICByZXR1cm4ge31cclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxyXG4gICAgICB2aWV3TW9kZTogdHlwZSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBpc0luSUZyYW1lKCk6IGJvb2xlYW4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIHdpbmRvdy5zZWxmICE9PSB3aW5kb3cudG9wXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QmdDb2xvcih0YWdUaXRsZTogYW55KSB7XHJcbiAgICBjb25zdCBiZ0NvbG9yID0gdGhpcy50YWdTdmMuc3RyaW5nVG9Db2xvcih0YWdUaXRsZS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgY29uc3QgY29sb3IgPSB0aGlzLnRhZ1N2Yy5nZXRDb250cmFzdChiZ0NvbG9yKVxyXG4gICAgcmV0dXJuIHsgY29sb3IsICdiYWNrZ3JvdW5kLWNvbG9yJzogYmdDb2xvciB9XHJcbiAgfVxyXG4gIGdldFRhcmdldFRpbWUoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEJhdGNoLnN0YXJ0RGF0ZSkge1xyXG4gICAgICB0aGlzLnRhcmdldERhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkQmF0Y2guc3RhcnREYXRlKVxyXG4gICAgICBjb25zdCBjb252ZXJ0ZWREYXRlID0gZGF5anModGhpcy5zZWxlY3RlZEJhdGNoLnN0YXJ0RGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJylcclxuICAgICAgcmV0dXJuIG5ldyBEYXRlKGNvbnZlcnRlZERhdGUpLmdldFRpbWUoKVxyXG4gICAgfVxyXG4gICAgLy8gdGhpcy50YXJnZXRUaW1lID0gJydcclxuICAgIHJldHVybiAnJ1xyXG4gIH1cclxuICBjYWxsVGltZXIoKSB7XHJcbiAgICAvLyB0aGlzLnRhcmdldFRpbWUgPSB0aGlzLmdldFRhcmdldFRpbWUoKVxyXG4gICAgaWYgKHRoaXMuc2VydmVyRGF0ZSkge1xyXG4gICAgICAvLyBsZXQgdGltZXJJbnRlcnZhbCA9IHRpbWVyKDEwMDAsIDEwMDApXHJcbiAgICAgIC8vIHNldFRpbWVvdXQoKCk9PntcclxuICAgICAgLy8gICBpZiAodGhpcy50aW1lckludGVydmFsQ2xlYXIpIHtcclxuICAgICAgLy8gICAgIHRoaXMudGltZXJJbnRlcnZhbENsZWFyLnVuc3Vic2NyaWJlKClcclxuICAgICAgLy8gICB9XHJcbiAgICAgIC8vICAgdGhpcy50aW1lckludGVydmFsQ2xlYXIgPSB0aW1lckludGVydmFsLnN1YnNjcmliZSgodDogYW55KSA9PiB7XHJcblxyXG4gICAgICAvLyAgICAgY29uc29sZS5sb2codGhpcy5zZWxlY3RlZEJhdGNoLnN0YXJ0RGF0ZSwnLS0tLScpXHJcbiAgICAgIC8vICAgICBjb25zb2xlLmxvZyh0aGlzLmJhdGNoQ29udHJvbC52YWx1ZS5zdGFydERhdGUsJ2hpaWlpJylcclxuICAgICAgLy8gICAgIHRoaXMudGFyZ2V0RGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWRCYXRjaC5zdGFydERhdGUpXHJcbiAgICAgIC8vICAgICBjb25zdCBjb252ZXJ0ZWREYXRlID0gZGF5anModGhpcy5zZWxlY3RlZEJhdGNoLnN0YXJ0RGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJylcclxuICAgICAgLy8gICAgIHRoaXMudGFyZ2V0VGltZSA9ICcnXHJcbiAgICAgIC8vICAgICB0aGlzLnRhcmdldFRpbWU9bmV3IERhdGUoY29udmVydGVkRGF0ZSkuZ2V0VGltZSgpXHJcbiAgICAgIC8vICAgICB0aGlzLnRpbWVyRnVuYyh0LHRoaXMuc2VydmVyRGF0ZSArIHQgKiAxMDAwKVxyXG5cclxuICAgICAgLy8gICB9KVxyXG4gICAgICAvLyB9LDEwMClcclxuICAgICAgbGV0IHQgPSAwXHJcbiAgICAgIGlmICh0aGlzLnRpbWVySW50ZXJ2YWxDbGVhcikge1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lckludGVydmFsQ2xlYXIpXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50aW1lckludGVydmFsQ2xlYXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50YXJnZXRUaW1lID0gJydcclxuICAgICAgICBpZiAodGhpcy5iYXRjaENvbnRyb2wgJiYgdGhpcy5iYXRjaENvbnRyb2wudmFsdWUgJiYgdGhpcy5iYXRjaENvbnRyb2wudmFsdWUuc3RhcnREYXRlKSB7XHJcblxyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5zZWxlY3RlZEJhdGNoLnN0YXJ0RGF0ZSwnLS0tLScpXHJcbiAgICAgICAgICB0aGlzLnRhcmdldERhdGUgPSBuZXcgRGF0ZSh0aGlzLmJhdGNoQ29udHJvbC52YWx1ZS5zdGFydERhdGUpXHJcbiAgICAgICAgICBjb25zdCBjb252ZXJ0ZWREYXRlID0gZGF5anModGhpcy5iYXRjaENvbnRyb2wudmFsdWUuc3RhcnREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKVxyXG5cclxuICAgICAgICAgIHRoaXMudGFyZ2V0VGltZSA9IG5ldyBEYXRlKGNvbnZlcnRlZERhdGUpLmdldFRpbWUoKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRpbWVyRnVuYyh0aGlzLnNlcnZlckRhdGUgKyB0ICogMTAwMClcclxuICAgICAgICB0ID0gdCArIDFcclxuICAgICAgfSwgMTAwMClcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0aW1lckZ1bmMoc2VydmVyRGF0ZTogYW55KSB7XHJcbiAgICAvLyBzZXJ2ZXJEYXRlID0gc2VydmVyRGF0ZSArIHRpbWVlclxyXG4gICAgaWYgKHNlcnZlckRhdGUgJiYgdGhpcy50YXJnZXRUaW1lKSB7XHJcbiAgICAgIGxldCB0aW1lckxvY2FsID0ge1xyXG4gICAgICAgIGRheXM6IDAsXHJcbiAgICAgICAgaG91cnM6IDAsXHJcbiAgICAgICAgbWluOiAwLFxyXG4gICAgICAgIHNlY29uZHM6IDAsXHJcbiAgICAgIH1cclxuICAgICAgLy8gc2VydmVyRGF0ZSA9IHNlcnZlckRhdGUgICsgIDEwMDBcclxuICAgICAgdGhpcy5kYXRlID0gbmV3IERhdGUoc2VydmVyRGF0ZSlcclxuICAgICAgdGhpcy5ub3cgPSB0aGlzLmRhdGUuZ2V0VGltZSgpXHJcbiAgICAgIHRoaXMuZGlmZmVyZW5jZSA9IHRoaXMudGFyZ2V0VGltZSAtIHRoaXMubm93XHJcbiAgICAgIHRoaXMuZGlmZmVyZW5jZSA9IHRoaXMuZGlmZmVyZW5jZSAvICgxMDAwICogNjAgKiA2MCAqIDI0KVxyXG5cclxuICAgICAgdGhpcy5kYXlzID0gTWF0aC5mbG9vcih0aGlzLmRpZmZlcmVuY2UpXHJcbiAgICAgIHRoaXMuaG91cnMgPSAyMyAtIHRoaXMuZGF0ZS5nZXRIb3VycygpXHJcbiAgICAgIHRoaXMubWludXRlcyA9IDYwIC0gdGhpcy5kYXRlLmdldE1pbnV0ZXMoKVxyXG4gICAgICB0aGlzLnNlY29uZHMgPSA2MCAtIHRoaXMuZGF0ZS5nZXRTZWNvbmRzKClcclxuICAgICAgTnVtYmVyKHRoaXMuaG91cnMpXHJcbiAgICAgICFpc05hTih0aGlzLmRheXMpXHJcbiAgICAgICAgPyAodGhpcy5kYXlzID0gTWF0aC5mbG9vcih0aGlzLmRpZmZlcmVuY2UpKVxyXG4gICAgICAgIDogKHRoaXMuZGF5cyA9IGA8aW1nIHNyYz1cImh0dHBzOi8vaS5naWZlci5jb20vVkF5Ui5naWZcIiAvPmApXHJcblxyXG4gICAgICB0aW1lckxvY2FsID0ge1xyXG4gICAgICAgIGRheXM6IHRoaXMuZGF5cyxcclxuICAgICAgICBob3VyczogdGhpcy5ob3VycyxcclxuICAgICAgICBtaW46IHRoaXMubWludXRlcyxcclxuICAgICAgICBzZWNvbmRzOiB0aGlzLnNlY29uZHMsXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50aW1lclNlcnZpY2Uuc2V0VGltZXJEYXRhKHRpbWVyTG9jYWwpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc2hvd0Rpc2FibGVNc2coKSB7XHJcbiAgICBjb25zdCBhbGxCYXRjaGVzID0gdGhpcy5iYXRjaERhdGEuY29udGVudFxyXG4gICAgY29uc3Qgc3RhdHVzOiBhbnkgPSBbXVxyXG4gICAgaWYgKGFsbEJhdGNoZXMpIHtcclxuICAgICAgYWxsQmF0Y2hlcy5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5oYW5kbGVFbnJvbGxtZW50RW5kRGF0ZShlbGUpIHx8IHRoaXMuZGlzYWJsZUVucm9sbEJ0bikge1xyXG4gICAgICAgICAgc3RhdHVzLnB1c2goZWxlKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgcmV0dXJuIHN0YXR1cy5sZW5ndGggPT09IGFsbEJhdGNoZXMubGVuZ3RoXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIGdldCBmaW5kTWVzc2FnZSgpIHtcclxuICAgIGlmICh0aGlzLnNob3dEaXNhYmxlTXNnKSB7XHJcbiAgICAgIGNvbnN0IG1zZyA9IHRoaXMuV0ZTVEFUVVNfTVNHX01BUFBJTkcuRVhQSVJFRFxyXG4gICAgICByZXR1cm4gdGhpcy50b2NDb25maWdbbXNnXVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnXHJcbiAgfVxyXG5cclxuICBvbkNsaWNrT2ZTaGFyZSgpIHtcclxuICAgIHRoaXMuZW5hYmxlU2hhcmUgPSB0cnVlXHJcbiAgICB0aGlzLnJhaXNlVGVsZW1ldHJ5KCdzaGFyZUNvbnRlbnQnKVxyXG4gIH1cclxuXHJcbiAgYWRkKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gdGhpcy5nZXRVc2Vyc1RvU2hhcmUoZXZlbnQudmFsdWUpXHJcbiAgICBpZiAoZXZlbnQudmFsdWUgJiYgdGhpcy5tYXRBdXRvY29tcGxldGUgJiYgIXRoaXMubWF0QXV0b2NvbXBsZXRlLmlzT3Blbikge1xyXG4gICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LmlucHV0XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudmFsdWVcclxuICAgICAgaWYgKHRoaXMudXNlcnMubGVuZ3RoID09PSB0aGlzLm1heEVtYWlsc0xpbWl0KSB7XHJcbiAgICAgICAgdGhpcy5vcGVuU25hY2tiYXIodGhpcy50cmFuc2xhdGVMYWJlbHMoJ21heExpbWl0JywgJ2NvbnRlbnRTaGFyaW5nJywgJycpKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnVzZXJzLmluY2x1ZGVzKHZhbHVlLnRyaW0oKSkpIHtcclxuICAgICAgICB0aGlzLm9wZW5TbmFja2Jhcih0aGlzLnRyYW5zbGF0ZUxhYmVscygnZHVsaWNhdGVFbWFpbCcsICdjb250ZW50U2hhcmluZycsICcnKSlcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgICBjb25zdCBlUGF0dGVybiA9IG5ldyBSZWdFeHAoL14oPyEuKlxcLlxcLikoPyEuKlxcLl8pKD8hLipcXC5fXFwuKSg/IS4qXFwuXFwuJCkoPyEuKlxcLiQpW2EtekEtWjAtOV9dKyg/OlxcLlthLXpBLVowLTlfXSspKkAoPzpbYS16QS1aMC05XSg/OlthLXpBLVowLTktXSpbYS16QS1aMC05XSk/XFwuKStbYS16QS1aMC05XSg/OlthLXpBLVowLTktXSpbYS16QS1aMC05XSk/JC8pXHJcbiAgICAgIGlmIChlUGF0dGVybi50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgIGlmICgodmFsdWUgfHwgJycpLnRyaW0oKSkge1xyXG4gICAgICAgICAgdGhpcy51c2Vycy5wdXNoKHZhbHVlLnRyaW0oKSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlucHV0KSB7XHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9ICcnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudXNlckN0cmwuc2V0VmFsdWUoJycpXHJcbiAgICAgICAgY29uc3QgZWw6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ21hdC1jaGlwLWxpc3Qtd3JhcHBlcicpXHJcbiAgICAgICAgaWYgKGVsICE9IG51bGwpIHtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBlbFswXS5zY3JvbGxUb3AgPSBlbFswXS5zY3JvbGxIZWlnaHRcclxuICAgICAgICAgIH0sIDIwMClcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5vcGVuU25hY2tiYXIodGhpcy50cmFuc2xhdGVMYWJlbHMoJ2ludmFsaWRFbWFpbCcsICdjb250ZW50U2hhcmluZycsICcnKSlcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlKHVzZXI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnVzZXJzLmluZGV4T2YodXNlcilcclxuXHJcbiAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICB0aGlzLnVzZXJzLnNwbGljZShpbmRleCwgMSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlbGVjdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy51c2Vycy5sZW5ndGggPT09IHRoaXMubWF4RW1haWxzTGltaXQpIHtcclxuICAgICAgdGhpcy5vcGVuU25hY2tiYXIodGhpcy50cmFuc2xhdGVMYWJlbHMoJ21heExpbWl0JywgJ2NvbnRlbnRTaGFyaW5nJywgJycpKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnVzZXJzLmluY2x1ZGVzKGV2ZW50Lm9wdGlvbi52YWx1ZSkpIHtcclxuICAgICAgdGhpcy5vcGVuU25hY2tiYXIodGhpcy50cmFuc2xhdGVMYWJlbHMoJ2R1bGljYXRlVXNlcicsICdjb250ZW50U2hhcmluZycsICcnKSlcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLnVzZXJzLnB1c2goZXZlbnQub3B0aW9uLnZhbHVlKVxyXG4gICAgaWYgKHRoaXMudXNlcklucHV0KSB7XHJcbiAgICAgIHRoaXMudXNlcklucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJ1xyXG4gICAgfVxyXG4gICAgdGhpcy51c2VyQ3RybC5zZXRWYWx1ZSgnJylcclxuICAgIGNvbnN0IGVsOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdtYXQtY2hpcC1saXN0LXdyYXBwZXInKVxyXG4gICAgaWYgKGVsICE9IG51bGwpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgZWxbMF0uc2Nyb2xsVG9wID0gZWxbMF0uc2Nyb2xsSGVpZ2h0XHJcbiAgICAgIH0sIDIwMClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZpbHRlclNoYXJlZFVzZXJzKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgIHJldHVybiB0aGlzLmFsbFVzZXJzLmZpbHRlcih1c2VyID0+IHVzZXIubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSlcclxuICAgIH1cclxuICAgIHJldHVybiBbXVxyXG4gIH1cclxuXHJcbiAgc3VibWl0U2hhcmluZygpIHtcclxuICAgIGxldCBjb3Vyc2VJZCA9ICcnXHJcbiAgICBsZXQgY291cnNlTmFtZSA9ICcnXHJcbiAgICBsZXQgY291cnNlUG9zdGVySW1hZ2VVcmwgPSAnJ1xyXG4gICAgbGV0IGNvdXJzZVByb3ZpZGVyID0gJydcclxuICAgIGxldCBwcmltYXJ5Q2F0ZWdvcnkgPSAnJ1xyXG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XHJcbiAgICAgIGNvdXJzZVByb3ZpZGVyID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUucm9vdE9yZ05hbWUgfHwgJydcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgY291cnNlSWQgPSB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcixcclxuICAgICAgICBjb3Vyc2VOYW1lID0gdGhpcy5jb250ZW50Lm5hbWUsXHJcbiAgICAgICAgY291cnNlUG9zdGVySW1hZ2VVcmwgPSB0aGlzLmNvbnRlbnQucG9zdGVySW1hZ2UgfHwgJycsXHJcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5ID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeVxyXG4gICAgfVxyXG4gICAgY29uc3Qgb2JqID0ge1xyXG4gICAgICByZXF1ZXN0OiB7XHJcbiAgICAgICAgY291cnNlSWQsXHJcbiAgICAgICAgY291cnNlTmFtZSxcclxuICAgICAgICBjb3Vyc2VQb3N0ZXJJbWFnZVVybCxcclxuICAgICAgICBjb3Vyc2VQcm92aWRlcixcclxuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnksXHJcbiAgICAgICAgcmVjaXBpZW50czogJycsXHJcbiAgICAgIH0sXHJcbiAgICB9XHJcbiAgICBjb25zdCByZWNpcGllbnRzOiBhbnkgPSBbXVxyXG4gICAgdGhpcy51c2Vycy5mb3JFYWNoKChzZWxlY3RlZFVzZXI6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoc2VsZWN0ZWRVc2VyLmluY2x1ZGVzKCdAJykgJiYgc2VsZWN0ZWRVc2VyLmluY2x1ZGVzKCcuJykpIHtcclxuICAgICAgICByZWNpcGllbnRzLnB1c2goeyBlbWFpbDogc2VsZWN0ZWRVc2VyIH0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRVc2VyT2JqOiBhbnkgPSB0aGlzLmFsbFVzZXJzLmZpbHRlcih1c2VyID0+IHVzZXIubmFtZSA9PT0gc2VsZWN0ZWRVc2VyKVxyXG4gICAgICAgIGlmIChzZWxlY3RlZFVzZXJPYmoubGVuZ3RoKSB7XHJcbiAgICAgICAgICByZWNpcGllbnRzLnB1c2goeyB1c2VySWQ6IHNlbGVjdGVkVXNlck9ialswXS5pZCwgZW1haWw6IHNlbGVjdGVkVXNlck9ialswXS5lbWFpbCB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH0pXHJcbiAgICBpZiAocmVjaXBpZW50cy5sZW5ndGgpIHtcclxuICAgICAgb2JqLnJlcXVlc3QucmVjaXBpZW50cyA9IHJlY2lwaWVudHNcclxuICAgICAgdGhpcy50b2NTdmMuc2hhcmVDb250ZW50KG9iaikuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5yZXNwb25zZUNvZGUgPT09ICdPSycpIHtcclxuICAgICAgICAgIHRoaXMub3BlblNuYWNrYmFyKHRoaXMudHJhbnNsYXRlTGFiZWxzKCdzdWNjZXNzJywgJ2NvbnRlbnRTaGFyaW5nJywgJycpKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVzZXJzID0gW11cclxuICAgICAgICB0aGlzLmZpbHRlcmVkVXNlcnMgPSBbXVxyXG4gICAgICAgIHRoaXMuYWxsVXNlcnMgPSBbXVxyXG4gICAgICAgIHRoaXMuZW5hYmxlU2hhcmUgPSBmYWxzZVxyXG4gICAgICAgIHRoaXMudXNlckN0cmwuc2V0VmFsdWUoJycpXHJcbiAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZVxyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxyXG4gICAgICAgIHRoaXMub3BlblNuYWNrYmFyKHRoaXMudHJhbnNsYXRlTGFiZWxzKCdlcnJvcicsICdjb250ZW50U2hhcmluZycsICcnKSlcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2xvc2UoKSB7XHJcbiAgICB0aGlzLmVuYWJsZVNoYXJlID0gZmFsc2VcclxuICAgIHRoaXMudXNlcnMgPSBbXVxyXG4gICAgdGhpcy5maWx0ZXJlZFVzZXJzID0gW11cclxuICAgIHRoaXMuYWxsVXNlcnMgPSBbXVxyXG4gICAgdGhpcy51c2VyQ3RybC5zZXRWYWx1ZSgnJylcclxuICAgIHRoaXMucmFpc2VUZWxlbWV0cnkoJ3NoYXJlQ2xvc2UnKVxyXG4gIH1cclxuXHJcbiAgY29weVRvQ2xpcGJvYXJkKCkge1xyXG4gICAgY29uc3QgdGV4dEFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpXHJcbiAgICB0ZXh0QXJlYS52YWx1ZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmXHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRleHRBcmVhKVxyXG4gICAgLy90ZXh0QXJlYS5mb2N1cygpXHJcbiAgICB0ZXh0QXJlYS5zZWxlY3QoKVxyXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKVxyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXh0QXJlYSlcclxuICAgIHRoaXMub3BlblNuYWNrYmFyKHRoaXMudHJhbnNsYXRlTGFiZWxzKCdsaW5rQ29waWVkJywgJ2NvbnRlbnRTaGFyaW5nJywgJycpKVxyXG4gICAgdGhpcy5yYWlzZVRlbGVtZXRyeSgnY29weVRvQ2xpcGJvYXJkJylcclxuICB9XHJcblxyXG4gIHJhaXNlVGVsZW1ldHJ5KHN1YlR5cGU6IGFueSkge1xyXG4gICAgdGhpcy5ldmVudHMucmFpc2VJbnRlcmFjdFRlbGVtZXRyeShcclxuICAgICAge1xyXG4gICAgICAgIHR5cGU6ICdjbGljaycsXHJcbiAgICAgICAgc3ViVHlwZTogc3ViVHlwZSxcclxuICAgICAgICBpZDogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LmlkZW50aWZpZXIgOiAnJyxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGlkOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA6ICcnLFxyXG4gICAgICAgIHR5cGU6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgOiAnJyxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHBhZ2VJZEV4dDogYGJ0bi0ke3N1YlR5cGV9YCxcclxuICAgICAgICBtb2R1bGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnltb2R1bGVzLkNPTlRFTlQsXHJcbiAgICAgIH1cclxuICAgIClcclxuICB9XHJcblxyXG4gIHRyYW5zbGF0ZUxhYmVscyhsYWJlbDogc3RyaW5nLCB0eXBlOiBhbnksIHN1YnR5cGU6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMubGFuZ3RyYW5zbGF0aW9ucy50cmFuc2xhdGVBY3R1YWxMYWJlbChsYWJlbCwgdHlwZSwgc3VidHlwZSlcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy50b2NTdmMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnbm9uZSdcclxuICAgIGlmICh0aGlzLnJvdXRlclBhcmFtU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMucm91dGVyUGFyYW1TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucm91dGVTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5yb3V0ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5iYXRjaFdGRGF0YVN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLmJhdGNoV0ZEYXRhU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEJhdGNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRpbWVySW50ZXJ2YWxDbGVhcikge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMudGltZXJJbnRlcnZhbENsZWFyKTtcclxuICAgICAgLy8gdGhpcy50aW1lckludGVydmFsQ2xlYXIudW5zdWJzY3JpYmUoKVxyXG4gICAgICB0aGlzLnRhcmdldFRpbWUgPSAnJ1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5iYXRjaENvbnRyb2xVbnN1YnNjcmliZS51bnN1YnNjcmliZSgpXHJcbiAgICB9XHJcbiAgICB0aGlzLmJhdGNoQ29udHJvbC5zZXRWYWx1ZSh7fSlcclxuICAgIHRoaXMuYmF0Y2hDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxyXG4gICAgdGhpcy5zZWxlY3RlZEJhdGNoID0ge31cclxuICB9XHJcblxyXG4gIHRyYW5zbGF0ZUxhYmVsKGxhYmVsOiBzdHJpbmcsIHR5cGU6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMubGFuZ3RyYW5zbGF0aW9ucy50cmFuc2xhdGVMYWJlbChsYWJlbCwgdHlwZSwgJycpXHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJoZWFkZXItc3lub3BzaXMgZml4ZWQtd2lkdGggbWFyZ2luLXRvcC14bFwiIFtuZ0NsYXNzXT1cInsgJ2hlYWRlci1zeW5vcHNpcy1ncmFkaWVudCc6IGJhbm5lclVybCB9XCJcclxuICAqbmdJZj1cInNob3dcIj5cclxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXgtYXV0b1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXRpdGxlIGZsZXgtY29sIHNtOmZsZXgtcm93XCI+XHJcbiAgICAgICAgPCEtLSBpbWFnZSAtLT5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udGVudD8ucG9zdGVySW1hZ2VcIiBjbGFzcz1cImZsb2F0LWxlZnRcIj5cclxuICAgICAgICAgIDxpbWcgW3NyY109XCJjb250ZW50Py5wb3N0ZXJJbWFnZSB8IHBpcGVQdWJsaWNVUkxcIiBbaWRdPVwiJ3NvdXJjZV8nICsgY29udGVudC5pZGVudGlmaWVyXCIgY2xhc3M9XCJhcHAtaWNvblwiXHJcbiAgICAgICAgICAgIFt3c1V0aWxzRGVmYXVsdFRodW1ibmFpbF09XCJkZWZhdWx0U0xvZ29cIiBbYWx0XT1cImNvbnRlbnQuc291cmNlTmFtZSB8fCBpR09UXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbnRlbnQ/LnBvc3RlckltYWdlXCIgY2xhc3M9XCJmbG9hdC1sZWZ0XCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uYXBwSWNvbjsgZWxzZSBkZWZhdWx0SW1nXCI+XHJcbiAgICAgICAgICAgIDxpbWcgW3NyY109XCJjb250ZW50Py5hcHBJY29uIHwgcGlwZVB1YmxpY1VSTFwiIFtpZF09XCInc291cmNlXycgKyBjb250ZW50LmlkZW50aWZpZXJcIiBjbGFzcz1cImFwcC1pY29uXCJcclxuICAgICAgICAgICAgICBbd3NVdGlsc0RlZmF1bHRUaHVtYm5haWxdPVwiZGVmYXVsdFNMb2dvXCIgW2FsdF09XCJjb250ZW50LnNvdXJjZU5hbWUgfHwgaUdPVFwiIC8+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEltZz5cclxuICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2luc3RhbmNlcy9lYWdsZS9hcHBfbG9nb3MvZGVmYXVsdC5wbmdcIiBbaWRdPVwiJ3NvdXJjZV8nICsgY29udGVudC5pZGVudGlmaWVyXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImFwcC1pY29uXCIgW2FsdF09XCJjb250ZW50LnNvdXJjZU5hbWUgfHwgaUdPVFwiIC8+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbTptbC01IGZsZXggZmxleC1hdXRvXCIgW2lkXT1cIidtLWMtJysgY29udGVudC5pZGVudGlmaWVyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic206bWwtNSBmbGV4IGZsZXgtY29sIGZsZXgtYXV0b1wiPlxyXG4gICAgICAgICAgICA8aDEgY2xhc3M9XCJtYXQtaGVhZGxpbmUgbWFyZ2luLXJlbW92ZS1ib3R0b20gcGFkZGluZy1ib3R0b20teHMgaGlkZGVuIHNtOmJsb2NrXCJcclxuICAgICAgICAgICAgICBbdGl0bGVdPVwiY29udGVudFJlYWREYXRhPy5uYW1lXCI+XHJcbiAgICAgICAgICAgICAge3sgY29udGVudFJlYWREYXRhPy5uYW1lIH19XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsb2F0LXJpZ2h0IGN1cnNvci1wb2ludGVyIGZsZXhcIiAoY2xpY2spPVwib25DbGlja09mU2hhcmUoKVwiICpuZ0lmPVwiY2FuU2hhcmVcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIndzLW1hdC1hY2NlbnQtdGV4dCBwYWRkaW5nLXRvcC14c1wiPnNoYXJlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9oMT5cclxuICAgICAgICAgICAgPGgxIGNsYXNzPVwibWF0LWhlYWRsaW5lIG1hcmdpbi1yZW1vdmUtYm90dG9tIHBhZGRpbmctYm90dG9tLXhzIGJsb2NrIHNtOmhpZGRlblwiXHJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cImNvbnRlbnRSZWFkRGF0YT8ubmFtZVwiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbnRlbnRSZWFkRGF0YT8ubmFtZSB9fVxyXG4gICAgICAgICAgICA8L2gxPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbnRlbnRQcm9ncmVzcyA9PT0gMVwiIGNsYXNzPVwibWFyZ2luLWxlZnQtc1wiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIndzLW1hdC1hY2NlbnQtdGV4dFwiPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeVwiIGNsYXNzPVwiYXBJY29uIGZsb2F0LWxlZnQgbWItNFwiPlxyXG4gICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L2NvdXJzZS5zdmdcIiBbaWRdPVwiJ3NvdXJjZV8nICsgY29udGVudC5pZGVudGlmaWVyXCIgY2xhc3M9XCJzb3VyY2UtaWNvblwiXHJcbiAgICAgICAgICAgICAgICBbd3NVdGlsc0RlZmF1bHRUaHVtYm5haWxdPVwiZGVmYXVsdFNMb2dvXCIgW2FsdF09XCJjb250ZW50LnNvdXJjZU5hbWUgfHwgaUdPVFwiIC8+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3sgdHJhbnNsYXRlTGFiZWwoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5LCAnc2VhcmNoZmlsdGVycycpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnRlbnQ/LmFwcEljb25cIiBjbGFzcz1cImFwSWNvbiBmbG9hdC1sZWZ0IG1iLTRcIj5cclxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiY29udGVudD8uY3JlYXRvckxvZ28gfCBwaXBlUHVibGljVVJMXCIgW2lkXT1cIidzb3VyY2VfJyArIGNvbnRlbnQuaWRlbnRpZmllclwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNvdXJjZS1pY29uXCIgW3dzVXRpbHNEZWZhdWx0VGh1bWJuYWlsXT1cImRlZmF1bHRTTG9nb1wiIFthbHRdPVwiY29udGVudC5zb3VyY2VOYW1lIHx8IGlHT1RcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwicm91dGVQYXRoXCIgY2xhc3M9XCJoZWFkZXItbWV0YVwiIFtuZ0NsYXNzXT1cInsgJ2hlYWRlci1tZXRhLWJhbm5lcic6IGJhbm5lclVybCB9XCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBPdmVydmlldyBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYW5uZXItb3ZlcnZpZXctY29udGFpbmVyXCIgW2hpZGRlbl09XCIhY29udGVudD8ucHVycG9zZSAmJiBzaG93U3VidGl0bGVPbkJhbm5lclwiXHJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ292ZXJ2aWV3J1wiPlxyXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwib3ZlcnZpZXctZGVzY3JpcHRpb24gbWF0LWJvZHktMVwiICpuZ0lmPVwic2hvd1N1YnRpdGxlT25CYW5uZXJcIiBpMThuLXRpdGxlIHRpdGxlPVwiU3VidGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAge3sgY29udGVudD8uc291cmNlIHwgcGlwZUxpbWl0VG86IDI1MCB9fVxyXG4gICAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwib3ZlcnZpZXctZGVzY3JpcHRpb24gbWF0LWJvZHktMVwiICpuZ0lmPVwiIXNob3dTdWJ0aXRsZU9uQmFubmVyXCIgaTE4bi10aXRsZSB0aXRsZT1cIkRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGNvbnRlbnQ/Lmluc3RydWN0aW9ucyB8IHBpcGVMaW1pdFRvOiA0NTAgfX1cclxuICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzYW5pdGl6ZWRJbnRyb2R1Y3RvcnlWaWRlb0ljb25cIiBjbGFzcz1cIm92ZXJ2aWV3LWludHJvIHdzLW1hdC1wcmltYXJ5LWxpdGUtYmFja2dyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kSW1hZ2VdPVwic2FuaXRpemVkSW50cm9kdWN0b3J5VmlkZW9JY29uXCIgcm9sZT1cImJ1dHRvblwiIChjbGljayk9XCJwbGF5SW50cm9WaWRlbygpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiByb2xlPVwiYnV0dG9uXCIgY2xhc3M9XCJvdmVydmlldy1pbnRyby1vdmVybGF5XCI+cGxheV9hcnJvdzwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8IS0tIFRvYyBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidjb250ZW50cydcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gQ29udGVudHMgQmFubmVyIC0tPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwhLS0gQW5hbHl0aWNzIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhbm5lci1vdmVydmlldy1jb250YWluZXIgbWF0LWJvZHktMVwiIFtoaWRkZW5dPVwiIWNvbnRlbnQ/LnB1cnBvc2UgJiYgc2hvd1N1YnRpdGxlT25CYW5uZXJcIlxyXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidhbmFseXRpY3MnXCI+XHJcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJvdmVydmlldy1kZXNjcmlwdGlvbiBtYXQtYm9keS0xXCIgKm5nSWY9XCJzaG93U3VidGl0bGVPbkJhbm5lclwiIGkxOG4tdGl0bGUgdGl0bGU9XCJTdWJ0aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBjb250ZW50Py5wdXJwb3NlIHwgcGlwZUxpbWl0VG86IDI1MCB9fVxyXG4gICAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwib3ZlcnZpZXctZGVzY3JpcHRpb24gbWF0LWJvZHktMVwiICpuZ0lmPVwiIXNob3dTdWJ0aXRsZU9uQmFubmVyXCIgaTE4bi10aXRsZSB0aXRsZT1cIkRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGNvbnRlbnQ/Lmluc3RydWN0aW9ucyB8IHBpcGVMaW1pdFRvOiA0NTAgfX1cclxuICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzYW5pdGl6ZWRJbnRyb2R1Y3RvcnlWaWRlb0ljb25cIiBjbGFzcz1cIm92ZXJ2aWV3LWludHJvIHdzLW1hdC1wcmltYXJ5LWxpdGUtYmFja2dyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kSW1hZ2VdPVwic2FuaXRpemVkSW50cm9kdWN0b3J5VmlkZW9JY29uXCIgcm9sZT1cImJ1dHRvblwiIChjbGljayk9XCJwbGF5SW50cm9WaWRlbygpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiByb2xlPVwiYnV0dG9uXCIgY2xhc3M9XCJvdmVydmlldy1pbnRyby1vdmVybGF5XCI+cGxheV9hcnJvdzwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb250ZW50Py5hdmVyYWdlUmF0aW5nXCIgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciByYXRpbmcgbWFyZ2luLWJvdHRvbS1tXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYXRpbmctbnVtYmVyIG1hdC1ib2R5LTJcIj57eyBjb250ZW50Py5hdmVyYWdlUmF0aW5nIH19Jm5ic3A7PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1pY29uIG1hdGVyaWFsLWljb25zXCIgKm5nRm9yPVwibGV0IHJhdGluZyBvZiBbMSwgMiwgMywgNCwgNV1cIj5cclxuICAgICAgICAgICAgICAgIHt7IGdldFJhdGluZ0ljb24ocmF0aW5nKSB9fTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXJnaW4tbGVmdC14cyByYXRpbmctY291bnQgbWF0LWJvZHktMlwiICpuZ0lmPVwiY29udGVudD8udG90YWxSYXRpbmdcIj5cclxuICAgICAgICAgICAgICAgICgge3sgY29udGVudD8udG90YWxSYXRpbmcgfCBwaXBlQ291bnRUcmFuc2Zvcm0gfX0gKTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhY29udGVudD8uYXZlcmFnZVJhdGluZ1wiIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcmF0aW5nIG1hcmdpbi1ib3R0b20tbVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmF0aW5nLW51bWJlciBtYXQtYm9keS0yXCI+IDAuMCAmbmJzcDs8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LWljb24gbWF0ZXJpYWwtaWNvbnNcIiAqbmdGb3I9XCJsZXQgcmF0aW5nIG9mIFsxLCAyLCAzLCA0LCA1XVwiPlxyXG4gICAgICAgICAgICAgICAge3sgZ2V0UmF0aW5nSWNvbihyYXRpbmcpIH19PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hcmdpbi1sZWZ0LXhzIHJhdGluZy1jb3VudCBtYXQtYm9keS0yXCIgKm5nSWY9XCIhY29udGVudD8udG90YWxSYXRpbmdcIj5cclxuICAgICAgICAgICAgICAgICgge3sgMCB8IHBpcGVDb3VudFRyYW5zZm9ybSB9fSApPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSB0YWdzIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFncyBtYXJnaW4tYm90dG9tLXNcIiAqbmdJZj1cImNvbnRlbnQ/LmtleXdvcmRzICYmIGNvbnRlbnQ/LmtleXdvcmRzPy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IHRhZyBvZiBjb250ZW50LmtleXdvcmRzXCIgY2xhc3M9XCJ0YWdcIj5cclxuICAgICAgICAgICAgICAgIHt7dGFnfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG48bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNXCI+XHJcbiAgPGRpdiBjbGFzcz1cImJhdGNoLWRpdlwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJlcXVlc3QtYmxvY2tcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJiYXRjaERyb3Bkb3duXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAqbmdJZj1cImJhdGNoRGF0YSAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCAgJiYgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJbml0aWF0ZWQgJiZcclxuICAgICAgICAoYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzICE9PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlJFSkVDVEVEKSAmJiAoYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzICE9PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlJFTU9WRUQpICYmXHJcbiAgICAgICAgKGJhdGNoRGF0YT8ud29ya0Zsb3c/LndmSXRlbT8uY3VycmVudFN0YXR1cyAhPT0gV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5XSVRIRFJBV04pICYmXHJcbiAgICAgICAgKGJhdGNoRGF0YT8ud29ya0Zsb3c/LndmSXRlbT8uY3VycmVudFN0YXR1cyAhPT0gV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5BUFBST1ZFRCkgJiYgYmF0Y2hEYXRhPy5jb250ZW50Py5sZW5ndGhcIj5cclxuICAgICAgICA8cCBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIG1hdC1ib2R5LTEgcGFkZGluZy1tIGJnLXdoaXRlXCI+XHJcbiAgICAgICAgICB7e2JhdGNoRGF0YT8ud29ya0Zsb3c/LmJhdGNoPy5uYW1lfX0gLSAoe3tiYXRjaERhdGE/LndvcmtGbG93Py5iYXRjaD8uc3RhcnREYXRlIHwgZGF0ZTogJ2RkLU1NLXl5eXknfX0gLVxyXG4gICAgICAgICAge3tiYXRjaERhdGE/LndvcmtGbG93Py5iYXRjaD8uZW5kRGF0ZSB8IGRhdGU6ICdkZC1NTS15eXl5JyB8fCAncHJlc2VudCd9fSlcclxuICAgICAgICA8L3A+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ3aXRoZHJhdy1iYXRjaFwiIChjbGljayk9XCIhZGlzYWJsZVdpdGhkcmF3bkJ0biAmJiByZXF1ZXN0VG9XaXRoZHJhd0RpYWxvZygpXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVXaXRoZHJhd25CdG5cIiBbbmdDbGFzc109XCJ7ICdkaXNhYmxlLWJ0bic6IGRpc2FibGVXaXRoZHJhd25CdG4gfVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyPiB7eyAnYXBwdG9jYmFubmVyLndpdGhEcmF3WW91clJlcXVlc3QnIHwgdHJhbnNsYXRlIH19IDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYmF0Y2hEYXRhICYmIGJhdGNoRGF0YT8uZW5yb2xsZWQgJiYgYmF0Y2hEYXRhPy5jb250ZW50Py5sZW5ndGhcIj5cclxuICAgICAgICA8aDMgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBwLTQgYmctd2hpdGUgbWF0LWJvZHktMVwiICpuZ0Zvcj1cImxldCBiYXRjaCBvZiBiYXRjaERhdGEuY29udGVudFwiPlxyXG4gICAgICAgICAge3tiYXRjaD8ubmFtZX19ICh7e2JhdGNoPy5zdGFydERhdGUgfCBkYXRlOiAnZGQtTU0teXl5eScgfX0gLSB7e2JhdGNoPy5lbmREYXRlIHwgZGF0ZTogJ2RkLU1NLXl5eXknIHx8XHJcbiAgICAgICAgICAncHJlc2VudCd9fSlcclxuICAgICAgICA8L2gzPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwic3RhdHVzTXNnXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYmF0Y2hEYXRhICYmICFiYXRjaERhdGE/LmVucm9sbGVkICYmICFiYXRjaERhdGE/LmNvbnRlbnQ/Lmxlbmd0aFwiPlxyXG4gICAgICAgIDxoMyBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIG1hdC1ib2R5LTIgd3MtZGVmYXVsdC10ZXh0XCI+XHJcbiAgICAgICAgICBObyBiYXRjaGVzXHJcbiAgICAgICAgPC9oMz5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImJhdGNoRGF0YSAmJiBiYXRjaERhdGE/LmNvbnRlbnQ/Lmxlbmd0aCAmJiBiYXRjaERhdGE/LmNvbnRlbnRbMF0/LmJhdGNoQXR0cmlidXRlcz8uYmF0Y2hMb2NhdGlvbkRldGFpbHNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGxvY2F0aW9uLXdyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibG9jYXRpb24taWNvblwiPlxyXG4gICAgICAgICAgICBsb2NhdGlvbl9vbjwvbWF0LWljb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxvYy1kZXRhaWxzXCI+XHJcbiAgICAgICAgICAgIHt7YmF0Y2hEYXRhPy5jb250ZW50WzBdPy5iYXRjaEF0dHJpYnV0ZXM/LmJhdGNoTG9jYXRpb25EZXRhaWxzfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj4gLS0+XHJcbiAgPC9kaXY+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJhdGNoRGF0YSAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiBiYXRjaERhdGE/LmNvbnRlbnQ/Lmxlbmd0aFwiXHJcbiAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzdGF0dXNNc2dcIj48L25nLWNvbnRhaW5lcj5cclxuPC9uZy1jb250YWluZXI+XHJcbjxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb3Vyc2VDYXRlZ29yeSA9PT0gbnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5NT0RFUkFURURfUFJPR1JBTVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJyZXF1ZXN0LWJhdGNoXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtZGl2XCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50XCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYmF0Y2hEcm9wZG93blwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG48IS0tIDxkaXYgY2xhc3M9XCJoZWFkZXItc3lub3BzaXMgZml4ZWQtd2lkdGggbWFyZ2luLXRvcC1sXCIgW25nQ2xhc3NdPVwieyAnaGVhZGVyLXN5bm9wc2lzLWdyYWRpZW50JzogYmFubmVyVXJsIH1cIiAqbmdJZj1cImNvbnRlbnQgJiYgYmF0Y2hDb250cm9sPy52YWx1ZT8uYmF0Y2hBdHRyaWJ1dGVzPy5iYXRjaExvY2F0aW9uRGV0YWlsc1wiPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU1cIj5cclxuICAgIDxoMj57eydhcHB0b2NiYW5uZXIuYmF0Y2hMb2NhdGlvbicgfCB0cmFuc2xhdGV9fTwvaDI+XHJcbiAgICA8cD57e2JhdGNoQ29udHJvbD8udmFsdWU/LmJhdGNoQXR0cmlidXRlcz8uYmF0Y2hMb2NhdGlvbkRldGFpbHN9fTwvcD5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+IC0tPlxyXG5cclxuPG1hdC1tZW51ICNhY3Rpb25NZW51PVwibWF0TWVudVwiPlxyXG4gIDxkaXYgbWF0LW1lbnUtaXRlbT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50XCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWN0aW9uc1wiPjwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG48L21hdC1tZW51PlxyXG5cclxuPG5nLXRlbXBsYXRlICNhY3Rpb25zPlxyXG4gIDxhIGkxOG4tYXJpYS1sYWJlbCBhcmlhLWxhYmVsPVwiVGFrZSBBY3Rpb25cIiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCJyZXZpZXdCdXR0b25cIlxyXG4gICAgW3JvdXRlckxpbmtdPVwiWycvYXV0aG9yL2VkaXRvci8nICsgY29udGVudD8uaWRlbnRpZmllcl1cIj5cclxuICAgIDxtYXQtaWNvbj5wdWJsaXNoPC9tYXQtaWNvbj5cclxuICA8L2E+XHJcbiAgPHdzLXdpZGdldC1idG4tY29udGVudC1kb3dubG9hZCBpZD1cInByZXZmb3Jkb3dubG9hZFwiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIlxyXG4gICAgW3dpZGdldERhdGFdPVwiY29udGVudCB8IHBpcGVQYXJ0aWFsQ29udGVudCA6IFsnaWRlbnRpZmllcicsICdjb250ZW50VHlwZScsICdyZXNvdXJjZVR5cGUnLCAnbWltZVR5cGUnLCAnZG93bmxvYWRVcmwnLCAnaXNFeHRlcm5hbCcsICdhcnRpZmFjdFVybCddXCI+XHJcbiAgPC93cy13aWRnZXQtYnRuLWNvbnRlbnQtZG93bmxvYWQ+XHJcbiAgPHdzLXdpZGdldC1idG4tY29udGVudC1zaGFyZSBpZD1cInByZXZmb3JzaGFyZVwiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbd2lkZ2V0RGF0YV09XCJjb250ZW50XCI+XHJcbiAgPC93cy13aWRnZXQtYnRuLWNvbnRlbnQtc2hhcmU+XHJcbiAgPHdzLXdpZGdldC1idG4ta2IgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIGlkPVwicHJldlwiIFtjb250ZW50SWRdPVwiY29udGVudD8uaWRlbnRpZmllclwiXHJcbiAgICBbY29udGVudE5hbWVdPVwiY29udGVudFJlYWREYXRhPy5uYW1lXCIgW2NvbnRlbnRUeXBlXT1cImNvbnRlbnQ/LmNvbnRlbnRUeXBlXCIgW3N0YXR1c109XCJjb250ZW50Py5zdGF0dXNcIj5cclxuICA8L3dzLXdpZGdldC1idG4ta2I+XHJcbiAgPHdzLXdpZGdldC1idG4tZ29hbHMgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIGlkPVwiZ29hbHNmb3JwcmV2XCIgKm5nSWY9XCJpc0dvYWxzRW5hYmxlZCAmJiBidG5Hb2Fsc0NvbmZpZ1wiXHJcbiAgICBbd2lkZ2V0RGF0YV09XCJidG5Hb2Fsc0NvbmZpZ1wiPlxyXG4gIDwvd3Mtd2lkZ2V0LWJ0bi1nb2Fscz5cclxuICA8d3Mtd2lkZ2V0LWJ0bi1wbGF5bGlzdCBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCIgaWQ9XCJwbGF5bGlzdGZvcnByZXZcIiAqbmdJZj1cImJ0blBsYXlsaXN0Q29uZmlnXCJcclxuICAgIFt3aWRnZXREYXRhXT1cImJ0blBsYXlsaXN0Q29uZmlnXCI+XHJcbiAgPC93cy13aWRnZXQtYnRuLXBsYXlsaXN0PlxyXG4gIDx3cy13aWRnZXQtYnRuLWNvbnRlbnQtZmVlZGJhY2stdjIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIGlkPVwiZmVlZGJhY2tmb3JwcmV2XCJcclxuICAgIFt3aWRnZXREYXRhXT1cImNvbnRlbnQgfCBwaXBlUGFydGlhbENvbnRlbnQ6IFsnaWRlbnRpZmllcicsICduYW1lJ11cIj5cclxuICA8L3dzLXdpZGdldC1idG4tY29udGVudC1mZWVkYmFjay12Mj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNhdXRoVmlldz57eydhcHB0b2NiYW5uZXIudmlldycgfCB0cmFuc2xhdGV9fTwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjc3RhdHVzTXNnPlxyXG4gIDxkaXYgY2xhc3M9XCJzdGF0dXMtY29udGFpbmVyIG10LTIgbWItMlwiXHJcbiAgICAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSAmJiBiYXRjaERhdGE/LndvcmtGbG93Py53ZkluaXRpYXRlZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXhcIiAqbmdJZj1cInNob3dNc2dcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dJY29uXCI+XHJcbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibXItNFwiIFtuZ0NsYXNzXT1cImljb25Db2xvclwiICpuZ0lmPVwiV0ZJY29uID09PSAnY2lyY2xlJ1wiPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XHJcbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibXItNCB3cy1tYXQtcmVkLXRleHQgdmlzaWJpbGl0eS1zaG93XCIgc3R5bGU9XCJ0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1wiXHJcbiAgICAgICAgICAqbmdJZj1cIldGSWNvbiA9PT0gJ2luZm8nXCI+aW5mbzwvbWF0LWljb24+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWF0LWJvZHktMVwiPnt7IGdldFdGTXNnIH19PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwic3RhdHVzLWNvbnRhaW5lciBtdC01XCJcclxuICAgICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNICYmIHNob3dEaXNhYmxlTXNnICYmICFzaG93TXNnICYmIGZpbmRNZXNzYWdlLmxlbmd0aCA+IDBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibXItMyB3cy1tYXQtcmVkLXRleHRcIiBzdHlsZT1cInRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XCI+aW5mbzwvbWF0LWljb24+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWF0LWJvZHktMVwiPlxyXG4gICAgICAgIDxwIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gXCI+e3tmaW5kTWVzc2FnZX19PC9wPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPGRpdiBjbGFzcz1cInNoYXJlLWNvbnRhaW5lclwiICpuZ0lmPVwiZW5hYmxlU2hhcmVcIj5cclxuICA8ZGl2ICpuZ0lmPVwic2hvd0xvYWRlclwiIGNsYXNzPVwidGV4dC1jZW50ZXIgbXktMiBsb2FkZXJcIj5cclxuICAgIDxtYXQtc3Bpbm5lciBjbGFzcz1cImlubGluZS1ibG9ja1wiPjwvbWF0LXNwaW5uZXI+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGNsb3NlLXNoYXJlLWRpYWxvZ1wiPjxtYXQtaWNvbiAoY2xpY2spPVwib25DbG9zZSgpXCIgY2xhc3M9XCJjbG9zZS1pY29uXCI+Y2xvc2U8L21hdC1pY29uPjwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJzaGFyZS1tb2RhbFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImthcm1hc2FoYXlvZ2ktaWNvblwiPjxpbWcgYWx0PVwia2FybWFzYWhheW9naS1pY29uXCIgc3JjPVwiL2Fzc2V0cy9pY29ucy9LYXJtYVNhaGF5b2dpLnN2Z1wiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtZGl2XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0cmlhbmdsZS1sZWZ0IGhpZGRlbiBtZDpibG9ja1wiPjwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29udG5ldFwiPlxyXG4gICAgICAgIDxzZWN0aW9uIGNsYXNzPVwidy1mdWxsIGZsZXggYWxpZ24tY2VudGVyIGp1c3RpZnktYmV0d2VlbiBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XHJcbiAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC1oZWFkbGluZSBtYXJnaW4tcmVtb3ZlLWJvdHRvbSB3cy1tYXQtYmxhY2stdGV4dFwiPnt7J2NvbnRlbnRTaGFyaW5nLmhlYWRlcicgfCB0cmFuc2xhdGV9fTwvaDI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJzaGFyZUZvcm1cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtYm9keS0yXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZC01XCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1saXN0ICNjaGlwTGlzdCBhcmlhLWxhYmVsPVwidXNlciBzZWxlY3Rpb25cIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWNoaXAgKm5nRm9yPVwibGV0IHVzZXIgb2YgdXNlcnNcIiBbc2VsZWN0YWJsZV09XCJzZWxlY3RhYmxlXCIgW3JlbW92YWJsZV09XCJyZW1vdmFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChyZW1vdmVkKT1cInJlbW92ZSh1c2VyKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7dXNlcn19XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdENoaXBSZW1vdmUgKm5nSWY9XCJyZW1vdmFibGVcIj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXA+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0YWJpbmRleD1cIi0xXCIgY2xhc3M9XCJpbnB1dFRleHRCb3hcIlxyXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3t1c2Vycy5sZW5ndGggPT09IDAgPyB0cmFuc2xhdGVMYWJlbHMoJ3BsYWNlaG9kZXJUZXh0JywgJ2NvbnRlbnRTaGFyaW5nJykgOiAnJ319XCJcclxuICAgICAgICAgICAgICAgICAgICAjdXNlcklucHV0IGZvcm1Db250cm9sTmFtZT1cInJldmlld1wiIFtmb3JtQ29udHJvbF09XCJ1c2VyQ3RybFwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdFwiIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJzZXBhcmF0b3JLZXlzQ29kZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRBZGRPbkJsdXJdPVwiYWRkT25CbHVyXCIgKG1hdENoaXBJbnB1dFRva2VuRW5kKT1cImFkZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1jaGlwLWxpc3Q+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiIChvcHRpb25TZWxlY3RlZCk9XCJzZWxlY3RlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB1c2VyIG9mIGZpbHRlcmVkVXNlcnNcIiBbdmFsdWVdPVwidXNlci5uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uRGl2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblRleHRcIj57e3VzZXIuaWNvblRleHQuc3Vic3RyaW5nKDAsMil9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e3VzZXIubmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbWFpbFRleHRcIj57e3VzZXIubWFza2VkRW1haWx9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgICAgICAgIDxtYXQtaGludCBhbGlnbj1cInN0YXJ0XCIgY2xhc3M9XCJsZWZ0LW92ZXItZW1haWxzXCI+e3snY29udGVudFNoYXJpbmcubm90ZScgfCB0cmFuc2xhdGV9fTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWhpbnQgYWxpZ249XCJlbmRcIiBjbGFzcz1cImxlZnQtb3Zlci1lbWFpbHNcIj57eyB1c2Vycy5sZW5ndGggfX0gL3t7bWF4RW1haWxzTGltaXR9fVxyXG4gICAgICAgICAgICAgICAgICB7eydjb250ZW50U2hhcmluZy5yZW1haW5nRW1haWxzJyB8IHRyYW5zbGF0ZX19PC9tYXQtaGludD5cclxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggbXQtNVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMSBmbGV4LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb3B5LWxpbmstYnRuIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImNvcHlUb0NsaXBib2FyZCgpXCI+e3snY29udGVudFNoYXJpbmcuY29weUxpbmsnIHxcclxuICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX0gJm5ic3A7Jm5ic3A7PG1hdC1pY29uPmxpbms8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIHR5cGU9XCJzdWJtaXRcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGUtc2VuZC1idG4nOiB1c2Vycy5sZW5ndGggPT09IDAgfHwgdXNlcnMubGVuZ3RofVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC13aGl0ZSB3cy1tYXQtcHJpbWFyeS1iYWNrZ3JvdW5kIGZsZXgtYXV0by1kaXNwbGF5IHNlbmQtYnRuXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInVzZXJDdHJsLnZhbHVlLmxlbmd0aCB8fCB1c2Vycy5sZW5ndGggPT09IDAgfHwgdXNlcnMubGVuZ3RoID4gbWF4RW1haWxzTGltaXRcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3VibWl0U2hhcmluZygpXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7J2NvbnRlbnRTaGFyaW5nLnNlbmQnIHwgdHJhbnNsYXRlfX0gJm5ic3A7IDxtYXQtaWNvbj5zZW5kPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNiYXRjaERyb3Bkb3duPlxyXG4gIDxmb3JtIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJhdGNoRGF0YSAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZFxyXG4gICAgICAmJiAoIWJhdGNoRGF0YS53b3JrRmxvdz8ud2ZJbml0aWF0ZWQgfHwgKGJhdGNoRGF0YS53b3JrRmxvdz8ud2ZJbml0aWF0ZWQgJiYgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlJFSkVDVEVEIHx8ICBiYXRjaERhdGE/LndvcmtGbG93Py53Zkl0ZW0/LmN1cnJlbnRTdGF0dXMgPT09IFdGQmxlbmRlZFByb2dyYW1TdGF0dXMuV0lUSERSQVdOIHx8IGJhdGNoRGF0YT8ud29ya0Zsb3c/LndmSXRlbT8uY3VycmVudFN0YXR1cyA9PT0gV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRU1PVkVEKSlcclxuICAgICAgJiYgYmF0Y2hEYXRhPy5jb250ZW50Py5sZW5ndGhcIj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGwgYmF0Y2gtZm9ybS1maWVsZFwiPlxyXG4gICAgICAgIDxtYXQtc2VsZWN0ICNiYXRjaENvbnRyb2xEYXRhIFtmb3JtQ29udHJvbF09XCJiYXRjaENvbnRyb2xcIiByZXF1aXJlZCBhdXRvU2VsY3RGaXJzdE9wdGlvblxyXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJiYXRjaENoYW5nZSgkZXZlbnQpXCIgcGFuZWxDbGFzcz1cImJhdGNoLWRyb3Bkb3duXCI+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgYmF0Y2ggb2YgYmF0Y2hEYXRhLmNvbnRlbnQ7IGxldCBpPWluZGV4XCIgW3ZhbHVlXT1cImJhdGNoXCIgc2VsZWN0ZWQ9XCJpbmRleCA9PT0gMFwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFuZGxlRW5yb2xsbWVudEVuZERhdGUoYmF0Y2gpIHx8IGRpc2FibGVFbnJvbGxCdG4gXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgdGV4dC1zbSBiYXRjaC10aW1pbmdzXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBiYXRjaC5uYW1lIH19ICgge3sgYmF0Y2guc3RhcnREYXRlIHwgZGF0ZTogJ2QgTU1NLCB5eXl5JyB9fSAtIHt7IGJhdGNoLmVuZERhdGUgfCBkYXRlOiAnZCBNTU0sIHl5eXknXHJcbiAgICAgICAgICAgICAgICB8fCAncHJlc2VudCcgfX0gKVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleHBpcmVkXCIgKm5nSWY9XCIhaGFuZGxlRW5yb2xsbWVudEVuZERhdGUoYmF0Y2gpIHx8IGRpc2FibGVFbnJvbGxCdG5cIj5cclxuICAgICAgICAgICAgICAgIEV4cGlyZWRcclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJiYXRjaENvbnRyb2wuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5QbGVhc2UgY2hvb3NlIGEgYmF0Y2ggdG8gc3RhcnQgY291cnNlPC9tYXQtZXJyb3I+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtM1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2hvd1JlamVjdGVkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xXCIgKm5nSWY9XCJzZWxlY3RlZEJhdGNoICYmIHNlbGVjdGVkQmF0Y2guZW5yb2xsbWVudEVuZERhdGUgXCI+XHJcbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXhzIGxlYWRpbmctNCBtYi0wXCI+TGFzdCBlbnJvbGwgZGF0ZTwvcD5cclxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtYm9sZCBtYi0wXCI+e3sgc2VsZWN0ZWRCYXRjaC5lbnJvbGxtZW50RW5kRGF0ZSB8IGRhdGU6ICdkIE1NTSwgeScgfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImVucm9sbC1idXR0b25cIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2Rpc2FibGUtYnRuJzogZGlzYWJsZUVucm9sbEJ0biB8fCBiYXRjaENvbnRyb2wuaGFzRXJyb3IoJ3JlcXVpcmVkJykgfHwgIWhhbmRsZUVucm9sbG1lbnRFbmREYXRlKHNlbGVjdGVkQmF0Y2gpIH1cIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlRW5yb2xsQnRuIHx8IGJhdGNoQ29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKXx8ICFoYW5kbGVFbnJvbGxtZW50RW5kRGF0ZShzZWxlY3RlZEJhdGNoKVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlcXVlc3RUb0Vucm9sbERpYWxvZygpXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIFJlcXVlc3QgdG8gZW5yb2xsXHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dSZWplY3RlZCAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU1cIj5cclxuICAgICAgICAgIDxoMyBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIG1hdC1ib2R5LTIgd3MtZGVmYXVsdC10ZXh0XCI+XHJcbiAgICAgICAgICAgIFlvdXIgZW5yb2xsbWVudCByZXF1ZXN0IGlzIHt7YmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlJFTU9WRURcclxuICAgICAgICAgICAgPydyZW1vdmVkJzoncmVqZWN0ZWQnfX0uPC9oMz5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Zvcm0+XHJcbjwvbmctdGVtcGxhdGU+Il19