@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,500 +1,590 @@
1
- import { NsContent } from '../_services/widget-content.model';
2
- import { Inject, Injectable } from '@angular/core';
3
- import { noop, Subject } from 'rxjs';
4
- import dayjs from 'dayjs';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common/http";
7
- import * as i2 from "@sunbird-cb/utils-v2";
8
- import * as i3 from "../_collection-api";
9
- import * as i4 from "./app-toc.service";
10
- import * as i5 from "@sunbird-cb/consumption";
11
- export class ViewerUtilService {
12
- constructor(http, configservice, contentSvc, tocSvc, userSvc, contentLangSvc, domainConfSvc, environment) {
13
- this.http = http;
14
- this.configservice = configservice;
15
- this.contentSvc = contentSvc;
16
- this.tocSvc = tocSvc;
17
- this.userSvc = userSvc;
18
- this.contentLangSvc = contentLangSvc;
19
- this.domainConfSvc = domainConfSvc;
20
- this.environment = environment;
21
- this.API_ENDPOINTS = {
22
- setS3Cookie: `/apis/v8/protected/content/setCookie`,
23
- // PROGRESS_UPDATE: `/apis/protected/v8/user/realTimeProgress/update`,
24
- PROGRESS_UPDATE: `/apis/proxies/v8/content-progres`,
25
- ASSESSMENT_SECTION: `/apis/proxies/v8/assessment/v5/read`,
26
- GET_FORM_BYID: (formId) => `apis/proxies/v8/forms/v2/getFormById?formId=${formId}`,
27
- SUBMIT_FORM: `/apis/proxies/v8/forms/v2/saveFormSubmit`,
28
- // GET_FORM_BYID: (formId: string) => `apis/proxies/v8/forms/getFormById?id=${formId}`,
29
- // SUBMIT_FORM: `/apis/proxies/v8/forms/v1/saveFormSubmit`,
30
- PRE_ASSESSMENT_STATE_UPDATE: `/apis/proxies/v8/content/v2/state/update`
31
- };
32
- this.downloadRegex = new RegExp(`(/content-store/.*?)(\\\)?\\\\?['"])`, 'gm');
33
- this.authoringBase = '/apis/authContent/';
34
- this.markAsCompleteSubject = new Subject();
35
- this.autoPlayNextVideo = new Subject();
36
- this.autoPlayNextAudio = new Subject();
37
- this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
38
- this.publicUserDetails = {};
39
- this.regexDownloadReplace = (_str = '', group1, group2) => {
40
- return `${this.authoringBase}${encodeURIComponent(group1)}${group2}`;
41
- };
42
- }
43
- async fetchManifestFile(url) {
44
- this.setS3Cookie(url);
45
- const manifestFile = await this.http
46
- .get(url)
47
- .toPromise()
48
- .catch((_err) => { });
49
- return manifestFile;
50
- }
51
- async setS3Cookie(_contentId) {
52
- // await this.http
53
- // .post(this.API_ENDPOINTS.setS3Cookie, { contentId })
54
- // .toPromise()
55
- // .catch((_err: any) => { })
56
- return;
57
- }
58
- calculatePercent(current, max, mimeType) {
59
- try {
60
- const temp = [...current];
61
- if (temp && temp.length && max) {
62
- const latest = parseFloat(temp.pop() || '0');
63
- const percentMilis = (latest / max) * 100;
64
- let percent = parseFloat(percentMilis.toFixed(2));
65
- if (mimeType === NsContent.EMimeTypes.MP4 ||
66
- mimeType === NsContent.EMimeTypes.M3U8 ||
67
- mimeType === NsContent.EMimeTypes.MP3 ||
68
- mimeType === NsContent.EMimeTypes.M4A ||
69
- mimeType === NsContent.EMimeTypes.YOUTUBE ||
70
- mimeType === NsContent.EMimeTypes.SURVEY) {
71
- if (percent <= 5) {
72
- // if percentage is less than 5% make it 0
73
- percent = 0;
74
- }
75
- else if (percent >= 95) {
76
- // if percentage is greater than 95% make it 100
77
- percent = 100;
78
- }
79
- }
80
- return percent;
81
- }
82
- return 0;
83
- }
84
- catch (e) {
85
- return 0;
86
- }
87
- }
88
- getStatus(current, max, mimeType) {
89
- try {
90
- const percentage = this.calculatePercent(current, max, mimeType);
91
- // for videos and audios
92
- if (mimeType === NsContent.EMimeTypes.MP4 ||
93
- mimeType === NsContent.EMimeTypes.M3U8 ||
94
- mimeType === NsContent.EMimeTypes.MP3 ||
95
- mimeType === NsContent.EMimeTypes.M4A ||
96
- mimeType === NsContent.EMimeTypes.SURVEY ||
97
- mimeType === NsContent.EMimeTypes.PDF) {
98
- // if percentage is less than 5% then make status started
99
- if (Math.ceil(percentage) <= 5) {
100
- return 1;
101
- }
102
- // if percentage is greater than 95% then make status complete
103
- if (Math.ceil(percentage) >= 95) {
104
- return 2;
105
- }
106
- }
107
- else {
108
- if (Math.ceil(percentage) >= 100) {
109
- return 2;
110
- }
111
- }
112
- return 1;
113
- }
114
- catch (e) {
115
- return 1;
116
- }
117
- }
118
- realTimeProgressUpdate(contentId, request, collectionId, batchId) {
119
- let req;
120
- if (this.configservice.userProfile) {
121
- const language = this.getResourceContentLanguage(contentId);
122
- req = {
123
- request: {
124
- userId: this.configservice.userProfile.userId || '',
125
- contents: [
126
- {
127
- contentId,
128
- batchId,
129
- language,
130
- status: this.getStatus(request.current, request.max_size, request.mime_type),
131
- courseId: collectionId,
132
- lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
133
- progressdetails: {
134
- max_size: request.max_size,
135
- current: request.current,
136
- mimeType: request.mime_type,
137
- },
138
- completionPercentage: this.calculatePercent(request.current, request.max_size, request.mime_type),
139
- },
140
- ],
141
- },
142
- };
143
- // if (this.configservice.cstoken !== '') {
144
- // const headers = new HttpHeaders()
145
- // .set('cstoken', this.configservice.cstoken)
146
- // this.http
147
- // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, { headers } , req)
148
- // .subscribe(noop, noop)
149
- // } else {
150
- // this.http
151
- // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
152
- // .subscribe(noop, noop)
153
- // }
154
- this.http
155
- .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
156
- .subscribe(noop, noop);
157
- if (this.tocSvc.hashmap[contentId] &&
158
- (!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
159
- this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
160
- this.tocSvc.hashmap[contentId]['completionStatus'] = req.request.contents[0].status;
161
- this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
162
- // Trigger milestone lock recomputation for Learning Pathways
163
- this.tocSvc.triggerMilestoneLockUpdate();
164
- }
165
- }
166
- else {
167
- req = {};
168
- // do nothing
169
- }
170
- }
171
- getBatchIdAndCourseId(courseId, batchId, resourceId) {
172
- const tempData = {
173
- courseId,
174
- batchId,
175
- };
176
- const tempContentData = this.contentSvc.currentMetaData;
177
- const tempContentReadData = this.contentSvc.currentContentReadMetaData;
178
- const enrollmentList = this.contentSvc.currentBatchEnrollmentList;
179
- if (!this.forPreview) {
180
- if (tempContentData && tempContentReadData.cumulativeTracking &&
181
- (tempContentData.primaryCategory === NsContent.EPrimaryCategory.PROGRAM ||
182
- tempContentData.primaryCategory === NsContent.EPrimaryCategory.CURATED_PROGRAM
183
- || tempContentData.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM)) {
184
- tempContentData.children.forEach(async (childList) => {
185
- if (childList.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
186
- // tslint:disable-next-line: max-line-length
187
- const courseEnrollmentList = enrollmentList && enrollmentList.filter((v) => v.contentId === childList.identifier);
188
- if (childList.childNodes && childList.childNodes.indexOf(resourceId) !== -1) {
189
- if (courseEnrollmentList && courseEnrollmentList.length > 0) {
190
- tempData.batchId = courseEnrollmentList[courseEnrollmentList.length - 1].batch.batchId;
191
- tempData.courseId = childList.identifier;
192
- }
193
- else {
194
- const data = await this.checkForCourseEnrollment(childList, resourceId, enrollmentList, tempData);
195
- tempData.courseId = data.courseId;
196
- tempData.batchId = data.batchId;
197
- }
198
- }
199
- }
200
- else if (tempContentData.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM) {
201
- if (tempData.courseId === courseId) {
202
- const bPEnrollmentList = enrollmentList.filter((v) => v.contentId === tempContentData.identifier);
203
- if (tempContentData.childNodes && tempContentData.childNodes.indexOf(resourceId) !== -1) {
204
- if (bPEnrollmentList.length > 0) {
205
- tempData.batchId = bPEnrollmentList[bPEnrollmentList.length - 1].batch.batchId;
206
- tempData.courseId = tempContentData.identifier;
207
- }
208
- }
209
- }
210
- }
211
- });
212
- }
213
- }
214
- return tempData;
215
- }
216
- getResourceContentLanguage(resourceId) {
217
- let tempLanguage = 'english';
218
- let languageFound = false;
219
- const tempContentData = this.contentSvc.currentMetaData;
220
- if (!this.forPreview) {
221
- tempContentData.children?.forEach(async (childList) => {
222
- if (childList.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
223
- // tslint:disable-next-line: max-line-length
224
- if (childList.leafNodes && childList.leafNodes.indexOf(resourceId) !== -1) {
225
- tempLanguage = this.contentLangSvc.getContentLanguage(childList);
226
- languageFound = true;
227
- }
228
- }
229
- });
230
- if (!languageFound) {
231
- if (tempContentData.leafNodes && tempContentData.leafNodes.indexOf(resourceId) !== -1) {
232
- tempLanguage = this.contentLangSvc.getContentLanguage(tempContentData);
233
- }
234
- }
235
- }
236
- return tempLanguage;
237
- }
238
- async checkForCourseEnrollment(childList, _resourceId, _enrollmentList, _tempData) {
239
- // tslint:disable-next-line: max-line-length
240
- const courseData = await this.contentSvc.autoAssignBatchApi(childList.identifier).toPromise().then(async (data) => {
241
- if (data) {
242
- // tslint:disable-next-line: max-line-length
243
- const responseData = await this.userSvc.fetchEnrollmentDataByContentId(this.configservice.userProfile?.userId, childList.identifier).toPromise().then(async (res) => {
244
- if (res && res.courses && res.courses.length) {
245
- return res.courses;
246
- }
247
- return [{ courseId: childList.identifier, batchId: '' }];
248
- }).catch((_err) => {
249
- return [{ courseId: childList.identifier, batchId: '' }];
250
- });
251
- this.contentSvc.currentBatchEnrollmentList = [...this.contentSvc.currentBatchEnrollmentList, ...responseData];
252
- return { courseId: childList.identifier, batchId: responseData[0].batchId };
253
- }
254
- }).catch((_err) => {
255
- return [{ courseId: childList.identifier, batchId: '' }];
256
- });
257
- return courseData;
258
- }
259
- realTimeProgressUpdateQuiz(contentId, collectionId, batchId, status) {
260
- let req;
261
- if (this.configservice.userProfile) {
262
- const language = this.getResourceContentLanguage(contentId);
263
- req = {
264
- request: {
265
- userId: this.configservice.userProfile.userId || '',
266
- contents: [
267
- {
268
- contentId,
269
- batchId,
270
- language,
271
- status: status || 2,
272
- courseId: collectionId,
273
- lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
274
- completionPercentage: status === 2 ? 100 : 0,
275
- },
276
- ],
277
- },
278
- };
279
- this.http
280
- .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
281
- .subscribe(noop, noop);
282
- if (this.tocSvc.hashmap && this.tocSvc.hashmap[contentId] && req.request.contents[0]) {
283
- if (this.tocSvc.hashmap[contentId] &&
284
- (!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
285
- this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
286
- this.tocSvc.hashmap[contentId]['completionStatus'] = req.request.contents[0].status;
287
- this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
288
- // Trigger milestone lock recomputation for Learning Pathways
289
- this.tocSvc.triggerMilestoneLockUpdate();
290
- }
291
- }
292
- }
293
- else {
294
- req = {};
295
- // do nothing
296
- }
297
- }
298
- getContent(contentId) {
299
- const forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
300
- let url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
301
- if (!forPreview) {
302
- url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
303
- }
304
- else {
305
- if (window.location.href.includes('editMode=true') && window.location.href.includes('_rc')) {
306
- url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
307
- }
308
- else {
309
- url = `/api/content/v1/read/${contentId}`;
310
- }
311
- }
312
- return this.http.get(
313
- // tslint:disable-next-line:max-line-length
314
- // `/apis/authApi/action/content/hierarchy/${contentId}?rootOrg=${this.configservice.rootOrg || 'igot'}&org=${this.configservice.activeOrg || 'dopt'}`,
315
- url);
316
- }
317
- getAuthoringUrl(url) {
318
- return url
319
- // tslint:disable-next-line:max-line-length
320
- ? `/apis/authContent/${url.includes('/content-store/') ? new URL(url).pathname.slice(1) : encodeURIComponent(url)}`
321
- : '';
322
- }
323
- replaceToAuthUrl(data) {
324
- return JSON.parse(JSON.stringify(data).replace(this.downloadRegex, this.regexDownloadReplace));
325
- }
326
- readSections(assessmentId) {
327
- return `${this.API_ENDPOINTS}/${assessmentId}`;
328
- }
329
- getPublicUrl(url) {
330
- const mainUrl = url.split('/content').pop() || '';
331
- return `${this.environment.contentHost}/${this.environment.contentBucket}/content${mainUrl}`;
332
- }
333
- getCdnUrl(url) {
334
- const mainUrl = url.split('/content').pop() || '';
335
- return `${this.domainConfSvc.getDomainCDNHost()}/${this.environment.cdnContentBucket}/content${mainUrl}`;
336
- }
337
- // fetchContent(
338
- // contentId: string,
339
- // hierarchyType: 'all' | 'minimal' | 'detail' = 'detail'
340
- // ): Observable<NsContent.IContent> {
341
- // let url = ''
342
- // const forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true')
343
- // if (!forPreview) {
344
- // url = `/apis/proxies/v8/action/content/v3/hierarchy/${contentId}?hierarchyType=${hierarchyType}`
345
- // } else {
346
- // url = `/api/course/v1/hierarchy/${contentId}?hierarchyType=${hierarchyType}`
347
- // }
348
- // return this.http.get<NsContent.IContent>(url)
349
- // }
350
- fetchContent(id, type) {
351
- return this.http.get(`/apis/proxies/v8/action/content/v3/hierarchy/${id}?mode=${type}`);
352
- }
353
- updateContentHashMapForAssesstent(contentId, contentProgress) {
354
- if (this.tocSvc.hashmap[contentId] &&
355
- (!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
356
- this.tocSvc.hashmap[contentId]['completionPercentage'] = contentProgress.completionPercentage;
357
- this.tocSvc.hashmap[contentId]['completionStatus'] = contentProgress.status;
358
- this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
359
- }
360
- }
361
- getFormById(formId) {
362
- return this.http.get(this.API_ENDPOINTS.GET_FORM_BYID(formId));
363
- }
364
- submitForm(formData) {
365
- return this.http.post(this.API_ENDPOINTS.SUBMIT_FORM, formData);
366
- }
367
- realTimeProgressUpdateForPreAssessment(contentId, request) {
368
- let req;
369
- if (this.configservice.userProfile) {
370
- req = {
371
- request: {
372
- userId: this.configservice.userProfile.userId || '',
373
- contents: [
374
- {
375
- contentId,
376
- // batchId,
377
- status: this.getStatus(request.current, request.max_size, request.mime_type),
378
- // courseId: collectionId,
379
- lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
380
- progressdetails: {
381
- max_size: request.max_size,
382
- current: request.current,
383
- mimeType: request.mime_type,
384
- },
385
- completionPercentage: this.calculatePercent(request.current, request.max_size, request.mime_type),
386
- },
387
- ],
388
- },
389
- };
390
- // if (this.configservice.cstoken !== '') {
391
- // const headers = new HttpHeaders()
392
- // .set('cstoken', this.configservice.cstoken)
393
- // this.http
394
- // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, { headers } , req)
395
- // .subscribe(noop, noop)
396
- // } else {
397
- // this.http
398
- // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
399
- // .subscribe(noop, noop)
400
- // }
401
- // this.http
402
- // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
403
- // .subscribe(noop, noop)
404
- //const contentIdNew= req.request.contents[0].contentId
405
- // const updatedCompletionPercentage = req.request.contents[0].completionPercentage
406
- // const updatedStatus = req.request.contents[0].status
407
- // // Clone the inner object and update
408
- // const existingContent = this.tocSvc.hashmap[contentIdNew] || {}
409
- // this.tocSvc.hashmap = {
410
- // ...this.tocSvc.hashmap,
411
- // [contentIdNew]: {
412
- // ...existingContent,
413
- // completionPercentage: updatedCompletionPercentage,
414
- // completionStatus: updatedStatus
415
- // }
416
- // }
417
- // console.log('req', JSON.stringify(req))
418
- // console.log('req', req)
419
- const resourceStatus = this.getPreAssessmentResourceStatus(contentId);
420
- if (resourceStatus < 2) {
421
- this.http
422
- .patch(`${this.API_ENDPOINTS.PRE_ASSESSMENT_STATE_UPDATE}`, req)
423
- .subscribe(noop, noop);
424
- }
425
- if (this.tocSvc.hashmap[contentId] &&
426
- (!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
427
- this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
428
- this.tocSvc.hashmap[contentId]['completionStatus'] = req.request.contents[0].status;
429
- this.tocSvc.hashmap[contentId]['parent'] = req.request.contents[0].courseId;
430
- this.tocSvc.hashmap[contentId]['progress'] = req.request.contents[0].progressdetails;
431
- this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
432
- }
433
- // console.log('Updated hashmap:', this.tocSvc.hashmap)
434
- // console.log('this.tocSvc.hashmap---', this.tocSvc.hashmap)
435
- }
436
- else {
437
- req = {};
438
- // do nothing
439
- }
440
- }
441
- realTimeProgressUpdateForPreAssessmentQuiz(contentId, status, mimeType) {
442
- let req;
443
- if (this.configservice.userProfile) {
444
- req = {
445
- request: {
446
- //userId: this.configservice.userProfile.userId || '',
447
- contents: [
448
- {
449
- contentId,
450
- // batchId,
451
- status: status || 2,
452
- // courseId: collectionId,
453
- lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
454
- completionPercentage: status === 2 ? 100.0 : 0,
455
- progressdetails: {
456
- "mimeType": mimeType || "application/vnd.sunbird.questionset"
457
- },
458
- },
459
- ],
460
- },
461
- };
462
- const resourceStatus = this.getPreAssessmentResourceStatus(contentId);
463
- if (resourceStatus < 2) {
464
- this.http
465
- .patch(`${this.API_ENDPOINTS.PRE_ASSESSMENT_STATE_UPDATE}`, req)
466
- .subscribe(noop, noop);
467
- }
468
- if (this.tocSvc.hashmap && this.tocSvc.hashmap[contentId] && req.request.contents[0]) {
469
- if (this.tocSvc.hashmap[contentId] &&
470
- (!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
471
- this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
472
- this.tocSvc.hashmap[contentId]['completionStatus'] = req.request.contents[0].status;
473
- this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
474
- }
475
- }
476
- }
477
- else {
478
- req = {};
479
- // do nothing
480
- }
481
- }
482
- getPreAssessmentResourceStatus(resourceId) {
483
- if (this.tocSvc && this.tocSvc.hashmap && this.tocSvc.hashmap[resourceId]) {
484
- return this.tocSvc.hashmap[resourceId]['completionStatus'] || 1;
485
- }
486
- return 1;
487
- }
488
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerUtilService, deps: [{ token: i1.HttpClient }, { token: i2.ConfigurationsService }, { token: i3.WidgetContentService }, { token: i4.AppTocService }, { token: i5.WidgetUserServiceLib }, { token: i5.ContentLanguageService }, { token: i2.DomainConfService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Injectable }); }
489
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerUtilService, providedIn: 'root' }); }
490
- }
491
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerUtilService, decorators: [{
492
- type: Injectable,
493
- args: [{
494
- providedIn: 'root',
495
- }]
496
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ConfigurationsService }, { type: i3.WidgetContentService }, { type: i4.AppTocService }, { type: i5.WidgetUserServiceLib }, { type: i5.ContentLanguageService }, { type: i2.DomainConfService }, { type: undefined, decorators: [{
497
- type: Inject,
498
- args: ['environment']
499
- }] }]; } });
500
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLXV0aWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9zZXJ2aWNlcy92aWV3ZXItdXRpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVsRCxPQUFPLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNoRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7Ozs7Ozs7QUFRekIsTUFBTSxPQUFPLGlCQUFpQjtJQW9CNUIsWUFDVSxJQUFnQixFQUNoQixhQUFvQyxFQUNwQyxVQUFnQyxFQUNoQyxNQUFxQixFQUNyQixPQUE2QixFQUM3QixjQUFzQyxFQUN0QyxhQUFnQyxFQUNULFdBQWdCO1FBUHZDLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsa0JBQWEsR0FBYixhQUFhLENBQXVCO1FBQ3BDLGVBQVUsR0FBVixVQUFVLENBQXNCO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsWUFBTyxHQUFQLE9BQU8sQ0FBc0I7UUFDN0IsbUJBQWMsR0FBZCxjQUFjLENBQXdCO1FBQ3RDLGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUNULGdCQUFXLEdBQVgsV0FBVyxDQUFLO1FBM0JqRCxrQkFBYSxHQUFHO1lBQ2QsV0FBVyxFQUFFLHNDQUFzQztZQUNuRCxzRUFBc0U7WUFDdEUsZUFBZSxFQUFFLGtDQUFrQztZQUNuRCxrQkFBa0IsRUFBRSxxQ0FBcUM7WUFDekQsYUFBYSxFQUFFLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FBQywrQ0FBK0MsTUFBTSxFQUFFO1lBQzFGLFdBQVcsRUFBRSwwQ0FBMEM7WUFDdkQsdUZBQXVGO1lBQ3ZG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QUFzQixDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUE7b0JBQ3JHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFBO29CQUNuRixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtpQkFDakQ7YUFDRjtTQUNGO2FBQU07WUFDTCxHQUFHLEdBQUcsRUFBRSxDQUFBO1lBQ1IsYUFBYTtTQUNkO0lBQ0gsQ0FBQztJQUVELDhCQUE4QixDQUFDLFVBQWtCO1FBQy9DLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN6RSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFBO1NBQ2hFO1FBQ0QsT0FBTyxDQUFDLENBQUE7SUFDVixDQUFDOytHQWpnQlUsaUJBQWlCLDZQQTRCbEIsYUFBYTttSEE1QlosaUJBQWlCLGNBRmhCLE1BQU07OzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQTZCSSxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25maWd1cmF0aW9uc1NlcnZpY2UsIERvbWFpbkNvbmZTZXJ2aWNlIH0gZnJvbSAnQHN1bmJpcmQtY2IvdXRpbHMtdjInXG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICcuLi9fc2VydmljZXMvd2lkZ2V0LWNvbnRlbnQubW9kZWwnXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xuaW1wb3J0IHsgbm9vcCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXG5pbXBvcnQgeyBBcHBUb2NTZXJ2aWNlIH0gZnJvbSAnLi9hcHAtdG9jLnNlcnZpY2UnXG5pbXBvcnQgeyBDb250ZW50TGFuZ3VhZ2VTZXJ2aWNlLCBXaWRnZXRVc2VyU2VydmljZUxpYiB9IGZyb20gJ0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uJ1xuaW1wb3J0IHsgV2lkZ2V0Q29udGVudFNlcnZpY2UgfSBmcm9tICcuLi9fY29sbGVjdGlvbi1hcGknXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBWaWV3ZXJVdGlsU2VydmljZSB7XG4gIEFQSV9FTkRQT0lOVFMgPSB7XG4gICAgc2V0UzNDb29raWU6IGAvYXBpcy92OC9wcm90ZWN0ZWQvY29udGVudC9zZXRDb29raWVgLFxuICAgIC8vIFBST0dSRVNTX1VQREFURTogYC9hcGlzL3Byb3RlY3RlZC92OC91c2VyL3JlYWxUaW1lUHJvZ3Jlc3MvdXBkYXRlYCxcbiAgICBQUk9HUkVTU19VUERBVEU6IGAvYXBpcy9wcm94aWVzL3Y4L2NvbnRlbnQtcHJvZ3Jlc2AsXG4gICAgQVNTRVNTTUVOVF9TRUNUSU9OOiBgL2FwaXMvcHJveGllcy92OC9hc3Nlc3NtZW50L3Y1L3JlYWRgLFxuICAgIEdFVF9GT1JNX0JZSUQ6IChmb3JtSWQ6IHN0cmluZykgPT4gYGFwaXMvcHJveGllcy92OC9mb3Jtcy92Mi9nZXRGb3JtQnlJZD9mb3JtSWQ9JHtmb3JtSWR9YCxcbiAgICBTVUJNSVRfRk9STTogYC9hcGlzL3Byb3hpZXMvdjgvZm9ybXMvdjIvc2F2ZUZvcm1TdWJtaXRgLFxuICAgIC8vIEdFVF9GT1JNX0JZSUQ6IChmb3JtSWQ6IHN0cmluZykgPT4gYGFwaXMvcHJveGllcy92OC9mb3Jtcy9nZXRGb3JtQnlJZD9pZD0ke2Zvcm1JZH1gLFxuICAgIC8vIFNVQk1JVF9GT1JNOiBgL2FwaXMvcHJveGllcy92OC9mb3Jtcy92MS9zYXZlRm9ybVN1Ym1pdGAsXG4gICAgUFJFX0FTU0VTU01FTlRfU1RBVEVfVVBEQVRFOiBgL2FwaXMvcHJveGllcy92OC9jb250ZW50L3YyL3N0YXRlL3VwZGF0ZWBcblxuICB9XG4gIGRvd25sb2FkUmVnZXggPSBuZXcgUmVnRXhwKGAoL2NvbnRlbnQtc3RvcmUvLio/KShcXFxcXFwpP1xcXFxcXFxcP1snXCJdKWAsICdnbScpXG4gIGF1dGhvcmluZ0Jhc2UgPSAnL2FwaXMvYXV0aENvbnRlbnQvJ1xuICBtYXJrQXNDb21wbGV0ZVN1YmplY3QgPSBuZXcgU3ViamVjdCgpXG4gIGF1dG9QbGF5TmV4dFZpZGVvID0gbmV3IFN1YmplY3QoKVxuICBhdXRvUGxheU5leHRBdWRpbyA9IG5ldyBTdWJqZWN0KClcbiAgZm9yUHJldmlldyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvcHVibGljLycpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcmcHJldmlldz10cnVlJylcbiAgcHVibGljVXNlckRldGFpbHM6IGFueSA9IHt9XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGNvbmZpZ3NlcnZpY2U6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGNvbnRlbnRTdmM6IFdpZGdldENvbnRlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9jU3ZjOiBBcHBUb2NTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclN2YzogV2lkZ2V0VXNlclNlcnZpY2VMaWIsXG4gICAgcHJpdmF0ZSBjb250ZW50TGFuZ1N2YzogQ29udGVudExhbmd1YWdlU2VydmljZSxcbiAgICBwcml2YXRlIGRvbWFpbkNvbmZTdmM6IERvbWFpbkNvbmZTZXJ2aWNlLFxuICAgIEBJbmplY3QoJ2Vudmlyb25tZW50JykgcHJpdmF0ZSBlbnZpcm9ubWVudDogYW55XG4gICkgeyB9XG5cbiAgYXN5bmMgZmV0Y2hNYW5pZmVzdEZpbGUodXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFMzQ29va2llKHVybClcbiAgICBjb25zdCBtYW5pZmVzdEZpbGUgPSBhd2FpdCB0aGlzLmh0dHBcbiAgICAgIC5nZXQ8YW55Pih1cmwpXG4gICAgICAudG9Qcm9taXNlKClcbiAgICAgIC5jYXRjaCgoX2VycjogYW55KSA9PiB7IH0pXG4gICAgcmV0dXJuIG1hbmlmZXN0RmlsZVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRTM0Nvb2tpZShfY29udGVudElkOiBzdHJpbmcpIHtcbiAgICAvLyBhd2FpdCB0aGlzLmh0dHBcbiAgICAvLyAgIC5wb3N0KHRoaXMuQVBJX0VORFBPSU5UUy5zZXRTM0Nvb2tpZSwgeyBjb250ZW50SWQgfSlcbiAgICAvLyAgIC50b1Byb21pc2UoKVxuICAgIC8vICAgLmNhdGNoKChfZXJyOiBhbnkpID0+IHsgfSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNhbGN1bGF0ZVBlcmNlbnQoY3VycmVudDogc3RyaW5nW10sIG1heDogbnVtYmVyLCBtaW1lVHlwZT86IHN0cmluZyk6IG51bWJlciB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbXAgPSBbLi4uY3VycmVudF1cbiAgICAgIGlmICh0ZW1wICYmIHRlbXAubGVuZ3RoICYmIG1heCkge1xuICAgICAgICBjb25zdCBsYXRlc3QgPSBwYXJzZUZsb2F0KHRlbXAucG9wKCkgfHwgJzAnKVxuICAgICAgICBjb25zdCBwZXJjZW50TWlsaXMgPSAobGF0ZXN0IC8gbWF4KSAqIDEwMFxuICAgICAgICBsZXQgcGVyY2VudCA9IHBhcnNlRmxvYXQocGVyY2VudE1pbGlzLnRvRml4ZWQoMikpXG4gICAgICAgIGlmIChcbiAgICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTVA0IHx8XG4gICAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk0zVTggfHxcbiAgICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTVAzIHx8XG4gICAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk00QSB8fFxuICAgICAgICAgIG1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5ZT1VUVUJFIHx8XG4gICAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLlNVUlZFWVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAocGVyY2VudCA8PSA1KSB7XG4gICAgICAgICAgICAvLyBpZiBwZXJjZW50YWdlIGlzIGxlc3MgdGhhbiA1JSBtYWtlIGl0IDBcbiAgICAgICAgICAgIHBlcmNlbnQgPSAwXG4gICAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50ID49IDk1KSB7XG4gICAgICAgICAgICAvLyBpZiBwZXJjZW50YWdlIGlzIGdyZWF0ZXIgdGhhbiA5NSUgbWFrZSBpdCAxMDBcbiAgICAgICAgICAgIHBlcmNlbnQgPSAxMDBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBlcmNlbnRcbiAgICAgIH1cbiAgICAgIHJldHVybiAwXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG4gIH1cblxuICBnZXRTdGF0dXMoY3VycmVudDogc3RyaW5nW10sIG1heDogbnVtYmVyLCBtaW1lVHlwZT86IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gdGhpcy5jYWxjdWxhdGVQZXJjZW50KGN1cnJlbnQsIG1heCwgbWltZVR5cGUpXG4gICAgICAvLyBmb3IgdmlkZW9zIGFuZCBhdWRpb3NcbiAgICAgIGlmIChcbiAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk1QNCB8fFxuICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTTNVOCB8fFxuICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTVAzIHx8XG4gICAgICAgIG1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5NNEEgfHxcbiAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLlNVUlZFWSB8fFxuICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuUERGXG4gICAgICApIHtcbiAgICAgICAgLy8gaWYgcGVyY2VudGFnZSBpcyBsZXNzIHRoYW4gNSUgdGhlbiBtYWtlIHN0YXR1cyBzdGFydGVkXG4gICAgICAgIGlmIChNYXRoLmNlaWwocGVyY2VudGFnZSkgPD0gNSkge1xuICAgICAgICAgIHJldHVybiAxXG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgcGVyY2VudGFnZSBpcyBncmVhdGVyIHRoYW4gOTUlIHRoZW4gbWFrZSBzdGF0dXMgY29tcGxldGVcbiAgICAgICAgaWYgKE1hdGguY2VpbChwZXJjZW50YWdlKSA+PSA5NSkge1xuICAgICAgICAgIHJldHVybiAyXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChNYXRoLmNlaWwocGVyY2VudGFnZSkgPj0gMTAwKSB7XG4gICAgICAgICAgcmV0dXJuIDJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIDFcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gMVxuICAgIH1cbiAgfVxuXG4gIHJlYWxUaW1lUHJvZ3Jlc3NVcGRhdGUoY29udGVudElkOiBzdHJpbmcsIHJlcXVlc3Q6IGFueSwgY29sbGVjdGlvbklkPzogc3RyaW5nLCBiYXRjaElkPzogc3RyaW5nKSB7XG4gICAgbGV0IHJlcTogYW55XG4gICAgaWYgKHRoaXMuY29uZmlnc2VydmljZS51c2VyUHJvZmlsZSkge1xuICAgICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmdldFJlc291cmNlQ29udGVudExhbmd1YWdlKGNvbnRlbnRJZClcbiAgICAgIHJlcSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIHVzZXJJZDogdGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlLnVzZXJJZCB8fCAnJyxcbiAgICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb250ZW50SWQsXG4gICAgICAgICAgICAgIGJhdGNoSWQsXG4gICAgICAgICAgICAgIGxhbmd1YWdlLFxuICAgICAgICAgICAgICBzdGF0dXM6IHRoaXMuZ2V0U3RhdHVzKHJlcXVlc3QuY3VycmVudCwgcmVxdWVzdC5tYXhfc2l6ZSwgcmVxdWVzdC5taW1lX3R5cGUpLFxuICAgICAgICAgICAgICBjb3Vyc2VJZDogY29sbGVjdGlvbklkLFxuICAgICAgICAgICAgICBsYXN0QWNjZXNzVGltZTogZGF5anMobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzOlNTU1paJyksXG4gICAgICAgICAgICAgIHByb2dyZXNzZGV0YWlsczoge1xuICAgICAgICAgICAgICAgIG1heF9zaXplOiByZXF1ZXN0Lm1heF9zaXplLFxuICAgICAgICAgICAgICAgIGN1cnJlbnQ6IHJlcXVlc3QuY3VycmVudCxcbiAgICAgICAgICAgICAgICBtaW1lVHlwZTogcmVxdWVzdC5taW1lX3R5cGUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiB0aGlzLmNhbGN1bGF0ZVBlcmNlbnQocmVxdWVzdC5jdXJyZW50LCByZXF1ZXN0Lm1heF9zaXplLCByZXF1ZXN0Lm1pbWVfdHlwZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgICAvLyBpZiAodGhpcy5jb25maWdzZXJ2aWNlLmNzdG9rZW4gIT09ICcnKSB7XG4gICAgICAvLyAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKVxuICAgICAgLy8gICAuc2V0KCdjc3Rva2VuJywgdGhpcy5jb25maWdzZXJ2aWNlLmNzdG9rZW4pXG5cbiAgICAgIC8vICAgdGhpcy5odHRwXG4gICAgICAvLyAgIC5wYXRjaChgJHt0aGlzLkFQSV9FTkRQT0lOVFMuUFJPR1JFU1NfVVBEQVRFfS8ke2NvbnRlbnRJZH1gLCB7IGhlYWRlcnMgfSAsIHJlcSlcbiAgICAgIC8vICAgLnN1YnNjcmliZShub29wLCBub29wKVxuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgdGhpcy5odHRwXG4gICAgICAvLyAgIC5wYXRjaChgJHt0aGlzLkFQSV9FTkRQT0lOVFMuUFJPR1JFU1NfVVBEQVRFfS8ke2NvbnRlbnRJZH1gLCByZXEpXG4gICAgICAvLyAgIC5zdWJzY3JpYmUobm9vcCwgbm9vcClcbiAgICAgIC8vIH1cbiAgICAgIHRoaXMuaHR0cFxuICAgICAgICAucGF0Y2goYCR7dGhpcy5BUElfRU5EUE9JTlRTLlBST0dSRVNTX1VQREFURX0vJHtjb250ZW50SWR9YCwgcmVxKVxuICAgICAgICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXG4gICAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdICYmXG4gICAgICAgICghdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPCAyKSkge1xuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSByZXEucmVxdWVzdC5jb250ZW50c1swXS5jb21wbGV0aW9uUGVyY2VudGFnZVxuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLnN0YXR1c1xuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFRyaWdnZXIgbWlsZXN0b25lIGxvY2sgcmVjb21wdXRhdGlvbiBmb3IgTGVhcm5pbmcgUGF0aHdheXNcbiAgICAgICAgdGhpcy50b2NTdmMudHJpZ2dlck1pbGVzdG9uZUxvY2tVcGRhdGUoKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXEgPSB7fVxuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfVxuXG4gIGdldEJhdGNoSWRBbmRDb3Vyc2VJZChjb3Vyc2VJZDogc3RyaW5nLCBiYXRjaElkOiBzdHJpbmcsIHJlc291cmNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHRlbXBEYXRhID0ge1xuICAgICAgY291cnNlSWQsXG4gICAgICBiYXRjaElkLFxuICAgIH1cbiAgICBjb25zdCB0ZW1wQ29udGVudERhdGEgPSB0aGlzLmNvbnRlbnRTdmMuY3VycmVudE1ldGFEYXRhXG4gICAgY29uc3QgdGVtcENvbnRlbnRSZWFkRGF0YSA9IHRoaXMuY29udGVudFN2Yy5jdXJyZW50Q29udGVudFJlYWRNZXRhRGF0YVxuICAgIGNvbnN0IGVucm9sbG1lbnRMaXN0ID0gdGhpcy5jb250ZW50U3ZjLmN1cnJlbnRCYXRjaEVucm9sbG1lbnRMaXN0XG4gICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgIGlmICh0ZW1wQ29udGVudERhdGEgJiYgdGVtcENvbnRlbnRSZWFkRGF0YS5jdW11bGF0aXZlVHJhY2tpbmcgJiZcbiAgICAgICAgKHRlbXBDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gfHxcbiAgICAgICAgICB0ZW1wQ29udGVudERhdGEucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU1cbiAgICAgICAgICB8fCB0ZW1wQ29udGVudERhdGEucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU1cbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRlbXBDb250ZW50RGF0YS5jaGlsZHJlbi5mb3JFYWNoKGFzeW5jIChjaGlsZExpc3Q6IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZExpc3QucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICBjb25zdCBjb3Vyc2VFbnJvbGxtZW50TGlzdCA9IGVucm9sbG1lbnRMaXN0ICYmIGVucm9sbG1lbnRMaXN0LmZpbHRlcigodjogTnNDb250ZW50LklDb3Vyc2UpID0+IHYuY29udGVudElkID09PSBjaGlsZExpc3QuaWRlbnRpZmllcilcbiAgICAgICAgICAgIGlmIChjaGlsZExpc3QuY2hpbGROb2RlcyAmJiBjaGlsZExpc3QuY2hpbGROb2Rlcy5pbmRleE9mKHJlc291cmNlSWQpICE9PSAtMSkge1xuICAgICAgICAgICAgICBpZiAoY291cnNlRW5yb2xsbWVudExpc3QgJiYgY291cnNlRW5yb2xsbWVudExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRlbXBEYXRhLmJhdGNoSWQgPSBjb3Vyc2VFbnJvbGxtZW50TGlzdFtjb3Vyc2VFbnJvbGxtZW50TGlzdC5sZW5ndGggLSAxXS5iYXRjaC5iYXRjaElkXG4gICAgICAgICAgICAgICAgdGVtcERhdGEuY291cnNlSWQgPSBjaGlsZExpc3QuaWRlbnRpZmllclxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IGF3YWl0IHRoaXMuY2hlY2tGb3JDb3Vyc2VFbnJvbGxtZW50KGNoaWxkTGlzdCwgcmVzb3VyY2VJZCwgZW5yb2xsbWVudExpc3QsIHRlbXBEYXRhKVxuICAgICAgICAgICAgICAgIHRlbXBEYXRhLmNvdXJzZUlkID0gZGF0YS5jb3Vyc2VJZFxuICAgICAgICAgICAgICAgIHRlbXBEYXRhLmJhdGNoSWQgPSBkYXRhLmJhdGNoSWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodGVtcENvbnRlbnREYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNKSB7XG4gICAgICAgICAgICBpZiAodGVtcERhdGEuY291cnNlSWQgPT09IGNvdXJzZUlkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGJQRW5yb2xsbWVudExpc3QgPSBlbnJvbGxtZW50TGlzdC5maWx0ZXIoKHY6IE5zQ29udGVudC5JQ291cnNlKSA9PiB2LmNvbnRlbnRJZCA9PT0gdGVtcENvbnRlbnREYXRhLmlkZW50aWZpZXIpXG4gICAgICAgICAgICAgIGlmICh0ZW1wQ29udGVudERhdGEuY2hpbGROb2RlcyAmJiB0ZW1wQ29udGVudERhdGEuY2hpbGROb2Rlcy5pbmRleE9mKHJlc291cmNlSWQpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChiUEVucm9sbG1lbnRMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHRlbXBEYXRhLmJhdGNoSWQgPSBiUEVucm9sbG1lbnRMaXN0W2JQRW5yb2xsbWVudExpc3QubGVuZ3RoIC0gMV0uYmF0Y2guYmF0Y2hJZFxuICAgICAgICAgICAgICAgICAgdGVtcERhdGEuY291cnNlSWQgPSB0ZW1wQ29udGVudERhdGEuaWRlbnRpZmllclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRlbXBEYXRhXG4gIH1cblxuICBnZXRSZXNvdXJjZUNvbnRlbnRMYW5ndWFnZShyZXNvdXJjZUlkOiBzdHJpbmcpIHtcblxuICAgIGxldCB0ZW1wTGFuZ3VhZ2U6IGFueSA9ICdlbmdsaXNoJ1xuICAgIGxldCBsYW5ndWFnZUZvdW5kID0gZmFsc2VcbiAgICBjb25zdCB0ZW1wQ29udGVudERhdGEgPSB0aGlzLmNvbnRlbnRTdmMuY3VycmVudE1ldGFEYXRhXG4gICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgIHRlbXBDb250ZW50RGF0YS5jaGlsZHJlbj8uZm9yRWFjaChhc3luYyAoY2hpbGRMaXN0OiBOc0NvbnRlbnQuSUNvbnRlbnQpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkTGlzdC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPVVJTRSkge1xuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgaWYgKGNoaWxkTGlzdC5sZWFmTm9kZXMgJiYgY2hpbGRMaXN0LmxlYWZOb2Rlcy5pbmRleE9mKHJlc291cmNlSWQpICE9PSAtMSkge1xuICAgICAgICAgICAgdGVtcExhbmd1YWdlID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRDb250ZW50TGFuZ3VhZ2UoY2hpbGRMaXN0KVxuICAgICAgICAgICAgbGFuZ3VhZ2VGb3VuZCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIClcbiAgICAgIGlmICghbGFuZ3VhZ2VGb3VuZCkge1xuICAgICAgICBpZiAodGVtcENvbnRlbnREYXRhLmxlYWZOb2RlcyAmJiB0ZW1wQ29udGVudERhdGEubGVhZk5vZGVzLmluZGV4T2YocmVzb3VyY2VJZCkgIT09IC0xKSB7XG4gICAgICAgICAgdGVtcExhbmd1YWdlID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRDb250ZW50TGFuZ3VhZ2UodGVtcENvbnRlbnREYXRhKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZW1wTGFuZ3VhZ2VcbiAgfVxuXG4gIGFzeW5jIGNoZWNrRm9yQ291cnNlRW5yb2xsbWVudChjaGlsZExpc3Q6IE5zQ29udGVudC5JQ29udGVudCwgX3Jlc291cmNlSWQ6IHN0cmluZywgX2Vucm9sbG1lbnRMaXN0OiBhbnksIF90ZW1wRGF0YTogYW55KSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICBjb25zdCBjb3Vyc2VEYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmNvbnRlbnRTdmMuYXV0b0Fzc2lnbkJhdGNoQXBpKGNoaWxkTGlzdC5pZGVudGlmaWVyKS50b1Byb21pc2UoKS50aGVuKGFzeW5jIChkYXRhOiBOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLnVzZXJTdmMuZmV0Y2hFbnJvbGxtZW50RGF0YUJ5Q29udGVudElkKHRoaXMuY29uZmlnc2VydmljZS51c2VyUHJvZmlsZT8udXNlcklkLCBjaGlsZExpc3QuaWRlbnRpZmllcikudG9Qcm9taXNlKCkudGhlbihhc3luYyAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5jb3Vyc2VzICYmIHJlcy5jb3Vyc2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcy5jb3Vyc2VzXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbeyBjb3Vyc2VJZDogY2hpbGRMaXN0LmlkZW50aWZpZXIsIGJhdGNoSWQ6ICcnIH1dXG5cbiAgICAgICAgfSkuY2F0Y2goKF9lcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiBbeyBjb3Vyc2VJZDogY2hpbGRMaXN0LmlkZW50aWZpZXIsIGJhdGNoSWQ6ICcnIH1dXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuY29udGVudFN2Yy5jdXJyZW50QmF0Y2hFbnJvbGxtZW50TGlzdCA9IFsuLi50aGlzLmNvbnRlbnRTdmMuY3VycmVudEJhdGNoRW5yb2xsbWVudExpc3QsIC4uLnJlc3BvbnNlRGF0YV1cbiAgICAgICAgcmV0dXJuIHsgY291cnNlSWQ6IGNoaWxkTGlzdC5pZGVudGlmaWVyLCBiYXRjaElkOiByZXNwb25zZURhdGFbMF0uYmF0Y2hJZCB9XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKF9lcnI6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIFt7IGNvdXJzZUlkOiBjaGlsZExpc3QuaWRlbnRpZmllciwgYmF0Y2hJZDogJycgfV1cbiAgICB9KVxuICAgIHJldHVybiBjb3Vyc2VEYXRhXG4gIH1cblxuICByZWFsVGltZVByb2dyZXNzVXBkYXRlUXVpeihjb250ZW50SWQ6IHN0cmluZywgY29sbGVjdGlvbklkPzogc3RyaW5nLCBiYXRjaElkPzogc3RyaW5nLCBzdGF0dXM/OiBudW1iZXIpIHtcbiAgICBsZXQgcmVxOiBhbnlcbiAgICBpZiAodGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlKSB7XG4gICAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMuZ2V0UmVzb3VyY2VDb250ZW50TGFuZ3VhZ2UoY29udGVudElkKVxuICAgICAgcmVxID0ge1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgdXNlcklkOiB0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUudXNlcklkIHx8ICcnLFxuICAgICAgICAgIGNvbnRlbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnRlbnRJZCxcbiAgICAgICAgICAgICAgYmF0Y2hJZCxcbiAgICAgICAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzIHx8IDIsXG4gICAgICAgICAgICAgIGNvdXJzZUlkOiBjb2xsZWN0aW9uSWQsXG4gICAgICAgICAgICAgIGxhc3RBY2Nlc3NUaW1lOiBkYXlqcyhuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3M6U1NTWlonKSxcbiAgICAgICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IHN0YXR1cyA9PT0gMiA/IDEwMCA6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9XG5cbiAgICAgIHRoaXMuaHR0cFxuICAgICAgICAucGF0Y2goYCR7dGhpcy5BUElfRU5EUE9JTlRTLlBST0dSRVNTX1VQREFURX0vJHtjb250ZW50SWR9YCwgcmVxKVxuICAgICAgICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXG4gICAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcCAmJiB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF0gJiYgcmVxLnJlcXVlc3QuY29udGVudHNbMF0pIHtcbiAgICAgICAgaWYgKHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSAmJlxuICAgICAgICAgICghdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPCAyKSkge1xuICAgICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLmNvbXBsZXRpb25QZXJjZW50YWdlXG4gICAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPSByZXEucmVxdWVzdC5jb250ZW50c1swXS5zdGF0dXNcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBUcmlnZ2VyIG1pbGVzdG9uZSBsb2NrIHJlY29tcHV0YXRpb24gZm9yIExlYXJuaW5nIFBhdGh3YXlzXG4gICAgICAgICAgdGhpcy50b2NTdmMudHJpZ2dlck1pbGVzdG9uZUxvY2tVcGRhdGUoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcSA9IHt9XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgZ2V0Q29udGVudChjb250ZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250ZW50PiB7XG4gICAgY29uc3QgZm9yUHJldmlldyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvcHVibGljLycpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcmcHJldmlldz10cnVlJylcbiAgICBsZXQgdXJsID0gYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvcmVhZC8ke2NvbnRlbnRJZH1gXG4gICAgaWYgKCFmb3JQcmV2aWV3KSB7XG4gICAgICB1cmwgPSBgL2FwaXMvcHJveGllcy92OC9hY3Rpb24vY29udGVudC92My9yZWFkLyR7Y29udGVudElkfWBcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCdlZGl0TW9kZT10cnVlJykgJiYgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ19yYycpKSB7XG4gICAgICAgIHVybCA9IGAvYXBpcy9wcm94aWVzL3Y4L2FjdGlvbi9jb250ZW50L3YzL3JlYWQvJHtjb250ZW50SWR9YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXJsID0gYC9hcGkvY29udGVudC92MS9yZWFkLyR7Y29udGVudElkfWBcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50PihcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgIC8vIGAvYXBpcy9hdXRoQXBpL2FjdGlvbi9jb250ZW50L2hpZXJhcmNoeS8ke2NvbnRlbnRJZH0/cm9vdE9yZz0ke3RoaXMuY29uZmlnc2VydmljZS5yb290T3JnIHx8ICdpZ290J30mb3JnPSR7dGhpcy5jb25maWdzZXJ2aWNlLmFjdGl2ZU9yZyB8fCAnZG9wdCd9YCxcbiAgICAgIHVybFxuICAgIClcbiAgfVxuXG4gIGdldEF1dGhvcmluZ1VybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVybFxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgPyBgL2FwaXMvYXV0aENvbnRlbnQvJHt1cmwuaW5jbHVkZXMoJy9jb250ZW50LXN0b3JlLycpID8gbmV3IFVSTCh1cmwpLnBhdGhuYW1lLnNsaWNlKDEpIDogZW5jb2RlVVJJQ29tcG9uZW50KHVybCl9YFxuICAgICAgOiAnJ1xuICB9XG5cbiAgcmVnZXhEb3dubG9hZFJlcGxhY2UgPSAoX3N0ciA9ICcnLCBncm91cDE6IHN0cmluZywgZ3JvdXAyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBgJHt0aGlzLmF1dGhvcmluZ0Jhc2V9JHtlbmNvZGVVUklDb21wb25lbnQoZ3JvdXAxKX0ke2dyb3VwMn1gXG4gIH1cblxuICByZXBsYWNlVG9BdXRoVXJsKGRhdGE6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgICBKU09OLnN0cmluZ2lmeShkYXRhKS5yZXBsYWNlKFxuICAgICAgICB0aGlzLmRvd25sb2FkUmVnZXgsXG4gICAgICAgIHRoaXMucmVnZXhEb3dubG9hZFJlcGxhY2UsXG4gICAgICApLFxuICAgIClcbiAgfVxuICByZWFkU2VjdGlvbnMoYXNzZXNzbWVudElkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5BUElfRU5EUE9JTlRTfS8ke2Fzc2Vzc21lbnRJZH1gXG4gIH1cblxuICBnZXRQdWJsaWNVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1haW5VcmwgPSB1cmwuc3BsaXQoJy9jb250ZW50JykucG9wKCkgfHwgJydcbiAgICByZXR1cm4gYCR7dGhpcy5lbnZpcm9ubWVudC5jb250ZW50SG9zdH0vJHt0aGlzLmVudmlyb25tZW50LmNvbnRlbnRCdWNrZXR9L2NvbnRlbnQke21haW5Vcmx9YFxuICB9XG5cbiAgZ2V0Q2RuVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtYWluVXJsID0gdXJsLnNwbGl0KCcvY29udGVudCcpLnBvcCgpIHx8ICcnXG4gICAgcmV0dXJuIGAke3RoaXMuZG9tYWluQ29uZlN2Yy5nZXREb21haW5DRE5Ib3N0KCl9LyR7dGhpcy5lbnZpcm9ubWVudC5jZG5Db250ZW50QnVja2V0fS9jb250ZW50JHttYWluVXJsfWBcbiAgfVxuXG4gIC8vICBmZXRjaENvbnRlbnQoXG4gIC8vICAgY29udGVudElkOiBzdHJpbmcsXG4gIC8vICAgaGllcmFyY2h5VHlwZTogJ2FsbCcgfCAnbWluaW1hbCcgfCAnZGV0YWlsJyA9ICdkZXRhaWwnXG4gIC8vICAgKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRlbnQ+IHtcbiAgLy8gICAgIGxldCB1cmwgPSAnJ1xuICAvLyAgICAgY29uc3QgZm9yUHJldmlldyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvcHVibGljLycpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcmcHJldmlldz10cnVlJylcbiAgLy8gICAgICAgaWYgKCFmb3JQcmV2aWV3KSB7XG4gIC8vICAgICAgICAgdXJsID0gYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvaGllcmFyY2h5LyR7Y29udGVudElkfT9oaWVyYXJjaHlUeXBlPSR7aGllcmFyY2h5VHlwZX1gXG4gIC8vICAgICAgIH0gZWxzZSB7XG4gIC8vICAgICAgICAgdXJsID0gYC9hcGkvY291cnNlL3YxL2hpZXJhcmNoeS8ke2NvbnRlbnRJZH0/aGllcmFyY2h5VHlwZT0ke2hpZXJhcmNoeVR5cGV9YFxuICAvLyAgICAgICB9XG4gIC8vICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29udGVudD4odXJsKVxuICAvLyAgIH1cblxuICBmZXRjaENvbnRlbnQoaWQ6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50PihgL2FwaXMvcHJveGllcy92OC9hY3Rpb24vY29udGVudC92My9oaWVyYXJjaHkvJHtpZH0/bW9kZT0ke3R5cGV9YClcbiAgfVxuXG4gIHVwZGF0ZUNvbnRlbnRIYXNoTWFwRm9yQXNzZXNzdGVudChjb250ZW50SWQ6IHN0cmluZywgY29udGVudFByb2dyZXNzOiBhbnkpIHtcbiAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdICYmXG4gICAgICAoIXRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIHx8IHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIDwgMikpIHtcbiAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IGNvbnRlbnRQcm9ncmVzcy5jb21wbGV0aW9uUGVyY2VudGFnZVxuICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPSBjb250ZW50UHJvZ3Jlc3Muc3RhdHVzXG4gICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cbiAgICB9XG4gIH1cblxuICBnZXRGb3JtQnlJZChmb3JtSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuQVBJX0VORFBPSU5UUy5HRVRfRk9STV9CWUlEKGZvcm1JZCkpXG4gIH1cblxuICBzdWJtaXRGb3JtKGZvcm1EYXRhOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55Pih0aGlzLkFQSV9FTkRQT0lOVFMuU1VCTUlUX0ZPUk0sIGZvcm1EYXRhKVxuICB9XG5cbiAgcmVhbFRpbWVQcm9ncmVzc1VwZGF0ZUZvclByZUFzc2Vzc21lbnQoY29udGVudElkOiBzdHJpbmcsIHJlcXVlc3Q6IGFueSkge1xuICAgIGxldCByZXE6IGFueVxuICAgIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUpIHtcbiAgICAgIHJlcSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIHVzZXJJZDogdGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlLnVzZXJJZCB8fCAnJyxcbiAgICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb250ZW50SWQsXG4gICAgICAgICAgICAgIC8vIGJhdGNoSWQsXG4gICAgICAgICAgICAgIHN0YXR1czogdGhpcy5nZXRTdGF0dXMocmVxdWVzdC5jdXJyZW50LCByZXF1ZXN0Lm1heF9zaXplLCByZXF1ZXN0Lm1pbWVfdHlwZSksXG4gICAgICAgICAgICAgIC8vIGNvdXJzZUlkOiBjb2xsZWN0aW9uSWQsXG4gICAgICAgICAgICAgIGxhc3RBY2Nlc3NUaW1lOiBkYXlqcyhuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3M6U1NTWlonKSxcbiAgICAgICAgICAgICAgcHJvZ3Jlc3NkZXRhaWxzOiB7XG4gICAgICAgICAgICAgICAgbWF4X3NpemU6IHJlcXVlc3QubWF4X3NpemUsXG4gICAgICAgICAgICAgICAgY3VycmVudDogcmVxdWVzdC5jdXJyZW50LFxuICAgICAgICAgICAgICAgIG1pbWVUeXBlOiByZXF1ZXN0Lm1pbWVfdHlwZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IHRoaXMuY2FsY3VsYXRlUGVyY2VudChyZXF1ZXN0LmN1cnJlbnQsIHJlcXVlc3QubWF4X3NpemUsIHJlcXVlc3QubWltZV90eXBlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICAgIC8vIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UuY3N0b2tlbiAhPT0gJycpIHtcbiAgICAgIC8vICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpXG4gICAgICAvLyAgIC5zZXQoJ2NzdG9rZW4nLCB0aGlzLmNvbmZpZ3NlcnZpY2UuY3N0b2tlbilcblxuICAgICAgLy8gICB0aGlzLmh0dHBcbiAgICAgIC8vICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHsgaGVhZGVycyB9ICwgcmVxKVxuICAgICAgLy8gICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gICB0aGlzLmh0dHBcbiAgICAgIC8vICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHJlcSlcbiAgICAgIC8vICAgLnN1YnNjcmliZShub29wLCBub29wKVxuICAgICAgLy8gfVxuICAgICAgLy8gdGhpcy5odHRwXG4gICAgICAvLyAgIC5wYXRjaChgJHt0aGlzLkFQSV9FTkRQT0lOVFMuUFJPR1JFU1NfVVBEQVRFfS8ke2NvbnRlbnRJZH1gLCByZXEpXG4gICAgICAvLyAgIC5zdWJzY3JpYmUobm9vcCwgbm9vcClcbiAgICAgIC8vY29uc3QgY29udGVudElkTmV3PSByZXEucmVxdWVzdC5jb250ZW50c1swXS5jb250ZW50SWRcbiAgICAgIC8vIGNvbnN0IHVwZGF0ZWRDb21wbGV0aW9uUGVyY2VudGFnZSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLmNvbXBsZXRpb25QZXJjZW50YWdlXG4gICAgICAvLyBjb25zdCB1cGRhdGVkU3RhdHVzID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uc3RhdHVzXG5cbiAgICAgIC8vIC8vIENsb25lIHRoZSBpbm5lciBvYmplY3QgYW5kIHVwZGF0ZVxuICAgICAgLy8gY29uc3QgZXhpc3RpbmdDb250ZW50ID0gdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWROZXddIHx8IHt9XG5cbiAgICAgIC8vIHRoaXMudG9jU3ZjLmhhc2htYXAgPSB7XG4gICAgICAvLyAgIC4uLnRoaXMudG9jU3ZjLmhhc2htYXAsXG4gICAgICAvLyAgIFtjb250ZW50SWROZXddOiB7XG4gICAgICAvLyAgICAgLi4uZXhpc3RpbmdDb250ZW50LFxuICAgICAgLy8gICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiB1cGRhdGVkQ29tcGxldGlvblBlcmNlbnRhZ2UsXG4gICAgICAvLyAgICAgY29tcGxldGlvblN0YXR1czogdXBkYXRlZFN0YXR1c1xuICAgICAgLy8gICB9XG4gICAgICAvLyB9XG4gICAgICAvLyBjb25zb2xlLmxvZygncmVxJywgSlNPTi5zdHJpbmdpZnkocmVxKSlcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdyZXEnLCByZXEpXG5cbiAgICAgIGNvbnN0IHJlc291cmNlU3RhdHVzID0gdGhpcy5nZXRQcmVBc3Nlc3NtZW50UmVzb3VyY2VTdGF0dXMoY29udGVudElkKVxuICAgICAgaWYgKHJlc291cmNlU3RhdHVzIDwgMikge1xuICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAucGF0Y2goYCR7dGhpcy5BUElfRU5EUE9JTlRTLlBSRV9BU1NFU1NNRU5UX1NUQVRFX1VQREFURX1gLCByZXEpXG4gICAgICAgICAgLnN1YnNjcmliZShub29wLCBub29wKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSAmJlxuICAgICAgICAoIXRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIHx8IHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIDwgMikpIHtcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPSByZXEucmVxdWVzdC5jb250ZW50c1swXS5zdGF0dXNcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydwYXJlbnQnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLmNvdXJzZUlkXG4gICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsncHJvZ3Jlc3MnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLnByb2dyZXNzZGV0YWlsc1xuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cbiAgICAgIH1cblxuICAgICAgLy8gY29uc29sZS5sb2coJ1VwZGF0ZWQgaGFzaG1hcDonLCB0aGlzLnRvY1N2Yy5oYXNobWFwKVxuXG4gICAgICAvLyBjb25zb2xlLmxvZygndGhpcy50b2NTdmMuaGFzaG1hcC0tLScsIHRoaXMudG9jU3ZjLmhhc2htYXApXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcSA9IHt9XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgcmVhbFRpbWVQcm9ncmVzc1VwZGF0ZUZvclByZUFzc2Vzc21lbnRRdWl6KGNvbnRlbnRJZDogc3RyaW5nLCBzdGF0dXM/OiBudW1iZXIsIG1pbWVUeXBlPzogc3RyaW5nKSB7XG4gICAgbGV0IHJlcTogYW55XG4gICAgaWYgKHRoaXMuY29uZmlnc2VydmljZS51c2VyUHJvZmlsZSkge1xuICAgICAgcmVxID0ge1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgLy91c2VySWQ6IHRoaXMuY29uZmlnc2VydmljZS51c2VyUHJvZmlsZS51c2VySWQgfHwgJycsXG4gICAgICAgICAgY29udGVudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29udGVudElkLFxuICAgICAgICAgICAgICAvLyBiYXRjaElkLFxuICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyB8fCAyLFxuICAgICAgICAgICAgICAvLyBjb3Vyc2VJZDogY29sbGVjdGlvbklkLFxuICAgICAgICAgICAgICBsYXN0QWNjZXNzVGltZTogZGF5anMobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzOlNTU1paJyksXG4gICAgICAgICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiBzdGF0dXMgPT09IDIgPyAxMDAuMCA6IDAsXG4gICAgICAgICAgICAgIHByb2dyZXNzZGV0YWlsczoge1xuICAgICAgICAgICAgICAgIFwibWltZVR5cGVcIjogbWltZVR5cGUgfHwgXCJhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbnNldFwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgICBjb25zdCByZXNvdXJjZVN0YXR1cyA9IHRoaXMuZ2V0UHJlQXNzZXNzbWVudFJlc291cmNlU3RhdHVzKGNvbnRlbnRJZClcbiAgICAgIGlmIChyZXNvdXJjZVN0YXR1cyA8IDIpIHtcbiAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUkVfQVNTRVNTTUVOVF9TVEFURV9VUERBVEV9YCwgcmVxKVxuICAgICAgICAgIC5zdWJzY3JpYmUobm9vcCwgbm9vcClcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnRvY1N2Yy5oYXNobWFwICYmIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSAmJiByZXEucmVxdWVzdC5jb250ZW50c1swXSkge1xuICAgICAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdICYmXG4gICAgICAgICAgKCF0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXSB8fCB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXSA8IDIpKSB7XG4gICAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLnN0YXR1c1xuICAgICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXAgPSB7IC4uLnRoaXMudG9jU3ZjLmhhc2htYXAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcSA9IHt9XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgZ2V0UHJlQXNzZXNzbWVudFJlc291cmNlU3RhdHVzKHJlc291cmNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnRvY1N2YyAmJiB0aGlzLnRvY1N2Yy5oYXNobWFwICYmIHRoaXMudG9jU3ZjLmhhc2htYXBbcmVzb3VyY2VJZF0pIHtcbiAgICAgIHJldHVybiB0aGlzLnRvY1N2Yy5oYXNobWFwW3Jlc291cmNlSWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgMVxuICAgIH1cbiAgICByZXR1cm4gMVxuICB9XG5cblxufVxuIl19
1
+ import { NsContent } from '../_services/widget-content.model';
2
+ import { Inject, Injectable } from '@angular/core';
3
+ import { noop, Subject } from 'rxjs';
4
+ import dayjs from 'dayjs';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common/http";
7
+ import * as i2 from "@sunbird-cb/utils-v2";
8
+ import * as i3 from "../_collection-api";
9
+ import * as i4 from "./app-toc.service";
10
+ import * as i5 from "@sunbird-cb/consumption";
11
+ export class ViewerUtilService {
12
+ constructor(http, configservice, contentSvc, tocSvc, userSvc, contentLangSvc, domainConfSvc, environment) {
13
+ this.http = http;
14
+ this.configservice = configservice;
15
+ this.contentSvc = contentSvc;
16
+ this.tocSvc = tocSvc;
17
+ this.userSvc = userSvc;
18
+ this.contentLangSvc = contentLangSvc;
19
+ this.domainConfSvc = domainConfSvc;
20
+ this.environment = environment;
21
+ this.API_ENDPOINTS = {
22
+ setS3Cookie: `/apis/v8/protected/content/setCookie`,
23
+ // PROGRESS_UPDATE: `/apis/protected/v8/user/realTimeProgress/update`,
24
+ PROGRESS_UPDATE: `/apis/proxies/v8/content-progres`,
25
+ ASSESSMENT_SECTION: `/apis/proxies/v8/assessment/v5/read`,
26
+ GET_FORM_BYID: (formId) => `apis/proxies/v8/forms/v2/getFormById?formId=${formId}`,
27
+ SUBMIT_FORM: `/apis/proxies/v8/forms/v2/saveFormSubmit`,
28
+ // GET_FORM_BYID: (formId: string) => `apis/proxies/v8/forms/getFormById?id=${formId}`,
29
+ // SUBMIT_FORM: `/apis/proxies/v8/forms/v1/saveFormSubmit`,
30
+ PRE_ASSESSMENT_STATE_UPDATE: `/apis/proxies/v8/content/v2/state/update`
31
+ };
32
+ this.downloadRegex = new RegExp(`(/content-store/.*?)(\\\)?\\\\?['"])`, 'gm');
33
+ this.authoringBase = '/apis/authContent/';
34
+ this.markAsCompleteSubject = new Subject();
35
+ this.autoPlayNextVideo = new Subject();
36
+ this.autoPlayNextAudio = new Subject();
37
+ this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
38
+ this.publicUserDetails = {};
39
+ this.regexDownloadReplace = (_str = '', group1, group2) => {
40
+ return `${this.authoringBase}${encodeURIComponent(group1)}${group2}`;
41
+ };
42
+ }
43
+ async fetchManifestFile(url) {
44
+ this.setS3Cookie(url);
45
+ const manifestFile = await this.http
46
+ .get(url)
47
+ .toPromise()
48
+ .catch((_err) => { });
49
+ return manifestFile;
50
+ }
51
+ async setS3Cookie(_contentId) {
52
+ // await this.http
53
+ // .post(this.API_ENDPOINTS.setS3Cookie, { contentId })
54
+ // .toPromise()
55
+ // .catch((_err: any) => { })
56
+ return;
57
+ }
58
+ calculatePercent(current, max, mimeType) {
59
+ try {
60
+ const temp = [...current];
61
+ if (temp && temp.length && max) {
62
+ const latest = parseFloat(temp.pop() || '0');
63
+ const percentMilis = (latest / max) * 100;
64
+ let percent = parseFloat(percentMilis.toFixed(2));
65
+ if (mimeType === NsContent.EMimeTypes.MP4 ||
66
+ mimeType === NsContent.EMimeTypes.M3U8 ||
67
+ mimeType === NsContent.EMimeTypes.MP3 ||
68
+ mimeType === NsContent.EMimeTypes.M4A ||
69
+ mimeType === NsContent.EMimeTypes.YOUTUBE ||
70
+ mimeType === NsContent.EMimeTypes.SURVEY) {
71
+ if (percent <= 5) {
72
+ // if percentage is less than 5% make it 0
73
+ percent = 0;
74
+ }
75
+ else if (percent >= 95) {
76
+ // if percentage is greater than 95% make it 100
77
+ percent = 100;
78
+ }
79
+ }
80
+ return percent;
81
+ }
82
+ return 0;
83
+ }
84
+ catch (e) {
85
+ // tslint:disable-next-line: no-console
86
+ console.log('Error in calculating percentage', e);
87
+ return 0;
88
+ }
89
+ }
90
+ getStatus(current, max, mimeType) {
91
+ try {
92
+ const percentage = this.calculatePercent(current, max, mimeType);
93
+ // for videos and audios
94
+ if (mimeType === NsContent.EMimeTypes.MP4 ||
95
+ mimeType === NsContent.EMimeTypes.M3U8 ||
96
+ mimeType === NsContent.EMimeTypes.MP3 ||
97
+ mimeType === NsContent.EMimeTypes.M4A ||
98
+ mimeType === NsContent.EMimeTypes.SURVEY ||
99
+ mimeType === NsContent.EMimeTypes.PDF) {
100
+ // if percentage is less than 5% then make status started
101
+ if (Math.ceil(percentage) <= 5) {
102
+ return 1;
103
+ }
104
+ // if percentage is greater than 95% then make status complete
105
+ if (Math.ceil(percentage) >= 95) {
106
+ return 2;
107
+ }
108
+ }
109
+ else {
110
+ if (Math.ceil(percentage) >= 100) {
111
+ return 2;
112
+ }
113
+ }
114
+ return 1;
115
+ }
116
+ catch (e) {
117
+ // tslint:disable-next-line: no-console
118
+ console.log('Error in getting completion status', e);
119
+ return 1;
120
+ }
121
+ }
122
+ realTimeProgressUpdate(contentId, request, collectionId, batchId) {
123
+ let req;
124
+ if (this.configservice.userProfile) {
125
+ const language = this.getResourceContentLanguage(contentId);
126
+ req = {
127
+ request: {
128
+ userId: this.configservice.userProfile.userId || '',
129
+ contents: [
130
+ {
131
+ contentId,
132
+ batchId,
133
+ language,
134
+ status: this.getStatus(request.current, request.max_size, request.mime_type),
135
+ courseId: collectionId,
136
+ lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
137
+ progressdetails: {
138
+ max_size: request.max_size,
139
+ current: request.current,
140
+ mimeType: request.mime_type,
141
+ },
142
+ completionPercentage: this.calculatePercent(request.current, request.max_size, request.mime_type),
143
+ },
144
+ ],
145
+ },
146
+ };
147
+ // if (this.configservice.cstoken !== '') {
148
+ // const headers = new HttpHeaders()
149
+ // .set('cstoken', this.configservice.cstoken)
150
+ // this.http
151
+ // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, { headers } , req)
152
+ // .subscribe(noop, noop)
153
+ // } else {
154
+ // this.http
155
+ // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
156
+ // .subscribe(noop, noop)
157
+ // }
158
+ this.http
159
+ .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
160
+ .subscribe(noop, noop);
161
+ if (this.tocSvc.hashmap[contentId] &&
162
+ (!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
163
+ this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
164
+ this.tocSvc.hashmap[contentId]['completionStatus'] = req.request.contents[0].status;
165
+ this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
166
+ // Notify UI components about hashmap changes
167
+ this.tocSvc.hashmapUpdated.next(this.tocSvc.hashmap);
168
+ // Trigger milestone lock recomputation for Learning Pathways
169
+ this.tocSvc.triggerMilestoneLockUpdate();
170
+ }
171
+ }
172
+ else {
173
+ req = {};
174
+ // do nothing
175
+ }
176
+ }
177
+ getBatchIdAndCourseId(courseId, batchId, resourceId) {
178
+ const tempData = {
179
+ courseId,
180
+ batchId,
181
+ };
182
+ const tempContentData = this.contentSvc.currentMetaData;
183
+ const tempContentReadData = this.contentSvc.currentContentReadMetaData;
184
+ const enrollmentList = this.contentSvc.currentBatchEnrollmentList;
185
+ if (!this.forPreview) {
186
+ if (tempContentData.courseCategory === 'Learning Pathway') {
187
+ // Find the course that contains the given resource ID
188
+ const foundCourse = this.findCourseContainingResource(tempContentData, resourceId);
189
+ if (foundCourse) {
190
+ // Always update courseId if course is found
191
+ tempData.courseId = foundCourse.identifier;
192
+ // Try to find batch ID from enrollment data for the found course
193
+ if (foundCourse.identifier) {
194
+ const enrollment = enrollmentList.find((course) => course.collectionId === foundCourse.identifier);
195
+ if (enrollment && enrollment.batchId) {
196
+ tempData.batchId = enrollment.batchId;
197
+ }
198
+ }
199
+ }
200
+ }
201
+ else if (tempContentData && tempContentReadData.cumulativeTracking &&
202
+ (tempContentData.primaryCategory === NsContent.EPrimaryCategory.PROGRAM ||
203
+ tempContentData.primaryCategory === NsContent.EPrimaryCategory.CURATED_PROGRAM
204
+ || tempContentData.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM)) {
205
+ tempContentData.children.forEach(async (childList) => {
206
+ if (childList.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
207
+ // tslint:disable-next-line: max-line-length
208
+ const courseEnrollmentList = enrollmentList && enrollmentList.filter((v) => v.contentId === childList.identifier);
209
+ if (childList.childNodes && childList.childNodes.indexOf(resourceId) !== -1) {
210
+ if (courseEnrollmentList && courseEnrollmentList.length > 0) {
211
+ tempData.batchId = courseEnrollmentList[courseEnrollmentList.length - 1].batch.batchId;
212
+ tempData.courseId = childList.identifier;
213
+ }
214
+ else {
215
+ const data = await this.checkForCourseEnrollment(childList, resourceId, enrollmentList, tempData);
216
+ tempData.courseId = data.courseId;
217
+ tempData.batchId = data.batchId;
218
+ }
219
+ }
220
+ }
221
+ else if (tempContentData.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM) {
222
+ if (tempData.courseId === courseId) {
223
+ const bPEnrollmentList = enrollmentList.filter((v) => v.contentId === tempContentData.identifier);
224
+ if (tempContentData.childNodes && tempContentData.childNodes.indexOf(resourceId) !== -1) {
225
+ if (bPEnrollmentList.length > 0) {
226
+ tempData.batchId = bPEnrollmentList[bPEnrollmentList.length - 1].batch.batchId;
227
+ tempData.courseId = tempContentData.identifier;
228
+ }
229
+ }
230
+ }
231
+ }
232
+ });
233
+ }
234
+ }
235
+ return tempData;
236
+ }
237
+ /**
238
+ * Recursively searches for a resource ID in a content's children hierarchy
239
+ * @param content The content object to search in
240
+ * @param resourceId The resource ID to find
241
+ * @returns true if resource is found, false otherwise
242
+ */
243
+ findResourceInContent(content, resourceId) {
244
+ // Check if this content has the resource in its leafNodes
245
+ if (content.leafNodes && Array.isArray(content.leafNodes)) {
246
+ if (content.leafNodes.indexOf(resourceId) !== -1) {
247
+ return true;
248
+ }
249
+ }
250
+ // Check if this content's identifier matches the resource ID
251
+ if (content.identifier === resourceId) {
252
+ return true;
253
+ }
254
+ // Recursively search in children
255
+ if (content.children && Array.isArray(content.children)) {
256
+ for (const child of content.children) {
257
+ if (this.findResourceInContent(child, resourceId)) {
258
+ return true;
259
+ }
260
+ }
261
+ }
262
+ return false;
263
+ }
264
+ /**
265
+ * Finds the course that contains a given resource ID in a Learning Pathway
266
+ * @param learningPathwayContent The Learning Pathway content data
267
+ * @param resourceId The resource ID to find
268
+ * @returns The course object containing the resource, or null if not found
269
+ */
270
+ findCourseContainingResource(learningPathwayContent, resourceId) {
271
+ // Check if milestones_v1 exists
272
+ if (!learningPathwayContent.milestones_v1 || !Array.isArray(learningPathwayContent.milestones_v1)) {
273
+ return null;
274
+ }
275
+ // Loop through each milestone
276
+ for (const milestone of learningPathwayContent.milestones_v1) {
277
+ // Check if milestone has courses
278
+ if (milestone.courses && Array.isArray(milestone.courses)) {
279
+ // Loop through each course in the milestone
280
+ for (const course of milestone.courses) {
281
+ // Check if this course contains the resource
282
+ if (this.findResourceInContent(course, resourceId)) {
283
+ return course;
284
+ }
285
+ }
286
+ }
287
+ }
288
+ return null;
289
+ }
290
+ getResourceContentLanguage(resourceId) {
291
+ let tempLanguage = 'english';
292
+ let languageFound = false;
293
+ const tempContentData = this.contentSvc.currentMetaData;
294
+ if (!this.forPreview) {
295
+ tempContentData.children?.forEach(async (childList) => {
296
+ if (childList.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
297
+ // tslint:disable-next-line: max-line-length
298
+ if (childList.leafNodes && childList.leafNodes.indexOf(resourceId) !== -1) {
299
+ tempLanguage = this.contentLangSvc.getContentLanguage(childList);
300
+ languageFound = true;
301
+ }
302
+ }
303
+ });
304
+ if (!languageFound) {
305
+ if (tempContentData.leafNodes && tempContentData.leafNodes.indexOf(resourceId) !== -1) {
306
+ tempLanguage = this.contentLangSvc.getContentLanguage(tempContentData);
307
+ }
308
+ }
309
+ }
310
+ return tempLanguage;
311
+ }
312
+ async checkForCourseEnrollment(childList, _resourceId, _enrollmentList, _tempData) {
313
+ // tslint:disable-next-line: max-line-length
314
+ const courseData = await this.contentSvc.autoAssignBatchApi(childList.identifier).toPromise().then(async (data) => {
315
+ if (data) {
316
+ // tslint:disable-next-line: max-line-length
317
+ const responseData = await this.userSvc.fetchEnrollmentDataByContentId(this.configservice.userProfile?.userId, childList.identifier).toPromise().then(async (res) => {
318
+ if (res && res.courses && res.courses.length) {
319
+ return res.courses;
320
+ }
321
+ return [{ courseId: childList.identifier, batchId: '' }];
322
+ }).catch((_err) => {
323
+ return [{ courseId: childList.identifier, batchId: '' }];
324
+ });
325
+ this.contentSvc.currentBatchEnrollmentList = [...this.contentSvc.currentBatchEnrollmentList, ...responseData];
326
+ return { courseId: childList.identifier, batchId: responseData[0].batchId };
327
+ }
328
+ }).catch((_err) => {
329
+ return [{ courseId: childList.identifier, batchId: '' }];
330
+ });
331
+ return courseData;
332
+ }
333
+ realTimeProgressUpdateQuiz(contentId, collectionId, batchId, status) {
334
+ let req;
335
+ if (this.configservice.userProfile) {
336
+ const language = this.getResourceContentLanguage(contentId);
337
+ req = {
338
+ request: {
339
+ userId: this.configservice.userProfile.userId || '',
340
+ contents: [
341
+ {
342
+ contentId,
343
+ batchId,
344
+ language,
345
+ status: status || 2,
346
+ courseId: collectionId,
347
+ lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
348
+ completionPercentage: status === 2 ? 100 : 0,
349
+ },
350
+ ],
351
+ },
352
+ };
353
+ this.http
354
+ .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
355
+ .subscribe(noop, noop);
356
+ if (this.tocSvc.hashmap && this.tocSvc.hashmap[contentId] && req.request.contents[0]) {
357
+ if (this.tocSvc.hashmap[contentId] &&
358
+ (!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
359
+ this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
360
+ this.tocSvc.hashmap[contentId]['completionStatus'] = req.request.contents[0].status;
361
+ this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
362
+ // Notify UI components about hashmap changes
363
+ this.tocSvc.hashmapUpdated.next(this.tocSvc.hashmap);
364
+ // Trigger milestone lock recomputation for Learning Pathways
365
+ if (this.tocSvc.triggerMilestoneLockUpdate) {
366
+ this.tocSvc.triggerMilestoneLockUpdate();
367
+ }
368
+ }
369
+ }
370
+ }
371
+ else {
372
+ req = {};
373
+ // do nothing
374
+ }
375
+ }
376
+ getContent(contentId) {
377
+ const forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
378
+ let url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
379
+ if (!forPreview) {
380
+ url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
381
+ }
382
+ else {
383
+ if (window.location.href.includes('editMode=true') && window.location.href.includes('_rc')) {
384
+ url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
385
+ }
386
+ else {
387
+ url = `/api/content/v1/read/${contentId}`;
388
+ }
389
+ }
390
+ return this.http.get(
391
+ // tslint:disable-next-line:max-line-length
392
+ // `/apis/authApi/action/content/hierarchy/${contentId}?rootOrg=${this.configservice.rootOrg || 'igot'}&org=${this.configservice.activeOrg || 'dopt'}`,
393
+ url);
394
+ }
395
+ getAuthoringUrl(url) {
396
+ return url
397
+ // tslint:disable-next-line:max-line-length
398
+ ? `/apis/authContent/${url.includes('/content-store/') ? new URL(url).pathname.slice(1) : encodeURIComponent(url)}`
399
+ : '';
400
+ }
401
+ replaceToAuthUrl(data) {
402
+ return JSON.parse(JSON.stringify(data).replace(this.downloadRegex, this.regexDownloadReplace));
403
+ }
404
+ readSections(assessmentId) {
405
+ return `${this.API_ENDPOINTS}/${assessmentId}`;
406
+ }
407
+ getPublicUrl(url) {
408
+ const mainUrl = url.split('/content').pop() || '';
409
+ return `${this.environment.contentHost}/${this.environment.contentBucket}/content${mainUrl}`;
410
+ }
411
+ getCdnUrl(url) {
412
+ const mainUrl = url.split('/content').pop() || '';
413
+ return `${this.domainConfSvc.getDomainCDNHost()}/${this.environment.cdnContentBucket}/content${mainUrl}`;
414
+ }
415
+ // fetchContent(
416
+ // contentId: string,
417
+ // hierarchyType: 'all' | 'minimal' | 'detail' = 'detail'
418
+ // ): Observable<NsContent.IContent> {
419
+ // let url = ''
420
+ // const forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true')
421
+ // if (!forPreview) {
422
+ // url = `/apis/proxies/v8/action/content/v3/hierarchy/${contentId}?hierarchyType=${hierarchyType}`
423
+ // } else {
424
+ // url = `/api/course/v1/hierarchy/${contentId}?hierarchyType=${hierarchyType}`
425
+ // }
426
+ // return this.http.get<NsContent.IContent>(url)
427
+ // }
428
+ fetchContent(id, type) {
429
+ return this.http.get(`/apis/proxies/v8/action/content/v3/hierarchy/${id}?mode=${type}`);
430
+ }
431
+ updateContentHashMapForAssesstent(contentId, contentProgress) {
432
+ if (this.tocSvc.hashmap[contentId] &&
433
+ (!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
434
+ this.tocSvc.hashmap[contentId]['completionPercentage'] = contentProgress.completionPercentage;
435
+ this.tocSvc.hashmap[contentId]['completionStatus'] = contentProgress.status;
436
+ this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
437
+ }
438
+ }
439
+ getFormById(formId) {
440
+ return this.http.get(this.API_ENDPOINTS.GET_FORM_BYID(formId));
441
+ }
442
+ submitForm(formData) {
443
+ return this.http.post(this.API_ENDPOINTS.SUBMIT_FORM, formData);
444
+ }
445
+ realTimeProgressUpdateForPreAssessment(contentId, request) {
446
+ let req;
447
+ if (this.configservice.userProfile) {
448
+ req = {
449
+ request: {
450
+ userId: this.configservice.userProfile.userId || '',
451
+ contents: [
452
+ {
453
+ contentId,
454
+ // batchId,
455
+ status: this.getStatus(request.current, request.max_size, request.mime_type),
456
+ // courseId: collectionId,
457
+ lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
458
+ progressdetails: {
459
+ max_size: request.max_size,
460
+ current: request.current,
461
+ mimeType: request.mime_type,
462
+ },
463
+ completionPercentage: this.calculatePercent(request.current, request.max_size, request.mime_type),
464
+ },
465
+ ],
466
+ },
467
+ };
468
+ // if (this.configservice.cstoken !== '') {
469
+ // const headers = new HttpHeaders()
470
+ // .set('cstoken', this.configservice.cstoken)
471
+ // this.http
472
+ // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, { headers } , req)
473
+ // .subscribe(noop, noop)
474
+ // } else {
475
+ // this.http
476
+ // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
477
+ // .subscribe(noop, noop)
478
+ // }
479
+ // this.http
480
+ // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
481
+ // .subscribe(noop, noop)
482
+ //const contentIdNew= req.request.contents[0].contentId
483
+ // const updatedCompletionPercentage = req.request.contents[0].completionPercentage
484
+ // const updatedStatus = req.request.contents[0].status
485
+ // // Clone the inner object and update
486
+ // const existingContent = this.tocSvc.hashmap[contentIdNew] || {}
487
+ // this.tocSvc.hashmap = {
488
+ // ...this.tocSvc.hashmap,
489
+ // [contentIdNew]: {
490
+ // ...existingContent,
491
+ // completionPercentage: updatedCompletionPercentage,
492
+ // completionStatus: updatedStatus
493
+ // }
494
+ // }
495
+ // console.log('req', JSON.stringify(req))
496
+ // console.log('req', req)
497
+ const resourceStatus = this.getPreAssessmentResourceStatus(contentId);
498
+ if (resourceStatus < 2) {
499
+ this.http
500
+ .patch(`${this.API_ENDPOINTS.PRE_ASSESSMENT_STATE_UPDATE}`, req)
501
+ .subscribe(noop, noop);
502
+ }
503
+ if (this.tocSvc.hashmap[contentId] &&
504
+ (!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
505
+ this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
506
+ this.tocSvc.hashmap[contentId]['completionStatus'] = req.request.contents[0].status;
507
+ this.tocSvc.hashmap[contentId]['parent'] = req.request.contents[0].courseId;
508
+ this.tocSvc.hashmap[contentId]['progress'] = req.request.contents[0].progressdetails;
509
+ this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
510
+ // Notify UI components about hashmap changes
511
+ this.tocSvc.hashmapUpdated.next(this.tocSvc.hashmap);
512
+ // Trigger milestone lock recomputation for Learning Pathways
513
+ if (this.tocSvc.triggerMilestoneLockUpdate) {
514
+ this.tocSvc.triggerMilestoneLockUpdate();
515
+ }
516
+ }
517
+ // console.log('Updated hashmap:', this.tocSvc.hashmap)
518
+ // console.log('this.tocSvc.hashmap---', this.tocSvc.hashmap)
519
+ }
520
+ else {
521
+ req = {};
522
+ // do nothing
523
+ }
524
+ }
525
+ realTimeProgressUpdateForPreAssessmentQuiz(contentId, status, mimeType) {
526
+ let req;
527
+ if (this.configservice.userProfile) {
528
+ req = {
529
+ request: {
530
+ //userId: this.configservice.userProfile.userId || '',
531
+ contents: [
532
+ {
533
+ contentId,
534
+ // batchId,
535
+ status: status || 2,
536
+ // courseId: collectionId,
537
+ lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
538
+ completionPercentage: status === 2 ? 100.0 : 0,
539
+ progressdetails: {
540
+ "mimeType": mimeType || "application/vnd.sunbird.questionset"
541
+ },
542
+ },
543
+ ],
544
+ },
545
+ };
546
+ const resourceStatus = this.getPreAssessmentResourceStatus(contentId);
547
+ if (resourceStatus < 2) {
548
+ this.http
549
+ .patch(`${this.API_ENDPOINTS.PRE_ASSESSMENT_STATE_UPDATE}`, req)
550
+ .subscribe(noop, noop);
551
+ }
552
+ if (this.tocSvc.hashmap && this.tocSvc.hashmap[contentId] && req.request.contents[0]) {
553
+ if (this.tocSvc.hashmap[contentId] &&
554
+ (!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
555
+ this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
556
+ this.tocSvc.hashmap[contentId]['completionStatus'] = req.request.contents[0].status;
557
+ this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
558
+ // Notify UI components about hashmap changes
559
+ this.tocSvc.hashmapUpdated.next(this.tocSvc.hashmap);
560
+ // Trigger milestone lock recomputation for Learning Pathways
561
+ if (this.tocSvc.triggerMilestoneLockUpdate) {
562
+ this.tocSvc.triggerMilestoneLockUpdate();
563
+ }
564
+ }
565
+ }
566
+ }
567
+ else {
568
+ req = {};
569
+ // do nothing
570
+ }
571
+ }
572
+ getPreAssessmentResourceStatus(resourceId) {
573
+ if (this.tocSvc && this.tocSvc.hashmap && this.tocSvc.hashmap[resourceId]) {
574
+ return this.tocSvc.hashmap[resourceId]['completionStatus'] || 1;
575
+ }
576
+ return 1;
577
+ }
578
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerUtilService, deps: [{ token: i1.HttpClient }, { token: i2.ConfigurationsService }, { token: i3.WidgetContentService }, { token: i4.AppTocService }, { token: i5.WidgetUserServiceLib }, { token: i5.ContentLanguageService }, { token: i2.DomainConfService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Injectable }); }
579
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerUtilService, providedIn: 'root' }); }
580
+ }
581
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerUtilService, decorators: [{
582
+ type: Injectable,
583
+ args: [{
584
+ providedIn: 'root',
585
+ }]
586
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ConfigurationsService }, { type: i3.WidgetContentService }, { type: i4.AppTocService }, { type: i5.WidgetUserServiceLib }, { type: i5.ContentLanguageService }, { type: i2.DomainConfService }, { type: undefined, decorators: [{
587
+ type: Inject,
588
+ args: ['environment']
589
+ }] }]; } });
590
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLXV0aWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9zZXJ2aWNlcy92aWV3ZXItdXRpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVsRCxPQUFPLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNoRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7Ozs7Ozs7QUFRekIsTUFBTSxPQUFPLGlCQUFpQjtJQW9CNUIsWUFDVSxJQUFnQixFQUNoQixhQUFvQyxFQUNwQyxVQUFnQyxFQUNoQyxNQUFxQixFQUNyQixPQUE2QixFQUM3QixjQUFzQyxFQUN0QyxhQUFnQyxFQUNULFdBQWdCO1FBUHZDLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsa0JBQWEsR0FBYixhQUFhLENBQXVCO1FBQ3BDLGVBQVUsR0FBVixVQUFVLENBQXNCO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsWUFBTyxHQUFQLE9BQU8sQ0FBc0I7UUFDN0IsbUJBQWMsR0FBZCxjQUFjLENBQXdCO1FBQ3RDLGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUNULGdCQUFXLEdBQVgsV0FBVyxDQUFLO1FBM0JqRCxrQkFBYSxHQUFHO1lBQ2QsV0FBVyxFQUFFLHNDQUFzQztZQUNuRCxzRUFBc0U7WUFDdEUsZUFBZSxFQUFFLGtDQUFrQztZQUNuRCxrQkFBa0IsRUFBRSxxQ0FBcUM7WUFDekQsYUFBYSxFQUFFLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FBQywrQ0FBK0MsTUFBTSxFQUFFO1lBQzFGLFdBQVcsRUFBRSwwQ0FBMEM7WUFDdkQsdUZBQXVGO1lBQ3ZG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O1lBQ1IsYUFBYTtTQUNkO0lBQ0gsQ0FBQztJQUVELDhCQUE4QixDQUFDLFVBQWtCO1FBQy9DLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN6RSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFBO1NBQ2hFO1FBQ0QsT0FBTyxDQUFDLENBQUE7SUFDVixDQUFDOytHQTVtQlUsaUJBQWlCLDZQQTRCbEIsYUFBYTttSEE1QlosaUJBQWlCLGNBRmhCLE1BQU07OzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQTZCSSxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25maWd1cmF0aW9uc1NlcnZpY2UsIERvbWFpbkNvbmZTZXJ2aWNlIH0gZnJvbSAnQHN1bmJpcmQtY2IvdXRpbHMtdjInXHJcbmltcG9ydCB7IE5zQ29udGVudCB9IGZyb20gJy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5tb2RlbCdcclxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xyXG5pbXBvcnQgeyBub29wLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcydcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xyXG5pbXBvcnQgeyBBcHBUb2NTZXJ2aWNlIH0gZnJvbSAnLi9hcHAtdG9jLnNlcnZpY2UnXHJcbmltcG9ydCB7IENvbnRlbnRMYW5ndWFnZVNlcnZpY2UsIFdpZGdldFVzZXJTZXJ2aWNlTGliIH0gZnJvbSAnQHN1bmJpcmQtY2IvY29uc3VtcHRpb24nXHJcbmltcG9ydCB7IFdpZGdldENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vX2NvbGxlY3Rpb24tYXBpJ1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFZpZXdlclV0aWxTZXJ2aWNlIHtcclxuICBBUElfRU5EUE9JTlRTID0ge1xyXG4gICAgc2V0UzNDb29raWU6IGAvYXBpcy92OC9wcm90ZWN0ZWQvY29udGVudC9zZXRDb29raWVgLFxyXG4gICAgLy8gUFJPR1JFU1NfVVBEQVRFOiBgL2FwaXMvcHJvdGVjdGVkL3Y4L3VzZXIvcmVhbFRpbWVQcm9ncmVzcy91cGRhdGVgLFxyXG4gICAgUFJPR1JFU1NfVVBEQVRFOiBgL2FwaXMvcHJveGllcy92OC9jb250ZW50LXByb2dyZXNgLFxyXG4gICAgQVNTRVNTTUVOVF9TRUNUSU9OOiBgL2FwaXMvcHJveGllcy92OC9hc3Nlc3NtZW50L3Y1L3JlYWRgLFxyXG4gICAgR0VUX0ZPUk1fQllJRDogKGZvcm1JZDogc3RyaW5nKSA9PiBgYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YyL2dldEZvcm1CeUlkP2Zvcm1JZD0ke2Zvcm1JZH1gLFxyXG4gICAgU1VCTUlUX0ZPUk06IGAvYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YyL3NhdmVGb3JtU3VibWl0YCxcclxuICAgIC8vIEdFVF9GT1JNX0JZSUQ6IChmb3JtSWQ6IHN0cmluZykgPT4gYGFwaXMvcHJveGllcy92OC9mb3Jtcy9nZXRGb3JtQnlJZD9pZD0ke2Zvcm1JZH1gLFxyXG4gICAgLy8gU1VCTUlUX0ZPUk06IGAvYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YxL3NhdmVGb3JtU3VibWl0YCxcclxuICAgIFBSRV9BU1NFU1NNRU5UX1NUQVRFX1VQREFURTogYC9hcGlzL3Byb3hpZXMvdjgvY29udGVudC92Mi9zdGF0ZS91cGRhdGVgXHJcblxyXG4gIH1cclxuICBkb3dubG9hZFJlZ2V4ID0gbmV3IFJlZ0V4cChgKC9jb250ZW50LXN0b3JlLy4qPykoXFxcXFxcKT9cXFxcXFxcXD9bJ1wiXSlgLCAnZ20nKVxyXG4gIGF1dGhvcmluZ0Jhc2UgPSAnL2FwaXMvYXV0aENvbnRlbnQvJ1xyXG4gIG1hcmtBc0NvbXBsZXRlU3ViamVjdCA9IG5ldyBTdWJqZWN0KClcclxuICBhdXRvUGxheU5leHRWaWRlbyA9IG5ldyBTdWJqZWN0KClcclxuICBhdXRvUGxheU5leHRBdWRpbyA9IG5ldyBTdWJqZWN0KClcclxuICBmb3JQcmV2aWV3ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9wdWJsaWMvJykgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJyZwcmV2aWV3PXRydWUnKVxyXG4gIHB1YmxpY1VzZXJEZXRhaWxzOiBhbnkgPSB7fVxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBjb25maWdzZXJ2aWNlOiBDb25maWd1cmF0aW9uc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbnRlbnRTdmM6IFdpZGdldENvbnRlbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2NTdmM6IEFwcFRvY1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHVzZXJTdmM6IFdpZGdldFVzZXJTZXJ2aWNlTGliLFxyXG4gICAgcHJpdmF0ZSBjb250ZW50TGFuZ1N2YzogQ29udGVudExhbmd1YWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgZG9tYWluQ29uZlN2YzogRG9tYWluQ29uZlNlcnZpY2UsXHJcbiAgICBASW5qZWN0KCdlbnZpcm9ubWVudCcpIHByaXZhdGUgZW52aXJvbm1lbnQ6IGFueVxyXG4gICkgeyB9XHJcblxyXG4gIGFzeW5jIGZldGNoTWFuaWZlc3RGaWxlKHVybDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNldFMzQ29va2llKHVybClcclxuICAgIGNvbnN0IG1hbmlmZXN0RmlsZSA9IGF3YWl0IHRoaXMuaHR0cFxyXG4gICAgICAuZ2V0PGFueT4odXJsKVxyXG4gICAgICAudG9Qcm9taXNlKClcclxuICAgICAgLmNhdGNoKChfZXJyOiBhbnkpID0+IHsgfSlcclxuICAgIHJldHVybiBtYW5pZmVzdEZpbGVcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2V0UzNDb29raWUoX2NvbnRlbnRJZDogc3RyaW5nKSB7XHJcbiAgICAvLyBhd2FpdCB0aGlzLmh0dHBcclxuICAgIC8vICAgLnBvc3QodGhpcy5BUElfRU5EUE9JTlRTLnNldFMzQ29va2llLCB7IGNvbnRlbnRJZCB9KVxyXG4gICAgLy8gICAudG9Qcm9taXNlKClcclxuICAgIC8vICAgLmNhdGNoKChfZXJyOiBhbnkpID0+IHsgfSlcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlUGVyY2VudChjdXJyZW50OiBzdHJpbmdbXSwgbWF4OiBudW1iZXIsIG1pbWVUeXBlPzogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHRlbXAgPSBbLi4uY3VycmVudF1cclxuICAgICAgaWYgKHRlbXAgJiYgdGVtcC5sZW5ndGggJiYgbWF4KSB7XHJcbiAgICAgICAgY29uc3QgbGF0ZXN0ID0gcGFyc2VGbG9hdCh0ZW1wLnBvcCgpIHx8ICcwJylcclxuICAgICAgICBjb25zdCBwZXJjZW50TWlsaXMgPSAobGF0ZXN0IC8gbWF4KSAqIDEwMFxyXG4gICAgICAgIGxldCBwZXJjZW50ID0gcGFyc2VGbG9hdChwZXJjZW50TWlsaXMudG9GaXhlZCgyKSlcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTVA0IHx8XHJcbiAgICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTTNVOCB8fFxyXG4gICAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk1QMyB8fFxyXG4gICAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk00QSB8fFxyXG4gICAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLllPVVRVQkUgfHxcclxuICAgICAgICAgIG1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5TVVJWRVlcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGlmIChwZXJjZW50IDw9IDUpIHtcclxuICAgICAgICAgICAgLy8gaWYgcGVyY2VudGFnZSBpcyBsZXNzIHRoYW4gNSUgbWFrZSBpdCAwXHJcbiAgICAgICAgICAgIHBlcmNlbnQgPSAwXHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHBlcmNlbnQgPj0gOTUpIHtcclxuICAgICAgICAgICAgLy8gaWYgcGVyY2VudGFnZSBpcyBncmVhdGVyIHRoYW4gOTUlIG1ha2UgaXQgMTAwXHJcbiAgICAgICAgICAgIHBlcmNlbnQgPSAxMDBcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBlcmNlbnRcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMFxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIGNhbGN1bGF0aW5nIHBlcmNlbnRhZ2UnLCBlKVxyXG4gICAgICByZXR1cm4gMFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdHVzKGN1cnJlbnQ6IHN0cmluZ1tdLCBtYXg6IG51bWJlciwgbWltZVR5cGU/OiBzdHJpbmcpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB0aGlzLmNhbGN1bGF0ZVBlcmNlbnQoY3VycmVudCwgbWF4LCBtaW1lVHlwZSlcclxuICAgICAgLy8gZm9yIHZpZGVvcyBhbmQgYXVkaW9zXHJcbiAgICAgIGlmIChcclxuICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTVA0IHx8XHJcbiAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk0zVTggfHxcclxuICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTVAzIHx8XHJcbiAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk00QSB8fFxyXG4gICAgICAgIG1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5TVVJWRVkgfHxcclxuICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuUERGXHJcbiAgICAgICkge1xyXG4gICAgICAgIC8vIGlmIHBlcmNlbnRhZ2UgaXMgbGVzcyB0aGFuIDUlIHRoZW4gbWFrZSBzdGF0dXMgc3RhcnRlZFxyXG4gICAgICAgIGlmIChNYXRoLmNlaWwocGVyY2VudGFnZSkgPD0gNSkge1xyXG4gICAgICAgICAgcmV0dXJuIDFcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgcGVyY2VudGFnZSBpcyBncmVhdGVyIHRoYW4gOTUlIHRoZW4gbWFrZSBzdGF0dXMgY29tcGxldGVcclxuICAgICAgICBpZiAoTWF0aC5jZWlsKHBlcmNlbnRhZ2UpID49IDk1KSB7XHJcbiAgICAgICAgICByZXR1cm4gMlxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoTWF0aC5jZWlsKHBlcmNlbnRhZ2UpID49IDEwMCkge1xyXG4gICAgICAgICAgcmV0dXJuIDJcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIDFcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiBnZXR0aW5nIGNvbXBsZXRpb24gc3RhdHVzJywgZSlcclxuICAgICAgcmV0dXJuIDFcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlYWxUaW1lUHJvZ3Jlc3NVcGRhdGUoY29udGVudElkOiBzdHJpbmcsIHJlcXVlc3Q6IGFueSwgY29sbGVjdGlvbklkPzogc3RyaW5nLCBiYXRjaElkPzogc3RyaW5nKSB7XHJcbiAgICBsZXQgcmVxOiBhbnlcclxuICAgIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUpIHtcclxuICAgICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmdldFJlc291cmNlQ29udGVudExhbmd1YWdlKGNvbnRlbnRJZClcclxuICAgICAgcmVxID0ge1xyXG4gICAgICAgIHJlcXVlc3Q6IHtcclxuICAgICAgICAgIHVzZXJJZDogdGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlLnVzZXJJZCB8fCAnJyxcclxuICAgICAgICAgIGNvbnRlbnRzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBjb250ZW50SWQsXHJcbiAgICAgICAgICAgICAgYmF0Y2hJZCxcclxuICAgICAgICAgICAgICBsYW5ndWFnZSxcclxuICAgICAgICAgICAgICBzdGF0dXM6IHRoaXMuZ2V0U3RhdHVzKHJlcXVlc3QuY3VycmVudCwgcmVxdWVzdC5tYXhfc2l6ZSwgcmVxdWVzdC5taW1lX3R5cGUpLFxyXG4gICAgICAgICAgICAgIGNvdXJzZUlkOiBjb2xsZWN0aW9uSWQsXHJcbiAgICAgICAgICAgICAgbGFzdEFjY2Vzc1RpbWU6IGRheWpzKG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzczpTU1NaWicpLFxyXG4gICAgICAgICAgICAgIHByb2dyZXNzZGV0YWlsczoge1xyXG4gICAgICAgICAgICAgICAgbWF4X3NpemU6IHJlcXVlc3QubWF4X3NpemUsXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50OiByZXF1ZXN0LmN1cnJlbnQsXHJcbiAgICAgICAgICAgICAgICBtaW1lVHlwZTogcmVxdWVzdC5taW1lX3R5cGUsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogdGhpcy5jYWxjdWxhdGVQZXJjZW50KHJlcXVlc3QuY3VycmVudCwgcmVxdWVzdC5tYXhfc2l6ZSwgcmVxdWVzdC5taW1lX3R5cGUpLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9LFxyXG4gICAgICB9XHJcbiAgICAgIC8vIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UuY3N0b2tlbiAhPT0gJycpIHtcclxuICAgICAgLy8gICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKClcclxuICAgICAgLy8gICAuc2V0KCdjc3Rva2VuJywgdGhpcy5jb25maWdzZXJ2aWNlLmNzdG9rZW4pXHJcblxyXG4gICAgICAvLyAgIHRoaXMuaHR0cFxyXG4gICAgICAvLyAgIC5wYXRjaChgJHt0aGlzLkFQSV9FTkRQT0lOVFMuUFJPR1JFU1NfVVBEQVRFfS8ke2NvbnRlbnRJZH1gLCB7IGhlYWRlcnMgfSAsIHJlcSlcclxuICAgICAgLy8gICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXHJcbiAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgIC8vICAgdGhpcy5odHRwXHJcbiAgICAgIC8vICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHJlcSlcclxuICAgICAgLy8gICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXHJcbiAgICAgIC8vIH1cclxuICAgICAgdGhpcy5odHRwXHJcbiAgICAgICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHJlcSlcclxuICAgICAgICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXHJcbiAgICAgIGlmICh0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF0gJiZcclxuICAgICAgICAoIXRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIHx8IHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIDwgMikpIHtcclxuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSByZXEucmVxdWVzdC5jb250ZW50c1swXS5jb21wbGV0aW9uUGVyY2VudGFnZVxyXG4gICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uc3RhdHVzXHJcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcCA9IHsgLi4udGhpcy50b2NTdmMuaGFzaG1hcCB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gTm90aWZ5IFVJIGNvbXBvbmVudHMgYWJvdXQgaGFzaG1hcCBjaGFuZ2VzXHJcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFVwZGF0ZWQubmV4dCh0aGlzLnRvY1N2Yy5oYXNobWFwKVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFRyaWdnZXIgbWlsZXN0b25lIGxvY2sgcmVjb21wdXRhdGlvbiBmb3IgTGVhcm5pbmcgUGF0aHdheXNcclxuICAgICAgICB0aGlzLnRvY1N2Yy50cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSgpXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlcSA9IHt9XHJcbiAgICAgIC8vIGRvIG5vdGhpbmdcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEJhdGNoSWRBbmRDb3Vyc2VJZChjb3Vyc2VJZDogc3RyaW5nLCBiYXRjaElkOiBzdHJpbmcsIHJlc291cmNlSWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgdGVtcERhdGEgPSB7XHJcbiAgICAgIGNvdXJzZUlkLFxyXG4gICAgICBiYXRjaElkLFxyXG4gICAgfVxyXG4gICAgY29uc3QgdGVtcENvbnRlbnREYXRhID0gdGhpcy5jb250ZW50U3ZjLmN1cnJlbnRNZXRhRGF0YVxyXG4gICAgY29uc3QgdGVtcENvbnRlbnRSZWFkRGF0YSA9IHRoaXMuY29udGVudFN2Yy5jdXJyZW50Q29udGVudFJlYWRNZXRhRGF0YVxyXG4gICAgY29uc3QgZW5yb2xsbWVudExpc3QgPSB0aGlzLmNvbnRlbnRTdmMuY3VycmVudEJhdGNoRW5yb2xsbWVudExpc3RcclxuICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XHJcbiAgICAgIGlmICh0ZW1wQ29udGVudERhdGEuY291cnNlQ2F0ZWdvcnkgPT09ICdMZWFybmluZyBQYXRod2F5Jykge1xyXG4gICAgICAgIC8vIEZpbmQgdGhlIGNvdXJzZSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiByZXNvdXJjZSBJRFxyXG4gICAgICAgIGNvbnN0IGZvdW5kQ291cnNlID0gdGhpcy5maW5kQ291cnNlQ29udGFpbmluZ1Jlc291cmNlKHRlbXBDb250ZW50RGF0YSwgcmVzb3VyY2VJZClcclxuXHJcbiAgICAgICAgaWYgKGZvdW5kQ291cnNlKSB7XHJcbiAgICAgICAgICAvLyBBbHdheXMgdXBkYXRlIGNvdXJzZUlkIGlmIGNvdXJzZSBpcyBmb3VuZFxyXG4gICAgICAgICAgdGVtcERhdGEuY291cnNlSWQgPSBmb3VuZENvdXJzZS5pZGVudGlmaWVyXHJcblxyXG4gICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYmF0Y2ggSUQgZnJvbSBlbnJvbGxtZW50IGRhdGEgZm9yIHRoZSBmb3VuZCBjb3Vyc2VcclxuICAgICAgICAgIGlmIChmb3VuZENvdXJzZS5pZGVudGlmaWVyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVucm9sbG1lbnQgPSBlbnJvbGxtZW50TGlzdC5maW5kKFxyXG4gICAgICAgICAgICAgIChjb3Vyc2U6IGFueSkgPT4gY291cnNlLmNvbGxlY3Rpb25JZCA9PT0gZm91bmRDb3Vyc2UuaWRlbnRpZmllclxyXG4gICAgICAgICAgICApXHJcblxyXG4gICAgICAgICAgICBpZiAoZW5yb2xsbWVudCAmJiBlbnJvbGxtZW50LmJhdGNoSWQpIHtcclxuICAgICAgICAgICAgICB0ZW1wRGF0YS5iYXRjaElkID0gZW5yb2xsbWVudC5iYXRjaElkXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAodGVtcENvbnRlbnREYXRhICYmIHRlbXBDb250ZW50UmVhZERhdGEuY3VtdWxhdGl2ZVRyYWNraW5nICYmXHJcbiAgICAgICAgKHRlbXBDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gfHxcclxuICAgICAgICAgIHRlbXBDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTVxyXG4gICAgICAgICAgfHwgdGVtcENvbnRlbnREYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNXHJcbiAgICAgICAgKVxyXG4gICAgICApIHtcclxuICAgICAgICB0ZW1wQ29udGVudERhdGEuY2hpbGRyZW4uZm9yRWFjaChhc3luYyAoY2hpbGRMaXN0OiBOc0NvbnRlbnQuSUNvbnRlbnQpID0+IHtcclxuICAgICAgICAgIGlmIChjaGlsZExpc3QucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICAgICAgY29uc3QgY291cnNlRW5yb2xsbWVudExpc3QgPSBlbnJvbGxtZW50TGlzdCAmJiBlbnJvbGxtZW50TGlzdC5maWx0ZXIoKHY6IE5zQ29udGVudC5JQ291cnNlKSA9PiB2LmNvbnRlbnRJZCA9PT0gY2hpbGRMaXN0LmlkZW50aWZpZXIpXHJcbiAgICAgICAgICAgIGlmIChjaGlsZExpc3QuY2hpbGROb2RlcyAmJiBjaGlsZExpc3QuY2hpbGROb2Rlcy5pbmRleE9mKHJlc291cmNlSWQpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgIGlmIChjb3Vyc2VFbnJvbGxtZW50TGlzdCAmJiBjb3Vyc2VFbnJvbGxtZW50TGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0ZW1wRGF0YS5iYXRjaElkID0gY291cnNlRW5yb2xsbWVudExpc3RbY291cnNlRW5yb2xsbWVudExpc3QubGVuZ3RoIC0gMV0uYmF0Y2guYmF0Y2hJZFxyXG4gICAgICAgICAgICAgICAgdGVtcERhdGEuY291cnNlSWQgPSBjaGlsZExpc3QuaWRlbnRpZmllclxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmNoZWNrRm9yQ291cnNlRW5yb2xsbWVudChjaGlsZExpc3QsIHJlc291cmNlSWQsIGVucm9sbG1lbnRMaXN0LCB0ZW1wRGF0YSlcclxuICAgICAgICAgICAgICAgIHRlbXBEYXRhLmNvdXJzZUlkID0gZGF0YS5jb3Vyc2VJZFxyXG4gICAgICAgICAgICAgICAgdGVtcERhdGEuYmF0Y2hJZCA9IGRhdGEuYmF0Y2hJZFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmICh0ZW1wQ29udGVudERhdGEucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0pIHtcclxuICAgICAgICAgICAgaWYgKHRlbXBEYXRhLmNvdXJzZUlkID09PSBjb3Vyc2VJZCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJQRW5yb2xsbWVudExpc3QgPSBlbnJvbGxtZW50TGlzdC5maWx0ZXIoKHY6IE5zQ29udGVudC5JQ291cnNlKSA9PiB2LmNvbnRlbnRJZCA9PT0gdGVtcENvbnRlbnREYXRhLmlkZW50aWZpZXIpXHJcbiAgICAgICAgICAgICAgaWYgKHRlbXBDb250ZW50RGF0YS5jaGlsZE5vZGVzICYmIHRlbXBDb250ZW50RGF0YS5jaGlsZE5vZGVzLmluZGV4T2YocmVzb3VyY2VJZCkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYlBFbnJvbGxtZW50TGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRlbXBEYXRhLmJhdGNoSWQgPSBiUEVucm9sbG1lbnRMaXN0W2JQRW5yb2xsbWVudExpc3QubGVuZ3RoIC0gMV0uYmF0Y2guYmF0Y2hJZFxyXG4gICAgICAgICAgICAgICAgICB0ZW1wRGF0YS5jb3Vyc2VJZCA9IHRlbXBDb250ZW50RGF0YS5pZGVudGlmaWVyXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRlbXBEYXRhXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWN1cnNpdmVseSBzZWFyY2hlcyBmb3IgYSByZXNvdXJjZSBJRCBpbiBhIGNvbnRlbnQncyBjaGlsZHJlbiBoaWVyYXJjaHlcclxuICAgKiBAcGFyYW0gY29udGVudCBUaGUgY29udGVudCBvYmplY3QgdG8gc2VhcmNoIGluXHJcbiAgICogQHBhcmFtIHJlc291cmNlSWQgVGhlIHJlc291cmNlIElEIHRvIGZpbmRcclxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHJlc291cmNlIGlzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2VcclxuICAgKi9cclxuICBwcml2YXRlIGZpbmRSZXNvdXJjZUluQ29udGVudChjb250ZW50OiBhbnksIHJlc291cmNlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBjb250ZW50IGhhcyB0aGUgcmVzb3VyY2UgaW4gaXRzIGxlYWZOb2Rlc1xyXG4gICAgaWYgKGNvbnRlbnQubGVhZk5vZGVzICYmIEFycmF5LmlzQXJyYXkoY29udGVudC5sZWFmTm9kZXMpKSB7XHJcbiAgICAgIGlmIChjb250ZW50LmxlYWZOb2Rlcy5pbmRleE9mKHJlc291cmNlSWQpICE9PSAtMSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGlzIGNvbnRlbnQncyBpZGVudGlmaWVyIG1hdGNoZXMgdGhlIHJlc291cmNlIElEXHJcbiAgICBpZiAoY29udGVudC5pZGVudGlmaWVyID09PSByZXNvdXJjZUlkKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVjdXJzaXZlbHkgc2VhcmNoIGluIGNoaWxkcmVuXHJcbiAgICBpZiAoY29udGVudC5jaGlsZHJlbiAmJiBBcnJheS5pc0FycmF5KGNvbnRlbnQuY2hpbGRyZW4pKSB7XHJcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY29udGVudC5jaGlsZHJlbikge1xyXG4gICAgICAgIGlmICh0aGlzLmZpbmRSZXNvdXJjZUluQ29udGVudChjaGlsZCwgcmVzb3VyY2VJZCkpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaW5kcyB0aGUgY291cnNlIHRoYXQgY29udGFpbnMgYSBnaXZlbiByZXNvdXJjZSBJRCBpbiBhIExlYXJuaW5nIFBhdGh3YXlcclxuICAgKiBAcGFyYW0gbGVhcm5pbmdQYXRod2F5Q29udGVudCBUaGUgTGVhcm5pbmcgUGF0aHdheSBjb250ZW50IGRhdGFcclxuICAgKiBAcGFyYW0gcmVzb3VyY2VJZCBUaGUgcmVzb3VyY2UgSUQgdG8gZmluZFxyXG4gICAqIEByZXR1cm5zIFRoZSBjb3Vyc2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlc291cmNlLCBvciBudWxsIGlmIG5vdCBmb3VuZFxyXG4gICAqL1xyXG4gIGZpbmRDb3Vyc2VDb250YWluaW5nUmVzb3VyY2UobGVhcm5pbmdQYXRod2F5Q29udGVudDogYW55LCByZXNvdXJjZUlkOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgLy8gQ2hlY2sgaWYgbWlsZXN0b25lc192MSBleGlzdHNcclxuICAgIGlmICghbGVhcm5pbmdQYXRod2F5Q29udGVudC5taWxlc3RvbmVzX3YxIHx8ICFBcnJheS5pc0FycmF5KGxlYXJuaW5nUGF0aHdheUNvbnRlbnQubWlsZXN0b25lc192MSkpIHtcclxuICAgICAgcmV0dXJuIG51bGxcclxuICAgIH1cclxuXHJcbiAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBtaWxlc3RvbmVcclxuICAgIGZvciAoY29uc3QgbWlsZXN0b25lIG9mIGxlYXJuaW5nUGF0aHdheUNvbnRlbnQubWlsZXN0b25lc192MSkge1xyXG4gICAgICAvLyBDaGVjayBpZiBtaWxlc3RvbmUgaGFzIGNvdXJzZXNcclxuICAgICAgaWYgKG1pbGVzdG9uZS5jb3Vyc2VzICYmIEFycmF5LmlzQXJyYXkobWlsZXN0b25lLmNvdXJzZXMpKSB7XHJcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggY291cnNlIGluIHRoZSBtaWxlc3RvbmVcclxuICAgICAgICBmb3IgKGNvbnN0IGNvdXJzZSBvZiBtaWxlc3RvbmUuY291cnNlcykge1xyXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjb3Vyc2UgY29udGFpbnMgdGhlIHJlc291cmNlXHJcbiAgICAgICAgICBpZiAodGhpcy5maW5kUmVzb3VyY2VJbkNvbnRlbnQoY291cnNlLCByZXNvdXJjZUlkKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY291cnNlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGxcclxuICB9XHJcblxyXG4gIGdldFJlc291cmNlQ29udGVudExhbmd1YWdlKHJlc291cmNlSWQ6IHN0cmluZykge1xyXG5cclxuICAgIGxldCB0ZW1wTGFuZ3VhZ2U6IGFueSA9ICdlbmdsaXNoJ1xyXG4gICAgbGV0IGxhbmd1YWdlRm91bmQgPSBmYWxzZVxyXG4gICAgY29uc3QgdGVtcENvbnRlbnREYXRhID0gdGhpcy5jb250ZW50U3ZjLmN1cnJlbnRNZXRhRGF0YVxyXG4gICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcclxuICAgICAgdGVtcENvbnRlbnREYXRhLmNoaWxkcmVuPy5mb3JFYWNoKGFzeW5jIChjaGlsZExpc3Q6IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xyXG4gICAgICAgIGlmIChjaGlsZExpc3QucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcclxuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICAgICBpZiAoY2hpbGRMaXN0LmxlYWZOb2RlcyAmJiBjaGlsZExpc3QubGVhZk5vZGVzLmluZGV4T2YocmVzb3VyY2VJZCkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHRlbXBMYW5ndWFnZSA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0Q29udGVudExhbmd1YWdlKGNoaWxkTGlzdClcclxuICAgICAgICAgICAgbGFuZ3VhZ2VGb3VuZCA9IHRydWVcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgKVxyXG4gICAgICBpZiAoIWxhbmd1YWdlRm91bmQpIHtcclxuICAgICAgICBpZiAodGVtcENvbnRlbnREYXRhLmxlYWZOb2RlcyAmJiB0ZW1wQ29udGVudERhdGEubGVhZk5vZGVzLmluZGV4T2YocmVzb3VyY2VJZCkgIT09IC0xKSB7XHJcbiAgICAgICAgICB0ZW1wTGFuZ3VhZ2UgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldENvbnRlbnRMYW5ndWFnZSh0ZW1wQ29udGVudERhdGEpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGVtcExhbmd1YWdlXHJcbiAgfVxyXG5cclxuICBhc3luYyBjaGVja0ZvckNvdXJzZUVucm9sbG1lbnQoY2hpbGRMaXN0OiBOc0NvbnRlbnQuSUNvbnRlbnQsIF9yZXNvdXJjZUlkOiBzdHJpbmcsIF9lbnJvbGxtZW50TGlzdDogYW55LCBfdGVtcERhdGE6IGFueSkge1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgIGNvbnN0IGNvdXJzZURhdGE6IGFueSA9IGF3YWl0IHRoaXMuY29udGVudFN2Yy5hdXRvQXNzaWduQmF0Y2hBcGkoY2hpbGRMaXN0LmlkZW50aWZpZXIpLnRvUHJvbWlzZSgpLnRoZW4oYXN5bmMgKGRhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UpID0+IHtcclxuICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMudXNlclN2Yy5mZXRjaEVucm9sbG1lbnREYXRhQnlDb250ZW50SWQodGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlPy51c2VySWQsIGNoaWxkTGlzdC5pZGVudGlmaWVyKS50b1Byb21pc2UoKS50aGVuKGFzeW5jIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuY291cnNlcyAmJiByZXMuY291cnNlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcy5jb3Vyc2VzXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gW3sgY291cnNlSWQ6IGNoaWxkTGlzdC5pZGVudGlmaWVyLCBiYXRjaElkOiAnJyB9XVxyXG5cclxuICAgICAgICB9KS5jYXRjaCgoX2VycjogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gW3sgY291cnNlSWQ6IGNoaWxkTGlzdC5pZGVudGlmaWVyLCBiYXRjaElkOiAnJyB9XVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5jb250ZW50U3ZjLmN1cnJlbnRCYXRjaEVucm9sbG1lbnRMaXN0ID0gWy4uLnRoaXMuY29udGVudFN2Yy5jdXJyZW50QmF0Y2hFbnJvbGxtZW50TGlzdCwgLi4ucmVzcG9uc2VEYXRhXVxyXG4gICAgICAgIHJldHVybiB7IGNvdXJzZUlkOiBjaGlsZExpc3QuaWRlbnRpZmllciwgYmF0Y2hJZDogcmVzcG9uc2VEYXRhWzBdLmJhdGNoSWQgfVxyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoX2VycjogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBbeyBjb3Vyc2VJZDogY2hpbGRMaXN0LmlkZW50aWZpZXIsIGJhdGNoSWQ6ICcnIH1dXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIGNvdXJzZURhdGFcclxuICB9XHJcblxyXG4gIHJlYWxUaW1lUHJvZ3Jlc3NVcGRhdGVRdWl6KGNvbnRlbnRJZDogc3RyaW5nLCBjb2xsZWN0aW9uSWQ/OiBzdHJpbmcsIGJhdGNoSWQ/OiBzdHJpbmcsIHN0YXR1cz86IG51bWJlcikge1xyXG4gICAgbGV0IHJlcTogYW55XHJcbiAgICBpZiAodGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlKSB7XHJcbiAgICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy5nZXRSZXNvdXJjZUNvbnRlbnRMYW5ndWFnZShjb250ZW50SWQpXHJcbiAgICAgIHJlcSA9IHtcclxuICAgICAgICByZXF1ZXN0OiB7XHJcbiAgICAgICAgICB1c2VySWQ6IHRoaXMuY29uZmlnc2VydmljZS51c2VyUHJvZmlsZS51c2VySWQgfHwgJycsXHJcbiAgICAgICAgICBjb250ZW50czogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29udGVudElkLFxyXG4gICAgICAgICAgICAgIGJhdGNoSWQsXHJcbiAgICAgICAgICAgICAgbGFuZ3VhZ2UsXHJcbiAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgfHwgMixcclxuICAgICAgICAgICAgICBjb3Vyc2VJZDogY29sbGVjdGlvbklkLFxyXG4gICAgICAgICAgICAgIGxhc3RBY2Nlc3NUaW1lOiBkYXlqcyhuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3M6U1NTWlonKSxcclxuICAgICAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogc3RhdHVzID09PSAyID8gMTAwIDogMCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfSxcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5odHRwXHJcbiAgICAgICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHJlcSlcclxuICAgICAgICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXHJcbiAgICAgIGlmICh0aGlzLnRvY1N2Yy5oYXNobWFwICYmIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSAmJiByZXEucmVxdWVzdC5jb250ZW50c1swXSkge1xyXG4gICAgICAgIGlmICh0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF0gJiZcclxuICAgICAgICAgICghdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPCAyKSkge1xyXG4gICAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY29tcGxldGlvblBlcmNlbnRhZ2VcclxuICAgICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uc3RhdHVzXHJcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgLy8gTm90aWZ5IFVJIGNvbXBvbmVudHMgYWJvdXQgaGFzaG1hcCBjaGFuZ2VzXHJcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwVXBkYXRlZC5uZXh0KHRoaXMudG9jU3ZjLmhhc2htYXApXHJcbiAgICAgICAgICBcclxuICAgICAgICAgIC8vIFRyaWdnZXIgbWlsZXN0b25lIGxvY2sgcmVjb21wdXRhdGlvbiBmb3IgTGVhcm5pbmcgUGF0aHdheXNcclxuICAgICAgICAgIGlmICh0aGlzLnRvY1N2Yy50cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy50cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXEgPSB7fVxyXG4gICAgICAvLyBkbyBub3RoaW5nXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDb250ZW50KGNvbnRlbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRlbnQ+IHtcclxuICAgIGNvbnN0IGZvclByZXZpZXcgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL3B1YmxpYy8nKSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnJnByZXZpZXc9dHJ1ZScpXHJcbiAgICBsZXQgdXJsID0gYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvcmVhZC8ke2NvbnRlbnRJZH1gXHJcbiAgICBpZiAoIWZvclByZXZpZXcpIHtcclxuICAgICAgdXJsID0gYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvcmVhZC8ke2NvbnRlbnRJZH1gXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ2VkaXRNb2RlPXRydWUnKSAmJiB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnX3JjJykpIHtcclxuICAgICAgICB1cmwgPSBgL2FwaXMvcHJveGllcy92OC9hY3Rpb24vY29udGVudC92My9yZWFkLyR7Y29udGVudElkfWBcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB1cmwgPSBgL2FwaS9jb250ZW50L3YxL3JlYWQvJHtjb250ZW50SWR9YFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnQ+KFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIC8vIGAvYXBpcy9hdXRoQXBpL2FjdGlvbi9jb250ZW50L2hpZXJhcmNoeS8ke2NvbnRlbnRJZH0/cm9vdE9yZz0ke3RoaXMuY29uZmlnc2VydmljZS5yb290T3JnIHx8ICdpZ290J30mb3JnPSR7dGhpcy5jb25maWdzZXJ2aWNlLmFjdGl2ZU9yZyB8fCAnZG9wdCd9YCxcclxuICAgICAgdXJsXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBnZXRBdXRob3JpbmdVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHVybFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgID8gYC9hcGlzL2F1dGhDb250ZW50LyR7dXJsLmluY2x1ZGVzKCcvY29udGVudC1zdG9yZS8nKSA/IG5ldyBVUkwodXJsKS5wYXRobmFtZS5zbGljZSgxKSA6IGVuY29kZVVSSUNvbXBvbmVudCh1cmwpfWBcclxuICAgICAgOiAnJ1xyXG4gIH1cclxuXHJcbiAgcmVnZXhEb3dubG9hZFJlcGxhY2UgPSAoX3N0ciA9ICcnLCBncm91cDE6IHN0cmluZywgZ3JvdXAyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gICAgcmV0dXJuIGAke3RoaXMuYXV0aG9yaW5nQmFzZX0ke2VuY29kZVVSSUNvbXBvbmVudChncm91cDEpfSR7Z3JvdXAyfWBcclxuICB9XHJcblxyXG4gIHJlcGxhY2VUb0F1dGhVcmwoZGF0YTogYW55KTogYW55IHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKFxyXG4gICAgICBKU09OLnN0cmluZ2lmeShkYXRhKS5yZXBsYWNlKFxyXG4gICAgICAgIHRoaXMuZG93bmxvYWRSZWdleCxcclxuICAgICAgICB0aGlzLnJlZ2V4RG93bmxvYWRSZXBsYWNlLFxyXG4gICAgICApLFxyXG4gICAgKVxyXG4gIH1cclxuICByZWFkU2VjdGlvbnMoYXNzZXNzbWVudElkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBgJHt0aGlzLkFQSV9FTkRQT0lOVFN9LyR7YXNzZXNzbWVudElkfWBcclxuICB9XHJcblxyXG4gIGdldFB1YmxpY1VybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBtYWluVXJsID0gdXJsLnNwbGl0KCcvY29udGVudCcpLnBvcCgpIHx8ICcnXHJcbiAgICByZXR1cm4gYCR7dGhpcy5lbnZpcm9ubWVudC5jb250ZW50SG9zdH0vJHt0aGlzLmVudmlyb25tZW50LmNvbnRlbnRCdWNrZXR9L2NvbnRlbnQke21haW5Vcmx9YFxyXG4gIH1cclxuXHJcbiAgZ2V0Q2RuVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG1haW5VcmwgPSB1cmwuc3BsaXQoJy9jb250ZW50JykucG9wKCkgfHwgJydcclxuICAgIHJldHVybiBgJHt0aGlzLmRvbWFpbkNvbmZTdmMuZ2V0RG9tYWluQ0ROSG9zdCgpfS8ke3RoaXMuZW52aXJvbm1lbnQuY2RuQ29udGVudEJ1Y2tldH0vY29udGVudCR7bWFpblVybH1gXHJcbiAgfVxyXG5cclxuICAvLyAgZmV0Y2hDb250ZW50KFxyXG4gIC8vICAgY29udGVudElkOiBzdHJpbmcsXHJcbiAgLy8gICBoaWVyYXJjaHlUeXBlOiAnYWxsJyB8ICdtaW5pbWFsJyB8ICdkZXRhaWwnID0gJ2RldGFpbCdcclxuICAvLyAgICk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250ZW50PiB7XHJcbiAgLy8gICAgIGxldCB1cmwgPSAnJ1xyXG4gIC8vICAgICBjb25zdCBmb3JQcmV2aWV3ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9wdWJsaWMvJykgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJyZwcmV2aWV3PXRydWUnKVxyXG4gIC8vICAgICAgIGlmICghZm9yUHJldmlldykge1xyXG4gIC8vICAgICAgICAgdXJsID0gYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvaGllcmFyY2h5LyR7Y29udGVudElkfT9oaWVyYXJjaHlUeXBlPSR7aGllcmFyY2h5VHlwZX1gXHJcbiAgLy8gICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgIHVybCA9IGAvYXBpL2NvdXJzZS92MS9oaWVyYXJjaHkvJHtjb250ZW50SWR9P2hpZXJhcmNoeVR5cGU9JHtoaWVyYXJjaHlUeXBlfWBcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50Pih1cmwpXHJcbiAgLy8gICB9XHJcblxyXG4gIGZldGNoQ29udGVudChpZDogc3RyaW5nLCB0eXBlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29udGVudD4oYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvaGllcmFyY2h5LyR7aWR9P21vZGU9JHt0eXBlfWApXHJcbiAgfVxyXG5cclxuICB1cGRhdGVDb250ZW50SGFzaE1hcEZvckFzc2Vzc3RlbnQoY29udGVudElkOiBzdHJpbmcsIGNvbnRlbnRQcm9ncmVzczogYW55KSB7XHJcbiAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdICYmXHJcbiAgICAgICghdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPCAyKSkge1xyXG4gICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSBjb250ZW50UHJvZ3Jlc3MuY29tcGxldGlvblBlcmNlbnRhZ2VcclxuICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPSBjb250ZW50UHJvZ3Jlc3Muc3RhdHVzXHJcbiAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXAgPSB7IC4uLnRoaXMudG9jU3ZjLmhhc2htYXAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybUJ5SWQoZm9ybUlkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuQVBJX0VORFBPSU5UUy5HRVRfRk9STV9CWUlEKGZvcm1JZCkpXHJcbiAgfVxyXG5cclxuICBzdWJtaXRGb3JtKGZvcm1EYXRhOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KHRoaXMuQVBJX0VORFBPSU5UUy5TVUJNSVRfRk9STSwgZm9ybURhdGEpXHJcbiAgfVxyXG5cclxuICByZWFsVGltZVByb2dyZXNzVXBkYXRlRm9yUHJlQXNzZXNzbWVudChjb250ZW50SWQ6IHN0cmluZywgcmVxdWVzdDogYW55KSB7XHJcbiAgICBsZXQgcmVxOiBhbnlcclxuICAgIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUpIHtcclxuICAgICAgcmVxID0ge1xyXG4gICAgICAgIHJlcXVlc3Q6IHtcclxuICAgICAgICAgIHVzZXJJZDogdGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlLnVzZXJJZCB8fCAnJyxcclxuICAgICAgICAgIGNvbnRlbnRzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBjb250ZW50SWQsXHJcbiAgICAgICAgICAgICAgLy8gYmF0Y2hJZCxcclxuICAgICAgICAgICAgICBzdGF0dXM6IHRoaXMuZ2V0U3RhdHVzKHJlcXVlc3QuY3VycmVudCwgcmVxdWVzdC5tYXhfc2l6ZSwgcmVxdWVzdC5taW1lX3R5cGUpLFxyXG4gICAgICAgICAgICAgIC8vIGNvdXJzZUlkOiBjb2xsZWN0aW9uSWQsXHJcbiAgICAgICAgICAgICAgbGFzdEFjY2Vzc1RpbWU6IGRheWpzKG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzczpTU1NaWicpLFxyXG4gICAgICAgICAgICAgIHByb2dyZXNzZGV0YWlsczoge1xyXG4gICAgICAgICAgICAgICAgbWF4X3NpemU6IHJlcXVlc3QubWF4X3NpemUsXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50OiByZXF1ZXN0LmN1cnJlbnQsXHJcbiAgICAgICAgICAgICAgICBtaW1lVHlwZTogcmVxdWVzdC5taW1lX3R5cGUsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogdGhpcy5jYWxjdWxhdGVQZXJjZW50KHJlcXVlc3QuY3VycmVudCwgcmVxdWVzdC5tYXhfc2l6ZSwgcmVxdWVzdC5taW1lX3R5cGUpLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9LFxyXG4gICAgICB9XHJcbiAgICAgIC8vIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UuY3N0b2tlbiAhPT0gJycpIHtcclxuICAgICAgLy8gICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKClcclxuICAgICAgLy8gICAuc2V0KCdjc3Rva2VuJywgdGhpcy5jb25maWdzZXJ2aWNlLmNzdG9rZW4pXHJcblxyXG4gICAgICAvLyAgIHRoaXMuaHR0cFxyXG4gICAgICAvLyAgIC5wYXRjaChgJHt0aGlzLkFQSV9FTkRQT0lOVFMuUFJPR1JFU1NfVVBEQVRFfS8ke2NvbnRlbnRJZH1gLCB7IGhlYWRlcnMgfSAsIHJlcSlcclxuICAgICAgLy8gICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXHJcbiAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgIC8vICAgdGhpcy5odHRwXHJcbiAgICAgIC8vICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHJlcSlcclxuICAgICAgLy8gICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gdGhpcy5odHRwXHJcbiAgICAgIC8vICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHJlcSlcclxuICAgICAgLy8gICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXHJcbiAgICAgIC8vY29uc3QgY29udGVudElkTmV3PSByZXEucmVxdWVzdC5jb250ZW50c1swXS5jb250ZW50SWRcclxuICAgICAgLy8gY29uc3QgdXBkYXRlZENvbXBsZXRpb25QZXJjZW50YWdlID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY29tcGxldGlvblBlcmNlbnRhZ2VcclxuICAgICAgLy8gY29uc3QgdXBkYXRlZFN0YXR1cyA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLnN0YXR1c1xyXG5cclxuICAgICAgLy8gLy8gQ2xvbmUgdGhlIGlubmVyIG9iamVjdCBhbmQgdXBkYXRlXHJcbiAgICAgIC8vIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkTmV3XSB8fCB7fVxyXG5cclxuICAgICAgLy8gdGhpcy50b2NTdmMuaGFzaG1hcCA9IHtcclxuICAgICAgLy8gICAuLi50aGlzLnRvY1N2Yy5oYXNobWFwLFxyXG4gICAgICAvLyAgIFtjb250ZW50SWROZXddOiB7XHJcbiAgICAgIC8vICAgICAuLi5leGlzdGluZ0NvbnRlbnQsXHJcbiAgICAgIC8vICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogdXBkYXRlZENvbXBsZXRpb25QZXJjZW50YWdlLFxyXG4gICAgICAvLyAgICAgY29tcGxldGlvblN0YXR1czogdXBkYXRlZFN0YXR1c1xyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgICAvLyBjb25zb2xlLmxvZygncmVxJywgSlNPTi5zdHJpbmdpZnkocmVxKSlcclxuICAgICAgLy8gY29uc29sZS5sb2coJ3JlcScsIHJlcSlcclxuXHJcbiAgICAgIGNvbnN0IHJlc291cmNlU3RhdHVzID0gdGhpcy5nZXRQcmVBc3Nlc3NtZW50UmVzb3VyY2VTdGF0dXMoY29udGVudElkKVxyXG4gICAgICBpZiAocmVzb3VyY2VTdGF0dXMgPCAyKSB7XHJcbiAgICAgICAgdGhpcy5odHRwXHJcbiAgICAgICAgICAucGF0Y2goYCR7dGhpcy5BUElfRU5EUE9JTlRTLlBSRV9BU1NFU1NNRU5UX1NUQVRFX1VQREFURX1gLCByZXEpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSAmJlxyXG4gICAgICAgICghdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPCAyKSkge1xyXG4gICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLmNvbXBsZXRpb25QZXJjZW50YWdlXHJcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPSByZXEucmVxdWVzdC5jb250ZW50c1swXS5zdGF0dXNcclxuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ3BhcmVudCddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY291cnNlSWRcclxuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ3Byb2dyZXNzJ10gPSByZXEucmVxdWVzdC5jb250ZW50c1swXS5wcm9ncmVzc2RldGFpbHNcclxuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBOb3RpZnkgVUkgY29tcG9uZW50cyBhYm91dCBoYXNobWFwIGNoYW5nZXNcclxuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwVXBkYXRlZC5uZXh0KHRoaXMudG9jU3ZjLmhhc2htYXApXHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gVHJpZ2dlciBtaWxlc3RvbmUgbG9jayByZWNvbXB1dGF0aW9uIGZvciBMZWFybmluZyBQYXRod2F5c1xyXG4gICAgICAgIGlmICh0aGlzLnRvY1N2Yy50cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSkge1xyXG4gICAgICAgICAgdGhpcy50b2NTdmMudHJpZ2dlck1pbGVzdG9uZUxvY2tVcGRhdGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gY29uc29sZS5sb2coJ1VwZGF0ZWQgaGFzaG1hcDonLCB0aGlzLnRvY1N2Yy5oYXNobWFwKVxyXG5cclxuICAgICAgLy8gY29uc29sZS5sb2coJ3RoaXMudG9jU3ZjLmhhc2htYXAtLS0nLCB0aGlzLnRvY1N2Yy5oYXNobWFwKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVxID0ge31cclxuICAgICAgLy8gZG8gbm90aGluZ1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVhbFRpbWVQcm9ncmVzc1VwZGF0ZUZvclByZUFzc2Vzc21lbnRRdWl6KGNvbnRlbnRJZDogc3RyaW5nLCBzdGF0dXM/OiBudW1iZXIsIG1pbWVUeXBlPzogc3RyaW5nKSB7XHJcbiAgICBsZXQgcmVxOiBhbnlcclxuICAgIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUpIHtcclxuICAgICAgcmVxID0ge1xyXG4gICAgICAgIHJlcXVlc3Q6IHtcclxuICAgICAgICAgIC8vdXNlcklkOiB0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUudXNlcklkIHx8ICcnLFxyXG4gICAgICAgICAgY29udGVudHM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbnRlbnRJZCxcclxuICAgICAgICAgICAgICAvLyBiYXRjaElkLFxyXG4gICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzIHx8IDIsXHJcbiAgICAgICAgICAgICAgLy8gY291cnNlSWQ6IGNvbGxlY3Rpb25JZCxcclxuICAgICAgICAgICAgICBsYXN0QWNjZXNzVGltZTogZGF5anMobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzOlNTU1paJyksXHJcbiAgICAgICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IHN0YXR1cyA9PT0gMiA/IDEwMC4wIDogMCxcclxuICAgICAgICAgICAgICBwcm9ncmVzc2RldGFpbHM6IHtcclxuICAgICAgICAgICAgICAgIFwibWltZVR5cGVcIjogbWltZVR5cGUgfHwgXCJhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbnNldFwiXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfSxcclxuICAgICAgfVxyXG4gICAgICBjb25zdCByZXNvdXJjZVN0YXR1cyA9IHRoaXMuZ2V0UHJlQXNzZXNzbWVudFJlc291cmNlU3RhdHVzKGNvbnRlbnRJZClcclxuICAgICAgaWYgKHJlc291cmNlU3RhdHVzIDwgMikge1xyXG4gICAgICAgIHRoaXMuaHR0cFxyXG4gICAgICAgICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUkVfQVNTRVNTTUVOVF9TVEFURV9VUERBVEV9YCwgcmVxKVxyXG4gICAgICAgICAgLnN1YnNjcmliZShub29wLCBub29wKVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnRvY1N2Yy5oYXNobWFwICYmIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSAmJiByZXEucmVxdWVzdC5jb250ZW50c1swXSkge1xyXG4gICAgICAgIGlmICh0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF0gJiZcclxuICAgICAgICAgICghdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPCAyKSkge1xyXG4gICAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY29tcGxldGlvblBlcmNlbnRhZ2VcclxuICAgICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uc3RhdHVzXHJcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgLy8gTm90aWZ5IFVJIGNvbXBvbmVudHMgYWJvdXQgaGFzaG1hcCBjaGFuZ2VzXHJcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwVXBkYXRlZC5uZXh0KHRoaXMudG9jU3ZjLmhhc2htYXApXHJcbiAgICAgICAgICBcclxuICAgICAgICAgIC8vIFRyaWdnZXIgbWlsZXN0b25lIGxvY2sgcmVjb21wdXRhdGlvbiBmb3IgTGVhcm5pbmcgUGF0aHdheXNcclxuICAgICAgICAgIGlmICh0aGlzLnRvY1N2Yy50cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy50cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXEgPSB7fVxyXG4gICAgICAvLyBkbyBub3RoaW5nXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRQcmVBc3Nlc3NtZW50UmVzb3VyY2VTdGF0dXMocmVzb3VyY2VJZDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy50b2NTdmMgJiYgdGhpcy50b2NTdmMuaGFzaG1hcCAmJiB0aGlzLnRvY1N2Yy5oYXNobWFwW3Jlc291cmNlSWRdKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRvY1N2Yy5oYXNobWFwW3Jlc291cmNlSWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgMVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIDFcclxuICB9XHJcblxyXG5cclxufVxyXG4iXX0=