@dsivd/prestations-ng 17.10.9 → 18.0.0-beta.10

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 (314) hide show
  1. package/CHANGELOG.md +2478 -2466
  2. package/CONTRIBUTING.md +66 -66
  3. package/ESLINT_MIGRATION_GUIDE.md +19 -33
  4. package/MODULES.md +88 -88
  5. package/MULTI_ETAPES.md +9 -9
  6. package/README.md +25 -24
  7. package/README_COMMON.md +10 -10
  8. package/UPGRADING_V12.md +36 -36
  9. package/UPGRADING_V13.md +3 -3
  10. package/UPGRADING_V14.md +2 -2
  11. package/UPGRADING_V15.md +4 -4
  12. package/UPGRADING_V16.md +38 -38
  13. package/UPGRADING_V17.md +51 -51
  14. package/UPGRADING_V18.md +596 -8
  15. package/UPGRADING_V8.md +5 -5
  16. package/abstract-page-component.d.ts +1 -1
  17. package/dsivd-prestations-ng-18.0.0-beta.10.tgz +0 -0
  18. package/fesm2022/dsivd-prestations-ng.mjs +903 -868
  19. package/fesm2022/dsivd-prestations-ng.mjs.map +1 -1
  20. package/foehn-checkables/foehn-checkable-group.component.d.ts +1 -1
  21. package/foehn-checkables/foehn-checkables.module.d.ts +6 -7
  22. package/foehn-date-picker/date-picker.helper.d.ts +1 -1
  23. package/foehn-icons/abstract-icon-component.d.ts +1 -1
  24. package/foehn-input/foehn-input-string.component.d.ts +1 -1
  25. package/foehn-input/foehn-input.component.d.ts +1 -1
  26. package/foehn-menu-prestation/abstract-list-item-detail-page.component.d.ts +1 -1
  27. package/foehn-menu-prestation/abstract-menu-page.component.d.ts +1 -1
  28. package/foehn-menu-prestation/abstract-page-from-menu.component.d.ts +1 -1
  29. package/foehn-navigation/abstract-foehn-navigation.component.d.ts +1 -1
  30. package/foehn-table/foehn-table.component.d.ts +1 -6
  31. package/foehn-upload/abstract-foehn-uploader.component.d.ts +1 -2
  32. package/foehn-upload/foehn-picture-upload/foehn-picture-upload.component.d.ts +1 -3
  33. package/foehn-upload/foehn-picture-upload/foehn-picture-upload.module.d.ts +1 -1
  34. package/index.d.ts +1 -1
  35. package/index.html +1 -1
  36. package/package.json +15 -17
  37. package/prestations-ng-core.module.d.ts +5 -4
  38. package/sdk-appinfo/application-info.service.d.ts +1 -0
  39. package/sdk-drafts/drafts.module.d.ts +7 -8
  40. package/sdk-support-alert/support-alert.module.d.ts +2 -3
  41. package/dsivd-prestations-ng-17.10.9.tgz +0 -0
  42. package/esm2022/abstract-page-component.mjs +0 -232
  43. package/esm2022/directives/currency-formatter.directive.mjs +0 -143
  44. package/esm2022/directives/formatter.module.mjs +0 -37
  45. package/esm2022/directives/iban-formatter.directive.mjs +0 -29
  46. package/esm2022/directives/ide-formatter.directive.mjs +0 -37
  47. package/esm2022/directives/ndc-formatter.directive.mjs +0 -75
  48. package/esm2022/dsivd-prestations-ng.mjs +0 -5
  49. package/esm2022/foehn-address/address.type.mjs +0 -10
  50. package/esm2022/foehn-address/foehn-address.module.mjs +0 -55
  51. package/esm2022/foehn-address/foehn-display-address.component.mjs +0 -69
  52. package/esm2022/foehn-address/foehn-input-address.component.mjs +0 -498
  53. package/esm2022/foehn-address/foehn-input-foreign-locality.component.mjs +0 -66
  54. package/esm2022/foehn-address/foehn-input-foreign-street.component.mjs +0 -56
  55. package/esm2022/foehn-agenda/calendar.type.mjs +0 -3
  56. package/esm2022/foehn-agenda/current-week.type.mjs +0 -4
  57. package/esm2022/foehn-agenda/day-slots.type.mjs +0 -3
  58. package/esm2022/foehn-agenda/foehn-agenda-navigation/foehn-agenda-navigation.component.mjs +0 -75
  59. package/esm2022/foehn-agenda/foehn-agenda-timeslot-panel/foehn-agenda-timeslot-panel.component.mjs +0 -242
  60. package/esm2022/foehn-agenda/foehn-agenda.component.mjs +0 -95
  61. package/esm2022/foehn-agenda/foehn-agenda.module.mjs +0 -62
  62. package/esm2022/foehn-agenda/pagination-week.type.mjs +0 -3
  63. package/esm2022/foehn-agenda/selected-slot.type.mjs +0 -3
  64. package/esm2022/foehn-autocomplete/foehn-autocomplete.component.mjs +0 -684
  65. package/esm2022/foehn-autocomplete/foehn-autocomplete.module.mjs +0 -40
  66. package/esm2022/foehn-boolean/foehn-boolean-checkbox.component.mjs +0 -28
  67. package/esm2022/foehn-boolean/foehn-boolean-radio.component.mjs +0 -40
  68. package/esm2022/foehn-boolean/foehn-boolean.module.mjs +0 -33
  69. package/esm2022/foehn-breadcrumb/breadcrumb-event.service.mjs +0 -177
  70. package/esm2022/foehn-breadcrumb/breadcrumb.mjs +0 -5
  71. package/esm2022/foehn-breadcrumb/foehn-breadcrumb.component.mjs +0 -106
  72. package/esm2022/foehn-breadcrumb/foehn-breadcrumb.module.mjs +0 -20
  73. package/esm2022/foehn-checkables/foehn-checkable-group.component.mjs +0 -291
  74. package/esm2022/foehn-checkables/foehn-checkables.module.mjs +0 -68
  75. package/esm2022/foehn-checkables/foehn-checkbox.component.mjs +0 -37
  76. package/esm2022/foehn-checkables/foehn-radio.component.mjs +0 -64
  77. package/esm2022/foehn-checkables/foehn-select.component.mjs +0 -55
  78. package/esm2022/foehn-checkables/form-select-option-group.mjs +0 -3
  79. package/esm2022/foehn-checkables/form-select-option.mjs +0 -3
  80. package/esm2022/foehn-confirm-modal/foehn-confirm-modal-content.mjs +0 -7
  81. package/esm2022/foehn-confirm-modal/foehn-confirm-modal.component.mjs +0 -40
  82. package/esm2022/foehn-confirm-modal/foehn-confirm-modal.module.mjs +0 -19
  83. package/esm2022/foehn-confirm-modal/foehn-confirm-modal.service.mjs +0 -53
  84. package/esm2022/foehn-date-picker/date-picker-navigation.helper.mjs +0 -168
  85. package/esm2022/foehn-date-picker/date-picker.helper.mjs +0 -132
  86. package/esm2022/foehn-date-picker/day-month.type.mjs +0 -3
  87. package/esm2022/foehn-date-picker/focused-day.type.mjs +0 -3
  88. package/esm2022/foehn-date-picker/foehn-date-picker.component.mjs +0 -392
  89. package/esm2022/foehn-date-picker/foehn-date-picker.module.mjs +0 -40
  90. package/esm2022/foehn-date-picker/month-year.type.mjs +0 -3
  91. package/esm2022/foehn-date-picker-button/foehn-date-picker-button.component.mjs +0 -97
  92. package/esm2022/foehn-date-picker-button/foehn-date-picker-button.module.mjs +0 -36
  93. package/esm2022/foehn-debug-summary/foehn-debug-summary.component.mjs +0 -84
  94. package/esm2022/foehn-debug-summary/foehn-debug-summary.component.module.mjs +0 -20
  95. package/esm2022/foehn-decision-electronique/foehn-decision-electronique.component.mjs +0 -37
  96. package/esm2022/foehn-decision-electronique/foehn-decision-electronique.module.mjs +0 -32
  97. package/esm2022/foehn-dropdown-menu/dropdown-menu-group.type.mjs +0 -3
  98. package/esm2022/foehn-dropdown-menu/dropdown-menu-item.type.mjs +0 -6
  99. package/esm2022/foehn-dropdown-menu/foehn-dropdown-menu.component.mjs +0 -212
  100. package/esm2022/foehn-dropdown-menu/foehn-dropdown-menu.module.mjs +0 -21
  101. package/esm2022/foehn-feedback-notification/foehn-feedback-notification.component.mjs +0 -113
  102. package/esm2022/foehn-feedback-notification/foehn-feedback-notification.module.mjs +0 -32
  103. package/esm2022/foehn-feedback-notification/foehn-feedback-notification.type.mjs +0 -3
  104. package/esm2022/foehn-footer/foehn-footer.component.mjs +0 -130
  105. package/esm2022/foehn-footer/foehn-footer.module.mjs +0 -19
  106. package/esm2022/foehn-footer/footer-link.type.mjs +0 -3
  107. package/esm2022/foehn-form/foehn-form.component.mjs +0 -136
  108. package/esm2022/foehn-form/foehn-form.module.mjs +0 -32
  109. package/esm2022/foehn-form/register-ng-model.service.mjs +0 -23
  110. package/esm2022/foehn-growl/foehn-growl.component.mjs +0 -45
  111. package/esm2022/foehn-growl/foehn-growl.module.mjs +0 -18
  112. package/esm2022/foehn-growl/growl-broker.service.mjs +0 -37
  113. package/esm2022/foehn-growl/growl-message.mjs +0 -9
  114. package/esm2022/foehn-growl/growl-types.mjs +0 -7
  115. package/esm2022/foehn-header/foehn-header.component.mjs +0 -159
  116. package/esm2022/foehn-header/foehn-header.module.mjs +0 -40
  117. package/esm2022/foehn-header/foehn-skip-link.component.mjs +0 -51
  118. package/esm2022/foehn-help-modal/foehn-help-modal.component.mjs +0 -44
  119. package/esm2022/foehn-help-modal/foehn-help-modal.module.mjs +0 -20
  120. package/esm2022/foehn-help-modal/foehn-help-modal.type.mjs +0 -2
  121. package/esm2022/foehn-icons/abstract-icon-component.mjs +0 -12
  122. package/esm2022/foehn-icons/foehn-icon-calendar.component.mjs +0 -19
  123. package/esm2022/foehn-icons/foehn-icon-check-square-o.component.mjs +0 -19
  124. package/esm2022/foehn-icons/foehn-icon-check.component.mjs +0 -19
  125. package/esm2022/foehn-icons/foehn-icon-chevron-down.component.mjs +0 -19
  126. package/esm2022/foehn-icons/foehn-icon-chevron-left.component.mjs +0 -19
  127. package/esm2022/foehn-icons/foehn-icon-chevron-right.component.mjs +0 -19
  128. package/esm2022/foehn-icons/foehn-icon-chevron-up.component.mjs +0 -19
  129. package/esm2022/foehn-icons/foehn-icon-clock.component.mjs +0 -19
  130. package/esm2022/foehn-icons/foehn-icon-comment-dots.component.mjs +0 -19
  131. package/esm2022/foehn-icons/foehn-icon-edit.component.mjs +0 -19
  132. package/esm2022/foehn-icons/foehn-icon-external-link-alt.component.mjs +0 -19
  133. package/esm2022/foehn-icons/foehn-icon-file-pdf.component.mjs +0 -19
  134. package/esm2022/foehn-icons/foehn-icon-info-circle.component.mjs +0 -19
  135. package/esm2022/foehn-icons/foehn-icon-lock.component.mjs +0 -19
  136. package/esm2022/foehn-icons/foehn-icon-map-marker.component.mjs +0 -19
  137. package/esm2022/foehn-icons/foehn-icon-minus-circle.component.mjs +0 -19
  138. package/esm2022/foehn-icons/foehn-icon-pencil.component.mjs +0 -19
  139. package/esm2022/foehn-icons/foehn-icon-plus-circle.component.mjs +0 -19
  140. package/esm2022/foehn-icons/foehn-icon-plus-square.component.mjs +0 -19
  141. package/esm2022/foehn-icons/foehn-icon-search.component.mjs +0 -19
  142. package/esm2022/foehn-icons/foehn-icon-times.component.mjs +0 -19
  143. package/esm2022/foehn-icons/foehn-icon-trash-alt.component.mjs +0 -19
  144. package/esm2022/foehn-icons/foehn-icon-unlock-alt.component.mjs +0 -19
  145. package/esm2022/foehn-icons/foehn-icon-user.component.mjs +0 -19
  146. package/esm2022/foehn-icons/foehn-icons.module.mjs +0 -139
  147. package/esm2022/foehn-input/foehn-input-email.component.mjs +0 -74
  148. package/esm2022/foehn-input/foehn-input-hidden.component.mjs +0 -54
  149. package/esm2022/foehn-input/foehn-input-number.component.mjs +0 -319
  150. package/esm2022/foehn-input/foehn-input-password.component.mjs +0 -51
  151. package/esm2022/foehn-input/foehn-input-phone.component.mjs +0 -99
  152. package/esm2022/foehn-input/foehn-input-prefixed-text.component.mjs +0 -116
  153. package/esm2022/foehn-input/foehn-input-string.component.mjs +0 -27
  154. package/esm2022/foehn-input/foehn-input-text.component.mjs +0 -69
  155. package/esm2022/foehn-input/foehn-input-textarea.component.mjs +0 -97
  156. package/esm2022/foehn-input/foehn-input.component.mjs +0 -418
  157. package/esm2022/foehn-input/foehn-input.module.mjs +0 -98
  158. package/esm2022/foehn-input/pattern.const.mjs +0 -16
  159. package/esm2022/foehn-input-date/foehn-input-date.component.mjs +0 -163
  160. package/esm2022/foehn-input-date-time/foehn-input-date-time.component.mjs +0 -201
  161. package/esm2022/foehn-input-time/foehn-input-time.component.mjs +0 -89
  162. package/esm2022/foehn-list/foehn-list.component.mjs +0 -127
  163. package/esm2022/foehn-list/foehn-list.module.mjs +0 -19
  164. package/esm2022/foehn-list/page-change-event.mjs +0 -3
  165. package/esm2022/foehn-menu-prestation/abstract-list-item-detail-page.component.mjs +0 -122
  166. package/esm2022/foehn-menu-prestation/abstract-menu-page.component.mjs +0 -31
  167. package/esm2022/foehn-menu-prestation/abstract-page-from-menu.component.mjs +0 -87
  168. package/esm2022/foehn-menu-prestation/foehn-error-pill/foehn-error-pill.component.mjs +0 -25
  169. package/esm2022/foehn-menu-prestation/foehn-list-summary/foehn-list-item-description.mjs +0 -2
  170. package/esm2022/foehn-menu-prestation/foehn-list-summary/foehn-list-item.mjs +0 -3
  171. package/esm2022/foehn-menu-prestation/foehn-list-summary/foehn-list-summary.component.mjs +0 -161
  172. package/esm2022/foehn-menu-prestation/foehn-menu-items/foehn-menu-item/foehn-menu-item.component.mjs +0 -38
  173. package/esm2022/foehn-menu-prestation/foehn-menu-items/foehn-menu-item-transmit/foehn-menu-item-transmit.component.mjs +0 -58
  174. package/esm2022/foehn-menu-prestation/foehn-menu-prestation.module.mjs +0 -67
  175. package/esm2022/foehn-misc/foehn-abbr.component.mjs +0 -15
  176. package/esm2022/foehn-misc/foehn-misc.module.mjs +0 -17
  177. package/esm2022/foehn-modal/foehn-modal.component.mjs +0 -94
  178. package/esm2022/foehn-modal/foehn-modal.module.mjs +0 -21
  179. package/esm2022/foehn-multiselect-autocomplete/foehn-multiselect-autocomplete.component.mjs +0 -287
  180. package/esm2022/foehn-multiselect-autocomplete/foehn-multiselect-autocomplete.module.mjs +0 -40
  181. package/esm2022/foehn-nav13/foehn-input-nav13.component.mjs +0 -114
  182. package/esm2022/foehn-nav13/foehn-input-nav13.module.mjs +0 -32
  183. package/esm2022/foehn-navigation/abstract-foehn-navigation.component.mjs +0 -55
  184. package/esm2022/foehn-navigation/foehn-navigation/foehn-navigation.component.mjs +0 -67
  185. package/esm2022/foehn-navigation/foehn-navigation.module.mjs +0 -37
  186. package/esm2022/foehn-navigation/foehn-navigation.service.mjs +0 -322
  187. package/esm2022/foehn-navigation/foehn-simple-navigation/foehn-simple-navigation.component.mjs +0 -26
  188. package/esm2022/foehn-notfound/foehn-notfound.component.mjs +0 -61
  189. package/esm2022/foehn-notfound/foehn-notfound.module.mjs +0 -20
  190. package/esm2022/foehn-page/foehn-page-counter.component.mjs +0 -31
  191. package/esm2022/foehn-page/foehn-page-expiration-timer/current-session-expiration.mjs +0 -3
  192. package/esm2022/foehn-page/foehn-page-expiration-timer/demande-expiration-interceptor.mjs +0 -68
  193. package/esm2022/foehn-page/foehn-page-expiration-timer/demande-expiration.service.mjs +0 -53
  194. package/esm2022/foehn-page/foehn-page-expiration-timer/foehn-page-expiration-timer.component.mjs +0 -175
  195. package/esm2022/foehn-page/foehn-page-expiration-timer/interval.helper.mjs +0 -29
  196. package/esm2022/foehn-page/foehn-page-modal.component.mjs +0 -54
  197. package/esm2022/foehn-page/foehn-page-modal.service.mjs +0 -38
  198. package/esm2022/foehn-page/foehn-page.component.mjs +0 -223
  199. package/esm2022/foehn-page/foehn-page.module.mjs +0 -101
  200. package/esm2022/foehn-page/foehn-page.service.mjs +0 -54
  201. package/esm2022/foehn-page/foehn-transmit-waiting-modal/demande-transmit-interceptor.mjs +0 -52
  202. package/esm2022/foehn-page/foehn-transmit-waiting-modal/foehn-transmit-waiting-modal.component.mjs +0 -23
  203. package/esm2022/foehn-page/foehn-transmit-waiting-modal/foehn-transmit-waiting-modal.service.mjs +0 -32
  204. package/esm2022/foehn-recap-section/foehn-recap-section.component.mjs +0 -98
  205. package/esm2022/foehn-recap-section/foehn-recap-section.module.mjs +0 -20
  206. package/esm2022/foehn-recap-section/foehn-recap-section.type.mjs +0 -2
  207. package/esm2022/foehn-remaining-alerts-summary/foehn-remaining-alerts-summary.component.mjs +0 -50
  208. package/esm2022/foehn-remaining-alerts-summary/foehn-remaining-alerts-summary.module.mjs +0 -18
  209. package/esm2022/foehn-status-progress-bar/foehn-status-progress-bar.component.mjs +0 -56
  210. package/esm2022/foehn-status-progress-bar/foehn-status-progress-bar.module.mjs +0 -20
  211. package/esm2022/foehn-table/foehn-table-column-configuration.mjs +0 -3
  212. package/esm2022/foehn-table/foehn-table-page-change-event.mjs +0 -3
  213. package/esm2022/foehn-table/foehn-table.component.mjs +0 -190
  214. package/esm2022/foehn-table/foehn-table.module.mjs +0 -40
  215. package/esm2022/foehn-table/row-element.type.mjs +0 -3
  216. package/esm2022/foehn-table/tableSort.mjs +0 -3
  217. package/esm2022/foehn-upload/abstract-foehn-uploader.component.mjs +0 -242
  218. package/esm2022/foehn-upload/document-reference.mjs +0 -6
  219. package/esm2022/foehn-upload/foehn-bo-multi-upload/bo-multi-upload.service.mjs +0 -116
  220. package/esm2022/foehn-upload/foehn-bo-multi-upload/bo-multi-upload.type.mjs +0 -6
  221. package/esm2022/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.component.mjs +0 -199
  222. package/esm2022/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.module.mjs +0 -40
  223. package/esm2022/foehn-upload/foehn-multi-upload/foehn-multi-upload.component.mjs +0 -250
  224. package/esm2022/foehn-upload/foehn-multi-upload/foehn-multi-upload.module.mjs +0 -40
  225. package/esm2022/foehn-upload/foehn-multi-upload/multi-upload.service.mjs +0 -125
  226. package/esm2022/foehn-upload/foehn-multi-upload/multi-upload.type.mjs +0 -6
  227. package/esm2022/foehn-upload/foehn-multi-upload/pending-upload.service.mjs +0 -163
  228. package/esm2022/foehn-upload/foehn-picture-upload/foehn-picture-upload.component.mjs +0 -178
  229. package/esm2022/foehn-upload/foehn-picture-upload/foehn-picture-upload.module.mjs +0 -44
  230. package/esm2022/foehn-upload/foehn-upload-progress-bar/foehn-upload-progress-bar.component.mjs +0 -83
  231. package/esm2022/foehn-upload/foehn-upload-progress-bar/foehn-upload-progress-bar.module.mjs +0 -21
  232. package/esm2022/foehn-upload/foehn-upload-progress-bar/upload-progress.service.mjs +0 -66
  233. package/esm2022/foehn-upload/foehn-upload-progress-bar/upload-progress.type.mjs +0 -7
  234. package/esm2022/foehn-upload/page-upload-limit.service.mjs +0 -80
  235. package/esm2022/foehn-upload/pending-upload.type.mjs +0 -3
  236. package/esm2022/foehn-upload/uploader.helper.mjs +0 -329
  237. package/esm2022/foehn-user-connected-as/foehn-user-connected-as.component.mjs +0 -21
  238. package/esm2022/foehn-user-connected-as/foehn-user-connected-as.module.mjs +0 -19
  239. package/esm2022/foehn-validation-alert-summary/foehn-validation-alert-summary.component.mjs +0 -96
  240. package/esm2022/foehn-validation-alert-summary/foehn-validation-alert-summary.module.mjs +0 -19
  241. package/esm2022/foehn-validation-alerts/foehn-validation-alerts.component.mjs +0 -29
  242. package/esm2022/foehn-validation-alerts/foehn-validation-alerts.module.mjs +0 -18
  243. package/esm2022/form-error.mjs +0 -2
  244. package/esm2022/form-post-response.mjs +0 -10
  245. package/esm2022/gesdem/gesdem-error-handler.service.mjs +0 -85
  246. package/esm2022/gesdem/gesdem-event.service.mjs +0 -38
  247. package/esm2022/gesdem/gesdem-handler.service.mjs +0 -201
  248. package/esm2022/gesdem/gesdem-loader.guard.mjs +0 -25
  249. package/esm2022/gesdem/gesdem-statut-utils.mjs +0 -25
  250. package/esm2022/gesdem-action-recovery/gesdem-action-recovery-login/gesdem-action-recovery-login.component.mjs +0 -170
  251. package/esm2022/gesdem-action-recovery/gesdem-action-recovery-registration/gesdem-action-recovery-registration.component.mjs +0 -227
  252. package/esm2022/gesdem-action-recovery/gesdem-action-recovery.module.mjs +0 -62
  253. package/esm2022/gesdem-action-recovery/gesdem-action-recovery.service.mjs +0 -97
  254. package/esm2022/gesdem-action-recovery/reprise-info.mjs +0 -4
  255. package/esm2022/gesdem-confirmation/gesdem-confirmation.component.mjs +0 -241
  256. package/esm2022/gesdem-confirmation/gesdem-confirmation.module.mjs +0 -36
  257. package/esm2022/gesdem-error/gesdem-error.component.mjs +0 -96
  258. package/esm2022/gesdem-error/gesdem-error.module.mjs +0 -36
  259. package/esm2022/global.const.mjs +0 -5
  260. package/esm2022/helpers/demande.helper.mjs +0 -19
  261. package/esm2022/helpers/object.helper.mjs +0 -124
  262. package/esm2022/i18n-form.mjs +0 -7
  263. package/esm2022/pipes/currency.pipe.mjs +0 -18
  264. package/esm2022/pipes/date.pipe.mjs +0 -43
  265. package/esm2022/pipes/formatIde.pipe.mjs +0 -22
  266. package/esm2022/pipes/pipes.module.mjs +0 -18
  267. package/esm2022/prestations-ng-core.module.mjs +0 -31
  268. package/esm2022/public_api.mjs +0 -288
  269. package/esm2022/refinf/model/address-type-light.mjs +0 -3
  270. package/esm2022/refinf/model/canton.mjs +0 -3
  271. package/esm2022/refinf/model/district.mjs +0 -3
  272. package/esm2022/refinf/model/municipality.mjs +0 -3
  273. package/esm2022/refinf/model/place-of-origin.mjs +0 -3
  274. package/esm2022/refinf/model/postal-locality.mjs +0 -3
  275. package/esm2022/sdk-appinfo/application-info.mjs +0 -22
  276. package/esm2022/sdk-appinfo/application-info.service.mjs +0 -146
  277. package/esm2022/sdk-currency/currency.helper.mjs +0 -34
  278. package/esm2022/sdk-date/date.helper.mjs +0 -109
  279. package/esm2022/sdk-dictionary/default-dictionary.mjs +0 -312
  280. package/esm2022/sdk-dictionary/sdk-dictionary.module.mjs +0 -16
  281. package/esm2022/sdk-dictionary/sdk-dictionary.pipe.mjs +0 -28
  282. package/esm2022/sdk-dictionary/sdk-dictionary.service.mjs +0 -122
  283. package/esm2022/sdk-drafts/draft.model.mjs +0 -2
  284. package/esm2022/sdk-drafts/drafts-container.component.mjs +0 -99
  285. package/esm2022/sdk-drafts/drafts.module.mjs +0 -47
  286. package/esm2022/sdk-drafts/drafts.service.mjs +0 -51
  287. package/esm2022/sdk-epayment/model/EPaymentParameters.mjs +0 -2
  288. package/esm2022/sdk-epayment/pending-payment/pending-payment.component.mjs +0 -24
  289. package/esm2022/sdk-epayment/sdk-epayment.component.mjs +0 -76
  290. package/esm2022/sdk-epayment/sdk-epayment.module.mjs +0 -23
  291. package/esm2022/sdk-epayment/sdk-epayment.service.mjs +0 -51
  292. package/esm2022/sdk-events-logger/sdk-event-type.mjs +0 -14
  293. package/esm2022/sdk-events-logger/sdk-event.mjs +0 -3
  294. package/esm2022/sdk-events-logger/sdk-events-logger.service.mjs +0 -43
  295. package/esm2022/sdk-recaptcha/grecaptcha/grecaptcha.component.mjs +0 -113
  296. package/esm2022/sdk-recaptcha/recaptcha.service.mjs +0 -180
  297. package/esm2022/sdk-recaptcha/sdk-recaptcha.component.mjs +0 -75
  298. package/esm2022/sdk-recaptcha/sdk-recaptcha.module.mjs +0 -19
  299. package/esm2022/sdk-redirect/iam-expired-interceptor.service.mjs +0 -62
  300. package/esm2022/sdk-redirect/redirect.component.mjs +0 -55
  301. package/esm2022/sdk-redirect/sdk-redirect.module.mjs +0 -19
  302. package/esm2022/sdk-session-info/session-info-data.mjs +0 -6
  303. package/esm2022/sdk-session-info/session-info-with-application.service.mjs +0 -68
  304. package/esm2022/sdk-session-info/session-info.service.mjs +0 -50
  305. package/esm2022/sdk-statistics/sdk-statistics.service.mjs +0 -74
  306. package/esm2022/sdk-support-alert/support-alert-container.component.mjs +0 -49
  307. package/esm2022/sdk-support-alert/support-alert.component.mjs +0 -32
  308. package/esm2022/sdk-support-alert/support-alert.model.mjs +0 -7
  309. package/esm2022/sdk-support-alert/support-alert.module.mjs +0 -21
  310. package/esm2022/sdk-support-alert/support-alert.service.mjs +0 -139
  311. package/esm2022/service-locator.mjs +0 -4
  312. package/esm2022/supported-browser.mjs +0 -2
  313. package/esm2022/validation/validation-handler.service.mjs +0 -44
  314. /package/{public_api.d.ts → public-api.d.ts} +0 -0
@@ -1,498 +0,0 @@
1
- import { Component, forwardRef, Input, ViewChild } from '@angular/core';
2
- import { BehaviorSubject, combineLatest, of } from 'rxjs';
3
- import { catchError, debounceTime, distinctUntilChanged, map, shareReplay, switchMap, tap } from 'rxjs/operators';
4
- import { FoehnInputComponent } from '../foehn-input/foehn-input.component';
5
- import { ObjectHelper } from '../helpers/object.helper';
6
- import { FoehnInputForeignLocalityComponent } from './foehn-input-foreign-locality.component';
7
- import { FoehnInputForeignStreetComponent } from './foehn-input-foreign-street.component';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/common/http";
10
- import * as i2 from "../sdk-dictionary/sdk-dictionary.service";
11
- import * as i3 from "@angular/common";
12
- import * as i4 from "../foehn-autocomplete/foehn-autocomplete.component";
13
- import * as i5 from "../foehn-input/foehn-input-text.component";
14
- import * as i6 from "../foehn-validation-alerts/foehn-validation-alerts.component";
15
- import * as i7 from "./foehn-input-foreign-locality.component";
16
- import * as i8 from "./foehn-input-foreign-street.component";
17
- import * as i9 from "../sdk-dictionary/sdk-dictionary.pipe";
18
- // eslint-disable max-classes-per-file
19
- export const SWISS_ISO_ID = 'CH';
20
- export class StreetNumber {
21
- }
22
- const isDefined = (value) => value === true || value === false;
23
- const hasInputChanged = (change) => change && !ObjectHelper.isEqual(change.previousValue, change.currentValue);
24
- export class FoehnInputAddressComponent extends FoehnInputComponent {
25
- constructor(httpClient, dictionaryService) {
26
- super();
27
- this.httpClient = httpClient;
28
- this.dictionaryService = dictionaryService;
29
- this.countriesUrl = 'api/refinf/countries';
30
- this.isOnlySwiss = true;
31
- this.showPostOfficeBoxText = false;
32
- this.showAdressLines = true;
33
- this.showAdressLine1 = true;
34
- this.showAdressLine2 = true;
35
- this.countryRequired = true;
36
- this.swissNpaLocalityRequired = true;
37
- this.streetNumberRequired = false;
38
- this.hideNotRequiredExtraLabelStreetNumber = true;
39
- this.foreignZipCodeRequired = true;
40
- this.foreignLocalityRequired = true;
41
- this.foreignStreetNumberRequired = false;
42
- this.addressLine1Required = false;
43
- this.addressLine2Required = false;
44
- this.withCompanyLocalities = false;
45
- this.withDefaultCountry = true;
46
- this.streetCustomErrors = {};
47
- this.iso2IdSubject = new BehaviorSubject(null);
48
- this.zipCodeIdSubject = new BehaviorSubject(null);
49
- this.estrIdSubject = new BehaviorSubject(null);
50
- this.countryModelChangeSubject = new BehaviorSubject(null);
51
- this.isOnlySwissChangeSubject = new BehaviorSubject(true);
52
- this.identity = (n) => n;
53
- this.countryIdentity = (country) => country.iso2Id;
54
- this.localityIdentity = (loc) => loc.zipCodeId;
55
- this.streetIdentity = (street) => street.estrid;
56
- this.streetGenerator = (longName) => ({
57
- estrid: null,
58
- longName
59
- });
60
- }
61
- ngOnInit() {
62
- super.ngOnInit();
63
- this.manageDefaultCountrySubscription = this.manageDefaultCountry();
64
- this.replaceAtLeastOneNotNull(this.dictionaryService.getKeySync('errors.NotNull'));
65
- this.languageChangeSubscription = this.dictionaryService
66
- .getCurrentLanguageCode()
67
- .pipe(switchMap(() => this.dictionaryService.getKey('errors.NotNull')))
68
- // eslint-disable-next-line rxjs-angular/prefer-async-pipe
69
- .subscribe(notNullErrorLabel => this.replaceAtLeastOneNotNull(notNullErrorLabel));
70
- this.countries = this.getCountries();
71
- this.localities = this.iso2IdSubject.pipe(distinctUntilChanged(),
72
- // The list of localities, or an empty array as the default value.
73
- switchMap(iso2Id => this.getLocalities(iso2Id)), shareReplay(1));
74
- this.streets = combineLatest([
75
- this.zipCodeIdSubject,
76
- this.localities
77
- ]).pipe(
78
- // The zipCodeId when locality changes or match locality (postalLocalityHistoryId) from model
79
- map(([zipCodeId, localities]) => zipCodeId ||
80
- this.extractLocalityZipCodeId(localities, this.locality)), distinctUntilChanged(),
81
- // The list of streets or a default value to an empty array
82
- switchMap(zipCodeId => this.getStreetsFor(zipCodeId)), shareReplay(1));
83
- this.streetNumbers = combineLatest([
84
- this.estrIdSubject,
85
- this.streets
86
- ]).pipe(
87
- // The estrid when street changes or match street (longName) from model
88
- map(([estrid, streets]) => estrid || this.extractStreetEstrid(streets, this.street)), distinctUntilChanged(),
89
- // The list of streets or a default value to an empty array
90
- switchMap(estrid => this.getStreetNumberFor(estrid)),
91
- // Some street might not have an name, RefInf sometimes returns weird data.
92
- map(values => values.filter(streetNumber => !!streetNumber.name)), map(values => {
93
- const collator = new Intl.Collator(undefined, {
94
- numeric: true,
95
- sensitivity: 'base'
96
- });
97
- return values.sort((a, b) => collator.compare(a.name, b.name));
98
- }), shareReplay(1));
99
- }
100
- ngOnDestroy() {
101
- super.ngOnDestroy();
102
- this.manageDefaultCountrySubscription?.unsubscribe();
103
- this.languageChangeSubscription?.unsubscribe();
104
- }
105
- ngOnChanges(changes) {
106
- const modelChange = changes.model;
107
- const isOnlySwiss = changes.isOnlySwiss;
108
- if (hasInputChanged(modelChange)) {
109
- this.countryModelChangeSubject.next(modelChange.currentValue?.country);
110
- }
111
- if (hasInputChanged(isOnlySwiss)) {
112
- this.isOnlySwissChangeSubject.next(isOnlySwiss.currentValue);
113
- }
114
- }
115
- updateAddress() {
116
- const validValue = this.getValidValue();
117
- if (typeof validValue !== 'undefined') {
118
- this.updateNgModel(validValue);
119
- }
120
- }
121
- updateNgModel(value) {
122
- if (!!value) {
123
- // avoid wrongfull prefill by session info
124
- if (!this.showAdressLines || !this.showAdressLine1) {
125
- value.addressLine1 = null;
126
- }
127
- if (!this.showAdressLines || !this.showAdressLine2) {
128
- value.addressLine2 = null;
129
- }
130
- if (!this.showPostOfficeBoxText) {
131
- value.postOfficeBoxText = null;
132
- }
133
- // never updatable in the component
134
- value.postOfficeBoxNumber = null;
135
- }
136
- super.updateNgModel(value);
137
- }
138
- handleUserInput() {
139
- const validValue = this.getValidValue();
140
- if (typeof validValue !== 'undefined') {
141
- this.handleChange(validValue);
142
- }
143
- }
144
- onModelChange(value) {
145
- if (value) {
146
- this.country = value.country;
147
- this.locality = value.locality;
148
- this.street = value.street;
149
- this.houseNumber = value.houseNumber;
150
- this.postOfficeBoxText = value.postOfficeBoxText;
151
- this.addressLine1 = value.addressLine1;
152
- this.addressLine2 = value.addressLine2;
153
- }
154
- else if (!value) {
155
- // country is managed by `manageDefaultCountry()`
156
- this.locality = null;
157
- this.street = null;
158
- this.houseNumber = null;
159
- this.postOfficeBoxText = null;
160
- this.addressLine1 = null;
161
- this.addressLine2 = null;
162
- }
163
- }
164
- isSwiss() {
165
- return !!(this.isOnlySwiss ||
166
- (this.country && this.country.iso2Id === SWISS_ISO_ID));
167
- }
168
- userInputCountry() {
169
- this.zipCodeIdSubject.next(null);
170
- this.estrIdSubject.next(null);
171
- this.locality = null;
172
- this.street = null;
173
- this.houseNumber = null;
174
- this.postOfficeBoxText = null;
175
- this.addressLine1 = null;
176
- this.addressLine2 = null;
177
- this.updateAddress();
178
- this.handleUserInput();
179
- }
180
- userInputLocality(locality) {
181
- if (!locality) {
182
- this.zipCodeIdSubject.next(null);
183
- }
184
- // Always reset suggestion list of houseNumber when locality changes
185
- this.estrIdSubject.next(null);
186
- this.street = null;
187
- this.houseNumber = null;
188
- this.updateAddress();
189
- this.handleUserInput();
190
- }
191
- userInputStreet(street) {
192
- if (!street) {
193
- this.estrIdSubject.next(null);
194
- }
195
- this.houseNumber = null;
196
- this.handleUserInput();
197
- }
198
- countryUpdated(country) {
199
- // No double-binding on country in view to ensure we update properly model
200
- this.country = country;
201
- this.updateAddress();
202
- if (!country) {
203
- return;
204
- }
205
- const { iso2Id } = country;
206
- this.iso2IdSubject.next(iso2Id);
207
- }
208
- getLocalityDisplayedName(locality) {
209
- if (!locality) {
210
- return;
211
- }
212
- return `${locality.zipCode} ${locality.longName}`;
213
- }
214
- localityUpdated(locality) {
215
- // No double-binding on locality in view to ensure we update properly model
216
- this.locality = locality;
217
- this.updateAddress();
218
- if (!locality) {
219
- return;
220
- }
221
- const { zipCodeId } = locality;
222
- this.zipCodeIdSubject.next(zipCodeId);
223
- }
224
- streetUpdated(street) {
225
- // No double-binding on street in view to ensure we update properly model
226
- this.street = street;
227
- this.updateAddress();
228
- if (!street) {
229
- return;
230
- }
231
- const { estrid } = street;
232
- this.estrIdSubject.next(estrid);
233
- }
234
- isStreetRequired() {
235
- if (isDefined(this.streetRequired)) {
236
- // respect overriden value
237
- return this.streetRequired;
238
- }
239
- if (!this.showPostOfficeBoxText) {
240
- return true;
241
- }
242
- return !this.postOfficeBoxText || !!this.street;
243
- }
244
- isForeignStreetRequired() {
245
- if (isDefined(this.foreignStreetRequired)) {
246
- // respect overriden value
247
- return this.foreignStreetRequired;
248
- }
249
- if (!this.showPostOfficeBoxText) {
250
- return true;
251
- }
252
- return !this.postOfficeBoxText || !!this.street;
253
- }
254
- isPostOfficeBoxTextRequired() {
255
- if (isDefined(this.postOfficeBoxTextRequired)) {
256
- // respect overriden value
257
- return this.postOfficeBoxTextRequired;
258
- }
259
- return !this.street || !!this.postOfficeBoxText;
260
- }
261
- replaceAtLeastOneNotNull(notNullErrorLabel) {
262
- if (!this.showPostOfficeBoxText) {
263
- this.streetCustomErrors.AtLeastOneNotNull = notNullErrorLabel;
264
- }
265
- }
266
- getCountries() {
267
- return this.httpClient.get(this.countriesUrl).pipe(catchError(() => of([])) // emit even when an error occurs
268
- );
269
- }
270
- getLocalities(iso2Id) {
271
- if (iso2Id !== SWISS_ISO_ID) {
272
- return of([]);
273
- }
274
- const queryParams = !!this.withCompanyLocalities
275
- ? '?withCompanyLocalities=true'
276
- : '';
277
- if (!!this.specifiedCanton) {
278
- return this.httpClient
279
- .get(`api/refinf/locality/${this.specifiedCanton}${queryParams}`)
280
- .pipe(catchError(() => of([])) // emit even when an error occurs
281
- );
282
- }
283
- else {
284
- return this.httpClient
285
- .get(`api/refinf/locality/all${queryParams}`)
286
- .pipe(catchError(() => of([])) // emit even when an error occurs
287
- );
288
- }
289
- }
290
- getStreetNumberFor(estrid) {
291
- if (!estrid) {
292
- return of([]);
293
- }
294
- const url = `api/refinf/addresses/${estrid}`;
295
- return this.httpClient.get(url).pipe(catchError(() => of([])) // emit even when an error occurs
296
- );
297
- }
298
- getStreetsFor(zipCodeId) {
299
- if (!zipCodeId) {
300
- return of([]);
301
- }
302
- const url = `api/refinf/streets/${zipCodeId}`;
303
- return this.httpClient.get(url).pipe(catchError(() => of([])) // emit even when an error occurs
304
- );
305
- }
306
- clearAutocompletesWhenCountryIsUnappropriatedToComponentConfiguration() {
307
- if (this.isModelEmpty()) {
308
- return;
309
- }
310
- if (this.isOnlySwiss && this.country?.iso2Id !== SWISS_ISO_ID) {
311
- // Do not remove this warning. Needed for debugging at all time.
312
- console.warn(
313
- // eslint-disable-next-line max-len
314
- `Country address was '${this.country.iso2Id}'. Only swiss is asked in component 'foehn-input-address' configuration. Address model resetted.`);
315
- this.clearAutocompletes();
316
- }
317
- }
318
- getSwissCountry() {
319
- return {
320
- iso2Id: SWISS_ISO_ID,
321
- shortNameFr: 'Suisse'
322
- };
323
- }
324
- setDefaultCountry() {
325
- if (this.withDefaultCountry &&
326
- (this.isOnlySwiss || !this.country || !this.country.iso2Id)) {
327
- this.country = this.getSwissCountry();
328
- this.iso2IdSubject.next(SWISS_ISO_ID);
329
- this.updateAddress();
330
- }
331
- }
332
- clearAutocompletes() {
333
- this.country = null;
334
- this.street = null;
335
- this.locality = null;
336
- this.houseNumber = null;
337
- // No updateAddress() here because done in setDefaultCountry()
338
- }
339
- extractLocalityZipCodeId(localities, localityToMatch) {
340
- if (localityToMatch && localityToMatch.postalLocalityHistoryId) {
341
- const matched = localities.find((locality) => locality.postalLocalityHistoryId ===
342
- localityToMatch.postalLocalityHistoryId);
343
- if (matched) {
344
- return matched.zipCodeId;
345
- }
346
- }
347
- return null;
348
- }
349
- extractStreetEstrid(streets, streetToMatch) {
350
- if (streetToMatch && streetToMatch.longName) {
351
- const matched = streets.find((street) => street.longName === streetToMatch.longName);
352
- if (matched) {
353
- return matched.estrid;
354
- }
355
- }
356
- return null;
357
- }
358
- getValidCountry() {
359
- // Be sure to always send Swiss country when 'isOnlySwiss' is set to true
360
- return this.isOnlySwiss ? this.getSwissCountry() : this.country;
361
- }
362
- getValidValue() {
363
- if (this.isModelEmpty()) {
364
- if (this.model_ !== undefined) {
365
- return null;
366
- }
367
- return undefined;
368
- }
369
- return {
370
- country: this.getValidCountry(),
371
- locality: this.locality,
372
- street: this.street,
373
- houseNumber: this.houseNumber,
374
- postOfficeBoxText: this.postOfficeBoxText,
375
- addressLine1: this.addressLine1,
376
- addressLine2: this.addressLine2
377
- };
378
- }
379
- isModelEmpty() {
380
- return ((this.isOnlySwiss ||
381
- !this.country ||
382
- ObjectHelper.isEmpty(this.country)) &&
383
- (!this.locality || ObjectHelper.isEmpty(this.locality)) &&
384
- (!this.street || ObjectHelper.isEmpty(this.street)) &&
385
- this.isEmpty(this.houseNumber) &&
386
- this.isEmpty(this.postOfficeBoxText) &&
387
- this.isEmpty(this.addressLine1) &&
388
- this.isEmpty(this.addressLine2));
389
- }
390
- manageDefaultCountry() {
391
- return (combineLatest([
392
- this.countryModelChangeSubject.asObservable().pipe(debounceTime(0), distinctUntilChanged((previous, current) => previous?.iso2Id === current?.iso2Id)),
393
- this.isOnlySwissChangeSubject
394
- .asObservable()
395
- .pipe(debounceTime(0), distinctUntilChanged())
396
- ])
397
- .pipe(tap(([country, isOnlySwiss]) => {
398
- if (!isOnlySwiss &&
399
- !country &&
400
- !this.isCountryInputDirty()) {
401
- this.setDefaultCountry();
402
- return;
403
- }
404
- if (isOnlySwiss) {
405
- // When there is a country, we need to check if it has to be cleaned and set to default
406
- if (!!country && !ObjectHelper.isEmpty(country)) {
407
- this.clearAutocompletesWhenCountryIsUnappropriatedToComponentConfiguration();
408
- }
409
- this.setDefaultCountry();
410
- return;
411
- }
412
- }))
413
- // eslint-disable-next-line rxjs-angular/prefer-async-pipe
414
- .subscribe());
415
- }
416
- isCountryInputDirty() {
417
- if (!this.countryAutocomplete?.inputModelList) {
418
- return false;
419
- }
420
- return this.countryAutocomplete.inputModelList
421
- .filter(ngModel => ngModel.name === this.countryAutocomplete.name)
422
- .map(ngModel => ngModel.control.dirty)
423
- .every(value => value === true);
424
- }
425
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FoehnInputAddressComponent, deps: [{ token: i1.HttpClient }, { token: i2.SdkDictionaryService }], target: i0.ɵɵFactoryTarget.Component }); }
426
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FoehnInputAddressComponent, selector: "foehn-input-address", inputs: { countriesUrl: "countriesUrl", isOnlySwiss: "isOnlySwiss", showPostOfficeBoxText: "showPostOfficeBoxText", showAdressLines: "showAdressLines", showAdressLine1: "showAdressLine1", showAdressLine2: "showAdressLine2", specifiedCanton: "specifiedCanton", countryRequired: "countryRequired", swissNpaLocalityRequired: "swissNpaLocalityRequired", streetRequired: "streetRequired", streetNumberRequired: "streetNumberRequired", hideNotRequiredExtraLabelStreetNumber: "hideNotRequiredExtraLabelStreetNumber", foreignZipCodeRequired: "foreignZipCodeRequired", foreignLocalityRequired: "foreignLocalityRequired", foreignStreetRequired: "foreignStreetRequired", foreignStreetNumberRequired: "foreignStreetNumberRequired", postOfficeBoxTextRequired: "postOfficeBoxTextRequired", addressLine1Required: "addressLine1Required", addressLine2Required: "addressLine2Required", withCompanyLocalities: "withCompanyLocalities", withDefaultCountry: "withDefaultCountry" }, providers: [
427
- {
428
- provide: FoehnInputComponent,
429
- useExisting: forwardRef(() => FoehnInputAddressComponent),
430
- multi: true
431
- }
432
- ], viewQueries: [{ propertyName: "foreignLocalityComponent", first: true, predicate: FoehnInputForeignLocalityComponent, descendants: true }, { propertyName: "foreignStreetComponent", first: true, predicate: FoehnInputForeignStreetComponent, descendants: true }, { propertyName: "foreignHouseNumber", first: true, predicate: ["foreignHouseNumber"], descendants: true }, { propertyName: "countryAutocomplete", first: true, predicate: ["countryAutocomplete"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n [attr.id]=\"buildId() + 'Container'\"\n class=\"form-group\"\n [class.has-danger]=\"hasErrorsToDisplay()\"\n [class.vd-form-group-danger]=\"hasErrorsToDisplay()\"\n [tabIndex]=\"-1\"\n>\n <fieldset\n class=\"mb-3\"\n [attr.aria-describedby]=\"getDescribedBy()\"\n [attr.aria-invalid]=\"hasErrorsToDisplay() || null\"\n >\n <legend\n *ngIf=\"!!label\"\n [ngClass]=\"isLabelSrOnly ? 'visually-hidden' : 'vd-p'\"\n >\n <span [innerHTML]=\"label\"></span>\n <span\n *ngIf=\"!required && !hideNotRequiredExtraLabel\"\n aria-hidden=\"true\"\n >\n {{ 'foehn-input.optional' | fromDictionary }}\n </span>\n </legend>\n\n <foehn-validation-alerts [component]=\"this\"></foehn-validation-alerts>\n\n <small\n *ngIf=\"helpText\"\n [attr.id]=\"buildId() + 'Help'\"\n class=\"text-secondary\"\n [innerHTML]=\"helpText\"\n ></small>\n\n <ng-content></ng-content>\n\n <foehn-autocomplete\n *ngIf=\"!isOnlySwiss\"\n [label]=\"'foehn-input-address.country.label' | fromDictionary\"\n [elements]=\"countries | async\"\n elementLabel=\"shortNameFr\"\n [elementValue]=\"identity\"\n [elementValueIdentity]=\"countryIdentity\"\n (modelChange)=\"countryUpdated($event)\"\n (userInput)=\"userInputCountry()\"\n [model]=\"country\"\n [name]=\"name + '.country'\"\n [required]=\"countryRequired\"\n [disabled]=\"disabled\"\n #countryAutocomplete\n ></foehn-autocomplete>\n\n <ng-container *ngIf=\"isSwiss()\">\n <foehn-autocomplete\n [label]=\"'foehn-input-address.locality.label' | fromDictionary\"\n [elements]=\"localities | async\"\n [elementLabel]=\"getLocalityDisplayedName\"\n [elementValue]=\"identity\"\n [elementValueIdentity]=\"localityIdentity\"\n (modelChange)=\"localityUpdated($event)\"\n (userInput)=\"userInputLocality($event)\"\n [model]=\"locality\"\n [name]=\"name + '.locality'\"\n [allowCustomValue]=\"disabled\"\n [required]=\"swissNpaLocalityRequired\"\n [disabled]=\"disabled\"\n ></foehn-autocomplete>\n\n <foehn-autocomplete\n [label]=\"'foehn-input-address.street.label' | fromDictionary\"\n [elements]=\"streets | async\"\n elementLabel=\"longName\"\n [elementValue]=\"identity\"\n [elementValueIdentity]=\"streetIdentity\"\n (modelChange)=\"streetUpdated($event)\"\n [model]=\"street\"\n [name]=\"name + '.street'\"\n [allowCustomValue]=\"true\"\n [customValueModelGenerator]=\"streetGenerator\"\n [required]=\"isStreetRequired()\"\n [helpText]=\"\n 'foehn-input-address.street.help-text' | fromDictionary\n \"\n [customErrors]=\"streetCustomErrors\"\n (userInput)=\"userInputStreet($event)\"\n [disabled]=\"disabled\"\n ></foehn-autocomplete>\n\n <foehn-autocomplete\n [label]=\"\n 'foehn-input-address.houseNumber.label' | fromDictionary\n \"\n [elements]=\"streetNumbers | async\"\n elementLabel=\"name\"\n elementValue=\"name\"\n [(model)]=\"houseNumber\"\n [name]=\"name + '.houseNumber'\"\n [allowCustomValue]=\"true\"\n [helpText]=\"\n 'foehn-input-address.houseNumber.help-text' | fromDictionary\n \"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"streetNumberRequired\"\n [hideNotRequiredExtraLabel]=\"\n hideNotRequiredExtraLabelStreetNumber\n \"\n [disabled]=\"disabled\"\n ></foehn-autocomplete>\n </ng-container>\n\n <ng-container *ngIf=\"!isSwiss()\">\n <!--\n Component <foehn-input-foreign-locality> is special because we use the same model when swiss or foreigner.\n To do so, we need:\n - Errors will be bind on 'locality' when NULL or on 'zipCode' and 'longName' model inside component when EMPTY\n - Hide label from component because we need label from children to be displayed (isLabelSrOnly: true)\n - required and disabled params are transmitted to children\n -->\n <foehn-input-foreign-locality\n [label]=\"'foehn-input-address.locality.label' | fromDictionary\"\n [name]=\"name + '.locality'\"\n [(model)]=\"locality\"\n [zipCodeRequired]=\"foreignZipCodeRequired\"\n [localityRequired]=\"foreignLocalityRequired\"\n [isLabelSrOnly]=\"true\"\n [disabled]=\"!country || disabled\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n ></foehn-input-foreign-locality>\n <!--\n Component <foehn-input-foreign-street> is special because we use the same model when swiss or foreigner.\n To do so, we need:\n - Errors will be bind on 'street' when NULL or on 'longName' model inside component when EMPTY\n - required, helpText, isLabelSrOnly and disabled params are transmitted to children\n -->\n <foehn-input-foreign-street\n [label]=\"'foehn-input-address.street.label' | fromDictionary\"\n [name]=\"name + '.street'\"\n [(model)]=\"street\"\n [required]=\"isForeignStreetRequired()\"\n [helpText]=\"\n 'foehn-input-address.street.help-text' | fromDictionary\n \"\n [customErrors]=\"streetCustomErrors\"\n [disabled]=\"!country || disabled\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n ></foehn-input-foreign-street>\n\n <foehn-input-text\n #foreignHouseNumber\n [label]=\"\n 'foehn-input-address.houseNumber.label' | fromDictionary\n \"\n [name]=\"name + '.houseNumber'\"\n [(model)]=\"houseNumber\"\n [helpText]=\"\n 'foehn-input-address.houseNumber.help-text' | fromDictionary\n \"\n [disabled]=\"!country || disabled\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"foreignStreetNumberRequired\"\n ></foehn-input-text>\n </ng-container>\n\n <foehn-input-text\n *ngIf=\"showPostOfficeBoxText\"\n [(model)]=\"postOfficeBoxText\"\n [helpText]=\"\n 'foehn-input-address.postOfficeBoxText.help-text'\n | fromDictionary\n \"\n [label]=\"\n 'foehn-input-address.postOfficeBoxText.label' | fromDictionary\n \"\n [name]=\"name + '.postOfficeBoxText'\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"isPostOfficeBoxTextRequired()\"\n [disabled]=\"disabled\"\n ></foehn-input-text>\n\n <foehn-input-text\n *ngIf=\"showAdressLines && showAdressLine1\"\n [(model)]=\"addressLine1\"\n [label]=\"'foehn-input-address.addressLine1.label' | fromDictionary\"\n [name]=\"name + '.addressLine1'\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"addressLine1Required\"\n [autocomplete]=\"'address-line2'\"\n [disabled]=\"disabled\"\n ></foehn-input-text>\n\n <foehn-input-text\n *ngIf=\"showAdressLines && showAdressLine2\"\n [(model)]=\"addressLine2\"\n [label]=\"'foehn-input-address.addressLine2.label' | fromDictionary\"\n [name]=\"name + '.addressLine2'\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"addressLine2Required\"\n [autocomplete]=\"'address-line3'\"\n [disabled]=\"disabled\"\n ></foehn-input-text>\n </fieldset>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.FoehnAutocompleteComponent, selector: "foehn-autocomplete", inputs: ["searchValueMinCharsCount", "allowCustomValue", "isSuggestionListDynamic", "customValueModelGenerator", "itemHeightInSuggestionListInPx", "elementSuggestionLabel", "caseSensitiveSearch", "disabled"], outputs: ["userSearchInput"] }, { kind: "component", type: i5.FoehnInputTextComponent, selector: "foehn-input-text", inputs: ["numberOnly"] }, { kind: "component", type: i6.FoehnValidationAlertsComponent, selector: "foehn-validation-alerts", inputs: ["component", "shouldErrorsBeLive"] }, { kind: "component", type: i7.FoehnInputForeignLocalityComponent, selector: "foehn-input-foreign-locality", inputs: ["localityRequired", "zipCodeRequired"] }, { kind: "component", type: i8.FoehnInputForeignStreetComponent, selector: "foehn-input-foreign-street" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.SdkDictionaryPipe, name: "fromDictionary" }] }); }
433
- }
434
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FoehnInputAddressComponent, decorators: [{
435
- type: Component,
436
- args: [{ selector: 'foehn-input-address', providers: [
437
- {
438
- provide: FoehnInputComponent,
439
- useExisting: forwardRef(() => FoehnInputAddressComponent),
440
- multi: true
441
- }
442
- ], template: "<div\n [attr.id]=\"buildId() + 'Container'\"\n class=\"form-group\"\n [class.has-danger]=\"hasErrorsToDisplay()\"\n [class.vd-form-group-danger]=\"hasErrorsToDisplay()\"\n [tabIndex]=\"-1\"\n>\n <fieldset\n class=\"mb-3\"\n [attr.aria-describedby]=\"getDescribedBy()\"\n [attr.aria-invalid]=\"hasErrorsToDisplay() || null\"\n >\n <legend\n *ngIf=\"!!label\"\n [ngClass]=\"isLabelSrOnly ? 'visually-hidden' : 'vd-p'\"\n >\n <span [innerHTML]=\"label\"></span>\n <span\n *ngIf=\"!required && !hideNotRequiredExtraLabel\"\n aria-hidden=\"true\"\n >\n {{ 'foehn-input.optional' | fromDictionary }}\n </span>\n </legend>\n\n <foehn-validation-alerts [component]=\"this\"></foehn-validation-alerts>\n\n <small\n *ngIf=\"helpText\"\n [attr.id]=\"buildId() + 'Help'\"\n class=\"text-secondary\"\n [innerHTML]=\"helpText\"\n ></small>\n\n <ng-content></ng-content>\n\n <foehn-autocomplete\n *ngIf=\"!isOnlySwiss\"\n [label]=\"'foehn-input-address.country.label' | fromDictionary\"\n [elements]=\"countries | async\"\n elementLabel=\"shortNameFr\"\n [elementValue]=\"identity\"\n [elementValueIdentity]=\"countryIdentity\"\n (modelChange)=\"countryUpdated($event)\"\n (userInput)=\"userInputCountry()\"\n [model]=\"country\"\n [name]=\"name + '.country'\"\n [required]=\"countryRequired\"\n [disabled]=\"disabled\"\n #countryAutocomplete\n ></foehn-autocomplete>\n\n <ng-container *ngIf=\"isSwiss()\">\n <foehn-autocomplete\n [label]=\"'foehn-input-address.locality.label' | fromDictionary\"\n [elements]=\"localities | async\"\n [elementLabel]=\"getLocalityDisplayedName\"\n [elementValue]=\"identity\"\n [elementValueIdentity]=\"localityIdentity\"\n (modelChange)=\"localityUpdated($event)\"\n (userInput)=\"userInputLocality($event)\"\n [model]=\"locality\"\n [name]=\"name + '.locality'\"\n [allowCustomValue]=\"disabled\"\n [required]=\"swissNpaLocalityRequired\"\n [disabled]=\"disabled\"\n ></foehn-autocomplete>\n\n <foehn-autocomplete\n [label]=\"'foehn-input-address.street.label' | fromDictionary\"\n [elements]=\"streets | async\"\n elementLabel=\"longName\"\n [elementValue]=\"identity\"\n [elementValueIdentity]=\"streetIdentity\"\n (modelChange)=\"streetUpdated($event)\"\n [model]=\"street\"\n [name]=\"name + '.street'\"\n [allowCustomValue]=\"true\"\n [customValueModelGenerator]=\"streetGenerator\"\n [required]=\"isStreetRequired()\"\n [helpText]=\"\n 'foehn-input-address.street.help-text' | fromDictionary\n \"\n [customErrors]=\"streetCustomErrors\"\n (userInput)=\"userInputStreet($event)\"\n [disabled]=\"disabled\"\n ></foehn-autocomplete>\n\n <foehn-autocomplete\n [label]=\"\n 'foehn-input-address.houseNumber.label' | fromDictionary\n \"\n [elements]=\"streetNumbers | async\"\n elementLabel=\"name\"\n elementValue=\"name\"\n [(model)]=\"houseNumber\"\n [name]=\"name + '.houseNumber'\"\n [allowCustomValue]=\"true\"\n [helpText]=\"\n 'foehn-input-address.houseNumber.help-text' | fromDictionary\n \"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"streetNumberRequired\"\n [hideNotRequiredExtraLabel]=\"\n hideNotRequiredExtraLabelStreetNumber\n \"\n [disabled]=\"disabled\"\n ></foehn-autocomplete>\n </ng-container>\n\n <ng-container *ngIf=\"!isSwiss()\">\n <!--\n Component <foehn-input-foreign-locality> is special because we use the same model when swiss or foreigner.\n To do so, we need:\n - Errors will be bind on 'locality' when NULL or on 'zipCode' and 'longName' model inside component when EMPTY\n - Hide label from component because we need label from children to be displayed (isLabelSrOnly: true)\n - required and disabled params are transmitted to children\n -->\n <foehn-input-foreign-locality\n [label]=\"'foehn-input-address.locality.label' | fromDictionary\"\n [name]=\"name + '.locality'\"\n [(model)]=\"locality\"\n [zipCodeRequired]=\"foreignZipCodeRequired\"\n [localityRequired]=\"foreignLocalityRequired\"\n [isLabelSrOnly]=\"true\"\n [disabled]=\"!country || disabled\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n ></foehn-input-foreign-locality>\n <!--\n Component <foehn-input-foreign-street> is special because we use the same model when swiss or foreigner.\n To do so, we need:\n - Errors will be bind on 'street' when NULL or on 'longName' model inside component when EMPTY\n - required, helpText, isLabelSrOnly and disabled params are transmitted to children\n -->\n <foehn-input-foreign-street\n [label]=\"'foehn-input-address.street.label' | fromDictionary\"\n [name]=\"name + '.street'\"\n [(model)]=\"street\"\n [required]=\"isForeignStreetRequired()\"\n [helpText]=\"\n 'foehn-input-address.street.help-text' | fromDictionary\n \"\n [customErrors]=\"streetCustomErrors\"\n [disabled]=\"!country || disabled\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n ></foehn-input-foreign-street>\n\n <foehn-input-text\n #foreignHouseNumber\n [label]=\"\n 'foehn-input-address.houseNumber.label' | fromDictionary\n \"\n [name]=\"name + '.houseNumber'\"\n [(model)]=\"houseNumber\"\n [helpText]=\"\n 'foehn-input-address.houseNumber.help-text' | fromDictionary\n \"\n [disabled]=\"!country || disabled\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"foreignStreetNumberRequired\"\n ></foehn-input-text>\n </ng-container>\n\n <foehn-input-text\n *ngIf=\"showPostOfficeBoxText\"\n [(model)]=\"postOfficeBoxText\"\n [helpText]=\"\n 'foehn-input-address.postOfficeBoxText.help-text'\n | fromDictionary\n \"\n [label]=\"\n 'foehn-input-address.postOfficeBoxText.label' | fromDictionary\n \"\n [name]=\"name + '.postOfficeBoxText'\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"isPostOfficeBoxTextRequired()\"\n [disabled]=\"disabled\"\n ></foehn-input-text>\n\n <foehn-input-text\n *ngIf=\"showAdressLines && showAdressLine1\"\n [(model)]=\"addressLine1\"\n [label]=\"'foehn-input-address.addressLine1.label' | fromDictionary\"\n [name]=\"name + '.addressLine1'\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"addressLine1Required\"\n [autocomplete]=\"'address-line2'\"\n [disabled]=\"disabled\"\n ></foehn-input-text>\n\n <foehn-input-text\n *ngIf=\"showAdressLines && showAdressLine2\"\n [(model)]=\"addressLine2\"\n [label]=\"'foehn-input-address.addressLine2.label' | fromDictionary\"\n [name]=\"name + '.addressLine2'\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"addressLine2Required\"\n [autocomplete]=\"'address-line3'\"\n [disabled]=\"disabled\"\n ></foehn-input-text>\n </fieldset>\n</div>\n" }]
443
- }], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.SdkDictionaryService }], propDecorators: { foreignLocalityComponent: [{
444
- type: ViewChild,
445
- args: [FoehnInputForeignLocalityComponent, { static: false }]
446
- }], foreignStreetComponent: [{
447
- type: ViewChild,
448
- args: [FoehnInputForeignStreetComponent, { static: false }]
449
- }], foreignHouseNumber: [{
450
- type: ViewChild,
451
- args: ['foreignHouseNumber', { static: false }]
452
- }], countryAutocomplete: [{
453
- type: ViewChild,
454
- args: ['countryAutocomplete', { static: false }]
455
- }], countriesUrl: [{
456
- type: Input
457
- }], isOnlySwiss: [{
458
- type: Input
459
- }], showPostOfficeBoxText: [{
460
- type: Input
461
- }], showAdressLines: [{
462
- type: Input
463
- }], showAdressLine1: [{
464
- type: Input
465
- }], showAdressLine2: [{
466
- type: Input
467
- }], specifiedCanton: [{
468
- type: Input
469
- }], countryRequired: [{
470
- type: Input
471
- }], swissNpaLocalityRequired: [{
472
- type: Input
473
- }], streetRequired: [{
474
- type: Input
475
- }], streetNumberRequired: [{
476
- type: Input
477
- }], hideNotRequiredExtraLabelStreetNumber: [{
478
- type: Input
479
- }], foreignZipCodeRequired: [{
480
- type: Input
481
- }], foreignLocalityRequired: [{
482
- type: Input
483
- }], foreignStreetRequired: [{
484
- type: Input
485
- }], foreignStreetNumberRequired: [{
486
- type: Input
487
- }], postOfficeBoxTextRequired: [{
488
- type: Input
489
- }], addressLine1Required: [{
490
- type: Input
491
- }], addressLine2Required: [{
492
- type: Input
493
- }], withCompanyLocalities: [{
494
- type: Input
495
- }], withDefaultCountry: [{
496
- type: Input
497
- }] } });
498
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9laG4taW5wdXQtYWRkcmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmVzdGF0aW9ucy1uZy9zcmMvZm9laG4tYWRkcmVzcy9mb2Vobi1pbnB1dC1hZGRyZXNzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1hZGRyZXNzL2ZvZWhuLWlucHV0LWFkZHJlc3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQU1MLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsZUFBZSxFQUNmLGFBQWEsRUFFYixFQUFFLEVBRUwsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0gsVUFBVSxFQUNWLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsR0FBRyxFQUNILFdBQVcsRUFDWCxTQUFTLEVBQ1QsR0FBRyxFQUNOLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3hELE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzlGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7Ozs7Ozs7OztBQUUxRixzQ0FBc0M7QUFDdEMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUVqQyxNQUFNLE9BQU8sWUFBWTtDQUV4QjtBQUVELE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBYyxFQUFXLEVBQUUsQ0FDMUMsS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDO0FBRXRDLE1BQU0sZUFBZSxHQUFHLENB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QixTQUFTO3VCQUFDLGdDQUFnQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJOUQsa0JBQWtCO3NCQURqQixTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJbEQsbUJBQW1CO3NCQURsQixTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJbkQsWUFBWTtzQkFEWCxLQUFLO2dCQUlOLFdBQVc7c0JBRFYsS0FBSztnQkFJTixxQkFBcUI7c0JBRHBCLEtBQUs7Z0JBSU4sZUFBZTtzQkFEZCxLQUFLO2dCQUlOLGVBQWU7c0JBRGQsS0FBSztnQkFJTixlQUFlO3NCQURkLEtBQUs7Z0JBSU4sZUFBZTtzQkFEZCxLQUFLO2dCQUlOLGVBQWU7c0JBRGQsS0FBSztnQkFJTix3QkFBd0I7c0JBRHZCLEtBQUs7Z0JBSU4sY0FBYztzQkFEYixLQUFLO2dCQUlOLG9CQUFvQjtzQkFEbkIsS0FBSztnQkFJTixxQ0FBcUM7c0JBRHBDLEtBQUs7Z0JBSU4sc0JBQXNCO3NCQURyQixLQUFLO2dCQUlOLHVCQUF1QjtzQkFEdEIsS0FBSztnQkFJTixxQkFBcUI7c0JBRHBCLEtBQUs7Z0JBSU4sMkJBQTJCO3NCQUQxQixLQUFLO2dCQUlOLHlCQUF5QjtzQkFEeEIsS0FBSztnQkFJTixvQkFBb0I7c0JBRG5CLEtBQUs7Z0JBSU4sb0JBQW9CO3NCQURuQixLQUFLO2dCQUlOLHFCQUFxQjtzQkFEcEIsS0FBSztnQkFJTixrQkFBa0I7c0JBRGpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgZm9yd2FyZFJlZixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBTaW1wbGVDaGFuZ2UsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEJlaGF2aW9yU3ViamVjdCxcbiAgICBjb21iaW5lTGF0ZXN0LFxuICAgIE9ic2VydmFibGUsXG4gICAgb2YsXG4gICAgU3Vic2NyaXB0aW9uXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgICBjYXRjaEVycm9yLFxuICAgIGRlYm91bmNlVGltZSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgICBtYXAsXG4gICAgc2hhcmVSZXBsYXksXG4gICAgc3dpdGNoTWFwLFxuICAgIHRhcFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEZvZWhuQXV0b2NvbXBsZXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9laG4tYXV0b2NvbXBsZXRlL2ZvZWhuLWF1dG9jb21wbGV0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9laG5JbnB1dENvbXBvbmVudCB9IGZyb20gJy4uL2ZvZWhuLWlucHV0L2ZvZWhuLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb2VobklucHV0VGV4dENvbXBvbmVudCB9IGZyb20gJy4uL2ZvZWhuLWlucHV0L2ZvZWhuLWlucHV0LXRleHQuY29tcG9uZW50JztcbmltcG9ydCB7IE9iamVjdEhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvb2JqZWN0LmhlbHBlcic7XG5pbXBvcnQgeyBTZGtEaWN0aW9uYXJ5U2VydmljZSB9IGZyb20gJy4uL3Nkay1kaWN0aW9uYXJ5L3Nkay1kaWN0aW9uYXJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWRkcmVzcywgQ291bnRyeSwgTG9jYWxpdHksIFN0cmVldCB9IGZyb20gJy4vYWRkcmVzcy50eXBlJztcbmltcG9ydCB7IEZvZWhuSW5wdXRGb3JlaWduTG9jYWxpdHlDb21wb25lbnQgfSBmcm9tICcuL2ZvZWhuLWlucHV0LWZvcmVpZ24tbG9jYWxpdHkuY29tcG9uZW50JztcbmltcG9ydCB7IEZvZWhuSW5wdXRGb3JlaWduU3RyZWV0Q29tcG9uZW50IH0gZnJvbSAnLi9mb2Vobi1pbnB1dC1mb3JlaWduLXN0cmVldC5jb21wb25lbnQnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZSBtYXgtY2xhc3Nlcy1wZXItZmlsZVxuZXhwb3J0IGNvbnN0IFNXSVNTX0lTT19JRCA9ICdDSCc7XG5cbmV4cG9ydCBjbGFzcyBTdHJlZXROdW1iZXIge1xuICAgIG5hbWU6IHN0cmluZztcbn1cblxuY29uc3QgaXNEZWZpbmVkID0gKHZhbHVlOiBib29sZWFuKTogYm9vbGVhbiA9PlxuICAgIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcblxuY29uc3QgaGFzSW5wdXRDaGFuZ2VkID0gKGNoYW5nZTogU2ltcGxlQ2hhbmdlKTogYm9vbGVhbiA9PlxuICAgIGNoYW5nZSAmJiAhT2JqZWN0SGVscGVyLmlzRXF1YWwoY2hhbmdlLnByZXZpb3VzVmFsdWUsIGNoYW5nZS5jdXJyZW50VmFsdWUpO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZvZWhuLWlucHV0LWFkZHJlc3MnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb2Vobi1pbnB1dC1hZGRyZXNzLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogRm9laG5JbnB1dENvbXBvbmVudCxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZvZWhuSW5wdXRBZGRyZXNzQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIEZvZWhuSW5wdXRBZGRyZXNzQ29tcG9uZW50XG4gICAgZXh0ZW5kcyBGb2VobklucHV0Q29tcG9uZW50PEFkZHJlc3M+XG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95XG57XG4gICAgQFZpZXdDaGlsZChGb2VobklucHV0Rm9yZWlnbkxvY2FsaXR5Q29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgICBmb3JlaWduTG9jYWxpdHlDb21wb25lbnQ6IEZvZWhuSW5wdXRGb3JlaWduTG9jYWxpdHlDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKEZvZWhuSW5wdXRGb3JlaWduU3RyZWV0Q29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgICBmb3JlaWduU3RyZWV0Q29tcG9uZW50OiBGb2VobklucHV0Rm9yZWlnblN0cmVldENvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ2ZvcmVpZ25Ib3VzZU51bWJlcicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICAgIGZvcmVpZ25Ib3VzZU51bWJlcjogRm9laG5JbnB1dFRleHRDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdjb3VudHJ5QXV0b2NvbXBsZXRlJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gICAgY291bnRyeUF1dG9jb21wbGV0ZTogRm9laG5BdXRvY29tcGxldGVDb21wb25lbnQ7XG5cbiAgICBASW5wdXQoKVxuICAgIGNvdW50cmllc1VybCA9ICdhcGkvcmVmaW5mL2NvdW50cmllcyc7XG5cbiAgICBASW5wdXQoKVxuICAgIGlzT25seVN3aXNzID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgc2hvd1Bvc3RPZmZpY2VCb3hUZXh0ID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHNob3dBZHJlc3NMaW5lcyA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHNob3dBZHJlc3NMaW5lMSA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHNob3dBZHJlc3NMaW5lMiA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHNwZWNpZmllZENhbnRvbjogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBjb3VudHJ5UmVxdWlyZWQgPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBzd2lzc05wYUxvY2FsaXR5UmVxdWlyZWQgPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBzdHJlZXRSZXF1aXJlZDogYm9vbGVhbjtcblxuICAgIEBJbnB1dCgpXG4gICAgc3RyZWV0TnVtYmVyUmVxdWlyZWQgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgaGlkZU5vdFJlcXVpcmVkRXh0cmFMYWJlbFN0cmVldE51bWJlciA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIGZvcmVpZ25aaXBDb2RlUmVxdWlyZWQgPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBmb3JlaWduTG9jYWxpdHlSZXF1aXJlZCA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIGZvcmVpZ25TdHJlZXRSZXF1aXJlZDogYm9vbGVhbjtcblxuICAgIEBJbnB1dCgpXG4gICAgZm9yZWlnblN0cmVldE51bWJlclJlcXVpcmVkID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHBvc3RPZmZpY2VCb3hUZXh0UmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgICBASW5wdXQoKVxuICAgIGFkZHJlc3NMaW5lMVJlcXVpcmVkID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIGFkZHJlc3NMaW5lMlJlcXVpcmVkID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHdpdGhDb21wYW55TG9jYWxpdGllcyA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICB3aXRoRGVmYXVsdENvdW50cnkgPSB0cnVlO1xuXG4gICAgY291bnRyeTogQ291bnRyeTtcbiAgICBsb2NhbGl0eTogTG9jYWxpdHk7XG4gICAgc3RyZWV0OiBTdHJlZXQ7XG4gICAgaG91c2VOdW1iZXI6IHN0cmluZztcbiAgICBwb3N0T2ZmaWNlQm94VGV4dDogc3RyaW5nO1xuICAgIGFkZHJlc3NMaW5lMTogc3RyaW5nO1xuICAgIGFkZHJlc3NMaW5lMjogc3RyaW5nO1xuXG4gICAgY291bnRyaWVzOiBPYnNlcnZhYmxlPENvdW50cnlbXT47XG4gICAgbG9jYWxpdGllczogT2JzZXJ2YWJsZTxMb2NhbGl0eVtdPjtcbiAgICBzdHJlZXRzOiBPYnNlcnZhYmxlPFN0cmVldFtdPjtcbiAgICBzdHJlZXROdW1iZXJzOiBPYnNlcnZhYmxlPFN0cmVldE51bWJlcltdPjtcblxuICAgIHN0cmVldEN1c3RvbUVycm9yczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuXG4gICAgcHJpdmF0ZSBpc28ySWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KG51bGwpO1xuICAgIHByaXZhdGUgemlwQ29kZUlkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihudWxsKTtcbiAgICBwcml2YXRlIGVzdHJJZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4obnVsbCk7XG5cbiAgICBwcml2YXRlIGNvdW50cnlNb2RlbENoYW5nZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENvdW50cnk+KG51bGwpO1xuICAgIHByaXZhdGUgaXNPbmx5U3dpc3NDaGFuZ2VTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgICBwcml2YXRlIG1hbmFnZURlZmF1bHRDb3VudHJ5U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBsYW5ndWFnZUNoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudCxcbiAgICAgICAgcHJpdmF0ZSBkaWN0aW9uYXJ5U2VydmljZTogU2RrRGljdGlvbmFyeVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBpZGVudGl0eSA9IDxUPihuOiBUKTogVCA9PiBuO1xuICAgIGNvdW50cnlJZGVudGl0eSA9IChjb3VudHJ5OiBDb3VudHJ5KTogc3RyaW5nID0+IGNvdW50cnkuaXNvMklkO1xuICAgIGxvY2FsaXR5SWRlbnRpdHkgPSAobG9jOiBMb2NhbGl0eSk6IHN0cmluZyA9PiBsb2MuemlwQ29kZUlkO1xuICAgIHN0cmVldElkZW50aXR5ID0gKHN0cmVldDogU3RyZWV0KTogc3RyaW5nID0+IHN0cmVldC5lc3RyaWQ7XG4gICAgc3RyZWV0R2VuZXJhdG9yID0gKGxvbmdOYW1lOiBzdHJpbmcpOiBTdHJlZXQgPT4gKHtcbiAgICAgICAgZXN0cmlkOiBudWxsLFxuICAgICAgICBsb25nTmFtZVxuICAgIH0pO1xuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMubWFuYWdlRGVmYXVsdENvdW50cnlTdWJzY3JpcHRpb24gPSB0aGlzLm1hbmFnZURlZmF1bHRDb3VudHJ5KCk7XG5cbiAgICAgICAgdGhpcy5yZXBsYWNlQXRMZWFzdE9uZU5vdE51bGwoXG4gICAgICAgICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldEtleVN5bmMoJ2Vycm9ycy5Ob3ROdWxsJylcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmxhbmd1YWdlQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5kaWN0aW9uYXJ5U2VydmljZVxuICAgICAgICAgICAgLmdldEN1cnJlbnRMYW5ndWFnZUNvZGUoKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0S2V5KCdlcnJvcnMuTm90TnVsbCcpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ4anMtYW5ndWxhci9wcmVmZXItYXN5bmMtcGlwZVxuICAgICAgICAgICAgLnN1YnNjcmliZShub3ROdWxsRXJyb3JMYWJlbCA9PlxuICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZUF0TGVhc3RPbmVOb3ROdWxsKG5vdE51bGxFcnJvckxhYmVsKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmNvdW50cmllcyA9IHRoaXMuZ2V0Q291bnRyaWVzKCk7XG5cbiAgICAgICAgdGhpcy5sb2NhbGl0aWVzID0gdGhpcy5pc28ySWRTdWJqZWN0LnBpcGUoXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgbG9jYWxpdGllcywgb3IgYW4gZW1wdHkgYXJyYXkgYXMgdGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgICAgICAgICBzd2l0Y2hNYXAoaXNvMklkID0+IHRoaXMuZ2V0TG9jYWxpdGllcyhpc28ySWQpKSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zdHJlZXRzID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICB0aGlzLnppcENvZGVJZFN1YmplY3QsXG4gICAgICAgICAgICB0aGlzLmxvY2FsaXRpZXNcbiAgICAgICAgXSkucGlwZShcbiAgICAgICAgICAgIC8vIFRoZSB6aXBDb2RlSWQgd2hlbiBsb2NhbGl0eSBjaGFuZ2VzIG9yIG1hdGNoIGxvY2FsaXR5IChwb3N0YWxMb2NhbGl0eUhpc3RvcnlJZCkgZnJvbSBtb2RlbFxuICAgICAgICAgICAgbWFwKFxuICAgICAgICAgICAgICAgIChbemlwQ29kZUlkLCBsb2NhbGl0aWVzXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgemlwQ29kZUlkIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXh0cmFjdExvY2FsaXR5WmlwQ29kZUlkKGxvY2FsaXRpZXMsIHRoaXMubG9jYWxpdHkpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIC8vIFRoZSBsaXN0IG9mIHN0cmVldHMgb3IgYSBkZWZhdWx0IHZhbHVlIHRvIGFuIGVtcHR5IGFycmF5XG4gICAgICAgICAgICBzd2l0Y2hNYXAoemlwQ29kZUlkID0+IHRoaXMuZ2V0U3RyZWV0c0Zvcih6aXBDb2RlSWQpKSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zdHJlZXROdW1iZXJzID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICB0aGlzLmVzdHJJZFN1YmplY3QsXG4gICAgICAgICAgICB0aGlzLnN0cmVldHNcbiAgICAgICAgXSkucGlwZShcbiAgICAgICAgICAgIC8vIFRoZSBlc3RyaWQgd2hlbiBzdHJlZXQgY2hhbmdlcyBvciBtYXRjaCBzdHJlZXQgKGxvbmdOYW1lKSBmcm9tIG1vZGVsXG4gICAgICAgICAgICBtYXAoXG4gICAgICAgICAgICAgICAgKFtlc3RyaWQsIHN0cmVldHNdKSA9PlxuICAgICAgICAgICAgICAgICAgICBlc3RyaWQgfHwgdGhpcy5leHRyYWN0U3RyZWV0RXN0cmlkKHN0cmVldHMsIHRoaXMuc3RyZWV0KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAvLyBUaGUgbGlzdCBvZiBzdHJlZXRzIG9yIGEgZGVmYXVsdCB2YWx1ZSB0byBhbiBlbXB0eSBhcnJheVxuICAgICAgICAgICAgc3dpdGNoTWFwKGVzdHJpZCA9PiB0aGlzLmdldFN0cmVldE51bWJlckZvcihlc3RyaWQpKSxcbiAgICAgICAgICAgIC8vIFNvbWUgc3RyZWV0IG1pZ2h0IG5vdCBoYXZlIGFuIG5hbWUsIFJlZkluZiBzb21ldGltZXMgcmV0dXJucyB3ZWlyZCBkYXRhLlxuICAgICAgICAgICAgbWFwKHZhbHVlcyA9PiB2YWx1ZXMuZmlsdGVyKHN0cmVldE51bWJlciA9PiAhIXN0cmVldE51bWJlci5uYW1lKSksXG4gICAgICAgICAgICBtYXAodmFsdWVzID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xsYXRvciA9IG5ldyBJbnRsLkNvbGxhdG9yKHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgICAgICBudW1lcmljOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzZW5zaXRpdml0eTogJ2Jhc2UnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5zb3J0KChhLCBiKSA9PiBjb2xsYXRvci5jb21wYXJlKGEubmFtZSwgYi5uYW1lKSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgICAgIHRoaXMubWFuYWdlRGVmYXVsdENvdW50cnlTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMubGFuZ3VhZ2VDaGFuZ2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdCBtb2RlbENoYW5nZTogU2ltcGxlQ2hhbmdlID0gY2hhbmdlcy5tb2RlbDtcbiAgICAgICAgY29uc3QgaXNPbmx5U3dpc3M6IFNpbXBsZUNoYW5nZSA9IGNoYW5nZXMuaXNPbmx5U3dpc3M7XG5cbiAgICAgICAgaWYgKGhhc0lucHV0Q2hhbmdlZChtb2RlbENoYW5nZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY291bnRyeU1vZGVsQ2hhbmdlU3ViamVjdC5uZXh0KFxuICAgICAgICAgICAgICAgIG1vZGVsQ2hhbmdlLmN1cnJlbnRWYWx1ZT8uY291bnRyeVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzSW5wdXRDaGFuZ2VkKGlzT25seVN3aXNzKSkge1xuICAgICAgICAgICAgdGhpcy5pc09ubHlTd2lzc0NoYW5nZVN1YmplY3QubmV4dChpc09ubHlTd2lzcy5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlQWRkcmVzcygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsaWRWYWx1ZSA9IHRoaXMuZ2V0VmFsaWRWYWx1ZSgpO1xuICAgICAgICBpZiAodHlwZW9mIHZhbGlkVmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU5nTW9kZWwodmFsaWRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVOZ01vZGVsKHZhbHVlOiBBZGRyZXNzKTogdm9pZCB7XG4gICAgICAgIGlmICghIXZhbHVlKSB7XG4gICAgICAgICAgICAvLyBhdm9pZCB3cm9uZ2Z1bGwgcHJlZmlsbCBieSBzZXNzaW9uIGluZm9cbiAgICAgICAgICAgIGlmICghdGhpcy5zaG93QWRyZXNzTGluZXMgfHwgIXRoaXMuc2hvd0FkcmVzc0xpbmUxKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUuYWRkcmVzc0xpbmUxID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5zaG93QWRyZXNzTGluZXMgfHwgIXRoaXMuc2hvd0FkcmVzc0xpbmUyKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUuYWRkcmVzc0xpbmUyID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5zaG93UG9zdE9mZmljZUJveFRleHQpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZS5wb3N0T2ZmaWNlQm94VGV4dCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBuZXZlciB1cGRhdGFibGUgaW4gdGhlIGNvbXBvbmVudFxuICAgICAgICAgICAgdmFsdWUucG9zdE9mZmljZUJveE51bWJlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzdXBlci51cGRhdGVOZ01vZGVsKHZhbHVlKTtcbiAgICB9XG5cbiAgICBoYW5kbGVVc2VySW5wdXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZhbGlkVmFsdWUgPSB0aGlzLmdldFZhbGlkVmFsdWUoKTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWxpZFZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFuZ2UodmFsaWRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1vZGVsQ2hhbmdlKHZhbHVlOiBBZGRyZXNzKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5jb3VudHJ5ID0gdmFsdWUuY291bnRyeTtcbiAgICAgICAgICAgIHRoaXMubG9jYWxpdHkgPSB2YWx1ZS5sb2NhbGl0eTtcbiAgICAgICAgICAgIHRoaXMuc3RyZWV0ID0gdmFsdWUuc3RyZWV0O1xuICAgICAgICAgICAgdGhpcy5ob3VzZU51bWJlciA9IHZhbHVlLmhvdXNlTnVtYmVyO1xuICAgICAgICAgICAgdGhpcy5wb3N0T2ZmaWNlQm94VGV4dCA9IHZhbHVlLnBvc3RPZmZpY2VCb3hUZXh0O1xuICAgICAgICAgICAgdGhpcy5hZGRyZXNzTGluZTEgPSB2YWx1ZS5hZGRyZXNzTGluZTE7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NMaW5lMiA9IHZhbHVlLmFkZHJlc3NMaW5lMjtcbiAgICAgICAgfSBlbHNlIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIC8vIGNvdW50cnkgaXMgbWFuYWdlZCBieSBgbWFuYWdlRGVmYXVsdENvdW50cnkoKWBcbiAgICAgICAgICAgIHRoaXMubG9jYWxpdHkgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zdHJlZXQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5ob3VzZU51bWJlciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnBvc3RPZmZpY2VCb3hUZXh0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc0xpbmUxID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc0xpbmUyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzU3dpc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIShcbiAgICAgICAgICAgIHRoaXMuaXNPbmx5U3dpc3MgfHxcbiAgICAgICAgICAgICh0aGlzLmNvdW50cnkgJiYgdGhpcy5jb3VudHJ5LmlzbzJJZCA9PT0gU1dJU1NfSVNPX0lEKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHVzZXJJbnB1dENvdW50cnkoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuemlwQ29kZUlkU3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLmVzdHJJZFN1YmplY3QubmV4dChudWxsKTtcblxuICAgICAgICB0aGlzLmxvY2FsaXR5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdHJlZXQgPSBudWxsO1xuICAgICAgICB0aGlzLmhvdXNlTnVtYmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb3N0T2ZmaWNlQm94VGV4dCA9IG51bGw7XG4gICAgICAgIHRoaXMuYWRkcmVzc0xpbmUxID0gbnVsbDtcbiAgICAgICAgdGhpcy5hZGRyZXNzTGluZTIgPSBudWxsO1xuXG4gICAgICAgIHRoaXMudXBkYXRlQWRkcmVzcygpO1xuICAgICAgICB0aGlzLmhhbmRsZVVzZXJJbnB1dCgpO1xuICAgIH1cblxuICAgIHVzZXJJbnB1dExvY2FsaXR5KGxvY2FsaXR5OiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGlmICghbG9jYWxpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuemlwQ29kZUlkU3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsd2F5cyByZXNldCBzdWdnZXN0aW9uIGxpc3Qgb2YgaG91c2VOdW1iZXIgd2hlbiBsb2NhbGl0eSBjaGFuZ2VzXG4gICAgICAgIHRoaXMuZXN0cklkU3ViamVjdC5uZXh0KG51bGwpO1xuXG4gICAgICAgIHRoaXMuc3RyZWV0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5ob3VzZU51bWJlciA9IG51bGw7XG5cbiAgICAgICAgdGhpcy51cGRhdGVBZGRyZXNzKCk7XG4gICAgICAgIHRoaXMuaGFuZGxlVXNlcklucHV0KCk7XG4gICAgfVxuXG4gICAgdXNlcklucHV0U3RyZWV0KHN0cmVldDogdW5rbm93bik6IHZvaWQge1xuICAgICAgICBpZiAoIXN0cmVldCkge1xuICAgICAgICAgICAgdGhpcy5lc3RySWRTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ob3VzZU51bWJlciA9IG51bGw7XG4gICAgICAgIHRoaXMuaGFuZGxlVXNlcklucHV0KCk7XG4gICAgfVxuXG4gICAgY291bnRyeVVwZGF0ZWQoY291bnRyeTogQ291bnRyeSk6IHZvaWQge1xuICAgICAgICAvLyBObyBkb3VibGUtYmluZGluZyBvbiBjb3VudHJ5IGluIHZpZXcgdG8gZW5zdXJlIHdlIHVwZGF0ZSBwcm9wZXJseSBtb2RlbFxuICAgICAgICB0aGlzLmNvdW50cnkgPSBjb3VudHJ5O1xuICAgICAgICB0aGlzLnVwZGF0ZUFkZHJlc3MoKTtcblxuICAgICAgICBpZiAoIWNvdW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgaXNvMklkIH0gPSBjb3VudHJ5O1xuICAgICAgICB0aGlzLmlzbzJJZFN1YmplY3QubmV4dChpc28ySWQpO1xuICAgIH1cblxuICAgIGdldExvY2FsaXR5RGlzcGxheWVkTmFtZShsb2NhbGl0eTogTG9jYWxpdHkpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICAgICAgaWYgKCFsb2NhbGl0eSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke2xvY2FsaXR5LnppcENvZGV9ICR7bG9jYWxpdHkubG9uZ05hbWV9YDtcbiAgICB9XG5cbiAgICBsb2NhbGl0eVVwZGF0ZWQobG9jYWxpdHk6IExvY2FsaXR5KTogdm9pZCB7XG4gICAgICAgIC8vIE5vIGRvdWJsZS1iaW5kaW5nIG9uIGxvY2FsaXR5IGluIHZpZXcgdG8gZW5zdXJlIHdlIHVwZGF0ZSBwcm9wZXJseSBtb2RlbFxuICAgICAgICB0aGlzLmxvY2FsaXR5ID0gbG9jYWxpdHk7XG4gICAgICAgIHRoaXMudXBkYXRlQWRkcmVzcygpO1xuXG4gICAgICAgIGlmICghbG9jYWxpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgemlwQ29kZUlkIH0gPSBsb2NhbGl0eTtcbiAgICAgICAgdGhpcy56aXBDb2RlSWRTdWJqZWN0Lm5leHQoemlwQ29kZUlkKTtcbiAgICB9XG5cbiAgICBzdHJlZXRVcGRhdGVkKHN0cmVldDogU3RyZWV0KTogdm9pZCB7XG4gICAgICAgIC8vIE5vIGRvdWJsZS1iaW5kaW5nIG9uIHN0cmVldCBpbiB2aWV3IHRvIGVuc3VyZSB3ZSB1cGRhdGUgcHJvcGVybHkgbW9kZWxcbiAgICAgICAgdGhpcy5zdHJlZXQgPSBzdHJlZXQ7XG4gICAgICAgIHRoaXMudXBkYXRlQWRkcmVzcygpO1xuXG4gICAgICAgIGlmICghc3RyZWV0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGVzdHJpZCB9ID0gc3RyZWV0O1xuICAgICAgICB0aGlzLmVzdHJJZFN1YmplY3QubmV4dChlc3RyaWQpO1xuICAgIH1cblxuICAgIGlzU3RyZWV0UmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpc0RlZmluZWQodGhpcy5zdHJlZXRSZXF1aXJlZCkpIHtcbiAgICAgICAgICAgIC8vIHJlc3BlY3Qgb3ZlcnJpZGVuIHZhbHVlXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJlZXRSZXF1aXJlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5zaG93UG9zdE9mZmljZUJveFRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICF0aGlzLnBvc3RPZmZpY2VCb3hUZXh0IHx8ICEhdGhpcy5zdHJlZXQ7XG4gICAgfVxuXG4gICAgaXNGb3JlaWduU3RyZWV0UmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpc0RlZmluZWQodGhpcy5mb3JlaWduU3RyZWV0UmVxdWlyZWQpKSB7XG4gICAgICAgICAgICAvLyByZXNwZWN0IG92ZXJyaWRlbiB2YWx1ZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9yZWlnblN0cmVldFJlcXVpcmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnNob3dQb3N0T2ZmaWNlQm94VGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIXRoaXMucG9zdE9mZmljZUJveFRleHQgfHwgISF0aGlzLnN0cmVldDtcbiAgICB9XG5cbiAgICBpc1Bvc3RPZmZpY2VCb3hUZXh0UmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpc0RlZmluZWQodGhpcy5wb3N0T2ZmaWNlQm94VGV4dFJlcXVpcmVkKSkge1xuICAgICAgICAgICAgLy8gcmVzcGVjdCBvdmVycmlkZW4gdmFsdWVcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc3RPZmZpY2VCb3hUZXh0UmVxdWlyZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF0aGlzLnN0cmVldCB8fCAhIXRoaXMucG9zdE9mZmljZUJveFRleHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXBsYWNlQXRMZWFzdE9uZU5vdE51bGwobm90TnVsbEVycm9yTGFiZWw6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc2hvd1Bvc3RPZmZpY2VCb3hUZXh0KSB7XG4gICAgICAgICAgICB0aGlzLnN0cmVldEN1c3RvbUVycm9ycy5BdExlYXN0T25lTm90TnVsbCA9IG5vdE51bGxFcnJvckxhYmVsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDb3VudHJpZXMoKTogT2JzZXJ2YWJsZTxDb3VudHJ5W10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8Q291bnRyeVtdPih0aGlzLmNvdW50cmllc1VybCkucGlwZShcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoW10pKSAvLyBlbWl0IGV2ZW4gd2hlbiBhbiBlcnJvciBvY2N1cnNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExvY2FsaXRpZXMoaXNvMklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPExvY2FsaXR5W10+IHtcbiAgICAgICAgaWYgKGlzbzJJZCAhPT0gU1dJU1NfSVNPX0lEKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSAhIXRoaXMud2l0aENvbXBhbnlMb2NhbGl0aWVzXG4gICAgICAgICAgICA/ICc/d2l0aENvbXBhbnlMb2NhbGl0aWVzPXRydWUnXG4gICAgICAgICAgICA6ICcnO1xuXG4gICAgICAgIGlmICghIXRoaXMuc3BlY2lmaWVkQ2FudG9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50XG4gICAgICAgICAgICAgICAgLmdldDxcbiAgICAgICAgICAgICAgICAgICAgTG9jYWxpdHlbXVxuICAgICAgICAgICAgICAgID4oYGFwaS9yZWZpbmYvbG9jYWxpdHkvJHt0aGlzLnNwZWNpZmllZENhbnRvbn0ke3F1ZXJ5UGFyYW1zfWApXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoW10pKSAvLyBlbWl0IGV2ZW4gd2hlbiBhbiBlcnJvciBvY2N1cnNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgICAgICAgICAgICAgIC5nZXQ8TG9jYWxpdHlbXT4oYGFwaS9yZWZpbmYvbG9jYWxpdHkvYWxsJHtxdWVyeVBhcmFtc31gKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKFtdKSkgLy8gZW1pdCBldmVuIHdoZW4gYW4gZXJyb3Igb2NjdXJzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3RyZWV0TnVtYmVyRm9yKGVzdHJpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTdHJlZXROdW1iZXJbXT4ge1xuICAgICAgICBpZiAoIWVzdHJpZCkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVybCA9IGBhcGkvcmVmaW5mL2FkZHJlc3Nlcy8ke2VzdHJpZH1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxTdHJlZXROdW1iZXJbXT4odXJsKS5waXBlKFxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihbXSkpIC8vIGVtaXQgZXZlbiB3aGVuIGFuIGVycm9yIG9jY3Vyc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3RyZWV0c0Zvcih6aXBDb2RlSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8U3RyZWV0W10+IHtcbiAgICAgICAgaWYgKCF6aXBDb2RlSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cmwgPSBgYXBpL3JlZmluZi9zdHJlZXRzLyR7emlwQ29kZUlkfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PFN0cmVldFtdPih1cmwpLnBpcGUoXG4gICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKFtdKSkgLy8gZW1pdCBldmVuIHdoZW4gYW4gZXJyb3Igb2NjdXJzXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhckF1dG9jb21wbGV0ZXNXaGVuQ291bnRyeUlzVW5hcHByb3ByaWF0ZWRUb0NvbXBvbmVudENvbmZpZ3VyYXRpb24oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzTW9kZWxFbXB0eSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc09ubHlTd2lzcyAmJiB0aGlzLmNvdW50cnk/LmlzbzJJZCAhPT0gU1dJU1NfSVNPX0lEKSB7XG4gICAgICAgICAgICAvLyBEbyBub3QgcmVtb3ZlIHRoaXMgd2FybmluZy4gTmVlZGVkIGZvciBkZWJ1Z2dpbmcgYXQgYWxsIHRpbWUuXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgICAgICBgQ291bnRyeSBhZGRyZXNzIHdhcyAnJHt0aGlzLmNvdW50cnkuaXNvMklkfScuIE9ubHkgc3dpc3MgaXMgYXNrZWQgaW4gY29tcG9uZW50ICdmb2Vobi1pbnB1dC1hZGRyZXNzJyBjb25maWd1cmF0aW9uLiBBZGRyZXNzIG1vZGVsIHJlc2V0dGVkLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQXV0b2NvbXBsZXRlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTd2lzc0NvdW50cnkoKTogQ291bnRyeSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc28ySWQ6IFNXSVNTX0lTT19JRCxcbiAgICAgICAgICAgIHNob3J0TmFtZUZyOiAnU3Vpc3NlJ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RGVmYXVsdENvdW50cnkoKTogdm9pZCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMud2l0aERlZmF1bHRDb3VudHJ5ICYmXG4gICAgICAgICAgICAodGhpcy5pc09ubHlTd2lzcyB8fCAhdGhpcy5jb3VudHJ5IHx8ICF0aGlzLmNvdW50cnkuaXNvMklkKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuY291bnRyeSA9IHRoaXMuZ2V0U3dpc3NDb3VudHJ5KCk7XG4gICAgICAgICAgICB0aGlzLmlzbzJJZFN1YmplY3QubmV4dChTV0lTU19JU09fSUQpO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFkZHJlc3MoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJBdXRvY29tcGxldGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvdW50cnkgPSBudWxsO1xuICAgICAgICB0aGlzLnN0cmVldCA9IG51bGw7XG4gICAgICAgIHRoaXMubG9jYWxpdHkgPSBudWxsO1xuICAgICAgICB0aGlzLmhvdXNlTnVtYmVyID0gbnVsbDtcbiAgICAgICAgLy8gTm8gdXBkYXRlQWRkcmVzcygpIGhlcmUgYmVjYXVzZSBkb25lIGluIHNldERlZmF1bHRDb3VudHJ5KClcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4dHJhY3RMb2NhbGl0eVppcENvZGVJZChcbiAgICAgICAgbG9jYWxpdGllczogTG9jYWxpdHlbXSxcbiAgICAgICAgbG9jYWxpdHlUb01hdGNoOiBMb2NhbGl0eVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIGlmIChsb2NhbGl0eVRvTWF0Y2ggJiYgbG9jYWxpdHlUb01hdGNoLnBvc3RhbExvY2FsaXR5SGlzdG9yeUlkKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gbG9jYWxpdGllcy5maW5kKFxuICAgICAgICAgICAgICAgIChsb2NhbGl0eTogTG9jYWxpdHkpID0+XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsaXR5LnBvc3RhbExvY2FsaXR5SGlzdG9yeUlkID09PVxuICAgICAgICAgICAgICAgICAgICBsb2NhbGl0eVRvTWF0Y2gucG9zdGFsTG9jYWxpdHlIaXN0b3J5SWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVkLnppcENvZGVJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZXh0cmFjdFN0cmVldEVzdHJpZChcbiAgICAgICAgc3RyZWV0czogU3RyZWV0W10sXG4gICAgICAgIHN0cmVldFRvTWF0Y2g6IFN0cmVldFxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIGlmIChzdHJlZXRUb01hdGNoICYmIHN0cmVldFRvTWF0Y2gubG9uZ05hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBzdHJlZXRzLmZpbmQoXG4gICAgICAgICAgICAgICAgKHN0cmVldDogU3RyZWV0KSA9PiBzdHJlZXQubG9uZ05hbWUgPT09IHN0cmVldFRvTWF0Y2gubG9uZ05hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVkLmVzdHJpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VmFsaWRDb3VudHJ5KCk6IENvdW50cnkge1xuICAgICAgICAvLyBCZSBzdXJlIHRvIGFsd2F5cyBzZW5kIFN3aXNzIGNvdW50cnkgd2hlbiAnaXNPbmx5U3dpc3MnIGlzIHNldCB0byB0cnVlXG4gICAgICAgIHJldHVybiB0aGlzLmlzT25seVN3aXNzID8gdGhpcy5nZXRTd2lzc0NvdW50cnkoKSA6IHRoaXMuY291bnRyeTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFZhbGlkVmFsdWUoKTogQWRkcmVzcyB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodGhpcy5pc01vZGVsRW1wdHkoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWxfICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY291bnRyeTogdGhpcy5nZXRWYWxpZENvdW50cnkoKSxcbiAgICAgICAgICAgIGxvY2FsaXR5OiB0aGlzLmxvY2FsaXR5LFxuICAgICAgICAgICAgc3RyZWV0OiB0aGlzLnN0cmVldCxcbiAgICAgICAgICAgIGhvdXNlTnVtYmVyOiB0aGlzLmhvdXNlTnVtYmVyLFxuICAgICAgICAgICAgcG9zdE9mZmljZUJveFRleHQ6IHRoaXMucG9zdE9mZmljZUJveFRleHQsXG4gICAgICAgICAgICBhZGRyZXNzTGluZTE6IHRoaXMuYWRkcmVzc0xpbmUxLFxuICAgICAgICAgICAgYWRkcmVzc0xpbmUyOiB0aGlzLmFkZHJlc3NMaW5lMlxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNNb2RlbEVtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHRoaXMuaXNPbmx5U3dpc3MgfHxcbiAgICAgICAgICAgICAgICAhdGhpcy5jb3VudHJ5IHx8XG4gICAgICAgICAgICAgICAgT2JqZWN0SGVscGVyLmlzRW1wdHkodGhpcy5jb3VudHJ5KSkgJiZcbiAgICAgICAgICAgICghdGhpcy5sb2NhbGl0eSB8fCBPYmplY3RIZWxwZXIuaXNFbXB0eSh0aGlzLmxvY2FsaXR5KSkgJiZcbiAgICAgICAgICAgICghdGhpcy5zdHJlZXQgfHwgT2JqZWN0SGVscGVyLmlzRW1wdHkodGhpcy5zdHJlZXQpKSAmJlxuICAgICAgICAgICAgdGhpcy5pc0VtcHR5KHRoaXMuaG91c2VOdW1iZXIpICYmXG4gICAgICAgICAgICB0aGlzLmlzRW1wdHkodGhpcy5wb3N0T2ZmaWNlQm94VGV4dCkgJiZcbiAgICAgICAgICAgIHRoaXMuaXNFbXB0eSh0aGlzLmFkZHJlc3NMaW5lMSkgJiZcbiAgICAgICAgICAgIHRoaXMuaXNFbXB0eSh0aGlzLmFkZHJlc3NMaW5lMilcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1hbmFnZURlZmF1bHRDb3VudHJ5KCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50cnlNb2RlbENoYW5nZVN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDApLFxuICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChcbiAgICAgICAgICAgICAgICAgICAgICAgIChwcmV2aW91cywgY3VycmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cz8uaXNvMklkID09PSBjdXJyZW50Py5pc28ySWRcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgdGhpcy5pc09ubHlTd2lzc0NoYW5nZVN1YmplY3RcbiAgICAgICAgICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRhcCgoW2NvdW50cnksIGlzT25seVN3aXNzXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc09ubHlTd2lzcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjb3VudHJ5ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuaXNDb3VudHJ5SW5wdXREaXJ0eSgpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERlZmF1bHRDb3VudHJ5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNPbmx5U3dpc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIGEgY291bnRyeSwgd2UgbmVlZCB0byBjaGVjayBpZiBpdCBoYXMgdG8gYmUgY2xlYW5lZCBhbmQgc2V0IHRvIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFjb3VudHJ5ICYmICFPYmplY3RIZWxwZXIuaXNFbXB0eShjb3VudHJ5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyQXV0b2NvbXBsZXRlc1doZW5Db3VudHJ5SXNVbmFwcHJvcHJpYXRlZFRvQ29tcG9uZW50Q29uZmlndXJhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERlZmF1bHRDb3VudHJ5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnhqcy1hbmd1bGFyL3ByZWZlci1hc3luYy1waXBlXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0NvdW50cnlJbnB1dERpcnR5KCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuY291bnRyeUF1dG9jb21wbGV0ZT8uaW5wdXRNb2RlbExpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb3VudHJ5QXV0b2NvbXBsZXRlLmlucHV0TW9kZWxMaXN0XG4gICAgICAgICAgICAuZmlsdGVyKG5nTW9kZWwgPT4gbmdNb2RlbC5uYW1lID09PSB0aGlzLmNvdW50cnlBdXRvY29tcGxldGUubmFtZSlcbiAgICAgICAgICAgIC5tYXAobmdNb2RlbCA9PiBuZ01vZGVsLmNvbnRyb2wuZGlydHkpXG4gICAgICAgICAgICAuZXZlcnkodmFsdWUgPT4gdmFsdWUgPT09IHRydWUpO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgICBbYXR0ci5pZF09XCJidWlsZElkKCkgKyAnQ29udGFpbmVyJ1wiXG4gICAgY2xhc3M9XCJmb3JtLWdyb3VwXCJcbiAgICBbY2xhc3MuaGFzLWRhbmdlcl09XCJoYXNFcnJvcnNUb0Rpc3BsYXkoKVwiXG4gICAgW2NsYXNzLnZkLWZvcm0tZ3JvdXAtZGFuZ2VyXT1cImhhc0Vycm9yc1RvRGlzcGxheSgpXCJcbiAgICBbdGFiSW5kZXhdPVwiLTFcIlxuPlxuICAgIDxmaWVsZHNldFxuICAgICAgICBjbGFzcz1cIm1iLTNcIlxuICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImdldERlc2NyaWJlZEJ5KClcIlxuICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiaGFzRXJyb3JzVG9EaXNwbGF5KCkgfHwgbnVsbFwiXG4gICAgPlxuICAgICAgICA8bGVnZW5kXG4gICAgICAgICAgICAqbmdJZj1cIiEhbGFiZWxcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiaXNMYWJlbFNyT25seSA/ICd2aXN1YWxseS1oaWRkZW4nIDogJ3ZkLXAnXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJsYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhcmVxdWlyZWQgJiYgIWhpZGVOb3RSZXF1aXJlZEV4dHJhTGFiZWxcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgJ2ZvZWhuLWlucHV0Lm9wdGlvbmFsJyB8IGZyb21EaWN0aW9uYXJ5IH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGVnZW5kPlxuXG4gICAgICAgIDxmb2Vobi12YWxpZGF0aW9uLWFsZXJ0cyBbY29tcG9uZW50XT1cInRoaXNcIj48L2ZvZWhuLXZhbGlkYXRpb24tYWxlcnRzPlxuXG4gICAgICAgIDxzbWFsbFxuICAgICAgICAgICAgKm5nSWY9XCJoZWxwVGV4dFwiXG4gICAgICAgICAgICBbYXR0ci5pZF09XCJidWlsZElkKCkgKyAnSGVscCdcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cImhlbHBUZXh0XCJcbiAgICAgICAgPjwvc21hbGw+XG5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG4gICAgICAgIDxmb2Vobi1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICpuZ0lmPVwiIWlzT25seVN3aXNzXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCInZm9laG4taW5wdXQtYWRkcmVzcy5jb3VudHJ5LmxhYmVsJyB8IGZyb21EaWN0aW9uYXJ5XCJcbiAgICAgICAgICAgIFtlbGVtZW50c109XCJjb3VudHJpZXMgfCBhc3luY1wiXG4gICAgICAgICAgICBlbGVtZW50TGFiZWw9XCJzaG9ydE5hbWVGclwiXG4gICAgICAgICAgICBbZWxlbWVudFZhbHVlXT1cImlkZW50aXR5XCJcbiAgICAgICAgICAgIFtlbGVtZW50VmFsdWVJZGVudGl0eV09XCJjb3VudHJ5SWRlbnRpdHlcIlxuICAgICAgICAgICAgKG1vZGVsQ2hhbmdlKT1cImNvdW50cnlVcGRhdGVkKCRldmVudClcIlxuICAgICAgICAgICAgKHVzZXJJbnB1dCk9XCJ1c2VySW5wdXRDb3VudHJ5KClcIlxuICAgICAgICAgICAgW21vZGVsXT1cImNvdW50cnlcIlxuICAgICAgICAgICAgW25hbWVdPVwibmFtZSArICcuY291bnRyeSdcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cImNvdW50cnlSZXF1aXJlZFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgI2NvdW50cnlBdXRvY29tcGxldGVcbiAgICAgICAgPjwvZm9laG4tYXV0b2NvbXBsZXRlPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1N3aXNzKClcIj5cbiAgICAgICAgICAgIDxmb2Vobi1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ2ZvZWhuLWlucHV0LWFkZHJlc3MubG9jYWxpdHkubGFiZWwnIHwgZnJvbURpY3Rpb25hcnlcIlxuICAgICAgICAgICAgICAgIFtlbGVtZW50c109XCJsb2NhbGl0aWVzIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIFtlbGVtZW50TGFiZWxdPVwiZ2V0TG9jYWxpdHlEaXNwbGF5ZWROYW1lXCJcbiAgICAgICAgICAgICAgICBbZWxlbWVudFZhbHVlXT1cImlkZW50aXR5XCJcbiAgICAgICAgICAgICAgICBbZWxlbWVudFZhbHVlSWRlbnRpdHldPVwibG9jYWxpdHlJZGVudGl0eVwiXG4gICAgICAgICAgICAgICAgKG1vZGVsQ2hhbmdlKT1cImxvY2FsaXR5VXBkYXRlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAodXNlcklucHV0KT1cInVzZXJJbnB1dExvY2FsaXR5KCRldmVudClcIlxuICAgICAgICAgICAgICAgIFttb2RlbF09XCJsb2NhbGl0eVwiXG4gICAgICAgICAgICAgICAgW25hbWVdPVwibmFtZSArICcubG9jYWxpdHknXCJcbiAgICAgICAgICAgICAgICBbYWxsb3dDdXN0b21WYWx1ZV09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInN3aXNzTnBhTG9jYWxpdHlSZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgID48L2ZvZWhuLWF1dG9jb21wbGV0ZT5cblxuICAgICAgICAgICAgPGZvZWhuLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCInZm9laG4taW5wdXQtYWRkcmVzcy5zdHJlZXQubGFiZWwnIHwgZnJvbURpY3Rpb25hcnlcIlxuICAgICAgICAgICAgICAgIFtlbGVtZW50c109XCJzdHJlZXRzIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIGVsZW1lbnRMYWJlbD1cImxvbmdOYW1lXCJcbiAgICAgICAgICAgICAgICBbZWxlbWVudFZhbHVlXT1cImlkZW50aXR5XCJcbiAgICAgICAgICAgICAgICBbZWxlbWVudFZhbHVlSWRlbnRpdHldPVwic3RyZWV0SWRlbnRpdHlcIlxuICAgICAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJzdHJlZXRVcGRhdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIFttb2RlbF09XCJzdHJlZXRcIlxuICAgICAgICAgICAgICAgIFtuYW1lXT1cIm5hbWUgKyAnLnN0cmVldCdcIlxuICAgICAgICAgICAgICAgIFthbGxvd0N1c3RvbVZhbHVlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtjdXN0b21WYWx1ZU1vZGVsR2VuZXJhdG9yXT1cInN0cmVldEdlbmVyYXRvclwiXG4gICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImlzU3RyZWV0UmVxdWlyZWQoKVwiXG4gICAgICAgICAgICAgICAgW2hlbHBUZXh0XT1cIlxuICAgICAgICAgICAgICAgICAgICAnZm9laG4taW5wdXQtYWRkcmVzcy5zdHJlZXQuaGVscC10ZXh0JyB8IGZyb21EaWN0aW9uYXJ5XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbY3VzdG9tRXJyb3JzXT1cInN0cmVldEN1c3RvbUVycm9yc1wiXG4gICAgICAgICAgICAgICAgKHVzZXJJbnB1dCk9XCJ1c2VySW5wdXRTdHJlZXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgID48L2ZvZWhuLWF1dG9jb21wbGV0ZT5cblxuICAgICAgICAgICAgPGZvZWhuLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgJ2ZvZWhuLWlucHV0LWFkZHJlc3MuaG91c2VOdW1iZXIubGFiZWwnIHwgZnJvbURpY3Rpb25hcnlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtlbGVtZW50c109XCJzdHJlZXROdW1iZXJzIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIGVsZW1lbnRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICAgIGVsZW1lbnRWYWx1ZT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgIFsobW9kZWwpXT1cImhvdXNlTnVtYmVyXCJcbiAgICAgICAgICAgICAgICBbbmFtZV09XCJuYW1lICsgJy5ob3VzZU51bWJlcidcIlxuICAgICAgICAgICAgICAgIFthbGxvd0N1c3RvbVZhbHVlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtoZWxwVGV4dF09XCJcbiAgICAgICAgICAgICAgICAgICAgJ2ZvZWhuLWlucHV0LWFkZHJlc3MuaG91c2VOdW1iZXIuaGVscC10ZXh0JyB8IGZyb21EaWN0aW9uYXJ5XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwidXBkYXRlQWRkcmVzcygpXCJcbiAgICAgICAgICAgICAgICAodXNlcklucHV0KT1cImhhbmRsZVVzZXJJbnB1dCgpXCJcbiAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwic3RyZWV0TnVtYmVyUmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgIFtoaWRlTm90UmVxdWlyZWRFeHRyYUxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICBoaWRlTm90UmVxdWlyZWRFeHRyYUxhYmVsU3RyZWV0TnVtYmVyXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgPjwvZm9laG4tYXV0b2NvbXBsZXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzU3dpc3MoKVwiPlxuICAgICAgICAgICAgPCEtLVxuICAgICAgICAgICAgQ29tcG9uZW50IDxmb2Vobi1pbnB1dC1mb3JlaWduLWxvY2FsaXR5PiBpcyBzcGVjaWFsIGJlY2F1c2Ugd2UgdXNlIHRoZSBzYW1lIG1vZGVsIHdoZW4gc3dpc3Mgb3IgZm9yZWlnbmVyLlxuICAgICAgICAgICAgVG8gZG8gc28sIHdlIG5lZWQ6XG4gICAgICAgICAgICAgICAgLSBFcnJvcnMgd2lsbCBiZSBiaW5kIG9uICdsb2NhbGl0eScgd2hlbiBOVUxMIG9yIG9uICd6aXBDb2RlJyBhbmQgJ2xvbmdOYW1lJyBtb2RlbCBpbnNpZGUgY29tcG9uZW50IHdoZW4gRU1QVFlcbiAgICAgICAgICAgICAgICAtIEhpZGUgbGFiZWwgZnJvbSBjb21wb25lbnQgYmVjYXVzZSB3ZSBuZWVkIGxhYmVsIGZyb20gY2hpbGRyZW4gdG8gYmUgZGlzcGxheWVkIChpc0xhYmVsU3JPbmx5OiB0cnVlKVxuICAgICAgICAgICAgICAgIC0gcmVxdWlyZWQgYW5kIGRpc2FibGVkIHBhcmFtcyBhcmUgdHJhbnNtaXR0ZWQgdG8gY2hpbGRyZW5cbiAgICAgICAgICAgICAtLT5cbiAgICAgICAgICAgIDxmb2Vobi1pbnB1dC1mb3JlaWduLWxvY2FsaXR5XG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidmb2Vobi1pbnB1dC1hZGRyZXNzLmxvY2FsaXR5LmxhYmVsJyB8IGZyb21EaWN0aW9uYXJ5XCJcbiAgICAgICAgICAgICAgICBbbmFtZV09XCJuYW1lICsgJy5sb2NhbGl0eSdcIlxuICAgICAgICAgICAgICAgIFsobW9kZWwpXT1cImxvY2FsaXR5XCJcbiAgICAgICAgICAgICAgICBbemlwQ29kZVJlcXVpcmVkXT1cImZvcmVpZ25aaXBDb2RlUmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgIFtsb2NhbGl0eVJlcXVpcmVkXT1cImZvcmVpZ25Mb2NhbGl0eVJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICBbaXNMYWJlbFNyT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvdW50cnkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJ1cGRhdGVBZGRyZXNzKClcIlxuICAgICAgICAgICAgICAgICh1c2VySW5wdXQpPVwiaGFuZGxlVXNlcklucHV0KClcIlxuICAgICAgICAgICAgPjwvZm9laG4taW5wdXQtZm9yZWlnbi1sb2NhbGl0eT5cbiAgICAgICAgICAgIDwhLS1cbiAgICAgICAgICAgIENvbXBvbmVudCA8Zm9laG4taW5wdXQtZm9yZWlnbi1zdHJlZXQ+IGlzIHNwZWNpYWwgYmVjYXVzZSB3ZSB1c2UgdGhlIHNhbWUgbW9kZWwgd2hlbiBzd2lzcyBvciBmb3JlaWduZXIuXG4gICAgICAgICAgICBUbyBkbyBzbywgd2UgbmVlZDpcbiAgICAgICAgICAgICAgICAtIEVycm9ycyB3aWxsIGJlIGJpbmQgb24gJ3N0cmVldCcgd2hlbiBOVUxMIG9yIG9uICdsb25nTmFtZScgbW9kZWwgaW5zaWRlIGNvbXBvbmVudCB3aGVuIEVNUFRZXG4gICAgICAgICAgICAgICAgLSByZXF1aXJlZCwgaGVscFRleHQsIGlzTGFiZWxTck9ubHkgYW5kIGRpc2FibGVkICBwYXJhbXMgYXJlIHRyYW5zbWl0dGVkIHRvIGNoaWxkcmVuXG4gICAgICAgICAgICAgLS0+XG4gICAgICAgICAgICA8Zm9laG4taW5wdXQtZm9yZWlnbi1zdHJlZXRcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ2ZvZWhuLWlucHV0LWFkZHJlc3Muc3RyZWV0LmxhYmVsJyB8IGZyb21EaWN0aW9uYXJ5XCJcbiAgICAgICAgICAgICAgICBbbmFtZV09XCJuYW1lICsgJy5zdHJlZXQnXCJcbiAgICAgICAgICAgICAgICBbKG1vZGVsKV09XCJzdHJlZXRcIlxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJpc0ZvcmVpZ25TdHJlZXRSZXF1aXJlZCgpXCJcbiAgICAgICAgICAgICAgICBbaGVscFRleHRdPVwiXG4gICAgICAgICAgICAgICAgICAgICdmb2Vobi1pbnB1dC1hZGRyZXNzLnN0cmVldC5oZWxwLXRleHQnIHwgZnJvbURpY3Rpb25hcnlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtjdXN0b21FcnJvcnNdPVwic3RyZWV0Q3VzdG9tRXJyb3JzXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvdW50cnkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJ1cGRhdGVBZGRyZXNzKClcIlxuICAgICAgICAgICAgICAgICh1c2VySW5wdXQpPVwiaGFuZGxlVXNlcklucHV0KClcIlxuICAgICAgICAgICAgPjwvZm9laG4taW5wdXQtZm9yZWlnbi1zdHJlZXQ+XG5cbiAgICAgICAgICAgIDxmb2Vobi1pbnB1dC10ZXh0XG4gICAgICAgICAgICAgICAgI2ZvcmVpZ25Ib3VzZU51bWJlclxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgJ2ZvZWhuLWlucHV0LWFkZHJlc3MuaG91c2VOdW1iZXIubGFiZWwnIHwgZnJvbURpY3Rpb25hcnlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtuYW1lXT1cIm5hbWUgKyAnLmhvdXNlTnVtYmVyJ1wiXG4gICAgICAgICAgICAgICAgWyhtb2RlbCldPVwiaG91c2VOdW1iZXJcIlxuICAgICAgICAgICAgICAgIFtoZWxwVGV4dF09XCJcbiAgICAgICAgICAgICAgICAgICAgJ2ZvZWhuLWlucHV0LWFkZHJlc3MuaG91c2VOdW1iZXIuaGVscC10ZXh0JyB8IGZyb21EaWN0aW9uYXJ5XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvdW50cnkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJ1cGRhdGVBZGRyZXNzKClcIlxuICAgICAgICAgICAgICAgICh1c2VySW5wdXQpPVwiaGFuZGxlVXNlcklucHV0KClcIlxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmb3JlaWduU3RyZWV0TnVtYmVyUmVxdWlyZWRcIlxuICAgICAgICAgICAgPjwvZm9laG4taW5wdXQtdGV4dD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPGZvZWhuLWlucHV0LXRleHRcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd1Bvc3RPZmZpY2VCb3hUZXh0XCJcbiAgICAgICAgICAgIFsobW9kZWwpXT1cInBvc3RPZmZpY2VCb3hUZXh0XCJcbiAgICAgICAgICAgIFtoZWxwVGV4dF09XCJcbiAgICAgICAgICAgICAgICAnZm9laG4taW5wdXQtYWRkcmVzcy5wb3N0T2ZmaWNlQm94VGV4dC5oZWxwLXRleHQnXG4gICAgICAgICAgICAgICAgICAgIHwgZnJvbURpY3Rpb25hcnlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgJ2ZvZWhuLWlucHV0LWFkZHJlc3MucG9zdE9mZmljZUJveFRleHQubGFiZWwnIHwgZnJvbURpY3Rpb25hcnlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbbmFtZV09XCJuYW1lICsgJy5wb3N0T2ZmaWNlQm94VGV4dCdcIlxuICAgICAgICAgICAgKG1vZGVsQ2hhbmdlKT1cInVwZGF0ZUFkZHJlc3MoKVwiXG4gICAgICAgICAgICAodXNlcklucHV0KT1cImhhbmRsZVVzZXJJbnB1dCgpXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJpc1Bvc3RPZmZpY2VCb3hUZXh0UmVxdWlyZWQoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICA+PC9mb2Vobi1pbnB1dC10ZXh0PlxuXG4gICAgICAgIDxmb2Vobi1pbnB1dC10ZXh0XG4gICAgICAgICAgICAqbmdJZj1cInNob3dBZHJlc3NMaW5lcyAmJiBzaG93QWRyZXNzTGluZTFcIlxuICAgICAgICAgICAgWyhtb2RlbCldPVwiYWRkcmVzc0xpbmUxXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCInZm9laG4taW5wdXQtYWRkcmVzcy5hZGRyZXNzTGluZTEubGFiZWwnIHwgZnJvbURpY3Rpb25hcnlcIlxuICAgICAgICAgICAgW25hbWVdPVwibmFtZSArICcuYWRkcmVzc0xpbmUxJ1wiXG4gICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwidXBkYXRlQWRkcmVzcygpXCJcbiAgICAgICAgICAgICh1c2VySW5wdXQpPVwiaGFuZGxlVXNlcklucHV0KClcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cImFkZHJlc3NMaW5lMVJlcXVpcmVkXCJcbiAgICAgICAgICAgIFthdXRvY29tcGxldGVdPVwiJ2FkZHJlc3MtbGluZTInXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgID48L2ZvZWhuLWlucHV0LXRleHQ+XG5cbiAgICAgICAgPGZvZWhuLWlucHV0LXRleHRcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd0FkcmVzc0xpbmVzICYmIHNob3dBZHJlc3NMaW5lMlwiXG4gICAgICAgICAgICBbKG1vZGVsKV09XCJhZGRyZXNzTGluZTJcIlxuICAgICAgICAgICAgW2xhYmVsXT1cIidmb2Vobi1pbnB1dC1hZGRyZXNzLmFkZHJlc3NMaW5lMi5sYWJlbCcgfCBmcm9tRGljdGlvbmFyeVwiXG4gICAgICAgICAgICBbbmFtZV09XCJuYW1lICsgJy5hZGRyZXNzTGluZTInXCJcbiAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJ1cGRhdGVBZGRyZXNzKClcIlxuICAgICAgICAgICAgKHVzZXJJbnB1dCk9XCJoYW5kbGVVc2VySW5wdXQoKVwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwiYWRkcmVzc0xpbmUyUmVxdWlyZWRcIlxuICAgICAgICAgICAgW2F1dG9jb21wbGV0ZV09XCInYWRkcmVzcy1saW5lMydcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgPjwvZm9laG4taW5wdXQtdGV4dD5cbiAgICA8L2ZpZWxkc2V0PlxuPC9kaXY+XG4iXX0=