@hmcts/rpx-xui-common-lib 1.7.0 → 1.8.0-angular-upgrade-9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/bundles/hmcts-rpx-xui-common-lib.umd.js +4078 -6583
  2. package/bundles/hmcts-rpx-xui-common-lib.umd.js.map +1 -1
  3. package/bundles/hmcts-rpx-xui-common-lib.umd.min.js +15 -1
  4. package/bundles/hmcts-rpx-xui-common-lib.umd.min.js.map +1 -1
  5. package/esm2015/hmcts-rpx-xui-common-lib.js +2 -7
  6. package/esm2015/lib/components/accessibility/accessibility.component.js +13 -17
  7. package/esm2015/lib/components/checkbox-list/checkbox-list.component.js +45 -127
  8. package/esm2015/lib/components/contact-details/contact-details.component.js +16 -23
  9. package/esm2015/lib/components/cookie-banner/cookie-banner.component.js +31 -78
  10. package/esm2015/lib/components/due-date/due-date.component.js +24 -110
  11. package/esm2015/lib/components/exui-main-wrapper/exui-page-wrapper.component.js +29 -34
  12. package/esm2015/lib/components/find-location/find-location.component.js +61 -131
  13. package/esm2015/lib/components/find-person/find-person.component.js +93 -174
  14. package/esm2015/lib/components/generic-filter/generic-filter-utils.js +11 -55
  15. package/esm2015/lib/components/generic-filter/generic-filter.component.js +54 -289
  16. package/esm2015/lib/components/hmcts-session-dialog/hmcts-session-dialog.component.js +20 -29
  17. package/esm2015/lib/components/index.js +2 -7
  18. package/esm2015/lib/components/invite-user-form/invite-user-form.component.js +23 -33
  19. package/esm2015/lib/components/invite-user-permissions/invite-user-permission.component.js +34 -35
  20. package/esm2015/lib/components/loading-spinner/loading-spinner.component.js +16 -22
  21. package/esm2015/lib/components/pagination/pagination.component.js +28 -38
  22. package/esm2015/lib/components/public_api.js +33 -33
  23. package/esm2015/lib/components/search-judicials/search-judicials.component.js +70 -156
  24. package/esm2015/lib/components/search-location/search-location.component.js +76 -177
  25. package/esm2015/lib/components/search-venue/search-venue.component.js +62 -154
  26. package/esm2015/lib/components/selected-case/selected-case.component.js +54 -191
  27. package/esm2015/lib/components/selected-case-confirm/selected-case-confirm.component.js +22 -53
  28. package/esm2015/lib/components/selected-case-list/selected-case-list.component.js +38 -68
  29. package/esm2015/lib/components/service-message/service-message.component.js +23 -32
  30. package/esm2015/lib/components/service-messages/service-messages.component.js +29 -77
  31. package/esm2015/lib/components/share-case/share-case.component.js +45 -104
  32. package/esm2015/lib/components/share-case-confirm/share-case-confirm.component.js +27 -50
  33. package/esm2015/lib/components/tab/tab.component.js +19 -37
  34. package/esm2015/lib/components/tc-confirm/tc-confirm.component.js +20 -29
  35. package/esm2015/lib/components/terms-and-conditions/tc-display/tc-display-html/tc-display-html.component.js +13 -17
  36. package/esm2015/lib/components/terms-and-conditions/tc-display/tc-display-plain/tc-display-plain.component.js +13 -17
  37. package/esm2015/lib/components/terms-and-conditions/terms-and-conditions.component.js +16 -23
  38. package/esm2015/lib/components/user-details/user-details.component.js +47 -57
  39. package/esm2015/lib/components/user-list/user-list.component.js +19 -28
  40. package/esm2015/lib/components/user-select/user-select.component.js +23 -64
  41. package/esm2015/lib/directives/feature-toggle/feature-toggle.directive.js +21 -67
  42. package/esm2015/lib/directives/index.js +2 -7
  43. package/esm2015/lib/directives/let/let.directive.js +16 -49
  44. package/esm2015/lib/directives/public-api.js +3 -8
  45. package/esm2015/lib/exui-common-lib.module.js +31 -35
  46. package/esm2015/lib/gov-ui/components/gov-uk-checkbox/gov-uk-checkbox.component.js +23 -34
  47. package/esm2015/lib/gov-ui/components/gov-uk-checkboxes/gov-uk-checkboxes.component.js +18 -23
  48. package/esm2015/lib/gov-ui/components/gov-uk-date/gov-uk-date.component.js +30 -68
  49. package/esm2015/lib/gov-ui/components/gov-uk-error-message/gov-uk-error-message.component.js +19 -25
  50. package/esm2015/lib/gov-ui/components/gov-uk-fieldset/gov-uk-fieldset.component.js +19 -28
  51. package/esm2015/lib/gov-ui/components/gov-uk-file-upload/gov-uk-file-upload.component.js +23 -36
  52. package/esm2015/lib/gov-ui/components/gov-uk-form-group-wrapper/gov-uk-form-group-wrapper.component.js +23 -28
  53. package/esm2015/lib/gov-ui/components/gov-uk-input/gov-uk-input.component.js +24 -35
  54. package/esm2015/lib/gov-ui/components/gov-uk-label/gov-uk-label.component.js +15 -22
  55. package/esm2015/lib/gov-ui/components/gov-uk-radio/gov-uk-radio.component.js +23 -35
  56. package/esm2015/lib/gov-ui/components/gov-uk-radios/gov-uk-radios.component.js +18 -23
  57. package/esm2015/lib/gov-ui/components/gov-uk-select/gov-uk-select.component.js +27 -34
  58. package/esm2015/lib/gov-ui/components/gov-uk-table/gov-uk-table.component.js +32 -47
  59. package/esm2015/lib/gov-ui/components/gov-uk-textarea/gov-uk-textarea.component.js +22 -29
  60. package/esm2015/lib/gov-ui/components/hmcts-banner/hmcts-banner.component.js +20 -26
  61. package/esm2015/lib/gov-ui/components/hmcts-error-summary/hmcts-error-summary.component.js +26 -56
  62. package/esm2015/lib/gov-ui/components/hmcts-identity-bar/hmcts-identity-bar.component.js +17 -27
  63. package/esm2015/lib/gov-ui/components/hmcts-main-wrapper/hmcts-main-wrapper.component.js +40 -52
  64. package/esm2015/lib/gov-ui/components/hmcts-primary-navigation/hmcts-primary-navigation.component.js +29 -36
  65. package/esm2015/lib/gov-ui/components/hmcts-sub-navigation/hmcts-sub-navigation.component.js +18 -35
  66. package/esm2015/lib/gov-ui/components/index.js +2 -7
  67. package/esm2015/lib/gov-ui/components/public_api.js +21 -7
  68. package/esm2015/lib/gov-ui/directives/index.js +2 -0
  69. package/esm2015/lib/gov-ui/directives/public_api.js +2 -0
  70. package/esm2015/lib/gov-ui/directives/remove-host.directive.js +12 -30
  71. package/esm2015/lib/gov-ui/gov-ui.service.js +12 -16
  72. package/esm2015/lib/gov-ui/index.js +2 -7
  73. package/esm2015/lib/gov-ui/models/banner-data-model.js +1 -16
  74. package/esm2015/lib/gov-ui/models/checkboxes-model.js +1 -22
  75. package/esm2015/lib/gov-ui/models/error-messages-model.js +1 -16
  76. package/esm2015/lib/gov-ui/models/gov-ui-config-model.js +1 -36
  77. package/esm2015/lib/gov-ui/models/index.js +1 -7
  78. package/esm2015/lib/gov-ui/models/isession-storage.interface.js +1 -24
  79. package/esm2015/lib/gov-ui/models/public_api.js +1 -10
  80. package/esm2015/lib/gov-ui/public_api.js +5 -9
  81. package/esm2015/lib/gov-ui/util/helpers/html-templates.helper.js +4 -14
  82. package/esm2015/lib/gov-ui/util/session-storage/session-storage-utils.js +12 -48
  83. package/esm2015/lib/gov-ui/validators/checkboxes-be-checked.validator.js +5 -24
  84. package/esm2015/lib/gov-ui/validators/date.validator.js +3 -20
  85. package/esm2015/lib/gov-ui/validators/index.js +2 -7
  86. package/esm2015/lib/gov-ui/validators/public_api.js +4 -9
  87. package/esm2015/lib/gov-ui/validators/radio-group.validator.js +3 -15
  88. package/esm2015/lib/models/case-share.model.js +1 -26
  89. package/esm2015/lib/models/contact-details.model.js +7 -31
  90. package/esm2015/lib/models/due-date.model.js +7 -14
  91. package/esm2015/lib/models/feature-user.js +1 -16
  92. package/esm2015/lib/models/filter.model.js +1 -112
  93. package/esm2015/lib/models/idle-config.model.js +1 -20
  94. package/esm2015/lib/models/index.js +6 -18
  95. package/esm2015/lib/models/location.model.js +1 -108
  96. package/esm2015/lib/models/person.model.js +17 -92
  97. package/esm2015/lib/models/public_api.js +4 -11
  98. package/esm2015/lib/models/search-options.model.js +1 -22
  99. package/esm2015/lib/models/tcDocument.model.js +1 -18
  100. package/esm2015/lib/models/timeout-notification.model.js +1 -18
  101. package/esm2015/lib/models/user-details.model.js +1 -22
  102. package/esm2015/lib/models/user.model.js +1 -25
  103. package/esm2015/lib/services/case-sharing-state/case-sharing-state.service.js +19 -92
  104. package/esm2015/lib/services/cookie/cookie.service.js +19 -78
  105. package/esm2015/lib/services/feature-toggle/feature-toggle.guard.js +16 -51
  106. package/esm2015/lib/services/feature-toggle/feature-toggle.service.js +11 -35
  107. package/esm2015/lib/services/feature-toggle/launch-darkly.service.js +21 -101
  108. package/esm2015/lib/services/filter/filter.service.js +11 -63
  109. package/esm2015/lib/services/find-person/find-person.service.js +25 -130
  110. package/esm2015/lib/services/google-analytics/google-analytics.service.js +21 -70
  111. package/esm2015/lib/services/google-tag-manager/google-tag-manager.service.js +23 -71
  112. package/esm2015/lib/services/index.js +2 -7
  113. package/esm2015/lib/services/loading/loading.service.js +11 -48
  114. package/esm2015/lib/services/locations/location.service.js +22 -35
  115. package/esm2015/lib/services/manage-session/manage-session.services.js +21 -70
  116. package/esm2015/lib/services/public-api.js +13 -18
  117. package/esm2015/lib/services/role-guard/role.guard.js +24 -61
  118. package/esm2015/lib/services/role-guard/role.service.js +11 -28
  119. package/esm2015/lib/services/session-storage/session-storage.service.js +12 -24
  120. package/esm2015/lib/services/timeout-notifications/timeout-notifications.service.js +20 -82
  121. package/esm2015/lib/window.js +1 -10
  122. package/esm2015/public-api.js +8 -13
  123. package/esm5/hmcts-rpx-xui-common-lib.js +2 -7
  124. package/esm5/lib/components/accessibility/accessibility.component.js +10 -15
  125. package/esm5/lib/components/checkbox-list/checkbox-list.component.js +57 -232
  126. package/esm5/lib/components/contact-details/contact-details.component.js +14 -22
  127. package/esm5/lib/components/cookie-banner/cookie-banner.component.js +36 -106
  128. package/esm5/lib/components/due-date/due-date.component.js +29 -142
  129. package/esm5/lib/components/exui-main-wrapper/exui-page-wrapper.component.js +27 -33
  130. package/esm5/lib/components/find-location/find-location.component.js +71 -167
  131. package/esm5/lib/components/find-person/find-person.component.js +97 -193
  132. package/esm5/lib/components/generic-filter/generic-filter-utils.js +13 -57
  133. package/esm5/lib/components/generic-filter/generic-filter.component.js +83 -408
  134. package/esm5/lib/components/hmcts-session-dialog/hmcts-session-dialog.component.js +19 -32
  135. package/esm5/lib/components/index.js +2 -7
  136. package/esm5/lib/components/invite-user-form/invite-user-form.component.js +23 -37
  137. package/esm5/lib/components/invite-user-permissions/invite-user-permission.component.js +32 -34
  138. package/esm5/lib/components/loading-spinner/loading-spinner.component.js +14 -21
  139. package/esm5/lib/components/pagination/pagination.component.js +28 -45
  140. package/esm5/lib/components/public_api.js +33 -33
  141. package/esm5/lib/components/search-judicials/search-judicials.component.js +78 -198
  142. package/esm5/lib/components/search-location/search-location.component.js +84 -207
  143. package/esm5/lib/components/search-venue/search-venue.component.js +71 -199
  144. package/esm5/lib/components/selected-case/selected-case.component.js +72 -279
  145. package/esm5/lib/components/selected-case-confirm/selected-case-confirm.component.js +22 -61
  146. package/esm5/lib/components/selected-case-list/selected-case-list.component.js +39 -82
  147. package/esm5/lib/components/service-message/service-message.component.js +22 -36
  148. package/esm5/lib/components/service-messages/service-messages.component.js +30 -91
  149. package/esm5/lib/components/share-case/share-case.component.js +52 -138
  150. package/esm5/lib/components/share-case-confirm/share-case-confirm.component.js +25 -49
  151. package/esm5/lib/components/tab/tab.component.js +18 -41
  152. package/esm5/lib/components/tc-confirm/tc-confirm.component.js +19 -32
  153. package/esm5/lib/components/terms-and-conditions/tc-display/tc-display-html/tc-display-html.component.js +10 -15
  154. package/esm5/lib/components/terms-and-conditions/tc-display/tc-display-plain/tc-display-plain.component.js +10 -15
  155. package/esm5/lib/components/terms-and-conditions/terms-and-conditions.component.js +14 -22
  156. package/esm5/lib/components/user-details/user-details.component.js +48 -71
  157. package/esm5/lib/components/user-list/user-list.component.js +18 -32
  158. package/esm5/lib/components/user-select/user-select.component.js +27 -92
  159. package/esm5/lib/directives/feature-toggle/feature-toggle.directive.js +21 -70
  160. package/esm5/lib/directives/index.js +2 -7
  161. package/esm5/lib/directives/let/let.directive.js +15 -51
  162. package/esm5/lib/directives/public-api.js +3 -8
  163. package/esm5/lib/exui-common-lib.module.js +22 -28
  164. package/esm5/lib/gov-ui/components/gov-uk-checkbox/gov-uk-checkbox.component.js +22 -37
  165. package/esm5/lib/gov-ui/components/gov-uk-checkboxes/gov-uk-checkboxes.component.js +16 -22
  166. package/esm5/lib/gov-ui/components/gov-uk-date/gov-uk-date.component.js +32 -89
  167. package/esm5/lib/gov-ui/components/gov-uk-error-message/gov-uk-error-message.component.js +17 -24
  168. package/esm5/lib/gov-ui/components/gov-uk-fieldset/gov-uk-fieldset.component.js +18 -31
  169. package/esm5/lib/gov-ui/components/gov-uk-file-upload/gov-uk-file-upload.component.js +23 -43
  170. package/esm5/lib/gov-ui/components/gov-uk-form-group-wrapper/gov-uk-form-group-wrapper.component.js +21 -27
  171. package/esm5/lib/gov-ui/components/gov-uk-input/gov-uk-input.component.js +24 -45
  172. package/esm5/lib/gov-ui/components/gov-uk-label/gov-uk-label.component.js +13 -21
  173. package/esm5/lib/gov-ui/components/gov-uk-radio/gov-uk-radio.component.js +18 -44
  174. package/esm5/lib/gov-ui/components/gov-uk-radios/gov-uk-radios.component.js +16 -22
  175. package/esm5/lib/gov-ui/components/gov-uk-select/gov-uk-select.component.js +26 -37
  176. package/esm5/lib/gov-ui/components/gov-uk-table/gov-uk-table.component.js +31 -51
  177. package/esm5/lib/gov-ui/components/gov-uk-textarea/gov-uk-textarea.component.js +21 -32
  178. package/esm5/lib/gov-ui/components/hmcts-banner/hmcts-banner.component.js +18 -25
  179. package/esm5/lib/gov-ui/components/hmcts-error-summary/hmcts-error-summary.component.js +28 -71
  180. package/esm5/lib/gov-ui/components/hmcts-identity-bar/hmcts-identity-bar.component.js +16 -27
  181. package/esm5/lib/gov-ui/components/hmcts-main-wrapper/hmcts-main-wrapper.component.js +41 -60
  182. package/esm5/lib/gov-ui/components/hmcts-primary-navigation/hmcts-primary-navigation.component.js +28 -36
  183. package/esm5/lib/gov-ui/components/hmcts-sub-navigation/hmcts-sub-navigation.component.js +16 -34
  184. package/esm5/lib/gov-ui/components/index.js +2 -7
  185. package/esm5/lib/gov-ui/components/public_api.js +21 -7
  186. package/esm5/lib/gov-ui/directives/index.js +2 -0
  187. package/esm5/lib/gov-ui/directives/public_api.js +2 -0
  188. package/esm5/lib/gov-ui/directives/remove-host.directive.js +10 -29
  189. package/esm5/lib/gov-ui/gov-ui.service.js +9 -14
  190. package/esm5/lib/gov-ui/index.js +2 -7
  191. package/esm5/lib/gov-ui/models/banner-data-model.js +1 -16
  192. package/esm5/lib/gov-ui/models/checkboxes-model.js +1 -22
  193. package/esm5/lib/gov-ui/models/error-messages-model.js +1 -16
  194. package/esm5/lib/gov-ui/models/gov-ui-config-model.js +1 -36
  195. package/esm5/lib/gov-ui/models/index.js +1 -7
  196. package/esm5/lib/gov-ui/models/isession-storage.interface.js +1 -24
  197. package/esm5/lib/gov-ui/models/public_api.js +1 -10
  198. package/esm5/lib/gov-ui/public_api.js +5 -9
  199. package/esm5/lib/gov-ui/util/helpers/html-templates.helper.js +3 -34
  200. package/esm5/lib/gov-ui/util/session-storage/session-storage-utils.js +12 -48
  201. package/esm5/lib/gov-ui/validators/checkboxes-be-checked.validator.js +5 -24
  202. package/esm5/lib/gov-ui/validators/date.validator.js +3 -20
  203. package/esm5/lib/gov-ui/validators/index.js +2 -7
  204. package/esm5/lib/gov-ui/validators/public_api.js +4 -9
  205. package/esm5/lib/gov-ui/validators/radio-group.validator.js +3 -15
  206. package/esm5/lib/models/case-share.model.js +1 -26
  207. package/esm5/lib/models/contact-details.model.js +7 -31
  208. package/esm5/lib/models/due-date.model.js +7 -14
  209. package/esm5/lib/models/feature-user.js +1 -16
  210. package/esm5/lib/models/filter.model.js +1 -112
  211. package/esm5/lib/models/idle-config.model.js +1 -20
  212. package/esm5/lib/models/index.js +6 -18
  213. package/esm5/lib/models/location.model.js +1 -108
  214. package/esm5/lib/models/person.model.js +17 -92
  215. package/esm5/lib/models/public_api.js +4 -11
  216. package/esm5/lib/models/search-options.model.js +1 -22
  217. package/esm5/lib/models/tcDocument.model.js +1 -18
  218. package/esm5/lib/models/timeout-notification.model.js +1 -18
  219. package/esm5/lib/models/user-details.model.js +1 -22
  220. package/esm5/lib/models/user.model.js +1 -25
  221. package/esm5/lib/services/case-sharing-state/case-sharing-state.service.js +27 -132
  222. package/esm5/lib/services/cookie/cookie.service.js +21 -104
  223. package/esm5/lib/services/feature-toggle/feature-toggle.guard.js +13 -61
  224. package/esm5/lib/services/feature-toggle/feature-toggle.service.js +12 -70
  225. package/esm5/lib/services/feature-toggle/launch-darkly.service.js +21 -142
  226. package/esm5/lib/services/filter/filter.service.js +15 -101
  227. package/esm5/lib/services/find-person/find-person.service.js +27 -152
  228. package/esm5/lib/services/google-analytics/google-analytics.service.js +21 -78
  229. package/esm5/lib/services/google-tag-manager/google-tag-manager.service.js +23 -79
  230. package/esm5/lib/services/index.js +2 -7
  231. package/esm5/lib/services/loading/loading.service.js +14 -69
  232. package/esm5/lib/services/locations/location.service.js +11 -50
  233. package/esm5/lib/services/manage-session/manage-session.services.js +20 -73
  234. package/esm5/lib/services/public-api.js +13 -18
  235. package/esm5/lib/services/role-guard/role.guard.js +22 -60
  236. package/esm5/lib/services/role-guard/role.service.js +10 -28
  237. package/esm5/lib/services/session-storage/session-storage.service.js +12 -61
  238. package/esm5/lib/services/timeout-notifications/timeout-notifications.service.js +19 -111
  239. package/esm5/lib/window.js +1 -10
  240. package/esm5/public-api.js +8 -13
  241. package/fesm2015/hmcts-rpx-xui-common-lib.js +3152 -4924
  242. package/fesm2015/hmcts-rpx-xui-common-lib.js.map +1 -1
  243. package/fesm5/hmcts-rpx-xui-common-lib.js +3458 -6178
  244. package/fesm5/hmcts-rpx-xui-common-lib.js.map +1 -1
  245. package/hmcts-rpx-xui-common-lib.metadata.json +1 -1
  246. package/lib/components/checkbox-list/checkbox-list.component.d.ts +6 -5
  247. package/lib/components/due-date/due-date.component.d.ts +4 -4
  248. package/lib/components/find-location/find-location.component.d.ts +4 -2
  249. package/lib/components/generic-filter/generic-filter.component.d.ts +4 -2
  250. package/lib/components/hmcts-session-dialog/hmcts-session-dialog.component.d.ts +1 -1
  251. package/lib/components/invite-user-form/invite-user-form.component.d.ts +2 -2
  252. package/lib/components/public_api.d.ts +9 -4
  253. package/lib/components/search-judicials/search-judicials.component.d.ts +1 -1
  254. package/lib/components/search-location/search-location.component.d.ts +4 -2
  255. package/lib/components/search-venue/search-venue.component.d.ts +1 -1
  256. package/lib/directives/feature-toggle/feature-toggle.directive.d.ts +1 -1
  257. package/lib/directives/let/let.directive.d.ts +1 -1
  258. package/lib/exui-common-lib.module.d.ts +1 -1
  259. package/lib/gov-ui/components/hmcts-error-summary/hmcts-error-summary.component.d.ts +1 -1
  260. package/lib/gov-ui/components/hmcts-identity-bar/hmcts-identity-bar.component.d.ts +1 -1
  261. package/lib/gov-ui/components/hmcts-main-wrapper/hmcts-main-wrapper.component.d.ts +1 -1
  262. package/lib/gov-ui/components/hmcts-primary-navigation/hmcts-primary-navigation.component.d.ts +1 -1
  263. package/lib/gov-ui/components/public_api.d.ts +19 -0
  264. package/lib/gov-ui/directives/index.d.ts +1 -0
  265. package/lib/gov-ui/directives/public_api.d.ts +1 -0
  266. package/lib/gov-ui/public_api.d.ts +2 -1
  267. package/lib/services/case-sharing-state/case-sharing-state.service.d.ts +1 -1
  268. package/lib/services/loading/loading.service.d.ts +2 -2
  269. package/lib/services/role-guard/role.service.d.ts +2 -1
  270. package/lib/window.d.ts +2 -2
  271. package/package.json +2 -6
@@ -1,11 +1,6 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * Generated from: lib/components/generic-filter/generic-filter.component.ts
4
- * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
- */
6
- import * as tslib_1 from "tslib";
1
+ import { __assign, __decorate, __metadata, __read, __values } from "tslib";
7
2
  import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';
8
- import { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
3
+ import { AbstractControl, FormArray, FormBuilder, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms';
9
4
  import { FilterService } from './../../services/filter/filter.service';
10
5
  import { getValues, maxSelectedValidator, minSelectedValidator } from './generic-filter-utils';
11
6
  var GenericFilterComponent = /** @class */ (function () {
@@ -14,40 +9,23 @@ var GenericFilterComponent = /** @class */ (function () {
14
9
  this.fb = fb;
15
10
  this.submitted = false;
16
11
  }
12
+ GenericFilterComponent_1 = GenericFilterComponent;
17
13
  Object.defineProperty(GenericFilterComponent.prototype, "config", {
18
- get: /**
19
- * @return {?}
20
- */
21
- function () {
14
+ get: function () {
22
15
  return this._config;
23
16
  },
24
- set: /**
25
- * @param {?} value
26
- * @return {?}
27
- */
28
- function (value) {
29
- this._config = tslib_1.__assign({}, value, { fields: value.fields.map((/**
30
- * @param {?} field
31
- * @return {?}
32
- */
33
- function (field) { return (tslib_1.__assign({}, field, { displayMinSelectedError: false, displayMaxSelectedError: false })); })) });
17
+ set: function (value) {
18
+ this._config = __assign(__assign({}, value), { fields: value.fields.map(function (field) { return (__assign(__assign({}, field), { displayMinSelectedError: false, displayMaxSelectedError: false })); }) });
34
19
  this._config = value;
35
20
  },
36
21
  enumerable: true,
37
22
  configurable: true
38
23
  });
39
24
  Object.defineProperty(GenericFilterComponent.prototype, "settings", {
40
- get: /**
41
- * @return {?}
42
- */
43
- function () {
25
+ get: function () {
44
26
  return this._settings;
45
27
  },
46
- set: /**
47
- * @param {?} value
48
- * @return {?}
49
- */
50
- function (value) {
28
+ set: function (value) {
51
29
  if (!value) {
52
30
  this.getSettings();
53
31
  }
@@ -59,18 +37,7 @@ var GenericFilterComponent = /** @class */ (function () {
59
37
  enumerable: true,
60
38
  configurable: true
61
39
  });
62
- /**
63
- * @private
64
- * @param {?} field
65
- * @return {?}
66
- */
67
- GenericFilterComponent.addFormValidators = /**
68
- * @private
69
- * @param {?} field
70
- * @return {?}
71
- */
72
- function (field) {
73
- /** @type {?} */
40
+ GenericFilterComponent.addFormValidators = function (field) {
74
41
  var validators = [];
75
42
  if (field && field.minSelected) {
76
43
  validators.push(minSelectedValidator(field.minSelected));
@@ -80,53 +47,27 @@ var GenericFilterComponent = /** @class */ (function () {
80
47
  }
81
48
  return validators;
82
49
  };
83
- /**
84
- * @return {?}
85
- */
86
- GenericFilterComponent.prototype.ngOnInit = /**
87
- * @return {?}
88
- */
89
- function () {
50
+ GenericFilterComponent.prototype.ngOnInit = function () {
90
51
  var _this = this;
91
52
  if (!this.settings) {
92
53
  this.getSettings();
93
54
  }
94
55
  this.mergeDefaultFields(this.settings);
95
56
  this.buildForm(this.config, this.settings);
96
- this.formSub = this.form.valueChanges.subscribe((/**
97
- * @return {?}
98
- */
99
- function () { return _this.submitted = false; }));
57
+ this.formSub = this.form.valueChanges.subscribe(function () { return _this.submitted = false; });
100
58
  };
101
- /**
102
- * @return {?}
103
- */
104
- GenericFilterComponent.prototype.ngOnDestroy = /**
105
- * @return {?}
106
- */
107
- function () {
59
+ GenericFilterComponent.prototype.ngOnDestroy = function () {
108
60
  if (this.formSub) {
109
61
  this.formSub.unsubscribe();
110
62
  }
111
63
  };
112
- /**
113
- * @param {?} field
114
- * @param {?} form
115
- * @return {?}
116
- */
117
- GenericFilterComponent.prototype.hidden = /**
118
- * @param {?} field
119
- * @param {?} form
120
- * @return {?}
121
- */
122
- function (field, form) {
64
+ GenericFilterComponent.prototype.hidden = function (field, form) {
123
65
  if (!field.showCondition) {
124
66
  return false;
125
67
  }
126
68
  if (typeof field.showCondition === 'string') {
127
- /** @type {?} */
128
- var control = (/** @type {?} */ (form.get(field.name)));
129
- var _a = tslib_1.__read(field.showCondition.split('='), 2), name_1 = _a[0], value = _a[1];
69
+ var control = form.get(field.name);
70
+ var _a = __read(field.showCondition.split('='), 2), name_1 = _a[0], value = _a[1];
130
71
  if (form.value && form.value[name_1] === value) {
131
72
  if (field.type === 'find-person') {
132
73
  control.get('email').setValidators(Validators.required);
@@ -151,24 +92,13 @@ var GenericFilterComponent = /** @class */ (function () {
151
92
  }
152
93
  return true;
153
94
  };
154
- /**
155
- * @param {?} field
156
- * @param {?} form
157
- * @return {?}
158
- */
159
- GenericFilterComponent.prototype.disabled = /**
160
- * @param {?} field
161
- * @param {?} form
162
- * @return {?}
163
- */
164
- function (field, form) {
95
+ GenericFilterComponent.prototype.disabled = function (field, form) {
165
96
  if (!field.enableCondition) {
166
97
  return null;
167
98
  }
168
99
  if (typeof field.enableCondition === 'string') {
169
- /** @type {?} */
170
- var control = (/** @type {?} */ (form.get(field.name)));
171
- var _a = tslib_1.__read(field.enableCondition.split('='), 2), name_2 = _a[0], value = _a[1];
100
+ var control = form.get(field.name);
101
+ var _a = __read(field.enableCondition.split('='), 2), name_2 = _a[0], value = _a[1];
172
102
  if (form.value && form.value[name_2] === value) {
173
103
  if (field.type === 'find-person') {
174
104
  control.get('email').setValidators(Validators.required);
@@ -193,15 +123,7 @@ var GenericFilterComponent = /** @class */ (function () {
193
123
  }
194
124
  return true;
195
125
  };
196
- /**
197
- * @param {?} form
198
- * @return {?}
199
- */
200
- GenericFilterComponent.prototype.applyFilter = /**
201
- * @param {?} form
202
- * @return {?}
203
- */
204
- function (form) {
126
+ GenericFilterComponent.prototype.applyFilter = function (form) {
205
127
  this.submitted = true;
206
128
  form.markAsTouched();
207
129
  if (form.valid) {
@@ -210,8 +132,7 @@ var GenericFilterComponent = /** @class */ (function () {
210
132
  fields: this.getSelectedValues(form.value, this.config)
211
133
  };
212
134
  this.filterService.givenErrors.next(null);
213
- /** @type {?} */
214
- var settings = tslib_1.__assign({}, this.settings, { reset: false });
135
+ var settings = __assign(__assign({}, this.settings), { reset: false });
215
136
  this.filterService.persist(settings, this.config.persistence);
216
137
  }
217
138
  else {
@@ -219,25 +140,12 @@ var GenericFilterComponent = /** @class */ (function () {
219
140
  }
220
141
  };
221
142
  // when domain changes ensure that person field is reset
222
- // when domain changes ensure that person field is reset
223
- /**
224
- * @param {?} field
225
- * @param {?} form
226
- * @return {?}
227
- */
228
- GenericFilterComponent.prototype.fieldChanged =
229
- // when domain changes ensure that person field is reset
230
- /**
231
- * @param {?} field
232
- * @param {?} form
233
- * @return {?}
234
- */
235
- function (field, form) {
143
+ GenericFilterComponent.prototype.fieldChanged = function (field, form) {
236
144
  var e_1, _a;
237
145
  // TODO - Do similar with jurisdiction/service for caseworkers by services
238
146
  if (field.changeResetFields && field.changeResetFields.length) {
239
147
  try {
240
- for (var _b = tslib_1.__values(field.changeResetFields), _c = _b.next(); !_c.done; _c = _b.next()) {
148
+ for (var _b = __values(field.changeResetFields), _c = _b.next(); !_c.done; _c = _b.next()) {
241
149
  var resetField = _c.value;
242
150
  this.resetField(resetField, form);
243
151
  }
@@ -251,36 +159,18 @@ var GenericFilterComponent = /** @class */ (function () {
251
159
  }
252
160
  }
253
161
  };
254
- /**
255
- * @return {?}
256
- */
257
- GenericFilterComponent.prototype.cancelFilter = /**
258
- * @return {?}
259
- */
260
- function () {
162
+ GenericFilterComponent.prototype.cancelFilter = function () {
261
163
  this.buildForm(this.config, this.settings, true);
262
164
  if (this.config && this.config.cancelSetting) {
263
165
  this._settings.fields = JSON.parse(JSON.stringify(this.config.cancelSetting.fields));
264
166
  }
265
- /** @type {?} */
266
- var settings = tslib_1.__assign({}, this.settings, { reset: true });
167
+ var settings = __assign(__assign({}, this.settings), { reset: true });
267
168
  this.filterService.persist(settings, this.config.persistence);
268
169
  this.filterService.givenErrors.next(null);
269
170
  this.submitted = false;
270
171
  };
271
- /**
272
- * @param {?} values
273
- * @param {?} field
274
- * @return {?}
275
- */
276
- GenericFilterComponent.prototype.updatePersonControls = /**
277
- * @param {?} values
278
- * @param {?} field
279
- * @return {?}
280
- */
281
- function (values, field) {
172
+ GenericFilterComponent.prototype.updatePersonControls = function (values, field) {
282
173
  var e_2, _a;
283
- /** @type {?} */
284
174
  var keys;
285
175
  if (!values) {
286
176
  keys = Object.keys(this.form.get(field.name).value);
@@ -289,10 +179,9 @@ var GenericFilterComponent = /** @class */ (function () {
289
179
  keys = Object.keys(values);
290
180
  }
291
181
  try {
292
- for (var keys_1 = tslib_1.__values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
182
+ for (var keys_1 = __values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
293
183
  var key = keys_1_1.value;
294
184
  if (this.form.get(field.name) && this.form.get(field.name).get(key)) {
295
- /** @type {?} */
296
185
  var value = values && values[key] ? values[key] : null;
297
186
  this.form.get(field.name).get(key).patchValue(value);
298
187
  }
@@ -306,123 +195,57 @@ var GenericFilterComponent = /** @class */ (function () {
306
195
  finally { if (e_2) throw e_2.error; }
307
196
  }
308
197
  };
309
- /**
310
- * @param {?} event
311
- * @param {?} form
312
- * @param {?} item
313
- * @param {?} field
314
- * @return {?}
315
- */
316
- GenericFilterComponent.prototype.toggleSelectAll = /**
317
- * @param {?} event
318
- * @param {?} form
319
- * @param {?} item
320
- * @param {?} field
321
- * @return {?}
322
- */
323
- function (event, form, item, field) {
324
- /** @type {?} */
198
+ GenericFilterComponent.prototype.toggleSelectAll = function (event, form, item, field) {
325
199
  var isChecked = event.target.checked;
326
- /** @type {?} */
327
- var formArray = (/** @type {?} */ (form.get(field.name)));
200
+ var formArray = form.get(field.name);
328
201
  if (!item.selectAll) {
329
- /** @type {?} */
330
- var allChecked = formArray.controls.every((/**
331
- * @param {?} control
332
- * @return {?}
333
- */
334
- function (control) { return control.value; }));
335
- /** @type {?} */
202
+ var allChecked = formArray.controls.every(function (control) { return control.value; });
336
203
  var index_1 = null;
337
- /** @type {?} */
338
- var hasSelectAllOption = field.options.find((/**
339
- * @param {?} option
340
- * @param {?} i
341
- * @return {?}
342
- */
343
- function (option, i) {
204
+ var hasSelectAllOption = field.options.find(function (option, i) {
344
205
  if (option.hasOwnProperty('selectAll')) {
345
206
  index_1 = i;
346
207
  return true;
347
208
  }
348
209
  return false;
349
- }));
210
+ });
350
211
  // tslint:disable-next-line:variable-name
351
- /** @type {?} */
352
- var isAllCheckedExcludingTheSelectAllOption = formArray.controls.filter((/**
353
- * @param {?} _control
354
- * @param {?} i
355
- * @return {?}
356
- */
357
- function (_control, i) { return i !== index_1; }))
358
- .every((/**
359
- * @param {?} control
360
- * @return {?}
361
- */
362
- function (control) { return control.value; }));
212
+ var isAllCheckedExcludingTheSelectAllOption = formArray.controls.filter(function (_control, i) { return i !== index_1; })
213
+ .every(function (control) { return control.value; });
363
214
  if (!allChecked && hasSelectAllOption && !isChecked) {
364
- formArray.controls.forEach((/**
365
- * @param {?} control
366
- * @param {?} i
367
- * @return {?}
368
- */
369
- function (control, i) {
215
+ formArray.controls.forEach(function (control, i) {
370
216
  if (index_1 === i) {
371
217
  control.patchValue(false);
372
218
  return;
373
219
  }
374
- }));
220
+ });
375
221
  }
376
222
  else if (hasSelectAllOption && !allChecked && isChecked && isAllCheckedExcludingTheSelectAllOption) {
377
223
  formArray.controls[index_1].patchValue(true);
378
224
  }
379
225
  return;
380
226
  }
381
- formArray.controls.forEach((/**
382
- * @param {?} control
383
- * @return {?}
384
- */
385
- function (control) {
227
+ formArray.controls.forEach(function (control) {
386
228
  if (isChecked) {
387
229
  control.patchValue(true);
388
230
  }
389
231
  else {
390
232
  control.patchValue(false);
391
233
  }
392
- }));
234
+ });
393
235
  };
394
- /**
395
- * @private
396
- * @param {?} resetField
397
- * @param {?} form
398
- * @return {?}
399
- */
400
- GenericFilterComponent.prototype.resetField = /**
401
- * @private
402
- * @param {?} resetField
403
- * @param {?} form
404
- * @return {?}
405
- */
406
- function (resetField, form) {
236
+ GenericFilterComponent.prototype.resetField = function (resetField, form) {
407
237
  var e_3, _a;
408
- /** @type {?} */
409
238
  var control = form.get(resetField);
410
- /** @type {?} */
411
- var defaultValue = this.config.cancelSetting.fields.find((/**
412
- * @param {?} f
413
- * @return {?}
414
- */
415
- function (f) { return f.name === resetField; }));
239
+ var defaultValue = this.config.cancelSetting.fields.find(function (f) { return f.name === resetField; });
416
240
  if (control instanceof FormArray) {
417
241
  for (var i = 0; i < control.length; i++) {
418
242
  control.removeAt(i);
419
243
  }
420
244
  }
421
245
  else if (control instanceof FormGroup) {
422
- /** @type {?} */
423
246
  var keys = Object.keys(control.value);
424
247
  try {
425
- for (var keys_2 = tslib_1.__values(keys), keys_2_1 = keys_2.next(); !keys_2_1.done; keys_2_1 = keys_2.next()) {
248
+ for (var keys_2 = __values(keys), keys_2_1 = keys_2.next(); !keys_2_1.done; keys_2_1 = keys_2.next()) {
426
249
  var key = keys_2_1.value;
427
250
  this.resetField(key, control);
428
251
  }
@@ -436,22 +259,11 @@ var GenericFilterComponent = /** @class */ (function () {
436
259
  }
437
260
  }
438
261
  else if (control instanceof FormControl) {
439
- /** @type {?} */
440
262
  var value = defaultValue && defaultValue.value && defaultValue.value.length ? defaultValue.value[0] : null;
441
263
  control.setValue(value);
442
264
  }
443
265
  };
444
- /**
445
- * @private
446
- * @param {?} filter
447
- * @return {?}
448
- */
449
- GenericFilterComponent.prototype.mergeDefaultFields = /**
450
- * @private
451
- * @param {?} filter
452
- * @return {?}
453
- */
454
- function (filter) {
266
+ GenericFilterComponent.prototype.mergeDefaultFields = function (filter) {
455
267
  if (filter) {
456
268
  filter.fields = this.filterService.get(this.config.id) ? this.filterService.get(this.config.id).fields : filter.fields;
457
269
  }
@@ -462,34 +274,11 @@ var GenericFilterComponent = /** @class */ (function () {
462
274
  };
463
275
  }
464
276
  };
465
- /**
466
- * @private
467
- * @return {?}
468
- */
469
- GenericFilterComponent.prototype.getSettings = /**
470
- * @private
471
- * @return {?}
472
- */
473
- function () {
277
+ GenericFilterComponent.prototype.getSettings = function () {
474
278
  this._settings = this.filterService.get(this.config.id);
475
279
  };
476
- /**
477
- * @private
478
- * @param {?} config
479
- * @param {?} settings
480
- * @param {?=} reset
481
- * @return {?}
482
- */
483
- GenericFilterComponent.prototype.buildForm = /**
484
- * @private
485
- * @param {?} config
486
- * @param {?} settings
487
- * @param {?=} reset
488
- * @return {?}
489
- */
490
- function (config, settings, reset) {
280
+ GenericFilterComponent.prototype.buildForm = function (config, settings, reset) {
491
281
  var e_4, _a;
492
- /** @type {?} */
493
282
  var findPersonControl = this.form ? this.form.get('findPersonControl') : null;
494
283
  this.form = this.fb.group({});
495
284
  if (findPersonControl) {
@@ -498,44 +287,29 @@ var GenericFilterComponent = /** @class */ (function () {
498
287
  }
499
288
  var _loop_1 = function (field) {
500
289
  if (field.type === 'checkbox' || field.type === 'checkbox-large') {
501
- /** @type {?} */
502
290
  var formArray = this_1.buildCheckBoxFormArray(field, settings);
503
291
  this_1.form.addControl(field.name, formArray);
504
292
  }
505
293
  else if (field.type === 'find-location') {
506
- /** @type {?} */
507
294
  var formArray = this_1.buildFindLocationFormArray(field, settings);
508
295
  this_1.form.addControl(field.name, formArray);
509
296
  }
510
297
  else {
511
- /** @type {?} */
512
298
  var validators = [];
513
299
  if (field.minSelected && field.minSelected > 0) {
514
300
  validators.push(Validators.required);
515
301
  }
516
- /** @type {?} */
517
302
  var defaultValue = null;
518
303
  if (reset && config.cancelSetting) {
519
- /** @type {?} */
520
- var cancelField = config.cancelSetting.fields.find((/**
521
- * @param {?} f
522
- * @return {?}
523
- */
524
- function (f) { return f.name === field.name; }));
304
+ var cancelField = config.cancelSetting.fields.find(function (f) { return f.name === field.name; });
525
305
  defaultValue = cancelField && cancelField.value ? cancelField.value[0] : '';
526
306
  }
527
307
  else if (settings && settings.fields) {
528
- /** @type {?} */
529
- var lastSavedValue = settings.fields.find((/**
530
- * @param {?} f
531
- * @return {?}
532
- */
533
- function (f) { return f.name === field.name; }));
308
+ var lastSavedValue = settings.fields.find(function (f) { return f.name === field.name; });
534
309
  defaultValue = lastSavedValue && lastSavedValue ? lastSavedValue.value[0] : '';
535
310
  }
536
311
  // if field is find-person build a form group;
537
312
  if (field.type === 'find-person') {
538
- /** @type {?} */
539
313
  var formGroup = new FormGroup({
540
314
  domain: new FormControl(''),
541
315
  email: new FormControl(defaultValue && defaultValue.hasOwnProperty('email') ? defaultValue.email : '', validators),
@@ -546,7 +320,6 @@ var GenericFilterComponent = /** @class */ (function () {
546
320
  this_1.form.addControl(field.name, formGroup);
547
321
  }
548
322
  else {
549
- /** @type {?} */
550
323
  var control = new FormControl(defaultValue, validators);
551
324
  this_1.form.addControl(field.name, control);
552
325
  }
@@ -558,7 +331,7 @@ var GenericFilterComponent = /** @class */ (function () {
558
331
  };
559
332
  var this_1 = this;
560
333
  try {
561
- for (var _b = tslib_1.__values(config.fields), _c = _b.next(); !_c.done; _c = _b.next()) {
334
+ for (var _b = __values(config.fields), _c = _b.next(); !_c.done; _c = _b.next()) {
562
335
  var field = _c.value;
563
336
  _loop_1(field);
564
337
  }
@@ -571,47 +344,23 @@ var GenericFilterComponent = /** @class */ (function () {
571
344
  finally { if (e_4) throw e_4.error; }
572
345
  }
573
346
  };
574
- /**
575
- * @private
576
- * @param {?} field
577
- * @param {?} settings
578
- * @return {?}
579
- */
580
- GenericFilterComponent.prototype.buildCheckBoxFormArray = /**
581
- * @private
582
- * @param {?} field
583
- * @param {?} settings
584
- * @return {?}
585
- */
586
- function (field, settings) {
347
+ GenericFilterComponent.prototype.buildCheckBoxFormArray = function (field, settings) {
587
348
  var e_5, _a;
588
- /** @type {?} */
589
- var validators = GenericFilterComponent.addFormValidators(field);
590
- /** @type {?} */
349
+ var validators = GenericFilterComponent_1.addFormValidators(field);
591
350
  var formArray = this.fb.array([], validators);
592
- /** @type {?} */
593
351
  var defaultValues;
594
352
  if (settings && settings.fields) {
595
- defaultValues = settings.fields.find((/**
596
- * @param {?} f
597
- * @return {?}
598
- */
599
- function (f) { return f.name === field.name; }));
353
+ defaultValues = settings.fields.find(function (f) { return f.name === field.name; });
600
354
  }
601
355
  var _loop_2 = function (option) {
602
- /** @type {?} */
603
356
  var checked = false;
604
357
  if (defaultValues && Array.isArray(defaultValues.value)) {
605
- checked = !!defaultValues.value.find((/**
606
- * @param {?} value
607
- * @return {?}
608
- */
609
- function (value) { return value === option.key; }));
358
+ checked = !!defaultValues.value.find(function (value) { return value === option.key; });
610
359
  }
611
360
  formArray.push(new FormControl(checked));
612
361
  };
613
362
  try {
614
- for (var _b = tslib_1.__values(field.options), _c = _b.next(); !_c.done; _c = _b.next()) {
363
+ for (var _b = __values(field.options), _c = _b.next(); !_c.done; _c = _b.next()) {
615
364
  var option = _c.value;
616
365
  _loop_2(option);
617
366
  }
@@ -625,35 +374,16 @@ var GenericFilterComponent = /** @class */ (function () {
625
374
  }
626
375
  return formArray;
627
376
  };
628
- /**
629
- * @private
630
- * @param {?} field
631
- * @param {?} settings
632
- * @return {?}
633
- */
634
- GenericFilterComponent.prototype.buildFindLocationFormArray = /**
635
- * @private
636
- * @param {?} field
637
- * @param {?} settings
638
- * @return {?}
639
- */
640
- function (field, settings) {
377
+ GenericFilterComponent.prototype.buildFindLocationFormArray = function (field, settings) {
641
378
  var e_6, _a;
642
- /** @type {?} */
643
- var validators = GenericFilterComponent.addFormValidators(field);
644
- /** @type {?} */
379
+ var validators = GenericFilterComponent_1.addFormValidators(field);
645
380
  var formArray = this.fb.array([], validators);
646
- /** @type {?} */
647
381
  var defaultValues;
648
382
  if (settings && settings.fields) {
649
- defaultValues = settings.fields.find((/**
650
- * @param {?} f
651
- * @return {?}
652
- */
653
- function (f) { return f.name === field.name; }));
383
+ defaultValues = settings.fields.find(function (f) { return f.name === field.name; });
654
384
  if (defaultValues) {
655
385
  try {
656
- for (var _b = tslib_1.__values(defaultValues.value), _c = _b.next(); !_c.done; _c = _b.next()) {
386
+ for (var _b = __values(defaultValues.value), _c = _b.next(); !_c.done; _c = _b.next()) {
657
387
  var defaultValue = _c.value;
658
388
  formArray.push(new FormControl(defaultValue));
659
389
  }
@@ -669,33 +399,11 @@ var GenericFilterComponent = /** @class */ (function () {
669
399
  }
670
400
  return formArray;
671
401
  };
672
- /**
673
- * @private
674
- * @param {?} formValues
675
- * @param {?} config
676
- * @return {?}
677
- */
678
- GenericFilterComponent.prototype.getSelectedValues = /**
679
- * @private
680
- * @param {?} formValues
681
- * @param {?} config
682
- * @return {?}
683
- */
684
- function (formValues, config) {
685
- return Object.keys(formValues).map((/**
686
- * @param {?} name
687
- * @return {?}
688
- */
689
- function (name) {
690
- /** @type {?} */
402
+ GenericFilterComponent.prototype.getSelectedValues = function (formValues, config) {
403
+ return Object.keys(formValues).map(function (name) {
691
404
  var values = formValues[name];
692
405
  if (Array.isArray(values)) {
693
- /** @type {?} */
694
- var field = config.fields.find((/**
695
- * @param {?} f
696
- * @return {?}
697
- */
698
- function (f) { return f.name === name; }));
406
+ var field = config.fields.find(function (f) { return f.name === name; });
699
407
  if (field.type === 'find-location') {
700
408
  return { value: values, name: name };
701
409
  }
@@ -706,26 +414,14 @@ var GenericFilterComponent = /** @class */ (function () {
706
414
  else {
707
415
  return { value: [values], name: name };
708
416
  }
709
- }));
417
+ });
710
418
  };
711
- /**
712
- * @private
713
- * @param {?} form
714
- * @return {?}
715
- */
716
- GenericFilterComponent.prototype.emitFormErrors = /**
717
- * @private
718
- * @param {?} form
719
- * @return {?}
720
- */
721
- function (form) {
419
+ GenericFilterComponent.prototype.emitFormErrors = function (form) {
722
420
  var e_7, _a;
723
- /** @type {?} */
724
421
  var errors = [];
725
422
  try {
726
- for (var _b = tslib_1.__values(this.config.fields), _c = _b.next(); !_c.done; _c = _b.next()) {
423
+ for (var _b = __values(this.config.fields), _c = _b.next(); !_c.done; _c = _b.next()) {
727
424
  var field = _c.value;
728
- /** @type {?} */
729
425
  var formGroup = form.get(field.name);
730
426
  if (formGroup && formGroup.errors && formGroup.errors.minLength) {
731
427
  errors.push({ name: field.name, error: field.minSelectedError });
@@ -746,53 +442,32 @@ var GenericFilterComponent = /** @class */ (function () {
746
442
  this.filterService.givenErrors.next(errors);
747
443
  }
748
444
  };
749
- GenericFilterComponent.decorators = [
750
- { type: Component, args: [{
751
- selector: 'xuilib-generic-filter',
752
- template: "<form [formGroup]=\"form\" (ngSubmit)=\"applyFilter(form)\">\n <div class=\"contain-classes\" *ngFor=\"let field of config.fields\">\n <hr *ngIf=\"field.lineBreakBefore\" class=\"govuk-section-break govuk-section-break--visible elevated-break\">\n <div class=\"govuk-form-group xui-generic-filter\"\n [hidden]=\"hidden(field, form)\"\n [id]=\"field.name\"\n [ngClass]=\"{'form-group-error': submitted && (form.get(field.name).errors?.minLength || form.get(field.name).errors?.maxLength)}\">\n <h3 *ngIf=\"field.title\" class=\"govuk-heading-s\">{{field.title}}</h3>\n <p class=\"govuk-body\" *ngIf=\"field.subTitle\">{{field.subTitle}}</p>\n <span [id]=\"field.name + '-error'\" class=\"govuk-error-message\" *ngIf=\"field.displayMinSelectedError && submitted && form.get(field.name).errors?.minLength\">\n <span class=\"govuk-visually-hidden\">Error:</span> {{field.minSelectedError}}\n </span>\n <span [id]=\"field.name + '-error'\" class=\"govuk-error-message\" *ngIf=\"field.displayMaxSelectedError && submitted && form.get(field.name).errors?.maxLength\">\n <span class=\"govuk-visually-hidden\">Error:</span> {{field.maxSelectedError}}\n </span>\n <div class=\"govuk-body\" [ngSwitch]=\"field.type\">\n <ng-container *ngSwitchCase=\"'select'\">\n <select class=\"govuk-select\" (change)=\"fieldChanged(field, form)\" [attr.disabled]=\"disabled(field, form)\" [name]=\"'select_' + field.name\" [id]=\"'select_' + field.name\" [formControlName]=\"field.name\">\n <option disabled selected hidden value=\"\">{{field.disabledText}}</option>\n <option class=\"govuk-radios__item\" *ngFor=\"let item of field.options\" [value]=\"item.key\">{{item.label}}</option>\n </select>\n </ng-container>\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <div class=\"govuk-checkboxes govuk-checkboxes--small\" [formGroupName]=\"field.name\" [attr.field]=\"field.name\" [id]=\"'checkbox_' + field.name\">\n <div *ngFor=\"let item of field.options; let i = index\" class=\"govuk-checkboxes__item\">\n <input type=\"checkbox\" class=\"govuk-checkboxes__input\"\n [attr.disabled]=\"disabled(field, form)\"\n [formControlName]=\"i\"\n (change)=\"toggleSelectAll($event, form, item, field)\"\n [value]=\"item.key\" [id]=\"'checkbox_' + item.key\"\n [name]=\"'checkbox_' + item.key\"\n />\n <label\n [for]=\"'checkbox_' + item.key\"\n class=\"govuk-label govuk-checkboxes__label\"\n [ngClass]=\"{'govuk-!-font-weight-bold': item.selectAll}\"\n >{{item.label}}</label>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'checkbox-large'\">\n <div class=\"govuk-checkboxes\" [formGroupName]=\"field.name\" [attr.field]=\"field.name\" [id]=\"'checkbox_' + field.name\">\n <div *ngFor=\"let item of field.options; let i = index\" class=\"govuk-checkboxes__item\">\n <input type=\"checkbox\" class=\"govuk-checkboxes__input\"\n [attr.disabled]=\"disabled(field, form)\"\n [formControlName]=\"i\"\n (change)=\"toggleSelectAll($event, form, item, field)\"\n [value]=\"item.key\" [id]=\"'checkbox_' + item.key\"\n [name]=\"'checkbox_' + item.key\"\n />\n <label\n [for]=\"'checkbox_' + item.key\"\n class=\"govuk-label govuk-checkboxes__label\"\n [ngClass]=\"{'govuk-!-font-weight-bold': item.selectAll}\"\n >{{item.label}}</label>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'radio'\">\n <div class=\"govuk-radios\">\n <div *ngFor=\"let item of field.options\" class=\"govuk-radios__item\">\n <input type=\"radio\"\n [formControlName]=\"field.name\"\n [id]=\"'radio_' + item.key\"\n [attr.disabled]=\"disabled(field, form)\"\n [checked]=\"item.key === form.get(field.name).value\"\n class=\"govuk-radios__input\"\n [value]=\"item.key\"\n (change)=\"fieldChanged(field, form)\"\n />\n <label [for]=\"'radio_' + item.key\" class=\"govuk-label govuk-radios__label\">{{item.label}}</label>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'find-person'\">\n <xuilib-find-person subTitle=\"\" (personSelected)=\"updatePersonControls($event, field)\"\n [submitted]=\"submitted\"\n [disabled]=\"disabled(field, form)\"\n [domain]=\"form.get(field.domainField)?.value\"\n [findPersonGroup]=\"form\"\n [selectedPerson]=\"form.get(field.name)?.value?.email\"\n [userIncluded]=\"false\"\n ></xuilib-find-person>\n </ng-container>\n <ng-container *ngSwitchCase=\"'find-location'\">\n <xuilib-find-location [form]=\"form\"\n [fields]=\"config.fields\"\n [locationTitle]=\"field.locationTitle\"\n [enableAddLocationButton]=\"field.enableAddLocationButton\"\n [disabled]=\"disabled(field, form)\"\n [selectedLocations]=\"form.get(field.name)?.value\"\n [submitted]=\"submitted\"\n [services]=\"form.get(field.findLocationField)?.value\"\n [field]=\"field\"\n ></xuilib-find-location>\n </ng-container>\n </div>\n </div>\n </div>\n <hr class=\"govuk-section-break govuk-section-break--m govuk-section-break--visible\"/>\n <div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-full\">\n <button\n class=\"govuk-button govuk-!-margin-right-1 govuk-!-margin-bottom-0\"\n type=\"submit\"\n id=\"applyFilter\"\n [disabled]=\"config.enableDisabledButton && form.invalid\"\n >{{config.applyButtonText || 'Apply'}}</button>\n <button *ngIf=\"config.showCancelFilterButton\"\n class=\"govuk-button govuk-button--secondary govuk-!-margin-bottom-0\"\n type=\"button\"\n id=\"cancelFilter\"\n (click)=\"cancelFilter()\">{{ config.cancelButtonText || 'Cancel'}}</button>\n </div>\n </div>\n</form>\n",
753
- changeDetection: ChangeDetectionStrategy.OnPush,
754
- encapsulation: ViewEncapsulation.None,
755
- styles: [".contain-classes .elevated-break{position:relative;top:-10px}.contain-classes .xui-generic-filter .select-all{margin-bottom:10px}.contain-classes .xui-generic-filter .govuk-checkboxes{display:flex;flex-wrap:wrap}.contain-classes .xui-generic-filter .govuk-checkboxes>div{flex-grow:1;flex-shrink:0}"]
756
- }] }
757
- ];
758
- /** @nocollapse */
445
+ var GenericFilterComponent_1;
759
446
  GenericFilterComponent.ctorParameters = function () { return [
760
447
  { type: FilterService },
761
448
  { type: FormBuilder }
762
449
  ]; };
763
- GenericFilterComponent.propDecorators = {
764
- config: [{ type: Input }],
765
- settings: [{ type: Input }]
766
- };
450
+ __decorate([
451
+ Input(),
452
+ __metadata("design:type", Object),
453
+ __metadata("design:paramtypes", [Object])
454
+ ], GenericFilterComponent.prototype, "config", null);
455
+ __decorate([
456
+ Input(),
457
+ __metadata("design:type", Object),
458
+ __metadata("design:paramtypes", [Object])
459
+ ], GenericFilterComponent.prototype, "settings", null);
460
+ GenericFilterComponent = GenericFilterComponent_1 = __decorate([
461
+ Component({
462
+ selector: 'xuilib-generic-filter',
463
+ template: "<form [formGroup]=\"form\" (ngSubmit)=\"applyFilter(form)\">\n <div class=\"contain-classes\" *ngFor=\"let field of config.fields\">\n <hr *ngIf=\"field.lineBreakBefore\" class=\"govuk-section-break govuk-section-break--visible elevated-break\">\n <div class=\"govuk-form-group xui-generic-filter\"\n [hidden]=\"hidden(field, form)\"\n [id]=\"field.name\"\n [ngClass]=\"{'form-group-error': submitted && (form.get(field.name).errors?.minLength || form.get(field.name).errors?.maxLength)}\">\n <h3 *ngIf=\"field.title\" class=\"govuk-heading-s\">{{field.title}}</h3>\n <p class=\"govuk-body\" *ngIf=\"field.subTitle\">{{field.subTitle}}</p>\n <span [id]=\"field.name + '-error'\" class=\"govuk-error-message\" *ngIf=\"field.displayMinSelectedError && submitted && form.get(field.name).errors?.minLength\">\n <span class=\"govuk-visually-hidden\">Error:</span> {{field.minSelectedError}}\n </span>\n <span [id]=\"field.name + '-error'\" class=\"govuk-error-message\" *ngIf=\"field.displayMaxSelectedError && submitted && form.get(field.name).errors?.maxLength\">\n <span class=\"govuk-visually-hidden\">Error:</span> {{field.maxSelectedError}}\n </span>\n <div class=\"govuk-body\" [ngSwitch]=\"field.type\">\n <ng-container *ngSwitchCase=\"'select'\">\n <select class=\"govuk-select\" (change)=\"fieldChanged(field, form)\" [attr.disabled]=\"disabled(field, form)\" [name]=\"'select_' + field.name\" [id]=\"'select_' + field.name\" [formControlName]=\"field.name\">\n <option disabled selected hidden value=\"\">{{field.disabledText}}</option>\n <option class=\"govuk-radios__item\" *ngFor=\"let item of field.options\" [value]=\"item.key\">{{item.label}}</option>\n </select>\n </ng-container>\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <div class=\"govuk-checkboxes govuk-checkboxes--small\" [formGroupName]=\"field.name\" [attr.field]=\"field.name\" [id]=\"'checkbox_' + field.name\">\n <div *ngFor=\"let item of field.options; let i = index\" class=\"govuk-checkboxes__item\">\n <input type=\"checkbox\" class=\"govuk-checkboxes__input\"\n [attr.disabled]=\"disabled(field, form)\"\n [formControlName]=\"i\"\n (change)=\"toggleSelectAll($event, form, item, field)\"\n [value]=\"item.key\" [id]=\"'checkbox_' + item.key\"\n [name]=\"'checkbox_' + item.key\"\n />\n <label\n [for]=\"'checkbox_' + item.key\"\n class=\"govuk-label govuk-checkboxes__label\"\n [ngClass]=\"{'govuk-!-font-weight-bold': item.selectAll}\"\n >{{item.label}}</label>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'checkbox-large'\">\n <div class=\"govuk-checkboxes\" [formGroupName]=\"field.name\" [attr.field]=\"field.name\" [id]=\"'checkbox_' + field.name\">\n <div *ngFor=\"let item of field.options; let i = index\" class=\"govuk-checkboxes__item\">\n <input type=\"checkbox\" class=\"govuk-checkboxes__input\"\n [attr.disabled]=\"disabled(field, form)\"\n [formControlName]=\"i\"\n (change)=\"toggleSelectAll($event, form, item, field)\"\n [value]=\"item.key\" [id]=\"'checkbox_' + item.key\"\n [name]=\"'checkbox_' + item.key\"\n />\n <label\n [for]=\"'checkbox_' + item.key\"\n class=\"govuk-label govuk-checkboxes__label\"\n [ngClass]=\"{'govuk-!-font-weight-bold': item.selectAll}\"\n >{{item.label}}</label>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'radio'\">\n <div class=\"govuk-radios\">\n <div *ngFor=\"let item of field.options\" class=\"govuk-radios__item\">\n <input type=\"radio\"\n [formControlName]=\"field.name\"\n [id]=\"'radio_' + item.key\"\n [attr.disabled]=\"disabled(field, form)\"\n [checked]=\"item.key === form.get(field.name).value\"\n class=\"govuk-radios__input\"\n [value]=\"item.key\"\n (change)=\"fieldChanged(field, form)\"\n />\n <label [for]=\"'radio_' + item.key\" class=\"govuk-label govuk-radios__label\">{{item.label}}</label>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'find-person'\">\n <xuilib-find-person subTitle=\"\" (personSelected)=\"updatePersonControls($event, field)\"\n [submitted]=\"submitted\"\n [disabled]=\"disabled(field, form)\"\n [domain]=\"form.get(field.domainField)?.value\"\n [findPersonGroup]=\"form\"\n [selectedPerson]=\"form.get(field.name)?.value?.email\"\n [userIncluded]=\"false\"\n ></xuilib-find-person>\n </ng-container>\n <ng-container *ngSwitchCase=\"'find-location'\">\n <xuilib-find-location [form]=\"form\"\n [fields]=\"config.fields\"\n [locationTitle]=\"field.locationTitle\"\n [enableAddLocationButton]=\"field.enableAddLocationButton\"\n [disabled]=\"disabled(field, form)\"\n [selectedLocations]=\"form.get(field.name)?.value\"\n [submitted]=\"submitted\"\n [services]=\"form.get(field.findLocationField)?.value\"\n [field]=\"field\"\n ></xuilib-find-location>\n </ng-container>\n </div>\n </div>\n </div>\n <hr class=\"govuk-section-break govuk-section-break--m govuk-section-break--visible\"/>\n <div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-full\">\n <button\n class=\"govuk-button govuk-!-margin-right-1 govuk-!-margin-bottom-0\"\n type=\"submit\"\n id=\"applyFilter\"\n [disabled]=\"config.enableDisabledButton && form.invalid\"\n >{{config.applyButtonText || 'Apply'}}</button>\n <button *ngIf=\"config.showCancelFilterButton\"\n class=\"govuk-button govuk-button--secondary govuk-!-margin-bottom-0\"\n type=\"button\"\n id=\"cancelFilter\"\n (click)=\"cancelFilter()\">{{ config.cancelButtonText || 'Cancel'}}</button>\n </div>\n </div>\n</form>\n",
464
+ changeDetection: ChangeDetectionStrategy.OnPush,
465
+ encapsulation: ViewEncapsulation.None,
466
+ styles: [".contain-classes .elevated-break{position:relative;top:-10px}.contain-classes .xui-generic-filter .select-all{margin-bottom:10px}.contain-classes .xui-generic-filter .govuk-checkboxes{display:flex;flex-wrap:wrap}.contain-classes .xui-generic-filter .govuk-checkboxes>div{flex-grow:1;flex-shrink:0}"]
467
+ }),
468
+ __metadata("design:paramtypes", [FilterService, FormBuilder])
469
+ ], GenericFilterComponent);
767
470
  return GenericFilterComponent;
768
471
  }());
769
472
  export { GenericFilterComponent };
770
- if (false) {
771
- /** @type {?} */
772
- GenericFilterComponent.prototype.form;
773
- /** @type {?} */
774
- GenericFilterComponent.prototype.submitted;
775
- /** @type {?} */
776
- GenericFilterComponent.prototype.formSub;
777
- /**
778
- * @type {?}
779
- * @private
780
- */
781
- GenericFilterComponent.prototype._config;
782
- /**
783
- * @type {?}
784
- * @private
785
- */
786
- GenericFilterComponent.prototype._settings;
787
- /**
788
- * @type {?}
789
- * @private
790
- */
791
- GenericFilterComponent.prototype.filterService;
792
- /**
793
- * @type {?}
794
- * @private
795
- */
796
- GenericFilterComponent.prototype.fb;
797
- }
798
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhtY3RzL3JweC14dWktY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2dlbmVyaWMtZmlsdGVyL2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsaUJBQWlCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUcsT0FBTyxFQUFrQixTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQWUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEgsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sRUFBQyxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU3RjtJQVlFLGdDQUE2QixhQUE0QixFQUFtQixFQUFlO1FBQTlELGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQW1CLE9BQUUsR0FBRixFQUFFLENBQWE7UUFIcEYsY0FBUyxHQUFHLEtBQUssQ0FBQztJQUl6QixDQUFDO0lBS0Qsc0JBQVcsMENBQU07Ozs7UUFBakI7WUFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdEIsQ0FBQzs7Ozs7UUFFRCxVQUNrQixLQUFtQjtZQUNuQyxJQUFJLENBQUMsT0FBTyx3QkFDUCxLQUFLLElBQ1IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRzs7OztnQkFBQyxVQUFBLEtBQUssSUFBSSxPQUFBLHNCQUM3QixLQUFLLElBQ1IsdUJBQXVCLEVBQUUsS0FBSyxFQUM5Qix1QkFBdUIsRUFBRSxLQUFLLElBQzlCLEVBSmdDLENBSWhDLEVBQUMsR0FDSixDQUFDO1lBQ0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFL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QUFLLENBQUMsZ0JBQWdCLEVBQUMsQ0FBQyxDQUFDO2lCQUNoRTtnQkFDRCxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO29CQUMvRCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsRUFBQyxDQUFDLENBQUM7aUJBQ2hFO2FBQ0Y7Ozs7Ozs7OztRQUNELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0M7SUFDSCxDQUFDOztnQkFyWEYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSx1QkFBdUI7b0JBQ2pDLHN0TkFBNEM7b0JBRTVDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTs7aUJBQ3RDOzs7O2dCQVRPLGFBQWE7Z0JBSGUsV0FBVzs7O3lCQTRCNUMsS0FBSzsyQkFvQkwsS0FBSzs7SUE0VVIsNkJBQUM7Q0FBQSxBQXRYRCxJQXNYQztTQS9XWSxzQkFBc0I7OztJQUNqQyxzQ0FBdUI7O0lBQ3ZCLDJDQUF5Qjs7SUFDekIseUNBQTZCOzs7OztJQU03Qix5Q0FBOEI7Ozs7O0lBb0I5QiwyQ0FBa0M7Ozs7O0lBeEJ0QiwrQ0FBNkM7Ozs7O0lBQUUsb0NBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtGaWx0ZXJDb25maWcsIEZpbHRlckVycm9yLCBGaWx0ZXJGaWVsZENvbmZpZywgRmlsdGVyU2V0dGluZ30gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7RmlsdGVyU2VydmljZX0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9maWx0ZXIvZmlsdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtnZXRWYWx1ZXMsIG1heFNlbGVjdGVkVmFsaWRhdG9yLCBtaW5TZWxlY3RlZFZhbGlkYXRvcn0gZnJvbSAnLi9nZW5lcmljLWZpbHRlci11dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3h1aWxpYi1nZW5lcmljLWZpbHRlcicsXG4gIHRlbXBsYXRlVXJsOiAnZ2VuZXJpYy1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnZ2VuZXJpYy1maWx0ZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgR2VuZXJpY0ZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcbiAgcHVibGljIHN1Ym1pdHRlZCA9IGZhbHNlO1xuICBwdWJsaWMgZm9ybVN1YjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSwgcHJpdmF0ZSByZWFkb25seSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIHByaXZhdGUgX2NvbmZpZzogRmlsdGVyQ29uZmlnO1xuXG4gIHB1YmxpYyBnZXQgY29uZmlnKCk6IEZpbHRlckNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgY29uZmlnKHZhbHVlOiBGaWx0ZXJDb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSB7XG4gICAgICAuLi52YWx1ZSxcbiAgICAgIGZpZWxkczogdmFsdWUuZmllbGRzLm1hcChmaWVsZCA9PiAoe1xuICAgICAgICAuLi5maWVsZCxcbiAgICAgICAgZGlzcGxheU1pblNlbGVjdGVkRXJyb3I6IGZhbHNlLFxuICAgICAgICBkaXNwbGF5TWF4U2VsZWN0ZWRFcnJvcjogZmFsc2UsXG4gICAgICB9KSlcbiAgICB9O1xuICAgIHRoaXMuX2NvbmZpZyA9IHZhbHVlO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgcHJpdmF0ZSBfc2V0dGluZ3M/OiBGaWx0ZXJTZXR0aW5nO1xuXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3MoKTogRmlsdGVyU2V0dGluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZXR0aW5ncyh2YWx1ZTogRmlsdGVyU2V0dGluZykge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLmZpZWxkcykge1xuICAgICAgdGhpcy5tZXJnZURlZmF1bHRGaWVsZHModmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLl9zZXR0aW5ncyA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYWRkRm9ybVZhbGlkYXRvcnMoZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnKTogVmFsaWRhdG9ycyB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IFtdO1xuICAgIGlmIChmaWVsZCAmJiBmaWVsZC5taW5TZWxlY3RlZCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKG1pblNlbGVjdGVkVmFsaWRhdG9yKGZpZWxkLm1pblNlbGVjdGVkKSk7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkICYmIGZpZWxkLm1heFNlbGVjdGVkKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2gobWF4U2VsZWN0ZWRWYWxpZGF0b3IoZmllbGQubWF4U2VsZWN0ZWQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvcnM7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzKSB7XG4gICAgICB0aGlzLmdldFNldHRpbmdzKCk7XG4gICAgfVxuICAgIHRoaXMubWVyZ2VEZWZhdWx0RmllbGRzKHRoaXMuc2V0dGluZ3MpO1xuICAgIHRoaXMuYnVpbGRGb3JtKHRoaXMuY29uZmlnLCB0aGlzLnNldHRpbmdzKTtcbiAgICB0aGlzLmZvcm1TdWIgPSB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb3JtU3ViKSB7XG4gICAgICB0aGlzLmZvcm1TdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGlkZGVuKGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZywgZm9ybTogRm9ybUdyb3VwKTogYm9vbGVhbiB7XG4gICAgaWYgKCFmaWVsZC5zaG93Q29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZmllbGQuc2hvd0NvbmRpdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmdldChmaWVsZC5uYW1lKSBhcyBGb3JtQ29udHJvbDtcbiAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBmaWVsZC5zaG93Q29uZGl0aW9uLnNwbGl0KCc9Jyk7XG4gICAgICBpZiAoZm9ybS52YWx1ZSAmJiBmb3JtLnZhbHVlW25hbWVdID09PSB2YWx1ZSkge1xuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtcGVyc29uJykge1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtcGVyc29uJykge1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIGRpc2FibGVkKGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZywgZm9ybTogRm9ybUdyb3VwKTogYm9vbGVhbiB7XG4gICAgaWYgKCFmaWVsZC5lbmFibGVDb25kaXRpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGZpZWxkLmVuYWJsZUNvbmRpdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmdldChmaWVsZC5uYW1lKSBhcyBGb3JtQ29udHJvbDtcbiAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBmaWVsZC5lbmFibGVDb25kaXRpb24uc3BsaXQoJz0nKTtcbiAgICAgIGlmIChmb3JtLnZhbHVlICYmIGZvcm0udmFsdWVbbmFtZV0gPT09IHZhbHVlKSB7XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1wZXJzb24nKSB7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaW5kLXBlcnNvbicpIHtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlcihmb3JtOiBGb3JtR3JvdXApOiB2b2lkIHtcbiAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWU7XG4gICAgZm9ybS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgaWYgKGZvcm0udmFsaWQpIHtcbiAgICAgIHRoaXMuX3NldHRpbmdzID0ge1xuICAgICAgICBpZDogdGhpcy5jb25maWcuaWQsXG4gICAgICAgIGZpZWxkczogdGhpcy5nZXRTZWxlY3RlZFZhbHVlcyhmb3JtLnZhbHVlLCB0aGlzLmNvbmZpZylcbiAgICAgIH07XG4gICAgICB0aGlzLmZpbHRlclNlcnZpY2UuZ2l2ZW5FcnJvcnMubmV4dChudWxsKTtcbiAgICAgIGNvbnN0IHNldHRpbmdzID0gey4uLnRoaXMuc2V0dGluZ3MsIHJlc2V0OiBmYWxzZX07XG4gICAgICB0aGlzLmZpbHRlclNlcnZpY2UucGVyc2lzdChzZXR0aW5ncywgdGhpcy5jb25maWcucGVyc2lzdGVuY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXRGb3JtRXJyb3JzKGZvcm0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIHdoZW4gZG9tYWluIGNoYW5nZXMgZW5zdXJlIHRoYXQgcGVyc29uIGZpZWxkIGlzIHJlc2V0XG4gIHB1YmxpYyBmaWVsZENoYW5nZWQoZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnLCBmb3JtOiBGb3JtR3JvdXApOiB2b2lkIHtcbiAgICAvLyBUT0RPIC0gRG8gc2ltaWxhciB3aXRoIGp1cmlzZGljdGlvbi9zZXJ2aWNlIGZvciBjYXNld29ya2VycyBieSBzZXJ2aWNlc1xuICAgIGlmIChmaWVsZC5jaGFuZ2VSZXNldEZpZWxkcyAmJiBmaWVsZC5jaGFuZ2VSZXNldEZpZWxkcy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgcmVzZXRGaWVsZCBvZiBmaWVsZC5jaGFuZ2VSZXNldEZpZWxkcykge1xuICAgICAgICB0aGlzLnJlc2V0RmllbGQocmVzZXRGaWVsZCwgZm9ybSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbmNlbEZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1aWxkRm9ybSh0aGlzLmNvbmZpZywgdGhpcy5zZXR0aW5ncywgdHJ1ZSk7XG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmNhbmNlbFNldHRpbmcpIHtcbiAgICAgIHRoaXMuX3NldHRpbmdzLmZpZWxkcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcuY2FuY2VsU2V0dGluZy5maWVsZHMpKTtcbiAgICB9XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB7Li4udGhpcy5zZXR0aW5ncywgcmVzZXQ6IHRydWV9O1xuICAgIHRoaXMuZmlsdGVyU2VydmljZS5wZXJzaXN0KHNldHRpbmdzLCB0aGlzLmNvbmZpZy5wZXJzaXN0ZW5jZSk7XG4gICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmdpdmVuRXJyb3JzLm5leHQobnVsbCk7XG4gICAgdGhpcy5zdWJtaXR0ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVQZXJzb25Db250cm9scyh2YWx1ZXM6IGFueSwgZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnKTogdm9pZCB7XG4gICAgbGV0IGtleXM7XG4gICAgaWYgKCF2YWx1ZXMpIHtcbiAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmZvcm0uZ2V0KGZpZWxkLm5hbWUpLnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmICh0aGlzLmZvcm0uZ2V0KGZpZWxkLm5hbWUpICYmIHRoaXMuZm9ybS5nZXQoZmllbGQubmFtZSkuZ2V0KGtleSkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXMgJiYgdmFsdWVzW2tleV0gPyB2YWx1ZXNba2V5XSA6IG51bGw7XG4gICAgICAgIHRoaXMuZm9ybS5nZXQoZmllbGQubmFtZSkuZ2V0KGtleSkucGF0Y2hWYWx1ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvZ2dsZVNlbGVjdEFsbChldmVudDogYW55LCBmb3JtOiBGb3JtR3JvdXAsIGl0ZW06IHsga2V5OiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHNlbGVjdEFsbD86IHRydWUgfSwgZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnKTogdm9pZCB7XG4gICAgY29uc3QgaXNDaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XG4gICAgY29uc3QgZm9ybUFycmF5OiBGb3JtQXJyYXkgPSBmb3JtLmdldChmaWVsZC5uYW1lKSBhcyBGb3JtQXJyYXk7XG4gICAgaWYgKCFpdGVtLnNlbGVjdEFsbCkge1xuICAgICAgY29uc3QgYWxsQ2hlY2tlZCA9IGZvcm1BcnJheS5jb250cm9scy5ldmVyeSgoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBjb250cm9sLnZhbHVlKTtcbiAgICAgIGxldCBpbmRleDogbnVtYmVyID0gbnVsbDtcbiAgICAgIGNvbnN0IGhhc1NlbGVjdEFsbE9wdGlvbiA9IGZpZWxkLm9wdGlvbnMuZmluZCgob3B0aW9uLCBpKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb24uaGFzT3duUHJvcGVydHkoJ3NlbGVjdEFsbCcpKSB7XG4gICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgICAgIGNvbnN0IGlzQWxsQ2hlY2tlZEV4Y2x1ZGluZ1RoZVNlbGVjdEFsbE9wdGlvbiA9IGZvcm1BcnJheS5jb250cm9scy5maWx0ZXIoKF9jb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIGk6IG51bWJlcikgPT4gaSAhPT0gaW5kZXgpXG4gICAgICAgIC5ldmVyeSgoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBjb250cm9sLnZhbHVlKTtcblxuICAgICAgaWYgKCFhbGxDaGVja2VkICYmIGhhc1NlbGVjdEFsbE9wdGlvbiAmJiAhaXNDaGVja2VkKSB7XG4gICAgICAgIGZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGlmIChpbmRleCA9PT0gaSkge1xuICAgICAgICAgICAgY29udHJvbC5wYXRjaFZhbHVlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChoYXNTZWxlY3RBbGxPcHRpb24gJiYgIWFsbENoZWNrZWQgJiYgaXNDaGVja2VkICYmIGlzQWxsQ2hlY2tlZEV4Y2x1ZGluZ1RoZVNlbGVjdEFsbE9wdGlvbikge1xuICAgICAgICBmb3JtQXJyYXkuY29udHJvbHNbaW5kZXhdLnBhdGNoVmFsdWUodHJ1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgIGlmIChpc0NoZWNrZWQpIHtcbiAgICAgICAgY29udHJvbC5wYXRjaFZhbHVlKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udHJvbC5wYXRjaFZhbHVlKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGaWVsZChyZXNldEZpZWxkOiBzdHJpbmcsIGZvcm06IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmdldChyZXNldEZpZWxkKTtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWU6IHsgbmFtZTogc3RyaW5nLCB2YWx1ZTogYW55W10gfSA9IHRoaXMuY29uZmlnLmNhbmNlbFNldHRpbmcuZmllbGRzLmZpbmQoKGYpID0+IGYubmFtZSA9PT0gcmVzZXRGaWVsZCk7XG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb250cm9sLnJlbW92ZUF0KGkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvbnRyb2wudmFsdWUpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICB0aGlzLnJlc2V0RmllbGQoa2V5LCBjb250cm9sKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xuICAgICAgY29uc3QgdmFsdWUgPSBkZWZhdWx0VmFsdWUgJiYgZGVmYXVsdFZhbHVlLnZhbHVlICYmIGRlZmF1bHRWYWx1ZS52YWx1ZS5sZW5ndGggPyBkZWZhdWx0VmFsdWUudmFsdWVbMF0gOiBudWxsO1xuICAgICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZURlZmF1bHRGaWVsZHMoZmlsdGVyOiBGaWx0ZXJTZXR0aW5nKTogdm9pZCB7XG4gICAgaWYgKGZpbHRlcikge1xuICAgICAgZmlsdGVyLmZpZWxkcyA9IHRoaXMuZmlsdGVyU2VydmljZS5nZXQodGhpcy5jb25maWcuaWQpID8gdGhpcy5maWx0ZXJTZXJ2aWNlLmdldCh0aGlzLmNvbmZpZy5pZCkuZmllbGRzIDogZmlsdGVyLmZpZWxkcztcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmNhbmNlbFNldHRpbmcpIHtcbiAgICAgIHRoaXMuX3NldHRpbmdzID0ge1xuICAgICAgICBpZDogdGhpcy5jb25maWcuaWQsXG4gICAgICAgIGZpZWxkczogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZy5jYW5jZWxTZXR0aW5nLmZpZWxkcykpXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2V0dGluZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3MgPSB0aGlzLmZpbHRlclNlcnZpY2UuZ2V0KHRoaXMuY29uZmlnLmlkKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGb3JtKGNvbmZpZzogRmlsdGVyQ29uZmlnLCBzZXR0aW5nczogRmlsdGVyU2V0dGluZywgcmVzZXQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgZmluZFBlcnNvbkNvbnRyb2wgPSB0aGlzLmZvcm0gPyB0aGlzLmZvcm0uZ2V0KCdmaW5kUGVyc29uQ29udHJvbCcpIDogbnVsbDtcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICBpZiAoZmluZFBlcnNvbkNvbnRyb2wpIHtcbiAgICAgIC8vIGluIG9yZGVyIHRvIG1haW50YWluIGZpbmQgcGVyc29uIGNvbXBvbmVudCwgY29udHJvbCBuZWVkcyB0byBiZSBrZXB0XG4gICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbCgnZmluZFBlcnNvbkNvbnRyb2wnLCBmaW5kUGVyc29uQ29udHJvbCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgY29uZmlnLmZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZmllbGQudHlwZSA9PT0gJ2NoZWNrYm94LWxhcmdlJykge1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hGb3JtQXJyYXkoZmllbGQsIHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woZmllbGQubmFtZSwgZm9ybUFycmF5KTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtbG9jYXRpb24nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuYnVpbGRGaW5kTG9jYXRpb25Gb3JtQXJyYXkoZmllbGQsIHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woZmllbGQubmFtZSwgZm9ybUFycmF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcbiAgICAgICAgaWYgKGZpZWxkLm1pblNlbGVjdGVkICYmIGZpZWxkLm1pblNlbGVjdGVkID4gMCkge1xuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsO1xuICAgICAgICBpZiAocmVzZXQgJiYgY29uZmlnLmNhbmNlbFNldHRpbmcpIHtcbiAgICAgICAgICBjb25zdCBjYW5jZWxGaWVsZCA9IGNvbmZpZy5jYW5jZWxTZXR0aW5nLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IGZpZWxkLm5hbWUpO1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGNhbmNlbEZpZWxkICYmIGNhbmNlbEZpZWxkLnZhbHVlID8gY2FuY2VsRmllbGQudmFsdWVbMF0gOiAnJztcbiAgICAgICAgfSBlbHNlIGlmIChzZXR0aW5ncyAmJiBzZXR0aW5ncy5maWVsZHMpIHtcbiAgICAgICAgICBjb25zdCBsYXN0U2F2ZWRWYWx1ZSA9IHNldHRpbmdzLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IGZpZWxkLm5hbWUpO1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGxhc3RTYXZlZFZhbHVlICYmIGxhc3RTYXZlZFZhbHVlID8gbGFzdFNhdmVkVmFsdWUudmFsdWVbMF0gOiAnJztcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBmaWVsZCBpcyBmaW5kLXBlcnNvbiBidWlsZCBhIGZvcm0gZ3JvdXA7XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1wZXJzb24nKSB7XG4gICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgICAgICBkb21haW46IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICAgICAgICBlbWFpbDogbmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSAmJiBkZWZhdWx0VmFsdWUuaGFzT3duUHJvcGVydHkoJ2VtYWlsJykgPyBkZWZhdWx0VmFsdWUuZW1haWwgOiAnJywgdmFsaWRhdG9ycyksXG4gICAgICAgICAgICBpZDogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgICAgICAgIG5hbWU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICAgICAgICBrbm93bkFzOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGZpZWxkLm5hbWUsIGZvcm1Hcm91cCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUsIHZhbGlkYXRvcnMpO1xuICAgICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGZpZWxkLm5hbWUsIGNvbnRyb2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgZmllbGQgdXBkYXRlcyBmaW5kIHBlcnNvbiBjb21wb25lbnQgc2V0IHRoZSBpbml0aWFsIGRvbWFpblxuICAgICAgICBpZiAoZmllbGQuZmluZFBlcnNvbkZpZWxkKSB7XG4gICAgICAgICAgdGhpcy5maWVsZENoYW5nZWQoZmllbGQsIHRoaXMuZm9ybSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQ2hlY2tCb3hGb3JtQXJyYXkoZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnLCBzZXR0aW5nczogRmlsdGVyU2V0dGluZyk6IEZvcm1BcnJheSB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IEdlbmVyaWNGaWx0ZXJDb21wb25lbnQuYWRkRm9ybVZhbGlkYXRvcnMoZmllbGQpO1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoW10sIHZhbGlkYXRvcnMpO1xuICAgIGxldCBkZWZhdWx0VmFsdWVzO1xuICAgIGlmIChzZXR0aW5ncyAmJiBzZXR0aW5ncy5maWVsZHMpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZXMgPSBzZXR0aW5ncy5maWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZC5uYW1lKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgZmllbGQub3B0aW9ucykge1xuICAgICAgbGV0IGNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIGlmIChkZWZhdWx0VmFsdWVzICYmIEFycmF5LmlzQXJyYXkoZGVmYXVsdFZhbHVlcy52YWx1ZSkpIHtcbiAgICAgICAgY2hlY2tlZCA9ICEhZGVmYXVsdFZhbHVlcy52YWx1ZS5maW5kKCh2YWx1ZSkgPT4gdmFsdWUgPT09IG9wdGlvbi5rZXkpO1xuICAgICAgfVxuICAgICAgZm9ybUFycmF5LnB1c2gobmV3IEZvcm1Db250cm9sKGNoZWNrZWQpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1BcnJheTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGaW5kTG9jYXRpb25Gb3JtQXJyYXkoZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnLCBzZXR0aW5nczogRmlsdGVyU2V0dGluZyk6IEZvcm1BcnJheSB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IEdlbmVyaWNGaWx0ZXJDb21wb25lbnQuYWRkRm9ybVZhbGlkYXRvcnMoZmllbGQpO1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoW10sIHZhbGlkYXRvcnMpO1xuICAgIGxldCBkZWZhdWx0VmFsdWVzOiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IGFueVtdIH07XG4gICAgaWYgKHNldHRpbmdzICYmIHNldHRpbmdzLmZpZWxkcykge1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IHNldHRpbmdzLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IGZpZWxkLm5hbWUpO1xuICAgICAgaWYgKGRlZmF1bHRWYWx1ZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZWZhdWx0VmFsdWUgb2YgZGVmYXVsdFZhbHVlcy52YWx1ZSkge1xuICAgICAgICAgIGZvcm1BcnJheS5wdXNoKG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybUFycmF5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZFZhbHVlcyhmb3JtVmFsdWVzOiBhbnksIGNvbmZpZzogRmlsdGVyQ29uZmlnKTogYW55IHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZm9ybVZhbHVlcykubWFwKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGZvcm1WYWx1ZXNbbmFtZV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29uZmlnLmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaW5kLWxvY2F0aW9uJykge1xuICAgICAgICAgIHJldHVybiB7dmFsdWU6IHZhbHVlcywgbmFtZX07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHt2YWx1ZTogZ2V0VmFsdWVzKGZpZWxkLm9wdGlvbnMsIHZhbHVlcyksIG5hbWV9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge3ZhbHVlOiBbdmFsdWVzXSwgbmFtZX07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRGb3JtRXJyb3JzKGZvcm06IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IGVycm9yczogRmlsdGVyRXJyb3JbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5jb25maWcuZmllbGRzKSB7XG4gICAgICBjb25zdCBmb3JtR3JvdXAgPSBmb3JtLmdldChmaWVsZC5uYW1lKTtcbiAgICAgIGlmIChmb3JtR3JvdXAgJiYgZm9ybUdyb3VwLmVycm9ycyAmJiBmb3JtR3JvdXAuZXJyb3JzLm1pbkxlbmd0aCkge1xuICAgICAgICBlcnJvcnMucHVzaCh7bmFtZTogZmllbGQubmFtZSwgZXJyb3I6IGZpZWxkLm1pblNlbGVjdGVkRXJyb3J9KTtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtR3JvdXAgJiYgZm9ybUdyb3VwLmVycm9ycyAmJiBmb3JtR3JvdXAuZXJyb3JzLm1heExlbmd0aCkge1xuICAgICAgICBlcnJvcnMucHVzaCh7bmFtZTogZmllbGQubmFtZSwgZXJyb3I6IGZpZWxkLm1pblNlbGVjdGVkRXJyb3J9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5naXZlbkVycm9ycy5uZXh0KGVycm9ycyk7XG4gICAgfVxuICB9XG59XG4iXX0=
473
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhtY3RzL3JweC14dWktY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2dlbmVyaWMtZmlsdGVyL2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLGlCQUFpQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzlHLE9BQU8sRUFBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4SCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sd0NBQXdDLENBQUM7QUFDckUsT0FBTyxFQUFDLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBUzdGO0lBS0UsZ0NBQTZCLGFBQTRCLEVBQW1CLEVBQWU7UUFBOUQsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBbUIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUhwRixjQUFTLEdBQUcsS0FBSyxDQUFDO0lBSXpCLENBQUM7K0JBTlUsc0JBQXNCO0lBV2pDLHNCQUFXLDBDQUFNO2FBQWpCO1lBQ0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RCLENBQUM7YUFHRCxVQUFrQixLQUFtQjtZQUNuQyxJQUFJLENBQUMsT0FBTyx5QkFDUCxLQUFLLEtBQ1IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsdUJBQzdCLEtBQUssS0FDUix1QkFBdUIsRUFBRSxLQUFLLEVBQzlCLHVCQUF1QixFQUFFLEtBQUssSUFDOUIsRUFKZ0MsQ0FJaEMsQ0FBQyxHQUNKLENBQUM7WUFDRixJQUFJLENB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UyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7b0JBQy9ELE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixFQUFDLENBQUMsQ0FBQztpQkFDaEU7Z0JBQ0QsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtvQkFDL0QsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsZ0JBQWdCLEVBQUMsQ0FBQyxDQUFDO2lCQUNoRTthQUNGOzs7Ozs7Ozs7UUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQzs7O2dCQXpXMkMsYUFBYTtnQkFBdUIsV0FBVzs7SUFXM0Y7UUFEQyxLQUFLLEVBQUU7Ozt3REFXUDtJQVVEO1FBREMsS0FBSyxFQUFFOzs7MERBU1A7SUE1Q1Usc0JBQXNCO1FBUGxDLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSx1QkFBdUI7WUFDakMsc3ROQUE0QztZQUU1QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtZQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTs7U0FDdEMsQ0FBQzt5Q0FNNEMsYUFBYSxFQUF1QixXQUFXO09BTGhGLHNCQUFzQixDQStXbEM7SUFBRCw2QkFBQztDQUFBLEFBL1dELElBK1dDO1NBL1dZLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7RmlsdGVyQ29uZmlnLCBGaWx0ZXJFcnJvciwgRmlsdGVyRmllbGRDb25maWcsIEZpbHRlclNldHRpbmd9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge0ZpbHRlclNlcnZpY2V9IGZyb20gJy4vLi4vLi4vc2VydmljZXMvZmlsdGVyL2ZpbHRlci5zZXJ2aWNlJztcbmltcG9ydCB7Z2V0VmFsdWVzLCBtYXhTZWxlY3RlZFZhbGlkYXRvciwgbWluU2VsZWN0ZWRWYWxpZGF0b3J9IGZyb20gJy4vZ2VuZXJpYy1maWx0ZXItdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd4dWlsaWItZ2VuZXJpYy1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJ2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEdlbmVyaWNGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXA7XG4gIHB1YmxpYyBzdWJtaXR0ZWQgPSBmYWxzZTtcbiAgcHVibGljIGZvcm1TdWI6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGZpbHRlclNlcnZpY2U6IEZpbHRlclNlcnZpY2UsIHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyKSB7XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICBwcml2YXRlIF9jb25maWc6IEZpbHRlckNvbmZpZztcblxuICBwdWJsaWMgZ2V0IGNvbmZpZygpOiBGaWx0ZXJDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGNvbmZpZyh2YWx1ZTogRmlsdGVyQ29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0ge1xuICAgICAgLi4udmFsdWUsXG4gICAgICBmaWVsZHM6IHZhbHVlLmZpZWxkcy5tYXAoZmllbGQgPT4gKHtcbiAgICAgICAgLi4uZmllbGQsXG4gICAgICAgIGRpc3BsYXlNaW5TZWxlY3RlZEVycm9yOiBmYWxzZSxcbiAgICAgICAgZGlzcGxheU1heFNlbGVjdGVkRXJyb3I6IGZhbHNlLFxuICAgICAgfSkpXG4gICAgfTtcbiAgICB0aGlzLl9jb25maWcgPSB2YWx1ZTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIHByaXZhdGUgX3NldHRpbmdzPzogRmlsdGVyU2V0dGluZztcblxuICBwdWJsaWMgZ2V0IHNldHRpbmdzKCk6IEZpbHRlclNldHRpbmcge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncztcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2V0dGluZ3ModmFsdWU6IEZpbHRlclNldHRpbmcpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLmdldFNldHRpbmdzKCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5maWVsZHMpIHtcbiAgICAgIHRoaXMubWVyZ2VEZWZhdWx0RmllbGRzKHZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5fc2V0dGluZ3MgPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFkZEZvcm1WYWxpZGF0b3JzKGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZyk6IFZhbGlkYXRvcnMge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBbXTtcbiAgICBpZiAoZmllbGQgJiYgZmllbGQubWluU2VsZWN0ZWQpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChtaW5TZWxlY3RlZFZhbGlkYXRvcihmaWVsZC5taW5TZWxlY3RlZCkpO1xuICAgIH1cblxuICAgIGlmIChmaWVsZCAmJiBmaWVsZC5tYXhTZWxlY3RlZCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKG1heFNlbGVjdGVkVmFsaWRhdG9yKGZpZWxkLm1heFNlbGVjdGVkKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0b3JzO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZXR0aW5ncykge1xuICAgICAgdGhpcy5nZXRTZXR0aW5ncygpO1xuICAgIH1cbiAgICB0aGlzLm1lcmdlRGVmYXVsdEZpZWxkcyh0aGlzLnNldHRpbmdzKTtcbiAgICB0aGlzLmJ1aWxkRm9ybSh0aGlzLmNvbmZpZywgdGhpcy5zZXR0aW5ncyk7XG4gICAgdGhpcy5mb3JtU3ViID0gdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zdWJtaXR0ZWQgPSBmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZm9ybVN1Yikge1xuICAgICAgdGhpcy5mb3JtU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhpZGRlbihmaWVsZDogRmlsdGVyRmllbGRDb25maWcsIGZvcm06IEZvcm1Hcm91cCk6IGJvb2xlYW4ge1xuICAgIGlmICghZmllbGQuc2hvd0NvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGZpZWxkLnNob3dDb25kaXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybS5nZXQoZmllbGQubmFtZSkgYXMgRm9ybUNvbnRyb2w7XG4gICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gZmllbGQuc2hvd0NvbmRpdGlvbi5zcGxpdCgnPScpO1xuICAgICAgaWYgKGZvcm0udmFsdWUgJiYgZm9ybS52YWx1ZVtuYW1lXSA9PT0gdmFsdWUpIHtcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaW5kLXBlcnNvbicpIHtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaW5kLXBlcnNvbicpIHtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlZChmaWVsZDogRmlsdGVyRmllbGRDb25maWcsIGZvcm06IEZvcm1Hcm91cCk6IGJvb2xlYW4ge1xuICAgIGlmICghZmllbGQuZW5hYmxlQ29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmaWVsZC5lbmFibGVDb25kaXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybS5nZXQoZmllbGQubmFtZSkgYXMgRm9ybUNvbnRyb2w7XG4gICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gZmllbGQuZW5hYmxlQ29uZGl0aW9uLnNwbGl0KCc9Jyk7XG4gICAgICBpZiAoZm9ybS52YWx1ZSAmJiBmb3JtLnZhbHVlW25hbWVdID09PSB2YWx1ZSkge1xuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtcGVyc29uJykge1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1wZXJzb24nKSB7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXIoZm9ybTogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgIGZvcm0ubWFya0FzVG91Y2hlZCgpO1xuICAgIGlmIChmb3JtLnZhbGlkKSB7XG4gICAgICB0aGlzLl9zZXR0aW5ncyA9IHtcbiAgICAgICAgaWQ6IHRoaXMuY29uZmlnLmlkLFxuICAgICAgICBmaWVsZHM6IHRoaXMuZ2V0U2VsZWN0ZWRWYWx1ZXMoZm9ybS52YWx1ZSwgdGhpcy5jb25maWcpXG4gICAgICB9O1xuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmdpdmVuRXJyb3JzLm5leHQobnVsbCk7XG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHsuLi50aGlzLnNldHRpbmdzLCByZXNldDogZmFsc2V9O1xuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnBlcnNpc3Qoc2V0dGluZ3MsIHRoaXMuY29uZmlnLnBlcnNpc3RlbmNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0Rm9ybUVycm9ycyhmb3JtKTtcbiAgICB9XG4gIH1cblxuICAvLyB3aGVuIGRvbWFpbiBjaGFuZ2VzIGVuc3VyZSB0aGF0IHBlcnNvbiBmaWVsZCBpcyByZXNldFxuICBwdWJsaWMgZmllbGRDaGFuZ2VkKGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZywgZm9ybTogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgLy8gVE9ETyAtIERvIHNpbWlsYXIgd2l0aCBqdXJpc2RpY3Rpb24vc2VydmljZSBmb3IgY2FzZXdvcmtlcnMgYnkgc2VydmljZXNcbiAgICBpZiAoZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMgJiYgZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc2V0RmllbGQgb2YgZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMpIHtcbiAgICAgICAgdGhpcy5yZXNldEZpZWxkKHJlc2V0RmllbGQsIGZvcm0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWxGaWx0ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5idWlsZEZvcm0odGhpcy5jb25maWcsIHRoaXMuc2V0dGluZ3MsIHRydWUpO1xuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5jYW5jZWxTZXR0aW5nKSB7XG4gICAgICB0aGlzLl9zZXR0aW5ncy5maWVsZHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnLmNhbmNlbFNldHRpbmcuZmllbGRzKSk7XG4gICAgfVxuICAgIGNvbnN0IHNldHRpbmdzID0gey4uLnRoaXMuc2V0dGluZ3MsIHJlc2V0OiB0cnVlfTtcbiAgICB0aGlzLmZpbHRlclNlcnZpY2UucGVyc2lzdChzZXR0aW5ncywgdGhpcy5jb25maWcucGVyc2lzdGVuY2UpO1xuICAgIHRoaXMuZmlsdGVyU2VydmljZS5naXZlbkVycm9ycy5uZXh0KG51bGwpO1xuICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlUGVyc29uQ29udHJvbHModmFsdWVzOiBhbnksIGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZyk6IHZvaWQge1xuICAgIGxldCBrZXlzO1xuICAgIGlmICghdmFsdWVzKSB7XG4gICAgICBrZXlzID0gT2JqZWN0LmtleXModGhpcy5mb3JtLmdldChmaWVsZC5uYW1lKS52YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAodGhpcy5mb3JtLmdldChmaWVsZC5uYW1lKSAmJiB0aGlzLmZvcm0uZ2V0KGZpZWxkLm5hbWUpLmdldChrZXkpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzICYmIHZhbHVlc1trZXldID8gdmFsdWVzW2tleV0gOiBudWxsO1xuICAgICAgICB0aGlzLmZvcm0uZ2V0KGZpZWxkLm5hbWUpLmdldChrZXkpLnBhdGNoVmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVTZWxlY3RBbGwoZXZlbnQ6IGFueSwgZm9ybTogRm9ybUdyb3VwLCBpdGVtOiB7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyBzZWxlY3RBbGw/OiB0cnVlIH0sIGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZyk6IHZvaWQge1xuICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xuICAgIGNvbnN0IGZvcm1BcnJheTogRm9ybUFycmF5ID0gZm9ybS5nZXQoZmllbGQubmFtZSkgYXMgRm9ybUFycmF5O1xuICAgIGlmICghaXRlbS5zZWxlY3RBbGwpIHtcbiAgICAgIGNvbnN0IGFsbENoZWNrZWQgPSBmb3JtQXJyYXkuY29udHJvbHMuZXZlcnkoKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gY29udHJvbC52YWx1ZSk7XG4gICAgICBsZXQgaW5kZXg6IG51bWJlciA9IG51bGw7XG4gICAgICBjb25zdCBoYXNTZWxlY3RBbGxPcHRpb24gPSBmaWVsZC5vcHRpb25zLmZpbmQoKG9wdGlvbiwgaSkgPT4ge1xuICAgICAgICBpZiAob3B0aW9uLmhhc093blByb3BlcnR5KCdzZWxlY3RBbGwnKSkge1xuICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gICAgICBjb25zdCBpc0FsbENoZWNrZWRFeGNsdWRpbmdUaGVTZWxlY3RBbGxPcHRpb24gPSBmb3JtQXJyYXkuY29udHJvbHMuZmlsdGVyKChfY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBpOiBudW1iZXIpID0+IGkgIT09IGluZGV4KVxuICAgICAgICAuZXZlcnkoKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gY29udHJvbC52YWx1ZSk7XG5cbiAgICAgIGlmICghYWxsQ2hlY2tlZCAmJiBoYXNTZWxlY3RBbGxPcHRpb24gJiYgIWlzQ2hlY2tlZCkge1xuICAgICAgICBmb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICBpZiAoaW5kZXggPT09IGkpIHtcbiAgICAgICAgICAgIGNvbnRyb2wucGF0Y2hWYWx1ZShmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaGFzU2VsZWN0QWxsT3B0aW9uICYmICFhbGxDaGVja2VkICYmIGlzQ2hlY2tlZCAmJiBpc0FsbENoZWNrZWRFeGNsdWRpbmdUaGVTZWxlY3RBbGxPcHRpb24pIHtcbiAgICAgICAgZm9ybUFycmF5LmNvbnRyb2xzW2luZGV4XS5wYXRjaFZhbHVlKHRydWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICAgIGNvbnRyb2wucGF0Y2hWYWx1ZSh0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2wucGF0Y2hWYWx1ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0RmllbGQocmVzZXRGaWVsZDogc3RyaW5nLCBmb3JtOiBGb3JtR3JvdXApOiB2b2lkIHtcbiAgICBjb25zdCBjb250cm9sID0gZm9ybS5nZXQocmVzZXRGaWVsZCk7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlOiB7IG5hbWU6IHN0cmluZywgdmFsdWU6IGFueVtdIH0gPSB0aGlzLmNvbmZpZy5jYW5jZWxTZXR0aW5nLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IHJlc2V0RmllbGQpO1xuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRyb2wubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29udHJvbC5yZW1vdmVBdChpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb250cm9sLnZhbHVlKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgdGhpcy5yZXNldEZpZWxkKGtleSwgY29udHJvbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZGVmYXVsdFZhbHVlICYmIGRlZmF1bHRWYWx1ZS52YWx1ZSAmJiBkZWZhdWx0VmFsdWUudmFsdWUubGVuZ3RoID8gZGVmYXVsdFZhbHVlLnZhbHVlWzBdIDogbnVsbDtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VEZWZhdWx0RmllbGRzKGZpbHRlcjogRmlsdGVyU2V0dGluZyk6IHZvaWQge1xuICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgIGZpbHRlci5maWVsZHMgPSB0aGlzLmZpbHRlclNlcnZpY2UuZ2V0KHRoaXMuY29uZmlnLmlkKSA/IHRoaXMuZmlsdGVyU2VydmljZS5nZXQodGhpcy5jb25maWcuaWQpLmZpZWxkcyA6IGZpbHRlci5maWVsZHM7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5jYW5jZWxTZXR0aW5nKSB7XG4gICAgICB0aGlzLl9zZXR0aW5ncyA9IHtcbiAgICAgICAgaWQ6IHRoaXMuY29uZmlnLmlkLFxuICAgICAgICBmaWVsZHM6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcuY2FuY2VsU2V0dGluZy5maWVsZHMpKVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFNldHRpbmdzKCk6IHZvaWQge1xuICAgIHRoaXMuX3NldHRpbmdzID0gdGhpcy5maWx0ZXJTZXJ2aWNlLmdldCh0aGlzLmNvbmZpZy5pZCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRm9ybShjb25maWc6IEZpbHRlckNvbmZpZywgc2V0dGluZ3M6IEZpbHRlclNldHRpbmcsIHJlc2V0PzogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGZpbmRQZXJzb25Db250cm9sID0gdGhpcy5mb3JtID8gdGhpcy5mb3JtLmdldCgnZmluZFBlcnNvbkNvbnRyb2wnKSA6IG51bGw7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgaWYgKGZpbmRQZXJzb25Db250cm9sKSB7XG4gICAgICAvLyBpbiBvcmRlciB0byBtYWludGFpbiBmaW5kIHBlcnNvbiBjb21wb25lbnQsIGNvbnRyb2wgbmVlZHMgdG8gYmUga2VwdFxuICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woJ2ZpbmRQZXJzb25Db250cm9sJywgZmluZFBlcnNvbkNvbnRyb2wpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGNvbmZpZy5maWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnY2hlY2tib3gnIHx8IGZpZWxkLnR5cGUgPT09ICdjaGVja2JveC1sYXJnZScpIHtcbiAgICAgICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5idWlsZENoZWNrQm94Rm9ybUFycmF5KGZpZWxkLCBzZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGZpZWxkLm5hbWUsIGZvcm1BcnJheSk7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdmaW5kLWxvY2F0aW9uJykge1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmJ1aWxkRmluZExvY2F0aW9uRm9ybUFycmF5KGZpZWxkLCBzZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGZpZWxkLm5hbWUsIGZvcm1BcnJheSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XG4gICAgICAgIGlmIChmaWVsZC5taW5TZWxlY3RlZCAmJiBmaWVsZC5taW5TZWxlY3RlZCA+IDApIHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZTogYW55ID0gbnVsbDtcbiAgICAgICAgaWYgKHJlc2V0ICYmIGNvbmZpZy5jYW5jZWxTZXR0aW5nKSB7XG4gICAgICAgICAgY29uc3QgY2FuY2VsRmllbGQgPSBjb25maWcuY2FuY2VsU2V0dGluZy5maWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZC5uYW1lKTtcbiAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBjYW5jZWxGaWVsZCAmJiBjYW5jZWxGaWVsZC52YWx1ZSA/IGNhbmNlbEZpZWxkLnZhbHVlWzBdIDogJyc7XG4gICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZ3MgJiYgc2V0dGluZ3MuZmllbGRzKSB7XG4gICAgICAgICAgY29uc3QgbGFzdFNhdmVkVmFsdWUgPSBzZXR0aW5ncy5maWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZC5uYW1lKTtcbiAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBsYXN0U2F2ZWRWYWx1ZSAmJiBsYXN0U2F2ZWRWYWx1ZSA/IGxhc3RTYXZlZFZhbHVlLnZhbHVlWzBdIDogJyc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgZmllbGQgaXMgZmluZC1wZXJzb24gYnVpbGQgYSBmb3JtIGdyb3VwO1xuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtcGVyc29uJykge1xuICAgICAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgICAgICAgZG9tYWluOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgICAgICAgZW1haWw6IG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUgJiYgZGVmYXVsdFZhbHVlLmhhc093blByb3BlcnR5KCdlbWFpbCcpID8gZGVmYXVsdFZhbHVlLmVtYWlsIDogJycsIHZhbGlkYXRvcnMpLFxuICAgICAgICAgICAgaWQ6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICAgICAgICBuYW1lOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgICAgICAga25vd25BczogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChmaWVsZC5uYW1lLCBmb3JtR3JvdXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woZGVmYXVsdFZhbHVlLCB2YWxpZGF0b3JzKTtcbiAgICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChmaWVsZC5uYW1lLCBjb250cm9sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIGZpZWxkIHVwZGF0ZXMgZmluZCBwZXJzb24gY29tcG9uZW50IHNldCB0aGUgaW5pdGlhbCBkb21haW5cbiAgICAgICAgaWYgKGZpZWxkLmZpbmRQZXJzb25GaWVsZCkge1xuICAgICAgICAgIHRoaXMuZmllbGRDaGFuZ2VkKGZpZWxkLCB0aGlzLmZvcm0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENoZWNrQm94Rm9ybUFycmF5KGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZywgc2V0dGluZ3M6IEZpbHRlclNldHRpbmcpOiBGb3JtQXJyYXkge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBHZW5lcmljRmlsdGVyQ29tcG9uZW50LmFkZEZvcm1WYWxpZGF0b3JzKGZpZWxkKTtcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KFtdLCB2YWxpZGF0b3JzKTtcbiAgICBsZXQgZGVmYXVsdFZhbHVlcztcbiAgICBpZiAoc2V0dGluZ3MgJiYgc2V0dGluZ3MuZmllbGRzKSB7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gc2V0dGluZ3MuZmllbGRzLmZpbmQoKGYpID0+IGYubmFtZSA9PT0gZmllbGQubmFtZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGZpZWxkLm9wdGlvbnMpIHtcbiAgICAgIGxldCBjaGVja2VkID0gZmFsc2U7XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlcyAmJiBBcnJheS5pc0FycmF5KGRlZmF1bHRWYWx1ZXMudmFsdWUpKSB7XG4gICAgICAgIGNoZWNrZWQgPSAhIWRlZmF1bHRWYWx1ZXMudmFsdWUuZmluZCgodmFsdWUpID0+IHZhbHVlID09PSBvcHRpb24ua2V5KTtcbiAgICAgIH1cbiAgICAgIGZvcm1BcnJheS5wdXNoKG5ldyBGb3JtQ29udHJvbChjaGVja2VkKSk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtQXJyYXk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRmluZExvY2F0aW9uRm9ybUFycmF5KGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZywgc2V0dGluZ3M6IEZpbHRlclNldHRpbmcpOiBGb3JtQXJyYXkge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBHZW5lcmljRmlsdGVyQ29tcG9uZW50LmFkZEZvcm1WYWxpZGF0b3JzKGZpZWxkKTtcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KFtdLCB2YWxpZGF0b3JzKTtcbiAgICBsZXQgZGVmYXVsdFZhbHVlczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnlbXSB9O1xuICAgIGlmIChzZXR0aW5ncyAmJiBzZXR0aW5ncy5maWVsZHMpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZXMgPSBzZXR0aW5ncy5maWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZC5uYW1lKTtcbiAgICAgIGlmIChkZWZhdWx0VmFsdWVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVmYXVsdFZhbHVlIG9mIGRlZmF1bHRWYWx1ZXMudmFsdWUpIHtcbiAgICAgICAgICBmb3JtQXJyYXkucHVzaChuZXcgRm9ybUNvbnRyb2woZGVmYXVsdFZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvcm1BcnJheTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRWYWx1ZXMoZm9ybVZhbHVlczogYW55LCBjb25maWc6IEZpbHRlckNvbmZpZyk6IGFueSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGZvcm1WYWx1ZXMpLm1hcCgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBmb3JtVmFsdWVzW25hbWVdO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbmZpZy5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1sb2NhdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4ge3ZhbHVlOiB2YWx1ZXMsIG5hbWV9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7dmFsdWU6IGdldFZhbHVlcyhmaWVsZC5vcHRpb25zLCB2YWx1ZXMpLCBuYW1lfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHt2YWx1ZTogW3ZhbHVlc10sIG5hbWV9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Rm9ybUVycm9ycyhmb3JtOiBGb3JtR3JvdXApOiB2b2lkIHtcbiAgICBjb25zdCBlcnJvcnM6IEZpbHRlckVycm9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuY29uZmlnLmZpZWxkcykge1xuICAgICAgY29uc3QgZm9ybUdyb3VwID0gZm9ybS5nZXQoZmllbGQubmFtZSk7XG4gICAgICBpZiAoZm9ybUdyb3VwICYmIGZvcm1Hcm91cC5lcnJvcnMgJiYgZm9ybUdyb3VwLmVycm9ycy5taW5MZW5ndGgpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe25hbWU6IGZpZWxkLm5hbWUsIGVycm9yOiBmaWVsZC5taW5TZWxlY3RlZEVycm9yfSk7XG4gICAgICB9XG4gICAgICBpZiAoZm9ybUdyb3VwICYmIGZvcm1Hcm91cC5lcnJvcnMgJiYgZm9ybUdyb3VwLmVycm9ycy5tYXhMZW5ndGgpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe25hbWU6IGZpZWxkLm5hbWUsIGVycm9yOiBmaWVsZC5taW5TZWxlY3RlZEVycm9yfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZpbHRlclNlcnZpY2UuZ2l2ZW5FcnJvcnMubmV4dChlcnJvcnMpO1xuICAgIH1cbiAgfVxufVxuIl19