@sunbird-cb/toc 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (495) hide show
  1. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.component.mjs +55 -0
  2. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.module.mjs +126 -0
  3. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.component.mjs +32 -0
  4. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.module.mjs +85 -0
  5. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.component.mjs +100 -0
  6. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.module.mjs +48 -0
  7. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +120 -0
  8. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +92 -0
  9. package/esm2022/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.mjs +48 -0
  10. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.component.mjs +25 -0
  11. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.module.mjs +41 -0
  12. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover-card.component.mjs +89 -0
  13. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.module.mjs +42 -0
  14. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.servive.mjs +41 -0
  15. package/esm2022/lib/_collection/_common/connection-name/connection-name.component.mjs +78 -0
  16. package/esm2022/lib/_collection/_common/connection-name/connection-name.module.mjs +45 -0
  17. package/esm2022/lib/_collection/_common/connection-name/profile-v2.model.mjs +2 -0
  18. package/esm2022/lib/_collection/_common/content-progress/content-progress.component.mjs +70 -0
  19. package/esm2022/lib/_collection/_common/content-progress/content-progress.module.mjs +28 -0
  20. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.mjs +187 -0
  21. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.mjs +86 -0
  22. package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +31 -0
  23. package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +941 -0
  24. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.mjs +183 -0
  25. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.mjs +327 -0
  26. package/esm2022/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.mjs +297 -0
  27. package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +223 -0
  28. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +591 -0
  29. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.mjs +16 -0
  30. package/esm2022/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.mjs +43 -0
  31. package/esm2022/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.mjs +133 -0
  32. package/esm2022/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.mjs +66 -0
  33. package/esm2022/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.mjs +278 -0
  34. package/esm2022/lib/_collection/_common/content-toc/content-services/handle-claim.service.mjs +21 -0
  35. package/esm2022/lib/_collection/_common/content-toc/content-services/review-component-data.service.mjs +21 -0
  36. package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +847 -0
  37. package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +219 -0
  38. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +209 -0
  39. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.module.mjs +26 -0
  40. package/esm2022/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.mjs +19 -0
  41. package/esm2022/lib/_collection/_common/content-toc/pipes/truncate.pipe.mjs +23 -0
  42. package/esm2022/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.mjs +113 -0
  43. package/esm2022/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.mjs +110 -0
  44. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.component.mjs +26 -0
  45. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.module.mjs +19 -0
  46. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.mjs +67 -0
  47. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.mjs +28 -0
  48. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.component.mjs +77 -0
  49. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.model.mjs +2 -0
  50. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.module.mjs +61 -0
  51. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.module.mjs +20 -0
  52. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +73 -0
  53. package/esm2022/lib/_collection/_common/player-brief/player-brief.component.mjs +139 -0
  54. package/esm2022/lib/_collection/_common/player-brief/player-brief.module.mjs +71 -0
  55. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.component.mjs +34 -0
  56. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.module.mjs +56 -0
  57. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.component.mjs +25 -0
  58. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.module.mjs +37 -0
  59. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.mjs +32 -0
  60. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner.module.mjs +30 -0
  61. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +38 -0
  62. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.mjs +51 -0
  63. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.component.mjs +115 -0
  64. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.model.mjs +12 -0
  65. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.module.mjs +51 -0
  66. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.service.mjs +61 -0
  67. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.component.mjs +87 -0
  68. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.module.mjs +36 -0
  69. package/esm2022/lib/_collection/_common/user-image/user-image.component.mjs +62 -0
  70. package/esm2022/lib/_collection/_common/user-image/user-image.module.mjs +24 -0
  71. package/esm2022/lib/_collection/btn-page-back/btn-page-back.component.mjs +192 -0
  72. package/esm2022/lib/_collection/btn-page-back/btn-page-back.module.mjs +44 -0
  73. package/esm2022/lib/_collection/btn-page-back/btn-page-back.service.mjs +99 -0
  74. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.component.mjs +58 -0
  75. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.module.mjs +67 -0
  76. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.component.mjs +112 -0
  77. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.model.mjs +2 -0
  78. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.module.mjs +69 -0
  79. package/esm2022/lib/_collection-api.mjs +57 -0
  80. package/esm2022/lib/_constants/widget-content.constants.mjs +19 -0
  81. package/esm2022/lib/_directives/tooltip.directive.mjs +68 -0
  82. package/esm2022/lib/_models/common.model.mjs +2 -0
  83. package/esm2022/lib/_models/error.model.mjs +2 -0
  84. package/esm2022/lib/_pipes/highlight.pipe.mjs +24 -0
  85. package/esm2022/lib/_services/rating.service.mjs +89 -0
  86. package/esm2022/lib/_services/samuhik-charcha.service.mjs +29 -0
  87. package/esm2022/lib/_services/viewer-route-util.mjs +103 -0
  88. package/esm2022/lib/_services/widget-content.model.mjs +246 -0
  89. package/esm2022/lib/_services/widget-content.service.mjs +589 -0
  90. package/esm2022/lib/_shared/translate-loader.factory.mjs +9 -0
  91. package/esm2022/lib/app-toc-lib.module.mjs +499 -0
  92. package/esm2022/lib/collection.config.mjs +161 -0
  93. package/esm2022/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.mjs +37 -0
  94. package/esm2022/lib/components/app-toc-banner/app-toc-banner.component.mjs +1436 -0
  95. package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +475 -0
  96. package/esm2022/lib/components/app-toc-cios-home/consent-dialog.component.mjs +119 -0
  97. package/esm2022/lib/components/app-toc-cohorts/app-toc-cohorts.component.mjs +80 -0
  98. package/esm2022/lib/components/app-toc-content-card/app-toc-content-card.component.mjs +249 -0
  99. package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +39 -0
  100. package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +58 -0
  101. package/esm2022/lib/components/app-toc-home/app-toc-home.component.mjs +2229 -0
  102. package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +2796 -0
  103. package/esm2022/lib/components/app-toc-overview/app-toc-overview.component.mjs +157 -0
  104. package/esm2022/lib/components/app-toc-session-card/app-toc-session-card.component.mjs +48 -0
  105. package/esm2022/lib/components/app-toc-sessions/app-toc-sessions.component.mjs +47 -0
  106. package/esm2022/lib/components/app-toc-single-page/app-toc-single-page.component.mjs +766 -0
  107. package/esm2022/lib/components/completion-survey-form/completion-survey-form.component.mjs +243 -0
  108. package/esm2022/lib/components/create-batch-dialog/create-batch-dialog.component.mjs +116 -0
  109. package/esm2022/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.mjs +44 -0
  110. package/esm2022/lib/components/enroll-profile-form/enroll-profile-form.component.mjs +1838 -0
  111. package/esm2022/lib/components/enroll-questionnaire/enroll-questionnaire.component.mjs +236 -0
  112. package/esm2022/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.mjs +213 -0
  113. package/esm2022/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.mjs +36 -0
  114. package/esm2022/lib/components/public-survey-form/public-survey-form.component.mjs +256 -0
  115. package/esm2022/lib/components/survey-form-question/survey-form-question.component.mjs +133 -0
  116. package/esm2022/lib/components/survey-form-section/survey-form-section.component.mjs +36 -0
  117. package/esm2022/lib/models/app-toc-analytics.model.mjs +2 -0
  118. package/esm2022/lib/models/app-toc.model.mjs +38 -0
  119. package/esm2022/lib/models/auto-complete.model.mjs +2 -0
  120. package/esm2022/lib/models/card-content.model.mjs +13 -0
  121. package/esm2022/lib/models/content-strip-with-tabs.model.mjs +2 -0
  122. package/esm2022/lib/models/discussion-forum.model.mjs +14 -0
  123. package/esm2022/lib/models/goal.model.mjs +2 -0
  124. package/esm2022/lib/models/meta-tag.model.mjs +8 -0
  125. package/esm2022/lib/models/playlist.model.mjs +2 -0
  126. package/esm2022/lib/models/profile-revamp.model.mjs +2 -0
  127. package/esm2022/lib/models/rating.model.mjs +2 -0
  128. package/esm2022/lib/models/user-profile.model.mjs +21 -0
  129. package/esm2022/lib/resolvers/app-toc-cios-resolver.service.mjs +24 -0
  130. package/esm2022/lib/resolvers/app-toc-cios-user-enroll-resolver.service.mjs +24 -0
  131. package/esm2022/lib/resolvers/app-toc-content-read-resolver.service.mjs +60 -0
  132. package/esm2022/lib/resolvers/app-toc-ext-public-resolver.service.mjs +25 -0
  133. package/esm2022/lib/resolvers/app-toc-resolver.service.mjs +106 -0
  134. package/esm2022/lib/resolvers/config-resolver.service.mjs +25 -0
  135. package/esm2022/lib/resolvers/profile-resolver.service.mjs +25 -0
  136. package/esm2022/lib/resolvers/restricted-features-resolver.service.mjs +25 -0
  137. package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +51 -0
  138. package/esm2022/lib/routes/app-toc-home/app-toc-home.directive.mjs +16 -0
  139. package/esm2022/lib/routes/app-toc-home/app-toc-home.service.mjs +18 -0
  140. package/esm2022/lib/services/access-control.service.mjs +56 -0
  141. package/esm2022/lib/services/action.service.mjs +23 -0
  142. package/esm2022/lib/services/app-toc-v2.service.mjs +47 -0
  143. package/esm2022/lib/services/app-toc.service.mjs +1001 -0
  144. package/esm2022/lib/services/certificate.service.mjs +69 -0
  145. package/esm2022/lib/services/discuss-utils.service.mjs +58 -0
  146. package/esm2022/lib/services/editor.service.mjs +34 -0
  147. package/esm2022/lib/services/load-check.service.mjs +21 -0
  148. package/esm2022/lib/services/loader.service.mjs +33 -0
  149. package/esm2022/lib/services/mobile-apps.service.mjs +67 -0
  150. package/esm2022/lib/services/netcore.service.mjs +56 -0
  151. package/esm2022/lib/services/nps-grid.service.mjs +31 -0
  152. package/esm2022/lib/services/otp.service.mjs +43 -0
  153. package/esm2022/lib/services/profile-v2.service.mjs +43 -0
  154. package/esm2022/lib/services/reset-ratings.service.mjs +19 -0
  155. package/esm2022/lib/services/resource-download-helper.service.mjs +64 -0
  156. package/esm2022/lib/services/timer.service.mjs +23 -0
  157. package/esm2022/lib/services/title-tag.service.mjs +71 -0
  158. package/esm2022/lib/services/user-profile.service.mjs +55 -0
  159. package/esm2022/lib/services/viewer-data.service.mjs +64 -0
  160. package/esm2022/lib/services/viewer-util.service.mjs +500 -0
  161. package/esm2022/lib/share-toc/share-toc/share-toc.component.mjs +291 -0
  162. package/esm2022/lib/share-toc/share-toc.module.mjs +119 -0
  163. package/esm2022/public-api.mjs +56 -0
  164. package/esm2022/sunbird-cb-toc.mjs +5 -0
  165. package/fesm2022/sunbird-cb-toc.mjs +23517 -0
  166. package/fesm2022/sunbird-cb-toc.mjs.map +1 -0
  167. package/index.d.ts +6 -0
  168. package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +17 -0
  169. package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts.map +1 -0
  170. package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +32 -0
  171. package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts.map +1 -0
  172. package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +16 -0
  173. package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts.map +1 -0
  174. package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +21 -0
  175. package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts.map +1 -0
  176. package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +23 -0
  177. package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts.map +1 -0
  178. package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +16 -0
  179. package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts.map +1 -0
  180. package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +23 -0
  181. package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts.map +1 -0
  182. package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +23 -0
  183. package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts.map +1 -0
  184. package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +10 -0
  185. package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts.map +1 -0
  186. package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +12 -0
  187. package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts.map +1 -0
  188. package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +13 -0
  189. package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts.map +1 -0
  190. package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +19 -0
  191. package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts.map +1 -0
  192. package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +15 -0
  193. package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts.map +1 -0
  194. package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +12 -0
  195. package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts.map +1 -0
  196. package/lib/_collection/_common/connection-name/connection-name.component.d.ts +18 -0
  197. package/lib/_collection/_common/connection-name/connection-name.component.d.ts.map +1 -0
  198. package/lib/_collection/_common/connection-name/connection-name.module.d.ts +15 -0
  199. package/lib/_collection/_common/connection-name/connection-name.module.d.ts.map +1 -0
  200. package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +200 -0
  201. package/lib/_collection/_common/connection-name/profile-v2.model.d.ts.map +1 -0
  202. package/lib/_collection/_common/content-progress/content-progress.component.d.ts +17 -0
  203. package/lib/_collection/_common/content-progress/content-progress.component.d.ts.map +1 -0
  204. package/lib/_collection/_common/content-progress/content-progress.module.d.ts +11 -0
  205. package/lib/_collection/_common/content-progress/content-progress.module.d.ts.map +1 -0
  206. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +39 -0
  207. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts.map +1 -0
  208. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +20 -0
  209. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts.map +1 -0
  210. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +12 -0
  211. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts.map +1 -0
  212. package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +184 -0
  213. package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts.map +1 -0
  214. package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +42 -0
  215. package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts.map +1 -0
  216. package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +55 -0
  217. package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts.map +1 -0
  218. package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +48 -0
  219. package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts.map +1 -0
  220. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +49 -0
  221. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts.map +1 -0
  222. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +92 -0
  223. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts.map +1 -0
  224. package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +9 -0
  225. package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts.map +1 -0
  226. package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +17 -0
  227. package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts.map +1 -0
  228. package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +41 -0
  229. package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts.map +1 -0
  230. package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +22 -0
  231. package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts.map +1 -0
  232. package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +46 -0
  233. package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts.map +1 -0
  234. package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +11 -0
  235. package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts.map +1 -0
  236. package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +11 -0
  237. package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts.map +1 -0
  238. package/lib/_collection/_common/content-toc/content-toc.component.d.ts +129 -0
  239. package/lib/_collection/_common/content-toc/content-toc.component.d.ts.map +1 -0
  240. package/lib/_collection/_common/content-toc/content-toc.module.d.ts +52 -0
  241. package/lib/_collection/_common/content-toc/content-toc.module.d.ts.map +1 -0
  242. package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +30 -0
  243. package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts.map +1 -0
  244. package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +10 -0
  245. package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts.map +1 -0
  246. package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +8 -0
  247. package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts.map +1 -0
  248. package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +8 -0
  249. package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts.map +1 -0
  250. package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +29 -0
  251. package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts.map +1 -0
  252. package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +25 -0
  253. package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts.map +1 -0
  254. package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +15 -0
  255. package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts.map +1 -0
  256. package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +10 -0
  257. package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts.map +1 -0
  258. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +13 -0
  259. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts.map +1 -0
  260. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +11 -0
  261. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts.map +1 -0
  262. package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +23 -0
  263. package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts.map +1 -0
  264. package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +9 -0
  265. package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts.map +1 -0
  266. package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +19 -0
  267. package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts.map +1 -0
  268. package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +9 -0
  269. package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts.map +1 -0
  270. package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +17 -0
  271. package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts.map +1 -0
  272. package/lib/_collection/_common/player-brief/player-brief.component.d.ts +36 -0
  273. package/lib/_collection/_common/player-brief/player-brief.component.d.ts.map +1 -0
  274. package/lib/_collection/_common/player-brief/player-brief.module.d.ts +20 -0
  275. package/lib/_collection/_common/player-brief/player-brief.module.d.ts.map +1 -0
  276. package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +15 -0
  277. package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts.map +1 -0
  278. package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +14 -0
  279. package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts.map +1 -0
  280. package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +12 -0
  281. package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts.map +1 -0
  282. package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +12 -0
  283. package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts.map +1 -0
  284. package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +16 -0
  285. package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts.map +1 -0
  286. package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +11 -0
  287. package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts.map +1 -0
  288. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +17 -0
  289. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts.map +1 -0
  290. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +12 -0
  291. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts.map +1 -0
  292. package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +35 -0
  293. package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts.map +1 -0
  294. package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +18 -0
  295. package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts.map +1 -0
  296. package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +16 -0
  297. package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts.map +1 -0
  298. package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +16 -0
  299. package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts.map +1 -0
  300. package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +22 -0
  301. package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts.map +1 -0
  302. package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +13 -0
  303. package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts.map +1 -0
  304. package/lib/_collection/_common/user-image/user-image.component.d.ts +22 -0
  305. package/lib/_collection/_common/user-image/user-image.component.d.ts.map +1 -0
  306. package/lib/_collection/_common/user-image/user-image.module.d.ts +10 -0
  307. package/lib/_collection/_common/user-image/user-image.module.d.ts.map +1 -0
  308. package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +48 -0
  309. package/lib/_collection/btn-page-back/btn-page-back.component.d.ts.map +1 -0
  310. package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +15 -0
  311. package/lib/_collection/btn-page-back/btn-page-back.module.d.ts.map +1 -0
  312. package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +23 -0
  313. package/lib/_collection/btn-page-back/btn-page-back.service.d.ts.map +1 -0
  314. package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +20 -0
  315. package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts.map +1 -0
  316. package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +16 -0
  317. package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts.map +1 -0
  318. package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +26 -0
  319. package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts.map +1 -0
  320. package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +22 -0
  321. package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts.map +1 -0
  322. package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +19 -0
  323. package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts.map +1 -0
  324. package/lib/_collection-api.d.ts +35 -0
  325. package/lib/_collection-api.d.ts.map +1 -0
  326. package/lib/_constants/widget-content.constants.d.ts +8 -0
  327. package/lib/_constants/widget-content.constants.d.ts.map +1 -0
  328. package/lib/_directives/tooltip.directive.d.ts +18 -0
  329. package/lib/_directives/tooltip.directive.d.ts.map +1 -0
  330. package/lib/_models/common.model.d.ts +4 -0
  331. package/lib/_models/common.model.d.ts.map +1 -0
  332. package/lib/_models/error.model.d.ts +6 -0
  333. package/lib/_models/error.model.d.ts.map +1 -0
  334. package/lib/_pipes/highlight.pipe.d.ts +11 -0
  335. package/lib/_pipes/highlight.pipe.d.ts.map +1 -0
  336. package/lib/_services/rating.service.d.ts +19 -0
  337. package/lib/_services/rating.service.d.ts.map +1 -0
  338. package/lib/_services/samuhik-charcha.service.d.ts +14 -0
  339. package/lib/_services/samuhik-charcha.service.d.ts.map +1 -0
  340. package/lib/_services/viewer-route-util.d.ts +9 -0
  341. package/lib/_services/viewer-route-util.d.ts.map +1 -0
  342. package/lib/_services/widget-content.model.d.ts +515 -0
  343. package/lib/_services/widget-content.model.d.ts.map +1 -0
  344. package/lib/_services/widget-content.service.d.ts +101 -0
  345. package/lib/_services/widget-content.service.d.ts.map +1 -0
  346. package/lib/_shared/translate-loader.factory.d.ts +8 -0
  347. package/lib/_shared/translate-loader.factory.d.ts.map +1 -0
  348. package/lib/app-toc-lib.module.d.ts +89 -0
  349. package/lib/app-toc-lib.module.d.ts.map +1 -0
  350. package/lib/collection.config.d.ts +160 -0
  351. package/lib/collection.config.d.ts.map +1 -0
  352. package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +18 -0
  353. package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts.map +1 -0
  354. package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +226 -0
  355. package/lib/components/app-toc-banner/app-toc-banner.component.d.ts.map +1 -0
  356. package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +79 -0
  357. package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts.map +1 -0
  358. package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +23 -0
  359. package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts.map +1 -0
  360. package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +32 -0
  361. package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts.map +1 -0
  362. package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +48 -0
  363. package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts.map +1 -0
  364. package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +15 -0
  365. package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts.map +1 -0
  366. package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +22 -0
  367. package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts.map +1 -0
  368. package/lib/components/app-toc-home/app-toc-home.component.d.ts +315 -0
  369. package/lib/components/app-toc-home/app-toc-home.component.d.ts.map +1 -0
  370. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +386 -0
  371. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts.map +1 -0
  372. package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +48 -0
  373. package/lib/components/app-toc-overview/app-toc-overview.component.d.ts.map +1 -0
  374. package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +23 -0
  375. package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts.map +1 -0
  376. package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +15 -0
  377. package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts.map +1 -0
  378. package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +150 -0
  379. package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts.map +1 -0
  380. package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +43 -0
  381. package/lib/components/completion-survey-form/completion-survey-form.component.d.ts.map +1 -0
  382. package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +28 -0
  383. package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts.map +1 -0
  384. package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +16 -0
  385. package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts.map +1 -0
  386. package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +196 -0
  387. package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts.map +1 -0
  388. package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +45 -0
  389. package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts.map +1 -0
  390. package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +55 -0
  391. package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts.map +1 -0
  392. package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +19 -0
  393. package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts.map +1 -0
  394. package/lib/components/public-survey-form/public-survey-form.component.d.ts +44 -0
  395. package/lib/components/public-survey-form/public-survey-form.component.d.ts.map +1 -0
  396. package/lib/components/survey-form-question/survey-form-question.component.d.ts +21 -0
  397. package/lib/components/survey-form-question/survey-form-question.component.d.ts.map +1 -0
  398. package/lib/components/survey-form-section/survey-form-section.component.d.ts +14 -0
  399. package/lib/components/survey-form-section/survey-form-section.component.d.ts.map +1 -0
  400. package/lib/models/app-toc-analytics.model.d.ts +153 -0
  401. package/lib/models/app-toc-analytics.model.d.ts.map +1 -0
  402. package/lib/models/app-toc.model.d.ts +85 -0
  403. package/lib/models/app-toc.model.d.ts.map +1 -0
  404. package/lib/models/auto-complete.model.d.ts +28 -0
  405. package/lib/models/auto-complete.model.d.ts.map +1 -0
  406. package/lib/models/card-content.model.d.ts +20 -0
  407. package/lib/models/card-content.model.d.ts.map +1 -0
  408. package/lib/models/content-strip-with-tabs.model.d.ts +45 -0
  409. package/lib/models/content-strip-with-tabs.model.d.ts.map +1 -0
  410. package/lib/models/discussion-forum.model.d.ts +41 -0
  411. package/lib/models/discussion-forum.model.d.ts.map +1 -0
  412. package/lib/models/goal.model.d.ts +23 -0
  413. package/lib/models/goal.model.d.ts.map +1 -0
  414. package/lib/models/meta-tag.model.d.ts +7 -0
  415. package/lib/models/meta-tag.model.d.ts.map +1 -0
  416. package/lib/models/playlist.model.d.ts +24 -0
  417. package/lib/models/playlist.model.d.ts.map +1 -0
  418. package/lib/models/profile-revamp.model.d.ts +15 -0
  419. package/lib/models/profile-revamp.model.d.ts.map +1 -0
  420. package/lib/models/rating.model.d.ts +18 -0
  421. package/lib/models/rating.model.d.ts.map +1 -0
  422. package/lib/models/user-profile.model.d.ts +38 -0
  423. package/lib/models/user-profile.model.d.ts.map +1 -0
  424. package/lib/resolvers/app-toc-cios-resolver.service.d.ts +13 -0
  425. package/lib/resolvers/app-toc-cios-resolver.service.d.ts.map +1 -0
  426. package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +13 -0
  427. package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts.map +1 -0
  428. package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +17 -0
  429. package/lib/resolvers/app-toc-content-read-resolver.service.d.ts.map +1 -0
  430. package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +13 -0
  431. package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts.map +1 -0
  432. package/lib/resolvers/app-toc-resolver.service.d.ts +17 -0
  433. package/lib/resolvers/app-toc-resolver.service.d.ts.map +1 -0
  434. package/lib/resolvers/config-resolver.service.d.ts +12 -0
  435. package/lib/resolvers/config-resolver.service.d.ts.map +1 -0
  436. package/lib/resolvers/profile-resolver.service.d.ts +12 -0
  437. package/lib/resolvers/profile-resolver.service.d.ts.map +1 -0
  438. package/lib/resolvers/restricted-features-resolver.service.d.ts +12 -0
  439. package/lib/resolvers/restricted-features-resolver.service.d.ts.map +1 -0
  440. package/lib/routes/app-toc-home/app-toc-home.component.d.ts +20 -0
  441. package/lib/routes/app-toc-home/app-toc-home.component.d.ts.map +1 -0
  442. package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +9 -0
  443. package/lib/routes/app-toc-home/app-toc-home.directive.d.ts.map +1 -0
  444. package/lib/routes/app-toc-home/app-toc-home.service.d.ts +9 -0
  445. package/lib/routes/app-toc-home/app-toc-home.service.d.ts.map +1 -0
  446. package/lib/services/access-control.service.d.ts +30 -0
  447. package/lib/services/access-control.service.d.ts.map +1 -0
  448. package/lib/services/action.service.d.ts +10 -0
  449. package/lib/services/action.service.d.ts.map +1 -0
  450. package/lib/services/app-toc-v2.service.d.ts +8 -0
  451. package/lib/services/app-toc-v2.service.d.ts.map +1 -0
  452. package/lib/services/app-toc.service.d.ts +131 -0
  453. package/lib/services/app-toc.service.d.ts.map +1 -0
  454. package/lib/services/certificate.service.d.ts +43 -0
  455. package/lib/services/certificate.service.d.ts.map +1 -0
  456. package/lib/services/discuss-utils.service.d.ts +34 -0
  457. package/lib/services/discuss-utils.service.d.ts.map +1 -0
  458. package/lib/services/editor.service.d.ts +18 -0
  459. package/lib/services/editor.service.d.ts.map +1 -0
  460. package/lib/services/load-check.service.d.ts +9 -0
  461. package/lib/services/load-check.service.d.ts.map +1 -0
  462. package/lib/services/loader.service.d.ts +17 -0
  463. package/lib/services/loader.service.d.ts.map +1 -0
  464. package/lib/services/mobile-apps.service.d.ts +39 -0
  465. package/lib/services/mobile-apps.service.d.ts.map +1 -0
  466. package/lib/services/netcore.service.d.ts +34 -0
  467. package/lib/services/netcore.service.d.ts.map +1 -0
  468. package/lib/services/nps-grid.service.d.ts +16 -0
  469. package/lib/services/nps-grid.service.d.ts.map +1 -0
  470. package/lib/services/otp.service.d.ts +21 -0
  471. package/lib/services/otp.service.d.ts.map +1 -0
  472. package/lib/services/profile-v2.service.d.ts +21 -0
  473. package/lib/services/profile-v2.service.d.ts.map +1 -0
  474. package/lib/services/reset-ratings.service.d.ts +9 -0
  475. package/lib/services/reset-ratings.service.d.ts.map +1 -0
  476. package/lib/services/resource-download-helper.service.d.ts +30 -0
  477. package/lib/services/resource-download-helper.service.d.ts.map +1 -0
  478. package/lib/services/timer.service.d.ts +10 -0
  479. package/lib/services/timer.service.d.ts.map +1 -0
  480. package/lib/services/title-tag.service.d.ts +22 -0
  481. package/lib/services/title-tag.service.d.ts.map +1 -0
  482. package/lib/services/user-profile.service.d.ts +25 -0
  483. package/lib/services/user-profile.service.d.ts.map +1 -0
  484. package/lib/services/viewer-data.service.d.ts +59 -0
  485. package/lib/services/viewer-data.service.d.ts.map +1 -0
  486. package/lib/services/viewer-util.service.d.ts +63 -0
  487. package/lib/services/viewer-util.service.d.ts.map +1 -0
  488. package/lib/share-toc/share-toc/share-toc.component.d.ts +57 -0
  489. package/lib/share-toc/share-toc/share-toc.component.d.ts.map +1 -0
  490. package/lib/share-toc/share-toc.module.d.ts +33 -0
  491. package/lib/share-toc/share-toc.module.d.ts.map +1 -0
  492. package/package.json +36 -0
  493. package/public-api.d.ts +44 -0
  494. package/public-api.d.ts.map +1 -0
  495. package/sunbird-cb-toc.d.ts.map +1 -0
@@ -0,0 +1,1838 @@
1
+ import { Component, Inject, ViewChild, HostListener } from '@angular/core';
2
+ import { FormControl, FormGroup, Validators } from '@angular/forms';
3
+ import { debounceTime, distinctUntilChanged, startWith, takeUntil } from 'rxjs/operators';
4
+ import { Subject } from 'rxjs';
5
+ import { NsUserProfileDetails } from '../../models/user-profile.model';
6
+ import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
7
+ /* tslint:disable */
8
+ import _ from 'lodash';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/material/legacy-snack-bar";
11
+ import * as i2 from "@angular/material/legacy-dialog";
12
+ import * as i3 from "../../services/user-profile.service";
13
+ import * as i4 from "@sunbird-cb/utils-v2";
14
+ import * as i5 from "../../services/profile-v2.service";
15
+ import * as i6 from "../../services/otp.service";
16
+ import * as i7 from "../../services/nps-grid.service";
17
+ import * as i8 from "@ngx-translate/core";
18
+ import * as i9 from "@angular/common";
19
+ import * as i10 from "@angular/forms";
20
+ import * as i11 from "@angular/material/icon";
21
+ import * as i12 from "@angular/material/legacy-form-field";
22
+ import * as i13 from "@angular/material/legacy-input";
23
+ import * as i14 from "@angular/material/legacy-progress-spinner";
24
+ import * as i15 from "@angular/material/legacy-select";
25
+ import * as i16 from "@angular/material/legacy-core";
26
+ import * as i17 from "@angular/material/datepicker";
27
+ const MOBILE_PATTERN = /^[0]?[6789]\d{9}$/;
28
+ const PIN_CODE_PATTERN = /^[1-9][0-9]{5}$/;
29
+ const EMP_ID_PATTERN = /^[a-z0-9]+$/i;
30
+ /* tslint:disable */
31
+ const EMAIL_PATTERN = /^[a-zA-Z0-9]+[a-zA-Z0-9._-]*[a-zA-Z0-9]+@[a-zA-Z0-9]+([-a-zA-Z0-9]*[a-zA-Z0-9]+)?(\.[a-zA-Z0-9-]+)*\.[a-zA-Z]{2,4}$/;
32
+ export class EnrollProfileFormComponent {
33
+ constructor(snackBar, dialogRef, userProfileService, configSrc, profileV2Svc, otpService, npsSvc, translateService, datePipe,
34
+ // private signupService: SignupService,
35
+ data) {
36
+ this.snackBar = snackBar;
37
+ this.dialogRef = dialogRef;
38
+ this.userProfileService = userProfileService;
39
+ this.configSrc = configSrc;
40
+ this.profileV2Svc = profileV2Svc;
41
+ this.otpService = otpService;
42
+ this.npsSvc = npsSvc;
43
+ this.translateService = translateService;
44
+ this.datePipe = datePipe;
45
+ this.data = data;
46
+ this.afterSubmitAction = this.checkAfterSubmit.bind(this);
47
+ this.isReadOnly = false;
48
+ this.customForm = false;
49
+ this.destroySubject$ = new Subject();
50
+ this.designationsMeta = [];
51
+ // filterDesignationsMeta: any = []
52
+ this.eUserGender = Object.keys(NsUserProfileDetails.EUserGender);
53
+ this.eCategory = Object.keys(NsUserProfileDetails.ECategory);
54
+ this.eligible = false;
55
+ this.isCadreStatus = false;
56
+ this.showBatchForNoCadre = true;
57
+ this.verifyMobile = false;
58
+ this.otpSent = false;
59
+ this.emailOtpSent = false;
60
+ this.otpEntered = '';
61
+ this.mVerified = false;
62
+ this.eVerified = false;
63
+ this.timeLeft = 150;
64
+ this.emailTimeLeft = 150;
65
+ this.showResendOTP = false;
66
+ this.showEmailResendOTP = false;
67
+ this.showname = false;
68
+ this.showDesignation = false;
69
+ this.showGroup = false;
70
+ this.showEmployeeCode = false;
71
+ this.showMobile = false;
72
+ this.showGender = false;
73
+ this.showDob = false;
74
+ this.showCategory = false;
75
+ this.showDecimalMedium = false;
76
+ this.showPinCode = false;
77
+ this.showCadreDetails = false;
78
+ this.updateProfile = false;
79
+ this.isLoading = false;
80
+ this.canShowEmployeeCode = false;
81
+ this.canshowMobile = false;
82
+ this.canShowGender = false;
83
+ this.canShowDob = false;
84
+ this.canShowDomicileMedium = false;
85
+ this.canShowCategory = false;
86
+ this.canShowpinCode = false;
87
+ this.canShowshowCadreDetails = false;
88
+ this.canShowGroup = false;
89
+ this.canShowDesignation = false;
90
+ this.showCounter = 0;
91
+ this.disableCounter = 0;
92
+ this.canShowEmail = false;
93
+ this.showEmail = false;
94
+ this.canShowName = false;
95
+ this.canShowOrg = false;
96
+ this.showOrg = false;
97
+ this.showDoptChanges = false;
98
+ this.verifyEmail = false;
99
+ this.approvedDomainList = [];
100
+ this.currentDate = new Date();
101
+ this.openDesignationDropdown = false;
102
+ this.openLanguageDropdown = false;
103
+ this.canShowOtherDesignation = false;
104
+ this.designationListLoadCount = 50;
105
+ this.addLoader = 0;
106
+ this.isLoadingMoreDesignations = false;
107
+ this.designationDefaultLoadCount = 50;
108
+ this.desigantionFilterEnable = false;
109
+ this.organisationId = '';
110
+ this.selectedOrgHasDesignations = false;
111
+ this.designationsOffset = 0;
112
+ this.designationSearchText = '';
113
+ this.designationsTotalCount = 0;
114
+ this.formId = '';
115
+ if (localStorage.getItem('websiteLanguage')) {
116
+ this.translateService.setDefaultLang('en');
117
+ const lang = localStorage.getItem('websiteLanguage');
118
+ this.translateService.use(lang);
119
+ }
120
+ this.batchDetails = this.data.batchData;
121
+ this.surveyId = this.data.surveyId;
122
+ this.showDoptChanges = this.data.showDoptChanges;
123
+ this.profileFormType = this.batchDetails.batchAttributes.userProfileFileds;
124
+ this.userDetailsForm = new FormGroup({
125
+ name: new FormControl(''),
126
+ organisation: new FormControl(''),
127
+ group: new FormControl(''),
128
+ designation: new FormControl(''),
129
+ employeeCode: new FormControl(''),
130
+ primaryEmail: new FormControl('', [Validators.pattern(EMAIL_PATTERN)]),
131
+ mobile: new FormControl(''),
132
+ gender: new FormControl('', []),
133
+ dob: new FormControl('', []),
134
+ domicileMedium: new FormControl(''),
135
+ category: new FormControl('', []),
136
+ pinCode: new FormControl(''),
137
+ isCadre: new FormControl(),
138
+ typeOfCivilService: new FormControl(''),
139
+ serviceType: new FormControl(''),
140
+ cadreName: new FormControl(''),
141
+ cadreBatch: new FormControl(''),
142
+ cadreControllingAuthority: new FormControl(''),
143
+ otherDesignation: new FormControl(''),
144
+ searchDesignation: new FormControl('')
145
+ });
146
+ this.isLoading = true;
147
+ this.userProfileObject = this.configSrc.unMappedUser;
148
+ this.organisationId = _.get(this.userProfileObject, 'rootOrgId', _.get(this.userProfileObject, 'personalDetails.rootOrgId', ''));
149
+ this.otpForm = new FormGroup({
150
+ otp: new FormControl('', Validators.required)
151
+ });
152
+ this.emailOtpForm = new FormGroup({
153
+ eOtp: new FormControl('', Validators.required)
154
+ });
155
+ // To check the mobile number entered by the user is same or not, validating the mobile number to show the Get OTP.
156
+ if (this.userDetailsForm.get('mobile')) {
157
+ this.userDetailsForm.get('mobile').valueChanges
158
+ .subscribe(res => {
159
+ if (res && res !== this.userProfileObject.profileDetails.personalDetails.mobile ||
160
+ !this.userProfileObject.profileDetails.personalDetails.phoneVerified) {
161
+ if (MOBILE_PATTERN.test(res)) {
162
+ this.verifyMobile = true;
163
+ this.mVerified = false;
164
+ }
165
+ else {
166
+ this.verifyMobile = false;
167
+ }
168
+ }
169
+ else {
170
+ this.verifyMobile = false;
171
+ }
172
+ });
173
+ }
174
+ // To check the email entered by the user is same or not, validating the email to show the Get OTP.
175
+ if (this.userDetailsForm.get('primaryEmail')) {
176
+ this.userDetailsForm.get('primaryEmail').valueChanges
177
+ .subscribe(res => {
178
+ if (res && res !== this.userProfileObject.profileDetails.personalDetails.primaryEmail) {
179
+ if (EMAIL_PATTERN.test(res)) {
180
+ this.verifyEmail = true;
181
+ this.eVerified = false;
182
+ }
183
+ else {
184
+ this.verifyEmail = false;
185
+ }
186
+ }
187
+ else {
188
+ this.verifyEmail = false;
189
+ this.eVerified = true;
190
+ }
191
+ });
192
+ }
193
+ }
194
+ scrollToActive(type) {
195
+ let activeElement;
196
+ let container;
197
+ if (type === 'language') {
198
+ container = this.languageDropdown.nativeElement;
199
+ activeElement = container.querySelector('.language-item-active');
200
+ }
201
+ else if (type === 'designation') {
202
+ container = this.dropdown.nativeElement;
203
+ activeElement = container.querySelector('.item-active');
204
+ }
205
+ if (activeElement) {
206
+ activeElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
207
+ }
208
+ }
209
+ handleClickOutside(event) {
210
+ const clickedElement = event.target;
211
+ if (this.textBox && !this.textBox.nativeElement.contains(clickedElement) &&
212
+ this.dropdown && !this.dropdown.nativeElement.contains(clickedElement)) {
213
+ this.openDesignationDropdown = false;
214
+ }
215
+ if (this.languageTextBox && !this.languageTextBox.nativeElement.contains(clickedElement) &&
216
+ this.languageDropdown && !this.languageDropdown.nativeElement.contains(clickedElement)) {
217
+ this.openLanguageDropdown = false;
218
+ }
219
+ }
220
+ onDesignationsFocus() {
221
+ // this.openDesignationDropdown = true
222
+ setTimeout(() => {
223
+ this.scrollToActive('designation');
224
+ }, 100);
225
+ }
226
+ onLanguageFocus() {
227
+ this.openLanguageDropdown = true;
228
+ setTimeout(() => {
229
+ this.scrollToActive('language');
230
+ }, 100);
231
+ }
232
+ filterLanguage(value) {
233
+ if (value.length) {
234
+ this.masterLanguages = this.masterLanguageBackup.filter((val) => val && val.name.trim().toLowerCase().includes(value.toLowerCase()));
235
+ if (this.masterLanguages.length === 0) {
236
+ const usernameControl = this.userDetailsForm.get('domicileMedium');
237
+ if (usernameControl) {
238
+ usernameControl.setErrors({ required: true });
239
+ }
240
+ }
241
+ }
242
+ this.openLanguageDropdown = true;
243
+ }
244
+ // filterdesignation(value: any) {
245
+ // if (value.length) {
246
+ // this.desigantionFilterEnable =true
247
+ // this.filterDesignationsMeta = this.designationsMeta.filter((val: any) =>
248
+ // val && val.name.trim().toLowerCase().includes(value.toLowerCase())
249
+ // )
250
+ // if (this.filterDesignationsMeta.length === 0) {
251
+ // const usernameControl = this.userDetailsForm.get('designation')
252
+ // if (usernameControl) {
253
+ // usernameControl.setErrors({ required: true });
254
+ // }
255
+ // }
256
+ // } else {
257
+ // this.filterDesignationsMeta = this.designationsMeta.slice(0, this.designationDefaultLoadCount)
258
+ // this.desigantionFilterEnable =false
259
+ // this.designationListLoadCount = this.designationDefaultLoadCount;
260
+ // }
261
+ // // this.openDesignationDropdown = true
262
+ // }
263
+ // async getMasterDesignation() {
264
+ // this.signupService.getOrgReadData(this.userProfileObject.rootOrgId).subscribe((result: any) => {
265
+ // if (result && result.frameworkid) {
266
+ // this.signupService.getFrameworkInfo(result.frameworkid).subscribe((res: any) => {
267
+ // const frameworkDetails = _.get(res, 'result.framework')
268
+ // const categoriesOfFramework = _.get(frameworkDetails, 'categories', [])
269
+ // const organisationsList = this.getTermsByCode(categoriesOfFramework, 'org')
270
+ // const disOrderedList = _.get(organisationsList, '[0].children', [])
271
+ // this.designationsMeta = _.sortBy(disOrderedList, 'name')
272
+ // this.filterDesignationsMeta = this.designationsMeta.slice(0, this.designationDefaultLoadCount)
273
+ // if (this.canShowDesignation) {
274
+ // let field = this.userDetailsForm.get('designation')
275
+ // if (field && field.value) {
276
+ // let _value = field.value.toLowerCase()
277
+ // if (!this.designationsMeta.find((d: any) => d.name.toLowerCase() === _value)) {
278
+ // field.patchValue('')
279
+ // }
280
+ // }
281
+ // }
282
+ // }, (error: any) => {
283
+ // // tslint:disable-next-line
284
+ // console.error('Error occurred:', error)
285
+ // })
286
+ // }
287
+ // }, (error: any) => {
288
+ // // tslint:disable-next-line
289
+ // console.error('Error occurred:', error)
290
+ // })
291
+ // }
292
+ // private getTermsByCode(categories: any[], code: string) {
293
+ // const selectedCategory = categories.filter(
294
+ // (category: any) => category.code === code
295
+ // );
296
+ // return _.get(selectedCategory, '[0].terms', []);
297
+ // }
298
+ preventBlur(event) {
299
+ event.preventDefault();
300
+ }
301
+ preventLanguageBlur(event) {
302
+ event.preventDefault();
303
+ }
304
+ selectDesignation(designation) {
305
+ this.userDetailsForm.patchValue({ designation: designation });
306
+ const fieldControl = this.userDetailsForm.get('otherDesignation');
307
+ if (this.showDoptChanges && designation === 'Others') {
308
+ if (fieldControl) {
309
+ fieldControl.setValidators([Validators.required]);
310
+ fieldControl.updateValueAndValidity();
311
+ }
312
+ this.canShowOtherDesignation = true;
313
+ }
314
+ else {
315
+ if (fieldControl) {
316
+ fieldControl.clearValidators();
317
+ fieldControl.updateValueAndValidity();
318
+ }
319
+ this.canShowOtherDesignation = false;
320
+ }
321
+ this.openDesignationDropdown = false;
322
+ }
323
+ selectLanguage(language) {
324
+ this.userDetailsForm.patchValue({ domicileMedium: language });
325
+ this.openLanguageDropdown = false;
326
+ }
327
+ isEmailAllowed(email) {
328
+ const domain = email.split('@')[1];
329
+ return domain ? this.approvedDomainList.includes(domain) : false;
330
+ }
331
+ handleGenerateEmailOTP(verifyType) {
332
+ console.log(verifyType);
333
+ this.userProfileService.getWhiteListDomain().subscribe((response) => {
334
+ if (response && response.result && response.result.domains && response.result.domains.length > 0) {
335
+ this.approvedDomainList = response.result.domains;
336
+ if (this.approvedDomainList && this.approvedDomainList.length && this.approvedDomainList.length > 0) {
337
+ if (this.isEmailAllowed(this.userDetailsForm.value['primaryEmail'])) {
338
+ this.otpService.sendEmailOtp(this.userDetailsForm.value['primaryEmail'])
339
+ .pipe(takeUntil(this.destroySubject$))
340
+ .subscribe((_res) => {
341
+ this.emailOtpForm.reset();
342
+ if (verifyType) {
343
+ this.emailOtpSent = true;
344
+ this.startEmailTimer();
345
+ this.snackBar.open(this.handleTranslateTo('otpSentEmail'));
346
+ }
347
+ }, (error) => {
348
+ if (!error.ok) {
349
+ this.snackBar.open(this.handleTranslateTo('emailOTPSentFail'));
350
+ }
351
+ });
352
+ }
353
+ else {
354
+ this.snackBar.open(this.handleTranslateTo('emailApprovedPopupMsg'));
355
+ }
356
+ }
357
+ }
358
+ });
359
+ }
360
+ handleGenerateOTP(verifyType) {
361
+ this.otpService.sendOtp(this.userDetailsForm.value['mobile'])
362
+ .pipe(takeUntil(this.destroySubject$))
363
+ .subscribe((_res) => {
364
+ this.snackBar.open(this.handleTranslateTo('otpSentMobile'));
365
+ this.otpForm.reset();
366
+ if (verifyType) {
367
+ this.otpSent = true;
368
+ this.startTimer();
369
+ //this.handleVerifyOTP(verifyType, this.userDetailsForm.value['mobile'])
370
+ }
371
+ }, (error) => {
372
+ if (!error.ok) {
373
+ this.snackBar.open(this.handleTranslateTo('mobileOTPSentFail'));
374
+ }
375
+ });
376
+ }
377
+ handleResendOTP() {
378
+ this.timeLeft = 150;
379
+ this.showResendOTP = true;
380
+ this.startTimer();
381
+ let otpValue$;
382
+ otpValue$ = this.otpService.resendOtp(this.userDetailsForm.controls['mobile'].value);
383
+ otpValue$.pipe(takeUntil(this.destroySubject$))
384
+ .subscribe((_res) => {
385
+ this.snackBar.open(this.handleTranslateTo('otpSentMobile'));
386
+ }, (error) => {
387
+ if (!error.ok) {
388
+ this.snackBar.open(_.get(error, 'error.params.errmsg') || 'Unable to resend OTP, please try again later!');
389
+ }
390
+ });
391
+ }
392
+ handleResendEmailOTP() {
393
+ this.emailTimeLeft = 150;
394
+ this.showEmailResendOTP = true;
395
+ this.startEmailTimer();
396
+ let otpValue$;
397
+ otpValue$ = this.otpService.sendEmailOtp(this.userDetailsForm.controls['primaryEmail'].value);
398
+ otpValue$.pipe(takeUntil(this.destroySubject$))
399
+ .subscribe((_res) => {
400
+ this.snackBar.open(this.handleTranslateTo('otpSentEmail'));
401
+ }, (error) => {
402
+ if (!error.ok) {
403
+ this.snackBar.open(_.get(error, 'error.params.errmsg') || 'Unable to resend OTP, please try again later!');
404
+ }
405
+ });
406
+ }
407
+ verifyEmailOTP() {
408
+ this.otpService.verifyEmailOTP(this.emailOtpForm.controls['eOtp'].value, this.userDetailsForm.controls['primaryEmail'].value)
409
+ .pipe(takeUntil(this.destroySubject$))
410
+ .subscribe((_res) => {
411
+ this.snackBar.open(this.handleTranslateTo('OTPSentSuccess'));
412
+ this.verifyEmail = true;
413
+ this.eVerified = true;
414
+ this.emailOtpSent = false;
415
+ this.contextToken = _res.result.contextToken;
416
+ this.emailOtpForm.reset();
417
+ }, (error) => {
418
+ if (!error.ok) {
419
+ this.snackBar.open(_.get(error, 'error.params.errmsg') || this.handleTranslateTo('OTPVerifyFailed'));
420
+ }
421
+ });
422
+ }
423
+ verifyMobileOTP() {
424
+ this.otpService.verifyOTP(this.otpForm.controls['otp'].value, this.userDetailsForm.controls['mobile'].value)
425
+ .pipe(takeUntil(this.destroySubject$))
426
+ .subscribe((_res) => {
427
+ this.snackBar.open(this.handleTranslateTo('OTPSentSuccess'));
428
+ this.verifyMobile = true;
429
+ this.mVerified = true;
430
+ this.otpSent = false;
431
+ this.otpForm.reset();
432
+ }, (error) => {
433
+ if (!error.ok) {
434
+ this.snackBar.open(_.get(error, 'error.params.errmsg') || this.handleTranslateTo('OTPVerifyFailed'));
435
+ }
436
+ });
437
+ }
438
+ startTimer() {
439
+ this.interval = setInterval(() => {
440
+ if (this.timeLeft > 0) {
441
+ this.timeLeft = this.timeLeft - 1;
442
+ if (this.timerDiv) {
443
+ this.timerDiv.nativeElement.innerHTML = `${Math.floor(this.timeLeft / 60)}m: ${this.timeLeft % 60}s`;
444
+ }
445
+ }
446
+ else {
447
+ clearInterval(this.interval);
448
+ this.showResendOTP = true;
449
+ }
450
+ }, 1000);
451
+ }
452
+ startEmailTimer() {
453
+ this.emailInterval = setInterval(() => {
454
+ if (this.emailTimeLeft > 0) {
455
+ this.emailTimeLeft = this.emailTimeLeft - 1;
456
+ if (this.emailTimerDiv) {
457
+ this.emailTimerDiv.nativeElement.innerHTML = `${Math.floor(this.emailTimeLeft / 60)}m: ${this.emailTimeLeft % 60}s`;
458
+ }
459
+ }
460
+ else {
461
+ clearInterval(this.emailInterval);
462
+ this.showEmailResendOTP = true;
463
+ }
464
+ }, 1000);
465
+ }
466
+ checkAfterSubmit(_e) {
467
+ // this.renderSubject.next()
468
+ // tslint:disable-next-line:no-console
469
+ console.log('Form is submitted successfully');
470
+ if (this.batchDetails.batchAttributes.userProfileFileds &&
471
+ this.batchDetails.batchAttributes.userProfileFileds === "Available user filled iGOT profile") {
472
+ this.submitSurevy(true);
473
+ }
474
+ if (this.batchDetails.batchAttributes.userProfileFileds && !this.updateProfile &&
475
+ (this.batchDetails.batchAttributes.userProfileFileds === "Full iGOT profile" ||
476
+ this.batchDetails.batchAttributes.userProfileFileds === "Custom iGOT profile")) {
477
+ this.submitSurevy(true);
478
+ }
479
+ this.openSnackbar('Form is submitted successfully');
480
+ this.dialogRef.close(true);
481
+ }
482
+ closePopup() {
483
+ this.dialogRef.close(true);
484
+ }
485
+ openSnackbar(primaryMsg, duration = 5000) {
486
+ this.snackBar.open(primaryMsg, 'X', {
487
+ duration,
488
+ });
489
+ }
490
+ ngOnInit() {
491
+ this.formId = _.get(this.data, 'batchData.batchAttributes.profileSurveyId');
492
+ this.getFormDetails();
493
+ this.setValueChangeFunctions();
494
+ this.fetchCadreData();
495
+ this.getGroupData();
496
+ this.getPendingDetails();
497
+ setTimeout(() => {
498
+ // this.loadDesignations()
499
+ this.checkSelectedOrgHasDesignations();
500
+ //this.getMasterDesignation()
501
+ this.getMasterLanguage();
502
+ }, 500);
503
+ }
504
+ getFormDetails() {
505
+ if (this.formId) {
506
+ this.profileV2Svc.getFormV2ByID(this.formId).subscribe((responce) => {
507
+ if (responce) {
508
+ this.formsDetils = _.get(responce, 'result.response', {});
509
+ }
510
+ });
511
+ }
512
+ }
513
+ setValueChangeFunctions() {
514
+ const searchDesignationControl = this.userDetailsForm.get('searchDesignation');
515
+ if (searchDesignationControl) {
516
+ let settingValueChange = true;
517
+ searchDesignationControl.valueChanges.pipe(debounceTime(300), distinctUntilChanged(), startWith('')).subscribe(searchText => {
518
+ this.designationsOffset = 0;
519
+ if (searchText && searchText.length > 1) {
520
+ this.designationSearchText = searchText;
521
+ this.getdesignationsMeta();
522
+ }
523
+ else if (!searchText) {
524
+ this.designationSearchText = searchText;
525
+ if (!settingValueChange) {
526
+ this.getdesignationsMeta();
527
+ }
528
+ this.checkCurrentDesignationPresent();
529
+ }
530
+ settingValueChange = false;
531
+ });
532
+ }
533
+ }
534
+ fetchCadreData() {
535
+ this.addLoader = this.addLoader + 1;
536
+ this.profileV2Svc.fetchCadre().subscribe((response) => {
537
+ this.addLoader = this.addLoader - 1;
538
+ this.civilServiceData = response.result.response.value.civilServiceType;
539
+ this.civilServiceTypes = this.civilServiceData.civilServiceTypeList.map((service) => service.name);
540
+ });
541
+ }
542
+ getIsCadreStatus(value) {
543
+ this.isCadreStatus = value;
544
+ if (value) {
545
+ this.userDetailsForm.patchValue({
546
+ typeOfCivilService: '',
547
+ serviceType: '',
548
+ cadreName: '',
549
+ cadreBatch: '',
550
+ cadreControllingAuthority: '',
551
+ });
552
+ this.addValidators();
553
+ }
554
+ else {
555
+ this.showBatchForNoCadre = false;
556
+ this.removeValidators();
557
+ }
558
+ }
559
+ getAllErrors() {
560
+ const errorMessages = [];
561
+ Object.keys(this.userDetailsForm.controls).forEach((key) => {
562
+ const controlErrors = this.userDetailsForm.controls[key].errors;
563
+ if (controlErrors) {
564
+ Object.keys(controlErrors).forEach((errorKey) => {
565
+ switch (errorKey) {
566
+ case 'required':
567
+ errorMessages.push(`${key} is required.`);
568
+ break;
569
+ case 'minlength':
570
+ const requiredLength = controlErrors['minlength'].requiredLength;
571
+ errorMessages.push(`${key} must be at least ${requiredLength} characters long.`);
572
+ break;
573
+ case 'email':
574
+ errorMessages.push(`Please enter a valid email address.`);
575
+ break;
576
+ // Add more cases for other validators as needed
577
+ }
578
+ });
579
+ }
580
+ });
581
+ return errorMessages;
582
+ }
583
+ addValidators() {
584
+ const fieldControl0 = this.userDetailsForm.get('isCadre');
585
+ if (fieldControl0) {
586
+ fieldControl0.setValidators([Validators.required]);
587
+ fieldControl0.updateValueAndValidity();
588
+ }
589
+ const fieldControl = this.userDetailsForm.get('typeOfCivilService');
590
+ if (fieldControl) {
591
+ fieldControl.setValidators([Validators.required]);
592
+ fieldControl.updateValueAndValidity();
593
+ }
594
+ const fieldControl1 = this.userDetailsForm.get('serviceType');
595
+ if (fieldControl1) {
596
+ fieldControl1.setValidators([Validators.required]);
597
+ fieldControl1.updateValueAndValidity();
598
+ }
599
+ const fieldControl3 = this.userDetailsForm.get('cadreBatch');
600
+ if (fieldControl3) {
601
+ fieldControl3.setValidators([Validators.required]);
602
+ fieldControl3.updateValueAndValidity();
603
+ }
604
+ }
605
+ removeValidators() {
606
+ const fieldControl = this.userDetailsForm.get('typeOfCivilService');
607
+ if (fieldControl) {
608
+ fieldControl.clearValidators();
609
+ fieldControl.updateValueAndValidity();
610
+ }
611
+ const fieldControl1 = this.userDetailsForm.get('serviceType');
612
+ if (fieldControl1) {
613
+ fieldControl1.clearValidators();
614
+ fieldControl1.updateValueAndValidity();
615
+ }
616
+ const fieldControl2 = this.userDetailsForm.get('cadreName');
617
+ if (fieldControl2) {
618
+ fieldControl2.clearValidators();
619
+ fieldControl2.updateValueAndValidity();
620
+ }
621
+ const fieldControl3 = this.userDetailsForm.get('cadreBatch');
622
+ if (fieldControl3) {
623
+ fieldControl3.clearValidators();
624
+ fieldControl3.updateValueAndValidity();
625
+ }
626
+ }
627
+ getService(event) {
628
+ const serviceTypeControl = this.userDetailsForm.get('serviceType');
629
+ const cadreControl = this.userDetailsForm.get('cadreName');
630
+ const batchControl = this.userDetailsForm.get('cadreBatch');
631
+ const cadreControllingAuthorityControl = this.userDetailsForm.get('cadreControllingAuthority');
632
+ if (serviceTypeControl) {
633
+ serviceTypeControl.reset();
634
+ }
635
+ if (cadreControl) {
636
+ cadreControl.reset();
637
+ }
638
+ if (batchControl) {
639
+ batchControl.reset();
640
+ }
641
+ if (cadreControllingAuthorityControl) {
642
+ cadreControllingAuthorityControl.reset();
643
+ }
644
+ this.serviceType = this.civilServiceData.civilServiceTypeList.find((element) => element.name === event);
645
+ this.serviceType = this.civilServiceData.civilServiceTypeList.find((element) => element.name === event);
646
+ if (this.serviceType) {
647
+ this.serviceListData = this.serviceType.serviceList;
648
+ this.serviceName = this.serviceListData.map((service) => service.name);
649
+ this.serviceId = this.serviceType.id;
650
+ this.errorMessage = '';
651
+ }
652
+ else {
653
+ this.errorMessage = 'Service Type not found';
654
+ }
655
+ }
656
+ onServiceSelect(event) {
657
+ const cadreControl = this.userDetailsForm.get('cadreName');
658
+ const batchControl = this.userDetailsForm.get('cadreBatch');
659
+ const cadreControllingAuthorityControl = this.userDetailsForm.get('cadreControllingAuthority');
660
+ if (cadreControl) {
661
+ cadreControl.reset();
662
+ }
663
+ if (batchControl) {
664
+ batchControl.reset();
665
+ }
666
+ if (cadreControllingAuthorityControl) {
667
+ cadreControllingAuthorityControl.reset();
668
+ }
669
+ this.selectedServiceName = event.value;
670
+ if (this.serviceListData) {
671
+ this.selectedService = this.serviceListData.find((service) => service.name === this.selectedServiceName);
672
+ if (this.selectedService) {
673
+ this.civilServiceName = this.selectedService.name;
674
+ this.civilServiceId = this.selectedService.id;
675
+ this.cadre = this.selectedService.cadreList ? this.selectedService.cadreList.map((cadre) => cadre.name) : [];
676
+ }
677
+ }
678
+ if (this.selectedService && this.selectedService.cadreControllingAuthority) {
679
+ this.cadreControllingAuthority = this.selectedService.cadreControllingAuthority;
680
+ }
681
+ else {
682
+ this.cadreControllingAuthority = 'NA';
683
+ }
684
+ if (this.selectedService && this.selectedService.cadreList.length === 0) {
685
+ this.showBatchForNoCadre = true;
686
+ this.startBatch = this.selectedService.commonBatchStartYear;
687
+ this.endBatch = this.selectedService.commonBatchEndYear;
688
+ this.exclusionYear = this.selectedService.commonBatchExclusionYearList;
689
+ // tslint:disable
690
+ this.yearArray = Array.from({ length: this.endBatch - this.startBatch + 1 }, (_, index) => this.startBatch + index)
691
+ .filter(year => !this.exclusionYear.includes(year));
692
+ }
693
+ else {
694
+ this.showBatchForNoCadre = false;
695
+ }
696
+ }
697
+ onCadreSelect(event) {
698
+ const batchControl = this.userDetailsForm.get('cadreBatch');
699
+ const cadreControllingAuthorityControl = this.userDetailsForm.get('cadreControllingAuthority');
700
+ if (batchControl) {
701
+ batchControl.reset();
702
+ }
703
+ if (cadreControllingAuthorityControl) {
704
+ cadreControllingAuthorityControl.reset();
705
+ }
706
+ this.selectedCadreName = event;
707
+ if (this.selectedService) {
708
+ this.selectedCadre = this.selectedService.cadreList.find((cadre) => cadre.name === this.selectedCadreName);
709
+ this.startBatch = this.selectedCadre ? this.selectedCadre.startBatchYear : '';
710
+ this.endBatch = this.selectedCadre ? this.selectedCadre.endBatchYear : '';
711
+ this.exclusionYear = this.selectedCadre ? this.selectedCadre.exculsionYearList : '';
712
+ // tslint:disable
713
+ this.yearArray = Array.from({ length: this.endBatch - this.startBatch + 1 }, (_, index) => this.startBatch + index)
714
+ .filter(year => !this.exclusionYear.includes(year));
715
+ this.cadreId = this.selectedCadre ? this.selectedCadre.id : '';
716
+ }
717
+ }
718
+ getPendingDetails() {
719
+ this.addLoader = this.addLoader + 1;
720
+ this.profileV2Svc.fetchApprovalDetails().subscribe((resp) => {
721
+ this.addLoader = this.addLoader - 1;
722
+ if (resp && resp.result && resp.result.data) {
723
+ this.pendingFileds = resp.result.data;
724
+ if (this.pendingFileds.length > 0) {
725
+ this.pendingFileds.forEach((user) => {
726
+ if (user['group']) {
727
+ let ctrl = this.userDetailsForm.get('group');
728
+ if (ctrl) {
729
+ ctrl.patchValue({ group: user['group'] });
730
+ this.pGroup = user['group'];
731
+ }
732
+ }
733
+ if (user['designation']) {
734
+ let ctrl = this.userDetailsForm.get('designation');
735
+ if (ctrl) {
736
+ ctrl.patchValue({ designation: user['designation'] });
737
+ this.pDesignation = user['designation'];
738
+ }
739
+ }
740
+ });
741
+ }
742
+ }
743
+ this.isLoading = false;
744
+ this.defineFormAttributes();
745
+ }, error => {
746
+ // tslint:disable-next-line:no-console
747
+ console.log(error);
748
+ this.addLoader = this.addLoader - 1;
749
+ this.isLoading = false;
750
+ });
751
+ }
752
+ defineFormAttributes() {
753
+ if (this.batchDetails.batchAttributes.userProfileFileds &&
754
+ this.batchDetails.batchAttributes.bpEnrolMandatoryProfileFields) {
755
+ let customAttr = this.batchDetails.batchAttributes.bpEnrolMandatoryProfileFields;
756
+ console.log("customAttr ", customAttr);
757
+ if (this.findAttr(customAttr, 'name')) {
758
+ this.canShowName = true;
759
+ this.showname = true;
760
+ const fieldControl = this.userDetailsForm.get('name');
761
+ if (fieldControl) {
762
+ fieldControl.setValue(this.userProfileObject.profileDetails.personalDetails.firstname);
763
+ fieldControl.disable();
764
+ }
765
+ if (this.profileFormType === 'Available user filled iGOT profile' &&
766
+ !this.userProfileObject.profileDetails.personalDetails.firstname) {
767
+ this.canShowName = false;
768
+ this.showname = false;
769
+ }
770
+ }
771
+ if (this.findAttr(customAttr, 'email')) {
772
+ this.canShowEmail = true;
773
+ const fieldControl = this.userDetailsForm.get('primaryEmail');
774
+ if (fieldControl) {
775
+ fieldControl.setValue(this.userProfileObject.profileDetails.personalDetails.primaryEmail);
776
+ if (this.userProfileObject.profileDetails.personalDetails.primaryEmail) {
777
+ fieldControl.setValue(this.userProfileObject.profileDetails.personalDetails.primaryEmail);
778
+ this.eVerified = true;
779
+ }
780
+ else if (this.profileFormType === 'Available user filled iGOT profile') {
781
+ this.showEmail = false;
782
+ }
783
+ else {
784
+ this.showEmail = true;
785
+ }
786
+ }
787
+ }
788
+ else {
789
+ this.eVerified = true;
790
+ }
791
+ if (this.findAttr(customAttr, 'organisation')) {
792
+ this.canShowOrg = true;
793
+ this.showOrg = true;
794
+ const fieldControl = this.userDetailsForm.get('organisation');
795
+ if (fieldControl) {
796
+ fieldControl.setValue(this.userProfileObject.profileDetails.employmentDetails.departmentName);
797
+ fieldControl.disable();
798
+ }
799
+ if (this.profileFormType === 'Available user filled iGOT profile' &&
800
+ !this.userProfileObject.profileDetails.employmentDetails.departmentName) {
801
+ this.canShowOrg = false;
802
+ this.showOrg = false;
803
+ }
804
+ }
805
+ if (this.findAttr(customAttr, 'group')) {
806
+ this.canShowGroup = true;
807
+ this.showGroup = true;
808
+ const fieldControl = this.userDetailsForm.get('group');
809
+ if (fieldControl) {
810
+ if (this.pGroup) {
811
+ fieldControl.setValue(this.pGroup);
812
+ // if (this.profileFormType === 'Available user filled iGOT profile') {
813
+ // this.canShowGroup = true
814
+ // this.showGroup = true
815
+ // }
816
+ }
817
+ else {
818
+ if (this.userProfileObject.profileDetails.professionalDetails &&
819
+ this.userProfileObject.profileDetails.professionalDetails.length &&
820
+ this.userProfileObject.profileDetails.professionalDetails[0].group) {
821
+ fieldControl.setValue(this.userProfileObject.profileDetails.professionalDetails[0].group);
822
+ // if (this.profileFormType === 'Available user filled iGOT profile') {
823
+ // this.canShowGroup = false
824
+ // this.showGroup = false
825
+ // }
826
+ }
827
+ }
828
+ fieldControl.setValidators([Validators.required]);
829
+ fieldControl.updateValueAndValidity();
830
+ }
831
+ }
832
+ if (this.findAttr(customAttr, 'designation')) {
833
+ this.canShowDesignation = true;
834
+ this.showDesignation = true;
835
+ const fieldControl = this.userDetailsForm.get('designation');
836
+ if (fieldControl) {
837
+ if (this.pDesignation) {
838
+ fieldControl.patchValue(this.pDesignation);
839
+ // if (this.profileFormType === 'Available user filled iGOT profile') {
840
+ // this.canShowDesignation = true
841
+ // this.showDesignation = true
842
+ // }
843
+ }
844
+ else {
845
+ if (this.userProfileObject.profileDetails.professionalDetails &&
846
+ this.userProfileObject.profileDetails.professionalDetails.length &&
847
+ this.userProfileObject.profileDetails.professionalDetails[0].designation) {
848
+ fieldControl.patchValue(this.userProfileObject.profileDetails.professionalDetails[0].designation);
849
+ // if (this.profileFormType === 'Available user filled iGOT profile') {
850
+ // this.canShowDesignation = false
851
+ // this.showDesignation = false
852
+ // }
853
+ }
854
+ }
855
+ fieldControl.setValidators([Validators.required]);
856
+ fieldControl.updateValueAndValidity();
857
+ }
858
+ }
859
+ if (this.findAttr(customAttr, 'employeeCode')) {
860
+ this.canShowEmployeeCode = true;
861
+ const contrl = this.userDetailsForm.get('employeeCode');
862
+ if (contrl) {
863
+ if (this.userProfileObject.profileDetails.employmentDetails.employeeCode) {
864
+ contrl.setValue(this.userProfileObject.profileDetails.employmentDetails.employeeCode);
865
+ contrl.setValidators([Validators.required, Validators.pattern(EMP_ID_PATTERN)]);
866
+ contrl.updateValueAndValidity();
867
+ }
868
+ else if (this.profileFormType === 'Available user filled iGOT profile') {
869
+ this.canShowEmployeeCode = false;
870
+ }
871
+ else {
872
+ this.showEmployeeCode = true;
873
+ contrl.setValidators([Validators.required, Validators.pattern(EMP_ID_PATTERN)]);
874
+ contrl.updateValueAndValidity();
875
+ }
876
+ }
877
+ }
878
+ if (this.findAttr(customAttr, 'mobile')) {
879
+ this.canshowMobile = true;
880
+ const contrl = this.userDetailsForm.get('mobile');
881
+ if (contrl) {
882
+ if (this.userProfileObject.profileDetails.personalDetails.mobile && this.userProfileObject.profileDetails.personalDetails.phoneVerified) {
883
+ contrl.setValue(this.userProfileObject.profileDetails.personalDetails.mobile);
884
+ this.mVerified = true;
885
+ contrl.setValidators([Validators.minLength(10), Validators.maxLength(10), Validators.pattern(MOBILE_PATTERN)]);
886
+ contrl.updateValueAndValidity();
887
+ }
888
+ else if (this.profileFormType === 'Available user filled iGOT profile') {
889
+ this.canshowMobile = false;
890
+ this.mVerified = true;
891
+ }
892
+ else {
893
+ this.showMobile = true;
894
+ contrl.setValidators([Validators.minLength(10), Validators.maxLength(10), Validators.pattern(MOBILE_PATTERN)]);
895
+ contrl.updateValueAndValidity();
896
+ }
897
+ }
898
+ }
899
+ if (this.canshowMobile === false) {
900
+ this.mVerified = true;
901
+ }
902
+ if (this.findAttr(customAttr, 'gender')) {
903
+ this.canShowGender = true;
904
+ const contrl = this.userDetailsForm.get('gender');
905
+ if (contrl) {
906
+ if (this.userProfileObject.profileDetails.personalDetails.gender) {
907
+ contrl.setValue(this.userProfileObject.profileDetails.personalDetails.gender);
908
+ contrl.setValidators([Validators.required]);
909
+ contrl.updateValueAndValidity();
910
+ }
911
+ else if (this.profileFormType === 'Available user filled iGOT profile') {
912
+ this.canShowGender = false;
913
+ }
914
+ else {
915
+ this.showGender = true;
916
+ contrl.setValidators([Validators.required]);
917
+ contrl.updateValueAndValidity();
918
+ }
919
+ }
920
+ }
921
+ if (this.findAttr(customAttr, 'dob')) {
922
+ this.canShowDob = true;
923
+ const contrl = this.userDetailsForm.get('dob');
924
+ if (contrl) {
925
+ if (this.userProfileObject.profileDetails.personalDetails.dob) {
926
+ let _dob = this.userProfileObject.profileDetails.personalDetails.dob;
927
+ const [day, month, year] = _dob.split('-');
928
+ const date = new Date(Number(year), Number(month) - 1, Number(day));
929
+ const formattedDay = String(date.getDate()).padStart(2, '0');
930
+ const formattedMonth = String(date.getMonth() + 1).padStart(2, '0');
931
+ const formattedYear = date.getFullYear();
932
+ this.selectedDate = new Date(`${formattedYear}-${formattedMonth}-${formattedDay}`);
933
+ contrl.setValue(this.selectedDate);
934
+ contrl.setValidators([Validators.required]);
935
+ contrl.updateValueAndValidity();
936
+ }
937
+ else if (this.profileFormType === 'Available user filled iGOT profile') {
938
+ this.canShowDob = false;
939
+ }
940
+ else {
941
+ this.showDob = true;
942
+ contrl.setValidators([Validators.required]);
943
+ contrl.updateValueAndValidity();
944
+ }
945
+ }
946
+ }
947
+ if (this.findAttr(customAttr, 'domicileMedium')) {
948
+ this.canShowDomicileMedium = true;
949
+ const contrl = this.userDetailsForm.get('domicileMedium');
950
+ if (contrl) {
951
+ if (this.userProfileObject.profileDetails.personalDetails.domicileMedium) {
952
+ contrl.setValue(this.userProfileObject.profileDetails.personalDetails.domicileMedium);
953
+ contrl.setValidators([Validators.required]);
954
+ contrl.updateValueAndValidity();
955
+ }
956
+ else if (this.profileFormType === 'Available user filled iGOT profile') {
957
+ this.canShowDomicileMedium = false;
958
+ }
959
+ else {
960
+ this.showDecimalMedium = true;
961
+ contrl.setValidators([Validators.required]);
962
+ contrl.updateValueAndValidity();
963
+ }
964
+ }
965
+ }
966
+ if (this.findAttr(customAttr, 'category')) {
967
+ this.canShowCategory = true;
968
+ const contrl = this.userDetailsForm.get('category');
969
+ if (contrl) {
970
+ if (this.userProfileObject.profileDetails.personalDetails.category) {
971
+ contrl.setValue(this.userProfileObject.profileDetails.personalDetails.category);
972
+ contrl.setValidators([Validators.required]);
973
+ contrl.updateValueAndValidity();
974
+ }
975
+ else if (this.profileFormType === 'Available user filled iGOT profile') {
976
+ this.canShowCategory = false;
977
+ }
978
+ else {
979
+ this.showCategory = true;
980
+ contrl.setValidators([Validators.required]);
981
+ contrl.updateValueAndValidity();
982
+ }
983
+ }
984
+ }
985
+ if (this.findAttr(customAttr, 'pinCode')) {
986
+ this.canShowpinCode = true;
987
+ const contrl = this.userDetailsForm.get('pinCode');
988
+ if (contrl) {
989
+ if (this.userProfileObject.profileDetails.employmentDetails.pinCode) {
990
+ contrl.setValue(this.userProfileObject.profileDetails.employmentDetails.pinCode);
991
+ contrl.setValidators([Validators.required, Validators.minLength(6), Validators.maxLength(6), Validators.pattern(PIN_CODE_PATTERN)]);
992
+ contrl.updateValueAndValidity();
993
+ }
994
+ else if (this.profileFormType === 'Available user filled iGOT profile') {
995
+ this.canShowpinCode = false;
996
+ }
997
+ else {
998
+ this.showPinCode = true;
999
+ contrl.setValidators([Validators.required, Validators.minLength(6), Validators.maxLength(6), Validators.pattern(PIN_CODE_PATTERN)]);
1000
+ contrl.updateValueAndValidity();
1001
+ }
1002
+ }
1003
+ }
1004
+ if (this.findAttr(customAttr, 'cadreDetails')) {
1005
+ this.canShowshowCadreDetails = true;
1006
+ const contrl = this.userDetailsForm.get('isCadre');
1007
+ if (contrl) {
1008
+ if (Object.keys(this.userProfileObject.profileDetails.personalDetails).includes('isCadre')) {
1009
+ if (this.userProfileObject.profileDetails.personalDetails.isCadre === true) {
1010
+ contrl.setValue(true);
1011
+ this.isCadreStatus = true;
1012
+ this.serviceId = this.userProfileObject.profileDetails.cadreDetails.civilServiceTypeId;
1013
+ this.civilServiceId = this.userProfileObject.profileDetails.cadreDetails.civilServiceId;
1014
+ this.cadreId = this.userProfileObject.profileDetails.cadreDetails.cadreId;
1015
+ this.cadreControllingAuthority = this.userProfileObject.profileDetails.cadreDetails.cadreControllingAuthorityName;
1016
+ setTimeout(() => {
1017
+ this.getService(this.userProfileObject.profileDetails.cadreDetails.civilServiceType);
1018
+ this.onServiceSelect({ value: this.userProfileObject.profileDetails.cadreDetails.civilServiceName });
1019
+ if (this.userProfileObject.profileDetails.cadreDetails.cadreName) {
1020
+ this.onCadreSelect(this.userProfileObject.profileDetails.cadreDetails.cadreName);
1021
+ }
1022
+ this.userDetailsForm.patchValue({
1023
+ typeOfCivilService: this.userProfileObject.profileDetails.cadreDetails.civilServiceType,
1024
+ serviceType: this.userProfileObject.profileDetails.cadreDetails.civilServiceName,
1025
+ cadreName: this.userProfileObject.profileDetails.cadreDetails.cadreName,
1026
+ cadreBatch: this.userProfileObject.profileDetails.cadreDetails.cadreBatch,
1027
+ cadreControllingAuthority: this.userProfileObject.profileDetails.cadreDetails.cadreControllingAuthorityName,
1028
+ });
1029
+ }, 1000);
1030
+ }
1031
+ else {
1032
+ contrl.setValue(false);
1033
+ this.isCadreStatus = false;
1034
+ }
1035
+ }
1036
+ else if (this.profileFormType === 'Available user filled iGOT profile') {
1037
+ this.canShowshowCadreDetails = false;
1038
+ this.isCadreStatus = false;
1039
+ }
1040
+ else {
1041
+ contrl.setValidators([Validators.required]);
1042
+ contrl.updateValueAndValidity();
1043
+ }
1044
+ }
1045
+ }
1046
+ }
1047
+ }
1048
+ findAttr(customAttr, fName) {
1049
+ if (fName === 'name') {
1050
+ return customAttr.find((_field) => _field.field === 'profileDetails.personalDetails.firstname');
1051
+ }
1052
+ if (fName === 'email') {
1053
+ return customAttr.find((_field) => _field.field === 'profileDetails.personalDetails.primaryEmail');
1054
+ }
1055
+ if (fName === 'organisation') {
1056
+ return customAttr.find((_field) => _field.field === 'profileDetails.employmentDetails.departmentName');
1057
+ }
1058
+ if (fName === 'group') {
1059
+ return customAttr.find((_field) => _field.field === 'profileDetails.professionalDetails.group');
1060
+ }
1061
+ if (fName === 'designation') {
1062
+ return customAttr.find((_field) => _field.field === 'profileDetails.professionalDetails.designation');
1063
+ }
1064
+ if (fName === 'employeeCode') {
1065
+ return customAttr.find((_field) => _field.field === 'profileDetails.employmentDetails.employeeCode');
1066
+ }
1067
+ if (fName === 'mobile') {
1068
+ return customAttr.find((_field) => _field.field === 'profileDetails.personalDetails.mobile');
1069
+ }
1070
+ if (fName === 'gender') {
1071
+ return customAttr.find((_field) => _field.field === 'profileDetails.personalDetails.gender');
1072
+ }
1073
+ if (fName === 'dob') {
1074
+ return customAttr.find((_field) => _field.field === 'profileDetails.personalDetails.dob');
1075
+ }
1076
+ if (fName === 'domicileMedium') {
1077
+ return customAttr.find((_field) => _field.field === 'profileDetails.personalDetails.domicileMedium');
1078
+ }
1079
+ if (fName === 'category') {
1080
+ return customAttr.find((_field) => _field.field === 'profileDetails.personalDetails.category');
1081
+ }
1082
+ if (fName === 'pinCode') {
1083
+ return customAttr.find((_field) => _field.field === 'profileDetails.employmentDetails.pinCode');
1084
+ }
1085
+ if (fName === 'cadreDetails') {
1086
+ return customAttr.find((_field) => _field.field === 'profileDetails.cadreDetails.civilServiceType');
1087
+ }
1088
+ }
1089
+ findInProfile(attr) {
1090
+ if (attr === 'name') {
1091
+ return this.userProfileObject.profileDetails.personalDetails.firstName || this.userProfileObject.profileDetails.personalDetails.firstname;
1092
+ }
1093
+ if (attr === 'group') {
1094
+ return (!this.userProfileObject.profileDetails.profileGroupStatus) ||
1095
+ this.userProfileObject.profileDetails.profileGroupStatus === 'NOT-VERIFIED' || (this.pGroup ? true : false);
1096
+ }
1097
+ if (attr === 'designation') {
1098
+ return (!this.userProfileObject.profileDetails.profileDesignationStatus) ||
1099
+ this.userProfileObject.profileDetails.profileDesignationStatus === 'NOT-VERIFIED' || (this.pDesignation ? true : false);
1100
+ }
1101
+ }
1102
+ getGroupData() {
1103
+ this.addLoader = this.addLoader + 1;
1104
+ this.userProfileService.getGroups()
1105
+ .pipe(takeUntil(this.destroySubject$))
1106
+ .subscribe((res) => {
1107
+ this.addLoader = this.addLoader - 1;
1108
+ this.groupData = res.result && res.result.response.filter((ele) => ele !== 'Others');
1109
+ }, (error) => {
1110
+ this.addLoader = this.addLoader - 1;
1111
+ if (!error.ok) {
1112
+ this.snackBar.open(this.handleTranslateTo('groupDataFaile'));
1113
+ }
1114
+ });
1115
+ }
1116
+ handleTranslateTo(menuName) {
1117
+ return this.userProfileService.handleTranslateTo(menuName);
1118
+ }
1119
+ checkSelectedOrgHasDesignations() {
1120
+ if (this.organisationId) {
1121
+ const igotDesignationBody = {
1122
+ request: {
1123
+ filters: {
1124
+ status: 'Live',
1125
+ category: 'designation',
1126
+ categories: [
1127
+ this.organisationId + '_odcs_designation',
1128
+ ],
1129
+ objectType: 'Term',
1130
+ },
1131
+ fields: ['name'],
1132
+ offset: 0,
1133
+ limit: 1,
1134
+ sort_by: {
1135
+ lastUpdatedOn: 'desc',
1136
+ objectType: 'Term',
1137
+ },
1138
+ facets: [],
1139
+ },
1140
+ };
1141
+ this.userProfileService.searchIgotDesignation(igotDesignationBody).subscribe({
1142
+ next: (res) => {
1143
+ const count = _.get(res, 'result.count', 0);
1144
+ this.selectedOrgHasDesignations = count > 0;
1145
+ this.getdesignationsMeta();
1146
+ },
1147
+ error: () => {
1148
+ this.selectedOrgHasDesignations = false;
1149
+ this.getdesignationsMeta();
1150
+ }
1151
+ });
1152
+ }
1153
+ else {
1154
+ this.selectedOrgHasDesignations = false;
1155
+ this.getdesignationsMeta();
1156
+ }
1157
+ }
1158
+ getdesignationsMeta() {
1159
+ this.isLoadingMoreDesignations = true;
1160
+ if (this.selectedOrgHasDesignations) {
1161
+ this.getIgotDesignations();
1162
+ }
1163
+ else {
1164
+ this.getDefaultDesignations();
1165
+ }
1166
+ }
1167
+ getIgotDesignations() {
1168
+ const requestBody = {
1169
+ request: {
1170
+ filters: {
1171
+ status: "Live",
1172
+ category: "designation",
1173
+ categories: [
1174
+ this.organisationId + '_odcs_designation',
1175
+ ],
1176
+ objectType: "Term"
1177
+ },
1178
+ fields: [
1179
+ "name"
1180
+ ],
1181
+ offset: this.designationsOffset,
1182
+ limit: this.designationListLoadCount,
1183
+ sort_by: {
1184
+ lastUpdatedOn: "desc",
1185
+ objectType: "Term"
1186
+ },
1187
+ facets: []
1188
+ }
1189
+ };
1190
+ if (this.designationSearchText) {
1191
+ requestBody['request']['query'] = this.designationSearchText;
1192
+ }
1193
+ this.userProfileService.searchIgotDesignation(requestBody).subscribe({
1194
+ next: (res) => {
1195
+ this.isLoadingMoreDesignations = false;
1196
+ if (this.designationsOffset === 0) {
1197
+ this.designationsMeta = _.get(res, 'result.Term', []);
1198
+ }
1199
+ else {
1200
+ this.designationsMeta = [...this.designationsMeta, ..._.get(res, 'result.Term', [])];
1201
+ }
1202
+ this.designationsTotalCount = _.get(res, 'result.count', 0);
1203
+ this.checkCurrentDesignationPresent();
1204
+ },
1205
+ error: () => {
1206
+ this.isLoadingMoreDesignations = false;
1207
+ this.openSnackbar('Something went wrong. Please refresh or try again later.');
1208
+ }
1209
+ });
1210
+ }
1211
+ getDefaultDesignations() {
1212
+ const requestBody = {
1213
+ filterCriteriaMap: {
1214
+ status: 'Active'
1215
+ },
1216
+ requestedFields: [],
1217
+ pageNumber: this.designationsOffset,
1218
+ pageSize: this.designationListLoadCount
1219
+ };
1220
+ if (this.designationSearchText) {
1221
+ requestBody['searchString'] = this.designationSearchText;
1222
+ }
1223
+ this.userProfileService.searchDesignation(requestBody).subscribe({
1224
+ next: (res) => {
1225
+ this.isLoadingMoreDesignations = false;
1226
+ const content = _.get(res, 'result.result.data', []);
1227
+ const mapped = content.map((item) => ({
1228
+ name: item.designation || '',
1229
+ status: item.status || 'Active',
1230
+ }));
1231
+ if (this.designationsOffset === 0) {
1232
+ this.designationsMeta = mapped;
1233
+ }
1234
+ else {
1235
+ this.designationsMeta = [...this.designationsMeta, ...mapped];
1236
+ }
1237
+ this.designationsTotalCount = _.get(res, 'result.result.totalCount', 0);
1238
+ this.checkCurrentDesignationPresent();
1239
+ },
1240
+ error: () => {
1241
+ this.isLoadingMoreDesignations = false;
1242
+ this.openSnackbar('Something went wrong. Please refresh or try again later.');
1243
+ }
1244
+ });
1245
+ }
1246
+ getMasterLanguage() {
1247
+ this.userProfileService.getMasterLanguages()
1248
+ .pipe(takeUntil(this.destroySubject$))
1249
+ .subscribe((res) => {
1250
+ this.masterLanguages = res.languages;
1251
+ this.masterLanguageBackup = res.languages;
1252
+ }, (error) => {
1253
+ if (!error.ok) {
1254
+ this.snackBar.open(this.handleTranslateTo('unableFetchMasterLanguageData'));
1255
+ }
1256
+ });
1257
+ }
1258
+ handleEmpty(type) {
1259
+ if (type === 'mobile') {
1260
+ if (this.userProfileObject.profileDetails.personalDetails.mobile && !this.userDetailsForm.controls['mobile'].value) {
1261
+ this.userDetailsForm.controls['mobile'].setErrors({ valid: false });
1262
+ }
1263
+ }
1264
+ if (type === 'primaryEmail') {
1265
+ if (!this.userProfileObject.profileDetails.personalDetails.primaryEmail && !this.userProfileObject.profileDetails.value['primaryEmail']) {
1266
+ this.userDetailsForm.setErrors({ valid: false });
1267
+ }
1268
+ }
1269
+ }
1270
+ onSubmitForm(form) {
1271
+ /* tslint:disable */
1272
+ console.log(form);
1273
+ let payload = this.generateProfilePayload();
1274
+ if ((this.canShowDesignation || this.canShowGroup) && !this.showDoptChanges) {
1275
+ if (this.pendingFileds) {
1276
+ this.pendingFileds.forEach((_obj) => {
1277
+ if (Object.keys(_obj).includes('designation')) {
1278
+ this.addLoader = this.addLoader + 1;
1279
+ this.profileV2Svc.withDrawApprovalRequest(this.configSrc.unMappedUser.id, _obj.wfId).subscribe((resp) => {
1280
+ if (resp && resp.result) {
1281
+ this.addLoader = this.addLoader - 1;
1282
+ /* tslint:disable */
1283
+ console.log(resp.result.message);
1284
+ }
1285
+ }, (error) => {
1286
+ if (error) {
1287
+ this.addLoader = this.addLoader - 1;
1288
+ }
1289
+ });
1290
+ }
1291
+ if (Object.keys(_obj).includes('group')) {
1292
+ this.addLoader = this.addLoader + 1;
1293
+ this.profileV2Svc.withDrawApprovalRequest(this.configSrc.unMappedUser.id, _obj.wfId).subscribe((resp) => {
1294
+ if (resp && resp.result) {
1295
+ this.addLoader = this.addLoader - 1;
1296
+ /* tslint:disable */
1297
+ console.log(resp.result.message);
1298
+ }
1299
+ }, (error) => {
1300
+ if (error) {
1301
+ this.addLoader = this.addLoader - 1;
1302
+ }
1303
+ });
1304
+ }
1305
+ });
1306
+ if (this.userProfileObject.profileDetails.personalDetails.primaryEmail !== this.userDetailsForm.value.primaryEmail && this.canShowEmail) {
1307
+ this.updateEmail(this.userDetailsForm.value.primaryEmail);
1308
+ }
1309
+ this.submitProfile(payload);
1310
+ }
1311
+ }
1312
+ else {
1313
+ if (this.userProfileObject.profileDetails.personalDetails.primaryEmail !== this.userDetailsForm.value.primaryEmail && this.canShowEmail) {
1314
+ this.updateEmail(this.userDetailsForm.value.primaryEmail);
1315
+ }
1316
+ this.submitProfile(payload);
1317
+ }
1318
+ }
1319
+ submitProfile(payload) {
1320
+ if (payload && payload['request'] && payload['request']['profileDetails'] && payload['request']['profileDetails']['personalDetails'] && payload['request']['profileDetails']['personalDetails']['dob']) {
1321
+ let dobFormat = payload['request']['profileDetails']['personalDetails']['dob'];
1322
+ let dob = `${new Date(dobFormat).getDate()}-${new Date(dobFormat).getMonth() + 1}-${new Date(dobFormat).getFullYear()}`;
1323
+ payload['request']['profileDetails']['personalDetails']['dob'] = dob;
1324
+ }
1325
+ if (this.updateProfile) {
1326
+ this.addLoader = this.addLoader + 1;
1327
+ this.userProfileService.editProfileDetails(payload).subscribe((res) => {
1328
+ this.addLoader = this.addLoader - 1;
1329
+ if (res.responseCode === 'OK') {
1330
+ this.submitSurevy(true);
1331
+ }
1332
+ }, error => {
1333
+ this.addLoader = this.addLoader - 1;
1334
+ /* tslint:disable */
1335
+ console.log(error);
1336
+ this.snackBar.open("something went wrong!");
1337
+ });
1338
+ }
1339
+ }
1340
+ submitSurevy(status) {
1341
+ let surevyPayload = {
1342
+ formId: _.get(this.data, 'batchData.batchAttributes.profileSurveyId'),
1343
+ version: 4,
1344
+ status: 'SUBMITTED',
1345
+ responses: this.genereateSurveyPayload(status),
1346
+ contextId: _.get(this.data, 'batchData.courseId'),
1347
+ contextName: _.get(this.data, 'courseName', ''),
1348
+ };
1349
+ this.addLoader = this.addLoader + 1;
1350
+ this.npsSvc.submitBpFormWithProfileDetails(surevyPayload).subscribe((resp) => {
1351
+ this.addLoader = this.addLoader - 1;
1352
+ if (_.get(resp, 'params.status') === 'success') {
1353
+ this.customForm = false;
1354
+ this.snackBar.open("Form is submitted successfully");
1355
+ this.closePopup();
1356
+ }
1357
+ if (resp && resp.statusCode && resp.statusCode !== 200) {
1358
+ this.customForm = false;
1359
+ this.snackBar.open(resp.errorMessage);
1360
+ }
1361
+ }, error => {
1362
+ this.addLoader = this.addLoader - 1;
1363
+ /* tslint:disable */
1364
+ console.log(error);
1365
+ this.snackBar.open("something went wrong!");
1366
+ });
1367
+ }
1368
+ generateProfilePayload() {
1369
+ let payload = {
1370
+ request: {
1371
+ userId: this.userProfileObject.identifier,
1372
+ profileDetails: {
1373
+ employmentDetails: {},
1374
+ personalDetails: {},
1375
+ // cadreDetails: {},
1376
+ }
1377
+ }
1378
+ };
1379
+ let _professionalDetails = {};
1380
+ let updateProfessionalDetails = false;
1381
+ if (this.showGroup && this.userDetailsForm.controls['group'].value && !this.showDoptChanges) {
1382
+ _professionalDetails['group'] = this.userDetailsForm.controls['group'].value;
1383
+ this.updateProfile = true;
1384
+ updateProfessionalDetails = true;
1385
+ }
1386
+ if (this.showDesignation && this.userDetailsForm.controls['designation'].value && !this.showDoptChanges) {
1387
+ _professionalDetails['designation'] = this.userDetailsForm.controls['designation'].value;
1388
+ this.updateProfile = true;
1389
+ updateProfessionalDetails = true;
1390
+ }
1391
+ if (updateProfessionalDetails) {
1392
+ payload.request.profileDetails['professionalDetails'] = [_professionalDetails];
1393
+ }
1394
+ if (this.userDetailsForm.controls['employeeCode'].value) {
1395
+ payload.request.profileDetails.employmentDetails['employeeCode'] = this.userDetailsForm.controls['employeeCode'].value;
1396
+ this.updateProfile = true;
1397
+ }
1398
+ if (this.userDetailsForm.controls['mobile'].value) {
1399
+ payload.request.profileDetails.personalDetails['mobile'] = this.userDetailsForm.controls['mobile'].value;
1400
+ payload.request.profileDetails.personalDetails['phoneVerified'] = true;
1401
+ this.updateProfile = true;
1402
+ }
1403
+ if (this.userDetailsForm.controls['gender'].value) {
1404
+ payload.request.profileDetails.personalDetails['gender'] = this.userDetailsForm.controls['gender'].value;
1405
+ this.updateProfile = true;
1406
+ }
1407
+ if (this.userDetailsForm.controls['dob'].value) {
1408
+ payload.request.profileDetails.personalDetails['dob'] = this.userDetailsForm.controls['dob'].value;
1409
+ this.updateProfile = true;
1410
+ }
1411
+ if (this.userDetailsForm.controls['domicileMedium'].value) {
1412
+ payload.request.profileDetails.personalDetails['domicileMedium'] = this.userDetailsForm.controls['domicileMedium'].value;
1413
+ this.updateProfile = true;
1414
+ }
1415
+ if (this.userDetailsForm.controls['category'].value) {
1416
+ payload.request.profileDetails.personalDetails['category'] = this.userDetailsForm.controls['category'].value;
1417
+ this.updateProfile = true;
1418
+ }
1419
+ if (this.userDetailsForm.controls['pinCode'].value) {
1420
+ payload.request.profileDetails.employmentDetails['pinCode'] = this.userDetailsForm.controls['pinCode'].value;
1421
+ payload.request.profileDetails.personalDetails['pincode'] = this.userDetailsForm.controls['pinCode'].value;
1422
+ this.updateProfile = true;
1423
+ }
1424
+ if (this.canShowshowCadreDetails && !this.showDoptChanges) {
1425
+ let _cadreDetails = {};
1426
+ payload.request.profileDetails.personalDetails['isCadre'] = this.userDetailsForm.controls['isCadre'].value;
1427
+ this.updateProfile = true;
1428
+ if (this.userDetailsForm.controls['isCadre'].value) {
1429
+ _cadreDetails['civilServiceType'] = this.userDetailsForm.controls['typeOfCivilService'].value;
1430
+ _cadreDetails['civilServiceName'] = this.userDetailsForm.controls['serviceType'].value;
1431
+ _cadreDetails['cadreName'] = this.userDetailsForm.controls['cadreName'].value;
1432
+ _cadreDetails['cadreBatch'] = this.userDetailsForm.controls['cadreBatch'].value;
1433
+ _cadreDetails['cadreControllingAuthorityName'] = this.cadreControllingAuthority;
1434
+ _cadreDetails['cadreId'] = this.cadreId;
1435
+ _cadreDetails['civilServiceId'] = this.civilServiceId;
1436
+ _cadreDetails['civilServiceTypeId'] = this.serviceId;
1437
+ payload.request.profileDetails['cadreDetails'] = _cadreDetails;
1438
+ }
1439
+ }
1440
+ return payload;
1441
+ }
1442
+ formatDate(_dob) {
1443
+ let dateObj = null;
1444
+ if (_dob instanceof Date) {
1445
+ dateObj = _dob;
1446
+ }
1447
+ else if (typeof _dob === 'string') {
1448
+ const parts = _dob.split('-');
1449
+ if (parts.length === 3) {
1450
+ const [day, month, year] = parts;
1451
+ dateObj = new Date(Number(year), Number(month) - 1, Number(day));
1452
+ }
1453
+ else {
1454
+ const parsed = new Date(_dob);
1455
+ if (!isNaN(parsed.getTime())) {
1456
+ dateObj = parsed;
1457
+ }
1458
+ }
1459
+ }
1460
+ if (!dateObj || isNaN(dateObj.getTime())) {
1461
+ return '';
1462
+ }
1463
+ return this.datePipe.transform(dateObj, 'yyyy-MM-dd') || '';
1464
+ }
1465
+ getQuestionId(fieldName) {
1466
+ if (!fieldName || !this.formsDetils.fields) {
1467
+ return '';
1468
+ }
1469
+ const field = this.formsDetils.fields.find((f) => f.field === fieldName) || {};
1470
+ return field.id || '';
1471
+ }
1472
+ genereateSurveyPayload(status) {
1473
+ let dataObject = [];
1474
+ this.batchDetails.batchAttributes.bpEnrolMandatoryProfileFields.forEach((_field) => {
1475
+ const fieldToAdd = {
1476
+ questionId: this.getQuestionId(_field.field),
1477
+ question: _field.displayName,
1478
+ answer: '',
1479
+ answerType: _field.fieldType
1480
+ };
1481
+ if (_field.field === 'profileDetails.personalDetails.firstname') {
1482
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.personalDetails.firstName', _.get(this.userProfileObject, 'profileDetails.personalDetails.firstname', ''));
1483
+ dataObject.push(fieldToAdd);
1484
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.personalDetails.firstName || this.userProfileObject.profileDetails.personalDetails.firstname
1485
+ }
1486
+ if (_field.field === 'profileDetails.employmentDetails.departmentName') {
1487
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.employmentDetails.departmentName', 'N/A');
1488
+ dataObject.push(fieldToAdd);
1489
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.employmentDetails && this.userProfileObject.profileDetails.employmentDetails.departmentName ?
1490
+ // this.userProfileObject.profileDetails.employmentDetails.departmentName : "N/A"
1491
+ }
1492
+ if (_field.field === 'profileDetails.professionalDetails.group') {
1493
+ if (this.showGroup && status) {
1494
+ fieldToAdd.answer = this.userDetailsForm.controls['group'].value;
1495
+ // dataObject[_field.name] = this.userDetailsForm.controls['group'].value
1496
+ }
1497
+ else {
1498
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.professionalDetails[0].group', 'N/A');
1499
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.professionalDetails && this.userProfileObject.profileDetails.professionalDetails[0].group ?
1500
+ // this.userProfileObject.profileDetails.professionalDetails[0].group : "N/A"
1501
+ }
1502
+ dataObject.push(fieldToAdd);
1503
+ }
1504
+ if (_field.field === 'profileDetails.professionalDetails.designation') {
1505
+ if (this.showDesignation && status) {
1506
+ if (this.showDoptChanges && this.userDetailsForm.controls['designation'] &&
1507
+ this.userDetailsForm.controls['designation'].value === 'Others' && this.userDetailsForm.controls['otherDesignation']) {
1508
+ // dataObject[_field.name] = this.userDetailsForm.controls['otherDesignation'].value
1509
+ fieldToAdd.answer = this.userDetailsForm.controls['otherDesignation'].value;
1510
+ }
1511
+ else {
1512
+ // dataObject[_field.name] = this.userDetailsForm.controls['designation'].value
1513
+ fieldToAdd.answer = this.userDetailsForm.controls['designation'].value;
1514
+ }
1515
+ dataObject.push(fieldToAdd);
1516
+ }
1517
+ else {
1518
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.professionalDetails && this.userProfileObject.profileDetails.professionalDetails[0].designation ?
1519
+ // this.userProfileObject.profileDetails.professionalDetails[0].designation : "N/A"
1520
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.professionalDetails[0].designation', 'N/A');
1521
+ dataObject.push(fieldToAdd);
1522
+ }
1523
+ }
1524
+ if (_field.field === 'profileDetails.employmentDetails.employeeCode') {
1525
+ if (this.showEmployeeCode && status) {
1526
+ // dataObject[_field.name] = this.userDetailsForm.controls['employeeCode'].value
1527
+ fieldToAdd.answer = this.userDetailsForm.controls['employeeCode'].value;
1528
+ }
1529
+ else {
1530
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.employmentDetails.employeeCode', 'N/A');
1531
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.employmentDetails && this.userProfileObject.profileDetails.employmentDetails.employeeCode ?
1532
+ // this.userProfileObject.profileDetails.employmentDetails.employeeCode : "N/A"
1533
+ }
1534
+ dataObject.push(fieldToAdd);
1535
+ }
1536
+ if (_field.field === 'profileDetails.personalDetails.primaryEmail') {
1537
+ fieldToAdd.answer = this.userProfileObject.profileDetails.personalDetails.primaryEmail;
1538
+ dataObject.push(fieldToAdd);
1539
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.personalDetails.primaryEmail
1540
+ }
1541
+ if (_field.field === 'profileDetails.personalDetails.mobile') {
1542
+ if (this.showMobile && status) {
1543
+ fieldToAdd.answer = this.userDetailsForm.controls['mobile'].value;
1544
+ // dataObject[_field.name] = this.userDetailsForm.controls['mobile'].value
1545
+ }
1546
+ else {
1547
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.personalDetails.mobile', 'N/A');
1548
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.personalDetails && this.userProfileObject.profileDetails.personalDetails.mobile ?
1549
+ // this.userProfileObject.profileDetails.personalDetails.mobile : "N/A"
1550
+ }
1551
+ dataObject.push(fieldToAdd);
1552
+ }
1553
+ if (_field.field === 'profileDetails.personalDetails.dob') {
1554
+ if (this.showDob && status) {
1555
+ let _dob = this.userDetailsForm.controls['dob'].value;
1556
+ // dataObject[_field.name] = this.formatDate(_dob)
1557
+ fieldToAdd.answer = this.formatDate(_dob);
1558
+ dataObject.push(fieldToAdd);
1559
+ }
1560
+ else {
1561
+ if (this.userProfileObject.profileDetails.personalDetails && this.userProfileObject.profileDetails.personalDetails.dob) {
1562
+ let _dob = this.userProfileObject.profileDetails.personalDetails.dob;
1563
+ const [day, month, year] = _dob.split('-');
1564
+ const date = new Date(Number(year), Number(month) - 1, Number(day));
1565
+ const formattedDay = String(date.getDate()).padStart(2, '0');
1566
+ const formattedMonth = String(date.getMonth() + 1).padStart(2, '0');
1567
+ const formattedYear = date.getFullYear();
1568
+ // dataObject[_field.name] = `${formattedYear}-${formattedMonth}-${formattedDay}`
1569
+ fieldToAdd.answer = `${formattedYear}-${formattedMonth}-${formattedDay}`;
1570
+ }
1571
+ else {
1572
+ // dataObject[_field.name] = "1950-06-01"
1573
+ fieldToAdd.answer = "1950-06-01";
1574
+ }
1575
+ dataObject.push(fieldToAdd);
1576
+ }
1577
+ }
1578
+ if (_field.field === 'profileDetails.personalDetails.gender') {
1579
+ if (this.showGender && status) {
1580
+ fieldToAdd.answer = this.userDetailsForm.controls['gender'].value;
1581
+ // dataObject[_field.name] = this.userDetailsForm.controls['gender'].value
1582
+ }
1583
+ else {
1584
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.personalDetails.gender', 'N/A');
1585
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.personalDetails && this.userProfileObject.profileDetails.personalDetails.gender ?
1586
+ // this.userProfileObject.profileDetails.personalDetails.gender : "N/A"
1587
+ }
1588
+ dataObject.push(fieldToAdd);
1589
+ }
1590
+ if (_field.field === 'profileDetails.personalDetails.domicileMedium') {
1591
+ if (this.showDecimalMedium && status) {
1592
+ // dataObject[_field.name] = this.userDetailsForm.controls['domicileMedium'].value
1593
+ fieldToAdd.answer = this.userDetailsForm.controls['domicileMedium'].value;
1594
+ }
1595
+ else {
1596
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.personalDetails.domicileMedium', 'N/A');
1597
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.personalDetails && this.userProfileObject.profileDetails.personalDetails.domicileMedium ?
1598
+ // this.userProfileObject.profileDetails.personalDetails.domicileMedium : "N/A"
1599
+ }
1600
+ dataObject.push(fieldToAdd);
1601
+ }
1602
+ if (_field.field === 'profileDetails.personalDetails.category') {
1603
+ if (this.showCategory && status) {
1604
+ fieldToAdd.answer = this.userDetailsForm.controls['category'].value;
1605
+ // dataObject[_field.name] = this.userDetailsForm.controls['category'].value
1606
+ }
1607
+ else {
1608
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.personalDetails.category', 'N/A');
1609
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.personalDetails && this.userProfileObject.profileDetails.personalDetails.category ?
1610
+ // this.userProfileObject.profileDetails.personalDetails.category : "N/A"
1611
+ }
1612
+ dataObject.push(fieldToAdd);
1613
+ }
1614
+ if (_field.field === 'profileDetails.employmentDetails.pinCode') {
1615
+ if (this.showPinCode && status) {
1616
+ fieldToAdd.answer = this.userDetailsForm.controls['pinCode'].value;
1617
+ // dataObject[_field.name] = this.userDetailsForm.controls['pinCode'].value
1618
+ }
1619
+ else {
1620
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.employmentDetails.pinCode', 'N/A');
1621
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.employmentDetails && this.userProfileObject.profileDetails.employmentDetails.pinCode ?
1622
+ // this.userProfileObject.profileDetails.employmentDetails.pinCode : "N/A"
1623
+ }
1624
+ dataObject.push(fieldToAdd);
1625
+ }
1626
+ if (_field.field === 'profileDetails.cadreDetails') {
1627
+ if (this.canShowshowCadreDetails && this.userDetailsForm.controls['isCadre'].value && status) {
1628
+ // dataObject[_field.name] = this.userDetailsForm.controls['isCadre'].value
1629
+ fieldToAdd.answer = this.userDetailsForm.controls['isCadre'].value;
1630
+ }
1631
+ else {
1632
+ // dataObject[_field.name] = this.userProfileObject.profileDetails &&
1633
+ // this.userProfileObject.profileDetails.personalDetails.isCadre ? 'Yes' : 'No'
1634
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.personalDetails.isCadre') ? 'Yes' : 'No';
1635
+ }
1636
+ dataObject.push(fieldToAdd);
1637
+ }
1638
+ if (_field.field === 'profileDetails.cadreDetails.civilServiceType') {
1639
+ if (this.canShowshowCadreDetails && this.userDetailsForm.controls['isCadre'].value && status) {
1640
+ // dataObject[_field.name] = this.userDetailsForm.controls['typeOfCivilService'].value
1641
+ fieldToAdd.answer = this.userDetailsForm.controls['typeOfCivilService'].value;
1642
+ }
1643
+ else {
1644
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.cadreDetails && this.userProfileObject.profileDetails.cadreDetails.civilServiceType ?
1645
+ // this.userProfileObject.profileDetails.cadreDetails.civilServiceType : 'N/A'
1646
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.cadreDetails.civilServiceType', 'N/A');
1647
+ }
1648
+ dataObject.push(fieldToAdd);
1649
+ }
1650
+ if (_field.field === 'profileDetails.cadreDetails.civilServiceName') {
1651
+ if (this.canShowshowCadreDetails && this.userDetailsForm.controls['isCadre'].value && status) {
1652
+ // dataObject[_field.name] = this.userDetailsForm.controls['serviceType'].value
1653
+ fieldToAdd.answer = this.userDetailsForm.controls['serviceType'].value;
1654
+ }
1655
+ else {
1656
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.cadreDetails && this.userProfileObject.profileDetails.cadreDetails.civilServiceName ?
1657
+ // this.userProfileObject.profileDetails.cadreDetails.civilServiceName : 'N/A'
1658
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.cadreDetails.civilServiceName', 'N/A');
1659
+ }
1660
+ dataObject.push(fieldToAdd);
1661
+ }
1662
+ if (_field.field === 'profileDetails.cadreDetails.cadreName') {
1663
+ if (this.canShowshowCadreDetails && this.userDetailsForm.controls['isCadre'].value && status) {
1664
+ // dataObject[_field.name] = this.userDetailsForm.controls['cadreName'].value
1665
+ fieldToAdd.answer = this.userDetailsForm.controls['cadreName'].value;
1666
+ }
1667
+ else {
1668
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.cadreDetails.cadreName', 'N/A');
1669
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.cadreDetails && this.userProfileObject.profileDetails.cadreDetails.cadreName ?
1670
+ // this.userProfileObject.profileDetails.cadreDetails.cadreName : 'N/A'
1671
+ }
1672
+ dataObject.push(fieldToAdd);
1673
+ }
1674
+ if (_field.field === 'profileDetails.cadreDetails.cadreBatch') {
1675
+ if (this.canShowshowCadreDetails && this.userDetailsForm.controls['isCadre'].value && status) {
1676
+ // dataObject[_field.name] = this.userDetailsForm.controls['cadreBatch'].value
1677
+ fieldToAdd.answer = this.userDetailsForm.controls['cadreBatch'].value;
1678
+ }
1679
+ else {
1680
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.cadreDetails && this.userProfileObject.profileDetails.cadreDetails.cadreBatch ?
1681
+ // JSON.stringify(this.userProfileObject.profileDetails.cadreDetails.cadreBatch) : 'N/A'
1682
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.cadreDetails.cadreBatch') ? JSON.stringify(this.userProfileObject.profileDetails.cadreDetails.cadreBatch) : 'N/A';
1683
+ }
1684
+ dataObject.push(fieldToAdd);
1685
+ }
1686
+ if (_field.field === 'profileDetails.cadreDetails.cadreControllingAuthorityName') {
1687
+ if (this.canShowshowCadreDetails && this.userDetailsForm.controls['isCadre'].value && status) {
1688
+ // dataObject[_field.name] = this.cadreControllingAuthority
1689
+ fieldToAdd.answer = this.cadreControllingAuthority;
1690
+ }
1691
+ else {
1692
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.cadreDetails && this.userProfileObject.profileDetails.cadreDetails.cadreControllingAuthorityName ?
1693
+ // this.userProfileObject.profileDetails.cadreDetails.cadreControllingAuthorityName : 'N/A'
1694
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.cadreDetails.cadreControllingAuthorityName', 'N/A');
1695
+ }
1696
+ dataObject.push(fieldToAdd);
1697
+ }
1698
+ if (_field.field === 'profileDetails.additionalProperties.externalSystemId') {
1699
+ if (this.userProfileObject.profileDetails.additionalProperties &&
1700
+ this.userProfileObject.profileDetails.additionalProperties.externalSystemId) {
1701
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.additionalProperties && this.userProfileObject.profileDetails.additionalProperties.externalSystemId
1702
+ // ? this.userProfileObject.profileDetails.additionalProperties.externalSystemId : "N/A"
1703
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.additionalProperties.externalSystemId', 'N/A');
1704
+ }
1705
+ else {
1706
+ dataObject[_field.name] = 'N/A';
1707
+ }
1708
+ dataObject.push(fieldToAdd);
1709
+ }
1710
+ if (_field.field === 'profileDetails.additionalProperties.externalSystemDor') {
1711
+ if (this.userProfileObject.profileDetails.additionalProperties &&
1712
+ this.userProfileObject.profileDetails.additionalProperties.externalSystemDor) {
1713
+ // dataObject[_field.name] = this.userProfileObject.profileDetails.additionalProperties && this.userProfileObject.profileDetails.additionalProperties.externalSystemDor
1714
+ // ? this.userProfileObject.profileDetails.additionalProperties.externalSystemDor : "N/A"
1715
+ fieldToAdd.answer = _.get(this.userProfileObject, 'profileDetails.additionalProperties.externalSystemDor', 'N/A');
1716
+ }
1717
+ else {
1718
+ // dataObject[_field.name] = 'N/A'
1719
+ fieldToAdd.answer = 'N/A';
1720
+ }
1721
+ dataObject.push(fieldToAdd);
1722
+ }
1723
+ });
1724
+ return dataObject;
1725
+ }
1726
+ updateEmail(email) {
1727
+ const postData = {
1728
+ request: {
1729
+ 'userId': this.configSrc.unMappedUser.id,
1730
+ 'contextToken': this.contextToken,
1731
+ 'profileDetails': {
1732
+ 'personalDetails': {
1733
+ 'primaryEmail': email,
1734
+ },
1735
+ },
1736
+ },
1737
+ };
1738
+ this.addLoader = this.addLoader + 1;
1739
+ this.userProfileService.updatePrimaryEmailDetails(postData)
1740
+ .pipe(takeUntil(this.destroySubject$))
1741
+ .subscribe((_res) => {
1742
+ this.addLoader = this.addLoader - 1;
1743
+ this.userProfileObject.profileDetails.personalDetails.primaryEmail = email;
1744
+ this.snackBar.open(this.handleTranslateTo('emailUpdated'));
1745
+ }, (error) => {
1746
+ this.addLoader = this.addLoader - 1;
1747
+ if (!error.ok) {
1748
+ this.snackBar.open(this.handleTranslateTo('updateEmailFailed'));
1749
+ }
1750
+ });
1751
+ }
1752
+ setupScrollListener(opened) {
1753
+ const searchDesignationControl = this.userDetailsForm.get('searchDesignation');
1754
+ if (opened && searchDesignationControl) {
1755
+ searchDesignationControl.setValue('');
1756
+ this.designationsOffset = 0;
1757
+ this.designationsMeta = [];
1758
+ this.getdesignationsMeta();
1759
+ const searchInput = document.querySelector('.search-input');
1760
+ if (searchInput) {
1761
+ searchInput.focus();
1762
+ }
1763
+ const panel = document.querySelector('.mat-select-panel');
1764
+ if (panel) {
1765
+ panel.addEventListener('scroll', this.onDesignationSelectScroll.bind(this));
1766
+ }
1767
+ }
1768
+ }
1769
+ onDesignationSelectScroll(event) {
1770
+ const element = event.target;
1771
+ // Check if user has scrolled to the bottom (with a small threshold)
1772
+ if (element.scrollTop + element.clientHeight >= element.scrollHeight - 5) {
1773
+ // Only load more if not already loading and if there are potentially more items
1774
+ if (!this.isLoadingMoreDesignations && this.designationsMeta.length < this.designationsTotalCount) {
1775
+ this.isLoadingMoreDesignations = true;
1776
+ this.designationsOffset += 1;
1777
+ this.getdesignationsMeta();
1778
+ }
1779
+ }
1780
+ }
1781
+ checkCurrentDesignationPresent() {
1782
+ // Get the current designation value
1783
+ const searchDesignationControl = this.userDetailsForm.get('designation');
1784
+ const currentDesignation = searchDesignationControl ? searchDesignationControl.value : '';
1785
+ // Check if current designation exists in the list
1786
+ if (currentDesignation) {
1787
+ const designationExists = this.designationsMeta.some((designation) => designation.name.toLowerCase() === currentDesignation.toLowerCase());
1788
+ // If designation doesn't exist in the list, add it
1789
+ if (!designationExists) {
1790
+ // Create a new designation object to match the structure of other items
1791
+ const newDesignation = {
1792
+ name: currentDesignation,
1793
+ status: 'Active'
1794
+ };
1795
+ this.designationsMeta.unshift(newDesignation);
1796
+ }
1797
+ }
1798
+ }
1799
+ onDesignationDropdownClosed() {
1800
+ const searchDesignationControl = this.userDetailsForm.get('searchDesignation');
1801
+ if (searchDesignationControl) {
1802
+ searchDesignationControl.setValue('');
1803
+ this.designationSearchText = '';
1804
+ }
1805
+ this.checkCurrentDesignationPresent();
1806
+ }
1807
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EnrollProfileFormComponent, deps: [{ token: i1.MatLegacySnackBar }, { token: i2.MatLegacyDialogRef }, { token: i3.UserProfileService }, { token: i4.ConfigurationsService }, { token: i5.ProfileV2Service }, { token: i6.OtpService }, { token: i7.NPSGridService }, { token: i8.TranslateService }, { token: i9.DatePipe }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
1808
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: EnrollProfileFormComponent, selector: "ws-app-enroll-profile-form", host: { listeners: { "document:click": "handleClickOutside($event)" } }, viewQueries: [{ propertyName: "timerDiv", first: true, predicate: ["timerDiv"], descendants: true }, { propertyName: "emailTimerDiv", first: true, predicate: ["emailTimerDiv"], descendants: true }, { propertyName: "textBox", first: true, predicate: ["textBox"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "languageTextBox", first: true, predicate: ["languageTextBox"], descendants: true }, { propertyName: "languageDropdown", first: true, predicate: ["languageDropdown"], descendants: true }], ngImport: i0, template: "<div #fullScreenContainer>\n <div class=\"dialog-header text-right mb-2\">\n <mat-icon class=\"mat-icon notranslate material-icons close-icon cursor-pointer\" matprefix=\"\" role=\"img\" aria-hidden=\"true\" [mat-dialog-close]=\"false\">close</mat-icon>\n </div>\n <h1> {{data?.courseName}} </h1>\n <div class=\"w-full\" *ngIf=\"!isLoading\">\n <form [formGroup]=\"userDetailsForm\" class=\"userDetailsForm\">\n <div class=\"w-full\" *ngIf=\"canShowName\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.name' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <input type=\"text\" class=\"input-text\" matInput formControlName=\"name\" placeholder=\"Name\"/>\n </mat-form-field>\n </div>\n <div class=\"w-full\" *ngIf=\"canShowOrg\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ (showDoptChanges ? 'profileInfo.presentOrganisation' : 'profileInfo.organisation') | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <input type=\"text\" class=\"input-text\" matInput formControlName=\"organisation\" placeholder=\"Organisation\"/>\n </mat-form-field>\n </div>\n <div class=\"w-full\" *ngIf=\"canShowEmail\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.email' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <input type=\"text\" class=\"input-text\" matInput formControlName=\"primaryEmail\" placeholder=\"Enter email\" (keyup)=\"handleEmpty('primaryEmail')\"/>\n </mat-form-field>\n <mat-error class=\"mat-error\" *ngIf=\"userDetailsForm.get('primaryEmail').hasError('required') || userDetailsForm.get('primaryEmail').hasError('pattern')\">\n {{ 'profileInfo.invalidEmail' | translate }}\n </mat-error>\n <div class=\"flex justify-end\" *ngIf=\"verifyEmail && !otpSent && !eVerified\">\n <span class=\"get-otp\" (click)=\"handleGenerateEmailOTP('email')\">{{ 'profileInfo.getOTP' | translate\n }}</span>\n </div>\n <div *ngIf=\"emailOtpSent\">\n <form [formGroup]=\"emailOtpForm\">\n <div class=\"w-full\">\n <div class=\"flex enter-otp\">\n <div class=\"font-semibold required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.enterOTP' | translate }}\n </div>\n <div class=\"mb-3\">Time Remaining: <span #emailTimerDiv></span></div>\n </div>\n <mat-form-field appearance=\"outline\" class=\"profile-form-field mobile-num\">\n <input type=\"text\" matInput formControlName=\"eOtp\" class=\"input-text custom-size\" placeholder=\"{{ 'profileInfo.enterTheOTP' | translate }}\" maxlength=\"6\" />\n </mat-form-field>\n </div>\n <div class=\"w-full\">\n <div class=\"flex justify-center\" *ngIf=\"showEmailResendOTP\">\n <div class=\"flex flex-row\">\n <div class=\"timer\">{{ 'profileInfo.didNotReceiveOTP' | translate }}</div>\n <div class=\"resend-otp\" (click)=\"handleResendEmailOTP()\">&nbsp;&nbsp;{{ 'profileInfo.resentOTP' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"w-full mb-4\">\n <div class=\"flex flex-row justify-between\">\n <button class=\"save-button\" (click)=\"verifyEmailOTP()\">{{ 'profileInfo.submit' | translate }}</button>\n </div>\n </div>\n </form>\n </div>\n </div>\n <div class=\"w-full\" *ngIf=\"canShowGroup\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.group' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-select formControlName=\"group\" placeholder=\"{{ 'profileInfo.chooseAGroup' | translate }}\">\n <mat-option *ngFor=\"let group of groupData\" value=\"{{group}}\">{{ group }}</mat-option>\n </mat-select>\n </mat-form-field>\n <div class=\"text-xs mb-2\" *ngIf=\"showDoptChanges\">\n {{'profileInfo.groupNote' | translate}}\n </div>\n </div>\n <div class=\"w-full relative\" *ngIf=\"canShowDesignation\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.designation' | translate }}\n </div>\n <!-- <mat-form-field appearance=\"outline\" class=\"w-full\">\n <div class=\"flex flex-row auto-complete-row relative\">\n <input type=\"text\" class=\"input-text high-zindex\" matInput formControlName=\"designation\"\n (input)=\"filterdesignation($event.target.value)\" (focus)=\"onDesignationsFocus()\" #textBox\n placeholder=\"{{ 'profileInfo.chooseADesignation' | translate }}\">\n <mat-icon class=\"disagnation-caret\">arrow_drop_down</mat-icon>\n </div>\n </mat-form-field> -->\n <div class=\"custom-select-container\">\n <mat-form-field appearance=\"outline\" class=\"fixed-height-select\">\n <mat-select placeholder=\"{{ 'profileInfo.chooseADesignation' | translate }}\" formControlName=\"designation\" (closed)=\"onDesignationDropdownClosed()\" (openedChange)=\"setupScrollListener($event)\" panelClass=\"search-panel\">\n <!-- Sticky search input container -->\n <div class=\"sticky-search-container\" (click)=\"$event.stopPropagation()\">\n <div class=\"search-input-wrapper\">\n <input \n type=\"text\" \n placeholder=\"Search designation\" \n formControlName=\"searchDesignation\" \n class=\"search-input\"\n (keydown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n autocomplete=\"off\">\n <button \n *ngIf=\"searchDesignation?.value\" \n type=\"button\" \n class=\"clear-button\" \n (click)=\"searchDesignation?.setValue('')\">\n \u2715\n </button>\n </div>\n </div>\n <!-- Options list -->\n <mat-option *ngFor=\"let option of designationsMeta \" [value]=\"option?.name\" (click)=\"selectDesignation(option?.name)\">\n {{ option?.name }}\n </mat-option>\n <!-- Loading indicator -->\n <div *ngIf=\"isLoadingMoreDesignations\" class=\"loading-indicator\">\n Loading more...\n </div>\n <!-- No results message -->\n <mat-option *ngIf=\"(designationsMeta )?.length === 0\" disabled>\n No matches found\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <mat-error *ngIf=\"userDetailsForm?.controls['designation']?.invalid && userDetailsForm?.controls['designation']?.touched\"\n class=\"mat-error\">\n Please select a valid designation.\n </mat-error>\n <div class=\"text-xs mb-2\" *ngIf=\"showDoptChanges\">\n {{'profileInfo.designationNote' | translate}}\n </div>\n <!-- <div class=\"auto-list flex flex-col ignore-blur\" #dropdown\n *ngIf=\"openDesignationDropdown && filterDesignationsMeta.length\">\n <div (mousedown)=\"preventBlur($event)\"\n class=\"item {{userDetailsForm.controls['designation']?.value?.toLowerCase() === designation?.name?.toLowerCase() ? 'item-active' : ''}}\"\n *ngFor=\"let designation of filterDesignationsMeta\" (click)=\"selectDesignation(designation.name)\">\n {{ designation?.name }}\n </div>\n </div> -->\n </div>\n <div class=\"w-full relative\" *ngIf=\"canShowDesignation && canShowOtherDesignation\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.otherDesignation' | translate }}\n </div>\n <div *ngIf=\"canShowOtherDesignation\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <input type=\"text\" class=\"input-text\" matInput formControlName=\"otherDesignation\" placeholder=\"{{ 'profileInfo.enterDesignation' | translate }}\"/>\n </mat-form-field>\n </div>\n </div>\n <div class=\"w-full\" *ngIf=\"canShowEmployeeCode\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.employeeId' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <input type=\"text\" class=\"input-text\" matInput formControlName=\"employeeCode\" placeholder=\"Enter employee code\"/>\n </mat-form-field> \n <mat-error class=\"mat-error\" *ngIf=\"userDetailsForm?.get('employeeCode')?.hasError('pattern')\">\n Please enter an Alpha-numeric value only\n </mat-error> \n </div>\n <div class=\"w-full\" *ngIf=\"canshowMobile\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.mobileNumber' | translate }}\n </div>\n <div class=\"flex flex-row gap-4\">\n <div class=\"country-code flex justify-center items-center\" appearance=\"outline\">\n +91\n </div>\n <div class=\"flex-1\">\n <div class=\"flex flex-col\">\n <mat-form-field appearance=\"outline\" class=\"mobile-num\">\n <input type=\"text\" class=\"input-text mobile-text relative\" maxlength=\"10\" (keyup)=\"handleEmpty('mobile')\"\n matInput formControlName=\"mobile\" placeholder=\"Enter mobile number\"/>\n <mat-icon class=\"verified-check\" *ngIf=\"mVerified\">check_circle</mat-icon>\n </mat-form-field>\n <mat-error class=\"mat-error\"\n *ngIf=\"userDetailsForm.get('mobile').hasError('required') || userDetailsForm.get('mobile').hasError('pattern')\">\n {{ 'profileInfo.pleaseEnterValidMobileNumber' | translate }}\n </mat-error>\n </div>\n <div class=\"flex justify-end\" *ngIf=\"verifyMobile && !otpSent && !mVerified\">\n <span class=\"get-otp sm:mr-4\" (click)=\"handleGenerateOTP('phone')\">{{ 'profileInfo.getOTP' |\n translate }}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"otpSent\"> \n <form [formGroup]=\"otpForm\">\n <div class=\"w-full\">\n <div class=\"flex enter-otp\">\n <div class=\"font-semibold required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.enterOTP' | translate }}\n </div>\n <div class=\"mb-3\">Time Remaining: <span #timerDiv></span></div>\n </div>\n <mat-form-field appearance=\"outline\" class=\"profile-form-field mobile-num\">\n <input type=\"text\" matInput formControlName=\"otp\" class=\"input-text custom-size\" placeholder=\"{{ 'profileInfo.enterTheOTP' | translate }}\" maxlength=\"6\" />\n </mat-form-field>\n </div>\n <div class=\"w-full\">\n <div class=\"flex justify-center\" *ngIf=\"showResendOTP\"> \n <div class=\"flex flex-row\">\n <div class=\"timer\">{{ 'profileInfo.didNotReceiveOTP' | translate }}</div>\n <div class=\"resend-otp\" (click)=\"handleResendOTP()\">&nbsp;&nbsp;{{ 'profileInfo.resentOTP' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"w-full mb-4\">\n <div class=\"flex flex-row justify-between\">\n <button class=\"save-button\" (click)=\"verifyMobileOTP()\">{{ 'profileInfo.submit' | translate }}</button>\n </div>\n </div>\n </form>\n </div>\n </div>\n <div class=\"w-full\" *ngIf=\"canShowGender\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.gender' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-select formControlName=\"gender\" placeholder=\"Select gender\">\n <mat-option *ngFor=\"let _gender of eUserGender\" value=\"{{ _gender }}\">{{\n handleTranslateTo(_gender.toLowerCase()) }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"w-full\" *ngIf=\"canShowDob\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.dob' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <input matInput class=\"input-text icon-include-input\" [max]=\"currentDate\" [matDatepicker]=\"picker\" [(ngModel)]=\"selectedDate\"\n formControlName=\"dob\" placeholder=\"Select date of birth\" />\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n </mat-form-field>\n </div>\n <div class=\"w-full relative\" *ngIf=\"canShowDomicileMedium\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.motherTongue' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <div class=\"flex flex-row auto-complete-row relative\">\n <input type=\"text\" class=\"input-text high-zindex\" aria-label=\"Domicile Medium (Mother Tongue)\" matInput\n formControlName=\"domicileMedium\" placeholder=\"Select mother tongue\"\n (input)=\"filterLanguage($event.target.value)\" (focus)=\"onLanguageFocus()\" #languageTextBox/>\n <mat-icon class=\"mother-toungue-caret\">arrow_drop_down</mat-icon>\n </div>\n </mat-form-field>\n <mat-error *ngIf=\"userDetailsForm.controls['domicileMedium'].invalid && userDetailsForm.controls['domicileMedium'].touched\"\n class=\"mat-error\">\n Please select a valid mother tongue.\n </mat-error>\n <div class=\"auto-language-list flex flex-col ignore-blur\" #languageDropdown\n *ngIf=\"openLanguageDropdown && masterLanguages?.length\">\n <div (mousedown)=\"preventLanguageBlur($event)\"\n class=\"language-item {{userDetailsForm.controls['domicileMedium']?.value?.toLowerCase() === language?.name?.toLowerCase() ? 'language-item-active' : ''}}\"\n *ngFor=\"let language of masterLanguages\" (click)=\"selectLanguage(language.name)\">\n {{ language?.name }}\n </div>\n </div>\n </div>\n <div class=\"w-full\" *ngIf=\"canShowCategory\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.category' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-select formControlName=\"category\" placeholder=\"Select category\">\n <mat-option *ngFor=\"let category of eCategory\" value=\"{{ category }}\">{{\n handleTranslateTo(category?.toLowerCase()) }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"w-full\" *ngIf=\"canShowpinCode\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'userProfile.officePinCode' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <input type=\"email\" class=\"input-text\" matInput maxlength=\"6\" formControlName=\"pinCode\" placeholder=\"Enter pincode\"/>\n </mat-form-field>\n <mat-error class=\"mat-error\" *ngIf=\"userDetailsForm?.get('pinCode')?.hasError('pattern')\">\n {{ 'profileInfo.invalidPinCode' | translate }}\n </mat-error> \n </div>\n <div class=\"w-full\" *ngIf=\"canShowshowCadreDetails && !showDoptChanges\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.fromGovOrganization' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"profile-form-field\">\n <mat-select formControlName=\"isCadre\" (selectionChange)=\"getIsCadreStatus($event.value)\" placeholder=\"Select cadre\">\n <mat-option [value]=\"true\">Yes</mat-option>\n <mat-option [value]=\"false\">No</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"w-full\" *ngIf=\"canShowshowCadreDetails && isCadreStatus && !showDoptChanges\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.typeOfCivilService' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"profile-form-field\">\n <mat-select formControlName=\"typeOfCivilService\" (selectionChange)=\"getService($event.value)\" placeholder=\"Select type of civil service\">\n <mat-option *ngFor=\"let service of civilServiceTypes\" [value]=\"service\">{{ service }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"w-full\" *ngIf=\"canShowshowCadreDetails && userDetailsForm.get('typeOfCivilService').value && userDetailsForm.get('isCadre').value && !showDoptChanges\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.serviceType' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"profile-form-field\">\n <mat-select formControlName=\"serviceType\" (selectionChange)=\"onServiceSelect($event)\" placeholder=\"Select service\">\n <mat-option *ngFor=\"let service of serviceName\" [value]=\"service\">{{ service }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"w-full\" *ngIf=\"canShowshowCadreDetails && userDetailsForm.get('serviceType').value && \n userDetailsForm.get('isCadre').value \n && userDetailsForm.get('typeOfCivilService').value && (\n userDetailsForm.get('serviceType').value === 'Indian Administrative Service (IAS)' || \n userDetailsForm.get('serviceType').value === 'Indian Police Service (IPS)' || \n userDetailsForm.get('serviceType').value === 'Indian Forest Service (IFoS)' \n ) && !showDoptChanges\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.cadre' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"profile-form-field\">\n <mat-select formControlName=\"cadreName\" (selectionChange)=\"onCadreSelect($event.value)\" placeholder=\"Select cadre\">\n <mat-option *ngFor=\"let state of cadre\" [value]=\"state\">{{ state }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <ng-container *ngIf=\"!showDoptChanges\">\n <div class=\"w-full\" *ngIf=\"canShowshowCadreDetails && userDetailsForm.get('serviceType') && (userDetailsForm.get('serviceType').value && \n userDetailsForm.get('isCadre').value && userDetailsForm.get('typeOfCivilService').value && (\n userDetailsForm.get('serviceType').value === 'Indian Administrative Service (IAS)' || \n userDetailsForm.get('serviceType').value === 'Indian Police Service (IPS)' || \n userDetailsForm.get('serviceType').value === 'Indian Forest Service (IFoS)' \n ) && userDetailsForm.get('cadreName').value) ? true : ((userDetailsForm.get('serviceType').value && \n userDetailsForm.get('isCadre').value \n && userDetailsForm.get('typeOfCivilService').value && (\n userDetailsForm.get('serviceType').value !== 'Indian Administrative Service (IAS)' && \n userDetailsForm.get('serviceType').value !== 'Indian Police Service (IPS)' && \n userDetailsForm.get('serviceType').value !== 'Indian Forest Service (IFoS)' \n ))) ? true : false\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.batch' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"profile-form-field\">\n <mat-select formControlName=\"cadreBatch\" placeholder=\"Select batch\">\n <mat-option *ngFor=\"let year of yearArray\" [value]=\"year\">{{ year }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n <div class=\"w-full\" *ngIf=\"canShowshowCadreDetails && userDetailsForm.get('isCadre').value && userDetailsForm.get('cadreBatch').value && !showDoptChanges\">\n <div class=\"font-semibold margin-0 required mb-3\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.cadreControllingAuthority' | translate }}\n </div>\n <span class=\"cadreControl-name\">{{cadreControllingAuthority}}</span>\n </div>\n <ng-container>\n <div class=\"w-full flex flex-row gap-4 justify-end margin-top-m\">\n <button\n class=\"save-button\"\n [disabled]=\"userDetailsForm?.invalid || !mVerified || !eVerified\"\n (click)=\"onSubmitForm(userDetailsForm)\">\n {{ 'profileInfo.saveChanges' | translate }}\n </button>\n </div>\n </ng-container>\n </form>\n </div>\n <ng-container *ngIf=\"addLoader > 0\" >\n <div class=\"text-center my-2 loader flex justify-center items-center\">\n <mat-spinner class=\"inline-block\"></mat-spinner>\n </div>\n </ng-container>\n</div>\n", styles: ["::ng-deep .course-survey .main-container{width:auto!important;overflow-y:auto!important;max-height:auto!important}.high-zindex{z-index:9999}.auto-list{display:flex;border:1px solid #e3dede;padding:15px 0;border-radius:7px;max-height:200px;overflow:auto;position:absolute;background:#fff;z-index:99;width:100%}.auto-list .item{padding:5px 15px}.auto-list .item:hover{background-color:#f3f3f3;cursor:pointer}.auto-list .item-active{background-color:#1b4ca1!important;color:#fff!important}.auto-language-list{display:flex;border:1px solid #e3dede;padding:15px 0;border-radius:7px;max-height:200px;overflow:auto;position:absolute;background:#fff;z-index:99;width:100%}.auto-language-list .language-item{padding:5px 15px}.auto-language-list .language-item:hover{background-color:#f3f3f3;cursor:pointer}.auto-language-list .language-item-active{background-color:#1b4ca1!important;color:#fff!important}::ng-deep .mat-calendar-body-active{background:#1b4ca1!important;border-radius:100%!important}::ng-deep .course-survey .lib-container{height:100%!important}@media screen and (max-width: 430px){::ng-deep .course-survey .lib-container{padding-left:0!important;padding-right:0!important;padding-bottom:1rem!important}}.disagnation-caret,.mother-toungue-caret{position:absolute;right:0;bottom:0}::ng-deep .userDetailsForm .mat-form-field-appearance-outline .mat-form-field-infix{padding:.5rem 0 .8rem}input[disabled]+mat-icon.disagnation-caret{opacity:.5}input[disabled]+mat-icon.mother-toungue-caret{opacity:.5}::ng-deep .course-survey .lib-container-2{height:auto;min-height:unset!important;padding:0!important;box-shadow:none!important;margin-bottom:2rem!important}@media screen and (max-width: 430px){::ng-deep .course-survey .lib-container-2{padding-left:0!important;padding-right:0!important}}.profile-form-field .mat-select{border:none}.customForm{padding-right:0!important;padding-bottom:1rem!important;padding:1rem 3rem}.cadreControl-name{background:#c3c3c3;padding:10px}.country-code{margin-top:5px;text-align:center;width:50px;height:46px;border:1px solid #d6d5d5;border-radius:5px}.get-otp{color:#1b4ca1;font-weight:700;cursor:pointer;font-size:14px}.enter-otp{align-items:center;justify-content:space-between}.custom-size{width:96%}.resend-otp{color:#1b4ca1;font-weight:700;cursor:pointer}.verified-check{position:absolute;right:3px;color:#5fa800;font-size:18px;width:18px;height:18px}.save-button:disabled{opacity:.6!important}.loader{position:absolute;top:0;left:0;z-index:1000;height:100vh;width:100vw;background-color:#80808045}.mat-error{margin:-10px 0 5px}:host ::ng-deep .userDetailsForm .mat-form-field-wrapper{padding-bottom:8px!important}.custom-select-container,.fixed-height-select{width:100%}.fixed-height-select ::ng-deep .mat-form-field-flex{height:48px!important;min-height:45px!important;align-items:center}.fixed-height-select ::ng-deep .mat-form-field-infix{padding:0!important;border-top:0!important;height:45px!important;display:flex;align-items:center}.fixed-height-select ::ng-deep .mat-form-field-wrapper{padding-bottom:0!important}.fixed-height-select ::ng-deep .mat-select-arrow-wrapper{transform:translateY(0)!important}.fixed-height-select ::ng-deep .mat-form-field-label-wrapper{top:-1.1em}::ng-deep .search-panel{max-height:350px}::ng-deep .search-panel .sticky-search-container{position:sticky;top:0;z-index:2;background:#fff;padding:8px;border-bottom:1px solid rgba(0,0,0,.12);box-shadow:0 2px 4px #00000014}::ng-deep .search-panel .search-input-wrapper{position:relative;width:100%}::ng-deep .search-panel .search-input{width:100%;height:35px;padding:0 30px 0 12px;border:1px solid rgba(0,0,0,.12);border-radius:4px;font-size:14px;box-sizing:border-box}::ng-deep .search-panel .search-input:focus{outline:none;border-color:#f3962f;box-shadow:0 0 0 1px #f3962f33}::ng-deep .search-panel .clear-button{position:absolute;right:8px;top:50%;transform:translateY(-50%);background:none;border:none;cursor:pointer;color:#00000080;font-size:14px;padding:4px;display:flex;align-items:center;justify-content:center}::ng-deep .search-panel .clear-button:hover{color:#000c}::ng-deep .search-panel .mat-option.mat-option-disabled{color:#00000061;font-style:italic}::ng-deep .mat-mdc-form-field.fixed-height-select .mat-mdc-text-field-wrapper{height:45px!important}::ng-deep .mat-mdc-form-field.fixed-height-select .mat-mdc-form-field-flex{min-height:45px!important;height:45px!important}::ng-deep .mat-mdc-form-field.fixed-height-select .mat-mdc-form-field-infix{min-height:45px!important;height:45px!important;padding-top:0!important;padding-bottom:0!important}\n"], dependencies: [{ kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i10.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i10.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i10.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i12.MatLegacyError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i12.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i12.MatLegacySuffix, selector: "[matSuffix]" }, { kind: "directive", type: i13.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "component", type: i14.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i2.MatLegacyDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "component", type: i15.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i16.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i17.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i17.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i17.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] }); }
1809
+ }
1810
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EnrollProfileFormComponent, decorators: [{
1811
+ type: Component,
1812
+ args: [{ selector: 'ws-app-enroll-profile-form', template: "<div #fullScreenContainer>\n <div class=\"dialog-header text-right mb-2\">\n <mat-icon class=\"mat-icon notranslate material-icons close-icon cursor-pointer\" matprefix=\"\" role=\"img\" aria-hidden=\"true\" [mat-dialog-close]=\"false\">close</mat-icon>\n </div>\n <h1> {{data?.courseName}} </h1>\n <div class=\"w-full\" *ngIf=\"!isLoading\">\n <form [formGroup]=\"userDetailsForm\" class=\"userDetailsForm\">\n <div class=\"w-full\" *ngIf=\"canShowName\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.name' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <input type=\"text\" class=\"input-text\" matInput formControlName=\"name\" placeholder=\"Name\"/>\n </mat-form-field>\n </div>\n <div class=\"w-full\" *ngIf=\"canShowOrg\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ (showDoptChanges ? 'profileInfo.presentOrganisation' : 'profileInfo.organisation') | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <input type=\"text\" class=\"input-text\" matInput formControlName=\"organisation\" placeholder=\"Organisation\"/>\n </mat-form-field>\n </div>\n <div class=\"w-full\" *ngIf=\"canShowEmail\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.email' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <input type=\"text\" class=\"input-text\" matInput formControlName=\"primaryEmail\" placeholder=\"Enter email\" (keyup)=\"handleEmpty('primaryEmail')\"/>\n </mat-form-field>\n <mat-error class=\"mat-error\" *ngIf=\"userDetailsForm.get('primaryEmail').hasError('required') || userDetailsForm.get('primaryEmail').hasError('pattern')\">\n {{ 'profileInfo.invalidEmail' | translate }}\n </mat-error>\n <div class=\"flex justify-end\" *ngIf=\"verifyEmail && !otpSent && !eVerified\">\n <span class=\"get-otp\" (click)=\"handleGenerateEmailOTP('email')\">{{ 'profileInfo.getOTP' | translate\n }}</span>\n </div>\n <div *ngIf=\"emailOtpSent\">\n <form [formGroup]=\"emailOtpForm\">\n <div class=\"w-full\">\n <div class=\"flex enter-otp\">\n <div class=\"font-semibold required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.enterOTP' | translate }}\n </div>\n <div class=\"mb-3\">Time Remaining: <span #emailTimerDiv></span></div>\n </div>\n <mat-form-field appearance=\"outline\" class=\"profile-form-field mobile-num\">\n <input type=\"text\" matInput formControlName=\"eOtp\" class=\"input-text custom-size\" placeholder=\"{{ 'profileInfo.enterTheOTP' | translate }}\" maxlength=\"6\" />\n </mat-form-field>\n </div>\n <div class=\"w-full\">\n <div class=\"flex justify-center\" *ngIf=\"showEmailResendOTP\">\n <div class=\"flex flex-row\">\n <div class=\"timer\">{{ 'profileInfo.didNotReceiveOTP' | translate }}</div>\n <div class=\"resend-otp\" (click)=\"handleResendEmailOTP()\">&nbsp;&nbsp;{{ 'profileInfo.resentOTP' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"w-full mb-4\">\n <div class=\"flex flex-row justify-between\">\n <button class=\"save-button\" (click)=\"verifyEmailOTP()\">{{ 'profileInfo.submit' | translate }}</button>\n </div>\n </div>\n </form>\n </div>\n </div>\n <div class=\"w-full\" *ngIf=\"canShowGroup\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.group' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-select formControlName=\"group\" placeholder=\"{{ 'profileInfo.chooseAGroup' | translate }}\">\n <mat-option *ngFor=\"let group of groupData\" value=\"{{group}}\">{{ group }}</mat-option>\n </mat-select>\n </mat-form-field>\n <div class=\"text-xs mb-2\" *ngIf=\"showDoptChanges\">\n {{'profileInfo.groupNote' | translate}}\n </div>\n </div>\n <div class=\"w-full relative\" *ngIf=\"canShowDesignation\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.designation' | translate }}\n </div>\n <!-- <mat-form-field appearance=\"outline\" class=\"w-full\">\n <div class=\"flex flex-row auto-complete-row relative\">\n <input type=\"text\" class=\"input-text high-zindex\" matInput formControlName=\"designation\"\n (input)=\"filterdesignation($event.target.value)\" (focus)=\"onDesignationsFocus()\" #textBox\n placeholder=\"{{ 'profileInfo.chooseADesignation' | translate }}\">\n <mat-icon class=\"disagnation-caret\">arrow_drop_down</mat-icon>\n </div>\n </mat-form-field> -->\n <div class=\"custom-select-container\">\n <mat-form-field appearance=\"outline\" class=\"fixed-height-select\">\n <mat-select placeholder=\"{{ 'profileInfo.chooseADesignation' | translate }}\" formControlName=\"designation\" (closed)=\"onDesignationDropdownClosed()\" (openedChange)=\"setupScrollListener($event)\" panelClass=\"search-panel\">\n <!-- Sticky search input container -->\n <div class=\"sticky-search-container\" (click)=\"$event.stopPropagation()\">\n <div class=\"search-input-wrapper\">\n <input \n type=\"text\" \n placeholder=\"Search designation\" \n formControlName=\"searchDesignation\" \n class=\"search-input\"\n (keydown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n autocomplete=\"off\">\n <button \n *ngIf=\"searchDesignation?.value\" \n type=\"button\" \n class=\"clear-button\" \n (click)=\"searchDesignation?.setValue('')\">\n \u2715\n </button>\n </div>\n </div>\n <!-- Options list -->\n <mat-option *ngFor=\"let option of designationsMeta \" [value]=\"option?.name\" (click)=\"selectDesignation(option?.name)\">\n {{ option?.name }}\n </mat-option>\n <!-- Loading indicator -->\n <div *ngIf=\"isLoadingMoreDesignations\" class=\"loading-indicator\">\n Loading more...\n </div>\n <!-- No results message -->\n <mat-option *ngIf=\"(designationsMeta )?.length === 0\" disabled>\n No matches found\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <mat-error *ngIf=\"userDetailsForm?.controls['designation']?.invalid && userDetailsForm?.controls['designation']?.touched\"\n class=\"mat-error\">\n Please select a valid designation.\n </mat-error>\n <div class=\"text-xs mb-2\" *ngIf=\"showDoptChanges\">\n {{'profileInfo.designationNote' | translate}}\n </div>\n <!-- <div class=\"auto-list flex flex-col ignore-blur\" #dropdown\n *ngIf=\"openDesignationDropdown && filterDesignationsMeta.length\">\n <div (mousedown)=\"preventBlur($event)\"\n class=\"item {{userDetailsForm.controls['designation']?.value?.toLowerCase() === designation?.name?.toLowerCase() ? 'item-active' : ''}}\"\n *ngFor=\"let designation of filterDesignationsMeta\" (click)=\"selectDesignation(designation.name)\">\n {{ designation?.name }}\n </div>\n </div> -->\n </div>\n <div class=\"w-full relative\" *ngIf=\"canShowDesignation && canShowOtherDesignation\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.otherDesignation' | translate }}\n </div>\n <div *ngIf=\"canShowOtherDesignation\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <input type=\"text\" class=\"input-text\" matInput formControlName=\"otherDesignation\" placeholder=\"{{ 'profileInfo.enterDesignation' | translate }}\"/>\n </mat-form-field>\n </div>\n </div>\n <div class=\"w-full\" *ngIf=\"canShowEmployeeCode\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.employeeId' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <input type=\"text\" class=\"input-text\" matInput formControlName=\"employeeCode\" placeholder=\"Enter employee code\"/>\n </mat-form-field> \n <mat-error class=\"mat-error\" *ngIf=\"userDetailsForm?.get('employeeCode')?.hasError('pattern')\">\n Please enter an Alpha-numeric value only\n </mat-error> \n </div>\n <div class=\"w-full\" *ngIf=\"canshowMobile\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.mobileNumber' | translate }}\n </div>\n <div class=\"flex flex-row gap-4\">\n <div class=\"country-code flex justify-center items-center\" appearance=\"outline\">\n +91\n </div>\n <div class=\"flex-1\">\n <div class=\"flex flex-col\">\n <mat-form-field appearance=\"outline\" class=\"mobile-num\">\n <input type=\"text\" class=\"input-text mobile-text relative\" maxlength=\"10\" (keyup)=\"handleEmpty('mobile')\"\n matInput formControlName=\"mobile\" placeholder=\"Enter mobile number\"/>\n <mat-icon class=\"verified-check\" *ngIf=\"mVerified\">check_circle</mat-icon>\n </mat-form-field>\n <mat-error class=\"mat-error\"\n *ngIf=\"userDetailsForm.get('mobile').hasError('required') || userDetailsForm.get('mobile').hasError('pattern')\">\n {{ 'profileInfo.pleaseEnterValidMobileNumber' | translate }}\n </mat-error>\n </div>\n <div class=\"flex justify-end\" *ngIf=\"verifyMobile && !otpSent && !mVerified\">\n <span class=\"get-otp sm:mr-4\" (click)=\"handleGenerateOTP('phone')\">{{ 'profileInfo.getOTP' |\n translate }}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"otpSent\"> \n <form [formGroup]=\"otpForm\">\n <div class=\"w-full\">\n <div class=\"flex enter-otp\">\n <div class=\"font-semibold required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.enterOTP' | translate }}\n </div>\n <div class=\"mb-3\">Time Remaining: <span #timerDiv></span></div>\n </div>\n <mat-form-field appearance=\"outline\" class=\"profile-form-field mobile-num\">\n <input type=\"text\" matInput formControlName=\"otp\" class=\"input-text custom-size\" placeholder=\"{{ 'profileInfo.enterTheOTP' | translate }}\" maxlength=\"6\" />\n </mat-form-field>\n </div>\n <div class=\"w-full\">\n <div class=\"flex justify-center\" *ngIf=\"showResendOTP\"> \n <div class=\"flex flex-row\">\n <div class=\"timer\">{{ 'profileInfo.didNotReceiveOTP' | translate }}</div>\n <div class=\"resend-otp\" (click)=\"handleResendOTP()\">&nbsp;&nbsp;{{ 'profileInfo.resentOTP' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"w-full mb-4\">\n <div class=\"flex flex-row justify-between\">\n <button class=\"save-button\" (click)=\"verifyMobileOTP()\">{{ 'profileInfo.submit' | translate }}</button>\n </div>\n </div>\n </form>\n </div>\n </div>\n <div class=\"w-full\" *ngIf=\"canShowGender\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.gender' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-select formControlName=\"gender\" placeholder=\"Select gender\">\n <mat-option *ngFor=\"let _gender of eUserGender\" value=\"{{ _gender }}\">{{\n handleTranslateTo(_gender.toLowerCase()) }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"w-full\" *ngIf=\"canShowDob\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.dob' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <input matInput class=\"input-text icon-include-input\" [max]=\"currentDate\" [matDatepicker]=\"picker\" [(ngModel)]=\"selectedDate\"\n formControlName=\"dob\" placeholder=\"Select date of birth\" />\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n </mat-form-field>\n </div>\n <div class=\"w-full relative\" *ngIf=\"canShowDomicileMedium\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.motherTongue' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <div class=\"flex flex-row auto-complete-row relative\">\n <input type=\"text\" class=\"input-text high-zindex\" aria-label=\"Domicile Medium (Mother Tongue)\" matInput\n formControlName=\"domicileMedium\" placeholder=\"Select mother tongue\"\n (input)=\"filterLanguage($event.target.value)\" (focus)=\"onLanguageFocus()\" #languageTextBox/>\n <mat-icon class=\"mother-toungue-caret\">arrow_drop_down</mat-icon>\n </div>\n </mat-form-field>\n <mat-error *ngIf=\"userDetailsForm.controls['domicileMedium'].invalid && userDetailsForm.controls['domicileMedium'].touched\"\n class=\"mat-error\">\n Please select a valid mother tongue.\n </mat-error>\n <div class=\"auto-language-list flex flex-col ignore-blur\" #languageDropdown\n *ngIf=\"openLanguageDropdown && masterLanguages?.length\">\n <div (mousedown)=\"preventLanguageBlur($event)\"\n class=\"language-item {{userDetailsForm.controls['domicileMedium']?.value?.toLowerCase() === language?.name?.toLowerCase() ? 'language-item-active' : ''}}\"\n *ngFor=\"let language of masterLanguages\" (click)=\"selectLanguage(language.name)\">\n {{ language?.name }}\n </div>\n </div>\n </div>\n <div class=\"w-full\" *ngIf=\"canShowCategory\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.category' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-select formControlName=\"category\" placeholder=\"Select category\">\n <mat-option *ngFor=\"let category of eCategory\" value=\"{{ category }}\">{{\n handleTranslateTo(category?.toLowerCase()) }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"w-full\" *ngIf=\"canShowpinCode\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'userProfile.officePinCode' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <input type=\"email\" class=\"input-text\" matInput maxlength=\"6\" formControlName=\"pinCode\" placeholder=\"Enter pincode\"/>\n </mat-form-field>\n <mat-error class=\"mat-error\" *ngIf=\"userDetailsForm?.get('pinCode')?.hasError('pattern')\">\n {{ 'profileInfo.invalidPinCode' | translate }}\n </mat-error> \n </div>\n <div class=\"w-full\" *ngIf=\"canShowshowCadreDetails && !showDoptChanges\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.fromGovOrganization' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"profile-form-field\">\n <mat-select formControlName=\"isCadre\" (selectionChange)=\"getIsCadreStatus($event.value)\" placeholder=\"Select cadre\">\n <mat-option [value]=\"true\">Yes</mat-option>\n <mat-option [value]=\"false\">No</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"w-full\" *ngIf=\"canShowshowCadreDetails && isCadreStatus && !showDoptChanges\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.typeOfCivilService' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"profile-form-field\">\n <mat-select formControlName=\"typeOfCivilService\" (selectionChange)=\"getService($event.value)\" placeholder=\"Select type of civil service\">\n <mat-option *ngFor=\"let service of civilServiceTypes\" [value]=\"service\">{{ service }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"w-full\" *ngIf=\"canShowshowCadreDetails && userDetailsForm.get('typeOfCivilService').value && userDetailsForm.get('isCadre').value && !showDoptChanges\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.serviceType' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"profile-form-field\">\n <mat-select formControlName=\"serviceType\" (selectionChange)=\"onServiceSelect($event)\" placeholder=\"Select service\">\n <mat-option *ngFor=\"let service of serviceName\" [value]=\"service\">{{ service }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"w-full\" *ngIf=\"canShowshowCadreDetails && userDetailsForm.get('serviceType').value && \n userDetailsForm.get('isCadre').value \n && userDetailsForm.get('typeOfCivilService').value && (\n userDetailsForm.get('serviceType').value === 'Indian Administrative Service (IAS)' || \n userDetailsForm.get('serviceType').value === 'Indian Police Service (IPS)' || \n userDetailsForm.get('serviceType').value === 'Indian Forest Service (IFoS)' \n ) && !showDoptChanges\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.cadre' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"profile-form-field\">\n <mat-select formControlName=\"cadreName\" (selectionChange)=\"onCadreSelect($event.value)\" placeholder=\"Select cadre\">\n <mat-option *ngFor=\"let state of cadre\" [value]=\"state\">{{ state }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <ng-container *ngIf=\"!showDoptChanges\">\n <div class=\"w-full\" *ngIf=\"canShowshowCadreDetails && userDetailsForm.get('serviceType') && (userDetailsForm.get('serviceType').value && \n userDetailsForm.get('isCadre').value && userDetailsForm.get('typeOfCivilService').value && (\n userDetailsForm.get('serviceType').value === 'Indian Administrative Service (IAS)' || \n userDetailsForm.get('serviceType').value === 'Indian Police Service (IPS)' || \n userDetailsForm.get('serviceType').value === 'Indian Forest Service (IFoS)' \n ) && userDetailsForm.get('cadreName').value) ? true : ((userDetailsForm.get('serviceType').value && \n userDetailsForm.get('isCadre').value \n && userDetailsForm.get('typeOfCivilService').value && (\n userDetailsForm.get('serviceType').value !== 'Indian Administrative Service (IAS)' && \n userDetailsForm.get('serviceType').value !== 'Indian Police Service (IPS)' && \n userDetailsForm.get('serviceType').value !== 'Indian Forest Service (IFoS)' \n ))) ? true : false\">\n <div class=\"font-semibold margin-0 required\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.batch' | translate }}\n </div>\n <mat-form-field appearance=\"outline\" class=\"profile-form-field\">\n <mat-select formControlName=\"cadreBatch\" placeholder=\"Select batch\">\n <mat-option *ngFor=\"let year of yearArray\" [value]=\"year\">{{ year }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n <div class=\"w-full\" *ngIf=\"canShowshowCadreDetails && userDetailsForm.get('isCadre').value && userDetailsForm.get('cadreBatch').value && !showDoptChanges\">\n <div class=\"font-semibold margin-0 required mb-3\"\n i18n=\"Title label|Label which explains the user to enter title\">\n {{ 'profileInfo.cadreControllingAuthority' | translate }}\n </div>\n <span class=\"cadreControl-name\">{{cadreControllingAuthority}}</span>\n </div>\n <ng-container>\n <div class=\"w-full flex flex-row gap-4 justify-end margin-top-m\">\n <button\n class=\"save-button\"\n [disabled]=\"userDetailsForm?.invalid || !mVerified || !eVerified\"\n (click)=\"onSubmitForm(userDetailsForm)\">\n {{ 'profileInfo.saveChanges' | translate }}\n </button>\n </div>\n </ng-container>\n </form>\n </div>\n <ng-container *ngIf=\"addLoader > 0\" >\n <div class=\"text-center my-2 loader flex justify-center items-center\">\n <mat-spinner class=\"inline-block\"></mat-spinner>\n </div>\n </ng-container>\n</div>\n", styles: ["::ng-deep .course-survey .main-container{width:auto!important;overflow-y:auto!important;max-height:auto!important}.high-zindex{z-index:9999}.auto-list{display:flex;border:1px solid #e3dede;padding:15px 0;border-radius:7px;max-height:200px;overflow:auto;position:absolute;background:#fff;z-index:99;width:100%}.auto-list .item{padding:5px 15px}.auto-list .item:hover{background-color:#f3f3f3;cursor:pointer}.auto-list .item-active{background-color:#1b4ca1!important;color:#fff!important}.auto-language-list{display:flex;border:1px solid #e3dede;padding:15px 0;border-radius:7px;max-height:200px;overflow:auto;position:absolute;background:#fff;z-index:99;width:100%}.auto-language-list .language-item{padding:5px 15px}.auto-language-list .language-item:hover{background-color:#f3f3f3;cursor:pointer}.auto-language-list .language-item-active{background-color:#1b4ca1!important;color:#fff!important}::ng-deep .mat-calendar-body-active{background:#1b4ca1!important;border-radius:100%!important}::ng-deep .course-survey .lib-container{height:100%!important}@media screen and (max-width: 430px){::ng-deep .course-survey .lib-container{padding-left:0!important;padding-right:0!important;padding-bottom:1rem!important}}.disagnation-caret,.mother-toungue-caret{position:absolute;right:0;bottom:0}::ng-deep .userDetailsForm .mat-form-field-appearance-outline .mat-form-field-infix{padding:.5rem 0 .8rem}input[disabled]+mat-icon.disagnation-caret{opacity:.5}input[disabled]+mat-icon.mother-toungue-caret{opacity:.5}::ng-deep .course-survey .lib-container-2{height:auto;min-height:unset!important;padding:0!important;box-shadow:none!important;margin-bottom:2rem!important}@media screen and (max-width: 430px){::ng-deep .course-survey .lib-container-2{padding-left:0!important;padding-right:0!important}}.profile-form-field .mat-select{border:none}.customForm{padding-right:0!important;padding-bottom:1rem!important;padding:1rem 3rem}.cadreControl-name{background:#c3c3c3;padding:10px}.country-code{margin-top:5px;text-align:center;width:50px;height:46px;border:1px solid #d6d5d5;border-radius:5px}.get-otp{color:#1b4ca1;font-weight:700;cursor:pointer;font-size:14px}.enter-otp{align-items:center;justify-content:space-between}.custom-size{width:96%}.resend-otp{color:#1b4ca1;font-weight:700;cursor:pointer}.verified-check{position:absolute;right:3px;color:#5fa800;font-size:18px;width:18px;height:18px}.save-button:disabled{opacity:.6!important}.loader{position:absolute;top:0;left:0;z-index:1000;height:100vh;width:100vw;background-color:#80808045}.mat-error{margin:-10px 0 5px}:host ::ng-deep .userDetailsForm .mat-form-field-wrapper{padding-bottom:8px!important}.custom-select-container,.fixed-height-select{width:100%}.fixed-height-select ::ng-deep .mat-form-field-flex{height:48px!important;min-height:45px!important;align-items:center}.fixed-height-select ::ng-deep .mat-form-field-infix{padding:0!important;border-top:0!important;height:45px!important;display:flex;align-items:center}.fixed-height-select ::ng-deep .mat-form-field-wrapper{padding-bottom:0!important}.fixed-height-select ::ng-deep .mat-select-arrow-wrapper{transform:translateY(0)!important}.fixed-height-select ::ng-deep .mat-form-field-label-wrapper{top:-1.1em}::ng-deep .search-panel{max-height:350px}::ng-deep .search-panel .sticky-search-container{position:sticky;top:0;z-index:2;background:#fff;padding:8px;border-bottom:1px solid rgba(0,0,0,.12);box-shadow:0 2px 4px #00000014}::ng-deep .search-panel .search-input-wrapper{position:relative;width:100%}::ng-deep .search-panel .search-input{width:100%;height:35px;padding:0 30px 0 12px;border:1px solid rgba(0,0,0,.12);border-radius:4px;font-size:14px;box-sizing:border-box}::ng-deep .search-panel .search-input:focus{outline:none;border-color:#f3962f;box-shadow:0 0 0 1px #f3962f33}::ng-deep .search-panel .clear-button{position:absolute;right:8px;top:50%;transform:translateY(-50%);background:none;border:none;cursor:pointer;color:#00000080;font-size:14px;padding:4px;display:flex;align-items:center;justify-content:center}::ng-deep .search-panel .clear-button:hover{color:#000c}::ng-deep .search-panel .mat-option.mat-option-disabled{color:#00000061;font-style:italic}::ng-deep .mat-mdc-form-field.fixed-height-select .mat-mdc-text-field-wrapper{height:45px!important}::ng-deep .mat-mdc-form-field.fixed-height-select .mat-mdc-form-field-flex{min-height:45px!important;height:45px!important}::ng-deep .mat-mdc-form-field.fixed-height-select .mat-mdc-form-field-infix{min-height:45px!important;height:45px!important;padding-top:0!important;padding-bottom:0!important}\n"] }]
1813
+ }], ctorParameters: function () { return [{ type: i1.MatLegacySnackBar }, { type: i2.MatLegacyDialogRef }, { type: i3.UserProfileService }, { type: i4.ConfigurationsService }, { type: i5.ProfileV2Service }, { type: i6.OtpService }, { type: i7.NPSGridService }, { type: i8.TranslateService }, { type: i9.DatePipe }, { type: undefined, decorators: [{
1814
+ type: Inject,
1815
+ args: [MAT_DIALOG_DATA]
1816
+ }] }]; }, propDecorators: { timerDiv: [{
1817
+ type: ViewChild,
1818
+ args: ['timerDiv', { static: false }]
1819
+ }], emailTimerDiv: [{
1820
+ type: ViewChild,
1821
+ args: ['emailTimerDiv', { static: false }]
1822
+ }], textBox: [{
1823
+ type: ViewChild,
1824
+ args: ['textBox']
1825
+ }], dropdown: [{
1826
+ type: ViewChild,
1827
+ args: ['dropdown']
1828
+ }], languageTextBox: [{
1829
+ type: ViewChild,
1830
+ args: ['languageTextBox']
1831
+ }], languageDropdown: [{
1832
+ type: ViewChild,
1833
+ args: ['languageDropdown']
1834
+ }], handleClickOutside: [{
1835
+ type: HostListener,
1836
+ args: ['document:click', ['$event']]
1837
+ }] } });
1838
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5yb2xsLXByb2ZpbGUtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdG9jL3NyYy9saWIvY29tcG9uZW50cy9lbnJvbGwtcHJvZmlsZS1mb3JtL2Vucm9sbC1wcm9maWxlLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL2NvbXBvbmVudHMvZW5yb2xsLXByb2ZpbGUtZm9ybS9lbnJvbGwtcHJvZmlsZS1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDOUYsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFbkUsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFekYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUM5QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQTtBQUt0RSxPQUFPLEVBQXNDLHNCQUFzQixJQUFJLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBRS9ILG9CQUFvQjtBQUNwQixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFLdEIsTUFBTSxjQUFjLEdBQUcsbUJBQW1CLENBQUE7QUFDMUMsTUFBTSxnQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQTtBQUMxQyxNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUE7QUFDckMsb0JBQW9CO0FBQ3BCLE1BQU0sYUFBYSxHQUFHLHFIQUFxSCxDQUFB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IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbidcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbmplY3QsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3JtcydcbmltcG9ydCB7IFVzZXJQcm9maWxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3VzZXItcHJvZmlsZS5zZXJ2aWNlJ1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgc3RhcnRXaXRoLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IE5zVXNlclByb2ZpbGVEZXRhaWxzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3VzZXItcHJvZmlsZS5tb2RlbCdcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25zU2VydmljZSB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xuaW1wb3J0IHsgUHJvZmlsZVYyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Byb2ZpbGUtdjIuc2VydmljZSdcbmltcG9ydCB7IE90cFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vdHAuc2VydmljZSdcbmltcG9ydCB7IE5QU0dyaWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbnBzLWdyaWQuc2VydmljZSdcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZ1JlZiBhcyBNYXREaWFsb2dSZWYsIE1BVF9MRUdBQ1lfRElBTE9HX0RBVEEgYXMgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWRpYWxvZydcbmltcG9ydCB7IE1hdExlZ2FjeVNuYWNrQmFyIGFzIE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LXNuYWNrLWJhcidcbi8qIHRzbGludDpkaXNhYmxlICovXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSdcbi8vIGltcG9ydCB7IFNpZ251cFNlcnZpY2UgfSBmcm9tICdzcmMvYXBwL3JvdXRlcy9wdWJsaWMvcHVibGljLXNpZ251cC9zaWdudXAuc2VydmljZSdcbmltcG9ydCB7IGRlc2lnbmF0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3Byb2ZpbGUtcmV2YW1wLm1vZGVsJ1xuXG5jb25zdCBNT0JJTEVfUEFUVEVSTiA9IC9eWzBdP1s2Nzg5XVxcZHs5fSQvXG5jb25zdCBQSU5fQ09ERV9QQVRURVJOID0gL15bMS05XVswLTldezV9JC9cbmNvbnN0IEVNUF9JRF9QQVRURVJOID0gL15bYS16MC05XSskL2lcbi8qIHRzbGludDpkaXNhYmxlICovXG5jb25zdCBFTUFJTF9QQVRURVJOID0gL15bYS16QS1aMC05XStbYS16QS1aMC05Ll8tXSpbYS16QS1aMC05XStAW2EtekEtWjAtOV0rKFstYS16QS1aMC05XSpbYS16QS1aMC05XSspPyhcXC5bYS16QS1aMC05LV0rKSpcXC5bYS16QS1aXXsyLDR9JC9cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd3MtYXBwLWVucm9sbC1wcm9maWxlLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZW5yb2xsLXByb2ZpbGUtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Vucm9sbC1wcm9maWxlLWZvcm0uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRW5yb2xsUHJvZmlsZUZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwdWJsaWMgYWZ0ZXJTdWJtaXRBY3Rpb24gPSB0aGlzLmNoZWNrQWZ0ZXJTdWJtaXQuYmluZCh0aGlzKVxuICBpc1JlYWRPbmx5ID0gZmFsc2VcbiAgYmF0Y2hEZXRhaWxzOiBhbnlcbiAgY3VzdG9tRm9ybTogYm9vbGVhbiA9IGZhbHNlXG4gIHVzZXJEZXRhaWxzRm9ybTogRm9ybUdyb3VwXG4gIGdyb3VwRGF0YTogYW55IHwgdW5kZWZpbmVkXG4gIHByaXZhdGUgZGVzdHJveVN1YmplY3QkID0gbmV3IFN1YmplY3QoKVxuICBkZXNpZ25hdGlvbnNNZXRhOiBhbnkgPSBbXVxuICAvLyBmaWx0ZXJEZXNpZ25hdGlvbnNNZXRhOiBhbnkgPSBbXVxuICBlVXNlckdlbmRlciA9IE9iamVjdC5rZXlzKE5zVXNlclByb2ZpbGVEZXRhaWxzLkVVc2VyR2VuZGVyKVxuICBtYXN0ZXJMYW5ndWFnZXM6IGFueVxuICBtYXN0ZXJMYW5ndWFnZUJhY2t1cDogYW55XG4gIGVDYXRlZ29yeSA9IE9iamVjdC5rZXlzKE5zVXNlclByb2ZpbGVEZXRhaWxzLkVDYXRlZ29yeSlcbiAgdXNlclByb2ZpbGVPYmplY3Q6IGFueVxuICBlbGlnaWJsZTogYm9vbGVhbiA9IGZhbHNlXG4gIGlzQ2FkcmVTdGF0dXMgPSBmYWxzZVxuICBzaG93QmF0Y2hGb3JOb0NhZHJlID0gdHJ1ZVxuICBjaXZpbFNlcnZpY2VEYXRhOiBhbnlcbiAgY2l2aWxTZXJ2aWNlVHlwZXM6IGFueVxuICBzZXJ2aWNlTmFtZTogYW55XG4gIHNlcnZpY2VUeXBlOiBhbnlcbiAgc2VydmljZUxpc3REYXRhOiBhbnlcbiAgc2VydmljZUlkOiBhbnlcbiAgZXJyb3JNZXNzYWdlOiBhbnlcbiAgc2VsZWN0ZWRTZXJ2aWNlTmFtZTogYW55XG4gIHNlbGVjdGVkU2VydmljZTogYW55XG4gIGNpdmlsU2VydmljZU5hbWU6IGFueVxuICBjaXZpbFNlcnZpY2VJZDogYW55XG4gIGNhZHJlSWQ6IGFueVxuICBjYWRyZTogYW55XG4gIGNhZHJlQ29udHJvbGxpbmdBdXRob3JpdHk6IGFueVxuICBzdGFydEJhdGNoOiBhbnlcbiAgZW5kQmF0Y2g6IGFueVxuICB5ZWFyQXJyYXk6IGFueVxuICBleGNsdXNpb25ZZWFyOiBhbnlcbiAgc2VsZWN0ZWRDYWRyZU5hbWU6IGFueVxuICBzZWxlY3RlZENhZHJlOiBhbnlcbiAgdmVyaWZ5TW9iaWxlOiBib29sZWFuID0gZmFsc2VcbiAgb3RwU2VudDogYm9vbGVhbiA9IGZhbHNlXG4gIGVtYWlsT3RwU2VudDogYm9vbGVhbiA9IGZhbHNlXG4gIG90cEVudGVyZWQgPSAnJ1xuICBtVmVyaWZpZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICBlVmVyaWZpZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICBAVmlld0NoaWxkKCd0aW1lckRpdicsIHsgc3RhdGljOiBmYWxzZSB9KSB0aW1lckRpdiAhOiBhbnlcbiAgQFZpZXdDaGlsZCgnZW1haWxUaW1lckRpdicsIHsgc3RhdGljOiBmYWxzZSB9KSBlbWFpbFRpbWVyRGl2ICE6IGFueVxuICB0aW1lTGVmdCA9IDE1MFxuICBlbWFpbFRpbWVMZWZ0ID0gMTUwXG4gIGludGVydmFsOiBhbnlcbiAgZW1haWxJbnRlcnZhbDogYW55XG4gIHNob3dSZXNlbmRPVFAgPSBmYWxzZVxuICBzaG93RW1haWxSZXNlbmRPVFAgPSBmYWxzZVxuICBvdHBGb3JtOiBGb3JtR3JvdXBcbiAgZW1haWxPdHBGb3JtOiBGb3JtR3JvdXBcbiAgc2hvd25hbWUgPSBmYWxzZVxuICBzaG93RGVzaWduYXRpb24gPSBmYWxzZVxuICBzaG93R3JvdXAgPSBmYWxzZVxuICBzaG93RW1wbG95ZWVDb2RlID0gZmFsc2VcbiAgc2hvd01vYmlsZSA9IGZhbHNlXG4gIHNob3dHZW5kZXIgPSBmYWxzZVxuICBzaG93RG9iID0gZmFsc2VcbiAgc2hvd0NhdGVnb3J5ID0gZmFsc2VcbiAgc2hvd0RlY2ltYWxNZWRpdW0gPSBmYWxzZVxuICBzaG93UGluQ29kZSA9IGZhbHNlXG4gIHNob3dDYWRyZURldGFpbHMgPSBmYWxzZVxuICB1cGRhdGVQcm9maWxlID0gZmFsc2VcbiAgcGVuZGluZ0ZpbGVkczogYW55XG4gIHBHcm91cDogYW55XG4gIHBEZXNpZ25hdGlvbjogYW55XG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlXG4gIGNhblNob3dFbXBsb3llZUNvZGU6IGJvb2xlYW4gPSBmYWxzZVxuICBjYW5zaG93TW9iaWxlOiBib29sZWFuID0gZmFsc2VcbiAgY2FuU2hvd0dlbmRlcjogYm9vbGVhbiA9IGZhbHNlXG4gIGNhblNob3dEb2I6IGJvb2xlYW4gPSBmYWxzZVxuICBjYW5TaG93RG9taWNpbGVNZWRpdW06IGJvb2xlYW4gPSBmYWxzZVxuICBjYW5TaG93Q2F0ZWdvcnk6IGJvb2xlYW4gPSBmYWxzZVxuICBjYW5TaG93cGluQ29kZTogYm9vbGVhbiA9IGZhbHNlXG4gIGNhblNob3dzaG93Q2FkcmVEZXRhaWxzOiBib29sZWFuID0gZmFsc2VcbiAgY2FuU2hvd0dyb3VwOiBib29sZWFuID0gZmFsc2VcbiAgY2FuU2hvd0Rlc2lnbmF0aW9uOiBib29sZWFuID0gZmFsc2VcbiAgc2VsZWN0ZWREYXRlOiBhbnlcbiAgc2hvd0NvdW50ZXI6IG51bWJlciA9IDBcbiAgZGlzYWJsZUNvdW50ZXI6IG51bWJlciA9IDBcbiAgY2FuU2hvd0VtYWlsOiBib29sZWFuID0gZmFsc2VcbiAgc2hvd0VtYWlsOiBib29sZWFuID0gZmFsc2VcbiAgY2FuU2hvd05hbWU6IGJvb2xlYW4gPSBmYWxzZVxuICBjYW5TaG93T3JnOiBib29sZWFuID0gZmFsc2VcbiAgc2hvd09yZzogYm9vbGVhbiA9IGZhbHNlXG4gIHN1cnZleUlkOiBhbnlcbiAgc2hvd0RvcHRDaGFuZ2VzOiBib29sZWFuID0gZmFsc2VcbiAgcHJvZmlsZUZvcm1UeXBlOiBhbnlcbiAgdmVyaWZ5RW1haWwgPSBmYWxzZVxuICBhcHByb3ZlZERvbWFpbkxpc3Q6IGFueSA9IFtdXG4gIGNvbnRleHRUb2tlbjogYW55XG4gIGN1cnJlbnREYXRlID0gbmV3IERhdGUoKVxuICBvcGVuRGVzaWduYXRpb25Ecm9wZG93biA9IGZhbHNlXG4gIG9wZW5MYW5ndWFnZURyb3Bkb3duID0gZmFsc2VcbiAgY2FuU2hvd090aGVyRGVzaWduYXRpb24gPSBmYWxzZVxuICBkZXNpZ25hdGlvbkxpc3RMb2FkQ291bnQgPSA1MFxuICBhZGRMb2FkZXIgPSAwXG4gIGlzTG9hZGluZ01vcmVEZXNpZ25hdGlvbnMgPSBmYWxzZTtcbiAgZGVzaWduYXRpb25EZWZhdWx0TG9hZENvdW50ID0gIDUwXG4gIGRlc2lnYW50aW9uRmlsdGVyRW5hYmxlID0gZmFsc2VcbiAgb3JnYW5pc2F0aW9uSWQgPSAnJ1xuICBzZWxlY3RlZE9yZ0hhc0Rlc2lnbmF0aW9ucyA9IGZhbHNlO1xuICBkZXNpZ25hdGlvbnNPZmZzZXQgPSAwO1xuICBkZXNpZ25hdGlvblNlYXJjaFRleHQgPSAnJztcbiAgZGVzaWduYXRpb25zVG90YWxDb3VudCA9IDA7XG4gIGZvcm1JZDogc3RyaW5nID0gJyc7XG4gIGZvcm1zRGV0aWxzOiBhbnk7XG4gIEBWaWV3Q2hpbGQoJ3RleHRCb3gnKSB0ZXh0Qm94ITogRWxlbWVudFJlZlxuICBAVmlld0NoaWxkKCdkcm9wZG93bicpIGRyb3Bkb3duITogRWxlbWVudFJlZlxuICBAVmlld0NoaWxkKCdsYW5ndWFnZVRleHRCb3gnKSBsYW5ndWFnZVRleHRCb3ghOiBFbGVtZW50UmVmXG4gIEBWaWV3Q2hpbGQoJ2xhbmd1YWdlRHJvcGRvd24nKSBsYW5ndWFnZURyb3Bkb3duITogRWxlbWVudFJlZlxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8RW5yb2xsUHJvZmlsZUZvcm1Db21wb25lbnQ+LFxuICAgIHByaXZhdGUgdXNlclByb2ZpbGVTZXJ2aWNlOiBVc2VyUHJvZmlsZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTcmM6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHByb2ZpbGVWMlN2YzogUHJvZmlsZVYyU2VydmljZSxcbiAgICBwcml2YXRlIG90cFNlcnZpY2U6IE90cFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBucHNTdmM6IE5QU0dyaWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSxcbiAgICAvLyBwcml2YXRlIHNpZ251cFNlcnZpY2U6IFNpZ251cFNlcnZpY2UsXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnksXG4gICkge1xuXG4gICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3ZWJzaXRlTGFuZ3VhZ2UnKSkge1xuICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNldERlZmF1bHRMYW5nKCdlbicpXG4gICAgICBjb25zdCBsYW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3dlYnNpdGVMYW5ndWFnZScpIVxuICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnVzZShsYW5nKVxuICAgIH1cblxuICAgIHRoaXMuYmF0Y2hEZXRhaWxzID0gdGhpcy5kYXRhLmJhdGNoRGF0YVxuICAgIHRoaXMuc3VydmV5SWQgPSB0aGlzLmRhdGEuc3VydmV5SWRcbiAgICB0aGlzLnNob3dEb3B0Q2hhbmdlcyA9IHRoaXMuZGF0YS5zaG93RG9wdENoYW5nZXNcbiAgICB0aGlzLnByb2ZpbGVGb3JtVHlwZSA9IHRoaXMuYmF0Y2hEZXRhaWxzLmJhdGNoQXR0cmlidXRlcy51c2VyUHJvZmlsZUZpbGVkc1xuICAgIHRoaXMudXNlckRldGFpbHNGb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICBuYW1lOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgb3JnYW5pc2F0aW9uOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgZ3JvdXA6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICBkZXNpZ25hdGlvbjogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgIGVtcGxveWVlQ29kZTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgIHByaW1hcnlFbWFpbDogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5wYXR0ZXJuKEVNQUlMX1BBVFRFUk4pXSksXG4gICAgICBtb2JpbGU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICBnZW5kZXI6IG5ldyBGb3JtQ29udHJvbCgnJywgW10pLFxuICAgICAgZG9iOiBuZXcgRm9ybUNvbnRyb2woJycsIFtdKSxcbiAgICAgIGRvbWljaWxlTWVkaXVtOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgY2F0ZWdvcnk6IG5ldyBGb3JtQ29udHJvbCgnJywgW10pLFxuICAgICAgcGluQ29kZTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgIGlzQ2FkcmU6IG5ldyBGb3JtQ29udHJvbCgpLFxuICAgICAgdHlwZU9mQ2l2aWxTZXJ2aWNlOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgc2VydmljZVR5cGU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICBjYWRyZU5hbWU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICBjYWRyZUJhdGNoOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgY2FkcmVDb250cm9sbGluZ0F1dGhvcml0eTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgIG90aGVyRGVzaWduYXRpb246IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICBzZWFyY2hEZXNpZ25hdGlvbjogbmV3IEZvcm1Db250cm9sKCcnKVxuICAgIH0pXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlXG4gICAgdGhpcy51c2VyUHJvZmlsZU9iamVjdCA9IHRoaXMuY29uZmlnU3JjLnVuTWFwcGVkVXNlclxuICAgIHRoaXMub3JnYW5pc2F0aW9uSWQgPSBfLmdldCh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LCAncm9vdE9yZ0lkJywgXy5nZXQodGhpcy51c2VyUHJvZmlsZU9iamVjdCwgJ3BlcnNvbmFsRGV0YWlscy5yb290T3JnSWQnLCAnJykpXG5cbiAgICB0aGlzLm90cEZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgIG90cDogbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuICAgIH0pXG4gICAgdGhpcy5lbWFpbE90cEZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgIGVPdHA6IG5ldyBGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZClcbiAgICB9KVxuXG4gICAgLy8gVG8gY2hlY2sgdGhlIG1vYmlsZSBudW1iZXIgZW50ZXJlZCBieSB0aGUgdXNlciBpcyBzYW1lIG9yIG5vdCwgdmFsaWRhdGluZyB0aGUgbW9iaWxlIG51bWJlciB0byBzaG93IHRoZSBHZXQgT1RQLlxuICAgIGlmICh0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ21vYmlsZScpKSB7XG4gICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ21vYmlsZScpIS52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgIGlmIChyZXMgJiYgcmVzICE9PSB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlscy5tb2JpbGUgfHxcbiAgICAgICAgICAgICF0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlscy5waG9uZVZlcmlmaWVkKSB7XG4gICAgICAgICAgICBpZiAoTU9CSUxFX1BBVFRFUk4udGVzdChyZXMpKSB7XG4gICAgICAgICAgICAgIHRoaXMudmVyaWZ5TW9iaWxlID0gdHJ1ZVxuICAgICAgICAgICAgICB0aGlzLm1WZXJpZmllZCA9IGZhbHNlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnZlcmlmeU1vYmlsZSA9IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmVyaWZ5TW9iaWxlID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gVG8gY2hlY2sgdGhlIGVtYWlsIGVudGVyZWQgYnkgdGhlIHVzZXIgaXMgc2FtZSBvciBub3QsIHZhbGlkYXRpbmcgdGhlIGVtYWlsIHRvIHNob3cgdGhlIEdldCBPVFAuXG4gICAgaWYgKHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgncHJpbWFyeUVtYWlsJykpIHtcbiAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgncHJpbWFyeUVtYWlsJykhLnZhbHVlQ2hhbmdlc1xuICAgICAgICAuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMgIT09IHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLnByaW1hcnlFbWFpbCkge1xuICAgICAgICAgICAgaWYgKEVNQUlMX1BBVFRFUk4udGVzdChyZXMpKSB7XG4gICAgICAgICAgICAgIHRoaXMudmVyaWZ5RW1haWwgPSB0cnVlXG4gICAgICAgICAgICAgIHRoaXMuZVZlcmlmaWVkID0gZmFsc2VcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMudmVyaWZ5RW1haWwgPSBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZlcmlmeUVtYWlsID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuZVZlcmlmaWVkID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBzY3JvbGxUb0FjdGl2ZSh0eXBlOiBhbnkpOiB2b2lkIHtcbiAgICBsZXQgYWN0aXZlRWxlbWVudDogYW55XG4gICAgbGV0IGNvbnRhaW5lcjogYW55XG4gICAgaWYgKHR5cGUgPT09ICdsYW5ndWFnZScpIHtcbiAgICAgIGNvbnRhaW5lciA9IHRoaXMubGFuZ3VhZ2VEcm9wZG93bi5uYXRpdmVFbGVtZW50XG4gICAgICBhY3RpdmVFbGVtZW50ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5sYW5ndWFnZS1pdGVtLWFjdGl2ZScpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnZGVzaWduYXRpb24nKSB7XG4gICAgICBjb250YWluZXIgPSB0aGlzLmRyb3Bkb3duLm5hdGl2ZUVsZW1lbnRcbiAgICAgIGFjdGl2ZUVsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignLml0ZW0tYWN0aXZlJylcbiAgICB9XG4gICAgaWYgKGFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGFjdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuXG4gIGhhbmRsZUNsaWNrT3V0c2lkZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGNsaWNrZWRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50XG4gICAgaWYgKFxuICAgICAgdGhpcy50ZXh0Qm94ICYmICF0aGlzLnRleHRCb3gubmF0aXZlRWxlbWVudC5jb250YWlucyhjbGlja2VkRWxlbWVudCkgJiZcbiAgICAgIHRoaXMuZHJvcGRvd24gJiYgIXRoaXMuZHJvcGRvd24ubmF0aXZlRWxlbWVudC5jb250YWlucyhjbGlja2VkRWxlbWVudClcbiAgICApIHtcbiAgICAgIHRoaXMub3BlbkRlc2lnbmF0aW9uRHJvcGRvd24gPSBmYWxzZVxuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmxhbmd1YWdlVGV4dEJveCAmJiAhdGhpcy5sYW5ndWFnZVRleHRCb3gubmF0aXZlRWxlbWVudC5jb250YWlucyhjbGlja2VkRWxlbWVudCkgJiZcbiAgICAgIHRoaXMubGFuZ3VhZ2VEcm9wZG93biAmJiAhdGhpcy5sYW5ndWFnZURyb3Bkb3duLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoY2xpY2tlZEVsZW1lbnQpXG4gICAgKSB7XG4gICAgICB0aGlzLm9wZW5MYW5ndWFnZURyb3Bkb3duID0gZmFsc2VcbiAgICB9XG4gIH1cbiAgb25EZXNpZ25hdGlvbnNGb2N1cygpIHtcbiAgICAvLyB0aGlzLm9wZW5EZXNpZ25hdGlvbkRyb3Bkb3duID0gdHJ1ZVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zY3JvbGxUb0FjdGl2ZSgnZGVzaWduYXRpb24nKVxuICAgIH0sIDEwMClcbiAgfVxuICBvbkxhbmd1YWdlRm9jdXMoKSB7XG4gICAgdGhpcy5vcGVuTGFuZ3VhZ2VEcm9wZG93biA9IHRydWVcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9BY3RpdmUoJ2xhbmd1YWdlJylcbiAgICB9LCAxMDApXG4gIH1cblxuICBmaWx0ZXJMYW5ndWFnZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCkge1xuICAgICAgdGhpcy5tYXN0ZXJMYW5ndWFnZXMgPSB0aGlzLm1hc3Rlckxhbmd1YWdlQmFja3VwLmZpbHRlcigodmFsOiBhbnkpID0+XG4gICAgICAgIHZhbCAmJiB2YWwubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2YWx1ZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgKVxuICAgICAgaWYgKHRoaXMubWFzdGVyTGFuZ3VhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zdCB1c2VybmFtZUNvbnRyb2wgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ2RvbWljaWxlTWVkaXVtJylcbiAgICAgICAgaWYgKHVzZXJuYW1lQ29udHJvbCkge1xuICAgICAgICAgIHVzZXJuYW1lQ29udHJvbC5zZXRFcnJvcnMoeyByZXF1aXJlZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9wZW5MYW5ndWFnZURyb3Bkb3duID0gdHJ1ZVxuICB9XG5cbiAgLy8gZmlsdGVyZGVzaWduYXRpb24odmFsdWU6IGFueSkge1xuICAvLyAgIGlmICh2YWx1ZS5sZW5ndGgpIHtcbiAgLy8gICAgIHRoaXMuZGVzaWdhbnRpb25GaWx0ZXJFbmFibGUgPXRydWVcbiAgLy8gICAgIHRoaXMuZmlsdGVyRGVzaWduYXRpb25zTWV0YSA9IHRoaXMuZGVzaWduYXRpb25zTWV0YS5maWx0ZXIoKHZhbDogYW55KSA9PlxuICAvLyAgICAgICB2YWwgJiYgdmFsLm5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModmFsdWUudG9Mb3dlckNhc2UoKSlcbiAgLy8gICAgIClcbiAgLy8gICAgIGlmICh0aGlzLmZpbHRlckRlc2lnbmF0aW9uc01ldGEubGVuZ3RoID09PSAwKSB7XG4gIC8vICAgICAgIGNvbnN0IHVzZXJuYW1lQ29udHJvbCA9IHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgnZGVzaWduYXRpb24nKVxuICAvLyAgICAgICBpZiAodXNlcm5hbWVDb250cm9sKSB7XG4gIC8vICAgICAgICAgdXNlcm5hbWVDb250cm9sLnNldEVycm9ycyh7IHJlcXVpcmVkOiB0cnVlIH0pO1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9XG4gIC8vICAgfSBlbHNlIHtcbiAgLy8gICAgIHRoaXMuZmlsdGVyRGVzaWduYXRpb25zTWV0YSA9IHRoaXMuZGVzaWduYXRpb25zTWV0YS5zbGljZSgwLCB0aGlzLmRlc2lnbmF0aW9uRGVmYXVsdExvYWRDb3VudClcbiAgLy8gICAgIHRoaXMuZGVzaWdhbnRpb25GaWx0ZXJFbmFibGUgPWZhbHNlXG5cbiAgLy8gICAgIHRoaXMuZGVzaWduYXRpb25MaXN0TG9hZENvdW50ID0gdGhpcy5kZXNpZ25hdGlvbkRlZmF1bHRMb2FkQ291bnQ7XG4gIC8vICAgfVxuICAvLyAgIC8vIHRoaXMub3BlbkRlc2lnbmF0aW9uRHJvcGRvd24gPSB0cnVlXG4gIC8vIH1cblxuICAvLyBhc3luYyBnZXRNYXN0ZXJEZXNpZ25hdGlvbigpIHtcbiAgLy8gICB0aGlzLnNpZ251cFNlcnZpY2UuZ2V0T3JnUmVhZERhdGEodGhpcy51c2VyUHJvZmlsZU9iamVjdC5yb290T3JnSWQpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcbiAgLy8gICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmZyYW1ld29ya2lkKSB7XG4gIC8vICAgICAgIHRoaXMuc2lnbnVwU2VydmljZS5nZXRGcmFtZXdvcmtJbmZvKHJlc3VsdC5mcmFtZXdvcmtpZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAvLyAgICAgICAgIGNvbnN0IGZyYW1ld29ya0RldGFpbHMgPSBfLmdldChyZXMsICdyZXN1bHQuZnJhbWV3b3JrJylcbiAgLy8gICAgICAgICBjb25zdCBjYXRlZ29yaWVzT2ZGcmFtZXdvcmsgPSBfLmdldChmcmFtZXdvcmtEZXRhaWxzLCAnY2F0ZWdvcmllcycsIFtdKVxuICAvLyAgICAgICAgIGNvbnN0IG9yZ2FuaXNhdGlvbnNMaXN0ID0gdGhpcy5nZXRUZXJtc0J5Q29kZShjYXRlZ29yaWVzT2ZGcmFtZXdvcmssICdvcmcnKVxuICAvLyAgICAgICAgIGNvbnN0IGRpc09yZGVyZWRMaXN0ID0gXy5nZXQob3JnYW5pc2F0aW9uc0xpc3QsICdbMF0uY2hpbGRyZW4nLCBbXSlcbiAgLy8gICAgICAgICB0aGlzLmRlc2lnbmF0aW9uc01ldGEgPSBfLnNvcnRCeShkaXNPcmRlcmVkTGlzdCwgJ25hbWUnKVxuICAvLyAgICAgICAgIHRoaXMuZmlsdGVyRGVzaWduYXRpb25zTWV0YSA9IHRoaXMuZGVzaWduYXRpb25zTWV0YS5zbGljZSgwLCB0aGlzLmRlc2lnbmF0aW9uRGVmYXVsdExvYWRDb3VudClcbiAgLy8gICAgICAgICBpZiAodGhpcy5jYW5TaG93RGVzaWduYXRpb24pIHtcbiAgLy8gICAgICAgICAgIGxldCBmaWVsZCA9IHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgnZGVzaWduYXRpb24nKVxuICAvLyAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLnZhbHVlKSB7XG4gIC8vICAgICAgICAgICAgIGxldCBfdmFsdWUgPSBmaWVsZC52YWx1ZS50b0xvd2VyQ2FzZSgpXG4gIC8vICAgICAgICAgICAgIGlmICghdGhpcy5kZXNpZ25hdGlvbnNNZXRhLmZpbmQoKGQ6IGFueSkgPT4gZC5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IF92YWx1ZSkpIHtcbiAgLy8gICAgICAgICAgICAgICBmaWVsZC5wYXRjaFZhbHVlKCcnKVxuICAvLyAgICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICB9XG4gIC8vICAgICAgICAgfVxuICAvLyAgICAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xuICAvLyAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VycmVkOicsIGVycm9yKVxuICAvLyAgICAgICB9KVxuICAvLyAgICAgfVxuICAvLyAgIH0sIChlcnJvcjogYW55KSA9PiB7XG4gIC8vICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgLy8gICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VycmVkOicsIGVycm9yKVxuICAvLyAgIH0pXG4gIC8vIH1cblxuICAvLyBwcml2YXRlIGdldFRlcm1zQnlDb2RlKGNhdGVnb3JpZXM6IGFueVtdLCBjb2RlOiBzdHJpbmcpIHtcbiAgLy8gICBjb25zdCBzZWxlY3RlZENhdGVnb3J5ID0gY2F0ZWdvcmllcy5maWx0ZXIoXG4gIC8vICAgICAoY2F0ZWdvcnk6IGFueSkgPT4gY2F0ZWdvcnkuY29kZSA9PT0gY29kZVxuICAvLyAgICk7XG4gIC8vICAgcmV0dXJuIF8uZ2V0KHNlbGVjdGVkQ2F0ZWdvcnksICdbMF0udGVybXMnLCBbXSk7XG4gIC8vIH1cblxuICBwcmV2ZW50Qmx1cihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgfVxuICBwcmV2ZW50TGFuZ3VhZ2VCbHVyKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG5cbiAgc2VsZWN0RGVzaWduYXRpb24oZGVzaWduYXRpb246IGFueSkge1xuICAgIHRoaXMudXNlckRldGFpbHNGb3JtLnBhdGNoVmFsdWUoeyBkZXNpZ25hdGlvbjogZGVzaWduYXRpb24gfSlcbiAgICBjb25zdCBmaWVsZENvbnRyb2wgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ290aGVyRGVzaWduYXRpb24nKVxuICAgIGlmICh0aGlzLnNob3dEb3B0Q2hhbmdlcyAmJiBkZXNpZ25hdGlvbiA9PT0gJ090aGVycycpIHtcbiAgICAgIGlmIChmaWVsZENvbnRyb2wpIHtcbiAgICAgICAgZmllbGRDb250cm9sLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgICAgICAgZmllbGRDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxuICAgICAgfVxuICAgICAgdGhpcy5jYW5TaG93T3RoZXJEZXNpZ25hdGlvbiA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZpZWxkQ29udHJvbCkge1xuICAgICAgICBmaWVsZENvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKClcbiAgICAgICAgZmllbGRDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxuICAgICAgfVxuICAgICAgdGhpcy5jYW5TaG93T3RoZXJEZXNpZ25hdGlvbiA9IGZhbHNlXG4gICAgfVxuICAgIHRoaXMub3BlbkRlc2lnbmF0aW9uRHJvcGRvd24gPSBmYWxzZVxuICB9XG5cblxuICBzZWxlY3RMYW5ndWFnZShsYW5ndWFnZTogYW55KSB7XG4gICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0ucGF0Y2hWYWx1ZSh7IGRvbWljaWxlTWVkaXVtOiBsYW5ndWFnZSB9KVxuICAgIHRoaXMub3Blbkxhbmd1YWdlRHJvcGRvd24gPSBmYWxzZVxuICB9XG5cbiAgaXNFbWFpbEFsbG93ZWQoZW1haWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRvbWFpbiA9IGVtYWlsLnNwbGl0KCdAJylbMV1cbiAgICByZXR1cm4gZG9tYWluID8gdGhpcy5hcHByb3ZlZERvbWFpbkxpc3QuaW5jbHVkZXMoZG9tYWluKSA6IGZhbHNlXG4gIH1cblxuICBoYW5kbGVHZW5lcmF0ZUVtYWlsT1RQKHZlcmlmeVR5cGU/OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyh2ZXJpZnlUeXBlKVxuICAgIHRoaXMudXNlclByb2ZpbGVTZXJ2aWNlLmdldFdoaXRlTGlzdERvbWFpbigpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnJlc3VsdCAmJiByZXNwb25zZS5yZXN1bHQuZG9tYWlucyAmJiByZXNwb25zZS5yZXN1bHQuZG9tYWlucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuYXBwcm92ZWREb21haW5MaXN0ID0gcmVzcG9uc2UucmVzdWx0LmRvbWFpbnNcbiAgICAgICAgaWYgKHRoaXMuYXBwcm92ZWREb21haW5MaXN0ICYmIHRoaXMuYXBwcm92ZWREb21haW5MaXN0Lmxlbmd0aCAmJiB0aGlzLmFwcHJvdmVkRG9tYWluTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbWFpbEFsbG93ZWQodGhpcy51c2VyRGV0YWlsc0Zvcm0udmFsdWVbJ3ByaW1hcnlFbWFpbCddKSkge1xuICAgICAgICAgICAgdGhpcy5vdHBTZXJ2aWNlLnNlbmRFbWFpbE90cCh0aGlzLnVzZXJEZXRhaWxzRm9ybS52YWx1ZVsncHJpbWFyeUVtYWlsJ10pXG4gICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3lTdWJqZWN0JCkpXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKF9yZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1haWxPdHBGb3JtLnJlc2V0KClcbiAgICAgICAgICAgICAgICBpZiAodmVyaWZ5VHlwZSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5lbWFpbE90cFNlbnQgPSB0cnVlXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0RW1haWxUaW1lcigpXG4gICAgICAgICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4odGhpcy5oYW5kbGVUcmFuc2xhdGVUbygnb3RwU2VudEVtYWlsJykpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LCAoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvci5vaykge1xuICAgICAgICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKHRoaXMuaGFuZGxlVHJhbnNsYXRlVG8oJ2VtYWlsT1RQU2VudEZhaWwnKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4odGhpcy5oYW5kbGVUcmFuc2xhdGVUbygnZW1haWxBcHByb3ZlZFBvcHVwTXNnJykpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGhhbmRsZUdlbmVyYXRlT1RQKHZlcmlmeVR5cGU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm90cFNlcnZpY2Uuc2VuZE90cCh0aGlzLnVzZXJEZXRhaWxzRm9ybS52YWx1ZVsnbW9iaWxlJ10pXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95U3ViamVjdCQpKVxuICAgICAgLnN1YnNjcmliZSgoX3JlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc25hY2tCYXIub3Blbih0aGlzLmhhbmRsZVRyYW5zbGF0ZVRvKCdvdHBTZW50TW9iaWxlJykpXG4gICAgICAgIHRoaXMub3RwRm9ybS5yZXNldCgpXG4gICAgICAgIGlmICh2ZXJpZnlUeXBlKSB7XG4gICAgICAgICAgdGhpcy5vdHBTZW50ID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuc3RhcnRUaW1lcigpXG4gICAgICAgICAgLy90aGlzLmhhbmRsZVZlcmlmeU9UUCh2ZXJpZnlUeXBlLCB0aGlzLnVzZXJEZXRhaWxzRm9ybS52YWx1ZVsnbW9iaWxlJ10pXG4gICAgICAgIH1cbiAgICAgIH0sIChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKCFlcnJvci5vaykge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3Blbih0aGlzLmhhbmRsZVRyYW5zbGF0ZVRvKCdtb2JpbGVPVFBTZW50RmFpbCcpKVxuICAgICAgICB9XG4gICAgICB9KVxuICB9XG5cbiAgaGFuZGxlUmVzZW5kT1RQKCk6IHZvaWQge1xuICAgIHRoaXMudGltZUxlZnQgPSAxNTBcbiAgICB0aGlzLnNob3dSZXNlbmRPVFAgPSB0cnVlXG4gICAgdGhpcy5zdGFydFRpbWVyKClcbiAgICBsZXQgb3RwVmFsdWUkOiBhbnlcbiAgICBvdHBWYWx1ZSQgPSB0aGlzLm90cFNlcnZpY2UucmVzZW5kT3RwKHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydtb2JpbGUnXS52YWx1ZSlcblxuICAgIG90cFZhbHVlJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3lTdWJqZWN0JCkpXG4gICAgICAuc3Vic2NyaWJlKChfcmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKHRoaXMuaGFuZGxlVHJhbnNsYXRlVG8oJ290cFNlbnRNb2JpbGUnKSlcbiAgICAgIH0sIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIGlmICghZXJyb3Iub2spIHtcbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXy5nZXQoZXJyb3IsICdlcnJvci5wYXJhbXMuZXJybXNnJykgfHwgJ1VuYWJsZSB0byByZXNlbmQgT1RQLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIScpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gIH1cblxuICBoYW5kbGVSZXNlbmRFbWFpbE9UUCgpOiB2b2lkIHtcbiAgICB0aGlzLmVtYWlsVGltZUxlZnQgPSAxNTBcbiAgICB0aGlzLnNob3dFbWFpbFJlc2VuZE9UUCA9IHRydWVcbiAgICB0aGlzLnN0YXJ0RW1haWxUaW1lcigpXG4gICAgbGV0IG90cFZhbHVlJDogYW55XG4gICAgb3RwVmFsdWUkID0gdGhpcy5vdHBTZXJ2aWNlLnNlbmRFbWFpbE90cCh0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1sncHJpbWFyeUVtYWlsJ10udmFsdWUpXG4gICAgb3RwVmFsdWUkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveVN1YmplY3QkKSlcbiAgICAgIC5zdWJzY3JpYmUoKF9yZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4odGhpcy5oYW5kbGVUcmFuc2xhdGVUbygnb3RwU2VudEVtYWlsJykpXG4gICAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWVycm9yLm9rKSB7XG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKF8uZ2V0KGVycm9yLCAnZXJyb3IucGFyYW1zLmVycm1zZycpIHx8ICdVbmFibGUgdG8gcmVzZW5kIE9UUCwgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlciEnKVxuICAgICAgICB9XG4gICAgICB9KVxuICB9XG5cbiAgdmVyaWZ5RW1haWxPVFAoKTogdm9pZCB7XG4gICAgdGhpcy5vdHBTZXJ2aWNlLnZlcmlmeUVtYWlsT1RQKHRoaXMuZW1haWxPdHBGb3JtLmNvbnRyb2xzWydlT3RwJ10udmFsdWUsIHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydwcmltYXJ5RW1haWwnXS52YWx1ZSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3lTdWJqZWN0JCkpXG4gICAgICAuc3Vic2NyaWJlKChfcmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKHRoaXMuaGFuZGxlVHJhbnNsYXRlVG8oJ09UUFNlbnRTdWNjZXNzJykpXG4gICAgICAgIHRoaXMudmVyaWZ5RW1haWwgPSB0cnVlXG4gICAgICAgIHRoaXMuZVZlcmlmaWVkID0gdHJ1ZVxuICAgICAgICB0aGlzLmVtYWlsT3RwU2VudCA9IGZhbHNlXG4gICAgICAgIHRoaXMuY29udGV4dFRva2VuID0gX3Jlcy5yZXN1bHQuY29udGV4dFRva2VuXG4gICAgICAgIHRoaXMuZW1haWxPdHBGb3JtLnJlc2V0KClcbiAgICAgIH0sIChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKCFlcnJvci5vaykge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihfLmdldChlcnJvciwgJ2Vycm9yLnBhcmFtcy5lcnJtc2cnKSB8fCB0aGlzLmhhbmRsZVRyYW5zbGF0ZVRvKCdPVFBWZXJpZnlGYWlsZWQnKSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgfVxuXG4gIHZlcmlmeU1vYmlsZU9UUCgpOiB2b2lkIHtcbiAgICB0aGlzLm90cFNlcnZpY2UudmVyaWZ5T1RQKHRoaXMub3RwRm9ybS5jb250cm9sc1snb3RwJ10udmFsdWUsIHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydtb2JpbGUnXS52YWx1ZSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3lTdWJqZWN0JCkpXG4gICAgICAuc3Vic2NyaWJlKChfcmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKHRoaXMuaGFuZGxlVHJhbnNsYXRlVG8oJ09UUFNlbnRTdWNjZXNzJykpXG4gICAgICAgIHRoaXMudmVyaWZ5TW9iaWxlID0gdHJ1ZVxuICAgICAgICB0aGlzLm1WZXJpZmllZCA9IHRydWVcbiAgICAgICAgdGhpcy5vdHBTZW50ID0gZmFsc2VcbiAgICAgICAgdGhpcy5vdHBGb3JtLnJlc2V0KClcbiAgICAgIH0sIChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKCFlcnJvci5vaykge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihfLmdldChlcnJvciwgJ2Vycm9yLnBhcmFtcy5lcnJtc2cnKSB8fCB0aGlzLmhhbmRsZVRyYW5zbGF0ZVRvKCdPVFBWZXJpZnlGYWlsZWQnKSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgfVxuXG4gIHN0YXJ0VGltZXIoKSB7XG4gICAgdGhpcy5pbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnRpbWVMZWZ0ID4gMCkge1xuICAgICAgICB0aGlzLnRpbWVMZWZ0ID0gdGhpcy50aW1lTGVmdCAtIDFcbiAgICAgICAgaWYgKHRoaXMudGltZXJEaXYpIHtcbiAgICAgICAgICB0aGlzLnRpbWVyRGl2Lm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gYCR7TWF0aC5mbG9vcih0aGlzLnRpbWVMZWZ0IC8gNjApfW06ICR7dGhpcy50aW1lTGVmdCAlIDYwfXNgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbClcbiAgICAgICAgdGhpcy5zaG93UmVzZW5kT1RQID0gdHJ1ZVxuICAgICAgfVxuICAgIH0sIDEwMDApXG4gIH1cblxuICBzdGFydEVtYWlsVGltZXIoKSB7XG4gICAgdGhpcy5lbWFpbEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZW1haWxUaW1lTGVmdCA+IDApIHtcbiAgICAgICAgdGhpcy5lbWFpbFRpbWVMZWZ0ID0gdGhpcy5lbWFpbFRpbWVMZWZ0IC0gMVxuICAgICAgICBpZiAodGhpcy5lbWFpbFRpbWVyRGl2KSB7XG4gICAgICAgICAgdGhpcy5lbWFpbFRpbWVyRGl2Lm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gYCR7TWF0aC5mbG9vcih0aGlzLmVtYWlsVGltZUxlZnQgLyA2MCl9bTogJHt0aGlzLmVtYWlsVGltZUxlZnQgJSA2MH1zYFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuZW1haWxJbnRlcnZhbClcbiAgICAgICAgdGhpcy5zaG93RW1haWxSZXNlbmRPVFAgPSB0cnVlXG4gICAgICB9XG4gICAgfSwgMTAwMClcbiAgfVxuXG4gIHB1YmxpYyBjaGVja0FmdGVyU3VibWl0KF9lOiBhbnkpIHtcbiAgICAvLyB0aGlzLnJlbmRlclN1YmplY3QubmV4dCgpXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZygnRm9ybSBpcyBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5JylcbiAgICBpZiAodGhpcy5iYXRjaERldGFpbHMuYmF0Y2hBdHRyaWJ1dGVzLnVzZXJQcm9maWxlRmlsZWRzICYmXG4gICAgICB0aGlzLmJhdGNoRGV0YWlscy5iYXRjaEF0dHJpYnV0ZXMudXNlclByb2ZpbGVGaWxlZHMgPT09IFwiQXZhaWxhYmxlIHVzZXIgZmlsbGVkIGlHT1QgcHJvZmlsZVwiKSB7XG4gICAgICB0aGlzLnN1Ym1pdFN1cmV2eSh0cnVlKVxuICAgIH1cbiAgICBpZiAodGhpcy5iYXRjaERldGFpbHMuYmF0Y2hBdHRyaWJ1dGVzLnVzZXJQcm9maWxlRmlsZWRzICYmICF0aGlzLnVwZGF0ZVByb2ZpbGUgJiZcbiAgICAgICh0aGlzLmJhdGNoRGV0YWlscy5iYXRjaEF0dHJpYnV0ZXMudXNlclByb2ZpbGVGaWxlZHMgPT09IFwiRnVsbCBpR09UIHByb2ZpbGVcIiB8fFxuICAgICAgICB0aGlzLmJhdGNoRGV0YWlscy5iYXRjaEF0dHJpYnV0ZXMudXNlclByb2ZpbGVGaWxlZHMgPT09IFwiQ3VzdG9tIGlHT1QgcHJvZmlsZVwiKSkge1xuICAgICAgdGhpcy5zdWJtaXRTdXJldnkodHJ1ZSlcbiAgICB9XG4gICAgdGhpcy5vcGVuU25hY2tiYXIoJ0Zvcm0gaXMgc3VibWl0dGVkIHN1Y2Nlc3NmdWxseScpXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodHJ1ZSlcbiAgfVxuXG4gIGNsb3NlUG9wdXAoKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodHJ1ZSlcbiAgfVxuXG4gIHByaXZhdGUgb3BlblNuYWNrYmFyKHByaW1hcnlNc2c6IHN0cmluZywgZHVyYXRpb246IG51bWJlciA9IDUwMDApIHtcbiAgICB0aGlzLnNuYWNrQmFyLm9wZW4ocHJpbWFyeU1zZywgJ1gnLCB7XG4gICAgICBkdXJhdGlvbixcbiAgICB9KVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5mb3JtSWQgPSBfLmdldCh0aGlzLmRhdGEsICdiYXRjaERhdGEuYmF0Y2hBdHRyaWJ1dGVzLnByb2ZpbGVTdXJ2ZXlJZCcpXG4gICAgdGhpcy5nZXRGb3JtRGV0YWlscygpXG4gICAgdGhpcy5zZXRWYWx1ZUNoYW5nZUZ1bmN0aW9ucygpXG4gICAgdGhpcy5mZXRjaENhZHJlRGF0YSgpXG4gICAgdGhpcy5nZXRHcm91cERhdGEoKVxuICAgIHRoaXMuZ2V0UGVuZGluZ0RldGFpbHMoKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gdGhpcy5sb2FkRGVzaWduYXRpb25zKClcbiAgICAgIHRoaXMuY2hlY2tTZWxlY3RlZE9yZ0hhc0Rlc2lnbmF0aW9ucygpO1xuICAgICAgLy90aGlzLmdldE1hc3RlckRlc2lnbmF0aW9uKClcbiAgICAgIHRoaXMuZ2V0TWFzdGVyTGFuZ3VhZ2UoKVxuICAgIH0sIDUwMClcbiAgfVxuXG4gIGdldEZvcm1EZXRhaWxzKCkge1xuICAgIGlmICh0aGlzLmZvcm1JZCkge1xuICAgICAgdGhpcy5wcm9maWxlVjJTdmMuZ2V0Rm9ybVYyQnlJRCh0aGlzLmZvcm1JZCkuc3Vic2NyaWJlKChyZXNwb25jZTogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXNwb25jZSkge1xuICAgICAgICAgIHRoaXMuZm9ybXNEZXRpbHMgPSBfLmdldChyZXNwb25jZSwgJ3Jlc3VsdC5yZXNwb25zZScsIHt9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHNldFZhbHVlQ2hhbmdlRnVuY3Rpb25zKCkge1xuICAgIGNvbnN0IHNlYXJjaERlc2lnbmF0aW9uQ29udHJvbCA9IHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgnc2VhcmNoRGVzaWduYXRpb24nKVxuICAgIGlmIChzZWFyY2hEZXNpZ25hdGlvbkNvbnRyb2wpIHtcbiAgICAgIGxldCBzZXR0aW5nVmFsdWVDaGFuZ2UgPSB0cnVlXG4gICAgICBzZWFyY2hEZXNpZ25hdGlvbkNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICBzdGFydFdpdGgoJycpLFxuICAgICAgKS5zdWJzY3JpYmUoc2VhcmNoVGV4dCA9PiB7XG4gICAgICAgICAgdGhpcy5kZXNpZ25hdGlvbnNPZmZzZXQgPSAwXG4gICAgICAgICAgaWYgKHNlYXJjaFRleHQgJiYgc2VhcmNoVGV4dC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdGhpcy5kZXNpZ25hdGlvblNlYXJjaFRleHQgPSBzZWFyY2hUZXh0XG4gICAgICAgICAgICB0aGlzLmdldGRlc2lnbmF0aW9uc01ldGEoKVxuICAgICAgICAgIH0gZWxzZSBpZiAoIXNlYXJjaFRleHQpIHtcbiAgICAgICAgICB0aGlzLmRlc2lnbmF0aW9uU2VhcmNoVGV4dCA9IHNlYXJjaFRleHRcbiAgICAgICAgICAgIGlmKCFzZXR0aW5nVmFsdWVDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgdGhpcy5nZXRkZXNpZ25hdGlvbnNNZXRhKCkgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNoZWNrQ3VycmVudERlc2lnbmF0aW9uUHJlc2VudCgpXG4gICAgICAgICAgfVxuICAgICAgICAgIHNldHRpbmdWYWx1ZUNoYW5nZSA9IGZhbHNlXG4gICAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZmV0Y2hDYWRyZURhdGEoKSB7XG4gICAgdGhpcy5hZGRMb2FkZXIgPSB0aGlzLmFkZExvYWRlciArIDFcbiAgICB0aGlzLnByb2ZpbGVWMlN2Yy5mZXRjaENhZHJlKCkuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICB0aGlzLmFkZExvYWRlciA9IHRoaXMuYWRkTG9hZGVyIC0gMVxuICAgICAgdGhpcy5jaXZpbFNlcnZpY2VEYXRhID0gcmVzcG9uc2UucmVzdWx0LnJlc3BvbnNlLnZhbHVlLmNpdmlsU2VydmljZVR5cGVcbiAgICAgIHRoaXMuY2l2aWxTZXJ2aWNlVHlwZXMgPSB0aGlzLmNpdmlsU2VydmljZURhdGEuY2l2aWxTZXJ2aWNlVHlwZUxpc3QubWFwKChzZXJ2aWNlOiBhbnkpID0+IHNlcnZpY2UubmFtZSlcbiAgICB9KVxuICB9XG5cbiAgZ2V0SXNDYWRyZVN0YXR1cyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuaXNDYWRyZVN0YXR1cyA9IHZhbHVlXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgdHlwZU9mQ2l2aWxTZXJ2aWNlOiAnJyxcbiAgICAgICAgc2VydmljZVR5cGU6ICcnLFxuICAgICAgICBjYWRyZU5hbWU6ICcnLFxuICAgICAgICBjYWRyZUJhdGNoOiAnJyxcbiAgICAgICAgY2FkcmVDb250cm9sbGluZ0F1dGhvcml0eTogJycsXG4gICAgICB9KVxuICAgICAgdGhpcy5hZGRWYWxpZGF0b3JzKClcbiAgICB9XG5cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuc2hvd0JhdGNoRm9yTm9DYWRyZSA9IGZhbHNlXG4gICAgICB0aGlzLnJlbW92ZVZhbGlkYXRvcnMoKVxuICAgIH1cbiAgfVxuXG4gIGdldEFsbEVycm9ycygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICBPYmplY3Qua2V5cyh0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBjb250cm9sRXJyb3JzID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNba2V5XS5lcnJvcnM7XG4gICAgICBpZiAoY29udHJvbEVycm9ycykge1xuICAgICAgICBPYmplY3Qua2V5cyhjb250cm9sRXJyb3JzKS5mb3JFYWNoKChlcnJvcktleSkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAoZXJyb3JLZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3JlcXVpcmVkJzpcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKGAke2tleX0gaXMgcmVxdWlyZWQuYCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWlubGVuZ3RoJzpcbiAgICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRMZW5ndGggPSBjb250cm9sRXJyb3JzWydtaW5sZW5ndGgnXS5yZXF1aXJlZExlbmd0aDtcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKGAke2tleX0gbXVzdCBiZSBhdCBsZWFzdCAke3JlcXVpcmVkTGVuZ3RofSBjaGFyYWN0ZXJzIGxvbmcuYCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZW1haWwnOlxuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2VzLnB1c2goYFBsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MuYCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gQWRkIG1vcmUgY2FzZXMgZm9yIG90aGVyIHZhbGlkYXRvcnMgYXMgbmVlZGVkXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZXJyb3JNZXNzYWdlcztcbiAgfVxuXG4gIGFkZFZhbGlkYXRvcnMoKSB7XG4gICAgY29uc3QgZmllbGRDb250cm9sMCA9IHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgnaXNDYWRyZScpXG4gICAgaWYgKGZpZWxkQ29udHJvbDApIHtcbiAgICAgIGZpZWxkQ29udHJvbDAuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgZmllbGRDb250cm9sMC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClcbiAgICB9XG4gICAgY29uc3QgZmllbGRDb250cm9sID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCd0eXBlT2ZDaXZpbFNlcnZpY2UnKVxuICAgIGlmIChmaWVsZENvbnRyb2wpIHtcbiAgICAgIGZpZWxkQ29udHJvbC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XG4gICAgICBmaWVsZENvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpXG4gICAgfVxuICAgIGNvbnN0IGZpZWxkQ29udHJvbDEgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ3NlcnZpY2VUeXBlJylcbiAgICBpZiAoZmllbGRDb250cm9sMSkge1xuICAgICAgZmllbGRDb250cm9sMS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XG4gICAgICBmaWVsZENvbnRyb2wxLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxuICAgIH1cbiAgICBjb25zdCBmaWVsZENvbnRyb2wzID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCdjYWRyZUJhdGNoJylcbiAgICBpZiAoZmllbGRDb250cm9sMykge1xuICAgICAgZmllbGRDb250cm9sMy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XG4gICAgICBmaWVsZENvbnRyb2wzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVZhbGlkYXRvcnMoKSB7XG4gICAgY29uc3QgZmllbGRDb250cm9sID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCd0eXBlT2ZDaXZpbFNlcnZpY2UnKVxuICAgIGlmIChmaWVsZENvbnRyb2wpIHtcbiAgICAgIGZpZWxkQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKVxuICAgICAgZmllbGRDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxuICAgIH1cbiAgICBjb25zdCBmaWVsZENvbnRyb2wxID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCdzZXJ2aWNlVHlwZScpXG4gICAgaWYgKGZpZWxkQ29udHJvbDEpIHtcbiAgICAgIGZpZWxkQ29udHJvbDEuY2xlYXJWYWxpZGF0b3JzKClcbiAgICAgIGZpZWxkQ29udHJvbDEudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpXG4gICAgfVxuICAgIGNvbnN0IGZpZWxkQ29udHJvbDIgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ2NhZHJlTmFtZScpXG4gICAgaWYgKGZpZWxkQ29udHJvbDIpIHtcbiAgICAgIGZpZWxkQ29udHJvbDIuY2xlYXJWYWxpZGF0b3JzKClcbiAgICAgIGZpZWxkQ29udHJvbDIudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpXG4gICAgfVxuICAgIGNvbnN0IGZpZWxkQ29udHJvbDMgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ2NhZHJlQmF0Y2gnKVxuICAgIGlmIChmaWVsZENvbnRyb2wzKSB7XG4gICAgICBmaWVsZENvbnRyb2wzLmNsZWFyVmFsaWRhdG9ycygpXG4gICAgICBmaWVsZENvbnRyb2wzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxuICAgIH1cbiAgfVxuXG4gIGdldFNlcnZpY2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHNlcnZpY2VUeXBlQ29udHJvbCA9IHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgnc2VydmljZVR5cGUnKVxuICAgIGNvbnN0IGNhZHJlQ29udHJvbCA9IHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgnY2FkcmVOYW1lJylcbiAgICBjb25zdCBiYXRjaENvbnRyb2wgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ2NhZHJlQmF0Y2gnKVxuICAgIGNvbnN0IGNhZHJlQ29udHJvbGxpbmdBdXRob3JpdHlDb250cm9sID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCdjYWRyZUNvbnRyb2xsaW5nQXV0aG9yaXR5JylcblxuICAgIGlmIChzZXJ2aWNlVHlwZUNvbnRyb2wpIHsgc2VydmljZVR5cGVDb250cm9sLnJlc2V0KCkgfVxuICAgIGlmIChjYWRyZUNvbnRyb2wpIHsgY2FkcmVDb250cm9sLnJlc2V0KCkgfVxuICAgIGlmIChiYXRjaENvbnRyb2wpIHsgYmF0Y2hDb250cm9sLnJlc2V0KCkgfVxuICAgIGlmIChjYWRyZUNvbnRyb2xsaW5nQXV0aG9yaXR5Q29udHJvbCkgeyBjYWRyZUNvbnRyb2xsaW5nQXV0aG9yaXR5Q29udHJvbC5yZXNldCgpIH1cblxuICAgIHRoaXMuc2VydmljZVR5cGUgPSB0aGlzLmNpdmlsU2VydmljZURhdGEuY2l2aWxTZXJ2aWNlVHlwZUxpc3QuZmluZCgoZWxlbWVudDogYW55KSA9PiBlbGVtZW50Lm5hbWUgPT09IGV2ZW50KVxuICAgIHRoaXMuc2VydmljZVR5cGUgPSB0aGlzLmNpdmlsU2VydmljZURhdGEuY2l2aWxTZXJ2aWNlVHlwZUxpc3QuZmluZCgoZWxlbWVudDogYW55KSA9PiBlbGVtZW50Lm5hbWUgPT09IGV2ZW50KVxuICAgIGlmICh0aGlzLnNlcnZpY2VUeXBlKSB7XG4gICAgICB0aGlzLnNlcnZpY2VMaXN0RGF0YSA9IHRoaXMuc2VydmljZVR5cGUuc2VydmljZUxpc3RcbiAgICAgIHRoaXMuc2VydmljZU5hbWUgPSB0aGlzLnNlcnZpY2VMaXN0RGF0YS5tYXAoKHNlcnZpY2U6IGFueSkgPT4gc2VydmljZS5uYW1lKVxuICAgICAgdGhpcy5zZXJ2aWNlSWQgPSB0aGlzLnNlcnZpY2VUeXBlLmlkXG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJ1NlcnZpY2UgVHlwZSBub3QgZm91bmQnXG4gICAgfVxuICB9XG5cbiAgb25TZXJ2aWNlU2VsZWN0KGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBjYWRyZUNvbnRyb2wgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ2NhZHJlTmFtZScpXG4gICAgY29uc3QgYmF0Y2hDb250cm9sID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCdjYWRyZUJhdGNoJylcbiAgICBjb25zdCBjYWRyZUNvbnRyb2xsaW5nQXV0aG9yaXR5Q29udHJvbCA9IHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgnY2FkcmVDb250cm9sbGluZ0F1dGhvcml0eScpXG4gICAgaWYgKGNhZHJlQ29udHJvbCkgeyBjYWRyZUNvbnRyb2wucmVzZXQoKSB9XG4gICAgaWYgKGJhdGNoQ29udHJvbCkgeyBiYXRjaENvbnRyb2wucmVzZXQoKSB9XG4gICAgaWYgKGNhZHJlQ29udHJvbGxpbmdBdXRob3JpdHlDb250cm9sKSB7IGNhZHJlQ29udHJvbGxpbmdBdXRob3JpdHlDb250cm9sLnJlc2V0KCkgfVxuICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlTmFtZSA9IGV2ZW50LnZhbHVlXG4gICAgaWYgKHRoaXMuc2VydmljZUxpc3REYXRhKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkU2VydmljZSA9IHRoaXMuc2VydmljZUxpc3REYXRhLmZpbmQoKHNlcnZpY2U6IGFueSkgPT4gc2VydmljZS5uYW1lID09PSB0aGlzLnNlbGVjdGVkU2VydmljZU5hbWUpXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5jaXZpbFNlcnZpY2VOYW1lID0gdGhpcy5zZWxlY3RlZFNlcnZpY2UubmFtZVxuICAgICAgICB0aGlzLmNpdmlsU2VydmljZUlkID0gdGhpcy5zZWxlY3RlZFNlcnZpY2UuaWRcbiAgICAgICAgdGhpcy5jYWRyZSA9IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLmNhZHJlTGlzdCA/IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLmNhZHJlTGlzdC5tYXAoKGNhZHJlOiBhbnkpID0+IGNhZHJlLm5hbWUpIDogW11cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRTZXJ2aWNlICYmIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLmNhZHJlQ29udHJvbGxpbmdBdXRob3JpdHkpIHtcbiAgICAgIHRoaXMuY2FkcmVDb250cm9sbGluZ0F1dGhvcml0eSA9IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLmNhZHJlQ29udHJvbGxpbmdBdXRob3JpdHlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYWRyZUNvbnRyb2xsaW5nQXV0aG9yaXR5ID0gJ05BJ1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RlZFNlcnZpY2UgJiYgdGhpcy5zZWxlY3RlZFNlcnZpY2UuY2FkcmVMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zaG93QmF0Y2hGb3JOb0NhZHJlID0gdHJ1ZVxuICAgICAgdGhpcy5zdGFydEJhdGNoID0gdGhpcy5zZWxlY3RlZFNlcnZpY2UuY29tbW9uQmF0Y2hTdGFydFllYXJcbiAgICAgIHRoaXMuZW5kQmF0Y2ggPSB0aGlzLnNlbGVjdGVkU2VydmljZS5jb21tb25CYXRjaEVuZFllYXJcbiAgICAgIHRoaXMuZXhjbHVzaW9uWWVhciA9IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLmNvbW1vbkJhdGNoRXhjbHVzaW9uWWVhckxpc3RcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlXG4gICAgICB0aGlzLnllYXJBcnJheSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMuZW5kQmF0Y2ggLSB0aGlzLnN0YXJ0QmF0Y2ggKyAxIH0sIChfLCBpbmRleCkgPT4gdGhpcy5zdGFydEJhdGNoICsgaW5kZXgpXG4gICAgICAgIC5maWx0ZXIoeWVhciA9PiAhdGhpcy5leGNsdXNpb25ZZWFyLmluY2x1ZGVzKHllYXIpKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dCYXRjaEZvck5vQ2FkcmUgPSBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIG9uQ2FkcmVTZWxlY3QoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGJhdGNoQ29udHJvbCA9IHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgnY2FkcmVCYXRjaCcpXG4gICAgY29uc3QgY2FkcmVDb250cm9sbGluZ0F1dGhvcml0eUNvbnRyb2wgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ2NhZHJlQ29udHJvbGxpbmdBdXRob3JpdHknKVxuXG4gICAgaWYgKGJhdGNoQ29udHJvbCkgeyBiYXRjaENvbnRyb2wucmVzZXQoKSB9XG4gICAgaWYgKGNhZHJlQ29udHJvbGxpbmdBdXRob3JpdHlDb250cm9sKSB7IGNhZHJlQ29udHJvbGxpbmdBdXRob3JpdHlDb250cm9sLnJlc2V0KCkgfVxuICAgIHRoaXMuc2VsZWN0ZWRDYWRyZU5hbWUgPSBldmVudFxuICAgIGlmICh0aGlzLnNlbGVjdGVkU2VydmljZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZENhZHJlID0gdGhpcy5zZWxlY3RlZFNlcnZpY2UuY2FkcmVMaXN0LmZpbmQoKGNhZHJlOiBhbnkpID0+IGNhZHJlLm5hbWUgPT09IHRoaXMuc2VsZWN0ZWRDYWRyZU5hbWUpXG4gICAgICB0aGlzLnN0YXJ0QmF0Y2ggPSB0aGlzLnNlbGVjdGVkQ2FkcmUgPyB0aGlzLnNlbGVjdGVkQ2FkcmUuc3RhcnRCYXRjaFllYXIgOiAnJ1xuICAgICAgdGhpcy5lbmRCYXRjaCA9IHRoaXMuc2VsZWN0ZWRDYWRyZSA/IHRoaXMuc2VsZWN0ZWRDYWRyZS5lbmRCYXRjaFllYXIgOiAnJ1xuICAgICAgdGhpcy5leGNsdXNpb25ZZWFyID0gdGhpcy5zZWxlY3RlZENhZHJlID8gdGhpcy5zZWxlY3RlZENhZHJlLmV4Y3Vsc2lvblllYXJMaXN0IDogJydcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlXG4gICAgICB0aGlzLnllYXJBcnJheSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMuZW5kQmF0Y2ggLSB0aGlzLnN0YXJ0QmF0Y2ggKyAxIH0sIChfLCBpbmRleCkgPT4gdGhpcy5zdGFydEJhdGNoICsgaW5kZXgpXG4gICAgICAgIC5maWx0ZXIoeWVhciA9PiAhdGhpcy5leGNsdXNpb25ZZWFyLmluY2x1ZGVzKHllYXIpKVxuICAgICAgdGhpcy5jYWRyZUlkID0gdGhpcy5zZWxlY3RlZENhZHJlID8gdGhpcy5zZWxlY3RlZENhZHJlLmlkIDogJydcbiAgICB9XG5cbiAgfVxuXG4gIGdldFBlbmRpbmdEZXRhaWxzKCkge1xuICAgIHRoaXMuYWRkTG9hZGVyID0gdGhpcy5hZGRMb2FkZXIgKyAxXG4gICAgdGhpcy5wcm9maWxlVjJTdmMuZmV0Y2hBcHByb3ZhbERldGFpbHMoKS5zdWJzY3JpYmUoKHJlc3A6IGFueSkgPT4ge1xuICAgICAgdGhpcy5hZGRMb2FkZXIgPSB0aGlzLmFkZExvYWRlciAtIDFcbiAgICAgIGlmIChyZXNwICYmIHJlc3AucmVzdWx0ICYmIHJlc3AucmVzdWx0LmRhdGEpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nRmlsZWRzID0gcmVzcC5yZXN1bHQuZGF0YVxuICAgICAgICBpZiAodGhpcy5wZW5kaW5nRmlsZWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdGaWxlZHMuZm9yRWFjaCgodXNlcjogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAodXNlclsnZ3JvdXAnXSkge1xuICAgICAgICAgICAgICBsZXQgY3RybCA9IHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgnZ3JvdXAnKVxuICAgICAgICAgICAgICBpZiAoY3RybCkge1xuICAgICAgICAgICAgICAgIGN0cmwucGF0Y2hWYWx1ZSh7IGdyb3VwOiB1c2VyWydncm91cCddIH0pXG4gICAgICAgICAgICAgICAgdGhpcy5wR3JvdXAgPSB1c2VyWydncm91cCddXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1c2VyWydkZXNpZ25hdGlvbiddKSB7XG4gICAgICAgICAgICAgIGxldCBjdHJsID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCdkZXNpZ25hdGlvbicpXG4gICAgICAgICAgICAgIGlmIChjdHJsKSB7XG4gICAgICAgICAgICAgICAgY3RybC5wYXRjaFZhbHVlKHsgZGVzaWduYXRpb246IHVzZXJbJ2Rlc2lnbmF0aW9uJ10gfSlcbiAgICAgICAgICAgICAgICB0aGlzLnBEZXNpZ25hdGlvbiA9IHVzZXJbJ2Rlc2lnbmF0aW9uJ11cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcbiAgICAgIHRoaXMuZGVmaW5lRm9ybUF0dHJpYnV0ZXMoKVxuICAgIH0sIGVycm9yID0+IHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICAgIHRoaXMuYWRkTG9hZGVyID0gdGhpcy5hZGRMb2FkZXIgLSAxXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXG4gICAgfSlcbiAgfVxuXG4gIGRlZmluZUZvcm1BdHRyaWJ1dGVzKCkge1xuICAgIGlmICh0aGlzLmJhdGNoRGV0YWlscy5iYXRjaEF0dHJpYnV0ZXMudXNlclByb2ZpbGVGaWxlZHMgJiZcbiAgICAgIHRoaXMuYmF0Y2hEZXRhaWxzLmJhdGNoQXR0cmlidXRlcy5icEVucm9sTWFuZGF0b3J5UHJvZmlsZUZpZWxkcykge1xuICAgICAgbGV0IGN1c3RvbUF0dHIgPSB0aGlzLmJhdGNoRGV0YWlscy5iYXRjaEF0dHJpYnV0ZXMuYnBFbnJvbE1hbmRhdG9yeVByb2ZpbGVGaWVsZHNcbiAgICAgIGNvbnNvbGUubG9nKFwiY3VzdG9tQXR0ciBcIiwgY3VzdG9tQXR0cilcbiAgICAgIGlmICh0aGlzLmZpbmRBdHRyKGN1c3RvbUF0dHIsICduYW1lJykpIHtcbiAgICAgICAgdGhpcy5jYW5TaG93TmFtZSA9IHRydWVcbiAgICAgICAgdGhpcy5zaG93bmFtZSA9IHRydWVcbiAgICAgICAgY29uc3QgZmllbGRDb250cm9sID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCduYW1lJylcbiAgICAgICAgaWYgKGZpZWxkQ29udHJvbCkge1xuICAgICAgICAgIGZpZWxkQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlscy5maXJzdG5hbWUpXG4gICAgICAgICAgZmllbGRDb250cm9sLmRpc2FibGUoKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb2ZpbGVGb3JtVHlwZSA9PT0gJ0F2YWlsYWJsZSB1c2VyIGZpbGxlZCBpR09UIHByb2ZpbGUnICYmXG4gICAgICAgICAgIXRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmZpcnN0bmFtZVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmNhblNob3dOYW1lID0gZmFsc2VcbiAgICAgICAgICB0aGlzLnNob3duYW1lID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5maW5kQXR0cihjdXN0b21BdHRyLCAnZW1haWwnKSkge1xuICAgICAgICB0aGlzLmNhblNob3dFbWFpbCA9IHRydWVcbiAgICAgICAgY29uc3QgZmllbGRDb250cm9sID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCdwcmltYXJ5RW1haWwnKVxuICAgICAgICBpZiAoZmllbGRDb250cm9sKSB7XG4gICAgICAgICAgZmllbGRDb250cm9sLnNldFZhbHVlKHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLnByaW1hcnlFbWFpbClcbiAgICAgICAgICBpZiAodGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMucHJpbWFyeUVtYWlsKSB7XG4gICAgICAgICAgICBmaWVsZENvbnRyb2wuc2V0VmFsdWUodGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMucHJpbWFyeUVtYWlsKVxuICAgICAgICAgICAgdGhpcy5lVmVyaWZpZWQgPSB0cnVlXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByb2ZpbGVGb3JtVHlwZSA9PT0gJ0F2YWlsYWJsZSB1c2VyIGZpbGxlZCBpR09UIHByb2ZpbGUnKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dFbWFpbCA9IGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0VtYWlsID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lVmVyaWZpZWQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmZpbmRBdHRyKGN1c3RvbUF0dHIsICdvcmdhbmlzYXRpb24nKSkge1xuICAgICAgICB0aGlzLmNhblNob3dPcmcgPSB0cnVlXG4gICAgICAgIHRoaXMuc2hvd09yZyA9IHRydWVcbiAgICAgICAgY29uc3QgZmllbGRDb250cm9sID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCdvcmdhbmlzYXRpb24nKVxuICAgICAgICBpZiAoZmllbGRDb250cm9sKSB7XG4gICAgICAgICAgZmllbGRDb250cm9sLnNldFZhbHVlKHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuZW1wbG95bWVudERldGFpbHMuZGVwYXJ0bWVudE5hbWUpXG4gICAgICAgICAgZmllbGRDb250cm9sLmRpc2FibGUoKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb2ZpbGVGb3JtVHlwZSA9PT0gJ0F2YWlsYWJsZSB1c2VyIGZpbGxlZCBpR09UIHByb2ZpbGUnICYmXG4gICAgICAgICAgIXRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuZW1wbG95bWVudERldGFpbHMuZGVwYXJ0bWVudE5hbWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5jYW5TaG93T3JnID0gZmFsc2VcbiAgICAgICAgICB0aGlzLnNob3dPcmcgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmZpbmRBdHRyKGN1c3RvbUF0dHIsICdncm91cCcpKSB7XG4gICAgICAgIHRoaXMuY2FuU2hvd0dyb3VwID0gdHJ1ZVxuICAgICAgICB0aGlzLnNob3dHcm91cCA9IHRydWVcbiAgICAgICAgY29uc3QgZmllbGRDb250cm9sID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCdncm91cCcpXG4gICAgICAgIGlmIChmaWVsZENvbnRyb2wpIHtcbiAgICAgICAgICBpZiAodGhpcy5wR3JvdXApIHtcbiAgICAgICAgICAgIGZpZWxkQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnBHcm91cClcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLnByb2ZpbGVGb3JtVHlwZSA9PT0gJ0F2YWlsYWJsZSB1c2VyIGZpbGxlZCBpR09UIHByb2ZpbGUnKSB7XG4gICAgICAgICAgICAvLyAgIHRoaXMuY2FuU2hvd0dyb3VwID0gdHJ1ZVxuICAgICAgICAgICAgLy8gICB0aGlzLnNob3dHcm91cCA9IHRydWVcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucHJvZmVzc2lvbmFsRGV0YWlscyAmJlxuICAgICAgICAgICAgICB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLnByb2Zlc3Npb25hbERldGFpbHMubGVuZ3RoICYmXG4gICAgICAgICAgICAgIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucHJvZmVzc2lvbmFsRGV0YWlsc1swXS5ncm91cFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLnByb2Zlc3Npb25hbERldGFpbHNbMF0uZ3JvdXApXG4gICAgICAgICAgICAgIC8vIGlmICh0aGlzLnByb2ZpbGVGb3JtVHlwZSA9PT0gJ0F2YWlsYWJsZSB1c2VyIGZpbGxlZCBpR09UIHByb2ZpbGUnKSB7XG4gICAgICAgICAgICAgIC8vICAgdGhpcy5jYW5TaG93R3JvdXAgPSBmYWxzZVxuICAgICAgICAgICAgICAvLyAgIHRoaXMuc2hvd0dyb3VwID0gZmFsc2VcbiAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZENvbnRyb2wuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXG4gICAgICAgICAgZmllbGRDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5maW5kQXR0cihjdXN0b21BdHRyLCAnZGVzaWduYXRpb24nKSkge1xuICAgICAgICB0aGlzLmNhblNob3dEZXNpZ25hdGlvbiA9IHRydWVcbiAgICAgICAgdGhpcy5zaG93RGVzaWduYXRpb24gPSB0cnVlXG4gICAgICAgIGNvbnN0IGZpZWxkQ29udHJvbCA9IHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgnZGVzaWduYXRpb24nKVxuICAgICAgICBpZiAoZmllbGRDb250cm9sKSB7XG4gICAgICAgICAgaWYgKHRoaXMucERlc2lnbmF0aW9uKSB7XG4gICAgICAgICAgICBmaWVsZENvbnRyb2wucGF0Y2hWYWx1ZSh0aGlzLnBEZXNpZ25hdGlvbilcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLnByb2ZpbGVGb3JtVHlwZSA9PT0gJ0F2YWlsYWJsZSB1c2VyIGZpbGxlZCBpR09UIHByb2ZpbGUnKSB7XG4gICAgICAgICAgICAvLyAgIHRoaXMuY2FuU2hvd0Rlc2lnbmF0aW9uID0gdHJ1ZVxuICAgICAgICAgICAgLy8gICB0aGlzLnNob3dEZXNpZ25hdGlvbiA9IHRydWVcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucHJvZmVzc2lvbmFsRGV0YWlscyAmJlxuICAgICAgICAgICAgICB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLnByb2Zlc3Npb25hbERldGFpbHMubGVuZ3RoICYmXG4gICAgICAgICAgICAgIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucHJvZmVzc2lvbmFsRGV0YWlsc1swXS5kZXNpZ25hdGlvbikge1xuICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucGF0Y2hWYWx1ZSh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLnByb2Zlc3Npb25hbERldGFpbHNbMF0uZGVzaWduYXRpb24pXG4gICAgICAgICAgICAgIC8vIGlmICh0aGlzLnByb2ZpbGVGb3JtVHlwZSA9PT0gJ0F2YWlsYWJsZSB1c2VyIGZpbGxlZCBpR09UIHByb2ZpbGUnKSB7XG4gICAgICAgICAgICAgIC8vICAgdGhpcy5jYW5TaG93RGVzaWduYXRpb24gPSBmYWxzZVxuICAgICAgICAgICAgICAvLyAgIHRoaXMuc2hvd0Rlc2lnbmF0aW9uID0gZmFsc2VcbiAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZENvbnRyb2wuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXG4gICAgICAgICAgZmllbGRDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5maW5kQXR0cihjdXN0b21BdHRyLCAnZW1wbG95ZWVDb2RlJykpIHtcbiAgICAgICAgdGhpcy5jYW5TaG93RW1wbG95ZWVDb2RlID0gdHJ1ZVxuICAgICAgICBjb25zdCBjb250cmwgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ2VtcGxveWVlQ29kZScpXG4gICAgICAgIGlmIChjb250cmwpIHtcbiAgICAgICAgICBpZiAodGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5lbXBsb3ltZW50RGV0YWlscy5lbXBsb3llZUNvZGUpIHtcbiAgICAgICAgICAgIGNvbnRybC5zZXRWYWx1ZSh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLmVtcGxveW1lbnREZXRhaWxzLmVtcGxveWVlQ29kZSlcbiAgICAgICAgICAgIGNvbnRybC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLnBhdHRlcm4oRU1QX0lEX1BBVFRFUk4pXSlcbiAgICAgICAgICAgIGNvbnRybC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJvZmlsZUZvcm1UeXBlID09PSAnQXZhaWxhYmxlIHVzZXIgZmlsbGVkIGlHT1QgcHJvZmlsZScpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuU2hvd0VtcGxveWVlQ29kZSA9IGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0VtcGxveWVlQ29kZSA9IHRydWVcbiAgICAgICAgICAgIGNvbnRybC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLnBhdHRlcm4oRU1QX0lEX1BBVFRFUk4pXSk7XG4gICAgICAgICAgICBjb250cmwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmZpbmRBdHRyKGN1c3RvbUF0dHIsICdtb2JpbGUnKSkge1xuICAgICAgICB0aGlzLmNhbnNob3dNb2JpbGUgPSB0cnVlXG4gICAgICAgIGNvbnN0IGNvbnRybCA9IHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgnbW9iaWxlJylcbiAgICAgICAgaWYgKGNvbnRybCkge1xuICAgICAgICAgIGlmICh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlscy5tb2JpbGUgJiYgdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMucGhvbmVWZXJpZmllZCkge1xuICAgICAgICAgICAgY29udHJsLnNldFZhbHVlKHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLm1vYmlsZSlcbiAgICAgICAgICAgIHRoaXMubVZlcmlmaWVkID0gdHJ1ZVxuICAgICAgICAgICAgY29udHJsLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMubWluTGVuZ3RoKDEwKSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTApLCBWYWxpZGF0b3JzLnBhdHRlcm4oTU9CSUxFX1BBVFRFUk4pXSk7XG4gICAgICAgICAgICBjb250cmwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByb2ZpbGVGb3JtVHlwZSA9PT0gJ0F2YWlsYWJsZSB1c2VyIGZpbGxlZCBpR09UIHByb2ZpbGUnKSB7XG4gICAgICAgICAgICB0aGlzLmNhbnNob3dNb2JpbGUgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5tVmVyaWZpZWQgPSB0cnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd01vYmlsZSA9IHRydWVcbiAgICAgICAgICAgIGNvbnRybC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLm1pbkxlbmd0aCgxMCksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwKSwgVmFsaWRhdG9ycy5wYXR0ZXJuKE1PQklMRV9QQVRURVJOKV0pO1xuICAgICAgICAgICAgY29udHJsLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jYW5zaG93TW9iaWxlID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLm1WZXJpZmllZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZmluZEF0dHIoY3VzdG9tQXR0ciwgJ2dlbmRlcicpKSB7XG4gICAgICAgIHRoaXMuY2FuU2hvd0dlbmRlciA9IHRydWVcbiAgICAgICAgY29uc3QgY29udHJsID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCdnZW5kZXInKVxuICAgICAgICBpZiAoY29udHJsKSB7XG4gICAgICAgICAgaWYgKHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmdlbmRlcikge1xuICAgICAgICAgICAgY29udHJsLnNldFZhbHVlKHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmdlbmRlcilcbiAgICAgICAgICAgIGNvbnRybC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSlcbiAgICAgICAgICAgIGNvbnRybC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJvZmlsZUZvcm1UeXBlID09PSAnQXZhaWxhYmxlIHVzZXIgZmlsbGVkIGlHT1QgcHJvZmlsZScpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuU2hvd0dlbmRlciA9IGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0dlbmRlciA9IHRydWVcbiAgICAgICAgICAgIGNvbnRybC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSlcbiAgICAgICAgICAgIGNvbnRybC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZmluZEF0dHIoY3VzdG9tQXR0ciwgJ2RvYicpKSB7XG4gICAgICAgIHRoaXMuY2FuU2hvd0RvYiA9IHRydWVcbiAgICAgICAgY29uc3QgY29udHJsID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCdkb2InKVxuICAgICAgICBpZiAoY29udHJsKSB7XG4gICAgICAgICAgaWYgKHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmRvYikge1xuICAgICAgICAgICAgbGV0IF9kb2I6IGFueSA9IHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmRvYlxuICAgICAgICAgICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gX2RvYi5zcGxpdCgnLScpXG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoTnVtYmVyKHllYXIpLCBOdW1iZXIobW9udGgpIC0gMSwgTnVtYmVyKGRheSkpXG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXkgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJylcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZE1vbnRoID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJylcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbmV3IERhdGUoYCR7Zm9ybWF0dGVkWWVhcn0tJHtmb3JtYXR0ZWRNb250aH0tJHtmb3JtYXR0ZWREYXl9YClcbiAgICAgICAgICAgIGNvbnRybC5zZXRWYWx1ZSh0aGlzLnNlbGVjdGVkRGF0ZSlcbiAgICAgICAgICAgIGNvbnRybC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSlcbiAgICAgICAgICAgIGNvbnRybC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJvZmlsZUZvcm1UeXBlID09PSAnQXZhaWxhYmxlIHVzZXIgZmlsbGVkIGlHT1QgcHJvZmlsZScpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuU2hvd0RvYiA9IGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0RvYiA9IHRydWVcbiAgICAgICAgICAgIGNvbnRybC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSlcbiAgICAgICAgICAgIGNvbnRybC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZmluZEF0dHIoY3VzdG9tQXR0ciwgJ2RvbWljaWxlTWVkaXVtJykpIHtcbiAgICAgICAgdGhpcy5jYW5TaG93RG9taWNpbGVNZWRpdW0gPSB0cnVlXG4gICAgICAgIGNvbnN0IGNvbnRybCA9IHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgnZG9taWNpbGVNZWRpdW0nKVxuICAgICAgICBpZiAoY29udHJsKSB7XG4gICAgICAgICAgaWYgKHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmRvbWljaWxlTWVkaXVtKSB7XG4gICAgICAgICAgICBjb250cmwuc2V0VmFsdWUodGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMuZG9taWNpbGVNZWRpdW0pXG4gICAgICAgICAgICBjb250cmwuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXG4gICAgICAgICAgICBjb250cmwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByb2ZpbGVGb3JtVHlwZSA9PT0gJ0F2YWlsYWJsZSB1c2VyIGZpbGxlZCBpR09UIHByb2ZpbGUnKSB7XG4gICAgICAgICAgICB0aGlzLmNhblNob3dEb21pY2lsZU1lZGl1bSA9IGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0RlY2ltYWxNZWRpdW0gPSB0cnVlXG4gICAgICAgICAgICBjb250cmwuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXG4gICAgICAgICAgICBjb250cmwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmZpbmRBdHRyKGN1c3RvbUF0dHIsICdjYXRlZ29yeScpKSB7XG4gICAgICAgIHRoaXMuY2FuU2hvd0NhdGVnb3J5ID0gdHJ1ZVxuICAgICAgICBjb25zdCBjb250cmwgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ2NhdGVnb3J5JylcbiAgICAgICAgaWYgKGNvbnRybCkge1xuICAgICAgICAgIGlmICh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlscy5jYXRlZ29yeSkge1xuICAgICAgICAgICAgY29udHJsLnNldFZhbHVlKHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmNhdGVnb3J5KVxuICAgICAgICAgICAgY29udHJsLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKVxuICAgICAgICAgICAgY29udHJsLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcm9maWxlRm9ybVR5cGUgPT09ICdBdmFpbGFibGUgdXNlciBmaWxsZWQgaUdPVCBwcm9maWxlJykge1xuICAgICAgICAgICAgdGhpcy5jYW5TaG93Q2F0ZWdvcnkgPSBmYWxzZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNob3dDYXRlZ29yeSA9IHRydWVcbiAgICAgICAgICAgIGNvbnRybC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSlcbiAgICAgICAgICAgIGNvbnRybC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZmluZEF0dHIoY3VzdG9tQXR0ciwgJ3BpbkNvZGUnKSkge1xuICAgICAgICB0aGlzLmNhblNob3dwaW5Db2RlID0gdHJ1ZVxuICAgICAgICBjb25zdCBjb250cmwgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ3BpbkNvZGUnKVxuICAgICAgICBpZiAoY29udHJsKSB7XG4gICAgICAgICAgaWYgKHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuZW1wbG95bWVudERldGFpbHMucGluQ29kZSkge1xuICAgICAgICAgICAgY29udHJsLnNldFZhbHVlKHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuZW1wbG95bWVudERldGFpbHMucGluQ29kZSlcbiAgICAgICAgICAgIGNvbnRybC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCg2KSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNiksIFZhbGlkYXRvcnMucGF0dGVybihQSU5fQ09ERV9QQVRURVJOKV0pXG4gICAgICAgICAgICBjb250cmwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByb2ZpbGVGb3JtVHlwZSA9PT0gJ0F2YWlsYWJsZSB1c2VyIGZpbGxlZCBpR09UIHByb2ZpbGUnKSB7XG4gICAgICAgICAgICB0aGlzLmNhblNob3dwaW5Db2RlID0gZmFsc2VcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG93UGluQ29kZSA9IHRydWVcbiAgICAgICAgICAgIGNvbnRybC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCg2KSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNiksIFZhbGlkYXRvcnMucGF0dGVybihQSU5fQ09ERV9QQVRURVJOKV0pXG4gICAgICAgICAgICBjb250cmwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmZpbmRBdHRyKGN1c3RvbUF0dHIsICdjYWRyZURldGFpbHMnKSkge1xuICAgICAgICB0aGlzLmNhblNob3dzaG93Q2FkcmVEZXRhaWxzID0gdHJ1ZVxuICAgICAgICBjb25zdCBjb250cmwgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ2lzQ2FkcmUnKVxuICAgICAgICBpZiAoY29udHJsKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzKS5pbmNsdWRlcygnaXNDYWRyZScpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMuaXNDYWRyZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBjb250cmwuc2V0VmFsdWUodHJ1ZSlcbiAgICAgICAgICAgICAgdGhpcy5pc0NhZHJlU3RhdHVzID0gdHJ1ZVxuICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VJZCA9IHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuY2FkcmVEZXRhaWxzLmNpdmlsU2VydmljZVR5cGVJZFxuICAgICAgICAgICAgICB0aGlzLmNpdmlsU2VydmljZUlkID0gdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMuY2l2aWxTZXJ2aWNlSWRcbiAgICAgICAgICAgICAgdGhpcy5jYWRyZUlkID0gdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMuY2FkcmVJZFxuICAgICAgICAgICAgICB0aGlzLmNhZHJlQ29udHJvbGxpbmdBdXRob3JpdHkgPSB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLmNhZHJlRGV0YWlscy5jYWRyZUNvbnRyb2xsaW5nQXV0aG9yaXR5TmFtZVxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldFNlcnZpY2UodGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMuY2l2aWxTZXJ2aWNlVHlwZSlcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VydmljZVNlbGVjdCh7IHZhbHVlOiB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLmNhZHJlRGV0YWlscy5jaXZpbFNlcnZpY2VOYW1lIH0pXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuY2FkcmVEZXRhaWxzLmNhZHJlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5vbkNhZHJlU2VsZWN0KHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuY2FkcmVEZXRhaWxzLmNhZHJlTmFtZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlT2ZDaXZpbFNlcnZpY2U6IHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuY2FkcmVEZXRhaWxzLmNpdmlsU2VydmljZVR5cGUsXG4gICAgICAgICAgICAgICAgICBzZXJ2aWNlVHlwZTogdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMuY2l2aWxTZXJ2aWNlTmFtZSxcbiAgICAgICAgICAgICAgICAgIGNhZHJlTmFtZTogdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMuY2FkcmVOYW1lLFxuICAgICAgICAgICAgICAgICAgY2FkcmVCYXRjaDogdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMuY2FkcmVCYXRjaCxcbiAgICAgICAgICAgICAgICAgIGNhZHJlQ29udHJvbGxpbmdBdXRob3JpdHk6IHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuY2FkcmVEZXRhaWxzLmNhZHJlQ29udHJvbGxpbmdBdXRob3JpdHlOYW1lLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH0sIDEwMDApXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb250cmwuc2V0VmFsdWUoZmFsc2UpXG4gICAgICAgICAgICAgIHRoaXMuaXNDYWRyZVN0YXR1cyA9IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByb2ZpbGVGb3JtVHlwZSA9PT0gJ0F2YWlsYWJsZSB1c2VyIGZpbGxlZCBpR09UIHByb2ZpbGUnKSB7XG4gICAgICAgICAgICB0aGlzLmNhblNob3dzaG93Q2FkcmVEZXRhaWxzID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuaXNDYWRyZVN0YXR1cyA9IGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRybC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSlcbiAgICAgICAgICAgIGNvbnRybC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmaW5kQXR0cihjdXN0b21BdHRyOiBhbnksIGZOYW1lOiBhbnkpIHtcbiAgICBpZiAoZk5hbWUgPT09ICduYW1lJykge1xuICAgICAgcmV0dXJuIGN1c3RvbUF0dHIuZmluZCgoX2ZpZWxkOiBhbnkpID0+IF9maWVsZC5maWVsZCA9PT0gJ3Byb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlscy5maXJzdG5hbWUnKVxuICAgIH1cbiAgICBpZiAoZk5hbWUgPT09ICdlbWFpbCcpIHtcbiAgICAgIHJldHVybiBjdXN0b21BdHRyLmZpbmQoKF9maWVsZDogYW55KSA9PiBfZmllbGQuZmllbGQgPT09ICdwcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMucHJpbWFyeUVtYWlsJylcbiAgICB9XG4gICAgaWYgKGZOYW1lID09PSAnb3JnYW5pc2F0aW9uJykge1xuICAgICAgcmV0dXJuIGN1c3RvbUF0dHIuZmluZCgoX2ZpZWxkOiBhbnkpID0+IF9maWVsZC5maWVsZCA9PT0gJ3Byb2ZpbGVEZXRhaWxzLmVtcGxveW1lbnREZXRhaWxzLmRlcGFydG1lbnROYW1lJylcbiAgICB9XG4gICAgaWYgKGZOYW1lID09PSAnZ3JvdXAnKSB7XG4gICAgICByZXR1cm4gY3VzdG9tQXR0ci5maW5kKChfZmllbGQ6IGFueSkgPT4gX2ZpZWxkLmZpZWxkID09PSAncHJvZmlsZURldGFpbHMucHJvZmVzc2lvbmFsRGV0YWlscy5ncm91cCcpXG4gICAgfVxuICAgIGlmIChmTmFtZSA9PT0gJ2Rlc2lnbmF0aW9uJykge1xuICAgICAgcmV0dXJuIGN1c3RvbUF0dHIuZmluZCgoX2ZpZWxkOiBhbnkpID0+IF9maWVsZC5maWVsZCA9PT0gJ3Byb2ZpbGVEZXRhaWxzLnByb2Zlc3Npb25hbERldGFpbHMuZGVzaWduYXRpb24nKVxuICAgIH1cbiAgICBpZiAoZk5hbWUgPT09ICdlbXBsb3llZUNvZGUnKSB7XG4gICAgICByZXR1cm4gY3VzdG9tQXR0ci5maW5kKChfZmllbGQ6IGFueSkgPT4gX2ZpZWxkLmZpZWxkID09PSAncHJvZmlsZURldGFpbHMuZW1wbG95bWVudERldGFpbHMuZW1wbG95ZWVDb2RlJylcbiAgICB9XG4gICAgaWYgKGZOYW1lID09PSAnbW9iaWxlJykge1xuICAgICAgcmV0dXJuIGN1c3RvbUF0dHIuZmluZCgoX2ZpZWxkOiBhbnkpID0+IF9maWVsZC5maWVsZCA9PT0gJ3Byb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlscy5tb2JpbGUnKVxuICAgIH1cbiAgICBpZiAoZk5hbWUgPT09ICdnZW5kZXInKSB7XG4gICAgICByZXR1cm4gY3VzdG9tQXR0ci5maW5kKChfZmllbGQ6IGFueSkgPT4gX2ZpZWxkLmZpZWxkID09PSAncHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmdlbmRlcicpXG4gICAgfVxuICAgIGlmIChmTmFtZSA9PT0gJ2RvYicpIHtcbiAgICAgIHJldHVybiBjdXN0b21BdHRyLmZpbmQoKF9maWVsZDogYW55KSA9PiBfZmllbGQuZmllbGQgPT09ICdwcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMuZG9iJylcbiAgICB9XG4gICAgaWYgKGZOYW1lID09PSAnZG9taWNpbGVNZWRpdW0nKSB7XG4gICAgICByZXR1cm4gY3VzdG9tQXR0ci5maW5kKChfZmllbGQ6IGFueSkgPT4gX2ZpZWxkLmZpZWxkID09PSAncHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmRvbWljaWxlTWVkaXVtJylcbiAgICB9XG4gICAgaWYgKGZOYW1lID09PSAnY2F0ZWdvcnknKSB7XG4gICAgICByZXR1cm4gY3VzdG9tQXR0ci5maW5kKChfZmllbGQ6IGFueSkgPT4gX2ZpZWxkLmZpZWxkID09PSAncHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmNhdGVnb3J5JylcbiAgICB9XG4gICAgaWYgKGZOYW1lID09PSAncGluQ29kZScpIHtcbiAgICAgIHJldHVybiBjdXN0b21BdHRyLmZpbmQoKF9maWVsZDogYW55KSA9PiBfZmllbGQuZmllbGQgPT09ICdwcm9maWxlRGV0YWlscy5lbXBsb3ltZW50RGV0YWlscy5waW5Db2RlJylcbiAgICB9XG4gICAgaWYgKGZOYW1lID09PSAnY2FkcmVEZXRhaWxzJykge1xuICAgICAgcmV0dXJuIGN1c3RvbUF0dHIuZmluZCgoX2ZpZWxkOiBhbnkpID0+IF9maWVsZC5maWVsZCA9PT0gJ3Byb2ZpbGVEZXRhaWxzLmNhZHJlRGV0YWlscy5jaXZpbFNlcnZpY2VUeXBlJylcbiAgICB9XG5cbiAgfVxuXG4gIGZpbmRJblByb2ZpbGUoYXR0cjogc3RyaW5nKSB7XG4gICAgaWYgKGF0dHIgPT09ICduYW1lJykge1xuICAgICAgcmV0dXJuIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmZpcnN0TmFtZSB8fCB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlscy5maXJzdG5hbWVcbiAgICB9XG4gICAgaWYgKGF0dHIgPT09ICdncm91cCcpIHtcbiAgICAgIHJldHVybiAoIXRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucHJvZmlsZUdyb3VwU3RhdHVzKSB8fFxuICAgICAgICB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLnByb2ZpbGVHcm91cFN0YXR1cyA9PT0gJ05PVC1WRVJJRklFRCcgfHwgKHRoaXMucEdyb3VwID8gdHJ1ZSA6IGZhbHNlKVxuICAgIH1cbiAgICBpZiAoYXR0ciA9PT0gJ2Rlc2lnbmF0aW9uJykge1xuICAgICAgcmV0dXJuICghdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wcm9maWxlRGVzaWduYXRpb25TdGF0dXMpIHx8XG4gICAgICAgIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucHJvZmlsZURlc2lnbmF0aW9uU3RhdHVzID09PSAnTk9ULVZFUklGSUVEJyB8fCAodGhpcy5wRGVzaWduYXRpb24gPyB0cnVlIDogZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgZ2V0R3JvdXBEYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkTG9hZGVyID0gdGhpcy5hZGRMb2FkZXIgKyAxXG4gICAgdGhpcy51c2VyUHJvZmlsZVNlcnZpY2UuZ2V0R3JvdXBzKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3lTdWJqZWN0JCkpXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFkZExvYWRlciA9IHRoaXMuYWRkTG9hZGVyIC0gMVxuICAgICAgICB0aGlzLmdyb3VwRGF0YSA9IHJlcy5yZXN1bHQgJiYgcmVzLnJlc3VsdC5yZXNwb25zZS5maWx0ZXIoKGVsZTogYW55KSA9PiBlbGUgIT09ICdPdGhlcnMnKVxuICAgICAgfSwgKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLmFkZExvYWRlciA9IHRoaXMuYWRkTG9hZGVyIC0gMVxuICAgICAgICBpZiAoIWVycm9yLm9rKSB7XG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKHRoaXMuaGFuZGxlVHJhbnNsYXRlVG8oJ2dyb3VwRGF0YUZhaWxlJykpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gIH1cblxuICBoYW5kbGVUcmFuc2xhdGVUbyhtZW51TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy51c2VyUHJvZmlsZVNlcnZpY2UuaGFuZGxlVHJhbnNsYXRlVG8obWVudU5hbWUpXG4gIH1cblxuICBjaGVja1NlbGVjdGVkT3JnSGFzRGVzaWduYXRpb25zKCk6IHZvaWQge1xuICAgIGlmKHRoaXMub3JnYW5pc2F0aW9uSWQpIHtcbiAgICAgIGNvbnN0IGlnb3REZXNpZ25hdGlvbkJvZHk6IGFueSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgIHN0YXR1czogJ0xpdmUnLFxuICAgICAgICAgICAgY2F0ZWdvcnk6ICdkZXNpZ25hdGlvbicsXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBbXG4gICAgICAgICAgICAgIHRoaXMub3JnYW5pc2F0aW9uSWQgKyAnX29kY3NfZGVzaWduYXRpb24nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG9iamVjdFR5cGU6ICdUZXJtJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZpZWxkczogWyduYW1lJ10sXG4gICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgIGxpbWl0OiAxLFxuICAgICAgICAgIHNvcnRfYnk6IHtcbiAgICAgICAgICAgIGxhc3RVcGRhdGVkT246ICdkZXNjJyxcbiAgICAgICAgICAgIG9iamVjdFR5cGU6ICdUZXJtJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZhY2V0czogW10sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgdGhpcy51c2VyUHJvZmlsZVNlcnZpY2Uuc2VhcmNoSWdvdERlc2lnbmF0aW9uKGlnb3REZXNpZ25hdGlvbkJvZHkpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvdW50ID0gXy5nZXQocmVzLCAncmVzdWx0LmNvdW50JywgMCk7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZE9yZ0hhc0Rlc2lnbmF0aW9ucyA9IGNvdW50ID4gMDtcbiAgICAgICAgICB0aGlzLmdldGRlc2lnbmF0aW9uc01ldGEoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkT3JnSGFzRGVzaWduYXRpb25zID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5nZXRkZXNpZ25hdGlvbnNNZXRhKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkT3JnSGFzRGVzaWduYXRpb25zID0gZmFsc2U7XG4gICAgICB0aGlzLmdldGRlc2lnbmF0aW9uc01ldGEoKTtcbiAgICB9XG4gIH1cblxuICBnZXRkZXNpZ25hdGlvbnNNZXRhKCkge1xuICAgIHRoaXMuaXNMb2FkaW5nTW9yZURlc2lnbmF0aW9ucyA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRPcmdIYXNEZXNpZ25hdGlvbnMpIHtcbiAgICAgIHRoaXMuZ2V0SWdvdERlc2lnbmF0aW9ucygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldERlZmF1bHREZXNpZ25hdGlvbnMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldElnb3REZXNpZ25hdGlvbnMoKSB7XG4gICAgY29uc3QgcmVxdWVzdEJvZHk6IGFueSA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgIHN0YXR1czogXCJMaXZlXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiZGVzaWduYXRpb25cIixcbiAgICAgICAgICBjYXRlZ29yaWVzOiBbXG4gICAgICAgICAgICB0aGlzLm9yZ2FuaXNhdGlvbklkICsgJ19vZGNzX2Rlc2lnbmF0aW9uJyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIG9iamVjdFR5cGU6IFwiVGVybVwiXG4gICAgICAgIH0sXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIFwibmFtZVwiXG4gICAgICAgIF0sXG4gICAgICAgIG9mZnNldDogdGhpcy5kZXNpZ25hdGlvbnNPZmZzZXQsXG4gICAgICAgIGxpbWl0OiB0aGlzLmRlc2lnbmF0aW9uTGlzdExvYWRDb3VudCxcbiAgICAgICAgc29ydF9ieToge1xuICAgICAgICAgIGxhc3RVcGRhdGVkT246IFwiZGVzY1wiLFxuICAgICAgICAgIG9iamVjdFR5cGU6IFwiVGVybVwiXG4gICAgICAgIH0sXG4gICAgICAgIGZhY2V0czogW11cbiAgICAgIH1cbiAgICB9O1xuICAgIGlmKHRoaXMuZGVzaWduYXRpb25TZWFyY2hUZXh0KXtcbiAgICAgIHJlcXVlc3RCb2R5WydyZXF1ZXN0J11bJ3F1ZXJ5J10gPSB0aGlzLmRlc2lnbmF0aW9uU2VhcmNoVGV4dDtcbiAgICB9XG4gICAgdGhpcy51c2VyUHJvZmlsZVNlcnZpY2Uuc2VhcmNoSWdvdERlc2lnbmF0aW9uKHJlcXVlc3RCb2R5KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZURlc2lnbmF0aW9ucyA9IGZhbHNlO1xuICAgICAgICBpZih0aGlzLmRlc2lnbmF0aW9uc09mZnNldCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuZGVzaWduYXRpb25zTWV0YSA9IF8uZ2V0KHJlcywgJ3Jlc3VsdC5UZXJtJywgW10pIGFzIGRlc2lnbmF0aW9uW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kZXNpZ25hdGlvbnNNZXRhID0gWy4uLnRoaXMuZGVzaWduYXRpb25zTWV0YSwgLi4uXy5nZXQocmVzLCAncmVzdWx0LlRlcm0nLCBbXSkgYXMgZGVzaWduYXRpb25bXV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXNpZ25hdGlvbnNUb3RhbENvdW50ID0gXy5nZXQocmVzLCAncmVzdWx0LmNvdW50JywgMCk7XG4gICAgICAgIHRoaXMuY2hlY2tDdXJyZW50RGVzaWduYXRpb25QcmVzZW50KCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdNb3JlRGVzaWduYXRpb25zID0gZmFsc2U7XG4gICAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdTb21ldGhpbmcgd2VudCB3cm9uZy4gUGxlYXNlIHJlZnJlc2ggb3IgdHJ5IGFnYWluIGxhdGVyLicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuICAgIHByaXZhdGUgZ2V0RGVmYXVsdERlc2lnbmF0aW9ucygpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RCb2R5OiBhbnkgPSB7XG4gICAgICAgIGZpbHRlckNyaXRlcmlhTWFwOiB7XG4gICAgICAgICAgc3RhdHVzOiAnQWN0aXZlJ1xuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0ZWRGaWVsZHM6IFtdLFxuICAgICAgICBwYWdlTnVtYmVyOiB0aGlzLmRlc2lnbmF0aW9uc09mZnNldCxcbiAgICAgICAgcGFnZVNpemU6IHRoaXMuZGVzaWduYXRpb25MaXN0TG9hZENvdW50XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kZXNpZ25hdGlvblNlYXJjaFRleHQpIHtcbiAgICAgICAgcmVxdWVzdEJvZHlbJ3NlYXJjaFN0cmluZyddID0gdGhpcy5kZXNpZ25hdGlvblNlYXJjaFRleHRcbiAgICAgIH1cbiAgICAgIHRoaXMudXNlclByb2ZpbGVTZXJ2aWNlLnNlYXJjaERlc2lnbmF0aW9uKHJlcXVlc3RCb2R5KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZ01vcmVEZXNpZ25hdGlvbnMgPSBmYWxzZTtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gXy5nZXQocmVzLCAncmVzdWx0LnJlc3VsdC5kYXRhJywgW10pIGFzIGRlc2lnbmF0aW9uW107XG4gICAgICAgICAgY29uc3QgbWFwcGVkID0gY29udGVudC5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IGl0ZW0uZGVzaWduYXRpb24gfHwgJycsXG4gICAgICAgICAgICBzdGF0dXM6IGl0ZW0uc3RhdHVzIHx8ICdBY3RpdmUnLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBpZiAodGhpcy5kZXNpZ25hdGlvbnNPZmZzZXQgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVzaWduYXRpb25zTWV0YSA9IG1hcHBlZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZXNpZ25hdGlvbnNNZXRhID0gWy4uLnRoaXMuZGVzaWduYXRpb25zTWV0YSwgLi4ubWFwcGVkXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5kZXNpZ25hdGlvbnNUb3RhbENvdW50ID0gXy5nZXQocmVzLCAncmVzdWx0LnJlc3VsdC50b3RhbENvdW50JywgMCk7XG4gICAgICAgICAgdGhpcy5jaGVja0N1cnJlbnREZXNpZ25hdGlvblByZXNlbnQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZ01vcmVEZXNpZ25hdGlvbnMgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLm9wZW5TbmFja2JhcignU29tZXRoaW5nIHdlbnQgd3JvbmcuIFBsZWFzZSByZWZyZXNoIG9yIHRyeSBhZ2FpbiBsYXRlci4nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gIGdldE1hc3Rlckxhbmd1YWdlKCk6IHZvaWQge1xuICAgIHRoaXMudXNlclByb2ZpbGVTZXJ2aWNlLmdldE1hc3Rlckxhbmd1YWdlcygpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95U3ViamVjdCQpKVxuICAgICAgLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5tYXN0ZXJMYW5ndWFnZXMgPSByZXMubGFuZ3VhZ2VzXG4gICAgICAgIHRoaXMubWFzdGVyTGFuZ3VhZ2VCYWNrdXAgPSByZXMubGFuZ3VhZ2VzXG4gICAgICB9LCAoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmICghZXJyb3Iub2spIHtcbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4odGhpcy5oYW5kbGVUcmFuc2xhdGVUbygndW5hYmxlRmV0Y2hNYXN0ZXJMYW5ndWFnZURhdGEnKSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgfVxuXG4gIGhhbmRsZUVtcHR5KHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0eXBlID09PSAnbW9iaWxlJykge1xuICAgICAgaWYgKHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLm1vYmlsZSAmJiAhdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ21vYmlsZSddLnZhbHVlKSB7XG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydtb2JpbGUnXS5zZXRFcnJvcnMoeyB2YWxpZDogZmFsc2UgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdwcmltYXJ5RW1haWwnKSB7XG4gICAgICBpZiAoIXRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLnByaW1hcnlFbWFpbCAmJiAhdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy52YWx1ZVsncHJpbWFyeUVtYWlsJ10pIHtcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0uc2V0RXJyb3JzKHsgdmFsaWQ6IGZhbHNlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG4gIG9uU3VibWl0Rm9ybShmb3JtOiBhbnkpIHtcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuICAgIGNvbnNvbGUubG9nKGZvcm0pXG4gICAgbGV0IHBheWxvYWQgPSB0aGlzLmdlbmVyYXRlUHJvZmlsZVBheWxvYWQoKVxuICAgIGlmICgodGhpcy5jYW5TaG93RGVzaWduYXRpb24gfHwgdGhpcy5jYW5TaG93R3JvdXApICYmICF0aGlzLnNob3dEb3B0Q2hhbmdlcykge1xuICAgICAgaWYgKHRoaXMucGVuZGluZ0ZpbGVkcykge1xuICAgICAgICB0aGlzLnBlbmRpbmdGaWxlZHMuZm9yRWFjaCgoX29iajogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKF9vYmopLmluY2x1ZGVzKCdkZXNpZ25hdGlvbicpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZExvYWRlciA9IHRoaXMuYWRkTG9hZGVyICsgMVxuICAgICAgICAgICAgdGhpcy5wcm9maWxlVjJTdmMud2l0aERyYXdBcHByb3ZhbFJlcXVlc3QodGhpcy5jb25maWdTcmMudW5NYXBwZWRVc2VyLmlkLCBfb2JqLndmSWQpLnN1YnNjcmliZSgocmVzcDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyZXNwICYmIHJlc3AucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRMb2FkZXIgPSB0aGlzLmFkZExvYWRlciAtIDFcbiAgICAgICAgICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3AucmVzdWx0Lm1lc3NhZ2UpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRMb2FkZXIgPSB0aGlzLmFkZExvYWRlciAtIDFcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKF9vYmopLmluY2x1ZGVzKCdncm91cCcpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZExvYWRlciA9IHRoaXMuYWRkTG9hZGVyICsgMVxuICAgICAgICAgICAgdGhpcy5wcm9maWxlVjJTdmMud2l0aERyYXdBcHByb3ZhbFJlcXVlc3QodGhpcy5jb25maWdTcmMudW5NYXBwZWRVc2VyLmlkLCBfb2JqLndmSWQpLnN1YnNjcmliZSgocmVzcDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyZXNwICYmIHJlc3AucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRMb2FkZXIgPSB0aGlzLmFkZExvYWRlciAtIDFcbiAgICAgICAgICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3AucmVzdWx0Lm1lc3NhZ2UpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRMb2FkZXIgPSB0aGlzLmFkZExvYWRlciAtIDFcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGlmICh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlscy5wcmltYXJ5RW1haWwgIT09IHRoaXMudXNlckRldGFpbHNGb3JtLnZhbHVlLnByaW1hcnlFbWFpbCAmJiB0aGlzLmNhblNob3dFbWFpbCkge1xuICAgICAgICAgIHRoaXMudXBkYXRlRW1haWwodGhpcy51c2VyRGV0YWlsc0Zvcm0udmFsdWUucHJpbWFyeUVtYWlsKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3VibWl0UHJvZmlsZShwYXlsb2FkKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMucHJpbWFyeUVtYWlsICE9PSB0aGlzLnVzZXJEZXRhaWxzRm9ybS52YWx1ZS5wcmltYXJ5RW1haWwgJiYgdGhpcy5jYW5TaG93RW1haWwpIHtcbiAgICAgICAgdGhpcy51cGRhdGVFbWFpbCh0aGlzLnVzZXJEZXRhaWxzRm9ybS52YWx1ZS5wcmltYXJ5RW1haWwpXG4gICAgICB9XG4gICAgICB0aGlzLnN1Ym1pdFByb2ZpbGUocGF5bG9hZClcbiAgICB9XG4gIH1cblxuICBzdWJtaXRQcm9maWxlKHBheWxvYWQ6IGFueSkge1xuICAgIGlmIChwYXlsb2FkICYmIHBheWxvYWRbJ3JlcXVlc3QnXSAmJiBwYXlsb2FkWydyZXF1ZXN0J11bJ3Byb2ZpbGVEZXRhaWxzJ10gJiYgcGF5bG9hZFsncmVxdWVzdCddWydwcm9maWxlRGV0YWlscyddWydwZXJzb25hbERldGFpbHMnXSAmJiBwYXlsb2FkWydyZXF1ZXN0J11bJ3Byb2ZpbGVEZXRhaWxzJ11bJ3BlcnNvbmFsRGV0YWlscyddWydkb2InXSkge1xuICAgICAgbGV0IGRvYkZvcm1hdCA9IHBheWxvYWRbJ3JlcXVlc3QnXVsncHJvZmlsZURldGFpbHMnXVsncGVyc29uYWxEZXRhaWxzJ11bJ2RvYiddO1xuICAgICAgbGV0IGRvYiA9IGAke25ldyBEYXRlKGRvYkZvcm1hdCkuZ2V0RGF0ZSgpfS0ke25ldyBEYXRlKGRvYkZvcm1hdCkuZ2V0TW9udGgoKSArIDF9LSR7bmV3IERhdGUoZG9iRm9ybWF0KS5nZXRGdWxsWWVhcigpfWBcbiAgICAgIHBheWxvYWRbJ3JlcXVlc3QnXVsncHJvZmlsZURldGFpbHMnXVsncGVyc29uYWxEZXRhaWxzJ11bJ2RvYiddID0gZG9iXG4gICAgfVxuICAgIGlmICh0aGlzLnVwZGF0ZVByb2ZpbGUpIHtcbiAgICAgIHRoaXMuYWRkTG9hZGVyID0gdGhpcy5hZGRMb2FkZXIgKyAxXG4gICAgICB0aGlzLnVzZXJQcm9maWxlU2VydmljZS5lZGl0UHJvZmlsZURldGFpbHMocGF5bG9hZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFkZExvYWRlciA9IHRoaXMuYWRkTG9hZGVyIC0gMVxuICAgICAgICBpZiAocmVzLnJlc3BvbnNlQ29kZSA9PT0gJ09LJykge1xuICAgICAgICAgIHRoaXMuc3VibWl0U3VyZXZ5KHRydWUpXG4gICAgICAgIH1cbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5hZGRMb2FkZXIgPSB0aGlzLmFkZExvYWRlciAtIDFcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUgKi9cbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpXG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcInNvbWV0aGluZyB3ZW50IHdyb25nIVwiKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBzdWJtaXRTdXJldnkoc3RhdHVzOiBhbnkpIHtcbiAgICBsZXQgc3VyZXZ5UGF5bG9hZCA9IHtcbiAgICAgIGZvcm1JZDogXy5nZXQodGhpcy5kYXRhLCAnYmF0Y2hEYXRhLmJhdGNoQXR0cmlidXRlcy5wcm9maWxlU3VydmV5SWQnKSxcbiAgICAgIHZlcnNpb246IDQsXG4gICAgICBzdGF0dXM6ICdTVUJNSVRURUQnLFxuICAgICAgcmVzcG9uc2VzOiB0aGlzLmdlbmVyZWF0ZVN1cnZleVBheWxvYWQoc3RhdHVzKSxcbiAgICAgIGNvbnRleHRJZDogXy5nZXQodGhpcy5kYXRhLCAnYmF0Y2hEYXRhLmNvdXJzZUlkJyksXG4gICAgICBjb250ZXh0TmFtZTogXy5nZXQodGhpcy5kYXRhLCAnY291cnNlTmFtZScsICcnKSxcbiAgICB9XG4gICAgdGhpcy5hZGRMb2FkZXIgPSB0aGlzLmFkZExvYWRlciArIDFcbiAgICB0aGlzLm5wc1N2Yy5zdWJtaXRCcEZvcm1XaXRoUHJvZmlsZURldGFpbHMoc3VyZXZ5UGF5bG9hZCkuc3Vic2NyaWJlKChyZXNwOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuYWRkTG9hZGVyID0gdGhpcy5hZGRMb2FkZXIgLSAxXG4gICAgICBpZiAoXy5nZXQocmVzcCwgJ3BhcmFtcy5zdGF0dXMnKSA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRm9ybSA9IGZhbHNlXG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcIkZvcm0gaXMgc3VibWl0dGVkIHN1Y2Nlc3NmdWxseVwiKVxuICAgICAgICB0aGlzLmNsb3NlUG9wdXAoKVxuICAgICAgfVxuICAgICAgaWYgKHJlc3AgJiYgcmVzcC5zdGF0dXNDb2RlICYmIHJlc3Auc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRm9ybSA9IGZhbHNlXG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihyZXNwLmVycm9yTWVzc2FnZSlcbiAgICAgIH1cbiAgICB9LCBlcnJvciA9PiB7XG4gICAgICB0aGlzLmFkZExvYWRlciA9IHRoaXMuYWRkTG9hZGVyIC0gMVxuICAgICAgLyogdHNsaW50OmRpc2FibGUgKi9cbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFwic29tZXRoaW5nIHdlbnQgd3JvbmchXCIpXG4gICAgfSlcbiAgfVxuXG4gIGdlbmVyYXRlUHJvZmlsZVBheWxvYWQoKSB7XG4gICAgbGV0IHBheWxvYWQ6IGFueSA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LmlkZW50aWZpZXIsXG4gICAgICAgIHByb2ZpbGVEZXRhaWxzOiB7XG4gICAgICAgICAgZW1wbG95bWVudERldGFpbHM6IHt9LFxuICAgICAgICAgIHBlcnNvbmFsRGV0YWlsczoge30sXG4gICAgICAgICAgLy8gY2FkcmVEZXRhaWxzOiB7fSxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBsZXQgX3Byb2Zlc3Npb25hbERldGFpbHM6IGFueSA9IHt9XG4gICAgbGV0IHVwZGF0ZVByb2Zlc3Npb25hbERldGFpbHM6IGJvb2xlYW4gPSBmYWxzZVxuICAgIGlmICh0aGlzLnNob3dHcm91cCAmJiB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snZ3JvdXAnXS52YWx1ZSAmJiAhdGhpcy5zaG93RG9wdENoYW5nZXMpIHtcbiAgICAgIF9wcm9mZXNzaW9uYWxEZXRhaWxzWydncm91cCddID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2dyb3VwJ10udmFsdWVcbiAgICAgIHRoaXMudXBkYXRlUHJvZmlsZSA9IHRydWVcbiAgICAgIHVwZGF0ZVByb2Zlc3Npb25hbERldGFpbHMgPSB0cnVlXG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dEZXNpZ25hdGlvbiAmJiB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snZGVzaWduYXRpb24nXS52YWx1ZSAmJiAhdGhpcy5zaG93RG9wdENoYW5nZXMpIHtcbiAgICAgIF9wcm9mZXNzaW9uYWxEZXRhaWxzWydkZXNpZ25hdGlvbiddID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2Rlc2lnbmF0aW9uJ10udmFsdWVcbiAgICAgIHRoaXMudXBkYXRlUHJvZmlsZSA9IHRydWVcbiAgICAgIHVwZGF0ZVByb2Zlc3Npb25hbERldGFpbHMgPSB0cnVlXG4gICAgfVxuICAgIGlmICh1cGRhdGVQcm9mZXNzaW9uYWxEZXRhaWxzKSB7XG4gICAgICBwYXlsb2FkLnJlcXVlc3QucHJvZmlsZURldGFpbHNbJ3Byb2Zlc3Npb25hbERldGFpbHMnXSA9IFtfcHJvZmVzc2lvbmFsRGV0YWlsc11cbiAgICB9XG4gICAgaWYgKHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydlbXBsb3llZUNvZGUnXS52YWx1ZSkge1xuICAgICAgcGF5bG9hZC5yZXF1ZXN0LnByb2ZpbGVEZXRhaWxzLmVtcGxveW1lbnREZXRhaWxzWydlbXBsb3llZUNvZGUnXSA9IHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydlbXBsb3llZUNvZGUnXS52YWx1ZVxuICAgICAgdGhpcy51cGRhdGVQcm9maWxlID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAodGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ21vYmlsZSddLnZhbHVlKSB7XG4gICAgICBwYXlsb2FkLnJlcXVlc3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzWydtb2JpbGUnXSA9IHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydtb2JpbGUnXS52YWx1ZVxuICAgICAgcGF5bG9hZC5yZXF1ZXN0LnByb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlsc1sncGhvbmVWZXJpZmllZCddID0gdHJ1ZVxuICAgICAgdGhpcy51cGRhdGVQcm9maWxlID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAodGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2dlbmRlciddLnZhbHVlKSB7XG4gICAgICBwYXlsb2FkLnJlcXVlc3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzWydnZW5kZXInXSA9IHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydnZW5kZXInXS52YWx1ZVxuICAgICAgdGhpcy51cGRhdGVQcm9maWxlID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAodGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2RvYiddLnZhbHVlKSB7XG4gICAgICBwYXlsb2FkLnJlcXVlc3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzWydkb2InXSA9IHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydkb2InXS52YWx1ZVxuICAgICAgdGhpcy51cGRhdGVQcm9maWxlID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAodGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2RvbWljaWxlTWVkaXVtJ10udmFsdWUpIHtcbiAgICAgIHBheWxvYWQucmVxdWVzdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHNbJ2RvbWljaWxlTWVkaXVtJ10gPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snZG9taWNpbGVNZWRpdW0nXS52YWx1ZVxuICAgICAgdGhpcy51cGRhdGVQcm9maWxlID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAodGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2NhdGVnb3J5J10udmFsdWUpIHtcbiAgICAgIHBheWxvYWQucmVxdWVzdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHNbJ2NhdGVnb3J5J10gPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snY2F0ZWdvcnknXS52YWx1ZVxuICAgICAgdGhpcy51cGRhdGVQcm9maWxlID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAodGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ3BpbkNvZGUnXS52YWx1ZSkge1xuICAgICAgcGF5bG9hZC5yZXF1ZXN0LnByb2ZpbGVEZXRhaWxzLmVtcGxveW1lbnREZXRhaWxzWydwaW5Db2RlJ10gPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1sncGluQ29kZSddLnZhbHVlXG4gICAgICBwYXlsb2FkLnJlcXVlc3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzWydwaW5jb2RlJ10gPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1sncGluQ29kZSddLnZhbHVlXG4gICAgICB0aGlzLnVwZGF0ZVByb2ZpbGUgPSB0cnVlXG4gICAgfVxuICAgIGlmICh0aGlzLmNhblNob3dzaG93Q2FkcmVEZXRhaWxzICYmICF0aGlzLnNob3dEb3B0Q2hhbmdlcykge1xuICAgICAgbGV0IF9jYWRyZURldGFpbHM6IGFueSA9IHt9XG4gICAgICBwYXlsb2FkLnJlcXVlc3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzWydpc0NhZHJlJ10gPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snaXNDYWRyZSddLnZhbHVlXG4gICAgICB0aGlzLnVwZGF0ZVByb2ZpbGUgPSB0cnVlXG4gICAgICBpZiAodGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2lzQ2FkcmUnXS52YWx1ZSkge1xuICAgICAgICBfY2FkcmVEZXRhaWxzWydjaXZpbFNlcnZpY2VUeXBlJ10gPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1sndHlwZU9mQ2l2aWxTZXJ2aWNlJ10udmFsdWVcbiAgICAgICAgX2NhZHJlRGV0YWlsc1snY2l2aWxTZXJ2aWNlTmFtZSddID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ3NlcnZpY2VUeXBlJ10udmFsdWVcbiAgICAgICAgX2NhZHJlRGV0YWlsc1snY2FkcmVOYW1lJ10gPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snY2FkcmVOYW1lJ10udmFsdWVcbiAgICAgICAgX2NhZHJlRGV0YWlsc1snY2FkcmVCYXRjaCddID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2NhZHJlQmF0Y2gnXS52YWx1ZVxuICAgICAgICBfY2FkcmVEZXRhaWxzWydjYWRyZUNvbnRyb2xsaW5nQXV0aG9yaXR5TmFtZSddID0gdGhpcy5jYWRyZUNvbnRyb2xsaW5nQXV0aG9yaXR5XG4gICAgICAgIF9jYWRyZURldGFpbHNbJ2NhZHJlSWQnXSA9IHRoaXMuY2FkcmVJZFxuICAgICAgICBfY2FkcmVEZXRhaWxzWydjaXZpbFNlcnZpY2VJZCddID0gdGhpcy5jaXZpbFNlcnZpY2VJZFxuICAgICAgICBfY2FkcmVEZXRhaWxzWydjaXZpbFNlcnZpY2VUeXBlSWQnXSA9IHRoaXMuc2VydmljZUlkXG4gICAgICAgIHBheWxvYWQucmVxdWVzdC5wcm9maWxlRGV0YWlsc1snY2FkcmVEZXRhaWxzJ10gPSBfY2FkcmVEZXRhaWxzXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXlsb2FkXG4gIH1cblxuICBmb3JtYXREYXRlKF9kb2I6IHN0cmluZyB8IERhdGUpOiBzdHJpbmcge1xuICAgIGxldCBkYXRlT2JqOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKF9kb2IgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBkYXRlT2JqID0gX2RvYjtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBfZG9iID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgcGFydHMgPSBfZG9iLnNwbGl0KCctJyk7XG4gICAgICBpZiAocGFydHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IHBhcnRzO1xuICAgICAgICBkYXRlT2JqID0gbmV3IERhdGUoTnVtYmVyKHllYXIpLCBOdW1iZXIobW9udGgpIC0gMSwgTnVtYmVyKGRheSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gbmV3IERhdGUoX2RvYik7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICBkYXRlT2JqID0gcGFyc2VkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZGF0ZU9iaiB8fCBpc05hTihkYXRlT2JqLmdldFRpbWUoKSkpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGVPYmosICd5eXl5LU1NLWRkJykgfHwgJyc7XG4gIH1cblxuICBnZXRRdWVzdGlvbklkKGZpZWxkTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWZpZWxkTmFtZSB8fCAhdGhpcy5mb3Jtc0RldGlscy5maWVsZHMpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZm9ybXNEZXRpbHMuZmllbGRzLmZpbmQoKGY6IGFueSkgPT4gZi5maWVsZCA9PT0gZmllbGROYW1lKSB8fCB7fTtcbiAgICByZXR1cm4gZmllbGQuaWQgfHwgJyc7XG4gIH1cblxuICBnZW5lcmVhdGVTdXJ2ZXlQYXlsb2FkKHN0YXR1czogYW55KSB7XG4gICAgbGV0IGRhdGFPYmplY3Q6IGFueSA9IFtdXG4gICAgdGhpcy5iYXRjaERldGFpbHMuYmF0Y2hBdHRyaWJ1dGVzLmJwRW5yb2xNYW5kYXRvcnlQcm9maWxlRmllbGRzLmZvckVhY2goKF9maWVsZDogYW55KSA9PiB7XG4gICAgICBjb25zdCBmaWVsZFRvQWRkID0ge1xuICAgICAgICBxdWVzdGlvbklkOiB0aGlzLmdldFF1ZXN0aW9uSWQoX2ZpZWxkLmZpZWxkKSxcbiAgICAgICAgcXVlc3Rpb246IF9maWVsZC5kaXNwbGF5TmFtZSxcbiAgICAgICAgYW5zd2VyOiAnJyxcbiAgICAgICAgYW5zd2VyVHlwZTogX2ZpZWxkLmZpZWxkVHlwZVxuICAgICAgfVxuICAgICAgaWYgKF9maWVsZC5maWVsZCA9PT0gJ3Byb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlscy5maXJzdG5hbWUnKSB7XG4gICAgICAgIGZpZWxkVG9BZGQuYW5zd2VyID0gXy5nZXQodGhpcy51c2VyUHJvZmlsZU9iamVjdCwgJ3Byb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlscy5maXJzdE5hbWUnLCBfLmdldCh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LCAncHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmZpcnN0bmFtZScsICcnKSlcbiAgICAgICAgZGF0YU9iamVjdC5wdXNoKGZpZWxkVG9BZGQpXG4gICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMuZmlyc3ROYW1lIHx8IHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmZpcnN0bmFtZVxuICAgICAgfVxuICAgICAgaWYgKF9maWVsZC5maWVsZCA9PT0gJ3Byb2ZpbGVEZXRhaWxzLmVtcGxveW1lbnREZXRhaWxzLmRlcGFydG1lbnROYW1lJykge1xuICAgICAgICBmaWVsZFRvQWRkLmFuc3dlciA9IF8uZ2V0KHRoaXMudXNlclByb2ZpbGVPYmplY3QsICdwcm9maWxlRGV0YWlscy5lbXBsb3ltZW50RGV0YWlscy5kZXBhcnRtZW50TmFtZScsICdOL0EnKVxuICAgICAgICBkYXRhT2JqZWN0LnB1c2goZmllbGRUb0FkZClcbiAgICAgICAgLy8gZGF0YU9iamVjdFtfZmllbGQubmFtZV0gPSB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLmVtcGxveW1lbnREZXRhaWxzICYmIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuZW1wbG95bWVudERldGFpbHMuZGVwYXJ0bWVudE5hbWUgP1xuICAgICAgICAvLyAgIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuZW1wbG95bWVudERldGFpbHMuZGVwYXJ0bWVudE5hbWUgOiBcIk4vQVwiXG4gICAgICB9XG4gICAgICBpZiAoX2ZpZWxkLmZpZWxkID09PSAncHJvZmlsZURldGFpbHMucHJvZmVzc2lvbmFsRGV0YWlscy5ncm91cCcpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0dyb3VwICYmIHN0YXR1cykge1xuICAgICAgICAgIGZpZWxkVG9BZGQuYW5zd2VyID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2dyb3VwJ10udmFsdWVcbiAgICAgICAgICAvLyBkYXRhT2JqZWN0W19maWVsZC5uYW1lXSA9IHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydncm91cCddLnZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGRUb0FkZC5hbnN3ZXIgPSBfLmdldCh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LCAncHJvZmlsZURldGFpbHMucHJvZmVzc2lvbmFsRGV0YWlsc1swXS5ncm91cCcsICdOL0EnKVxuICAgICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wcm9mZXNzaW9uYWxEZXRhaWxzICYmIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucHJvZmVzc2lvbmFsRGV0YWlsc1swXS5ncm91cCA/XG4gICAgICAgICAgLy8gICB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLnByb2Zlc3Npb25hbERldGFpbHNbMF0uZ3JvdXAgOiBcIk4vQVwiXG4gICAgICAgIH1cbiAgICAgICAgZGF0YU9iamVjdC5wdXNoKGZpZWxkVG9BZGQpXG4gICAgICB9XG4gICAgICBpZiAoX2ZpZWxkLmZpZWxkID09PSAncHJvZmlsZURldGFpbHMucHJvZmVzc2lvbmFsRGV0YWlscy5kZXNpZ25hdGlvbicpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0Rlc2lnbmF0aW9uICYmIHN0YXR1cykge1xuICAgICAgICAgIGlmICh0aGlzLnNob3dEb3B0Q2hhbmdlcyAmJiB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snZGVzaWduYXRpb24nXSAmJlxuICAgICAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2Rlc2lnbmF0aW9uJ10udmFsdWUgPT09ICdPdGhlcnMnICYmIHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydvdGhlckRlc2lnbmF0aW9uJ10pIHtcbiAgICAgICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ290aGVyRGVzaWduYXRpb24nXS52YWx1ZVxuICAgICAgICAgICAgZmllbGRUb0FkZC5hbnN3ZXIgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snb3RoZXJEZXNpZ25hdGlvbiddLnZhbHVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2Rlc2lnbmF0aW9uJ10udmFsdWVcbiAgICAgICAgICAgIGZpZWxkVG9BZGQuYW5zd2VyID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2Rlc2lnbmF0aW9uJ10udmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgZGF0YU9iamVjdC5wdXNoKGZpZWxkVG9BZGQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZGF0YU9iamVjdFtfZmllbGQubmFtZV0gPSB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLnByb2Zlc3Npb25hbERldGFpbHMgJiYgdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wcm9mZXNzaW9uYWxEZXRhaWxzWzBdLmRlc2lnbmF0aW9uID9cbiAgICAgICAgICAvLyAgIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucHJvZmVzc2lvbmFsRGV0YWlsc1swXS5kZXNpZ25hdGlvbiA6IFwiTi9BXCJcbiAgICAgICAgICAgIGZpZWxkVG9BZGQuYW5zd2VyID0gXy5nZXQodGhpcy51c2VyUHJvZmlsZU9iamVjdCwgJ3Byb2ZpbGVEZXRhaWxzLnByb2Zlc3Npb25hbERldGFpbHNbMF0uZGVzaWduYXRpb24nLCAnTi9BJylcbiAgICAgICAgICAgIGRhdGFPYmplY3QucHVzaChmaWVsZFRvQWRkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChfZmllbGQuZmllbGQgPT09ICdwcm9maWxlRGV0YWlscy5lbXBsb3ltZW50RGV0YWlscy5lbXBsb3llZUNvZGUnKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3dFbXBsb3llZUNvZGUgJiYgc3RhdHVzKSB7XG4gICAgICAgICAgLy8gZGF0YU9iamVjdFtfZmllbGQubmFtZV0gPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snZW1wbG95ZWVDb2RlJ10udmFsdWVcbiAgICAgICAgICBmaWVsZFRvQWRkLmFuc3dlciA9IHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydlbXBsb3llZUNvZGUnXS52YWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpZWxkVG9BZGQuYW5zd2VyID0gXy5nZXQodGhpcy51c2VyUHJvZmlsZU9iamVjdCwgJ3Byb2ZpbGVEZXRhaWxzLmVtcGxveW1lbnREZXRhaWxzLmVtcGxveWVlQ29kZScsICdOL0EnKVxuICAgICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5lbXBsb3ltZW50RGV0YWlscyAmJiB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLmVtcGxveW1lbnREZXRhaWxzLmVtcGxveWVlQ29kZSA/XG4gICAgICAgICAgLy8gICB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLmVtcGxveW1lbnREZXRhaWxzLmVtcGxveWVlQ29kZSA6IFwiTi9BXCJcbiAgICAgICAgfVxuICAgICAgICBkYXRhT2JqZWN0LnB1c2goZmllbGRUb0FkZClcbiAgICAgIH1cblxuICAgICAgaWYgKF9maWVsZC5maWVsZCA9PT0gJ3Byb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlscy5wcmltYXJ5RW1haWwnKSB7XG4gICAgICAgIGZpZWxkVG9BZGQuYW5zd2VyID0gdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMucHJpbWFyeUVtYWlsXG4gICAgICAgIGRhdGFPYmplY3QucHVzaChmaWVsZFRvQWRkKVxuICAgICAgICAvLyBkYXRhT2JqZWN0W19maWVsZC5uYW1lXSA9IHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLnByaW1hcnlFbWFpbFxuICAgICAgfVxuXG4gICAgICBpZiAoX2ZpZWxkLmZpZWxkID09PSAncHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLm1vYmlsZScpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd01vYmlsZSAmJiBzdGF0dXMpIHtcbiAgICAgICAgICBmaWVsZFRvQWRkLmFuc3dlciA9IHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydtb2JpbGUnXS52YWx1ZVxuICAgICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ21vYmlsZSddLnZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGRUb0FkZC5hbnN3ZXIgPSBfLmdldCh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LCAncHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLm1vYmlsZScsICdOL0EnKVxuICAgICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMgJiYgdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMubW9iaWxlID9cbiAgICAgICAgICAvLyAgIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLm1vYmlsZSA6IFwiTi9BXCJcbiAgICAgICAgfVxuICAgICAgICBkYXRhT2JqZWN0LnB1c2goZmllbGRUb0FkZClcbiAgICAgIH1cblxuICAgICAgaWYgKF9maWVsZC5maWVsZCA9PT0gJ3Byb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlscy5kb2InKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3dEb2IgJiYgc3RhdHVzKSB7XG4gICAgICAgICAgbGV0IF9kb2I6IGFueSA9IHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydkb2InXS52YWx1ZVxuICAgICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy5mb3JtYXREYXRlKF9kb2IpXG4gICAgICAgICAgZmllbGRUb0FkZC5hbnN3ZXIgPSB0aGlzLmZvcm1hdERhdGUoX2RvYilcbiAgICAgICAgICBkYXRhT2JqZWN0LnB1c2goZmllbGRUb0FkZClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMgJiYgdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMuZG9iKSB7XG4gICAgICAgICAgICBsZXQgX2RvYjogYW55ID0gdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMuZG9iXG4gICAgICAgICAgICBjb25zdCBbZGF5LCBtb250aCwgeWVhcl0gPSBfZG9iLnNwbGl0KCctJylcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShOdW1iZXIoeWVhciksIE51bWJlcihtb250aCkgLSAxLCBOdW1iZXIoZGF5KSlcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZERheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKVxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkTW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKVxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICAgICAgICAgICAgLy8gZGF0YU9iamVjdFtfZmllbGQubmFtZV0gPSBgJHtmb3JtYXR0ZWRZZWFyfS0ke2Zvcm1hdHRlZE1vbnRofS0ke2Zvcm1hdHRlZERheX1gXG4gICAgICAgICAgICBmaWVsZFRvQWRkLmFuc3dlciA9IGAke2Zvcm1hdHRlZFllYXJ9LSR7Zm9ybWF0dGVkTW9udGh9LSR7Zm9ybWF0dGVkRGF5fWBcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZGF0YU9iamVjdFtfZmllbGQubmFtZV0gPSBcIjE5NTAtMDYtMDFcIlxuICAgICAgICAgICAgZmllbGRUb0FkZC5hbnN3ZXIgPSBcIjE5NTAtMDYtMDFcIlxuICAgICAgICAgIH1cbiAgICAgICAgICBkYXRhT2JqZWN0LnB1c2goZmllbGRUb0FkZClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoX2ZpZWxkLmZpZWxkID09PSAncHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmdlbmRlcicpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0dlbmRlciAmJiBzdGF0dXMpIHtcbiAgICAgICAgICBmaWVsZFRvQWRkLmFuc3dlciA9IHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydnZW5kZXInXS52YWx1ZVxuICAgICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2dlbmRlciddLnZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGRUb0FkZC5hbnN3ZXIgPSBfLmdldCh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LCAncHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmdlbmRlcicsICdOL0EnKVxuICAgICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMgJiYgdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMuZ2VuZGVyID9cbiAgICAgICAgICAvLyAgIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmdlbmRlciA6IFwiTi9BXCJcbiAgICAgICAgfVxuICAgICAgICBkYXRhT2JqZWN0LnB1c2goZmllbGRUb0FkZClcbiAgICAgIH1cblxuICAgICAgaWYgKF9maWVsZC5maWVsZCA9PT0gJ3Byb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlscy5kb21pY2lsZU1lZGl1bScpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0RlY2ltYWxNZWRpdW0gJiYgc3RhdHVzKSB7XG4gICAgICAgICAgLy8gZGF0YU9iamVjdFtfZmllbGQubmFtZV0gPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snZG9taWNpbGVNZWRpdW0nXS52YWx1ZVxuICAgICAgICAgIGZpZWxkVG9BZGQuYW5zd2VyID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2RvbWljaWxlTWVkaXVtJ10udmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZFRvQWRkLmFuc3dlciA9IF8uZ2V0KHRoaXMudXNlclByb2ZpbGVPYmplY3QsICdwcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMuZG9taWNpbGVNZWRpdW0nLCAnTi9BJylcbiAgICAgICAgICAvLyBkYXRhT2JqZWN0W19maWVsZC5uYW1lXSA9IHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzICYmIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmRvbWljaWxlTWVkaXVtID9cbiAgICAgICAgICAvLyAgIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmRvbWljaWxlTWVkaXVtIDogXCJOL0FcIlxuICAgICAgICB9XG4gICAgICAgIGRhdGFPYmplY3QucHVzaChmaWVsZFRvQWRkKVxuICAgICAgfVxuXG4gICAgICBpZiAoX2ZpZWxkLmZpZWxkID09PSAncHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmNhdGVnb3J5Jykge1xuICAgICAgICBpZiAodGhpcy5zaG93Q2F0ZWdvcnkgJiYgc3RhdHVzKSB7XG4gICAgICAgICAgZmllbGRUb0FkZC5hbnN3ZXIgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snY2F0ZWdvcnknXS52YWx1ZVxuICAgICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2NhdGVnb3J5J10udmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZFRvQWRkLmFuc3dlciA9IF8uZ2V0KHRoaXMudXNlclByb2ZpbGVPYmplY3QsICdwcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMuY2F0ZWdvcnknLCAnTi9BJylcbiAgICAgICAgICAvLyBkYXRhT2JqZWN0W19maWVsZC5uYW1lXSA9IHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzICYmIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmNhdGVnb3J5ID9cbiAgICAgICAgICAvLyAgIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLmNhdGVnb3J5IDogXCJOL0FcIlxuICAgICAgICB9XG4gICAgICAgIGRhdGFPYmplY3QucHVzaChmaWVsZFRvQWRkKVxuICAgICAgfVxuXG4gICAgICBpZiAoX2ZpZWxkLmZpZWxkID09PSAncHJvZmlsZURldGFpbHMuZW1wbG95bWVudERldGFpbHMucGluQ29kZScpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd1BpbkNvZGUgJiYgc3RhdHVzKSB7XG4gICAgICAgICAgZmllbGRUb0FkZC5hbnN3ZXIgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1sncGluQ29kZSddLnZhbHVlXG4gICAgICAgICAgLy8gZGF0YU9iamVjdFtfZmllbGQubmFtZV0gPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1sncGluQ29kZSddLnZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGRUb0FkZC5hbnN3ZXIgPSBfLmdldCh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LCAncHJvZmlsZURldGFpbHMuZW1wbG95bWVudERldGFpbHMucGluQ29kZScsICdOL0EnKVxuICAgICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5lbXBsb3ltZW50RGV0YWlscyAmJiB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLmVtcGxveW1lbnREZXRhaWxzLnBpbkNvZGUgP1xuICAgICAgICAgIC8vICAgdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5lbXBsb3ltZW50RGV0YWlscy5waW5Db2RlIDogXCJOL0FcIlxuICAgICAgICB9XG4gICAgICAgIGRhdGFPYmplY3QucHVzaChmaWVsZFRvQWRkKVxuICAgICAgfVxuXG4gICAgICBpZiAoX2ZpZWxkLmZpZWxkID09PSAncHJvZmlsZURldGFpbHMuY2FkcmVEZXRhaWxzJykge1xuICAgICAgICBpZiAodGhpcy5jYW5TaG93c2hvd0NhZHJlRGV0YWlscyAmJiB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snaXNDYWRyZSddLnZhbHVlICYmIHN0YXR1cykge1xuICAgICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2lzQ2FkcmUnXS52YWx1ZVxuICAgICAgICAgIGZpZWxkVG9BZGQuYW5zd2VyID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2lzQ2FkcmUnXS52YWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscyAmJlxuICAgICAgICAgIC8vICAgdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMuaXNDYWRyZSA/ICdZZXMnIDogJ05vJ1xuICAgICAgICAgIGZpZWxkVG9BZGQuYW5zd2VyID0gXy5nZXQodGhpcy51c2VyUHJvZmlsZU9iamVjdCwgJ3Byb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlscy5pc0NhZHJlJykgPyAnWWVzJyA6ICdObydcbiAgICAgICAgfVxuICAgICAgICBkYXRhT2JqZWN0LnB1c2goZmllbGRUb0FkZClcbiAgICAgIH1cbiAgICAgIGlmIChfZmllbGQuZmllbGQgPT09ICdwcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMuY2l2aWxTZXJ2aWNlVHlwZScpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuU2hvd3Nob3dDYWRyZURldGFpbHMgJiYgdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2lzQ2FkcmUnXS52YWx1ZSAmJiBzdGF0dXMpIHtcbiAgICAgICAgICAvLyBkYXRhT2JqZWN0W19maWVsZC5uYW1lXSA9IHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWyd0eXBlT2ZDaXZpbFNlcnZpY2UnXS52YWx1ZVxuICAgICAgICAgIGZpZWxkVG9BZGQuYW5zd2VyID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ3R5cGVPZkNpdmlsU2VydmljZSddLnZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZGF0YU9iamVjdFtfZmllbGQubmFtZV0gPSB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLmNhZHJlRGV0YWlscyAmJiB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLmNhZHJlRGV0YWlscy5jaXZpbFNlcnZpY2VUeXBlID9cbiAgICAgICAgICAvLyAgIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuY2FkcmVEZXRhaWxzLmNpdmlsU2VydmljZVR5cGUgOiAnTi9BJ1xuICAgICAgICAgIGZpZWxkVG9BZGQuYW5zd2VyID0gXy5nZXQodGhpcy51c2VyUHJvZmlsZU9iamVjdCwgJ3Byb2ZpbGVEZXRhaWxzLmNhZHJlRGV0YWlscy5jaXZpbFNlcnZpY2VUeXBlJywgJ04vQScpXG4gICAgICAgIH1cbiAgICAgICAgZGF0YU9iamVjdC5wdXNoKGZpZWxkVG9BZGQpXG4gICAgICB9XG5cbiAgICAgIGlmIChfZmllbGQuZmllbGQgPT09ICdwcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMuY2l2aWxTZXJ2aWNlTmFtZScpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuU2hvd3Nob3dDYWRyZURldGFpbHMgJiYgdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2lzQ2FkcmUnXS52YWx1ZSAmJiBzdGF0dXMpIHtcbiAgICAgICAgICAvLyBkYXRhT2JqZWN0W19maWVsZC5uYW1lXSA9IHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydzZXJ2aWNlVHlwZSddLnZhbHVlXG4gICAgICAgICAgZmllbGRUb0FkZC5hbnN3ZXIgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snc2VydmljZVR5cGUnXS52YWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMgJiYgdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMuY2l2aWxTZXJ2aWNlTmFtZSA/XG4gICAgICAgICAgLy8gICB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLmNhZHJlRGV0YWlscy5jaXZpbFNlcnZpY2VOYW1lIDogJ04vQSdcbiAgICAgICAgICBmaWVsZFRvQWRkLmFuc3dlciA9IF8uZ2V0KHRoaXMudXNlclByb2ZpbGVPYmplY3QsICdwcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMuY2l2aWxTZXJ2aWNlTmFtZScsICdOL0EnKVxuICAgICAgICB9XG4gICAgICAgIGRhdGFPYmplY3QucHVzaChmaWVsZFRvQWRkKVxuICAgICAgfVxuXG4gICAgICBpZiAoX2ZpZWxkLmZpZWxkID09PSAncHJvZmlsZURldGFpbHMuY2FkcmVEZXRhaWxzLmNhZHJlTmFtZScpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuU2hvd3Nob3dDYWRyZURldGFpbHMgJiYgdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2lzQ2FkcmUnXS52YWx1ZSAmJiBzdGF0dXMpIHtcbiAgICAgICAgICAvLyBkYXRhT2JqZWN0W19maWVsZC5uYW1lXSA9IHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydjYWRyZU5hbWUnXS52YWx1ZVxuICAgICAgICAgIGZpZWxkVG9BZGQuYW5zd2VyID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2NhZHJlTmFtZSddLnZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGRUb0FkZC5hbnN3ZXIgPSBfLmdldCh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LCAncHJvZmlsZURldGFpbHMuY2FkcmVEZXRhaWxzLmNhZHJlTmFtZScsICdOL0EnKVxuICAgICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMgJiYgdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMuY2FkcmVOYW1lID9cbiAgICAgICAgICAvLyAgIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuY2FkcmVEZXRhaWxzLmNhZHJlTmFtZSA6ICdOL0EnXG4gICAgICAgIH1cbiAgICAgICAgZGF0YU9iamVjdC5wdXNoKGZpZWxkVG9BZGQpXG4gICAgICB9XG4gICAgICBpZiAoX2ZpZWxkLmZpZWxkID09PSAncHJvZmlsZURldGFpbHMuY2FkcmVEZXRhaWxzLmNhZHJlQmF0Y2gnKSB7XG4gICAgICAgIGlmICh0aGlzLmNhblNob3dzaG93Q2FkcmVEZXRhaWxzICYmIHRoaXMudXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydpc0NhZHJlJ10udmFsdWUgJiYgc3RhdHVzKSB7XG4gICAgICAgICAgLy8gZGF0YU9iamVjdFtfZmllbGQubmFtZV0gPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snY2FkcmVCYXRjaCddLnZhbHVlXG4gICAgICAgICAgZmllbGRUb0FkZC5hbnN3ZXIgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snY2FkcmVCYXRjaCddLnZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZGF0YU9iamVjdFtfZmllbGQubmFtZV0gPSB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLmNhZHJlRGV0YWlscyAmJiB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLmNhZHJlRGV0YWlscy5jYWRyZUJhdGNoID9cbiAgICAgICAgICAvLyAgIEpTT04uc3RyaW5naWZ5KHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuY2FkcmVEZXRhaWxzLmNhZHJlQmF0Y2gpIDogJ04vQSdcbiAgICAgICAgICBmaWVsZFRvQWRkLmFuc3dlciA9IF8uZ2V0KHRoaXMudXNlclByb2ZpbGVPYmplY3QsICdwcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMuY2FkcmVCYXRjaCcpID8gSlNPTi5zdHJpbmdpZnkodGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMuY2FkcmVCYXRjaCkgOiAnTi9BJ1xuICAgICAgICB9XG4gICAgICAgIGRhdGFPYmplY3QucHVzaChmaWVsZFRvQWRkKVxuICAgICAgfVxuXG4gICAgICBpZiAoX2ZpZWxkLmZpZWxkID09PSAncHJvZmlsZURldGFpbHMuY2FkcmVEZXRhaWxzLmNhZHJlQ29udHJvbGxpbmdBdXRob3JpdHlOYW1lJykge1xuICAgICAgICBpZiAodGhpcy5jYW5TaG93c2hvd0NhZHJlRGV0YWlscyAmJiB0aGlzLnVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snaXNDYWRyZSddLnZhbHVlICYmIHN0YXR1cykge1xuICAgICAgICAgIC8vIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gdGhpcy5jYWRyZUNvbnRyb2xsaW5nQXV0aG9yaXR5XG4gICAgICAgICAgZmllbGRUb0FkZC5hbnN3ZXIgPSB0aGlzLmNhZHJlQ29udHJvbGxpbmdBdXRob3JpdHlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBkYXRhT2JqZWN0W19maWVsZC5uYW1lXSA9IHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuY2FkcmVEZXRhaWxzICYmIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuY2FkcmVEZXRhaWxzLmNhZHJlQ29udHJvbGxpbmdBdXRob3JpdHlOYW1lID9cbiAgICAgICAgICAvLyAgIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuY2FkcmVEZXRhaWxzLmNhZHJlQ29udHJvbGxpbmdBdXRob3JpdHlOYW1lIDogJ04vQSdcbiAgICAgICAgICBmaWVsZFRvQWRkLmFuc3dlciA9IF8uZ2V0KHRoaXMudXNlclByb2ZpbGVPYmplY3QsICdwcm9maWxlRGV0YWlscy5jYWRyZURldGFpbHMuY2FkcmVDb250cm9sbGluZ0F1dGhvcml0eU5hbWUnLCAnTi9BJylcbiAgICAgICAgfVxuICAgICAgICBkYXRhT2JqZWN0LnB1c2goZmllbGRUb0FkZClcbiAgICAgIH1cblxuICAgICAgaWYgKF9maWVsZC5maWVsZCA9PT0gJ3Byb2ZpbGVEZXRhaWxzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmV4dGVybmFsU3lzdGVtSWQnKSB7XG4gICAgICAgIGlmICh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzICYmXG4gICAgICAgICAgdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5hZGRpdGlvbmFsUHJvcGVydGllcy5leHRlcm5hbFN5c3RlbUlkKSB7XG4gICAgICAgICAgLy8gZGF0YU9iamVjdFtfZmllbGQubmFtZV0gPSB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzICYmIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuYWRkaXRpb25hbFByb3BlcnRpZXMuZXh0ZXJuYWxTeXN0ZW1JZFxuICAgICAgICAgIC8vICAgPyB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmV4dGVybmFsU3lzdGVtSWQgOiBcIk4vQVwiXG4gICAgICAgICAgZmllbGRUb0FkZC5hbnN3ZXIgPSBfLmdldCh0aGlzLnVzZXJQcm9maWxlT2JqZWN0LCAncHJvZmlsZURldGFpbHMuYWRkaXRpb25hbFByb3BlcnRpZXMuZXh0ZXJuYWxTeXN0ZW1JZCcsICdOL0EnKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhdGFPYmplY3RbX2ZpZWxkLm5hbWVdID0gJ04vQSdcbiAgICAgICAgfVxuICAgICAgICBkYXRhT2JqZWN0LnB1c2goZmllbGRUb0FkZClcbiAgICAgIH1cblxuICAgICAgaWYgKF9maWVsZC5maWVsZCA9PT0gJ3Byb2ZpbGVEZXRhaWxzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmV4dGVybmFsU3lzdGVtRG9yJykge1xuICAgICAgICBpZiAodGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5hZGRpdGlvbmFsUHJvcGVydGllcyAmJlxuICAgICAgICAgIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuYWRkaXRpb25hbFByb3BlcnRpZXMuZXh0ZXJuYWxTeXN0ZW1Eb3IpIHtcbiAgICAgICAgICAvLyBkYXRhT2JqZWN0W19maWVsZC5uYW1lXSA9IHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMuYWRkaXRpb25hbFByb3BlcnRpZXMgJiYgdGhpcy51c2VyUHJvZmlsZU9iamVjdC5wcm9maWxlRGV0YWlscy5hZGRpdGlvbmFsUHJvcGVydGllcy5leHRlcm5hbFN5c3RlbURvclxuICAgICAgICAgIC8vICAgPyB0aGlzLnVzZXJQcm9maWxlT2JqZWN0LnByb2ZpbGVEZXRhaWxzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmV4dGVybmFsU3lzdGVtRG9yIDogXCJOL0FcIlxuICAgICAgICAgIGZpZWxkVG9BZGQuYW5zd2VyID0gXy5nZXQodGhpcy51c2VyUHJvZmlsZU9iamVjdCwgJ3Byb2ZpbGVEZXRhaWxzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmV4dGVybmFsU3lzdGVtRG9yJywgJ04vQScpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZGF0YU9iamVjdFtfZmllbGQubmFtZV0gPSAnTi9BJ1xuICAgICAgICAgIGZpZWxkVG9BZGQuYW5zd2VyID0gJ04vQSdcbiAgICAgICAgfVxuICAgICAgICBkYXRhT2JqZWN0LnB1c2goZmllbGRUb0FkZClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIGRhdGFPYmplY3RcbiAgfVxuXG4gIHVwZGF0ZUVtYWlsKGVtYWlsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwb3N0RGF0YSA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgJ3VzZXJJZCc6IHRoaXMuY29uZmlnU3JjLnVuTWFwcGVkVXNlci5pZCxcbiAgICAgICAgJ2NvbnRleHRUb2tlbic6IHRoaXMuY29udGV4dFRva2VuLFxuICAgICAgICAncHJvZmlsZURldGFpbHMnOiB7XG4gICAgICAgICAgJ3BlcnNvbmFsRGV0YWlscyc6IHtcbiAgICAgICAgICAgICdwcmltYXJ5RW1haWwnOiBlbWFpbCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICB0aGlzLmFkZExvYWRlciA9IHRoaXMuYWRkTG9hZGVyICsgMVxuICAgIHRoaXMudXNlclByb2ZpbGVTZXJ2aWNlLnVwZGF0ZVByaW1hcnlFbWFpbERldGFpbHMocG9zdERhdGEpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95U3ViamVjdCQpKVxuICAgICAgLnN1YnNjcmliZSgoX3JlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuYWRkTG9hZGVyID0gdGhpcy5hZGRMb2FkZXIgLSAxXG4gICAgICAgIHRoaXMudXNlclByb2ZpbGVPYmplY3QucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLnByaW1hcnlFbWFpbCA9IGVtYWlsXG4gICAgICAgIHRoaXMuc25hY2tCYXIub3Blbih0aGlzLmhhbmRsZVRyYW5zbGF0ZVRvKCdlbWFpbFVwZGF0ZWQnKSlcbiAgICAgIH0sIChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5hZGRMb2FkZXIgPSB0aGlzLmFkZExvYWRlciAtIDFcbiAgICAgICAgaWYgKCFlcnJvci5vaykge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3Blbih0aGlzLmhhbmRsZVRyYW5zbGF0ZVRvKCd1cGRhdGVFbWFpbEZhaWxlZCcpKVxuICAgICAgICB9XG4gICAgICB9KVxuICB9XG5cbiAgc2V0dXBTY3JvbGxMaXN0ZW5lcihvcGVuZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBzZWFyY2hEZXNpZ25hdGlvbkNvbnRyb2wgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ3NlYXJjaERlc2lnbmF0aW9uJyk7XG4gICAgaWYgKG9wZW5lZCAmJiBzZWFyY2hEZXNpZ25hdGlvbkNvbnRyb2wpIHtcbiAgICAgIHNlYXJjaERlc2lnbmF0aW9uQ29udHJvbC5zZXRWYWx1ZSgnJylcbiAgICAgIHRoaXMuZGVzaWduYXRpb25zT2Zmc2V0ID0gMFxuICAgICAgdGhpcy5kZXNpZ25hdGlvbnNNZXRhID0gW107XG4gICAgICB0aGlzLmdldGRlc2lnbmF0aW9uc01ldGEoKVxuICAgICAgY29uc3Qgc2VhcmNoSW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoLWlucHV0JykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgIGlmIChzZWFyY2hJbnB1dCkge1xuICAgICAgICBzZWFyY2hJbnB1dC5mb2N1cygpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWF0LXNlbGVjdC1wYW5lbCcpO1xuICAgICAgaWYgKHBhbmVsKSB7XG4gICAgICAgIHBhbmVsLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25EZXNpZ25hdGlvblNlbGVjdFNjcm9sbC5iaW5kKHRoaXMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkRlc2lnbmF0aW9uU2VsZWN0U2Nyb2xsKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgLy8gQ2hlY2sgaWYgdXNlciBoYXMgc2Nyb2xsZWQgdG8gdGhlIGJvdHRvbSAod2l0aCBhIHNtYWxsIHRocmVzaG9sZClcbiAgICAgIGlmIChlbGVtZW50LnNjcm9sbFRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0ID49IGVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gNSkge1xuICAgICAgICAvLyBPbmx5IGxvYWQgbW9yZSBpZiBub3QgYWxyZWFkeSBsb2FkaW5nIGFuZCBpZiB0aGVyZSBhcmUgcG90ZW50aWFsbHkgbW9yZSBpdGVtc1xuICAgICAgICBpZiAoIXRoaXMuaXNMb2FkaW5nTW9yZURlc2lnbmF0aW9ucyAmJiB0aGlzLmRlc2lnbmF0aW9uc01ldGEubGVuZ3RoIDwgdGhpcy5kZXNpZ25hdGlvbnNUb3RhbENvdW50KSB7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmdNb3JlRGVzaWduYXRpb25zID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmRlc2lnbmF0aW9uc09mZnNldCArPSAxO1xuICAgICAgICAgIHRoaXMuZ2V0ZGVzaWduYXRpb25zTWV0YSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgfVxuXG4gIGNoZWNrQ3VycmVudERlc2lnbmF0aW9uUHJlc2VudCgpIHtcbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgZGVzaWduYXRpb24gdmFsdWVcbiAgICBjb25zdCBzZWFyY2hEZXNpZ25hdGlvbkNvbnRyb2wgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ2Rlc2lnbmF0aW9uJyk7XG4gICAgY29uc3QgY3VycmVudERlc2lnbmF0aW9uID0gc2VhcmNoRGVzaWduYXRpb25Db250cm9sID8gc2VhcmNoRGVzaWduYXRpb25Db250cm9sLnZhbHVlIDogJyc7XG4gICAgLy8gQ2hlY2sgaWYgY3VycmVudCBkZXNpZ25hdGlvbiBleGlzdHMgaW4gdGhlIGxpc3RcbiAgICBpZiAoY3VycmVudERlc2lnbmF0aW9uKSB7XG4gICAgICBjb25zdCBkZXNpZ25hdGlvbkV4aXN0cyA9IHRoaXMuZGVzaWduYXRpb25zTWV0YS5zb21lKFxuICAgICAgICAoZGVzaWduYXRpb246IGFueSkgPT4gZGVzaWduYXRpb24ubmFtZS50b0xvd2VyQ2FzZSgpID09PSBjdXJyZW50RGVzaWduYXRpb24udG9Mb3dlckNhc2UoKVxuICAgICAgKTtcblxuICAgICAgLy8gSWYgZGVzaWduYXRpb24gZG9lc24ndCBleGlzdCBpbiB0aGUgbGlzdCwgYWRkIGl0XG4gICAgICBpZiAoIWRlc2lnbmF0aW9uRXhpc3RzKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBkZXNpZ25hdGlvbiBvYmplY3QgdG8gbWF0Y2ggdGhlIHN0cnVjdHVyZSBvZiBvdGhlciBpdGVtc1xuICAgICAgICBjb25zdCBuZXdEZXNpZ25hdGlvbiA9IHtcbiAgICAgICAgICBuYW1lOiBjdXJyZW50RGVzaWduYXRpb24sXG4gICAgICAgICAgc3RhdHVzOiAnQWN0aXZlJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRlc2lnbmF0aW9uc01ldGEudW5zaGlmdChuZXdEZXNpZ25hdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25EZXNpZ25hdGlvbkRyb3Bkb3duQ2xvc2VkKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlYXJjaERlc2lnbmF0aW9uQ29udHJvbCA9IHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgnc2VhcmNoRGVzaWduYXRpb24nKTtcbiAgICBpZiAoc2VhcmNoRGVzaWduYXRpb25Db250cm9sKSB7XG4gICAgICBzZWFyY2hEZXNpZ25hdGlvbkNvbnRyb2wuc2V0VmFsdWUoJycpXG4gICAgICB0aGlzLmRlc2lnbmF0aW9uU2VhcmNoVGV4dCA9ICcnXG4gICAgfVxuICAgIHRoaXMuY2hlY2tDdXJyZW50RGVzaWduYXRpb25QcmVzZW50KClcbiAgfVxuXG59XG4iLCI8ZGl2ICNmdWxsU2NyZWVuQ29udGFpbmVyPlxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctaGVhZGVyIHRleHQtcmlnaHQgbWItMlwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbiBub3RyYW5zbGF0ZSBtYXRlcmlhbC1pY29ucyBjbG9zZS1pY29uIGN1cnNvci1wb2ludGVyXCIgbWF0cHJlZml4PVwiXCIgcm9sZT1cImltZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIFttYXQtZGlhbG9nLWNsb3NlXT1cImZhbHNlXCI+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvZGl2PlxuICAgIDxoMT4ge3tkYXRhPy5jb3Vyc2VOYW1lfX0gPC9oMT5cbiAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCIgKm5nSWY9XCIhaXNMb2FkaW5nXCI+XG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInVzZXJEZXRhaWxzRm9ybVwiIGNsYXNzPVwidXNlckRldGFpbHNGb3JtXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiICpuZ0lmPVwiY2FuU2hvd05hbWVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LXNlbWlib2xkIG1hcmdpbi0wIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICBpMThuPVwiVGl0bGUgbGFiZWx8TGFiZWwgd2hpY2ggZXhwbGFpbnMgdGhlIHVzZXIgdG8gZW50ZXIgdGl0bGVcIj5cbiAgICAgICAgICAgICAgICB7eyAncHJvZmlsZUluZm8ubmFtZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImlucHV0LXRleHRcIiBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgcGxhY2Vob2xkZXI9XCJOYW1lXCIvPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCIgKm5nSWY9XCJjYW5TaG93T3JnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1zZW1pYm9sZCBtYXJnaW4tMCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgaTE4bj1cIlRpdGxlIGxhYmVsfExhYmVsIHdoaWNoIGV4cGxhaW5zIHRoZSB1c2VyIHRvIGVudGVyIHRpdGxlXCI+XG4gICAgICAgICAgICAgICAge3sgKHNob3dEb3B0Q2hhbmdlcyA/ICdwcm9maWxlSW5mby5wcmVzZW50T3JnYW5pc2F0aW9uJyA6ICdwcm9maWxlSW5mby5vcmdhbmlzYXRpb24nKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiaW5wdXQtdGV4dFwiIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm9yZ2FuaXNhdGlvblwiIHBsYWNlaG9sZGVyPVwiT3JnYW5pc2F0aW9uXCIvPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCIgKm5nSWY9XCJjYW5TaG93RW1haWxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LXNlbWlib2xkIG1hcmdpbi0wIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICBpMThuPVwiVGl0bGUgbGFiZWx8TGFiZWwgd2hpY2ggZXhwbGFpbnMgdGhlIHVzZXIgdG8gZW50ZXIgdGl0bGVcIj5cbiAgICAgICAgICAgICAgICB7eyAncHJvZmlsZUluZm8uZW1haWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJpbnB1dC10ZXh0XCIgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicHJpbWFyeUVtYWlsXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBlbWFpbFwiIChrZXl1cCk9XCJoYW5kbGVFbXB0eSgncHJpbWFyeUVtYWlsJylcIi8+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1lcnJvciBjbGFzcz1cIm1hdC1lcnJvclwiICpuZ0lmPVwidXNlckRldGFpbHNGb3JtLmdldCgncHJpbWFyeUVtYWlsJykuaGFzRXJyb3IoJ3JlcXVpcmVkJykgfHwgdXNlckRldGFpbHNGb3JtLmdldCgncHJpbWFyeUVtYWlsJykuaGFzRXJyb3IoJ3BhdHRlcm4nKVwiPlxuICAgICAgICAgICAgICB7eyAncHJvZmlsZUluZm8uaW52YWxpZEVtYWlsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZFwiICpuZ0lmPVwidmVyaWZ5RW1haWwgJiYgIW90cFNlbnQgJiYgIWVWZXJpZmllZFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdldC1vdHBcIiAoY2xpY2spPVwiaGFuZGxlR2VuZXJhdGVFbWFpbE9UUCgnZW1haWwnKVwiPnt7ICdwcm9maWxlSW5mby5nZXRPVFAnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJlbWFpbE90cFNlbnRcIj5cbiAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJlbWFpbE90cEZvcm1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBlbnRlci1vdHBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtc2VtaWJvbGQgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIGkxOG49XCJUaXRsZSBsYWJlbHxMYWJlbCB3aGljaCBleHBsYWlucyB0aGUgdXNlciB0byBlbnRlciB0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdwcm9maWxlSW5mby5lbnRlck9UUCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+VGltZSBSZW1haW5pbmc6IDxzcGFuICNlbWFpbFRpbWVyRGl2Pjwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJwcm9maWxlLWZvcm0tZmllbGQgbW9iaWxlLW51bVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJlT3RwXCIgY2xhc3M9XCJpbnB1dC10ZXh0IGN1c3RvbS1zaXplXCIgcGxhY2Vob2xkZXI9XCJ7eyAncHJvZmlsZUluZm8uZW50ZXJUaGVPVFAnIHwgdHJhbnNsYXRlIH19XCIgbWF4bGVuZ3RoPVwiNlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCJzaG93RW1haWxSZXNlbmRPVFBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lclwiPnt7ICdwcm9maWxlSW5mby5kaWROb3RSZWNlaXZlT1RQJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc2VuZC1vdHBcIiAoY2xpY2spPVwiaGFuZGxlUmVzZW5kRW1haWxPVFAoKVwiPiZuYnNwOyZuYnNwO3t7ICdwcm9maWxlSW5mby5yZXNlbnRPVFAnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBtYi00XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNhdmUtYnV0dG9uXCIgKGNsaWNrKT1cInZlcmlmeUVtYWlsT1RQKClcIj57eyAncHJvZmlsZUluZm8uc3VibWl0JyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIiAqbmdJZj1cImNhblNob3dHcm91cFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtc2VtaWJvbGQgbWFyZ2luLTAgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICBpMThuPVwiVGl0bGUgbGFiZWx8TGFiZWwgd2hpY2ggZXhwbGFpbnMgdGhlIHVzZXIgdG8gZW50ZXIgdGl0bGVcIj5cbiAgICAgICAgICAgICAge3sgJ3Byb2ZpbGVJbmZvLmdyb3VwJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImdyb3VwXCIgcGxhY2Vob2xkZXI9XCJ7eyAncHJvZmlsZUluZm8uY2hvb3NlQUdyb3VwJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGdyb3VwIG9mIGdyb3VwRGF0YVwiIHZhbHVlPVwie3tncm91cH19XCI+e3sgZ3JvdXAgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIG1iLTJcIiAqbmdJZj1cInNob3dEb3B0Q2hhbmdlc1wiPlxuICAgICAgICAgICAgICB7eydwcm9maWxlSW5mby5ncm91cE5vdGUnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCByZWxhdGl2ZVwiICpuZ0lmPVwiY2FuU2hvd0Rlc2lnbmF0aW9uXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtc2VtaWJvbGQgbWFyZ2luLTAgcmVxdWlyZWRcIlxuICAgICAgICAgICAgaTE4bj1cIlRpdGxlIGxhYmVsfExhYmVsIHdoaWNoIGV4cGxhaW5zIHRoZSB1c2VyIHRvIGVudGVyIHRpdGxlXCI+XG4gICAgICAgICAgICB7eyAncHJvZmlsZUluZm8uZGVzaWduYXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgYXV0by1jb21wbGV0ZS1yb3cgcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJpbnB1dC10ZXh0IGhpZ2gtemluZGV4XCIgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZGVzaWduYXRpb25cIlxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCJmaWx0ZXJkZXNpZ25hdGlvbigkZXZlbnQudGFyZ2V0LnZhbHVlKVwiIChmb2N1cyk9XCJvbkRlc2lnbmF0aW9uc0ZvY3VzKClcIiAjdGV4dEJveFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ3Byb2ZpbGVJbmZvLmNob29zZUFEZXNpZ25hdGlvbicgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiZGlzYWduYXRpb24tY2FyZXRcIj5hcnJvd19kcm9wX2Rvd248L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD4gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1zZWxlY3QtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZpeGVkLWhlaWdodC1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgcGxhY2Vob2xkZXI9XCJ7eyAncHJvZmlsZUluZm8uY2hvb3NlQURlc2lnbmF0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiIGZvcm1Db250cm9sTmFtZT1cImRlc2lnbmF0aW9uXCIgIChjbG9zZWQpPVwib25EZXNpZ25hdGlvbkRyb3Bkb3duQ2xvc2VkKClcIiAob3BlbmVkQ2hhbmdlKT1cInNldHVwU2Nyb2xsTGlzdGVuZXIoJGV2ZW50KVwiICBwYW5lbENsYXNzPVwic2VhcmNoLXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBTdGlja3kgc2VhcmNoIGlucHV0IGNvbnRhaW5lciAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RpY2t5LXNlYXJjaC1jb250YWluZXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWlucHV0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBkZXNpZ25hdGlvblwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzZWFyY2hEZXNpZ25hdGlvblwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWFyY2hEZXNpZ25hdGlvbj8udmFsdWVcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNsZWFyLWJ1dHRvblwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VhcmNoRGVzaWduYXRpb24/LnNldFZhbHVlKCcnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDinJVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIE9wdGlvbnMgbGlzdCAtLT5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGRlc2lnbmF0aW9uc01ldGEgXCIgW3ZhbHVlXT1cIm9wdGlvbj8ubmFtZVwiIChjbGljayk9XCJzZWxlY3REZXNpZ25hdGlvbihvcHRpb24/Lm5hbWUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHRpb24/Lm5hbWUgfX1cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgIDwhLS0gTG9hZGluZyBpbmRpY2F0b3IgLS0+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nTW9yZURlc2lnbmF0aW9uc1wiIGNsYXNzPVwibG9hZGluZy1pbmRpY2F0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgTG9hZGluZyBtb3JlLi4uXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIE5vIHJlc3VsdHMgbWVzc2FnZSAtLT5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cIihkZXNpZ25hdGlvbnNNZXRhICk/Lmxlbmd0aCA9PT0gMFwiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgICAgICAgTm8gbWF0Y2hlcyBmb3VuZFxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwidXNlckRldGFpbHNGb3JtPy5jb250cm9sc1snZGVzaWduYXRpb24nXT8uaW52YWxpZCAmJiB1c2VyRGV0YWlsc0Zvcm0/LmNvbnRyb2xzWydkZXNpZ25hdGlvbiddPy50b3VjaGVkXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1lcnJvclwiPlxuICAgICAgICAgICAgICAgIFBsZWFzZSBzZWxlY3QgYSB2YWxpZCBkZXNpZ25hdGlvbi5cbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIG1iLTJcIiAqbmdJZj1cInNob3dEb3B0Q2hhbmdlc1wiPlxuICAgICAgICAgICAge3sncHJvZmlsZUluZm8uZGVzaWduYXRpb25Ob3RlJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiYXV0by1saXN0IGZsZXggZmxleC1jb2wgaWdub3JlLWJsdXJcIiAjZHJvcGRvd25cbiAgICAgICAgICAgICpuZ0lmPVwib3BlbkRlc2lnbmF0aW9uRHJvcGRvd24gJiYgZmlsdGVyRGVzaWduYXRpb25zTWV0YS5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxkaXYgKG1vdXNlZG93bik9XCJwcmV2ZW50Qmx1cigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtIHt7dXNlckRldGFpbHNGb3JtLmNvbnRyb2xzWydkZXNpZ25hdGlvbiddPy52YWx1ZT8udG9Mb3dlckNhc2UoKSA9PT0gZGVzaWduYXRpb24/Lm5hbWU/LnRvTG93ZXJDYXNlKCkgPyAnaXRlbS1hY3RpdmUnIDogJyd9fVwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkZXNpZ25hdGlvbiBvZiBmaWx0ZXJEZXNpZ25hdGlvbnNNZXRhXCIgKGNsaWNrKT1cInNlbGVjdERlc2lnbmF0aW9uKGRlc2lnbmF0aW9uLm5hbWUpXCI+XG4gICAgICAgICAgICAgIHt7IGRlc2lnbmF0aW9uPy5uYW1lIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHJlbGF0aXZlXCIgKm5nSWY9XCJjYW5TaG93RGVzaWduYXRpb24gJiYgY2FuU2hvd090aGVyRGVzaWduYXRpb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1zZW1pYm9sZCBtYXJnaW4tMCByZXF1aXJlZFwiXG4gICAgICAgICAgICBpMThuPVwiVGl0bGUgbGFiZWx8TGFiZWwgd2hpY2ggZXhwbGFpbnMgdGhlIHVzZXIgdG8gZW50ZXIgdGl0bGVcIj5cbiAgICAgICAgICAgIHt7ICdwcm9maWxlSW5mby5vdGhlckRlc2lnbmF0aW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJjYW5TaG93T3RoZXJEZXNpZ25hdGlvblwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJpbnB1dC10ZXh0XCIgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwib3RoZXJEZXNpZ25hdGlvblwiIHBsYWNlaG9sZGVyPVwie3sgJ3Byb2ZpbGVJbmZvLmVudGVyRGVzaWduYXRpb24nIHwgdHJhbnNsYXRlIH19XCIvPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiICpuZ0lmPVwiY2FuU2hvd0VtcGxveWVlQ29kZVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1zZW1pYm9sZCBtYXJnaW4tMCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICBpMThuPVwiVGl0bGUgbGFiZWx8TGFiZWwgd2hpY2ggZXhwbGFpbnMgdGhlIHVzZXIgdG8gZW50ZXIgdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdwcm9maWxlSW5mby5lbXBsb3llZUlkJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiaW5wdXQtdGV4dFwiIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImVtcGxveWVlQ29kZVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgZW1wbG95ZWUgY29kZVwiLz5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD4gICAgXG4gICAgICAgICAgICAgIDxtYXQtZXJyb3IgY2xhc3M9XCJtYXQtZXJyb3JcIiAqbmdJZj1cInVzZXJEZXRhaWxzRm9ybT8uZ2V0KCdlbXBsb3llZUNvZGUnKT8uaGFzRXJyb3IoJ3BhdHRlcm4nKVwiPlxuICAgICAgICAgICAgICAgIFBsZWFzZSBlbnRlciBhbiBBbHBoYS1udW1lcmljIHZhbHVlIG9ubHlcbiAgICAgICAgICAgIDwvbWF0LWVycm9yPiAgICAgICAgICAgICAgICBcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCIgKm5nSWY9XCJjYW5zaG93TW9iaWxlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1zZW1pYm9sZCBtYXJnaW4tMCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgaTE4bj1cIlRpdGxlIGxhYmVsfExhYmVsIHdoaWNoIGV4cGxhaW5zIHRoZSB1c2VyIHRvIGVudGVyIHRpdGxlXCI+XG4gICAgICAgICAgICAgICAge3sgJ3Byb2ZpbGVJbmZvLm1vYmlsZU51bWJlcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50cnktY29kZSBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgKzkxXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwibW9iaWxlLW51bVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImlucHV0LXRleHQgbW9iaWxlLXRleHQgcmVsYXRpdmVcIiBtYXhsZW5ndGg9XCIxMFwiIChrZXl1cCk9XCJoYW5kbGVFbXB0eSgnbW9iaWxlJylcIlxuICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm1vYmlsZVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgbW9iaWxlIG51bWJlclwiLz5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ2ZXJpZmllZC1jaGVja1wiICpuZ0lmPVwibVZlcmlmaWVkXCI+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICA8bWF0LWVycm9yIGNsYXNzPVwibWF0LWVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInVzZXJEZXRhaWxzRm9ybS5nZXQoJ21vYmlsZScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpIHx8IHVzZXJEZXRhaWxzRm9ybS5nZXQoJ21vYmlsZScpLmhhc0Vycm9yKCdwYXR0ZXJuJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwcm9maWxlSW5mby5wbGVhc2VFbnRlclZhbGlkTW9iaWxlTnVtYmVyJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZFwiICpuZ0lmPVwidmVyaWZ5TW9iaWxlICYmICFvdHBTZW50ICYmICFtVmVyaWZpZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ2V0LW90cCBzbTptci00XCIgKGNsaWNrKT1cImhhbmRsZUdlbmVyYXRlT1RQKCdwaG9uZScpXCI+e3sgJ3Byb2ZpbGVJbmZvLmdldE9UUCcgfFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwib3RwU2VudFwiPiAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJvdHBGb3JtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZW50ZXItb3RwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LXNlbWlib2xkIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBpMThuPVwiVGl0bGUgbGFiZWx8TGFiZWwgd2hpY2ggZXhwbGFpbnMgdGhlIHVzZXIgdG8gZW50ZXIgdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAncHJvZmlsZUluZm8uZW50ZXJPVFAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlRpbWUgUmVtYWluaW5nOiA8c3BhbiAjdGltZXJEaXY+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInByb2ZpbGUtZm9ybS1maWVsZCBtb2JpbGUtbnVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm90cFwiIGNsYXNzPVwiaW5wdXQtdGV4dCBjdXN0b20tc2l6ZVwiIHBsYWNlaG9sZGVyPVwie3sgJ3Byb2ZpbGVJbmZvLmVudGVyVGhlT1RQJyB8IHRyYW5zbGF0ZSB9fVwiIG1heGxlbmd0aD1cIjZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlclwiICpuZ0lmPVwic2hvd1Jlc2VuZE9UUFwiPiAgXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZXJcIj57eyAncHJvZmlsZUluZm8uZGlkTm90UmVjZWl2ZU9UUCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNlbmQtb3RwXCIgKGNsaWNrKT1cImhhbmRsZVJlc2VuZE9UUCgpXCI+Jm5ic3A7Jm5ic3A7e3sgJ3Byb2ZpbGVJbmZvLnJlc2VudE9UUCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIG1iLTRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2F2ZS1idXR0b25cIiAoY2xpY2spPVwidmVyaWZ5TW9iaWxlT1RQKClcIj57eyAncHJvZmlsZUluZm8uc3VibWl0JyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCIgKm5nSWY9XCJjYW5TaG93R2VuZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1zZW1pYm9sZCBtYXJnaW4tMCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgIGkxOG49XCJUaXRsZSBsYWJlbHxMYWJlbCB3aGljaCBleHBsYWlucyB0aGUgdXNlciB0byBlbnRlciB0aXRsZVwiPlxuICAgICAgICAgICAgICB7eyAncHJvZmlsZUluZm8uZ2VuZGVyJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImdlbmRlclwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGdlbmRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgX2dlbmRlciBvZiBlVXNlckdlbmRlclwiIHZhbHVlPVwie3sgX2dlbmRlciB9fVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVHJhbnNsYXRlVG8oX2dlbmRlci50b0xvd2VyQ2FzZSgpKSB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiICpuZ0lmPVwiY2FuU2hvd0RvYlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1zZW1pYm9sZCBtYXJnaW4tMCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgaTE4bj1cIlRpdGxlIGxhYmVsfExhYmVsIHdoaWNoIGV4cGxhaW5zIHRoZSB1c2VyIHRvIGVudGVyIHRpdGxlXCI+XG4gICAgICAgICAgICAgICAge3sgJ3Byb2ZpbGVJbmZvLmRvYicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgY2xhc3M9XCJpbnB1dC10ZXh0IGljb24taW5jbHVkZS1pbnB1dFwiIFttYXhdPVwiY3VycmVudERhdGVcIiBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRGF0ZVwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZG9iXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZGF0ZSBvZiBiaXJ0aFwiIC8+XG4gICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHJlbGF0aXZlXCIgKm5nSWY9XCJjYW5TaG93RG9taWNpbGVNZWRpdW1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LXNlbWlib2xkIG1hcmdpbi0wIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgaTE4bj1cIlRpdGxlIGxhYmVsfExhYmVsIHdoaWNoIGV4cGxhaW5zIHRoZSB1c2VyIHRvIGVudGVyIHRpdGxlXCI+XG4gICAgICAgICAgICAgIHt7ICdwcm9maWxlSW5mby5tb3RoZXJUb25ndWUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGF1dG8tY29tcGxldGUtcm93IHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJpbnB1dC10ZXh0IGhpZ2gtemluZGV4XCIgYXJpYS1sYWJlbD1cIkRvbWljaWxlIE1lZGl1bSAoTW90aGVyIFRvbmd1ZSlcIiBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZG9taWNpbGVNZWRpdW1cIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBtb3RoZXIgdG9uZ3VlXCJcbiAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJmaWx0ZXJMYW5ndWFnZSgkZXZlbnQudGFyZ2V0LnZhbHVlKVwiIChmb2N1cyk9XCJvbkxhbmd1YWdlRm9jdXMoKVwiICNsYW5ndWFnZVRleHRCb3gvPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1vdGhlci10b3VuZ3VlLWNhcmV0XCI+YXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snZG9taWNpbGVNZWRpdW0nXS5pbnZhbGlkICYmIHVzZXJEZXRhaWxzRm9ybS5jb250cm9sc1snZG9taWNpbGVNZWRpdW0nXS50b3VjaGVkXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1lcnJvclwiPlxuICAgICAgICAgICAgICAgICAgUGxlYXNlIHNlbGVjdCBhIHZhbGlkIG1vdGhlciB0b25ndWUuXG4gICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF1dG8tbGFuZ3VhZ2UtbGlzdCBmbGV4IGZsZXgtY29sIGlnbm9yZS1ibHVyXCIgI2xhbmd1YWdlRHJvcGRvd25cbiAgICAgICAgICAgICAgKm5nSWY9XCJvcGVuTGFuZ3VhZ2VEcm9wZG93biAmJiBtYXN0ZXJMYW5ndWFnZXM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8ZGl2IChtb3VzZWRvd24pPVwicHJldmVudExhbmd1YWdlQmx1cigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImxhbmd1YWdlLWl0ZW0ge3t1c2VyRGV0YWlsc0Zvcm0uY29udHJvbHNbJ2RvbWljaWxlTWVkaXVtJ10/LnZhbHVlPy50b0xvd2VyQ2FzZSgpID09PSBsYW5ndWFnZT8ubmFtZT8udG9Mb3dlckNhc2UoKSA/ICdsYW5ndWFnZS1pdGVtLWFjdGl2ZScgOiAnJ319XCJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbGFuZ3VhZ2Ugb2YgbWFzdGVyTGFuZ3VhZ2VzXCIgKGNsaWNrKT1cInNlbGVjdExhbmd1YWdlKGxhbmd1YWdlLm5hbWUpXCI+XG4gICAgICAgICAgICAgICAge3sgbGFuZ3VhZ2U/Lm5hbWUgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIiAqbmdJZj1cImNhblNob3dDYXRlZ29yeVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1zZW1pYm9sZCBtYXJnaW4tMCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgaTE4bj1cIlRpdGxlIGxhYmVsfExhYmVsIHdoaWNoIGV4cGxhaW5zIHRoZSB1c2VyIHRvIGVudGVyIHRpdGxlXCI+XG4gICAgICAgICAgICAgICAge3sgJ3Byb2ZpbGVJbmZvLmNhdGVnb3J5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImNhdGVnb3J5XCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgY2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIGVDYXRlZ29yeVwiIHZhbHVlPVwie3sgY2F0ZWdvcnkgfX1cIj57e1xuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRyYW5zbGF0ZVRvKGNhdGVnb3J5Py50b0xvd2VyQ2FzZSgpKSB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCIgKm5nSWY9XCJjYW5TaG93cGluQ29kZVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1zZW1pYm9sZCBtYXJnaW4tMCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICBpMThuPVwiVGl0bGUgbGFiZWx8TGFiZWwgd2hpY2ggZXhwbGFpbnMgdGhlIHVzZXIgdG8gZW50ZXIgdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICd1c2VyUHJvZmlsZS5vZmZpY2VQaW5Db2RlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBjbGFzcz1cImlucHV0LXRleHRcIiBtYXRJbnB1dCBtYXhsZW5ndGg9XCI2XCIgZm9ybUNvbnRyb2xOYW1lPVwicGluQ29kZVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgcGluY29kZVwiLz5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1lcnJvciBjbGFzcz1cIm1hdC1lcnJvclwiICpuZ0lmPVwidXNlckRldGFpbHNGb3JtPy5nZXQoJ3BpbkNvZGUnKT8uaGFzRXJyb3IoJ3BhdHRlcm4nKVwiPlxuICAgICAgICAgICAgICAgIHt7ICdwcm9maWxlSW5mby5pbnZhbGlkUGluQ29kZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj4gICAgICAgICAgXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiICpuZ0lmPVwiY2FuU2hvd3Nob3dDYWRyZURldGFpbHMgICYmICFzaG93RG9wdENoYW5nZXNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtc2VtaWJvbGQgbWFyZ2luLTAgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgIGkxOG49XCJUaXRsZSBsYWJlbHxMYWJlbCB3aGljaCBleHBsYWlucyB0aGUgdXNlciB0byBlbnRlciB0aXRsZVwiPlxuICAgICAgICAgICAgICAgIHt7ICdwcm9maWxlSW5mby5mcm9tR292T3JnYW5pemF0aW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJwcm9maWxlLWZvcm0tZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImlzQ2FkcmVcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cImdldElzQ2FkcmVTdGF0dXMoJGV2ZW50LnZhbHVlKVwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGNhZHJlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJ0cnVlXCI+WWVzPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiZmFsc2VcIj5ObzwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIiAqbmdJZj1cImNhblNob3dzaG93Q2FkcmVEZXRhaWxzICYmIGlzQ2FkcmVTdGF0dXMgICYmICFzaG93RG9wdENoYW5nZXNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtc2VtaWJvbGQgbWFyZ2luLTAgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgIGkxOG49XCJUaXRsZSBsYWJlbHxMYWJlbCB3aGljaCBleHBsYWlucyB0aGUgdXNlciB0byBlbnRlciB0aXRsZVwiPlxuICAgICAgICAgICAgICAgIHt7ICdwcm9maWxlSW5mby50eXBlT2ZDaXZpbFNlcnZpY2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInByb2ZpbGUtZm9ybS1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwidHlwZU9mQ2l2aWxTZXJ2aWNlXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJnZXRTZXJ2aWNlKCRldmVudC52YWx1ZSlcIiAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgdHlwZSBvZiBjaXZpbCBzZXJ2aWNlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBzZXJ2aWNlIG9mIGNpdmlsU2VydmljZVR5cGVzXCIgW3ZhbHVlXT1cInNlcnZpY2VcIj57eyBzZXJ2aWNlIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiICpuZ0lmPVwiY2FuU2hvd3Nob3dDYWRyZURldGFpbHMgJiYgdXNlckRldGFpbHNGb3JtLmdldCgndHlwZU9mQ2l2aWxTZXJ2aWNlJykudmFsdWUgJiYgdXNlckRldGFpbHNGb3JtLmdldCgnaXNDYWRyZScpLnZhbHVlICYmICFzaG93RG9wdENoYW5nZXNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtc2VtaWJvbGQgbWFyZ2luLTAgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgIGkxOG49XCJUaXRsZSBsYWJlbHxMYWJlbCB3aGljaCBleHBsYWlucyB0aGUgdXNlciB0byBlbnRlciB0aXRsZVwiPlxuICAgICAgICAgICAgICAgIHt7ICdwcm9maWxlSW5mby5zZXJ2aWNlVHlwZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwicHJvZmlsZS1mb3JtLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJzZXJ2aWNlVHlwZVwiIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZXJ2aWNlU2VsZWN0KCRldmVudClcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBzZXJ2aWNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHNlcnZpY2Ugb2Ygc2VydmljZU5hbWVcIiBbdmFsdWVdPVwic2VydmljZVwiPnt7IHNlcnZpY2UgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCIgKm5nSWY9XCJjYW5TaG93c2hvd0NhZHJlRGV0YWlscyAmJiB1c2VyRGV0YWlsc0Zvcm0uZ2V0KCdzZXJ2aWNlVHlwZScpLnZhbHVlICYmIFxuICAgICAgICAgICAgICB1c2VyRGV0YWlsc0Zvcm0uZ2V0KCdpc0NhZHJlJykudmFsdWUgXG4gICAgICAgICAgICAgICYmIHVzZXJEZXRhaWxzRm9ybS5nZXQoJ3R5cGVPZkNpdmlsU2VydmljZScpLnZhbHVlICYmIChcbiAgICAgICAgICAgICAgICAgIHVzZXJEZXRhaWxzRm9ybS5nZXQoJ3NlcnZpY2VUeXBlJykudmFsdWUgPT09ICdJbmRpYW4gQWRtaW5pc3RyYXRpdmUgU2VydmljZSAoSUFTKScgfHwgXG4gICAgICAgICAgICAgICAgICB1c2VyRGV0YWlsc0Zvcm0uZ2V0KCdzZXJ2aWNlVHlwZScpLnZhbHVlID09PSAnSW5kaWFuIFBvbGljZSBTZXJ2aWNlIChJUFMpJyB8fCBcbiAgICAgICAgICAgICAgICAgIHVzZXJEZXRhaWxzRm9ybS5nZXQoJ3NlcnZpY2VUeXBlJykudmFsdWUgPT09ICdJbmRpYW4gRm9yZXN0IFNlcnZpY2UgKElGb1MpJyBcbiAgICAgICAgICAgICAgICApICYmICFzaG93RG9wdENoYW5nZXNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtc2VtaWJvbGQgbWFyZ2luLTAgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgIGkxOG49XCJUaXRsZSBsYWJlbHxMYWJlbCB3aGljaCBleHBsYWlucyB0aGUgdXNlciB0byBlbnRlciB0aXRsZVwiPlxuICAgICAgICAgICAgICAgIHt7ICdwcm9maWxlSW5mby5jYWRyZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwicHJvZmlsZS1mb3JtLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJjYWRyZU5hbWVcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uQ2FkcmVTZWxlY3QoJGV2ZW50LnZhbHVlKVwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGNhZHJlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHN0YXRlIG9mIGNhZHJlXCIgW3ZhbHVlXT1cInN0YXRlXCI+e3sgc3RhdGUgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2hvd0RvcHRDaGFuZ2VzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCIgKm5nSWY9XCJjYW5TaG93c2hvd0NhZHJlRGV0YWlscyAmJiB1c2VyRGV0YWlsc0Zvcm0uZ2V0KCdzZXJ2aWNlVHlwZScpICYmICh1c2VyRGV0YWlsc0Zvcm0uZ2V0KCdzZXJ2aWNlVHlwZScpLnZhbHVlICYmIFxuICAgICAgICAgICAgdXNlckRldGFpbHNGb3JtLmdldCgnaXNDYWRyZScpLnZhbHVlICYmIHVzZXJEZXRhaWxzRm9ybS5nZXQoJ3R5cGVPZkNpdmlsU2VydmljZScpLnZhbHVlICYmIChcbiAgICAgICAgICAgICAgICB1c2VyRGV0YWlsc0Zvcm0uZ2V0KCdzZXJ2aWNlVHlwZScpLnZhbHVlID09PSAnSW5kaWFuIEFkbWluaXN0cmF0aXZlIFNlcnZpY2UgKElBUyknIHx8IFxuICAgICAgICAgICAgICAgIHVzZXJEZXRhaWxzRm9ybS5nZXQoJ3NlcnZpY2VUeXBlJykudmFsdWUgPT09ICdJbmRpYW4gUG9saWNlIFNlcnZpY2UgKElQUyknIHx8IFxuICAgICAgICAgICAgICAgIHVzZXJEZXRhaWxzRm9ybS5nZXQoJ3NlcnZpY2VUeXBlJykudmFsdWUgPT09ICdJbmRpYW4gRm9yZXN0IFNlcnZpY2UgKElGb1MpJyBcbiAgICAgICAgICAgICkgJiYgdXNlckRldGFpbHNGb3JtLmdldCgnY2FkcmVOYW1lJykudmFsdWUpICA/IHRydWUgOiAoKHVzZXJEZXRhaWxzRm9ybS5nZXQoJ3NlcnZpY2VUeXBlJykudmFsdWUgJiYgXG4gICAgICAgICAgICAgICAgdXNlckRldGFpbHNGb3JtLmdldCgnaXNDYWRyZScpLnZhbHVlIFxuICAgICAgICAgICAgJiYgdXNlckRldGFpbHNGb3JtLmdldCgndHlwZU9mQ2l2aWxTZXJ2aWNlJykudmFsdWUgJiYgKFxuICAgICAgICAgICAgICAgIHVzZXJEZXRhaWxzRm9ybS5nZXQoJ3NlcnZpY2VUeXBlJykudmFsdWUgIT09ICdJbmRpYW4gQWRtaW5pc3RyYXRpdmUgU2VydmljZSAoSUFTKScgJiYgXG4gICAgICAgICAgICAgICAgdXNlckRldGFpbHNGb3JtLmdldCgnc2VydmljZVR5cGUnKS52YWx1ZSAhPT0gJ0luZGlhbiBQb2xpY2UgU2VydmljZSAoSVBTKScgJiYgXG4gICAgICAgICAgICAgICAgdXNlckRldGFpbHNGb3JtLmdldCgnc2VydmljZVR5cGUnKS52YWx1ZSAhPT0gJ0luZGlhbiBGb3Jlc3QgU2VydmljZSAoSUZvUyknIFxuICAgICAgICAgICAgKSkpID8gdHJ1ZSA6IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtc2VtaWJvbGQgbWFyZ2luLTAgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgaTE4bj1cIlRpdGxlIGxhYmVsfExhYmVsIHdoaWNoIGV4cGxhaW5zIHRoZSB1c2VyIHRvIGVudGVyIHRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICB7eyAncHJvZmlsZUluZm8uYmF0Y2gnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJwcm9maWxlLWZvcm0tZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiY2FkcmVCYXRjaFwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGJhdGNoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgeWVhciBvZiB5ZWFyQXJyYXlcIiBbdmFsdWVdPVwieWVhclwiPnt7IHllYXIgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCIgKm5nSWY9XCJjYW5TaG93c2hvd0NhZHJlRGV0YWlscyAmJiB1c2VyRGV0YWlsc0Zvcm0uZ2V0KCdpc0NhZHJlJykudmFsdWUgJiYgIHVzZXJEZXRhaWxzRm9ybS5nZXQoJ2NhZHJlQmF0Y2gnKS52YWx1ZSAmJiAhc2hvd0RvcHRDaGFuZ2VzXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LXNlbWlib2xkIG1hcmdpbi0wIHJlcXVpcmVkIG1iLTNcIlxuICAgICAgICAgICAgICAgIGkxOG49XCJUaXRsZSBsYWJlbHxMYWJlbCB3aGljaCBleHBsYWlucyB0aGUgdXNlciB0byBlbnRlciB0aXRsZVwiPlxuICAgICAgICAgICAgICAgIHt7ICdwcm9maWxlSW5mby5jYWRyZUNvbnRyb2xsaW5nQXV0aG9yaXR5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYWRyZUNvbnRyb2wtbmFtZVwiPnt7Y2FkcmVDb250cm9sbGluZ0F1dGhvcml0eX19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGZsZXggZmxleC1yb3cgZ2FwLTQganVzdGlmeS1lbmQgbWFyZ2luLXRvcC1tXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cInNhdmUtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidXNlckRldGFpbHNGb3JtPy5pbnZhbGlkIHx8ICFtVmVyaWZpZWQgfHwgIWVWZXJpZmllZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU3VibWl0Rm9ybSh1c2VyRGV0YWlsc0Zvcm0pXCI+XG4gICAgICAgICAgICAgICAge3sgJ3Byb2ZpbGVJbmZvLnNhdmVDaGFuZ2VzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhZGRMb2FkZXIgPiAwXCIgPlxuICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG15LTIgbG9hZGVyIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxtYXQtc3Bpbm5lciBjbGFzcz1cImlubGluZS1ibG9ja1wiPjwvbWF0LXNwaW5uZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuIl19