@piserve-tech/form-submission 1.3.314 → 1.3.316

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 (443) hide show
  1. package/README.md +24 -24
  2. package/ng-package.json +30 -0
  3. package/package.json +33 -46
  4. package/{assets → src/assets}/icons/close-sidebar-mark-icon.svg +3 -3
  5. package/{assets → src/assets}/icons/copy-icon.svg +5 -5
  6. package/{assets → src/assets}/icons/delete-icon.svg +7 -7
  7. package/{assets → src/assets}/icons/delete-no-outline-icon.svg +7 -7
  8. package/src/environment/environment.ts +6 -0
  9. package/src/form-fields/aggregate-function/aggregate-function.component.html +63 -0
  10. package/src/form-fields/aggregate-function/aggregate-function.component.scss +1 -0
  11. package/src/form-fields/aggregate-function/aggregate-function.component.spec.ts +21 -0
  12. package/src/form-fields/aggregate-function/aggregate-function.component.ts +148 -0
  13. package/src/form-fields/check-box-fields/check-box-fields.component.html +81 -0
  14. package/src/form-fields/check-box-fields/check-box-fields.component.scss +28 -0
  15. package/src/form-fields/check-box-fields/check-box-fields.component.spec.ts +21 -0
  16. package/src/form-fields/check-box-fields/check-box-fields.component.ts +538 -0
  17. package/src/form-fields/currency-fields/currency-fields.component.html +85 -0
  18. package/src/form-fields/currency-fields/currency-fields.component.scss +48 -0
  19. package/src/form-fields/currency-fields/currency-fields.component.spec.ts +21 -0
  20. package/src/form-fields/currency-fields/currency-fields.component.ts +589 -0
  21. package/src/form-fields/date-time-fields/date-time-fields.component.html +268 -0
  22. package/src/form-fields/date-time-fields/date-time-fields.component.scss +88 -0
  23. package/src/form-fields/date-time-fields/date-time-fields.component.spec.ts +21 -0
  24. package/src/form-fields/date-time-fields/date-time-fields.component.ts +693 -0
  25. package/src/form-fields/drop-down-fields/drop-down-fields.component.html +77 -0
  26. package/src/form-fields/drop-down-fields/drop-down-fields.component.scss +12 -0
  27. package/src/form-fields/drop-down-fields/drop-down-fields.component.spec.ts +21 -0
  28. package/src/form-fields/drop-down-fields/drop-down-fields.component.ts +698 -0
  29. package/src/form-fields/file-picker-fields/file-picker-fields.component.html +72 -0
  30. package/src/form-fields/file-picker-fields/file-picker-fields.component.scss +33 -0
  31. package/src/form-fields/file-picker-fields/file-picker-fields.component.spec.ts +21 -0
  32. package/src/form-fields/file-picker-fields/file-picker-fields.component.ts +256 -0
  33. package/src/form-fields/form-fields.module.ts +110 -0
  34. package/src/form-fields/hidden-field/hidden-field.component.scss +0 -0
  35. package/src/form-fields/hidden-field/hidden-field.component.spec.ts +21 -0
  36. package/src/form-fields/hidden-field/hidden-field.component.ts +156 -0
  37. package/src/form-fields/iframe-fields/iframe-fields.component.html +31 -0
  38. package/src/form-fields/iframe-fields/iframe-fields.component.scss +0 -0
  39. package/src/form-fields/iframe-fields/iframe-fields.component.spec.ts +21 -0
  40. package/src/form-fields/iframe-fields/iframe-fields.component.ts +225 -0
  41. package/src/form-fields/location-fields/location-fields.component.html +54 -0
  42. package/src/form-fields/location-fields/location-fields.component.scss +22 -0
  43. package/src/form-fields/location-fields/location-fields.component.spec.ts +21 -0
  44. package/src/form-fields/location-fields/location-fields.component.ts +83 -0
  45. package/src/form-fields/mail-fields/mail-fields.component.html +66 -0
  46. package/src/form-fields/mail-fields/mail-fields.component.scss +10 -0
  47. package/src/form-fields/mail-fields/mail-fields.component.spec.ts +21 -0
  48. package/src/form-fields/mail-fields/mail-fields.component.ts +127 -0
  49. package/src/form-fields/mobile-fields/mobile-fields.component.html +97 -0
  50. package/src/form-fields/mobile-fields/mobile-fields.component.scss +52 -0
  51. package/src/form-fields/mobile-fields/mobile-fields.component.spec.ts +21 -0
  52. package/src/form-fields/mobile-fields/mobile-fields.component.ts +310 -0
  53. package/src/form-fields/number-fields/number-fields.component.html +70 -0
  54. package/src/form-fields/number-fields/number-fields.component.scss +17 -0
  55. package/src/form-fields/number-fields/number-fields.component.spec.ts +21 -0
  56. package/src/form-fields/number-fields/number-fields.component.ts +256 -0
  57. package/src/form-fields/password-fields/password-fields.component.html +113 -0
  58. package/src/form-fields/password-fields/password-fields.component.scss +61 -0
  59. package/src/form-fields/password-fields/password-fields.component.spec.ts +21 -0
  60. package/src/form-fields/password-fields/password-fields.component.ts +273 -0
  61. package/src/form-fields/radio-button-fields/radio-button-fields.component.html +82 -0
  62. package/src/form-fields/radio-button-fields/radio-button-fields.component.scss +28 -0
  63. package/src/form-fields/radio-button-fields/radio-button-fields.component.spec.ts +21 -0
  64. package/src/form-fields/radio-button-fields/radio-button-fields.component.ts +391 -0
  65. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.html +67 -0
  66. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.scss +23 -0
  67. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.spec.ts +21 -0
  68. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.ts +145 -0
  69. package/src/form-fields/section-fields/section-fields.component.html +4 -0
  70. package/src/form-fields/section-fields/section-fields.component.scss +37 -0
  71. package/src/form-fields/section-fields/section-fields.component.spec.ts +21 -0
  72. package/src/form-fields/section-fields/section-fields.component.ts +25 -0
  73. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.html +93 -0
  74. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.scss +52 -0
  75. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.spec.ts +21 -0
  76. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.ts +155 -0
  77. package/src/form-fields/signature-fields/signature-fields.component.html +43 -0
  78. package/src/form-fields/signature-fields/signature-fields.component.scss +10 -0
  79. package/src/form-fields/signature-fields/signature-fields.component.spec.ts +21 -0
  80. package/src/form-fields/signature-fields/signature-fields.component.ts +25 -0
  81. package/src/form-fields/slider-fields/slider-fields.component.html +67 -0
  82. package/src/form-fields/slider-fields/slider-fields.component.scss +55 -0
  83. package/src/form-fields/slider-fields/slider-fields.component.spec.ts +21 -0
  84. package/src/form-fields/slider-fields/slider-fields.component.ts +63 -0
  85. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.html +52 -0
  86. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.scss +85 -0
  87. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.spec.ts +21 -0
  88. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.ts +62 -0
  89. package/src/form-fields/text-area-fields/text-area-fields.component.html +68 -0
  90. package/src/form-fields/text-area-fields/text-area-fields.component.scss +19 -0
  91. package/src/form-fields/text-area-fields/text-area-fields.component.spec.ts +21 -0
  92. package/src/form-fields/text-area-fields/text-area-fields.component.ts +166 -0
  93. package/src/form-fields/text-fields/text-fields.component.html +67 -0
  94. package/src/form-fields/text-fields/text-fields.component.scss +26 -0
  95. package/src/form-fields/text-fields/text-fields.component.spec.ts +21 -0
  96. package/src/form-fields/text-fields/text-fields.component.ts +248 -0
  97. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.html +70 -0
  98. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.scss +112 -0
  99. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.spec.ts +21 -0
  100. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.ts +74 -0
  101. package/src/form-fields/url-fields/url-fields.component.html +109 -0
  102. package/src/form-fields/url-fields/url-fields.component.scss +22 -0
  103. package/src/form-fields/url-fields/url-fields.component.spec.ts +21 -0
  104. package/src/form-fields/url-fields/url-fields.component.ts +123 -0
  105. package/src/form-submission/form-submission.module.ts +40 -0
  106. package/src/form-submission/header/header.component.html +6 -0
  107. package/src/form-submission/header/header.component.scss +26 -0
  108. package/src/form-submission/header/header.component.spec.ts +21 -0
  109. package/src/form-submission/header/header.component.ts +12 -0
  110. package/src/form-submission/navigation-tabs/navigation-tabs.component.html +134 -0
  111. package/src/form-submission/navigation-tabs/navigation-tabs.component.scss +200 -0
  112. package/src/form-submission/navigation-tabs/navigation-tabs.component.spec.ts +21 -0
  113. package/src/form-submission/navigation-tabs/navigation-tabs.component.ts +134 -0
  114. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.html +207 -0
  115. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.scss +208 -0
  116. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.spec.ts +21 -0
  117. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.ts +74 -0
  118. package/src/form-submission/save-as-draft/saveDraftModalComponent .ts +60 -0
  119. package/src/form-submission/save-as-draft/saveDraftModalComponent.html +33 -0
  120. package/src/form-submission/save-as-draft/saveDraftModalComponent.scss +195 -0
  121. package/src/form-submission/submission-container/submission-container.component.html +30 -0
  122. package/src/form-submission/submission-container/submission-container.component.scss +67 -0
  123. package/src/form-submission/submission-container/submission-container.component.spec.ts +21 -0
  124. package/src/form-submission/submission-container/submission-container.component.ts +14 -0
  125. package/src/form-submission/submit-form/submit-form.component.html +76 -0
  126. package/src/form-submission/submit-form/submit-form.component.scss +88 -0
  127. package/src/form-submission/submit-form/submit-form.component.spec.ts +21 -0
  128. package/src/form-submission/submit-form/submit-form.component.ts +1953 -0
  129. package/src/lib/form-submission.component.html +15 -0
  130. package/src/lib/form-submission.component.scss +1 -0
  131. package/src/lib/form-submission.component.ts +120 -0
  132. package/src/lib/form-submission.module.ts +31 -0
  133. package/src/lib/form-submission.service.spec.ts +16 -0
  134. package/src/lib/form-submission.service.ts +9 -0
  135. package/src/models/aggregate.model.ts +4 -0
  136. package/{models/answer.model.d.ts → src/models/answer.model.ts} +25 -23
  137. package/src/models/appearance.model.ts +64 -0
  138. package/{models/attachment.model.d.ts → src/models/attachment.model.ts} +6 -6
  139. package/{models/defaultAnswerEntry.model.d.ts → src/models/defaultAnswerEntry.model.ts} +7 -5
  140. package/{models/defaultAnswersModel.model.d.ts → src/models/defaultAnswersModel.model.ts} +5 -4
  141. package/{models/defaultQuestionAnswer.model.d.ts → src/models/defaultQuestionAnswer.model.ts} +6 -6
  142. package/src/models/elementOptionAPI.model.ts +13 -0
  143. package/src/models/elementOptionAPIData.model.ts +5 -0
  144. package/src/models/elementOptionDB.model.ts +9 -0
  145. package/src/models/elementOptionDBCriteria.model.ts +7 -0
  146. package/{models/emitters.model.d.ts → src/models/emitters.model.ts} +8 -8
  147. package/{models/enum/condition.enum.d.ts → src/models/enum/condition.enum.ts} +2 -2
  148. package/src/models/enum/elementType .enum.ts +22 -0
  149. package/src/models/enum/entityType.enum.ts +10 -0
  150. package/{models/formConfiguration.model.d.ts → src/models/formConfiguration.model.ts} +2 -2
  151. package/{models/formElement.model.d.ts → src/models/formElement.model.ts} +22 -22
  152. package/{models/formElementType.model.d.ts → src/models/formElementType.model.ts} +3 -2
  153. package/{models/grid.model.d.ts → src/models/grid.model.ts} +14 -13
  154. package/{models/hiddenField.model.d.ts → src/models/hiddenField.model.ts} +5 -5
  155. package/{models/iFrameProperties.model.d.ts → src/models/iFrameProperties.model.ts} +13 -13
  156. package/src/models/logic.model.ts +11 -0
  157. package/src/models/multifields.model.ts +12 -0
  158. package/{models/option.model.d.ts → src/models/option.model.ts} +5 -5
  159. package/src/models/page.model.ts +7 -0
  160. package/src/models/publicForm.model.ts +19 -0
  161. package/src/models/question.model.ts +27 -0
  162. package/src/models/questionAnswer.model.ts +8 -0
  163. package/src/models/questionGroup.model.ts +12 -0
  164. package/src/models/response.model.ts +9 -0
  165. package/src/models/result.model.ts +5 -0
  166. package/{models/row.model.d.ts → src/models/row.model.ts} +2 -1
  167. package/src/models/scoring.model.ts +10 -0
  168. package/src/models/section.model.ts +6 -0
  169. package/src/models/subForm.model.ts +25 -0
  170. package/src/models/subformConfiguration.model.ts +4 -0
  171. package/src/models/subformPropery.model.ts +8 -0
  172. package/{models/submission.model.d.ts → src/models/submission.model.ts} +16 -14
  173. package/{models/submissionCopyConfig.mopdel.d.ts → src/models/submissionCopyConfig.mopdel.ts} +4 -4
  174. package/{models/terms&condition.model.d.ts → src/models/terms&condition.model.ts} +1 -1
  175. package/src/models/validation.model.ts +48 -0
  176. package/src/models/whenClause.model.ts +7 -0
  177. package/{models/whenClauseCondition.model.d.ts → src/models/whenClauseCondition.model.ts} +6 -6
  178. package/{models/whenClauseElements.model.d.ts → src/models/whenClauseElements.model.ts} +6 -5
  179. package/{public-api.d.ts → src/public-api.ts} +4 -0
  180. package/src/question/card-subform/card-subform.component.html +282 -0
  181. package/src/question/card-subform/card-subform.component.scss +49 -0
  182. package/src/question/card-subform/card-subform.component.spec.ts +21 -0
  183. package/src/question/card-subform/card-subform.component.ts +407 -0
  184. package/src/question/confirm-dialog/confirm-dialog.component.html +32 -0
  185. package/src/question/confirm-dialog/confirm-dialog.component.scss +109 -0
  186. package/src/question/confirm-dialog/confirm-dialog.component.spec.ts +21 -0
  187. package/src/question/confirm-dialog/confirm-dialog.component.ts +24 -0
  188. package/src/question/form-elements/form-elements.component.html +28 -0
  189. package/src/question/form-elements/form-elements.component.scss +0 -0
  190. package/src/question/form-elements/form-elements.component.spec.ts +21 -0
  191. package/src/question/form-elements/form-elements.component.ts +41 -0
  192. package/src/question/inline-multiple-subform/inline-multiple-subform.component.html +321 -0
  193. package/src/question/inline-multiple-subform/inline-multiple-subform.component.scss +78 -0
  194. package/src/question/inline-multiple-subform/inline-multiple-subform.component.spec.ts +21 -0
  195. package/src/question/inline-multiple-subform/inline-multiple-subform.component.ts +425 -0
  196. package/src/question/multifields/multifields.component.html +78 -0
  197. package/src/question/multifields/multifields.component.scss +6 -0
  198. package/src/question/multifields/multifields.component.spec.ts +21 -0
  199. package/src/question/multifields/multifields.component.ts +27 -0
  200. package/src/question/multiple-subform/multiple-subform.component.html +185 -0
  201. package/src/question/multiple-subform/multiple-subform.component.scss +52 -0
  202. package/src/question/multiple-subform/multiple-subform.component.spec.ts +21 -0
  203. package/src/question/multiple-subform/multiple-subform.component.ts +481 -0
  204. package/src/question/question/question.component.html +51 -0
  205. package/src/question/question/question.component.scss +0 -0
  206. package/src/question/question/question.component.spec.ts +21 -0
  207. package/src/question/question/question.component.ts +129 -0
  208. package/src/question/question-group/question-group.component.html +147 -0
  209. package/src/question/question-group/question-group.component.scss +36 -0
  210. package/src/question/question-group/question-group.component.spec.ts +21 -0
  211. package/src/question/question-group/question-group.component.ts +94 -0
  212. package/src/question/question.module.ts +22 -0
  213. package/src/question/recursive-logic/recursive-logic.component.html +33 -0
  214. package/src/question/recursive-logic/recursive-logic.component.scss +0 -0
  215. package/src/question/recursive-logic/recursive-logic.component.spec.ts +21 -0
  216. package/src/question/recursive-logic/recursive-logic.component.ts +29 -0
  217. package/src/question/sub-form/sub-form.component.html +254 -0
  218. package/src/question/sub-form/sub-form.component.scss +83 -0
  219. package/src/question/sub-form/sub-form.component.spec.ts +21 -0
  220. package/src/question/sub-form/sub-form.component.ts +421 -0
  221. package/src/services/aggregate.service.ts +148 -0
  222. package/src/services/countryService.ts +92 -0
  223. package/src/services/data.service.ts +36 -0
  224. package/src/services/element-tracker.service.spec.ts +16 -0
  225. package/src/services/element-tracker.service.ts +24 -0
  226. package/src/services/form-validation.service.ts +151 -0
  227. package/src/services/form.service.spec.ts +16 -0
  228. package/src/services/form.service.ts +407 -0
  229. package/src/services/mapper.service.ts +625 -0
  230. package/src/services/recaptcha.service.spec.ts +16 -0
  231. package/src/services/recaptcha.service.ts +179 -0
  232. package/src/services/score.service.ts +352 -0
  233. package/src/services/subform-copy.service.ts +148 -0
  234. package/src/services/validation.service.spec.ts +16 -0
  235. package/src/services/validation.service.ts +33 -0
  236. package/src/services/whenClause.service.ts +502 -0
  237. package/src/shared/shared.module.ts +58 -0
  238. package/src/styles/shared-style.scss +86 -0
  239. package/src/sub-form/sub-form.module.ts +24 -0
  240. package/src/sub-form/submission-modal/submission-modal.component.html +160 -0
  241. package/src/sub-form/submission-modal/submission-modal.component.scss +54 -0
  242. package/src/sub-form/submission-modal/submission-modal.component.spec.ts +21 -0
  243. package/src/sub-form/submission-modal/submission-modal.component.ts +127 -0
  244. package/tsconfig.lib.json +14 -0
  245. package/tsconfig.lib.prod.json +10 -0
  246. package/tsconfig.spec.json +14 -0
  247. package/environment/environment.d.ts +0 -5
  248. package/esm2022/environment/environment.mjs +0 -6
  249. package/esm2022/form-fields/aggregate-function/aggregate-function.component.mjs +0 -146
  250. package/esm2022/form-fields/check-box-fields/check-box-fields.component.mjs +0 -473
  251. package/esm2022/form-fields/currency-fields/currency-fields.component.mjs +0 -502
  252. package/esm2022/form-fields/date-time-fields/date-time-fields.component.mjs +0 -608
  253. package/esm2022/form-fields/drop-down-fields/drop-down-fields.component.mjs +0 -585
  254. package/esm2022/form-fields/file-picker-fields/file-picker-fields.component.mjs +0 -224
  255. package/esm2022/form-fields/form-fields.module.mjs +0 -174
  256. package/esm2022/form-fields/hidden-field/hidden-field.component.mjs +0 -137
  257. package/esm2022/form-fields/iframe-fields/iframe-fields.component.mjs +0 -198
  258. package/esm2022/form-fields/location-fields/location-fields.component.mjs +0 -85
  259. package/esm2022/form-fields/mail-fields/mail-fields.component.mjs +0 -131
  260. package/esm2022/form-fields/mobile-fields/mobile-fields.component.mjs +0 -270
  261. package/esm2022/form-fields/number-fields/number-fields.component.mjs +0 -242
  262. package/esm2022/form-fields/password-fields/password-fields.component.mjs +0 -257
  263. package/esm2022/form-fields/radio-button-fields/radio-button-fields.component.mjs +0 -346
  264. package/esm2022/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.mjs +0 -148
  265. package/esm2022/form-fields/section-fields/section-fields.component.mjs +0 -29
  266. package/esm2022/form-fields/selection-matrix-fields/selection-matrix-fields.component.mjs +0 -158
  267. package/esm2022/form-fields/signature-fields/signature-fields.component.mjs +0 -32
  268. package/esm2022/form-fields/slider-fields/slider-fields.component.mjs +0 -73
  269. package/esm2022/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.mjs +0 -66
  270. package/esm2022/form-fields/text-area-fields/text-area-fields.component.mjs +0 -159
  271. package/esm2022/form-fields/text-fields/text-fields.component.mjs +0 -245
  272. package/esm2022/form-fields/toggle-switch-fields/toggle-switch-fields.component.mjs +0 -85
  273. package/esm2022/form-fields/url-fields/url-fields.component.mjs +0 -124
  274. package/esm2022/form-submission/form-submission.module.mjs +0 -64
  275. package/esm2022/form-submission/header/header.component.mjs +0 -20
  276. package/esm2022/form-submission/navigation-tabs/navigation-tabs.component.mjs +0 -171
  277. package/esm2022/form-submission/next-prev-navigation/next-prev-navigation.component.mjs +0 -124
  278. package/esm2022/form-submission/save-as-draft/saveDraftModalComponent .mjs +0 -50
  279. package/esm2022/form-submission/submission-container/submission-container.component.mjs +0 -17
  280. package/esm2022/form-submission/submit-form/submit-form.component.mjs +0 -1610
  281. package/esm2022/lib/form-submission.component.mjs +0 -113
  282. package/esm2022/lib/form-submission.module.mjs +0 -56
  283. package/esm2022/lib/form-submission.service.mjs +0 -14
  284. package/esm2022/models/aggregate.model.mjs +0 -2
  285. package/esm2022/models/answer.model.mjs +0 -2
  286. package/esm2022/models/appearance.model.mjs +0 -2
  287. package/esm2022/models/attachment.model.mjs +0 -2
  288. package/esm2022/models/defaultAnswerEntry.model.mjs +0 -2
  289. package/esm2022/models/defaultAnswersModel.model.mjs +0 -2
  290. package/esm2022/models/defaultQuestionAnswer.model.mjs +0 -2
  291. package/esm2022/models/elementOptionAPI.model.mjs +0 -2
  292. package/esm2022/models/elementOptionAPIData.model.mjs +0 -2
  293. package/esm2022/models/elementOptionDB.model.mjs +0 -2
  294. package/esm2022/models/elementOptionDBCriteria.model.mjs +0 -2
  295. package/esm2022/models/emitters.model.mjs +0 -2
  296. package/esm2022/models/enum/condition.enum.mjs +0 -18
  297. package/esm2022/models/enum/elementType .enum.mjs +0 -24
  298. package/esm2022/models/enum/entityType.enum.mjs +0 -12
  299. package/esm2022/models/formConfiguration.model.mjs +0 -2
  300. package/esm2022/models/formElement.model.mjs +0 -2
  301. package/esm2022/models/formElementType.model.mjs +0 -2
  302. package/esm2022/models/grid.model.mjs +0 -2
  303. package/esm2022/models/hiddenField.model.mjs +0 -2
  304. package/esm2022/models/iFrameProperties.model.mjs +0 -2
  305. package/esm2022/models/logic.model.mjs +0 -2
  306. package/esm2022/models/multifields.model.mjs +0 -2
  307. package/esm2022/models/option.model.mjs +0 -2
  308. package/esm2022/models/page.model.mjs +0 -2
  309. package/esm2022/models/publicForm.model.mjs +0 -2
  310. package/esm2022/models/question.model.mjs +0 -2
  311. package/esm2022/models/questionAnswer.model.mjs +0 -2
  312. package/esm2022/models/questionGroup.model.mjs +0 -2
  313. package/esm2022/models/row.model.mjs +0 -2
  314. package/esm2022/models/scoring.model.mjs +0 -2
  315. package/esm2022/models/section.model.mjs +0 -2
  316. package/esm2022/models/subForm.model.mjs +0 -2
  317. package/esm2022/models/subformConfiguration.model.mjs +0 -2
  318. package/esm2022/models/subformPropery.model.mjs +0 -2
  319. package/esm2022/models/submission.model.mjs +0 -2
  320. package/esm2022/models/submissionCopyConfig.mopdel.mjs +0 -2
  321. package/esm2022/models/terms&condition.model.mjs +0 -2
  322. package/esm2022/models/validation.model.mjs +0 -2
  323. package/esm2022/models/whenClause.model.mjs +0 -2
  324. package/esm2022/models/whenClauseCondition.model.mjs +0 -2
  325. package/esm2022/models/whenClauseElements.model.mjs +0 -2
  326. package/esm2022/piserve-tech-form-submission.mjs +0 -5
  327. package/esm2022/public-api.mjs +0 -7
  328. package/esm2022/question/card-subform/card-subform.component.mjs +0 -354
  329. package/esm2022/question/confirm-dialog/confirm-dialog.component.mjs +0 -27
  330. package/esm2022/question/form-elements/form-elements.component.mjs +0 -62
  331. package/esm2022/question/inline-multiple-subform/inline-multiple-subform.component.mjs +0 -384
  332. package/esm2022/question/multifields/multifields.component.mjs +0 -54
  333. package/esm2022/question/multiple-subform/multiple-subform.component.mjs +0 -413
  334. package/esm2022/question/question/question.component.mjs +0 -145
  335. package/esm2022/question/question-group/question-group.component.mjs +0 -102
  336. package/esm2022/question/recursive-logic/recursive-logic.component.mjs +0 -49
  337. package/esm2022/question/sub-form/sub-form.component.mjs +0 -351
  338. package/esm2022/services/aggregate.service.mjs +0 -139
  339. package/esm2022/services/countryService.mjs +0 -89
  340. package/esm2022/services/data.service.mjs +0 -36
  341. package/esm2022/services/element-tracker.service.mjs +0 -27
  342. package/esm2022/services/form-validation.service.mjs +0 -128
  343. package/esm2022/services/form.service.mjs +0 -333
  344. package/esm2022/services/mapper.service.mjs +0 -519
  345. package/esm2022/services/recaptcha.service.mjs +0 -136
  346. package/esm2022/services/score.service.mjs +0 -268
  347. package/esm2022/services/subform-copy.service.mjs +0 -122
  348. package/esm2022/services/validation.service.mjs +0 -35
  349. package/esm2022/services/whenClause.service.mjs +0 -423
  350. package/esm2022/shared/shared.module.mjs +0 -97
  351. package/esm2022/sub-form/submission-modal/submission-modal.component.mjs +0 -133
  352. package/fesm2022/piserve-tech-form-submission.mjs +0 -11658
  353. package/fesm2022/piserve-tech-form-submission.mjs.map +0 -1
  354. package/form-fields/aggregate-function/aggregate-function.component.d.ts +0 -43
  355. package/form-fields/check-box-fields/check-box-fields.component.d.ts +0 -73
  356. package/form-fields/currency-fields/currency-fields.component.d.ts +0 -62
  357. package/form-fields/date-time-fields/date-time-fields.component.d.ts +0 -96
  358. package/form-fields/drop-down-fields/drop-down-fields.component.d.ts +0 -88
  359. package/form-fields/file-picker-fields/file-picker-fields.component.d.ts +0 -72
  360. package/form-fields/form-fields.module.d.ts +0 -40
  361. package/form-fields/hidden-field/hidden-field.component.d.ts +0 -38
  362. package/form-fields/iframe-fields/iframe-fields.component.d.ts +0 -35
  363. package/form-fields/location-fields/location-fields.component.d.ts +0 -29
  364. package/form-fields/mail-fields/mail-fields.component.d.ts +0 -41
  365. package/form-fields/mobile-fields/mobile-fields.component.d.ts +0 -71
  366. package/form-fields/number-fields/number-fields.component.d.ts +0 -53
  367. package/form-fields/password-fields/password-fields.component.d.ts +0 -57
  368. package/form-fields/radio-button-fields/radio-button-fields.component.d.ts +0 -70
  369. package/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.d.ts +0 -46
  370. package/form-fields/section-fields/section-fields.component.d.ts +0 -10
  371. package/form-fields/selection-matrix-fields/selection-matrix-fields.component.d.ts +0 -45
  372. package/form-fields/signature-fields/signature-fields.component.d.ts +0 -13
  373. package/form-fields/slider-fields/slider-fields.component.d.ts +0 -32
  374. package/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.d.ts +0 -26
  375. package/form-fields/text-area-fields/text-area-fields.component.d.ts +0 -49
  376. package/form-fields/text-fields/text-fields.component.d.ts +0 -49
  377. package/form-fields/toggle-switch-fields/toggle-switch-fields.component.d.ts +0 -29
  378. package/form-fields/url-fields/url-fields.component.d.ts +0 -41
  379. package/form-submission/form-submission.module.d.ts +0 -20
  380. package/form-submission/header/header.component.d.ts +0 -7
  381. package/form-submission/navigation-tabs/navigation-tabs.component.d.ts +0 -57
  382. package/form-submission/next-prev-navigation/next-prev-navigation.component.d.ts +0 -46
  383. package/form-submission/save-as-draft/saveDraftModalComponent .d.ts +0 -17
  384. package/form-submission/submission-container/submission-container.component.d.ts +0 -7
  385. package/form-submission/submit-form/submit-form.component.d.ts +0 -237
  386. package/index.d.ts +0 -5
  387. package/lib/form-submission.component.d.ts +0 -30
  388. package/lib/form-submission.module.d.ts +0 -16
  389. package/lib/form-submission.service.d.ts +0 -6
  390. package/models/aggregate.model.d.ts +0 -4
  391. package/models/appearance.model.d.ts +0 -64
  392. package/models/elementOptionAPI.model.d.ts +0 -12
  393. package/models/elementOptionAPIData.model.d.ts +0 -5
  394. package/models/elementOptionDB.model.d.ts +0 -8
  395. package/models/elementOptionDBCriteria.model.d.ts +0 -7
  396. package/models/enum/elementType .enum.d.ts +0 -22
  397. package/models/enum/entityType.enum.d.ts +0 -10
  398. package/models/logic.model.d.ts +0 -9
  399. package/models/multifields.model.d.ts +0 -11
  400. package/models/page.model.d.ts +0 -6
  401. package/models/publicForm.model.d.ts +0 -18
  402. package/models/question.model.d.ts +0 -26
  403. package/models/questionAnswer.model.d.ts +0 -7
  404. package/models/questionGroup.model.d.ts +0 -11
  405. package/models/scoring.model.d.ts +0 -10
  406. package/models/section.model.d.ts +0 -6
  407. package/models/subForm.model.d.ts +0 -24
  408. package/models/subformConfiguration.model.d.ts +0 -4
  409. package/models/subformPropery.model.d.ts +0 -7
  410. package/models/validation.model.d.ts +0 -48
  411. package/models/whenClause.model.d.ts +0 -6
  412. package/question/card-subform/card-subform.component.d.ts +0 -44
  413. package/question/confirm-dialog/confirm-dialog.component.d.ts +0 -12
  414. package/question/form-elements/form-elements.component.d.ts +0 -20
  415. package/question/inline-multiple-subform/inline-multiple-subform.component.d.ts +0 -47
  416. package/question/multifields/multifields.component.d.ts +0 -11
  417. package/question/multiple-subform/multiple-subform.component.d.ts +0 -39
  418. package/question/question/question.component.d.ts +0 -30
  419. package/question/question-group/question-group.component.d.ts +0 -29
  420. package/question/recursive-logic/recursive-logic.component.d.ts +0 -19
  421. package/question/sub-form/sub-form.component.d.ts +0 -70
  422. package/services/aggregate.service.d.ts +0 -29
  423. package/services/countryService.d.ts +0 -21
  424. package/services/data.service.d.ts +0 -19
  425. package/services/element-tracker.service.d.ts +0 -10
  426. package/services/form-validation.service.d.ts +0 -16
  427. package/services/form.service.d.ts +0 -27
  428. package/services/mapper.service.d.ts +0 -31
  429. package/services/recaptcha.service.d.ts +0 -46
  430. package/services/score.service.d.ts +0 -27
  431. package/services/subform-copy.service.d.ts +0 -10
  432. package/services/validation.service.d.ts +0 -14
  433. package/services/whenClause.service.d.ts +0 -45
  434. package/shared/shared.module.d.ts +0 -25
  435. package/sub-form/submission-modal/submission-modal.component.d.ts +0 -31
  436. /package/{assets → src/assets}/fonts/Garamond.woff2 +0 -0
  437. /package/{assets → src/assets}/fonts/Georgia.woff2 +0 -0
  438. /package/{assets → src/assets}/fonts/Poppins.woff2 +0 -0
  439. /package/{assets → src/assets}/fonts/Tahoma.woff2 +0 -0
  440. /package/{assets → src/assets}/fonts/Tajawal.woff2 +0 -0
  441. /package/{assets → src/assets}/fonts/Verdana.woff2 +0 -0
  442. /package/{assets → src/assets}/icons/left_arrow.svg +0 -0
  443. /package/{assets → src/assets}/icons/right_arrow.svg +0 -0
@@ -1,413 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { MatDialogConfig } from '@angular/material/dialog';
3
- import { SubmissionModalComponent } from '../../sub-form/submission-modal/submission-modal.component';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/material/dialog";
6
- import * as i2 from "@angular/platform-browser";
7
- import * as i3 from "../../services/score.service";
8
- import * as i4 from "../../services/whenClause.service";
9
- import * as i5 from "@angular/common";
10
- import * as i6 from "@angular/material/table";
11
- import * as i7 from "@angular/material/menu";
12
- import * as i8 from "@angular/material/icon";
13
- export class MultipleSubformComponent {
14
- constructor(dialog, sanitizer, scoreCalcService, whenClauseService) {
15
- this.dialog = dialog;
16
- this.sanitizer = sanitizer;
17
- this.scoreCalcService = scoreCalcService;
18
- this.whenClauseService = whenClauseService;
19
- this.subForm = {};
20
- this.subFormChange = new EventEmitter();
21
- this.acceptedLanguage = '';
22
- this.submissions = [];
23
- this.deletedSubmissions = [];
24
- this.displayedColumns = [];
25
- this.addButtonLabel = 'Add New Submission';
26
- }
27
- ngOnInit() {
28
- const { goodMax, badMax } = this.scoreCalcService.getMaxPossibleScore(this.subForm);
29
- this.maxPossibleGoodScore = goodMax;
30
- this.maxPossibleBadScore = badMax;
31
- if (this.subForm?.submissions) {
32
- this.submissions = this.subForm.submissions;
33
- this.subForm.deletedSubmissions = [];
34
- }
35
- if (this.subForm?.property?.addButtonLabel) {
36
- this.addButtonLabel = this.subForm.property.addButtonLabel;
37
- }
38
- this.initializeDisplayedColumns();
39
- this.whenClauseService.addGridsFromSubform(this.subForm);
40
- }
41
- initializeDisplayedColumns() {
42
- this.displayedColumns = this.subForm.rows.flatMap((item) => item.grid
43
- .filter((gridItem) => gridItem.element?.formElement?.elementType !== 'HIDDEN_FIELD')
44
- .map((gridItem) => gridItem.element.question));
45
- this.displayedColumns.push('actions');
46
- }
47
- getAnswerByQuestionId(submission, question) {
48
- const questionId = question.element.id;
49
- const answerObj = submission.answers.find((answer) => answer.questionId === questionId);
50
- if (!answerObj) {
51
- return null;
52
- }
53
- let content = '';
54
- if (answerObj.answer) {
55
- if (Array.isArray(answerObj.answer)) {
56
- const processedItems = answerObj.answer.map((item) => {
57
- if (typeof item === 'string' && item.includes('|')) {
58
- return item.split('|')[0];
59
- }
60
- return item;
61
- });
62
- content = processedItems.join(', ');
63
- }
64
- else if (typeof answerObj.answer === 'string') {
65
- content = answerObj.answer.includes('|')
66
- ? answerObj.answer.split('|')[0]
67
- : answerObj.answer;
68
- }
69
- }
70
- let currencySymbol = '';
71
- if (question.element.formElement.elementType === 'CURRENCY') {
72
- currencySymbol = this.fetchCurrencySymbol(question.element);
73
- answerObj['htmlContent'] = this.sanitizer.bypassSecurityTrustHtml(currencySymbol + ' ' + content);
74
- }
75
- else {
76
- answerObj['htmlContent'] = this.sanitizer.bypassSecurityTrustHtml(content);
77
- }
78
- return answerObj;
79
- }
80
- fetchCurrencySymbol(question) {
81
- let currencySymbol = '';
82
- if (question.formElement?.appearance?.currency) {
83
- let userLocaleCureency = question.formElement?.appearance?.currency;
84
- if (question.formElement.appearance.currencyOption) {
85
- let currencyOption = question.formElement.appearance.currencyOption;
86
- if (currencyOption == 'auto') {
87
- if (question.formElement.appearance.limitCurrencySymbol &&
88
- question.formElement.appearance.limitCurrencySymbol.length > 0) {
89
- currencySymbol =
90
- question.formElement.appearance.limitCurrencySymbol.includes(userLocaleCureency)
91
- ? userLocaleCureency
92
- : question.formElement?.appearance?.currencySymbol;
93
- }
94
- else {
95
- currencySymbol = userLocaleCureency;
96
- }
97
- }
98
- else if (currencyOption == 'specific') {
99
- currencySymbol =
100
- question.formElement?.appearance?.specificCurrencySymbol;
101
- }
102
- }
103
- }
104
- if (!currencySymbol &&
105
- question.formElement?.appearance?.currencySymbol) {
106
- currencySymbol =
107
- question.formElement?.appearance?.currencySymbol;
108
- }
109
- return currencySymbol;
110
- }
111
- subFormSubmission(subForm) {
112
- const processFormElements = (rows, isChild = false) => {
113
- const answers = [];
114
- rows.flatMap((item) => item.grid.forEach((formElement) => {
115
- const answer = {
116
- questionId: formElement.element.id,
117
- answer: formElement.element?.answer || '',
118
- files: formElement.element.formElement.elementType == 'FILE_PICKER' &&
119
- formElement.element.answer
120
- ? formElement.element.answer
121
- : undefined,
122
- isChild: isChild,
123
- amountInWords: formElement.element.amountInWords
124
- };
125
- if (formElement.element.formElement.elementType == 'FILE_PICKER' &&
126
- formElement.element.answer) {
127
- const fileNames = formElement.element.answer.map((file) => file?._file.name);
128
- answer.answer = fileNames;
129
- }
130
- answers.push(answer);
131
- if (formElement.element.formElement &&
132
- (formElement.element.formElement.elementType === 'DROP_DOWN' ||
133
- formElement.element.formElement.elementType === 'RADIO_BUTTON' ||
134
- formElement.element.formElement.elementType === 'CHECKBOX') &&
135
- formElement.element.formElement.scoring &&
136
- formElement.element.formElement.scoring.enableScoring) {
137
- answers.forEach((ans) => {
138
- if (formElement.element.id === ans.questionId) {
139
- const scoreResult = this.scoreCalcService.calculateScoreFromAnswer(ans.answer, formElement.element);
140
- // Save total score and individual scores
141
- // ans.score = scoreResult?.totalScore ?? 1;
142
- ans.scores = scoreResult?.scores;
143
- }
144
- });
145
- }
146
- if (formElement.element.childLogics) {
147
- formElement.element.childLogics.forEach((logic) => {
148
- if (logic.showLogic) {
149
- answers.push(...processFormElements(logic.rows, true));
150
- logic.showLogic = false;
151
- }
152
- });
153
- }
154
- }));
155
- return answers;
156
- };
157
- const answers = processFormElements(subForm.rows);
158
- if (answers.length > 0) {
159
- const submission = {
160
- submissionId: '',
161
- answers: answers,
162
- };
163
- if (this.scoreCalcService.shouldCalculateScore(this.subForm, submission)) {
164
- // Mark that this submission had all scoring questions answered at least once
165
- submission.hasAllScoringAnsweredOnce = true;
166
- }
167
- if (submission.hasAllScoringAnsweredOnce) {
168
- // Recalculate score always after once satisfied
169
- submission.scores = this.scoreCalcService.calculateSubmissionScore(submission.answers);
170
- }
171
- this.submissions.push(submission);
172
- this.submissions = [...this.submissions];
173
- this.updateSubFormWithSubmissions();
174
- }
175
- // this.subForm.score = this.scoreCalcService.calculateFinalScore(this.submissions,this.maxPossibleScore);
176
- }
177
- editSubFormSubmission(index, submission) {
178
- const subForm = this.bindAnswers(this.subForm, submission);
179
- const dialogConfig = new MatDialogConfig();
180
- dialogConfig.position = { top: '5%' };
181
- dialogConfig.width = '100%';
182
- dialogConfig.data = {
183
- subForm: subForm,
184
- acceptedLanguage: this.acceptedLanguage,
185
- };
186
- dialogConfig.hasBackdrop = true;
187
- dialogConfig.disableClose = true;
188
- dialogConfig.maxHeight = '80vh';
189
- const dialogRef = this.dialog.open(SubmissionModalComponent, dialogConfig);
190
- dialogRef.afterClosed().subscribe((result) => {
191
- if (result) {
192
- this.updateSubmission(result, index);
193
- }
194
- });
195
- }
196
- bindAnswers(subForm, submission) {
197
- const bindElementAnswers = (rows, answers) => {
198
- rows.forEach((row) => {
199
- row.grid.forEach((grid) => {
200
- const answer = answers.find((a) => a.questionId === grid.element.id);
201
- if (answer) {
202
- grid.element.answer =
203
- grid.element.formElement.elementType == 'FILE_PICKER'
204
- ? answer?.files
205
- : answer.answer;
206
- grid.element.amountInWords = answer?.amountInWords;
207
- grid.element.answerId = answer.answerId;
208
- grid.element.attachments = answer.attachments;
209
- }
210
- if (grid.element.childLogics) {
211
- grid.element.childLogics.forEach((logic) => {
212
- bindElementAnswers(logic.rows, answers);
213
- });
214
- }
215
- });
216
- });
217
- };
218
- const updatedSubForm = { ...subForm };
219
- bindElementAnswers(updatedSubForm.rows, submission.answers);
220
- return updatedSubForm;
221
- }
222
- deleteSubForm(index) {
223
- const submission = this.submissions[index];
224
- if (submission.submissionId) {
225
- this.deletedSubmissions.push(submission.submissionId);
226
- }
227
- this.submissions.splice(index, 1);
228
- this.submissions = [...this.submissions];
229
- this.subForm.scores = this.scoreCalcService.calculateFinalScore(this.submissions, this.maxPossibleGoodScore, this.maxPossibleBadScore);
230
- this.updateSubFormWithSubmissions();
231
- }
232
- addNewSubmission() {
233
- const subForm = this.cleanCircularReferences(this.subForm);
234
- subForm.rows.forEach((row) => {
235
- row.grid.forEach((grid) => {
236
- grid.element.answer = grid.element.formElement.elementType === 'FILE_PICKER' ? [] : '';
237
- grid.element.attachments = [];
238
- grid.element.answerId = null;
239
- });
240
- });
241
- const dialogConfig = new MatDialogConfig();
242
- dialogConfig.position = { top: '5%' };
243
- dialogConfig.width = '100%';
244
- dialogConfig.data = {
245
- subForm: subForm,
246
- acceptedLanguage: this.acceptedLanguage,
247
- };
248
- dialogConfig.hasBackdrop = true;
249
- dialogConfig.disableClose = true;
250
- dialogConfig.maxHeight = '80vh';
251
- dialogConfig.autoFocus = false;
252
- const dialogRef = this.dialog.open(SubmissionModalComponent, dialogConfig);
253
- dialogRef.afterClosed().subscribe((result) => {
254
- if (result) {
255
- const hasData = result.rows.flatMap((item) => item.grid.some((formElement) => formElement.element.answer &&
256
- formElement.element.answer.length > 0));
257
- if (hasData) {
258
- this.subFormSubmission(result);
259
- }
260
- }
261
- });
262
- }
263
- cleanCircularReferences(obj, seen = new WeakSet()) {
264
- if (obj === null || typeof obj !== 'object') {
265
- return obj;
266
- }
267
- if (seen.has(obj)) {
268
- return;
269
- }
270
- seen.add(obj);
271
- const cleanedObj = Array.isArray(obj) ? [] : {};
272
- for (const key in obj) {
273
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
274
- cleanedObj[key] = this.cleanCircularReferences(obj[key], seen);
275
- }
276
- }
277
- return cleanedObj;
278
- }
279
- updateSubmission(result, index) {
280
- const processFormElements = (rows, answers) => {
281
- rows.forEach((row) => {
282
- row.grid.forEach((grid) => {
283
- let answer = {
284
- questionId: grid.element.id,
285
- answerId: grid.element?.answerId || '',
286
- attachments: grid.element.attachments || [],
287
- answer: [],
288
- files: [],
289
- deleteFiles: [],
290
- };
291
- if (answer.attachments) {
292
- answer.answer = answer.attachments.map((attachment) => attachment.fileName);
293
- }
294
- if (grid.element.formElement.elementType === 'FILE_PICKER') {
295
- if (grid.element?.deleteFiles.length > 0) {
296
- answer.answer = []; // Reset answer.answer only once
297
- answer.deleteFiles = answer.deleteFiles || [];
298
- // Collect deleted file IDs
299
- grid.element.deleteFiles.forEach((deletedId) => {
300
- answer.deleteFiles?.push(deletedId);
301
- });
302
- if (answer.attachments) {
303
- // Filter out deleted attachments
304
- answer.attachments = answer.attachments.filter((attachment) => {
305
- if (!grid.element.deleteFiles.includes(attachment.fileId)) {
306
- return true;
307
- }
308
- return false;
309
- });
310
- // Rebuild answer.answer with the remaining attachments
311
- answer.answer = answer.attachments.map((attachment) => attachment.fileName);
312
- }
313
- }
314
- if (grid.element.answer) {
315
- answer.files = grid.element.answer;
316
- let fileNamesArray = Array.isArray(answer.answer) ? [...answer.answer] : [];
317
- grid.element.answer.forEach((file) => {
318
- const fileName = file._file?.name;
319
- if (!fileNamesArray.includes(fileName)) {
320
- fileNamesArray.push(fileName);
321
- }
322
- });
323
- answer.answer = fileNamesArray; // Append to existing array instead of overwriting
324
- }
325
- }
326
- else {
327
- answer = {
328
- questionId: grid.element.id,
329
- answerId: grid.element?.answerId || '',
330
- attachments: grid.element.attachments,
331
- answer: grid.element.answer,
332
- maximumPossibleScore: grid.element.maxPossibleScore,
333
- amountInWords: grid.element.amountInWords
334
- };
335
- }
336
- grid.element.answer = '';
337
- answers.push(answer);
338
- if (grid.element.formElement &&
339
- (grid.element.formElement.elementType === 'DROP_DOWN' ||
340
- grid.element.formElement.elementType === 'RADIO_BUTTON' ||
341
- grid.element.formElement.elementType === 'CHECK_BOX') &&
342
- grid.element.formElement.scoring &&
343
- grid.element.formElement.scoring.enableScoring) {
344
- answers.forEach((ans) => {
345
- if (grid.element.id === ans.questionId) {
346
- const scoreResult = this.scoreCalcService.calculateScoreFromAnswer(ans.answer, grid.element);
347
- // Save total score and individual scores
348
- ans.scores = scoreResult?.scores;
349
- }
350
- });
351
- }
352
- if (grid.element.childLogics) {
353
- grid.element.childLogics.forEach((logic) => {
354
- if (logic.showLogic) {
355
- processFormElements(logic.rows, answers);
356
- }
357
- });
358
- }
359
- });
360
- });
361
- };
362
- this.submissions[index].answers = [];
363
- processFormElements(result.rows, this.submissions[index].answers);
364
- this.submissions[index].scores = this.scoreCalcService.calculateSubmissionScore(this.submissions[index].answers);
365
- this.submissions = [...this.submissions];
366
- const hasAnyScore = this.submissions.some(sub => sub.scores?.some(s => s.score !== null && s.score !== undefined));
367
- if (hasAnyScore) {
368
- this.subForm.scores = this.scoreCalcService.calculateFinalScore(this.submissions, this.maxPossibleGoodScore, this.maxPossibleBadScore);
369
- }
370
- else {
371
- this.subForm.scores = null; // or 0, depending on how you want to represent "no score yet"
372
- }
373
- this.updateSubFormWithSubmissions();
374
- this.clearEmptyRows();
375
- }
376
- updateSubFormWithSubmissions() {
377
- this.subForm.submissions = this.submissions;
378
- this.subForm.maxPossibleScore = {
379
- 'good': this.maxPossibleGoodScore,
380
- 'bad': this.maxPossibleBadScore
381
- };
382
- this.subForm.deletedSubmissions = this.deletedSubmissions;
383
- this.subFormChange.emit(this.subForm);
384
- }
385
- clearEmptyRows() {
386
- const nonEmptySubmissions = [];
387
- const emptySubmissionIds = [];
388
- this.submissions.forEach((submission) => {
389
- if (submission.answers.some((answer) => answer.answer !== '')) {
390
- nonEmptySubmissions.push(submission);
391
- }
392
- else if (submission.submissionId) {
393
- emptySubmissionIds.push(submission.submissionId);
394
- }
395
- });
396
- this.submissions = nonEmptySubmissions;
397
- this.deletedSubmissions.push(...emptySubmissionIds);
398
- this.updateSubFormWithSubmissions();
399
- }
400
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultipleSubformComponent, deps: [{ token: i1.MatDialog }, { token: i2.DomSanitizer }, { token: i3.ScoreCalculationService }, { token: i4.WhenClauseService }], target: i0.ɵɵFactoryTarget.Component }); }
401
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MultipleSubformComponent, selector: "lib-multiple-subform", inputs: { subForm: "subForm", acceptedLanguage: "acceptedLanguage" }, outputs: { subFormChange: "subFormChange" }, ngImport: i0, template: "<div class=\"example-container\" tabindex=\"0\">\n <div class=\"table-container\">\n <table mat-table [dataSource]=\"submissions\" class=\"mat-elevation-z8\">\n <ng-container *ngFor=\"let row of subForm.rows\">\n <ng-container\n *ngFor=\"let formElement of row.grid\"\n [matColumnDef]=\"formElement.element.question\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef\n class=\"border border-1 column-width\"\n >\n {{ formElement.element.question }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let submission\"\n class=\"border border-1\"\n [id]=\"'question-'+submission.submissionId\"\n [ngClass]=\"{\n hidden: getAnswerByQuestionId(submission, formElement)\n ?.isChild\n }\"\n >\n <div\n [innerHTML]=\"\n getAnswerByQuestionId(submission, formElement)\n ?.htmlContent\n \"\n ></div>\n </td>\n </ng-container>\n </ng-container>\n <ng-container matColumnDef=\"actions\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef class=\"border border-1\">\n Actions\n </th>\n <td\n mat-cell\n *matCellDef=\"let submission; let i = index\"\n class=\"text-center border border-1\"\n >\n <div>\n <button\n class=\"btn\"\n mat-icon-button\n [matMenuTriggerFor]=\"menu\"\n aria-label=\"Example icon-button with a menu\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button\n mat-menu-item\n (click)=\"editSubFormSubmission(i, submission)\"\n >\n <svg\n width=\"29\"\n height=\"28\"\n viewBox=\"0 0 29 28\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n x=\"0.5\"\n y=\"0.5\"\n width=\"28\"\n height=\"26.4737\"\n rx=\"5.5\"\n fill=\"white\"\n stroke=\"#D8D8D8\"\n />\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M12.0009 19.0787H9.1582V16.2361C9.1582 15.9447 9.2739 15.6653 9.47999 15.4593L16.2224 8.71686C16.4284 8.5105 16.708 8.39453 16.9995 8.39453C17.2911 8.39453 17.5707 8.5105 17.7767 8.71686L19.5201 10.4603C19.7264 10.6663 19.8424 10.9458 19.8424 11.2374C19.8424 11.529 19.7264 11.8086 19.5201 12.0145L12.7777 18.757C12.5715 18.9628 12.2922 19.0785 12.0009 19.0787Z\"\n stroke=\"#084FFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M15.1704 10.3984L17.8415 13.0695\"\n stroke=\"#084FFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n <button mat-menu-item (click)=\"deleteSubForm(i)\">\n <svg\n width=\"29\"\n height=\"28\"\n viewBox=\"0 0 29 28\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n x=\"0.5\"\n y=\"0.5\"\n width=\"27.6402\"\n height=\"26.1328\"\n rx=\"5.5\"\n fill=\"white\"\n stroke=\"#D8D8D8\"\n />\n <path\n d=\"M8.60449 9.20637H20.0354\"\n stroke=\"#084FFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M19.2189 9.20703V17.7863C19.2189 18.6482 18.4881 19.3462 17.5859 19.3462H11.0539C10.1517 19.3462 9.4209 18.6482 9.4209 17.7863V9.20703\"\n stroke=\"#084FFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M16.7696 6.67122H11.8706\"\n stroke=\"#084FFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M12.6871 12.3242V16.2239\"\n stroke=\"#084FFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M15.9532 12.3242V16.2239\"\n stroke=\"#084FFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </mat-menu>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n </div>\n\n <div class=\"footer\">\n <div class=\"addNewBtn\" (click)=\"addNewSubmission()\">\n <svg\n width=\"15\"\n height=\"14\"\n viewBox=\"0 0 15 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M12.5556 13.2778H2.44444C1.64639 13.2778 1 12.6673 1 11.9136V2.3642C1 1.61048 1.64639 1 2.44444 1H12.5556C13.3536 1 14 1.61048 14 2.3642V11.9136C14 12.6673 13.3536 13.2778 12.5556 13.2778Z\"\n stroke=\"#D8D8D8\"\n stroke-width=\"0.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M5.3335 7.50347H9.66683\"\n stroke=\"#084FFF\"\n stroke-width=\"0.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M7.50005 5.33594V9.66927\"\n stroke=\"#084FFF\"\n stroke-width=\"0.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <a class=\"ms-2 text-decoration-none\">{{addButtonLabel}}</a>\n </div>\n </div>\n</div>\n", styles: [".table-container{overflow-x:auto;width:100%}.table-container .mat-table-sticky{background:#fff;z-index:1}.footer{display:flex;justify-content:flex-end;align-items:center;cursor:pointer;margin-top:15px}.hidden{display:none}.dropdown-menu{position:relative;z-index:999}::-webkit-scrollbar{width:2px;height:8px}::-webkit-scrollbar-track{background-color:transparent}::-webkit-scrollbar-thumb{background-color:#dbd9d9;border-radius:6px}::ng-deep .mat-mdc-menu-panel{min-width:65px!important}table{border-collapse:separate!important}.column-width{min-width:300px;max-width:500px;white-space:nowrap}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
402
- }
403
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultipleSubformComponent, decorators: [{
404
- type: Component,
405
- args: [{ selector: 'lib-multiple-subform', template: "<div class=\"example-container\" tabindex=\"0\">\n <div class=\"table-container\">\n <table mat-table [dataSource]=\"submissions\" class=\"mat-elevation-z8\">\n <ng-container *ngFor=\"let row of subForm.rows\">\n <ng-container\n *ngFor=\"let formElement of row.grid\"\n [matColumnDef]=\"formElement.element.question\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef\n class=\"border border-1 column-width\"\n >\n {{ formElement.element.question }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let submission\"\n class=\"border border-1\"\n [id]=\"'question-'+submission.submissionId\"\n [ngClass]=\"{\n hidden: getAnswerByQuestionId(submission, formElement)\n ?.isChild\n }\"\n >\n <div\n [innerHTML]=\"\n getAnswerByQuestionId(submission, formElement)\n ?.htmlContent\n \"\n ></div>\n </td>\n </ng-container>\n </ng-container>\n <ng-container matColumnDef=\"actions\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef class=\"border border-1\">\n Actions\n </th>\n <td\n mat-cell\n *matCellDef=\"let submission; let i = index\"\n class=\"text-center border border-1\"\n >\n <div>\n <button\n class=\"btn\"\n mat-icon-button\n [matMenuTriggerFor]=\"menu\"\n aria-label=\"Example icon-button with a menu\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button\n mat-menu-item\n (click)=\"editSubFormSubmission(i, submission)\"\n >\n <svg\n width=\"29\"\n height=\"28\"\n viewBox=\"0 0 29 28\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n x=\"0.5\"\n y=\"0.5\"\n width=\"28\"\n height=\"26.4737\"\n rx=\"5.5\"\n fill=\"white\"\n stroke=\"#D8D8D8\"\n />\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M12.0009 19.0787H9.1582V16.2361C9.1582 15.9447 9.2739 15.6653 9.47999 15.4593L16.2224 8.71686C16.4284 8.5105 16.708 8.39453 16.9995 8.39453C17.2911 8.39453 17.5707 8.5105 17.7767 8.71686L19.5201 10.4603C19.7264 10.6663 19.8424 10.9458 19.8424 11.2374C19.8424 11.529 19.7264 11.8086 19.5201 12.0145L12.7777 18.757C12.5715 18.9628 12.2922 19.0785 12.0009 19.0787Z\"\n stroke=\"#084FFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M15.1704 10.3984L17.8415 13.0695\"\n stroke=\"#084FFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n <button mat-menu-item (click)=\"deleteSubForm(i)\">\n <svg\n width=\"29\"\n height=\"28\"\n viewBox=\"0 0 29 28\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n x=\"0.5\"\n y=\"0.5\"\n width=\"27.6402\"\n height=\"26.1328\"\n rx=\"5.5\"\n fill=\"white\"\n stroke=\"#D8D8D8\"\n />\n <path\n d=\"M8.60449 9.20637H20.0354\"\n stroke=\"#084FFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M19.2189 9.20703V17.7863C19.2189 18.6482 18.4881 19.3462 17.5859 19.3462H11.0539C10.1517 19.3462 9.4209 18.6482 9.4209 17.7863V9.20703\"\n stroke=\"#084FFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M16.7696 6.67122H11.8706\"\n stroke=\"#084FFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M12.6871 12.3242V16.2239\"\n stroke=\"#084FFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M15.9532 12.3242V16.2239\"\n stroke=\"#084FFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </mat-menu>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n </div>\n\n <div class=\"footer\">\n <div class=\"addNewBtn\" (click)=\"addNewSubmission()\">\n <svg\n width=\"15\"\n height=\"14\"\n viewBox=\"0 0 15 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M12.5556 13.2778H2.44444C1.64639 13.2778 1 12.6673 1 11.9136V2.3642C1 1.61048 1.64639 1 2.44444 1H12.5556C13.3536 1 14 1.61048 14 2.3642V11.9136C14 12.6673 13.3536 13.2778 12.5556 13.2778Z\"\n stroke=\"#D8D8D8\"\n stroke-width=\"0.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M5.3335 7.50347H9.66683\"\n stroke=\"#084FFF\"\n stroke-width=\"0.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M7.50005 5.33594V9.66927\"\n stroke=\"#084FFF\"\n stroke-width=\"0.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <a class=\"ms-2 text-decoration-none\">{{addButtonLabel}}</a>\n </div>\n </div>\n</div>\n", styles: [".table-container{overflow-x:auto;width:100%}.table-container .mat-table-sticky{background:#fff;z-index:1}.footer{display:flex;justify-content:flex-end;align-items:center;cursor:pointer;margin-top:15px}.hidden{display:none}.dropdown-menu{position:relative;z-index:999}::-webkit-scrollbar{width:2px;height:8px}::-webkit-scrollbar-track{background-color:transparent}::-webkit-scrollbar-thumb{background-color:#dbd9d9;border-radius:6px}::ng-deep .mat-mdc-menu-panel{min-width:65px!important}table{border-collapse:separate!important}.column-width{min-width:300px;max-width:500px;white-space:nowrap}\n"] }]
406
- }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.DomSanitizer }, { type: i3.ScoreCalculationService }, { type: i4.WhenClauseService }]; }, propDecorators: { subForm: [{
407
- type: Input
408
- }], subFormChange: [{
409
- type: Output
410
- }], acceptedLanguage: [{
411
- type: Input
412
- }] } });
413
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlwbGUtc3ViZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3JtLXN1Ym1pc3Npb24vc3JjL3F1ZXN0aW9uL211bHRpcGxlLXN1YmZvcm0vbXVsdGlwbGUtc3ViZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3JtLXN1Ym1pc3Npb24vc3JjL3F1ZXN0aW9uL211bHRpcGxlLXN1YmZvcm0vbXVsdGlwbGUtc3ViZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBYSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQzs7Ozs7Ozs7OztBQWN0RyxNQUFNLE9BQU8sd0JBQXdCO0lBWW5DLFlBQ1MsTUFBaUIsRUFDaEIsU0FBdUIsRUFDdkIsZ0JBQXlDLEVBQ3pDLGlCQUFtQztRQUhwQyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2hCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDdkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF5QjtRQUN6QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBZnBDLFlBQU8sR0FBUSxFQUFFLENBQUM7UUFDakIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3pDLHFCQUFnQixHQUFXLEVBQUUsQ0FBQztRQUV2QyxnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDL0IsdUJBQWtCLEdBQWEsRUFBRSxDQUFDO1FBQ2xDLHFCQUFnQixHQUFhLEVBQUUsQ0FBQztRQUNoQyxtQkFBYyxHQUFXLG9CQUFvQixDQUFDO0lBUzNDLENBQUM7SUFFSixRQUFRO1FBQ04s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QUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7UUFDdkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLGtCQUFrQixDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7SUFDdEMsQ0FBQzsrR0E3Y1Usd0JBQXdCO21HQUF4Qix3QkFBd0IsK0tDbEJyQyxpb05BeUxBOzs0RkR2S2Esd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLHNCQUFzQjtpTUFLdkIsT0FBTztzQkFBZixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0UsZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ViZm9ybVByb3BlcnR5IH0gZnJvbSAnLi8uLi8uLi9tb2RlbHMvc3ViZm9ybVByb3BlcnkubW9kZWwnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ0NvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBTdWJtaXNzaW9uTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zdWItZm9ybS9zdWJtaXNzaW9uLW1vZGFsL3N1Ym1pc3Npb24tbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IEF0dGFjaG1lbnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvYXR0YWNobWVudC5tb2RlbCc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBTY29yZUNhbGN1bGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Njb3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3VibWlzc2lvbiB9IGZyb20gJy4uLy4uL21vZGVscy9zdWJtaXNzaW9uLm1vZGVsJztcbmltcG9ydCB7IEFuc3dlciB9IGZyb20gJy4uLy4uL21vZGVscy9hbnN3ZXIubW9kZWwnO1xuaW1wb3J0IHsgV2hlbkNsYXVzZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy93aGVuQ2xhdXNlLnNlcnZpY2UnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1tdWx0aXBsZS1zdWJmb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpcGxlLXN1YmZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tdWx0aXBsZS1zdWJmb3JtLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpcGxlU3ViZm9ybUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHN1YkZvcm06IGFueSA9IHt9O1xuICBAT3V0cHV0KCkgc3ViRm9ybUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBASW5wdXQoKSBhY2NlcHRlZExhbmd1YWdlOiBzdHJpbmcgPSAnJztcblxuICBzdWJtaXNzaW9uczogU3VibWlzc2lvbltdID0gW107XG4gIGRlbGV0ZWRTdWJtaXNzaW9uczogc3RyaW5nW10gPSBbXTtcbiAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgYWRkQnV0dG9uTGFiZWw6IHN0cmluZyA9ICdBZGQgTmV3IFN1Ym1pc3Npb24nO1xuICBtYXhQb3NzaWJsZUdvb2RTY29yZSE6bnVtYmVyO1xuICBtYXhQb3NzaWJsZUJhZFNjb3JlITpudW1iZXJcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csIFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBzY29yZUNhbGNTZXJ2aWNlOiBTY29yZUNhbGN1bGF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHdoZW5DbGF1c2VTZXJ2aWNlOldoZW5DbGF1c2VTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCB7IGdvb2RNYXgsIGJhZE1heCB9ID0gdGhpcy5zY29yZUNhbGNTZXJ2aWNlLmdldE1heFBvc3NpYmxlU2NvcmUodGhpcy5zdWJGb3JtKTtcbiAgICB0aGlzLm1heFBvc3NpYmxlR29vZFNjb3JlID0gZ29vZE1heDtcbiAgICB0aGlzLm1heFBvc3NpYmxlQmFkU2NvcmUgPSBiYWRNYXg7XG4gICAgaWYgKHRoaXMuc3ViRm9ybT8uc3VibWlzc2lvbnMpIHtcbiAgICAgIHRoaXMuc3VibWlzc2lvbnMgPSB0aGlzLnN1YkZvcm0uc3VibWlzc2lvbnM7XG4gICAgICB0aGlzLnN1YkZvcm0uZGVsZXRlZFN1Ym1pc3Npb25zID0gW107XG4gICAgfVxuICAgIGlmKHRoaXMuc3ViRm9ybT8ucHJvcGVydHk/LmFkZEJ1dHRvbkxhYmVsKSB7XG4gICAgICB0aGlzLmFkZEJ1dHRvbkxhYmVsID0gdGhpcy5zdWJGb3JtLnByb3BlcnR5LmFkZEJ1dHRvbkxhYmVsO1xuICAgICAgICB9XG4gICAgdGhpcy5pbml0aWFsaXplRGlzcGxheWVkQ29sdW1ucygpO1xuICAgIHRoaXMud2hlbkNsYXVzZVNlcnZpY2UuYWRkR3JpZHNGcm9tU3ViZm9ybSh0aGlzLnN1YkZvcm0pO1xuICB9XG5cbiAgaW5pdGlhbGl6ZURpc3BsYXllZENvbHVtbnMoKSB7XG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5zdWJGb3JtLnJvd3MuZmxhdE1hcCgoaXRlbTogYW55KSA9PlxuICAgICAgaXRlbS5ncmlkXG4gICAgICAgIC5maWx0ZXIoKGdyaWRJdGVtOiBhbnkpID0+IGdyaWRJdGVtLmVsZW1lbnQ/LmZvcm1FbGVtZW50Py5lbGVtZW50VHlwZSAhPT0gJ0hJRERFTl9GSUVMRCcpXG4gICAgICAgIC5tYXAoKGdyaWRJdGVtOiBhbnkpID0+IGdyaWRJdGVtLmVsZW1lbnQucXVlc3Rpb24pXG4gICAgKTtcbiAgXG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnB1c2goJ2FjdGlvbnMnKTtcbiAgfVxuXG4gIGdldEFuc3dlckJ5UXVlc3Rpb25JZChzdWJtaXNzaW9uOiBTdWJtaXNzaW9uLCBxdWVzdGlvbjogYW55KSB7XG4gICAgY29uc3QgcXVlc3Rpb25JZCA9IHF1ZXN0aW9uLmVsZW1lbnQuaWQ7XG4gICAgY29uc3QgYW5zd2VyT2JqID0gc3VibWlzc2lvbi5hbnN3ZXJzLmZpbmQoXG4gICAgICAoYW5zd2VyKSA9PiBhbnN3ZXIucXVlc3Rpb25JZCA9PT0gcXVlc3Rpb25JZFxuICAgICk7XG5cbiAgICBpZiAoIWFuc3dlck9iaikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IGNvbnRlbnQ6IHN0cmluZyA9ICcnO1xuICAgIFxuICAgIGlmIChhbnN3ZXJPYmouYW5zd2VyKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhbnN3ZXJPYmouYW5zd2VyKSkge1xuICAgICAgICBjb25zdCBwcm9jZXNzZWRJdGVtcyA9IGFuc3dlck9iai5hbnN3ZXIubWFwKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnICYmIGl0ZW0uaW5jbHVkZXMoJ3wnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0uc3BsaXQoJ3wnKVswXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgICBjb250ZW50ID0gcHJvY2Vzc2VkSXRlbXMuam9pbignLCAnKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFuc3dlck9iai5hbnN3ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnRlbnQgPSBhbnN3ZXJPYmouYW5zd2VyLmluY2x1ZGVzKCd8JylcbiAgICAgICAgICA/IGFuc3dlck9iai5hbnN3ZXIuc3BsaXQoJ3wnKVswXVxuICAgICAgICAgIDogYW5zd2VyT2JqLmFuc3dlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGN1cnJlbmN5U3ltYm9sID0gJyc7XG4gICAgaWYocXVlc3Rpb24uZWxlbWVudC5mb3JtRWxlbWVudC5lbGVtZW50VHlwZSA9PT0gJ0NVUlJFTkNZJyl7XG4gICAgICBjdXJyZW5jeVN5bWJvbCA9IHRoaXMuZmV0Y2hDdXJyZW5jeVN5bWJvbChxdWVzdGlvbi5lbGVtZW50KTtcbiAgICAgIGFuc3dlck9ialsnaHRtbENvbnRlbnQnXSA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGN1cnJlbmN5U3ltYm9sICsgJyAnICtjb250ZW50KTtcbiAgICB9IGVsc2V7XG4gICAgICBhbnN3ZXJPYmpbJ2h0bWxDb250ZW50J10gPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChjb250ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIGFuc3dlck9iajtcbiAgfVxuXG4gIGZldGNoQ3VycmVuY3lTeW1ib2wocXVlc3Rpb246YW55KXtcbiAgICBsZXQgY3VycmVuY3lTeW1ib2wgPSAnJztcbiAgICBpZiAocXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LmN1cnJlbmN5KSB7XG4gICAgICBsZXQgdXNlckxvY2FsZUN1cmVlbmN5ID0gcXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LmN1cnJlbmN5O1xuICAgICAgaWYgKHF1ZXN0aW9uLmZvcm1FbGVtZW50LmFwcGVhcmFuY2UuY3VycmVuY3lPcHRpb24pIHtcbiAgICAgICAgbGV0IGN1cnJlbmN5T3B0aW9uID1cbiAgICAgICAgICBxdWVzdGlvbi5mb3JtRWxlbWVudC5hcHBlYXJhbmNlLmN1cnJlbmN5T3B0aW9uO1xuICAgICAgICBpZiAoY3VycmVuY3lPcHRpb24gPT0gJ2F1dG8nKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcXVlc3Rpb24uZm9ybUVsZW1lbnQuYXBwZWFyYW5jZS5saW1pdEN1cnJlbmN5U3ltYm9sICYmXG4gICAgICAgICAgICBxdWVzdGlvbi5mb3JtRWxlbWVudC5hcHBlYXJhbmNlLmxpbWl0Q3VycmVuY3lTeW1ib2wubGVuZ3RoID4gMFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY3VycmVuY3lTeW1ib2wgPVxuICAgICAgICAgICAgICBxdWVzdGlvbi5mb3JtRWxlbWVudC5hcHBlYXJhbmNlLmxpbWl0Q3VycmVuY3lTeW1ib2wuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgdXNlckxvY2FsZUN1cmVlbmN5XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA/IHVzZXJMb2NhbGVDdXJlZW5jeVxuICAgICAgICAgICAgICAgIDogcXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LmN1cnJlbmN5U3ltYm9sO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyZW5jeVN5bWJvbCA9IHVzZXJMb2NhbGVDdXJlZW5jeTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVuY3lPcHRpb24gPT0gJ3NwZWNpZmljJykge1xuICAgICAgICAgIGN1cnJlbmN5U3ltYm9sID1cbiAgICAgICAgICAgIHF1ZXN0aW9uLmZvcm1FbGVtZW50Py5hcHBlYXJhbmNlPy5zcGVjaWZpY0N1cnJlbmN5U3ltYm9sO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFjdXJyZW5jeVN5bWJvbCAmJlxuICAgICAgcXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LmN1cnJlbmN5U3ltYm9sXG4gICAgKSB7XG4gICAgICBjdXJyZW5jeVN5bWJvbCA9XG4gICAgICAgIHF1ZXN0aW9uLmZvcm1FbGVtZW50Py5hcHBlYXJhbmNlPy5jdXJyZW5jeVN5bWJvbDtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbmN5U3ltYm9sO1xuICB9XG5cbiAgc3ViRm9ybVN1Ym1pc3Npb24oc3ViRm9ybTogYW55KSB7XG4gICAgY29uc3QgcHJvY2Vzc0Zvcm1FbGVtZW50cyA9IChcbiAgICAgIHJvd3M6IGFueVtdLFxuICAgICAgaXNDaGlsZDogYm9vbGVhbiA9IGZhbHNlXG4gICAgKTogQW5zd2VyW10gPT4ge1xuICAgICAgY29uc3QgYW5zd2VyczogQW5zd2VyW10gPSBbXTtcblxuICAgICAgcm93cy5mbGF0TWFwKChpdGVtOiBhbnkpID0+XG4gICAgICAgIGl0ZW0uZ3JpZC5mb3JFYWNoKChmb3JtRWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgYW5zd2VyOiBBbnN3ZXIgPSB7XG4gICAgICAgICAgICBxdWVzdGlvbklkOiBmb3JtRWxlbWVudC5lbGVtZW50LmlkLFxuICAgICAgICAgICAgYW5zd2VyOiBmb3JtRWxlbWVudC5lbGVtZW50Py5hbnN3ZXIgfHwgJycsXG4gICAgICAgICAgICBmaWxlczpcbiAgICAgICAgICAgICAgZm9ybUVsZW1lbnQuZWxlbWVudC5mb3JtRWxlbWVudC5lbGVtZW50VHlwZSA9PSAnRklMRV9QSUNLRVInICYmXG4gICAgICAgICAgICAgIGZvcm1FbGVtZW50LmVsZW1lbnQuYW5zd2VyXG4gICAgICAgICAgICAgICAgPyBmb3JtRWxlbWVudC5lbGVtZW50LmFuc3dlclxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaXNDaGlsZDogaXNDaGlsZCxcbiAgICAgICAgICAgIGFtb3VudEluV29yZHM6IGZvcm1FbGVtZW50LmVsZW1lbnQuYW1vdW50SW5Xb3Jkc1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmb3JtRWxlbWVudC5lbGVtZW50LmZvcm1FbGVtZW50LmVsZW1lbnRUeXBlID09ICdGSUxFX1BJQ0tFUicgJiZcbiAgICAgICAgICAgIGZvcm1FbGVtZW50LmVsZW1lbnQuYW5zd2VyXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZXMgPSBmb3JtRWxlbWVudC5lbGVtZW50LmFuc3dlci5tYXAoXG4gICAgICAgICAgICAgIChmaWxlOiBhbnkpID0+IGZpbGU/Ll9maWxlLm5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhbnN3ZXIuYW5zd2VyID0gZmlsZU5hbWVzO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhbnN3ZXJzLnB1c2goYW5zd2VyKTtcbiAgICAgICAgICBpZihcbiAgICAgICAgICAgIGZvcm1FbGVtZW50LmVsZW1lbnQuZm9ybUVsZW1lbnQgJiZcbiAgICAgICAgICAgIChmb3JtRWxlbWVudC5lbGVtZW50LmZvcm1FbGVtZW50LmVsZW1lbnRUeXBlID09PSAnRFJPUF9ET1dOJyB8fFxuICAgICAgICAgICAgZm9ybUVsZW1lbnQuZWxlbWVudC5mb3JtRWxlbWVudC5lbGVtZW50VHlwZSA9PT0gJ1JBRElPX0JVVFRPTicgfHxcbiAgICAgICAgICAgIGZvcm1FbGVtZW50LmVsZW1lbnQuZm9ybUVsZW1lbnQuZWxlbWVudFR5cGUgPT09ICdDSEVDS0JPWCcpICYmXG4gICAgICAgICAgICBmb3JtRWxlbWVudC5lbGVtZW50LmZvcm1FbGVtZW50LnNjb3JpbmcgJiZcbiAgICAgICAgICAgIGZvcm1FbGVtZW50LmVsZW1lbnQuZm9ybUVsZW1lbnQuc2NvcmluZy5lbmFibGVTY29yaW5nXG4gICAgICAgICAgKXtcbiAgICAgICAgICAgIGFuc3dlcnMuZm9yRWFjaCgoYW5zKSA9PiB7XG4gICAgICAgICAgICAgIGlmKGZvcm1FbGVtZW50LmVsZW1lbnQuaWQgPT09IGFucy5xdWVzdGlvbklkKXtcbiAgICAgICAgICAgICAgICBjb25zdCBzY29yZVJlc3VsdCA9IHRoaXMuc2NvcmVDYWxjU2VydmljZS5jYWxjdWxhdGVTY29yZUZyb21BbnN3ZXIoYW5zLmFuc3dlciwgZm9ybUVsZW1lbnQuZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgLy8gU2F2ZSB0b3RhbCBzY29yZSBhbmQgaW5kaXZpZHVhbCBzY29yZXNcbiAgICAgICAgICAgICAgICAvLyBhbnMuc2NvcmUgPSBzY29yZVJlc3VsdD8udG90YWxTY29yZSA/PyAxO1xuICAgICAgICAgICAgICAgIGFucy5zY29yZXMgPSBzY29yZVJlc3VsdD8uc2NvcmVzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZvcm1FbGVtZW50LmVsZW1lbnQuY2hpbGRMb2dpY3MpIHtcbiAgICAgICAgICAgIGZvcm1FbGVtZW50LmVsZW1lbnQuY2hpbGRMb2dpY3MuZm9yRWFjaCgobG9naWM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAobG9naWMuc2hvd0xvZ2ljKSB7XG4gICAgICAgICAgICAgICAgYW5zd2Vycy5wdXNoKC4uLnByb2Nlc3NGb3JtRWxlbWVudHMobG9naWMucm93cywgdHJ1ZSkpO1xuICAgICAgICAgICAgICAgIGxvZ2ljLnNob3dMb2dpYyA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIGFuc3dlcnM7XG4gICAgfTtcblxuICAgIGNvbnN0IGFuc3dlcnMgPSBwcm9jZXNzRm9ybUVsZW1lbnRzKHN1YkZvcm0ucm93cyk7XG5cbiAgICBpZiAoYW5zd2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzdWJtaXNzaW9uOiBTdWJtaXNzaW9uID0ge1xuICAgICAgICBzdWJtaXNzaW9uSWQ6ICcnLFxuICAgICAgICBhbnN3ZXJzOiBhbnN3ZXJzLFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLnNjb3JlQ2FsY1NlcnZpY2Uuc2hvdWxkQ2FsY3VsYXRlU2NvcmUodGhpcy5zdWJGb3JtLCBzdWJtaXNzaW9uKSkge1xuICAgICAgICAvLyBNYXJrIHRoYXQgdGhpcyBzdWJtaXNzaW9uIGhhZCBhbGwgc2NvcmluZyBxdWVzdGlvbnMgYW5zd2VyZWQgYXQgbGVhc3Qgb25jZVxuICAgICAgICBzdWJtaXNzaW9uLmhhc0FsbFNjb3JpbmdBbnN3ZXJlZE9uY2UgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3VibWlzc2lvbi5oYXNBbGxTY29yaW5nQW5zd2VyZWRPbmNlKSB7XG4gICAgICAgIC8vIFJlY2FsY3VsYXRlIHNjb3JlIGFsd2F5cyBhZnRlciBvbmNlIHNhdGlzZmllZFxuICAgICAgICBzdWJtaXNzaW9uLnNjb3JlcyA9IHRoaXMuc2NvcmVDYWxjU2VydmljZS5jYWxjdWxhdGVTdWJtaXNzaW9uU2NvcmUoc3VibWlzc2lvbi5hbnN3ZXJzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3VibWlzc2lvbnMucHVzaChzdWJtaXNzaW9uKTtcbiAgICAgIHRoaXMuc3VibWlzc2lvbnMgPSBbLi4udGhpcy5zdWJtaXNzaW9uc107XG4gICAgICB0aGlzLnVwZGF0ZVN1YkZvcm1XaXRoU3VibWlzc2lvbnMoKTtcbiAgICB9XG4gICAgLy8gdGhpcy5zdWJGb3JtLnNjb3JlID0gdGhpcy5zY29yZUNhbGNTZXJ2aWNlLmNhbGN1bGF0ZUZpbmFsU2NvcmUodGhpcy5zdWJtaXNzaW9ucyx0aGlzLm1heFBvc3NpYmxlU2NvcmUpO1xuICB9XG5cbiAgZWRpdFN1YkZvcm1TdWJtaXNzaW9uKGluZGV4OiBudW1iZXIsIHN1Ym1pc3Npb246IFN1Ym1pc3Npb24pIHtcbiAgICBjb25zdCBzdWJGb3JtID0gdGhpcy5iaW5kQW5zd2Vycyh0aGlzLnN1YkZvcm0sIHN1Ym1pc3Npb24pO1xuICAgIGNvbnN0IGRpYWxvZ0NvbmZpZyA9IG5ldyBNYXREaWFsb2dDb25maWcoKTtcbiAgICBkaWFsb2dDb25maWcucG9zaXRpb24gPSB7IHRvcDogJzUlJyB9O1xuICAgIGRpYWxvZ0NvbmZpZy53aWR0aCA9ICcxMDAlJztcbiAgICBkaWFsb2dDb25maWcuZGF0YSA9IHtcbiAgICAgIHN1YkZvcm06IHN1YkZvcm0sXG4gICAgICBhY2NlcHRlZExhbmd1YWdlOiB0aGlzLmFjY2VwdGVkTGFuZ3VhZ2UsXG4gICAgfTtcbiAgICBkaWFsb2dDb25maWcuaGFzQmFja2Ryb3AgPSB0cnVlO1xuICAgIGRpYWxvZ0NvbmZpZy5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xuICAgIGRpYWxvZ0NvbmZpZy5tYXhIZWlnaHQgPSAnODB2aCc7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihTdWJtaXNzaW9uTW9kYWxDb21wb25lbnQsIGRpYWxvZ0NvbmZpZyk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMudXBkYXRlU3VibWlzc2lvbihyZXN1bHQsIGluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGJpbmRBbnN3ZXJzKHN1YkZvcm06IGFueSwgc3VibWlzc2lvbjogU3VibWlzc2lvbik6IGFueSB7XG4gICAgY29uc3QgYmluZEVsZW1lbnRBbnN3ZXJzID0gKHJvd3M6IGFueVtdLCBhbnN3ZXJzOiBBbnN3ZXJbXSkgPT4ge1xuICAgICAgcm93cy5mb3JFYWNoKChyb3c6IGFueSkgPT4ge1xuICAgICAgICByb3cuZ3JpZC5mb3JFYWNoKChncmlkOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhbnN3ZXJzLmZpbmQoKGEpID0+IGEucXVlc3Rpb25JZCA9PT0gZ3JpZC5lbGVtZW50LmlkKTtcbiAgICAgICAgICBpZiAoYW5zd2VyKSB7XG4gICAgICAgICAgICBncmlkLmVsZW1lbnQuYW5zd2VyID1cbiAgICAgICAgICAgICAgZ3JpZC5lbGVtZW50LmZvcm1FbGVtZW50LmVsZW1lbnRUeXBlID09ICdGSUxFX1BJQ0tFUidcbiAgICAgICAgICAgICAgICA/IGFuc3dlcj8uZmlsZXNcbiAgICAgICAgICAgICAgICA6IGFuc3dlci5hbnN3ZXI7XG4gICAgICAgICAgICBncmlkLmVsZW1lbnQuYW1vdW50SW5Xb3JkcyA9IGFuc3dlcj8uYW1vdW50SW5Xb3JkcztcbiAgICAgICAgICAgIGdyaWQuZWxlbWVudC5hbnN3ZXJJZCA9IGFuc3dlci5hbnN3ZXJJZDtcbiAgICAgICAgICAgIGdyaWQuZWxlbWVudC5hdHRhY2htZW50cyA9IGFuc3dlci5hdHRhY2htZW50cztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGdyaWQuZWxlbWVudC5jaGlsZExvZ2ljcykge1xuICAgICAgICAgICAgZ3JpZC5lbGVtZW50LmNoaWxkTG9naWNzLmZvckVhY2goKGxvZ2ljOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgYmluZEVsZW1lbnRBbnN3ZXJzKGxvZ2ljLnJvd3MsIGFuc3dlcnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVkU3ViRm9ybSA9IHsgLi4uc3ViRm9ybSB9O1xuICAgIGJpbmRFbGVtZW50QW5zd2Vycyh1cGRhdGVkU3ViRm9ybS5yb3dzLCBzdWJtaXNzaW9uLmFuc3dlcnMpO1xuICAgIHJldHVybiB1cGRhdGVkU3ViRm9ybTtcbiAgfVxuXG4gIGRlbGV0ZVN1YkZvcm0oaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHN1Ym1pc3Npb24gPSB0aGlzLnN1Ym1pc3Npb25zW2luZGV4XTtcbiAgICBpZiAoc3VibWlzc2lvbi5zdWJtaXNzaW9uSWQpIHtcbiAgICAgIHRoaXMuZGVsZXRlZFN1Ym1pc3Npb25zLnB1c2goc3VibWlzc2lvbi5zdWJtaXNzaW9uSWQpO1xuICAgIH1cbiAgICB0aGlzLnN1Ym1pc3Npb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5zdWJtaXNzaW9ucyA9IFsuLi50aGlzLnN1Ym1pc3Npb25zXTtcbiAgICB0aGlzLnN1YkZvcm0uc2NvcmVzID0gdGhpcy5zY29yZUNhbGNTZXJ2aWNlLmNhbGN1bGF0ZUZpbmFsU2NvcmUodGhpcy5zdWJtaXNzaW9ucyx0aGlzLm1heFBvc3NpYmxlR29vZFNjb3JlLHRoaXMubWF4UG9zc2libGVCYWRTY29yZSk7XG4gICAgdGhpcy51cGRhdGVTdWJGb3JtV2l0aFN1Ym1pc3Npb25zKCk7XG4gIH1cblxuICBhZGROZXdTdWJtaXNzaW9uKCkge1xuICAgIGNvbnN0IHN1YkZvcm0gPSB0aGlzLmNsZWFuQ2lyY3VsYXJSZWZlcmVuY2VzKHRoaXMuc3ViRm9ybSk7XG4gICAgc3ViRm9ybS5yb3dzLmZvckVhY2goKHJvdzogYW55KSA9PiB7XG4gICAgICByb3cuZ3JpZC5mb3JFYWNoKChncmlkOiBhbnkpID0+IHtcbiAgICAgICAgZ3JpZC5lbGVtZW50LmFuc3dlciA9IGdyaWQuZWxlbWVudC5mb3JtRWxlbWVudC5lbGVtZW50VHlwZSA9PT0gJ0ZJTEVfUElDS0VSJyA/IFtdIDogJyc7XG4gICAgICAgIGdyaWQuZWxlbWVudC5hdHRhY2htZW50cyA9IFtdO1xuICAgICAgICBncmlkLmVsZW1lbnQuYW5zd2VySWQgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBkaWFsb2dDb25maWcgPSBuZXcgTWF0RGlhbG9nQ29uZmlnKCk7XG4gICAgZGlhbG9nQ29uZmlnLnBvc2l0aW9uID0geyB0b3A6ICc1JScgfTtcbiAgICBkaWFsb2dDb25maWcud2lkdGggPSAnMTAwJSc7XG4gICAgZGlhbG9nQ29uZmlnLmRhdGEgPSB7XG4gICAgICBzdWJGb3JtOiBzdWJGb3JtLFxuICAgICAgYWNjZXB0ZWRMYW5ndWFnZTogdGhpcy5hY2NlcHRlZExhbmd1YWdlLFxuICAgIH07XG4gICAgZGlhbG9nQ29uZmlnLmhhc0JhY2tkcm9wID0gdHJ1ZTtcbiAgICBkaWFsb2dDb25maWcuZGlzYWJsZUNsb3NlID0gdHJ1ZTtcbiAgICBkaWFsb2dDb25maWcubWF4SGVpZ2h0ID0gJzgwdmgnO1xuICAgIGRpYWxvZ0NvbmZpZy5hdXRvRm9jdXMgPSBmYWxzZTtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFN1Ym1pc3Npb25Nb2RhbENvbXBvbmVudCwgZGlhbG9nQ29uZmlnKTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgY29uc3QgaGFzRGF0YSA9IHJlc3VsdC5yb3dzLmZsYXRNYXAoKGl0ZW06IGFueSkgPT5cbiAgICAgICAgICBpdGVtLmdyaWQuc29tZShcbiAgICAgICAgICAgIChmb3JtRWxlbWVudDogYW55KSA9PlxuICAgICAgICAgICAgICBmb3JtRWxlbWVudC5lbGVtZW50LmFuc3dlciAmJlxuICAgICAgICAgICAgICBmb3JtRWxlbWVudC5lbGVtZW50LmFuc3dlci5sZW5ndGggPiAwXG4gICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChoYXNEYXRhKSB7XG4gICAgICAgICAgdGhpcy5zdWJGb3JtU3VibWlzc2lvbihyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjbGVhbkNpcmN1bGFyUmVmZXJlbmNlcyhvYmo6IGFueSwgc2VlbiA9IG5ldyBXZWFrU2V0KCkpIHtcbiAgICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2Vlbi5hZGQob2JqKTtcblxuICAgIGNvbnN0IGNsZWFuZWRPYmo6IGFueSA9IEFycmF5LmlzQXJyYXkob2JqKSA/IFtdIDoge307XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgIGNsZWFuZWRPYmpba2V5XSA9IHRoaXMuY2xlYW5DaXJjdWxhclJlZmVyZW5jZXMob2JqW2tleV0sIHNlZW4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbGVhbmVkT2JqO1xuICB9XG5cbiAgdXBkYXRlU3VibWlzc2lvbihyZXN1bHQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHByb2Nlc3NGb3JtRWxlbWVudHMgPSAocm93czogYW55W10sIGFuc3dlcnM6IEFuc3dlcltdKSA9PiB7XG4gICAgICByb3dzLmZvckVhY2goKHJvdzogYW55KSA9PiB7XG4gICAgICAgIHJvdy5ncmlkLmZvckVhY2goKGdyaWQ6IGFueSkgPT4ge1xuICAgICAgICAgIGxldCBhbnN3ZXI6IEFuc3dlciA9IHtcbiAgICAgICAgICAgIHF1ZXN0aW9uSWQ6IGdyaWQuZWxlbWVudC5pZCxcbiAgICAgICAgICAgIGFuc3dlcklkOiBncmlkLmVsZW1lbnQ/LmFuc3dlcklkIHx8ICcnLFxuICAgICAgICAgICAgYXR0YWNobWVudHM6IGdyaWQuZWxlbWVudC5hdHRhY2htZW50cyB8fCBbXSxcbiAgICAgICAgICAgIGFuc3dlcjogW10sXG4gICAgICAgICAgICBmaWxlczogW10sXG4gICAgICAgICAgICBkZWxldGVGaWxlczogW10sXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChhbnN3ZXIuYXR0YWNobWVudHMpIHtcbiAgICAgICAgICAgIGFuc3dlci5hbnN3ZXIgPSBhbnN3ZXIuYXR0YWNobWVudHMubWFwKFxuICAgICAgICAgICAgICAoYXR0YWNobWVudDogQXR0YWNobWVudCkgPT4gYXR0YWNobWVudC5maWxlTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGdyaWQuZWxlbWVudC5mb3JtRWxlbWVudC5lbGVtZW50VHlwZSA9PT0gJ0ZJTEVfUElDS0VSJykge1xuICAgICAgICAgICAgaWYgKGdyaWQuZWxlbWVudD8uZGVsZXRlRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBhbnN3ZXIuYW5zd2VyID0gW107IC8vIFJlc2V0IGFuc3dlci5hbnN3ZXIgb25seSBvbmNlXG4gICAgICAgICAgICAgIGFuc3dlci5kZWxldGVGaWxlcyA9IGFuc3dlci5kZWxldGVGaWxlcyB8fCBbXTtcblxuICAgICAgICAgICAgICAvLyBDb2xsZWN0IGRlbGV0ZWQgZmlsZSBJRHNcbiAgICAgICAgICAgICAgZ3JpZC5lbGVtZW50LmRlbGV0ZUZpbGVzLmZvckVhY2goKGRlbGV0ZWRJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgYW5zd2VyLmRlbGV0ZUZpbGVzPy5wdXNoKGRlbGV0ZWRJZCk7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGlmIChhbnN3ZXIuYXR0YWNobWVudHMpIHtcbiAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGRlbGV0ZWQgYXR0YWNobWVudHNcbiAgICAgICAgICAgICAgICBhbnN3ZXIuYXR0YWNobWVudHMgPSBhbnN3ZXIuYXR0YWNobWVudHMuZmlsdGVyKChhdHRhY2htZW50OiBBdHRhY2htZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWdyaWQuZWxlbWVudC5kZWxldGVGaWxlcy5pbmNsdWRlcyhhdHRhY2htZW50LmZpbGVJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBSZWJ1aWxkIGFuc3dlci5hbnN3ZXIgd2l0aCB0aGUgcmVtYWluaW5nIGF0dGFjaG1lbnRzXG4gICAgICAgICAgICAgICAgYW5zd2VyLmFuc3dlciA9IGFuc3dlci5hdHRhY2htZW50cy5tYXAoKGF0dGFjaG1lbnQpID0+IGF0dGFjaG1lbnQuZmlsZU5hbWUpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChncmlkLmVsZW1lbnQuYW5zd2VyKSB7XG4gICAgICAgICAgICAgIGFuc3dlci5maWxlcyA9IGdyaWQuZWxlbWVudC5hbnN3ZXI7XG4gICAgICAgICAgICAgIGxldCBmaWxlTmFtZXNBcnJheSA9IEFycmF5LmlzQXJyYXkoYW5zd2VyLmFuc3dlcikgPyBbLi4uYW5zd2VyLmFuc3dlcl0gOiBbXTtcblxuICAgICAgICAgICAgICBncmlkLmVsZW1lbnQuYW5zd2VyLmZvckVhY2goKGZpbGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZS5fZmlsZT8ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbGVOYW1lc0FycmF5LmluY2x1ZGVzKGZpbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgZmlsZU5hbWVzQXJyYXkucHVzaChmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBhbnN3ZXIuYW5zd2VyID0gZmlsZU5hbWVzQXJyYXk7IC8vIEFwcGVuZCB0byBleGlzdGluZyBhcnJheSBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFuc3dlciA9IHtcbiAgICAgICAgICAgICAgcXVlc3Rpb25JZDogZ3JpZC5lbGVtZW50LmlkLFxuICAgICAgICAgICAgICBhbnN3ZXJJZDogZ3JpZC5lbGVtZW50Py5hbnN3ZXJJZCB8fCAnJyxcbiAgICAgICAgICAgICAgYXR0YWNobWVudHM6IGdyaWQuZWxlbWVudC5hdHRhY2htZW50cyxcbiAgICAgICAgICAgICAgYW5zd2VyOiBncmlkLmVsZW1lbnQuYW5zd2VyLFxuICAgICAgICAgICAgICBtYXhpbXVtUG9zc2libGVTY29yZTogZ3JpZC5lbGVtZW50Lm1heFBvc3NpYmxlU2NvcmUsXG4gICAgICAgICAgICAgIGFtb3VudEluV29yZHM6IGdyaWQuZWxlbWVudC5hbW91bnRJbldvcmRzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBncmlkLmVsZW1lbnQuYW5zd2VyID0gJyc7XG4gICAgICAgICAgYW5zd2Vycy5wdXNoKGFuc3dlcik7XG4gICAgICAgICAgaWYoXG4gICAgICAgICAgICBncmlkLmVsZW1lbnQuZm9ybUVsZW1lbnQgJiZcbiAgICAgICAgICAgIChncmlkLmVsZW1lbnQuZm9ybUVsZW1lbnQuZWxlbWVudFR5cGUgPT09ICdEUk9QX0RPV04nIHx8XG4gICAgICAgICAgICAgIGdyaWQuZWxlbWVudC5mb3JtRWxlbWVudC5lbGVtZW50VHlwZSA9PT0gJ1JBRElPX0JVVFRPTicgfHxcbiAgICAgICAgICAgICAgZ3JpZC5lbGVtZW50LmZvcm1FbGVtZW50LmVsZW1lbnRUeXBlID09PSAnQ0hFQ0tfQk9YJykgJiZcbiAgICAgICAgICAgICAgZ3JpZC5lbGVtZW50LmZvcm1FbGVtZW50LnNjb3JpbmcgJiZcbiAgICAgICAgICAgICAgZ3JpZC5lbGVtZW50LmZvcm1FbGVtZW50LnNjb3JpbmcuZW5hYmxlU2NvcmluZ1xuICAgICAgICAgICl7XG4gICAgICAgICAgICBhbnN3ZXJzLmZvckVhY2goKGFucykgPT4ge1xuICAgICAgICAgICAgICBpZihncmlkLmVsZW1lbnQuaWQgPT09IGFucy5xdWVzdGlvbklkKXtcbiAgICAgICAgICAgICAgICBjb25zdCBzY29yZVJlc3VsdCA9IHRoaXMuc2NvcmVDYWxjU2VydmljZS5jYWxjdWxhdGVTY29yZUZyb21BbnN3ZXIoYW5zLmFuc3dlciwgZ3JpZC5lbGVtZW50KTtcbiAgICAgICAgICAgICAgICAvLyBTYXZlIHRvdGFsIHNjb3JlIGFuZCBpbmRpdmlkdWFsIHNjb3Jlc1xuICAgICAgICAgICAgICAgIGFucy5zY29yZXMgPSBzY29yZVJlc3VsdD8uc2NvcmVzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZ3JpZC5lbGVtZW50LmNoaWxkTG9naWNzKSB7XG4gICAgICAgICAgICBncmlkLmVsZW1lbnQuY2hpbGRMb2dpY3MuZm9yRWFjaCgobG9naWM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAobG9naWMuc2hvd0xvZ2ljKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Zvcm1FbGVtZW50cyhsb2dpYy5yb3dzLCBhbnN3ZXJzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0aGlzLnN1Ym1pc3Npb25zW2luZGV4XS5hbnN3ZXJzID0gW107XG4gICAgcHJvY2Vzc0Zvcm1FbGVtZW50cyhyZXN1bHQucm93cywgdGhpcy5zdWJtaXNzaW9uc1tpbmRleF0uYW5zd2Vycyk7XG4gICAgdGhpcy5zdWJtaXNzaW9uc1tpbmRleF0uc2NvcmVzID0gdGhpcy5zY29yZUNhbGNTZXJ2aWNlLmNhbGN1bGF0ZVN1Ym1pc3Npb25TY29yZSh0aGlzLnN1Ym1pc3Npb25zW2luZGV4XS5hbnN3ZXJzKTtcbiAgICB0aGlzLnN1Ym1pc3Npb25zID0gWy4uLnRoaXMuc3VibWlzc2lvbnNdO1xuICAgIGNvbnN0IGhhc0FueVNjb3JlID0gdGhpcy5zdWJtaXNzaW9ucy5zb21lKFxuICAgICAgc3ViID0+IHN1Yi5zY29yZXM/LnNvbWUocyA9PiBzLnNjb3JlICE9PSBudWxsICYmIHMuc2NvcmUgIT09IHVuZGVmaW5lZClcbiAgICApO1xuICAgIFxuICAgIGlmIChoYXNBbnlTY29yZSkge1xuICAgICAgdGhpcy5zdWJGb3JtLnNjb3JlcyA9IHRoaXMuc2NvcmVDYWxjU2VydmljZS5jYWxjdWxhdGVGaW5hbFNjb3JlKHRoaXMuc3VibWlzc2lvbnMsdGhpcy5tYXhQb3NzaWJsZUdvb2RTY29yZSx0aGlzLm1heFBvc3NpYmxlQmFkU2NvcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1YkZvcm0uc2NvcmVzID0gbnVsbDsgLy8gb3IgMCwgZGVwZW5kaW5nIG9uIGhvdyB5b3Ugd2FudCB0byByZXByZXNlbnQgXCJubyBzY29yZSB5ZXRcIlxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVN1YkZvcm1XaXRoU3VibWlzc2lvbnMoKTtcbiAgICB0aGlzLmNsZWFyRW1wdHlSb3dzKCk7XG4gIH1cblxuICB1cGRhdGVTdWJGb3JtV2l0aFN1Ym1pc3Npb25zKCkge1xuICAgIHRoaXMuc3ViRm9ybS5zdWJtaXNzaW9ucyA9IHRoaXMuc3VibWlzc2lvbnM7XG4gICAgdGhpcy5zdWJGb3JtLm1heFBvc3NpYmxlU2NvcmUgPSB7XG4gICAgICAnZ29vZCc6IHRoaXMubWF4UG9zc2libGVHb29kU2NvcmUsXG4gICAgICAnYmFkJzogdGhpcy5tYXhQb3NzaWJsZUJhZFNjb3JlXG4gICAgfVxuICAgIHRoaXMuc3ViRm9ybS5kZWxldGVkU3VibWlzc2lvbnMgPSB0aGlzLmRlbGV0ZWRTdWJtaXNzaW9ucztcbiAgICB0aGlzLnN1YkZvcm1DaGFuZ2UuZW1pdCh0aGlzLnN1YkZvcm0pO1xuICB9XG5cbiAgY2xlYXJFbXB0eVJvd3MoKSB7XG4gICAgY29uc3Qgbm9uRW1wdHlTdWJtaXNzaW9uczogU3VibWlzc2lvbltdID0gW107XG4gICAgY29uc3QgZW1wdHlTdWJtaXNzaW9uSWRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdGhpcy5zdWJtaXNzaW9ucy5mb3JFYWNoKChzdWJtaXNzaW9uKSA9PiB7XG4gICAgICBpZiAoc3VibWlzc2lvbi5hbnN3ZXJzLnNvbWUoKGFuc3dlcikgPT4gYW5zd2VyLmFuc3dlciAhPT0gJycpKSB7XG4gICAgICAgIG5vbkVtcHR5U3VibWlzc2lvbnMucHVzaChzdWJtaXNzaW9uKTtcbiAgICAgIH0gZWxzZSBpZiAoc3VibWlzc2lvbi5zdWJtaXNzaW9uSWQpIHtcbiAgICAgICAgZW1wdHlTdWJtaXNzaW9uSWRzLnB1c2goc3VibWlzc2lvbi5zdWJtaXNzaW9uSWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zdWJtaXNzaW9ucyA9IG5vbkVtcHR5U3VibWlzc2lvbnM7XG4gICAgdGhpcy5kZWxldGVkU3VibWlzc2lvbnMucHVzaCguLi5lbXB0eVN1Ym1pc3Npb25JZHMpO1xuICAgIHRoaXMudXBkYXRlU3ViRm9ybVdpdGhTdWJtaXNzaW9ucygpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZXhhbXBsZS1jb250YWluZXJcIiB0YWJpbmRleD1cIjBcIj5cbiAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lclwiPlxuICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwic3VibWlzc2lvbnNcIiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejhcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvdyBvZiBzdWJGb3JtLnJvd3NcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBmb3JtRWxlbWVudCBvZiByb3cuZ3JpZFwiXG4gICAgICAgICAgW21hdENvbHVtbkRlZl09XCJmb3JtRWxlbWVudC5lbGVtZW50LnF1ZXN0aW9uXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsXG4gICAgICAgICAgICAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgY2xhc3M9XCJib3JkZXIgYm9yZGVyLTEgY29sdW1uLXdpZHRoXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBmb3JtRWxlbWVudC5lbGVtZW50LnF1ZXN0aW9uIH19XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgIG1hdC1jZWxsXG4gICAgICAgICAgICAqbWF0Q2VsbERlZj1cImxldCBzdWJtaXNzaW9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIGJvcmRlci0xXCJcbiAgICAgICAgICAgIFtpZF09XCIncXVlc3Rpb24tJytzdWJtaXNzaW9uLnN1Ym1pc3Npb25JZFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgIGhpZGRlbjogZ2V0QW5zd2VyQnlRdWVzdGlvbklkKHN1Ym1pc3Npb24sIGZvcm1FbGVtZW50KVxuICAgICAgICAgICAgICAgID8uaXNDaGlsZFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgICAgICAgIGdldEFuc3dlckJ5UXVlc3Rpb25JZChzdWJtaXNzaW9uLCBmb3JtRWxlbWVudClcbiAgICAgICAgICAgICAgICAgID8uaHRtbENvbnRlbnRcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhY3Rpb25zXCIgc3RpY2t5RW5kPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwiYm9yZGVyIGJvcmRlci0xXCI+XG4gICAgICAgICAgQWN0aW9uc1xuICAgICAgICA8L3RoPlxuICAgICAgICA8dGRcbiAgICAgICAgICBtYXQtY2VsbFxuICAgICAgICAgICptYXRDZWxsRGVmPVwibGV0IHN1Ym1pc3Npb247IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXIgYm9yZGVyIGJvcmRlci0xXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuXCJcbiAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkV4YW1wbGUgaWNvbi1idXR0b24gd2l0aCBhIG1lbnVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0U3ViRm9ybVN1Ym1pc3Npb24oaSwgc3VibWlzc2lvbilcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyOVwiXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyOFwiXG4gICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI5IDI4XCJcbiAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICAgICAgICAgIHg9XCIwLjVcIlxuICAgICAgICAgICAgICAgICAgICB5PVwiMC41XCJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyOFwiXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjI2LjQ3MzdcIlxuICAgICAgICAgICAgICAgICAgICByeD1cIjUuNVwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJ3aGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOEQ4RDhcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgIGZpbGwtcnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgICBjbGlwLXJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xMi4wMDA5IDE5LjA3ODdIOS4xNTgyVjE2LjIzNjFDOS4xNTgyIDE1Ljk0NDcgOS4yNzM5IDE1LjY2NTMgOS40Nzk5OSAxNS40NTkzTDE2LjIyMjQgOC43MTY4NkMxNi40Mjg0IDguNTEwNSAxNi43MDggOC4zOTQ1MyAxNi45OTk1IDguMzk0NTNDMTcuMjkxMSA4LjM5NDUzIDE3LjU3MDcgOC41MTA1IDE3Ljc3NjcgOC43MTY4NkwxOS41MjAxIDEwLjQ2MDNDMTkuNzI2NCAxMC42NjYzIDE5Ljg0MjQgMTAuOTQ1OCAxOS44NDI0IDExLjIzNzRDMTkuODQyNCAxMS41MjkgMTkuNzI2NCAxMS44MDg2IDE5LjUyMDEgMTIuMDE0NUwxMi43Nzc3IDE4Ljc1N0MxMi41NzE1IDE4Ljk2MjggMTIuMjkyMiAxOS4wNzg1IDEyLjAwMDkgMTkuMDc4N1pcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDg0RkZGXCJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE1LjE3MDQgMTAuMzk4NEwxNy44NDE1IDEzLjA2OTVcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDg0RkZGXCJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImRlbGV0ZVN1YkZvcm0oaSlcIj5cbiAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICB3aWR0aD1cIjI5XCJcbiAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjI4XCJcbiAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjkgMjhcIlxuICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHJlY3RcbiAgICAgICAgICAgICAgICAgICAgeD1cIjAuNVwiXG4gICAgICAgICAgICAgICAgICAgIHk9XCIwLjVcIlxuICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI3LjY0MDJcIlxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyNi4xMzI4XCJcbiAgICAgICAgICAgICAgICAgICAgcng9XCI1LjVcIlxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwid2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRDhEOEQ4XCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICBkPVwiTTguNjA0NDkgOS4yMDYzN0gyMC4wMzU0XCJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzA4NEZGRlwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xOS4yMTg5IDkuMjA3MDNWMTcuNzg2M0MxOS4yMTg5IDE4LjY0ODIgMTguNDg4MSAxOS4zNDYyIDE3LjU4NTkgMTkuMzQ2MkgxMS4wNTM5QzEwLjE1MTcgMTkuMzQ2MiA5LjQyMDkgMTguNjQ4MiA5LjQyMDkgMTcuNzg2M1Y5LjIwNzAzXCJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzA4NEZGRlwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xNi43Njk2IDYuNjcxMjJIMTEuODcwNlwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwODRGRkZcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIuNjg3MSAxMi4zMjQyVjE2LjIyMzlcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDg0RkZGXCJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE1Ljk1MzIgMTIuMzI0MlYxNi4yMjM5XCJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzA4NEZGRlwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICA8L3RhYmxlPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImFkZE5ld0J0blwiIChjbGljayk9XCJhZGROZXdTdWJtaXNzaW9uKClcIj5cbiAgICAgIDxzdmdcbiAgICAgICAgd2lkdGg9XCIxNVwiXG4gICAgICAgIGhlaWdodD1cIjE0XCJcbiAgICAgICAgdmlld0JveD1cIjAgMCAxNSAxNFwiXG4gICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICA+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZmlsbC1ydWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgZD1cIk0xMi41NTU2IDEzLjI3NzhIMi40NDQ0NEMxLjY0NjM5IDEzLjI3NzggMSAxMi42NjczIDEgMTEuOTEzNlYyLjM2NDJDMSAxLjYxMDQ4IDEuNjQ2MzkgMSAyLjQ0NDQ0IDFIMTIuNTU1NkMxMy4zNTM2IDEgMTQgMS42MTA0OCAxNCAyLjM2NDJWMTEuOTEzNkMxNCAxMi42NjczIDEzLjM1MzYgMTMuMjc3OCAxMi41NTU2IDEzLjI3NzhaXCJcbiAgICAgICAgICBzdHJva2U9XCIjRDhEOEQ4XCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCIwLjhcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTUuMzMzNSA3LjUwMzQ3SDkuNjY2ODNcIlxuICAgICAgICAgIHN0cm9rZT1cIiMwODRGRkZcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjAuOFwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAvPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNNy41MDAwNSA1LjMzNTk0VjkuNjY5MjdcIlxuICAgICAgICAgIHN0cm9rZT1cIiMwODRGRkZcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjAuOFwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAvPlxuICAgICAgPC9zdmc+XG4gICAgICA8YSBjbGFzcz1cIm1zLTIgdGV4dC1kZWNvcmF0aW9uLW5vbmVcIj57e2FkZEJ1dHRvbkxhYmVsfX08L2E+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=