@sumaris-net/ngx-components 2.6.17 → 4.0.0-rc1

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 (721) hide show
  1. package/esm2022/public_api.mjs +337 -0
  2. package/{esm2020 → esm2022}/src/app/admin/admin-routing.module.mjs +8 -8
  3. package/{esm2020 → esm2022}/src/app/admin/admin.module.mjs +11 -11
  4. package/esm2022/src/app/admin/services/filter/person.filter.mjs +68 -0
  5. package/esm2022/src/app/admin/services/person.service.mjs +174 -0
  6. package/esm2022/src/app/admin/services/validator/person.validator.mjs +72 -0
  7. package/esm2022/src/app/admin/users/users.mjs +273 -0
  8. package/esm2022/src/app/admin/users/users.module.mjs +58 -0
  9. package/esm2022/src/app/core/about/about.modal.mjs +84 -0
  10. package/{esm2020 → esm2022}/src/app/core/about/about.module.mjs +9 -9
  11. package/{esm2020 → esm2022}/src/app/core/account/account.module.mjs +22 -22
  12. package/esm2022/src/app/core/account/account.page.mjs +335 -0
  13. package/esm2022/src/app/core/account/new-token.modal.mjs +125 -0
  14. package/esm2022/src/app/core/account/token.table.mjs +141 -0
  15. package/esm2022/src/app/core/auth/auth.form.mjs +140 -0
  16. package/esm2022/src/app/core/auth/auth.modal.mjs +76 -0
  17. package/{esm2020 → esm2022}/src/app/core/auth/auth.module.mjs +16 -16
  18. package/{esm2020 → esm2022}/src/app/core/core.module.mjs +87 -87
  19. package/esm2022/src/app/core/core.testing.module.mjs +93 -0
  20. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +109 -0
  21. package/{esm2020 → esm2022}/src/app/core/form/buttons/form-buttons-bar.module.mjs +10 -10
  22. package/esm2022/src/app/core/form/entity/editor.class.mjs +713 -0
  23. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +436 -0
  24. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +724 -0
  25. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +24 -0
  26. package/{esm2020 → esm2022}/src/app/core/form/entity/entity.module.mjs +11 -11
  27. package/esm2022/src/app/core/form/form.class.mjs +353 -0
  28. package/{esm2020 → esm2022}/src/app/core/form/form.module.mjs +30 -30
  29. package/{esm2020 → esm2022}/src/app/core/form/form.utils.mjs +69 -60
  30. package/esm2022/src/app/core/form/list/list.form.mjs +233 -0
  31. package/{esm2020 → esm2022}/src/app/core/form/list/list.module.mjs +10 -10
  32. package/esm2022/src/app/core/form/properties/properties.form.mjs +143 -0
  33. package/{esm2020 → esm2022}/src/app/core/form/properties/properties.module.mjs +13 -13
  34. package/esm2022/src/app/core/form/properties/properties.table.mjs +269 -0
  35. package/esm2022/src/app/core/form/properties/property.validator.mjs +24 -0
  36. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +95 -0
  37. package/{esm2020 → esm2022}/src/app/core/form/properties/testing/properties-form.testing.module.mjs +11 -11
  38. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +73 -0
  39. package/{esm2020 → esm2022}/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +10 -10
  40. package/esm2022/src/app/core/form/text-popover/text-form.component.mjs +97 -0
  41. package/{esm2020 → esm2022}/src/app/core/form/text-popover/text-popover.component.mjs +26 -20
  42. package/{esm2020 → esm2022}/src/app/core/form/text-popover/text-popover.module.mjs +12 -12
  43. package/{esm2020 → esm2022}/src/app/core/graphql/graphql.module.mjs +5 -5
  44. package/esm2022/src/app/core/graphql/graphql.service.mjs +787 -0
  45. package/{esm2020 → esm2022}/src/app/core/graphql/graphql.utils.mjs +2 -1
  46. package/esm2022/src/app/core/home/home.mjs +283 -0
  47. package/esm2022/src/app/core/home/home.module.mjs +51 -0
  48. package/esm2022/src/app/core/icon/icon.component.mjs +40 -0
  49. package/{esm2020 → esm2022}/src/app/core/icon/icon.module.mjs +7 -7
  50. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +358 -0
  51. package/{esm2020 → esm2022}/src/app/core/install/install-upgrade-card.module.mjs +10 -10
  52. package/esm2022/src/app/core/menu/menu.component.mjs +260 -0
  53. package/esm2022/src/app/core/menu/menu.model.mjs +268 -0
  54. package/esm2022/src/app/core/menu/menu.module.mjs +52 -0
  55. package/esm2022/src/app/core/menu/menu.service.mjs +665 -0
  56. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +109 -0
  57. package/{esm2020 → esm2022}/src/app/core/menu/testing/menu-other.testing.mjs +4 -4
  58. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +122 -0
  59. package/{esm2020 → esm2022}/src/app/core/menu/testing/menu.testing.module.mjs +12 -12
  60. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +29 -0
  61. package/{esm2020 → esm2022}/src/app/core/offline/update-offline-mode-card.module.mjs +10 -10
  62. package/esm2022/src/app/core/peer/select-peer.modal.mjs +192 -0
  63. package/{esm2020 → esm2022}/src/app/core/peer/select-peer.module.mjs +13 -13
  64. package/esm2022/src/app/core/register/register-confirm.page.mjs +88 -0
  65. package/esm2022/src/app/core/register/register.form.mjs +194 -0
  66. package/esm2022/src/app/core/register/register.modal.mjs +55 -0
  67. package/{esm2020 → esm2022}/src/app/core/register/register.module.mjs +13 -13
  68. package/esm2022/src/app/core/services/account.service.mjs +1217 -0
  69. package/esm2022/src/app/core/services/auth-guard.service.mjs +76 -0
  70. package/esm2022/src/app/core/services/base-entity-service.class.mjs +482 -0
  71. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +224 -0
  72. package/esm2022/src/app/core/services/base58.mjs +79 -0
  73. package/{esm2020 → esm2022}/src/app/core/services/config/core.config.mjs +4 -4
  74. package/esm2022/src/app/core/services/config.service.mjs +365 -0
  75. package/esm2022/src/app/core/services/crypto.service.mjs +107 -0
  76. package/esm2022/src/app/core/services/local-settings.service.mjs +468 -0
  77. package/esm2022/src/app/core/services/model/account.model.mjs +153 -0
  78. package/esm2022/src/app/core/services/model/config.model.mjs +105 -0
  79. package/esm2022/src/app/core/services/model/department.model.mjs +33 -0
  80. package/esm2022/src/app/core/services/model/entity.decorators.mjs +97 -0
  81. package/esm2022/src/app/core/services/model/entity.model.mjs +228 -0
  82. package/esm2022/src/app/core/services/model/peer.model.mjs +82 -0
  83. package/esm2022/src/app/core/services/model/person.model.mjs +109 -0
  84. package/esm2022/src/app/core/services/model/referential.model.mjs +185 -0
  85. package/esm2022/src/app/core/services/model/token.model.mjs +52 -0
  86. package/esm2022/src/app/core/services/network.service.mjs +608 -0
  87. package/{esm2020 → esm2022}/src/app/core/services/pipes/account.pipes.mjs +9 -9
  88. package/{esm2020 → esm2022}/src/app/core/services/pipes/department-to-string.pipe.mjs +5 -5
  89. package/{esm2020 → esm2022}/src/app/core/services/pipes/person-to-string.pipe.mjs +5 -5
  90. package/{esm2020 → esm2022}/src/app/core/services/pipes/usage-mode.pipes.mjs +9 -9
  91. package/esm2022/src/app/core/services/platform.service.mjs +546 -0
  92. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +434 -0
  93. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +458 -0
  94. package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +25 -0
  95. package/esm2022/src/app/core/services/testing/referential.validator.mjs +46 -0
  96. package/esm2022/src/app/core/services/validator/account.validator.mjs +45 -0
  97. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +49 -0
  98. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +67 -0
  99. package/{esm2020 → esm2022}/src/app/core/services/validator/user-settings.validator.mjs +4 -4
  100. package/{esm2020 → esm2022}/src/app/core/services/validator/user-token.validator.mjs +4 -4
  101. package/{esm2020 → esm2022}/src/app/core/settings/settings.module.mjs +9 -9
  102. package/esm2022/src/app/core/settings/settings.page.mjs +328 -0
  103. package/esm2022/src/app/core/table/actions-column.component.mjs +115 -0
  104. package/esm2022/src/app/core/table/async-table.class.mjs +1735 -0
  105. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +386 -0
  106. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +401 -0
  107. package/esm2022/src/app/core/table/memory-table.class.mjs +57 -0
  108. package/esm2022/src/app/core/table/table-select-columns.component.mjs +46 -0
  109. package/esm2022/src/app/core/table/table.class.mjs +1771 -0
  110. package/esm2022/src/app/core/table/table.model.mjs +16 -0
  111. package/{esm2020 → esm2022}/src/app/core/table/table.module.mjs +12 -12
  112. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +28 -0
  113. package/esm2022/src/app/core/table/testing/table.testing.mjs +291 -0
  114. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +50 -0
  115. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +25 -0
  116. package/esm2022/src/app/core/table/testing/table2.testing.mjs +250 -0
  117. package/esm2022/src/app/shared/audio/audio.mjs +251 -0
  118. package/esm2022/src/app/shared/audio/audio.testing.mjs +32 -0
  119. package/{esm2020 → esm2022}/src/app/shared/audio/audio.testing.module.mjs +10 -10
  120. package/esm2022/src/app/shared/capacitor/keyboard.mjs +42 -0
  121. package/esm2022/src/app/shared/capacitor/plugins.mjs +9 -0
  122. package/esm2022/src/app/shared/dates.mjs +149 -0
  123. package/esm2022/src/app/shared/debug/debug.component.mjs +40 -0
  124. package/{esm2020 → esm2022}/src/app/shared/debug/debug.module.mjs +14 -14
  125. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +98 -0
  126. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +32 -0
  127. package/{esm2020 → esm2022}/src/app/shared/directives/directives.module.mjs +13 -13
  128. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +52 -0
  129. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +33 -0
  130. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +62 -0
  131. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +45 -0
  132. package/{esm2020 → esm2022}/src/app/shared/directives/resizable/resizable.module.mjs +5 -5
  133. package/esm2022/src/app/shared/file/file.service.mjs +122 -0
  134. package/{esm2020 → esm2022}/src/app/shared/file/file.utils.mjs +2 -2
  135. package/esm2022/src/app/shared/form/field.component.mjs +353 -0
  136. package/{esm2020 → esm2022}/src/app/shared/form/field.model.mjs +1 -1
  137. package/esm2022/src/app/shared/form/loading-spinner.mjs +35 -0
  138. package/{esm2020 → esm2022}/src/app/shared/functions.mjs +5 -4
  139. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +82 -0
  140. package/esm2022/src/app/shared/gesture/gesture-config.mjs +46 -0
  141. package/esm2022/src/app/shared/graph/graph-colors.mjs +219 -0
  142. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +59 -0
  143. package/esm2022/src/app/shared/help/help.modal.mjs +63 -0
  144. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +24 -0
  145. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +85 -0
  146. package/{esm2020 → esm2022}/src/app/shared/hotkeys/shared-hotkeys.module.mjs +13 -13
  147. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +388 -0
  148. package/{esm2020 → esm2022}/src/app/shared/image/gallery/image-gallery.module.mjs +22 -22
  149. package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +26 -0
  150. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +90 -0
  151. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +41 -0
  152. package/{esm2020 → esm2022}/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +16 -16
  153. package/{esm2020 → esm2022}/src/app/shared/image/image.module.mjs +11 -11
  154. package/esm2022/src/app/shared/image/image.service.mjs +104 -0
  155. package/esm2022/src/app/shared/inputs.mjs +231 -0
  156. package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +28 -0
  157. package/esm2022/src/app/shared/logging/logging-service.class.mjs +128 -0
  158. package/{esm2020 → esm2022}/src/app/shared/logging/logging-service.module.mjs +8 -8
  159. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +49 -0
  160. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +961 -0
  161. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +82 -0
  162. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +217 -0
  163. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +209 -0
  164. package/{esm2020 → esm2022}/src/app/shared/material/badge/badge.module.mjs +9 -9
  165. package/esm2022/src/app/shared/material/badge/badge.test.mjs +42 -0
  166. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +72 -0
  167. package/esm2022/src/app/shared/material/boolean/material-boolean2.mjs +266 -0
  168. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +271 -0
  169. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +54 -0
  170. package/esm2022/src/app/shared/material/chips/chips.module.mjs +76 -0
  171. package/esm2022/src/app/shared/material/chips/material.chips.mjs +719 -0
  172. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +148 -0
  173. package/{esm2020 → esm2022}/src/app/shared/material/datetime/datetime.module.mjs +38 -38
  174. package/esm2022/src/app/shared/material/datetime/material.date.mjs +396 -0
  175. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +406 -0
  176. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +523 -0
  177. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +125 -0
  178. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +122 -0
  179. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +115 -0
  180. package/esm2022/src/app/shared/material/duration/duration.module.mjs +70 -0
  181. package/{esm2020 → esm2022}/src/app/shared/material/duration/duration.utils.mjs +2 -2
  182. package/esm2022/src/app/shared/material/duration/material.duration.mjs +273 -0
  183. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +79 -0
  184. package/{esm2020 → esm2022}/src/app/shared/material/latlong/latlong.utils.mjs +3 -3
  185. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +415 -0
  186. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +72 -0
  187. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +113 -0
  188. package/esm2022/src/app/shared/material/material.module.mjs +224 -0
  189. package/esm2022/src/app/shared/material/material.testing.module.mjs +210 -0
  190. package/esm2022/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +104 -0
  191. package/esm2022/src/app/shared/material/numpad/numpad.component.mjs +83 -0
  192. package/esm2022/src/app/shared/material/numpad/numpad.container.mjs +203 -0
  193. package/esm2022/src/app/shared/material/numpad/numpad.content.mjs +19 -0
  194. package/esm2022/src/app/shared/material/numpad/numpad.directive.mjs +168 -0
  195. package/esm2022/src/app/shared/material/numpad/numpad.dom-service.mjs +36 -0
  196. package/esm2022/src/app/shared/material/numpad/numpad.model.mjs +16 -0
  197. package/{esm2020 → esm2022}/src/app/shared/material/numpad/numpad.module.mjs +21 -21
  198. package/esm2022/src/app/shared/material/numpad/testing/numpad.test.mjs +48 -0
  199. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +48 -0
  200. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +23 -0
  201. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +368 -0
  202. package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +56 -0
  203. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +67 -0
  204. package/esm2022/src/app/shared/material/testing/common.test.mjs +105 -0
  205. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +212 -0
  206. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +49 -0
  207. package/{esm2020 → esm2022}/src/app/shared/named-filter/named-filter.module.mjs +5 -5
  208. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +69 -0
  209. package/{esm2020 → esm2022}/src/app/shared/pipes/arrays.pipe.mjs +25 -25
  210. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +27 -0
  211. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +51 -0
  212. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +72 -0
  213. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +28 -0
  214. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +36 -0
  215. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +60 -0
  216. package/esm2022/src/app/shared/pipes/form.pipes.mjs +194 -0
  217. package/{esm2020 → esm2022}/src/app/shared/pipes/highlight.pipe.mjs +5 -5
  218. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +42 -0
  219. package/{esm2020 → esm2022}/src/app/shared/pipes/maps.pipe.mjs +13 -13
  220. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +118 -0
  221. package/{esm2020 → esm2022}/src/app/shared/pipes/math.pipes.mjs +13 -13
  222. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +19 -0
  223. package/{esm2020 → esm2022}/src/app/shared/pipes/number-format.pipe.mjs +5 -5
  224. package/esm2022/src/app/shared/pipes/pipes.module.mjs +256 -0
  225. package/esm2022/src/app/shared/pipes/property.pipes.mjs +97 -0
  226. package/esm2022/src/app/shared/pipes/string.pipes.mjs +135 -0
  227. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +44 -0
  228. package/esm2022/src/app/shared/pipes/types.pipes.mjs +58 -0
  229. package/esm2022/src/app/shared/rx-state.module.mjs +23 -0
  230. package/esm2022/src/app/shared/services/entity-service.class.mjs +7 -0
  231. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +347 -0
  232. package/esm2022/src/app/shared/services/progress-bar.service.mjs +31 -0
  233. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +121 -0
  234. package/esm2022/src/app/shared/services/startable-service.class.mjs +113 -0
  235. package/esm2022/src/app/shared/services/translate-context.service.mjs +104 -0
  236. package/{esm2020 → esm2022}/src/app/shared/shared-routing.module.mjs +11 -11
  237. package/esm2022/src/app/shared/shared.module.mjs +217 -0
  238. package/{esm2020 → esm2022}/src/app/shared/shared.testing.module.mjs +40 -40
  239. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +286 -0
  240. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +46 -0
  241. package/{esm2020 → esm2022}/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +7 -7
  242. package/{esm2020 → esm2022}/src/app/shared/storage/storage-explorer.testing.module.mjs +6 -6
  243. package/esm2022/src/app/shared/storage/storage.service.mjs +134 -0
  244. package/{esm2020 → esm2022}/src/app/shared/storage/storage.utils.mjs +1 -1
  245. package/esm2022/src/app/shared/testing/observable.test.mjs +96 -0
  246. package/esm2022/src/app/shared/testing/tests.page.mjs +37 -0
  247. package/esm2022/src/app/shared/toast/toast.testing.mjs +52 -0
  248. package/{esm2020 → esm2022}/src/app/shared/toast/toast.testing.module.mjs +10 -10
  249. package/esm2022/src/app/shared/toast/toasts.mjs +144 -0
  250. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +60 -0
  251. package/esm2022/src/app/shared/toolbar/toolbar.mjs +264 -0
  252. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +57 -0
  253. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +59 -0
  254. package/{esm2020 → esm2022}/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +10 -10
  255. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +107 -0
  256. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +211 -0
  257. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +27 -0
  258. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +106 -0
  259. package/esm2022/src/app/shared/validator/validators.mjs +580 -0
  260. package/esm2022/src/app/shared/version/versions.mjs +81 -0
  261. package/esm2022/src/app/social/job/job.module.mjs +42 -0
  262. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +35 -0
  263. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +232 -0
  264. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +50 -0
  265. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +28 -0
  266. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +73 -0
  267. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +43 -0
  268. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +53 -0
  269. package/{esm2020 → esm2022}/src/app/social/job/testing/job.testing.module.mjs +9 -9
  270. package/esm2022/src/app/social/message/message.form.mjs +88 -0
  271. package/esm2022/src/app/social/message/message.modal.mjs +102 -0
  272. package/esm2022/src/app/social/message/message.model.mjs +71 -0
  273. package/esm2022/src/app/social/message/message.module.mjs +35 -0
  274. package/esm2022/src/app/social/message/message.service.mjs +88 -0
  275. package/{esm2020 → esm2022}/src/app/social/social.module.mjs +19 -19
  276. package/{esm2020 → esm2022}/src/app/social/social.testing.module.mjs +10 -10
  277. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +123 -0
  278. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +263 -0
  279. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +233 -0
  280. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +128 -0
  281. package/{esm2020 → esm2022}/src/app/social/user-event/testing/user-event.testing.module.mjs +9 -9
  282. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +116 -0
  283. package/esm2022/src/app/social/user-event/user-event.module.mjs +43 -0
  284. package/esm2022/src/app/social/user-event/user-event.service.mjs +498 -0
  285. package/esm2022/src/environments/environment.class.mjs +47 -0
  286. package/esm2022/src/environments/environment.mjs +94 -0
  287. package/{fesm2020 → fesm2022}/sumaris-net.ngx-components.mjs +12191 -10087
  288. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -0
  289. package/package.json +11 -16
  290. package/public_api.d.ts +12 -5
  291. package/src/app/admin/users/users.d.ts +1 -1
  292. package/src/app/admin/users/users.module.d.ts +2 -1
  293. package/src/app/core/about/about.modal.d.ts +1 -1
  294. package/src/app/core/account/account.page.d.ts +3 -4
  295. package/src/app/core/account/new-token.modal.d.ts +1 -1
  296. package/src/app/core/account/token.table.d.ts +1 -1
  297. package/src/app/core/auth/auth.form.d.ts +1 -1
  298. package/src/app/core/auth/auth.modal.d.ts +1 -1
  299. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +2 -2
  300. package/src/app/core/form/entity/editor.class.d.ts +4 -4
  301. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +1 -1
  302. package/src/app/core/form/entity/entity-editor.class.d.ts +6 -10
  303. package/src/app/core/form/entity/entity-metadata.component.d.ts +1 -1
  304. package/src/app/core/form/form.class.d.ts +1 -1
  305. package/src/app/core/form/list/list.form.d.ts +1 -1
  306. package/src/app/core/form/properties/properties.form.d.ts +1 -1
  307. package/src/app/core/form/properties/properties.table.d.ts +2 -3
  308. package/src/app/core/form/properties/property.validator.d.ts +1 -1
  309. package/src/app/core/form/properties/testing/properties-form.test.d.ts +1 -1
  310. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +1 -1
  311. package/src/app/core/form/text-popover/text-form.component.d.ts +1 -1
  312. package/src/app/core/form/text-popover/text-popover.component.d.ts +1 -1
  313. package/src/app/core/home/home.d.ts +1 -1
  314. package/src/app/core/home/home.module.d.ts +4 -3
  315. package/src/app/core/icon/icon.component.d.ts +1 -1
  316. package/src/app/core/install/install-upgrade-card.component.d.ts +1 -1
  317. package/src/app/core/menu/menu.component.d.ts +4 -8
  318. package/src/app/core/menu/menu.model.d.ts +0 -1
  319. package/src/app/core/menu/menu.module.d.ts +3 -5
  320. package/src/app/core/menu/menu.service.d.ts +1 -3
  321. package/src/app/core/menu/sub-menu-tab.directive.d.ts +1 -1
  322. package/src/app/core/menu/testing/menu-other.testing.d.ts +1 -1
  323. package/src/app/core/menu/testing/menu.testing.d.ts +1 -1
  324. package/src/app/core/offline/update-offline-mode-card.component.d.ts +1 -1
  325. package/src/app/core/peer/select-peer.modal.d.ts +1 -1
  326. package/src/app/core/register/register-confirm.page.d.ts +1 -1
  327. package/src/app/core/register/register.form.d.ts +1 -1
  328. package/src/app/core/register/register.modal.d.ts +1 -1
  329. package/src/app/core/services/account.service.d.ts +0 -4
  330. package/src/app/core/services/base-entity-service.class.d.ts +2 -2
  331. package/src/app/core/services/base-graphql-service.class.d.ts +1 -1
  332. package/src/app/core/services/config/core.config.d.ts +1 -1
  333. package/src/app/core/services/model/person.model.d.ts +1 -1
  334. package/src/app/core/services/model/referential.model.d.ts +1 -2
  335. package/src/app/core/services/model/settings.model.d.ts +1 -1
  336. package/src/app/core/services/network.types.d.ts +2 -2
  337. package/src/app/core/services/storage/entity-store.class.d.ts +1 -1
  338. package/src/app/core/services/validator/base.validator.class.d.ts +1 -1
  339. package/src/app/core/settings/settings.page.d.ts +1 -1
  340. package/src/app/core/table/actions-column.component.d.ts +2 -2
  341. package/src/app/core/table/async-table.class.d.ts +1 -1
  342. package/src/app/core/table/entities-async-table-datasource.class.d.ts +1 -1
  343. package/src/app/core/table/entities-table-datasource.class.d.ts +1 -1
  344. package/src/app/core/table/memory-table.class.d.ts +3 -3
  345. package/src/app/core/table/table-select-columns.component.d.ts +1 -1
  346. package/src/app/core/table/table.class.d.ts +3 -3
  347. package/src/app/core/table/table.model.d.ts +1 -1
  348. package/src/app/core/table/testing/table.testing.d.ts +5 -4
  349. package/src/app/core/table/testing/table.testing.module.d.ts +8 -5
  350. package/src/app/core/table/testing/table2-validator.service.d.ts +15 -0
  351. package/src/app/core/table/testing/table2.testing.d.ts +45 -0
  352. package/src/app/shared/audio/audio.d.ts +1 -1
  353. package/src/app/shared/audio/audio.testing.d.ts +1 -1
  354. package/src/app/shared/debug/debug.component.d.ts +1 -1
  355. package/src/app/shared/directives/autofocus.directive.d.ts +1 -1
  356. package/src/app/shared/directives/autotitle.directive.d.ts +1 -1
  357. package/src/app/shared/directives/drag-and-drop.directive.d.ts +1 -1
  358. package/src/app/shared/directives/ng-var.directive.d.ts +1 -1
  359. package/src/app/shared/directives/resizable/resizable.component.d.ts +1 -1
  360. package/src/app/shared/directives/resizable/resizable.directive.d.ts +1 -1
  361. package/src/app/shared/events.d.ts +1 -1
  362. package/src/app/shared/form/field.component.d.ts +4 -5
  363. package/src/app/shared/form/field.model.d.ts +2 -0
  364. package/src/app/shared/form/loading-spinner.d.ts +1 -1
  365. package/src/app/shared/functions.d.ts +2 -2
  366. package/src/app/shared/help/help.modal.d.ts +2 -2
  367. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +1 -1
  368. package/src/app/shared/hotkeys/hotkeys.service.d.ts +3 -3
  369. package/src/app/shared/image/gallery/image-gallery.component.d.ts +3 -3
  370. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +2 -2
  371. package/src/app/shared/inputs.d.ts +1 -1
  372. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +9 -9
  373. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +10 -9
  374. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +1 -1
  375. package/src/app/shared/material/badge/badge.directive.d.ts +1 -1
  376. package/src/app/shared/material/badge/badge.test.d.ts +1 -1
  377. package/src/app/shared/material/boolean/boolean.module.d.ts +12 -11
  378. package/src/app/shared/material/boolean/material-boolean2.d.ts +66 -0
  379. package/src/app/shared/material/boolean/material.boolean.d.ts +5 -4
  380. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +21 -0
  381. package/src/app/shared/material/chips/material.chips.d.ts +8 -9
  382. package/src/app/shared/material/chips/testing/chips.test.d.ts +2 -2
  383. package/src/app/shared/material/datetime/datetime.module.d.ts +2 -2
  384. package/src/app/shared/material/datetime/material.date.d.ts +5 -4
  385. package/src/app/shared/material/datetime/material.dateshort.d.ts +8 -7
  386. package/src/app/shared/material/datetime/material.datetime.d.ts +8 -6
  387. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +7 -1
  388. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +3 -1
  389. package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +3 -1
  390. package/src/app/shared/material/duration/duration.module.d.ts +6 -5
  391. package/src/app/shared/material/duration/material.duration.d.ts +6 -5
  392. package/src/app/shared/material/duration/testing/mat-duration.test.d.ts +22 -0
  393. package/src/app/shared/material/latlong/material.latlong.d.ts +8 -7
  394. package/src/app/shared/material/latlong/material.latlong.module.d.ts +9 -8
  395. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +3 -1
  396. package/src/app/shared/material/material.testing.module.d.ts +22 -18
  397. package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +1 -1
  398. package/src/app/shared/material/numpad/numpad.component.d.ts +1 -1
  399. package/src/app/shared/material/numpad/numpad.container.d.ts +1 -1
  400. package/src/app/shared/material/numpad/numpad.content.d.ts +1 -1
  401. package/src/app/shared/material/numpad/numpad.directive.d.ts +1 -1
  402. package/src/app/shared/material/numpad/numpad.dom-service.d.ts +3 -3
  403. package/src/app/shared/material/numpad/testing/numpad.test.d.ts +1 -1
  404. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +0 -3
  405. package/src/app/shared/material/swipe/material.swipe.d.ts +6 -6
  406. package/src/app/shared/material/swipe/swipe.module.d.ts +2 -1
  407. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +1 -1
  408. package/src/app/shared/material/testing/common.test.d.ts +25 -0
  409. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +1 -1
  410. package/src/app/shared/named-filter/named-filter.service.d.ts +1 -1
  411. package/src/app/shared/pipes/maskito.pipe.d.ts +16 -0
  412. package/src/app/shared/pipes/ng-init.pipe.d.ts +1 -1
  413. package/src/app/shared/pipes/pipes.module.d.ts +5 -4
  414. package/src/app/shared/pipes/string.pipes.d.ts +6 -0
  415. package/src/app/shared/pipes/types.pipes.d.ts +7 -0
  416. package/src/app/shared/rx-state.module.d.ts +10 -0
  417. package/src/app/shared/services/entity-service.class.d.ts +1 -1
  418. package/src/app/shared/services/job.utils.d.ts +1 -1
  419. package/src/app/shared/services/memory-entity-service.class.d.ts +1 -1
  420. package/src/app/shared/services/startable-observable-service.class.d.ts +3 -0
  421. package/src/app/shared/services/startable-service.class.d.ts +3 -0
  422. package/src/app/shared/shared.module.d.ts +7 -9
  423. package/src/app/shared/storage/storage-explorer.component.d.ts +1 -1
  424. package/src/app/shared/storage/storage-explorer.module.d.ts +3 -3
  425. package/src/app/shared/storage/storage.service.d.ts +1 -1
  426. package/src/app/shared/storage/storage.utils.d.ts +1 -1
  427. package/src/app/shared/testing/observable.test.d.ts +1 -1
  428. package/src/app/shared/testing/tests.page.d.ts +1 -1
  429. package/src/app/shared/toast/toast.testing.d.ts +1 -1
  430. package/src/app/shared/toolbar/modal-toolbar.d.ts +1 -1
  431. package/src/app/shared/toolbar/toolbar.d.ts +1 -1
  432. package/src/app/shared/toolbar/toolbar.module.d.ts +4 -3
  433. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +1 -1
  434. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +1 -1
  435. package/src/app/shared/upload-file/upload-file.component.d.ts +1 -1
  436. package/src/app/shared/upload-file/upload-file.model.d.ts +2 -2
  437. package/src/app/social/job/progression/job-progression.component.d.ts +17 -3
  438. package/src/app/social/job/progression/job-progression.icon.d.ts +24 -10
  439. package/src/app/social/job/progression/job-progression.list.d.ts +3 -3
  440. package/src/app/social/job/progression/job-progression.model.d.ts +0 -1
  441. package/src/app/social/job/testing/job-progression.testing.d.ts +3 -6
  442. package/src/app/social/message/message.form.d.ts +2 -8
  443. package/src/app/social/message/message.modal.d.ts +1 -5
  444. package/src/app/social/message/message.model.d.ts +0 -2
  445. package/src/app/social/message/message.module.d.ts +1 -2
  446. package/src/app/social/message/message.service.d.ts +3 -8
  447. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +4 -3
  448. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +1 -1
  449. package/src/app/social/user-event/testing/user-event.testing.d.ts +1 -1
  450. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +0 -1
  451. package/src/app/social/user-event/user-event.model.d.ts +2 -2
  452. package/src/app/social/user-event/user-event.module.d.ts +3 -2
  453. package/src/app/social/user-event/user-event.service.d.ts +1 -6
  454. package/src/assets/i18n/en-US.json +17 -15
  455. package/src/assets/i18n/en.json +17 -15
  456. package/src/assets/i18n/fr.json +7 -6
  457. package/src/assets/img/logo/logo-eis.png +0 -0
  458. package/src/assets/manifest.json +1 -1
  459. package/src/environments/environment.class.d.ts +0 -1
  460. package/src/theme/_material.globals.scss +51 -19
  461. package/src/theme/_material.scss +15 -15
  462. package/src/theme/_mixins.scss +3 -3
  463. package/src/theme/_ngx-components.globals.scss +6 -1
  464. package/src/theme/_ngx-components.scss +262 -534
  465. package/src/theme/_ngx-components.table.scss +599 -0
  466. package/src/theme/_theme.scss +1 -0
  467. package/esm2020/public_api.mjs +0 -330
  468. package/esm2020/src/app/admin/services/filter/person.filter.mjs +0 -59
  469. package/esm2020/src/app/admin/services/person.service.mjs +0 -170
  470. package/esm2020/src/app/admin/services/validator/person.validator.mjs +0 -71
  471. package/esm2020/src/app/admin/users/users.mjs +0 -250
  472. package/esm2020/src/app/admin/users/users.module.mjs +0 -54
  473. package/esm2020/src/app/core/about/about.modal.mjs +0 -71
  474. package/esm2020/src/app/core/account/account.page.mjs +0 -319
  475. package/esm2020/src/app/core/account/new-token.modal.mjs +0 -115
  476. package/esm2020/src/app/core/account/token.table.mjs +0 -137
  477. package/esm2020/src/app/core/auth/auth.form.mjs +0 -131
  478. package/esm2020/src/app/core/auth/auth.modal.mjs +0 -72
  479. package/esm2020/src/app/core/core.testing.module.mjs +0 -86
  480. package/esm2020/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -107
  481. package/esm2020/src/app/core/form/entity/editor.class.mjs +0 -683
  482. package/esm2020/src/app/core/form/entity/entity-editor-modal.class.mjs +0 -422
  483. package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +0 -696
  484. package/esm2020/src/app/core/form/entity/entity-metadata.component.mjs +0 -25
  485. package/esm2020/src/app/core/form/form.class.mjs +0 -345
  486. package/esm2020/src/app/core/form/list/list.form.mjs +0 -222
  487. package/esm2020/src/app/core/form/properties/properties.form.mjs +0 -132
  488. package/esm2020/src/app/core/form/properties/properties.table.mjs +0 -267
  489. package/esm2020/src/app/core/form/properties/property.validator.mjs +0 -23
  490. package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +0 -90
  491. package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.mjs +0 -70
  492. package/esm2020/src/app/core/form/text-popover/text-form.component.mjs +0 -89
  493. package/esm2020/src/app/core/graphql/graphql.service.mjs +0 -778
  494. package/esm2020/src/app/core/home/home.mjs +0 -257
  495. package/esm2020/src/app/core/home/home.module.mjs +0 -48
  496. package/esm2020/src/app/core/icon/icon.component.mjs +0 -41
  497. package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +0 -344
  498. package/esm2020/src/app/core/menu/menu.component.mjs +0 -242
  499. package/esm2020/src/app/core/menu/menu.model.mjs +0 -247
  500. package/esm2020/src/app/core/menu/menu.module.mjs +0 -57
  501. package/esm2020/src/app/core/menu/menu.service.mjs +0 -660
  502. package/esm2020/src/app/core/menu/sub-menu-tab.directive.mjs +0 -98
  503. package/esm2020/src/app/core/menu/testing/menu.testing.mjs +0 -121
  504. package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +0 -27
  505. package/esm2020/src/app/core/peer/select-peer.modal.mjs +0 -183
  506. package/esm2020/src/app/core/register/register-confirm.page.mjs +0 -81
  507. package/esm2020/src/app/core/register/register.form.mjs +0 -183
  508. package/esm2020/src/app/core/register/register.modal.mjs +0 -52
  509. package/esm2020/src/app/core/services/account.service.mjs +0 -1233
  510. package/esm2020/src/app/core/services/auth-guard.service.mjs +0 -71
  511. package/esm2020/src/app/core/services/base-entity-service.class.mjs +0 -468
  512. package/esm2020/src/app/core/services/base-graphql-service.class.mjs +0 -221
  513. package/esm2020/src/app/core/services/base58.mjs +0 -78
  514. package/esm2020/src/app/core/services/config.service.mjs +0 -355
  515. package/esm2020/src/app/core/services/crypto.service.mjs +0 -107
  516. package/esm2020/src/app/core/services/local-settings.service.mjs +0 -460
  517. package/esm2020/src/app/core/services/model/account.model.mjs +0 -147
  518. package/esm2020/src/app/core/services/model/config.model.mjs +0 -92
  519. package/esm2020/src/app/core/services/model/department.model.mjs +0 -30
  520. package/esm2020/src/app/core/services/model/entity.decorators.mjs +0 -97
  521. package/esm2020/src/app/core/services/model/entity.model.mjs +0 -225
  522. package/esm2020/src/app/core/services/model/peer.model.mjs +0 -68
  523. package/esm2020/src/app/core/services/model/person.model.mjs +0 -97
  524. package/esm2020/src/app/core/services/model/referential.model.mjs +0 -167
  525. package/esm2020/src/app/core/services/model/token.model.mjs +0 -48
  526. package/esm2020/src/app/core/services/network.service.mjs +0 -590
  527. package/esm2020/src/app/core/services/platform.service.mjs +0 -534
  528. package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +0 -428
  529. package/esm2020/src/app/core/services/storage/entity-store.class.mjs +0 -449
  530. package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +0 -23
  531. package/esm2020/src/app/core/services/testing/referential.validator.mjs +0 -45
  532. package/esm2020/src/app/core/services/validator/account.validator.mjs +0 -41
  533. package/esm2020/src/app/core/services/validator/base.validator.class.mjs +0 -47
  534. package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +0 -66
  535. package/esm2020/src/app/core/settings/settings.page.mjs +0 -312
  536. package/esm2020/src/app/core/table/actions-column.component.mjs +0 -102
  537. package/esm2020/src/app/core/table/async-table.class.mjs +0 -1698
  538. package/esm2020/src/app/core/table/entities-async-table-datasource.class.mjs +0 -384
  539. package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +0 -399
  540. package/esm2020/src/app/core/table/memory-table.class.mjs +0 -53
  541. package/esm2020/src/app/core/table/table-select-columns.component.mjs +0 -43
  542. package/esm2020/src/app/core/table/table.class.mjs +0 -1733
  543. package/esm2020/src/app/core/table/table.model.mjs +0 -12
  544. package/esm2020/src/app/core/table/testing/table-validator.service.mjs +0 -27
  545. package/esm2020/src/app/core/table/testing/table.testing.mjs +0 -281
  546. package/esm2020/src/app/core/table/testing/table.testing.module.mjs +0 -38
  547. package/esm2020/src/app/shared/audio/audio.mjs +0 -248
  548. package/esm2020/src/app/shared/audio/audio.testing.mjs +0 -31
  549. package/esm2020/src/app/shared/capacitor/keyboard.mjs +0 -40
  550. package/esm2020/src/app/shared/capacitor/plugins.mjs +0 -9
  551. package/esm2020/src/app/shared/dates.mjs +0 -149
  552. package/esm2020/src/app/shared/debug/debug.component.mjs +0 -39
  553. package/esm2020/src/app/shared/directives/autofocus.directive.mjs +0 -93
  554. package/esm2020/src/app/shared/directives/autotitle.directive.mjs +0 -30
  555. package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +0 -53
  556. package/esm2020/src/app/shared/directives/ng-var.directive.mjs +0 -31
  557. package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +0 -59
  558. package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +0 -40
  559. package/esm2020/src/app/shared/file/file.service.mjs +0 -117
  560. package/esm2020/src/app/shared/form/field.component.mjs +0 -332
  561. package/esm2020/src/app/shared/form/loading-spinner.mjs +0 -36
  562. package/esm2020/src/app/shared/geolocation/geolocation.utils.mjs +0 -80
  563. package/esm2020/src/app/shared/gesture/gesture-config.mjs +0 -49
  564. package/esm2020/src/app/shared/graph/graph-colors.mjs +0 -212
  565. package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +0 -57
  566. package/esm2020/src/app/shared/help/help.modal.mjs +0 -53
  567. package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
  568. package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +0 -84
  569. package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +0 -368
  570. package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +0 -27
  571. package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +0 -90
  572. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +0 -39
  573. package/esm2020/src/app/shared/image/image.service.mjs +0 -98
  574. package/esm2020/src/app/shared/inputs.mjs +0 -231
  575. package/esm2020/src/app/shared/interceptors/progess.interceptor.mjs +0 -27
  576. package/esm2020/src/app/shared/logging/logging-service.class.mjs +0 -121
  577. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +0 -47
  578. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +0 -920
  579. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -78
  580. package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +0 -209
  581. package/esm2020/src/app/shared/material/badge/badge.directive.mjs +0 -199
  582. package/esm2020/src/app/shared/material/badge/badge.test.mjs +0 -41
  583. package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +0 -68
  584. package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +0 -253
  585. package/esm2020/src/app/shared/material/chips/chips.module.mjs +0 -76
  586. package/esm2020/src/app/shared/material/chips/material.chips.mjs +0 -696
  587. package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +0 -143
  588. package/esm2020/src/app/shared/material/datetime/material.date.mjs +0 -376
  589. package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +0 -385
  590. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +0 -499
  591. package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -108
  592. package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +0 -110
  593. package/esm2020/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +0 -103
  594. package/esm2020/src/app/shared/material/duration/duration.module.mjs +0 -67
  595. package/esm2020/src/app/shared/material/duration/material.duration.mjs +0 -257
  596. package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +0 -382
  597. package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +0 -67
  598. package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -102
  599. package/esm2020/src/app/shared/material/material.module.mjs +0 -224
  600. package/esm2020/src/app/shared/material/material.testing.module.mjs +0 -168
  601. package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +0 -98
  602. package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +0 -80
  603. package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +0 -190
  604. package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +0 -17
  605. package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +0 -162
  606. package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +0 -37
  607. package/esm2020/src/app/shared/material/numpad/numpad.model.mjs +0 -15
  608. package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +0 -46
  609. package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +0 -46
  610. package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +0 -22
  611. package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +0 -344
  612. package/esm2020/src/app/shared/material/swipe/swipe.module.mjs +0 -52
  613. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +0 -64
  614. package/esm2020/src/app/shared/named-filter/named-filter-selector.component.mjs +0 -202
  615. package/esm2020/src/app/shared/named-filter/named-filter.model.mjs +0 -45
  616. package/esm2020/src/app/shared/named-filter/named-filter.service.mjs +0 -63
  617. package/esm2020/src/app/shared/pipes/colors.pipe.mjs +0 -25
  618. package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -48
  619. package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +0 -66
  620. package/esm2020/src/app/shared/pipes/date-from-now.pipe.mjs +0 -27
  621. package/esm2020/src/app/shared/pipes/duration.pipe.mjs +0 -34
  622. package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +0 -62
  623. package/esm2020/src/app/shared/pipes/form.pipes.mjs +0 -187
  624. package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +0 -46
  625. package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +0 -21
  626. package/esm2020/src/app/shared/pipes/pipes.module.mjs +0 -239
  627. package/esm2020/src/app/shared/pipes/property.pipes.mjs +0 -93
  628. package/esm2020/src/app/shared/pipes/string.pipes.mjs +0 -121
  629. package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +0 -43
  630. package/esm2020/src/app/shared/pipes/types.pipes.mjs +0 -45
  631. package/esm2020/src/app/shared/services/entity-service.class.mjs +0 -7
  632. package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +0 -339
  633. package/esm2020/src/app/shared/services/progress-bar.service.mjs +0 -33
  634. package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +0 -118
  635. package/esm2020/src/app/shared/services/startable-service.class.mjs +0 -110
  636. package/esm2020/src/app/shared/services/translate-context.service.mjs +0 -103
  637. package/esm2020/src/app/shared/shared.module.mjs +0 -231
  638. package/esm2020/src/app/shared/storage/storage-explorer.component.mjs +0 -268
  639. package/esm2020/src/app/shared/storage/storage-explorer.module.mjs +0 -47
  640. package/esm2020/src/app/shared/storage/storage.service.mjs +0 -132
  641. package/esm2020/src/app/shared/testing/observable.test.mjs +0 -95
  642. package/esm2020/src/app/shared/testing/tests.page.mjs +0 -33
  643. package/esm2020/src/app/shared/toast/toast.testing.mjs +0 -51
  644. package/esm2020/src/app/shared/toast/toasts.mjs +0 -144
  645. package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +0 -58
  646. package/esm2020/src/app/shared/toolbar/toolbar.mjs +0 -251
  647. package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +0 -53
  648. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +0 -58
  649. package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +0 -97
  650. package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +0 -204
  651. package/esm2020/src/app/shared/upload-file/upload-file.model.mjs +0 -20
  652. package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +0 -104
  653. package/esm2020/src/app/shared/validator/validators.mjs +0 -580
  654. package/esm2020/src/app/shared/version/versions.mjs +0 -81
  655. package/esm2020/src/app/social/job/job.module.mjs +0 -42
  656. package/esm2020/src/app/social/job/progression/job-progression.component.mjs +0 -20
  657. package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +0 -216
  658. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +0 -43
  659. package/esm2020/src/app/social/job/progression/job-progression.model.mjs +0 -23
  660. package/esm2020/src/app/social/job/progression/job-progression.service.mjs +0 -71
  661. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +0 -52
  662. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +0 -55
  663. package/esm2020/src/app/social/message/message.form.mjs +0 -136
  664. package/esm2020/src/app/social/message/message.modal.mjs +0 -99
  665. package/esm2020/src/app/social/message/message.model.mjs +0 -67
  666. package/esm2020/src/app/social/message/message.module.mjs +0 -22
  667. package/esm2020/src/app/social/message/message.service.mjs +0 -105
  668. package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -114
  669. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -246
  670. package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +0 -227
  671. package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +0 -112
  672. package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +0 -111
  673. package/esm2020/src/app/social/user-event/user-event.module.mjs +0 -39
  674. package/esm2020/src/app/social/user-event/user-event.service.mjs +0 -501
  675. package/esm2020/src/environments/environment.class.mjs +0 -5
  676. package/esm2020/src/environments/environment.loader.mjs +0 -79
  677. package/esm2020/src/environments/environment.mjs +0 -97
  678. package/fesm2015/sumaris-net.ngx-components.mjs +0 -40966
  679. package/fesm2015/sumaris-net.ngx-components.mjs.map +0 -1
  680. package/fesm2020/sumaris-net.ngx-components.mjs.map +0 -1
  681. package/resources/README.md +0 -7
  682. package/src/assets/environments/environment-test.json +0 -6
  683. package/src/environments/environment.loader.d.ts +0 -26
  684. /package/{esm2020 → esm2022}/src/app/core/services/errors.mjs +0 -0
  685. /package/{esm2020 → esm2022}/src/app/core/services/model/filter.model.mjs +0 -0
  686. /package/{esm2020 → esm2022}/src/app/core/services/model/history.model.mjs +0 -0
  687. /package/{esm2020 → esm2022}/src/app/core/services/model/model.enum.mjs +0 -0
  688. /package/{esm2020 → esm2022}/src/app/core/services/model/settings.model.mjs +0 -0
  689. /package/{esm2020 → esm2022}/src/app/core/services/model/tree-item-entity.model.mjs +0 -0
  690. /package/{esm2020 → esm2022}/src/app/core/services/network.types.mjs +0 -0
  691. /package/{esm2020 → esm2022}/src/app/core/services/network.utils.mjs +0 -0
  692. /package/{esm2020 → esm2022}/src/app/core/table/table.utils.mjs +0 -0
  693. /package/{esm2020 → esm2022}/src/app/shared/alerts.mjs +0 -0
  694. /package/{esm2020 → esm2022}/src/app/shared/constants.mjs +0 -0
  695. /package/{esm2020 → esm2022}/src/app/shared/debug/debug-service.class.mjs +0 -0
  696. /package/{esm2020 → esm2022}/src/app/shared/events.mjs +0 -0
  697. /package/{esm2020 → esm2022}/src/app/shared/file/csv.utils.mjs +0 -0
  698. /package/{esm2020 → esm2022}/src/app/shared/file/images.utils.mjs +0 -0
  699. /package/{esm2020 → esm2022}/src/app/shared/file/json.utils.mjs +0 -0
  700. /package/{esm2020 → esm2022}/src/app/shared/file/uri.utils.mjs +0 -0
  701. /package/{esm2020 → esm2022}/src/app/shared/focusable.mjs +0 -0
  702. /package/{esm2020 → esm2022}/src/app/shared/forms.mjs +0 -0
  703. /package/{esm2020 → esm2022}/src/app/shared/gesture/hammer.utils.mjs +0 -0
  704. /package/{esm2020 → esm2022}/src/app/shared/graph/colors.utils.mjs +0 -0
  705. /package/{esm2020 → esm2022}/src/app/shared/http/http.utils.mjs +0 -0
  706. /package/{esm2020 → esm2022}/src/app/shared/image/image.model.mjs +0 -0
  707. /package/{esm2020 → esm2022}/src/app/shared/logging/log-level.model.mjs +0 -0
  708. /package/{esm2020 → esm2022}/src/app/shared/logging/logger.model.mjs +0 -0
  709. /package/{esm2020 → esm2022}/src/app/shared/logging/logging-service.config.mjs +0 -0
  710. /package/{esm2020 → esm2022}/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +0 -0
  711. /package/{esm2020 → esm2022}/src/app/shared/material/material.animations.mjs +0 -0
  712. /package/{esm2020 → esm2022}/src/app/shared/modules.mjs +0 -0
  713. /package/{esm2020 → esm2022}/src/app/shared/observables.mjs +0 -0
  714. /package/{esm2020 → esm2022}/src/app/shared/platforms.mjs +0 -0
  715. /package/{esm2020 → esm2022}/src/app/shared/services/job.utils.mjs +0 -0
  716. /package/{esm2020 → esm2022}/src/app/shared/services/validator-service.class.mjs +0 -0
  717. /package/{esm2020 → esm2022}/src/app/shared/services.mjs +0 -0
  718. /package/{esm2020 → esm2022}/src/app/shared/types.mjs +0 -0
  719. /package/{esm2020 → esm2022}/src/app/social/social.errors.mjs +0 -0
  720. /package/{esm2020 → esm2022}/src/app/social/user-event/user-event.model.mjs +0 -0
  721. /package/{esm2020 → esm2022}/sumaris-net.ngx-components.mjs +0 -0
@@ -1,920 +0,0 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, forwardRef, Inject, Input, Optional, Output, ViewChild } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
3
- import { BehaviorSubject, isObservable, merge, Subject, Subscription, timer } from 'rxjs';
4
- import { debounceTime, distinctUntilChanged, filter, map, mergeMap, startWith, switchMap, takeUntil, tap } from 'rxjs/operators';
5
- import { changeCaseToUnderscore, findParentWithClass, isBlankString, isNil, isNilOrBlank, isNotNil, isNotNilBoolean, isNotNilOrBlank, isNotNilString, toBoolean, toNumber } from '../../functions';
6
- import { focusInput, selectInputRange } from '../../inputs';
7
- import { firstNotNilPromise } from '../../observables';
8
- import { MatAutocomplete, MatAutocompleteTrigger } from '@angular/material/autocomplete';
9
- import { fromScrollEndEvent } from '../../events';
10
- import { isMobile } from '../../platforms';
11
- import { suggestFromArray } from '../../services';
12
- import { MatAutocompleteFieldUtils } from './material.autocomplete.utils';
13
- import { DOCUMENT } from '@angular/common';
14
- import * as i0 from "@angular/core";
15
- import * as i1 from "@ionic/angular";
16
- import * as i2 from "@angular/forms";
17
- import * as i3 from "@angular/common";
18
- import * as i4 from "../../pipes/ng-init.pipe";
19
- import * as i5 from "../../directives/autofocus.directive";
20
- import * as i6 from "@angular/material/autocomplete";
21
- import * as i7 from "@angular/material/core";
22
- import * as i8 from "@angular/material/form-field";
23
- import * as i9 from "@angular/material/input";
24
- import * as i10 from "@angular/material/icon";
25
- import * as i11 from "@angular/material/button";
26
- import * as i12 from "@angular/material/select";
27
- import * as i13 from "@ngx-translate/core";
28
- import * as i14 from "../../pipes/property.pipes";
29
- import * as i15 from "../../pipes/highlight.pipe";
30
- import * as i16 from "../../pipes/arrays.pipe";
31
- import * as i17 from "../../pipes/string.pipes";
32
- const noop = (_) => { };
33
- export class MatAutocompleteField {
34
- constructor(cd, modalController, renderer, document, viewRef, formGroupDir) {
35
- this.cd = cd;
36
- this.modalController = modalController;
37
- this.renderer = renderer;
38
- this.document = document;
39
- this.viewRef = viewRef;
40
- this.formGroupDir = formGroupDir;
41
- this._onChangeCallback = noop;
42
- this._onTouchedCallback = noop;
43
- this._subscription = new Subscription();
44
- this._$filter = new BehaviorSubject(undefined);
45
- this._reload$ = new Subject();
46
- this._readonly = false;
47
- this._$inputItems = new BehaviorSubject(undefined);
48
- this._$filteredItems = new BehaviorSubject(undefined);
49
- this._displayValue = '';
50
- this._fetchMore$ = new EventEmitter();
51
- this.logPrefix = '[mat-autocomplete] ';
52
- this.formControlName = null;
53
- this.required = false;
54
- this.clearable = false;
55
- this.debounceTime = null;
56
- this.autofocus = false;
57
- this.i18nPrefix = 'REFERENTIAL.';
58
- this.noResultMessage = 'COMMON.NO_RESULT';
59
- this.fetchMoreThreshold = '15%';
60
- this.suggestLengthThreshold = null;
61
- this.showLoadingSpinner = true;
62
- this.debug = false;
63
- this.showSearchBar = true;
64
- this.stickySearchBar = false;
65
- this.applyImplicitValue = false;
66
- this.clicked = new EventEmitter();
67
- this.blurred = new EventEmitter();
68
- this.focused = new EventEmitter();
69
- this.dropButtonClick = new EventEmitter(true);
70
- this.keydownEscape = new EventEmitter();
71
- this.keyupEnter = new EventEmitter();
72
- }
73
- get itemCount() {
74
- return this._itemCount;
75
- }
76
- get canFetchMore() {
77
- return this._onFetchMoreCallback && this._moreItemsCount > 0;
78
- }
79
- set filter(value) {
80
- if (value !== this._$filter.value) {
81
- // DEBUG
82
- //console.debug(this.logPrefix + " Setting filter:", value);
83
- this._$filter.next(value);
84
- }
85
- }
86
- get filter() {
87
- return this._$filter.value;
88
- }
89
- set readonly(value) {
90
- this._readonly = value;
91
- this.markForCheck();
92
- }
93
- get readonly() {
94
- return this._readonly;
95
- }
96
- set tabindex(value) {
97
- this._tabindex = value;
98
- this.markForCheck();
99
- }
100
- get tabindex() {
101
- return this._tabindex;
102
- }
103
- set items(value) {
104
- // Remove previous subscription on items, (if exits)
105
- if (this._itemsSubscription) {
106
- console.warn(this.logPrefix + ' Items received twice !');
107
- this._subscription.remove(this._itemsSubscription);
108
- this._itemsSubscription.unsubscribe();
109
- }
110
- if (isObservable(value)) {
111
- this._itemsSubscription = value.subscribe(v => this._$inputItems.next(v));
112
- this._subscription.add(this._itemsSubscription);
113
- }
114
- else {
115
- if (value !== this._$inputItems.value) {
116
- this._$inputItems.next(value);
117
- }
118
- }
119
- }
120
- get items() {
121
- return this._$inputItems;
122
- }
123
- get value() {
124
- return this.formControl.value;
125
- }
126
- get disabled() {
127
- return this._readonly || this.formControl.disabled;
128
- }
129
- get enabled() {
130
- return !this._readonly && this.formControl.enabled;
131
- }
132
- get loading() {
133
- return isNil(this._$filteredItems.value);
134
- }
135
- get desktop() {
136
- return !this.mobile && !this.multiple;
137
- }
138
- ngOnInit() {
139
- this.formControl = this.formControl || this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName);
140
- if (!this.formControl)
141
- throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-autocomplete-field>.');
142
- // Configuration from config object
143
- if (this.config) {
144
- this.suggestFn = this.suggestFn || this.config.suggestFn;
145
- if (!this.suggestFn && this.config.items) {
146
- this.items = this.config.items;
147
- }
148
- this.filter = this.filter || this.config.filter;
149
- this.displayAttributes = this.displayAttributes || this.config.attributes;
150
- this.displayColumnSizes = this.displayColumnSizes || this.config.columnSizes;
151
- this.displayColumnNames = this.displayColumnNames || this.config.columnNames;
152
- this.displayWith = this.displayWith || this.config.displayWith;
153
- this.equals = this.equals || this.config.equals;
154
- this.multiple = toBoolean(this.multiple, this.config.multiple);
155
- this.mobile = toBoolean(this.mobile, this.config.mobile);
156
- this.suggestLengthThreshold = toNumber(this.suggestLengthThreshold, this.config.suggestLengthThreshold);
157
- this.showAllOnFocus = toBoolean(this.showAllOnFocus, this.config.showAllOnFocus);
158
- this.showPanelOnFocus = toBoolean(this.showPanelOnFocus, this.config.showPanelOnFocus);
159
- this.classList = this.classList || this.config.class;
160
- this.debounceTime = toNumber(this.debounceTime, this.config.debounceTime);
161
- this.highlightAccent = toBoolean(this.highlightAccent, toBoolean(this.config.highlightAccent));
162
- }
163
- // Default values
164
- this.required = isNotNilBoolean(this.required) ? this.required : (this.formControl.validator === Validators.required || isBlankString(this.required));
165
- this.multiple = toBoolean(this.multiple, false);
166
- this.mobile = isNotNil(this.mobile) ? this.mobile : (this.multiple || isMobile(window));
167
- this.displayAttributes = this.displayAttributes || this.filter?.attributes || ['label', 'name'];
168
- this.displayWith = this.displayWith || MatAutocompleteFieldUtils.createDisplayFn(this.displayAttributes, this.multiple);
169
- this.equals = this.equals || MatAutocompleteFieldUtils.defaultEquals;
170
- this.displayColumnSizes = this.displayColumnSizes
171
- // if only column: auto size
172
- || (this.displayAttributes.length === 1 && [undefined])
173
- // Computed column size:
174
- // - if label then col size = 2
175
- // - if rankOrder then col size = 1
176
- // - ese => auto size
177
- || this.displayAttributes.map(attr => attr && (attr.endsWith('label') ? 3
178
- : (attr.endsWith('rankOrder') ? 2
179
- : undefined)));
180
- this.displayColumnNames = this.displayAttributes.map((attr, index) => this.displayColumnNames && this.displayColumnNames[index] ||
181
- (this.i18nPrefix + changeCaseToUnderscore(attr).toUpperCase()));
182
- const classList = this.classList?.split(' ');
183
- this.panelWidth = this.panelWidth || (classList && ((classList.includes('min-width-medium') && '300px')
184
- || (classList.includes('min-width-large') && '400px')
185
- || (classList.includes('min-width-xlarge') && '450px')
186
- || (classList.includes('min-width-80vw') && '80vw')
187
- || (classList.includes('mat-autocomplete-panel-full-size') && '100vw')));
188
- this.suggestLengthThreshold = this.suggestLengthThreshold || 0;
189
- this.showAllOnFocus = toBoolean(this.showAllOnFocus, this.mobile && this.suggestLengthThreshold <= 0);
190
- this.showPanelOnFocus = toBoolean(this.showPanelOnFocus, true);
191
- this.debounceTime = toNumber(this.debounceTime, this.mobile ? 650 : 250);
192
- this.highlightAccent = toBoolean(this.highlightAccent, false);
193
- this.matAutocompletePosition = this.matAutocompletePosition || 'auto';
194
- // No suggestFn: filter on the given items
195
- if (!this.suggestFn) {
196
- const suggestFromArrayFn = async (value, filter) =>
197
- // DEBUG
198
- //console.debug(this.logPrefix + ' Calling suggestFromArray with value=', value);
199
- suggestFromArray(this._$inputItems.value, value, {
200
- searchAttributes: this.displayAttributes,
201
- ...filter
202
- });
203
- // Wait (once) that items are loaded, then call suggest from array fn
204
- this.suggestFn = async (value, filter) => {
205
- if (isNil(this._$inputItems.value)) {
206
- // DEBUG
207
- //console.debug(this.logPrefix + " Waiting items to be set...");
208
- await firstNotNilPromise(this._$inputItems);
209
- // DEBUG
210
- //console.debug(this.logPrefix + " Received items:", this.inputItems$.value);
211
- }
212
- this.suggestFn = suggestFromArrayFn;
213
- return this.suggestFn(value, filter); // Loop
214
- };
215
- }
216
- // Suggest + mobile
217
- // => Manually fill input items, from the given suggest function
218
- else if (this.mobile || this.multiple) {
219
- /*this._subscription.add(
220
- this._$filter.pipe(
221
- startWith<any, any>(this.filter),
222
- debounceTime(250),
223
- filter(_ => this.suggestLengthThreshold <= 0),
224
- switchMap((filter) => this.suggest('*', filter))
225
- )
226
- .subscribe(items => this.$inputItems.next(items))
227
- );*/
228
- }
229
- // Send value to suggest when :
230
- // - is nil and '*', and no min length threshold
231
- // - is not nil and not a string type (e.g. object)
232
- // - is not nil and is a string, and has enough character
233
- const thresholdFilterFn = (value) => this.suggestLengthThreshold <= 0 || (isNotNil(value) && (!(typeof value === 'string')
234
- || (value !== '*' && value.trim().length >= this.suggestLengthThreshold)));
235
- const filteredItemsChanges = merge(
236
- // Reload event (no distinctUntilChanged() pipe, to force reload even if same value)
237
- this._reload$
238
- .pipe(filter(() => this.enabled), filter(thresholdFilterFn), tap(_ => this.showLoadingSpinner && this.markAsLoading())),
239
- // Search text (no distinctUntilChanged() because of the debounceTime() pipe)
240
- this.formControl.valueChanges
241
- .pipe(filter(value => this.enabled && isNotNilString(value)),
242
- // Mark as loading (to show loading spinner) - as soon as possible, and before debounceTime
243
- tap(_ => this.showLoadingSpinner && this.markAsLoading()),
244
- // Filter if not enough character
245
- filter(value => {
246
- if ((value?.length || 0) < this.suggestLengthThreshold) {
247
- // Update display value, to enable the message "not enough characters"
248
- this._displayValue = value;
249
- return false;
250
- }
251
- return true;
252
- }),
253
- // Wait a debounce time
254
- debounceTime(this.debounceTime)
255
- // DEBUG
256
- //,tap((value) => this.debug && console.debug(this.logPrefix + ' Search text changes:', value))
257
- ),
258
- // Object set: use it (no distinctUntilChanged() pipe need)
259
- this.formControl.valueChanges
260
- .pipe(startWith(this.formControl.value), filter(value => (isNotNil(value) && typeof value === 'object')), tap(value => {
261
- // DEBUG
262
- //if (this.debug) console.debug(this.logPrefix + ' control object changes:', value);
263
- // Update the display value (if need)
264
- const displayValue = this.displayWith(value) || '';
265
- if (this._displayValue !== displayValue) {
266
- this._displayValue = displayValue;
267
- // Apply to the input[type=text] field
268
- if (this.matInputText?.nativeElement) {
269
- this.matInputText.nativeElement.value = this._displayValue;
270
- }
271
- this.markForCheck();
272
- }
273
- }),
274
- // If multiple: do not recompute items (only for the first time, when loading)
275
- // when formControl value changes
276
- filter(() => !this.multiple || this.loading), map(value => this.showAllOnFocus && this.suggestLengthThreshold <= 0 ? '*' : value)
277
- // DEBUG
278
- //,tap(value => this.debug && console.debug(this.logPrefix + ' Received an control object value: ', value))
279
- ),
280
- // Merge some observables, with a common distinctUntilChanged() pipe
281
- merge(
282
- // On dropdown button click (no debounceTime)
283
- this.dropButtonClick
284
- .pipe(filter(event => (!event || !event.defaultPrevented))),
285
- // Focus or click => Load all (no debounceTime)
286
- merge(this.focused, this.clicked),
287
- // DEBUG
288
- //.pipe(tap(_ => this.debug && console.debug(this.logPrefix + ' Received focused or clicked event'))),
289
- // Input items or filter changes
290
- merge(this._$inputItems, this._$filter)
291
- // DEBUG
292
- .pipe(filter(_ => !this.loading)
293
- //,tap(_ => this.debug && console.debug(this.logPrefix + ' Received $inputItems or filter event'))
294
- ))
295
- .pipe(filter(_ => this.enabled), map(_ => this.showAllOnFocus ? '*' : this.formControl.value),
296
- // Distinguish changes
297
- distinctUntilChanged((v1, v2) =>
298
- // If loading (not loaded yet), simulate that value changed to force load
299
- this.loading ? false : (v1 === v2 || this.equals(v1, v2))),
300
- // Make sure there is enough characters
301
- filter(thresholdFilterFn)
302
- // DEBUG
303
- //,tap(value => this.debug && console.debug(this.logPrefix + ' Received update event from observables: ', value))
304
- ))
305
- .pipe(
306
- // Suggest values
307
- mergeMap(value => this.suggest(value, this.filter)),
308
- // DEBUG
309
- //tap(items => this.debug && console.debug(this.logPrefix + ' Received from suggest: ', items)),
310
- // Store implicit value (will use it onBlur if not other value selected)
311
- tap(items => !this.multiple && !this.mobile && this.updateImplicitValue(items)));
312
- // Fetch more events
313
- const fetchMoreItemsChanges = this._fetchMore$
314
- .pipe(tap(event => event?.preventDefault()), // Avoid to close the mat-select
315
- filter(() => this.canFetchMore), mergeMap(() => this.fetchMore()),
316
- // DEBUG
317
- //tap(moreItems => console.debug(this.logPrefix + ' Received from fetch More: ', moreItems)),
318
- // Concat to existing items
319
- map(moreItems => (this._$filteredItems.value || []).concat(moreItems)));
320
- // Update filtered items
321
- this._subscription.add(merge(this._$inputItems,
322
- // Update items events
323
- filteredItemsChanges,
324
- // Fetch more events
325
- fetchMoreItemsChanges)
326
- .subscribe(items => {
327
- // Make sure control value is inside (mat-select)
328
- if (items && (this.mobile || this.multiple)) {
329
- const value = this.formControl.value;
330
- // If form value is missing: append to list
331
- if (isNotNil(value)) {
332
- if (this.multiple && Array.isArray(value)) {
333
- items = items.concat(value.filter(v => items.findIndex(item => this.equals(item, v)) === -1));
334
- }
335
- else if (typeof value === 'object' && items.findIndex(item => this.equals(item, value)) === -1) {
336
- items = items.concat(value);
337
- }
338
- }
339
- }
340
- // Emit items
341
- this._$filteredItems.next(items);
342
- }));
343
- // Applying implicit value, on blur
344
- this._subscription.add(this.blurred
345
- .pipe(
346
- // Skip if multiple (no implicit value) or disable
347
- filter(_ => !this.multiple && !this.mobile && this.enabled),
348
- // DEBUG
349
- //,tap(_ => this.debug && console.debug(this.logPrefix + ' Received blurred event')),
350
- map(_ => this.formControl.value))
351
- .subscribe(value => {
352
- // When leave component without object, use implicit value if :
353
- // - an explicit value
354
- // - field is not empty (user fill something)
355
- // - OR field empty but is required
356
- if (this._implicitValue && ((this.required && isNilOrBlank(value)) || (isNotNilOrBlank(value) && typeof value !== 'object'))) {
357
- this.writeValue(this._implicitValue);
358
- this.formControl.markAsPending({ emitEvent: false, onlySelf: true });
359
- this.formControl.updateValueAndValidity({ emitEvent: false, onlySelf: true });
360
- this.checkIfTouched();
361
- this._$filteredItems.next([this._implicitValue]);
362
- }
363
- else if (isNilOrBlank(value)) {
364
- this.writeValue(null);
365
- this.formControl.markAsPending({ emitEvent: false, onlySelf: true });
366
- this.formControl.updateValueAndValidity({ emitEvent: false, onlySelf: true });
367
- this.checkIfTouched();
368
- this.markAsLoading();
369
- }
370
- this._implicitValue = null; // reset the implicit value
371
- this.closePanel(); // Clone panel
372
- }));
373
- // Listen form control status change
374
- this._subscription.add(this.formControl.statusChanges
375
- .pipe(distinctUntilChanged())
376
- // Update component state
377
- .subscribe(() => this.checkIfTouched()));
378
- this._subscription.add(this.keydownEscape.subscribe(event => {
379
- if (this.isOpen) {
380
- // Avoid form or page to manage escape event
381
- event?.stopPropagation();
382
- event?.preventDefault();
383
- // DEBUG
384
- //console.debug(this.logPrefix + " Closing the panel (keydown.escape)");
385
- this.closePanel();
386
- }
387
- }));
388
- }
389
- ngAfterViewInit() {
390
- this._fixMatSelectPositionAndSearchbar();
391
- }
392
- ngOnDestroy() {
393
- this._subscription.unsubscribe();
394
- if (this._itemsSubscription) {
395
- this._itemsSubscription.unsubscribe();
396
- }
397
- if (this._openedSubscription) {
398
- this._openedSubscription.unsubscribe();
399
- }
400
- this._$inputItems.complete();
401
- this._$inputItems.unsubscribe();
402
- this._$filteredItems.complete();
403
- this._$filteredItems.unsubscribe();
404
- this._reload$.complete();
405
- this._$filter.complete();
406
- this.dropButtonClick.complete();
407
- this.clicked.complete();
408
- this.blurred.complete();
409
- this.focused.complete();
410
- this.keydownEscape.complete();
411
- this.keyupEnter.complete();
412
- this._fetchMore$.complete();
413
- this._implicitValue = undefined;
414
- this.formControl = null;
415
- this.displayWith = null;
416
- this.equals = null;
417
- this.suggestFn = null;
418
- this._$filteredItems = null;
419
- this.config = null;
420
- this.classList = null;
421
- this._onChangeCallback = null;
422
- this._onTouchedCallback = null;
423
- this._onFetchMoreCallback = null;
424
- // Destroy the 'autocomplete' instance, to avoid memory leak
425
- if (this.autocomplete) {
426
- this.autocomplete.ngOnDestroy();
427
- }
428
- }
429
- /**
430
- * Allow to reload content. Useful when filter has been changed but not detected
431
- */
432
- reloadItems(value) {
433
- // DEBUG
434
- //if (this.debug) console.debug(this.logPrefix + " Asking to reloadItems()");
435
- // Force a refresh
436
- this._reload$.next(value || (this.showAllOnFocus && this.suggestLengthThreshold <= 0 ? '*' : this.formControl.value));
437
- // Clear the search bar (if hidden)
438
- if (this.mobile && !this.matSelect.panelOpen && this.ionSearchbar) {
439
- this.ionSearchbar.value = null;
440
- }
441
- }
442
- writeValue(value) {
443
- // DEBUG
444
- // if (this.debug) console.debug(this.logPrefix + ' Writing value: ', value);
445
- if (value !== this.formControl.value) {
446
- this.formControl.patchValue(value, { emitEvent: false });
447
- this._displayValue = this.displayWith(value);
448
- this._onChangeCallback(value);
449
- }
450
- }
451
- registerOnChange(fn) {
452
- this._onChangeCallback = fn;
453
- }
454
- registerOnTouched(fn) {
455
- this._onTouchedCallback = fn;
456
- }
457
- setDisabledState(isDisabled) {
458
- if (isDisabled && this.autocomplete?.isOpen) {
459
- this.closePanel();
460
- }
461
- this.cd.markForCheck();
462
- }
463
- focus() {
464
- if (this.mobile) {
465
- this.matSelect.focus();
466
- }
467
- else {
468
- focusInput(this.matInputText);
469
- }
470
- }
471
- filterInputTextFocusEvent(event) {
472
- if (!event || event.defaultPrevented)
473
- return;
474
- // Ignore event from mat-option
475
- if (event.relatedTarget instanceof HTMLElement && event.relatedTarget.tagName === 'MAT-OPTION') {
476
- event.preventDefault();
477
- if (event.stopPropagation)
478
- event.stopPropagation();
479
- event.returnValue = false;
480
- // DEBUG
481
- //if (this.debug) console.debug(this.logPrefix + ' Cancelling focus event');
482
- return false;
483
- }
484
- // DEBUG
485
- //if (this.debug) console.debug(this.logPrefix + ' Select input content');
486
- const hasContent = isNotNilOrBlank(event.target?.value);
487
- // If combo is empty, or if has content but should force to show panel on focus
488
- if (!hasContent || this.showPanelOnFocus || this.showAllOnFocus) {
489
- // DEBUG
490
- //if (this.debug) console.debug(this.logPrefix + ' Emit focus event');
491
- this.focused.emit();
492
- return true;
493
- }
494
- return false;
495
- }
496
- filterInputTextBlurEvent(event) {
497
- if (!event || event.defaultPrevented)
498
- return;
499
- // Ignore event from mat-option
500
- if (event.relatedTarget instanceof HTMLElement && event.relatedTarget.tagName === 'MAT-OPTION') {
501
- event.preventDefault();
502
- if (event.stopPropagation)
503
- event.stopPropagation();
504
- event.returnValue = false;
505
- // DEBUG
506
- //if (this.debug) console.debug(this.logPrefix + " Cancelling blur event");
507
- return false;
508
- }
509
- // DEBUG
510
- //if (this.debug) console.debug(this.logPrefix + ' Blur: move caret to the beginning');
511
- // Move caret to the beginning (fix issue IMAGINE-469)
512
- selectInputRange(event.target, 0, 0);
513
- this.blurred.emit(event);
514
- return true;
515
- }
516
- ionSearchBarChanged(event) {
517
- if (!event || event.defaultPrevented || !this.matSelect.panelOpen)
518
- return;
519
- event.preventDefault();
520
- event.stopPropagation();
521
- // DEBUG
522
- //console.debug(this.logPrefix + " Received <ion-searchbar> changes", );
523
- // Get the value to search
524
- const value = event?.detail.value;
525
- // Update the display value (in the visible form control)
526
- if (!this.multiple) {
527
- this._displayValue = value;
528
- }
529
- // Mark component as loading
530
- this.markAsLoading();
531
- // Reload items
532
- this.reloadItems(value);
533
- // TODO Find a way to avoid mat-select to give focus to an option, when typing
534
- /*if (this.multiple) {
535
- this.matSelect._elementRef;
536
- }*/
537
- }
538
- filterMatSelectFocusEvent(event) {
539
- if (!event || event.defaultPrevented)
540
- return;
541
- // DEBUG
542
- console.debug(this.logPrefix + ' Received <mat-select> focus event', event);
543
- this.focused.emit(event);
544
- }
545
- filterMatSelectBlurEvent(event) {
546
- if (!event || event.defaultPrevented)
547
- return;
548
- // DEBUG
549
- // console.debug(this.logPrefix + " Received <mat-select> blur event", event);
550
- if (event.relatedTarget instanceof HTMLElement && (
551
- // Ignore event from mat-option
552
- (event.relatedTarget.tagName === 'MAT-OPTION')
553
- || (event.relatedTarget.tagName === 'INPUT') && event.relatedTarget.classList.contains('searchbar-input'))) {
554
- event.preventDefault();
555
- if (event.stopPropagation)
556
- event.stopPropagation();
557
- event.returnValue = false;
558
- // DEBUG
559
- // console.debug(this.logPrefix + " Cancelling <mat-select> blur event");
560
- return false;
561
- }
562
- this.blurred.emit(event);
563
- return true;
564
- }
565
- clearValue(event) {
566
- this.writeValue(null);
567
- event?.stopPropagation();
568
- if (this.ionSearchbar) {
569
- this.ionSearchbar.value = null;
570
- }
571
- this.markAsLoading();
572
- }
573
- _initAutocompleteInfiniteScroll(threshold) {
574
- if (!this.autocomplete)
575
- return; // Skip
576
- // DEBUG
577
- //console.debug(this.logPrefix + ' Init autocomplete scroll listener');
578
- if (this._openedSubscription) {
579
- this._openedSubscription.unsubscribe();
580
- this._subscription.remove(this._openedSubscription);
581
- }
582
- const opened$ = this.autocomplete._isOpen
583
- ? timer(0)
584
- : this.autocomplete.opened.pipe(debounceTime(200));
585
- const scrollEnd$ = opened$
586
- .pipe(map((_) => this.getAutocompletePanel()), filter(isNotNil), switchMap((panel) => fromScrollEndEvent(panel, threshold)), takeUntil(this.autocomplete.closed));
587
- // Trigger fetch more, end end scroll reached
588
- this._openedSubscription = scrollEnd$
589
- .subscribe(() => this._fetchMore$.emit());
590
- // Register subscription
591
- this._subscription.add(this._openedSubscription);
592
- }
593
- _initMatSelectInfiniteScroll(threshold) {
594
- if (!this.matSelect)
595
- return; // Skip
596
- // DEBUG
597
- //console.debug(this.logPrefix + ' Init mat-select scroll listener');
598
- if (this._openedSubscription) {
599
- this._openedSubscription.unsubscribe();
600
- this._subscription.remove(this._openedSubscription);
601
- }
602
- const opened$ = this.matSelect.panelOpen
603
- ? timer(0)
604
- : this.matSelect._openedStream.pipe(debounceTime(200));
605
- const scrollEnd$ = opened$
606
- .pipe(map((_) => this.getMatSelectPanel()), filter(isNotNil), switchMap((panel) => fromScrollEndEvent(panel, threshold)), takeUntil(this.matSelect._closedStream));
607
- // Trigger fetch more, end end scroll reached
608
- this._openedSubscription = scrollEnd$
609
- .pipe(filter(_ => this._moreItemsCount > 0))
610
- .subscribe(() => this._fetchMore$.emit());
611
- // Register subscription
612
- this._subscription.add(this._openedSubscription);
613
- }
614
- get isOpen() {
615
- return (!this.mobile && this.autocomplete?.isOpen)
616
- || (this.matSelect?.panelOpen)
617
- || false;
618
- }
619
- closePanel() {
620
- if (this.autocomplete?.isOpen) {
621
- this.autocompleteTrigger?.closePanel();
622
- return;
623
- }
624
- if (this.matSelect?.panelOpen) {
625
- this.matSelect?.close();
626
- }
627
- }
628
- /* -- private method -- */
629
- async suggest(value, filter) {
630
- // Call suggestion function
631
- let res = await this.suggestFn(value, filter);
632
- // DEBUG
633
- //if (this.debug) console.debug(this.logPrefix + ' Filtered items by suggestFn:', value, res);
634
- if (!res) {
635
- this._itemCount = 0;
636
- this._onFetchMoreCallback = undefined;
637
- this._moreItemsCount = 0;
638
- res = [];
639
- }
640
- else if (Array.isArray(res)) {
641
- res = res;
642
- this._itemCount = res?.length || 0;
643
- this._onFetchMoreCallback = undefined;
644
- this._moreItemsCount = 0;
645
- }
646
- else {
647
- const { data, total, fetchMore } = res;
648
- this._itemCount = toNumber(total, data && data.length || 0);
649
- this._onFetchMoreCallback = fetchMore;
650
- this._moreItemsCount = fetchMore && (this._itemCount - data.length) || 0;
651
- res = data;
652
- }
653
- // DEBUG
654
- //if (this.debug) console.debug(this.logPrefix + ' Filtered items by suggestFn:', value, res);
655
- return res;
656
- }
657
- async fetchMore() {
658
- if (!this._onFetchMoreCallback)
659
- return [];
660
- // Save then remove fetch function (to avoid multi-call)
661
- const fetchMoreFn = this._onFetchMoreCallback;
662
- this._onFetchMoreCallback = undefined;
663
- const { data, total, fetchMore } = await fetchMoreFn();
664
- this._itemCount = total || this._itemCount;
665
- this._onFetchMoreCallback = fetchMore;
666
- this._moreItemsCount = Math.max(0, this._moreItemsCount - data.length); // Borne min = 0
667
- return data;
668
- }
669
- updateImplicitValue(items) {
670
- const applyImplicitValue = (typeof this.applyImplicitValue === 'function') ? this.applyImplicitValue() : this.applyImplicitValue;
671
- if (!this.multiple && applyImplicitValue) {
672
- // Store implicit value (will use it onBlur if not other value selected)
673
- if (items && items.length === 1) {
674
- this._implicitValue = items[0];
675
- //this.formControl.setErrors(null);
676
- }
677
- else {
678
- this._implicitValue = undefined;
679
- }
680
- }
681
- }
682
- checkIfTouched() {
683
- if (this.formControl.touched) {
684
- this.cd.markForCheck();
685
- this._onTouchedCallback();
686
- }
687
- }
688
- getAutocompletePanel() {
689
- const ele = this.autocomplete?.options.last?._getHostElement().parentElement;
690
- if (!ele) {
691
- // DEBUG
692
- console.warn(this.logPrefix + ' Unable to find the autocomplete div...');
693
- }
694
- return ele;
695
- }
696
- getMatSelectPanel() {
697
- const ele = this.matSelect.options.last?._getHostElement().parentElement;
698
- if (!ele) {
699
- // DEBUG
700
- console.warn(this.logPrefix + ' Unable to find the mat-select container...');
701
- }
702
- return ele;
703
- }
704
- markForCheck() {
705
- this.cd.markForCheck();
706
- }
707
- markAsLoading() {
708
- if (this._$filteredItems.value) {
709
- this._$filteredItems.next(undefined);
710
- this._itemCount = undefined;
711
- this._implicitValue = undefined;
712
- this._onFetchMoreCallback = undefined;
713
- this._moreItemsCount = 0;
714
- this.markForCheck();
715
- }
716
- }
717
- _fixMatSelectPositionAndSearchbar() {
718
- if (!this.matSelect)
719
- return;
720
- // Hide the panel (will be show when ready)
721
- this.matSelect.panelClass = 'cdk-visually-hidden';
722
- let subscription;
723
- this._subscription.add(this.matSelect.openedChange
724
- .subscribe(async (open) => {
725
- if (open) {
726
- const panelElement = this.matSelect.panel.nativeElement;
727
- const overlayPane = findParentWithClass(panelElement, 'cdk-overlay-pane');
728
- // Fix left position
729
- // FIXME when search bar enable, the keyboard show readd the transformX,
730
- this._fixMatSelectPanelPosition(overlayPane);
731
- // Fix overlay, for searchbar
732
- if (this.showSearchBar) {
733
- subscription = await this._fixSearchbarOverlay(panelElement, overlayPane);
734
- this._subscription.add(subscription);
735
- }
736
- // Show the panel
737
- this.renderer.removeClass(panelElement, 'cdk-visually-hidden');
738
- }
739
- // ON close
740
- else if (subscription) {
741
- subscription.unsubscribe();
742
- this._subscription.remove(subscription);
743
- subscription = null;
744
- }
745
- }));
746
- }
747
- _fixMatSelectPanelPosition(overlayPane) {
748
- if (!overlayPane)
749
- return;
750
- // Remove the unwanted default translateX
751
- this.renderer.setStyle(overlayPane, 'transform', overlayPane.style.transform
752
- .split(' ')
753
- .filter((prop) => !prop.match(/^translateX/))
754
- .join(' '));
755
- }
756
- /**
757
- * Hack : if we are in a IonModal, it's necessary to move the CdkOverlay container
758
- * in the IonModal to might keep focus in IonSearchbar.
759
- *
760
- * @param panelElement
761
- * @private
762
- */
763
- async _fixSearchbarOverlay(panelElement, overlayPane) {
764
- if (!this.matSelect || !this.ionSearchbar)
765
- return;
766
- const modalElement = await this.modalController.getTop();
767
- if (!modalElement)
768
- return; // No modal: skip
769
- // Get the CDK overlay container
770
- const overlayContainer = findParentWithClass(panelElement, 'cdk-overlay-container');
771
- if (!overlayContainer)
772
- return;
773
- // DEBUG
774
- console.debug(`${this.logPrefix} moving the "cdk-overlay" container from the "body" to the "ion-modal" container`);
775
- const originalParent = overlayContainer.parentElement;
776
- this.renderer.appendChild(modalElement, overlayContainer);
777
- const shiftLeft = (this.document.defaultView.innerWidth - modalElement.firstElementChild.getBoundingClientRect().width) / 2;
778
- const shiftTop = (this.document.defaultView.innerHeight - modalElement.firstElementChild.getBoundingClientRect().height) / 2;
779
- this.renderer.setStyle(overlayPane, 'margin-top', `-${shiftTop}px`);
780
- this.renderer.setStyle(overlayPane, 'margin-left', `-${shiftLeft}px`);
781
- // Return the reverse function, to replace the container in body
782
- return new Subscription(() => {
783
- // DEBUG
784
- console.debug(`${this.logPrefix} moving the "cdk-overlay" container from the "ion-modal" to the "body" container`);
785
- this.renderer.appendChild(originalParent /*this.document.body*/, overlayContainer);
786
- });
787
- }
788
- }
789
- MatAutocompleteField.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MatAutocompleteField, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.ModalController }, { token: i0.Renderer2 }, { token: DOCUMENT }, { token: ChangeDetectorRef }, { token: i2.FormGroupDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component });
790
- MatAutocompleteField.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: MatAutocompleteField, selector: "mat-autocomplete-field", inputs: { equals: "equals", logPrefix: "logPrefix", formControl: "formControl", formControlName: "formControlName", floatLabel: "floatLabel", appearance: "appearance", placeholder: "placeholder", suggestFn: "suggestFn", required: "required", mobile: "mobile", clearable: "clearable", debounceTime: "debounceTime", displayWith: "displayWith", displayAttributes: "displayAttributes", displayColumnSizes: "displayColumnSizes", displayColumnNames: "displayColumnNames", highlightAccent: "highlightAccent", showAllOnFocus: "showAllOnFocus", showPanelOnFocus: "showPanelOnFocus", autofocus: "autofocus", config: "config", i18nPrefix: "i18nPrefix", noResultMessage: "noResultMessage", classList: ["class", "classList"], panelWidth: "panelWidth", matAutocompletePosition: "matAutocompletePosition", multiple: "multiple", fetchMoreThreshold: "fetchMoreThreshold", suggestLengthThreshold: "suggestLengthThreshold", showLoadingSpinner: "showLoadingSpinner", debug: "debug", showSearchBar: "showSearchBar", stickySearchBar: "stickySearchBar", applyImplicitValue: "applyImplicitValue", filter: "filter", readonly: "readonly", tabindex: "tabindex", items: "items" }, outputs: { clicked: "click", blurred: "blur", focused: "focus", dropButtonClick: "dropButtonClick", keydownEscape: "keydown.escape", keyupEnter: "keyup.enter" }, providers: [{
791
- provide: NG_VALUE_ACCESSOR,
792
- multi: true,
793
- useExisting: forwardRef(() => MatAutocompleteField)
794
- }], viewQueries: [{ propertyName: "matSelect", first: true, predicate: ["matSelect"], descendants: true }, { propertyName: "ionSearchbar", first: true, predicate: ["ionSearchbar"], descendants: true }, { propertyName: "matInputText", first: true, predicate: ["matInputText"], descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }], ngImport: i0, template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <!-- readonly -->\n <mat-form-field *ngIf=\"_readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [title]=\"_displayValue\"\n class=\"mat-form-field-disabled\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\" readonly=\"true\"\n [formControl]=\"formControl\" >\n <ion-text>{{displayWith(value)}}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n\n <ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [class.mat-form-field-disabled]=\"disabled\"\n [title]=\"_displayValue\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <!-- Mobile or Multiple (use <mat-select>) -->\n <mat-select #matSelect\n *ngIf=\"mobile || multiple; else desktopTemplate\"\n [disableRipple]=\"true\"\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"classList\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [typeaheadDebounceInterval]=\"debounceTime * 10\"\n [required]=\"required\">\n <mat-select-trigger>{{ displayWith(value) }}</mat-select-trigger>\n\n <!-- Search bar -->\n <mat-option class=\"mat-select-searchbar\" *ngIf=\"showSearchBar\"\n [class.mat-select-searchbar-sticky]=\"stickySearchBar\"\n disabled>\n <ion-searchbar #ionSearchbar\n inputmode=\"search\"\n autocomplete=\"off\"\n animated=\"true\"\n showClearButton=\"true\"\n [debounce]=\"debounceTime\"\n (ionClear)=\"markAsLoading()\"\n (ionInput)=\"ionSearchBarChanged($event)\"\n [placeholder]=\"'COMMON.BTN_SEARCH'|translate\"\n ></ion-searchbar>\n </mat-option>\n\n <!-- Headers -->\n <ion-row class=\"mat-select-header column ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.mat-select-searchbar-sticky]=\"showSearchBar && stickySearchBar\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- None option -->\n <mat-option *ngIf=\"!required && !multiple && !clearable\" class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <ng-container *ngIf=\"_$filteredItems | async as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></ion-label>\n </mat-option>\n\n <!-- Options -->\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text [innerHTML]=\"item | propertyGet: path\"></ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initMatSelectInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <!-- footer -->\n <mat-option *ngIf=\"itemCount as count\" class=\"mat-option-footer mat-autocomplete-footer ion-no-padding\" disabled>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </mat-option>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(_displayValue | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n </mat-select>\n\n\n <!--\n NOTE :\n - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n -->\n <ng-template #desktopTemplate>\n <input matInput #matInputText type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowDown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\">\n\n <!-- autocomplete -->\n <mat-autocomplete #autocomplete=\"matAutocomplete\"\n autoActiveFirstOption\n [displayWith]=\"displayWith\"\n [class]=\"classList\"\n [panelWidth]=\"panelWidth\">\n <!-- Headers -->\n <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- Options -->\n <ng-container *ngIf=\"_$filteredItems | async as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></ion-label>\n </mat-option>\n\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\"\n [title]=\"text.innerText\">\n <ion-text><span #text [innerHTML]=\"item | propertyGet: path | highlight: { search: formControl.value, withAccent: highlightAccent }\"></span></ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initAutocompleteInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(_displayValue | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n\n <!-- footer -->\n <ion-row *ngIf=\"itemCount as count\" class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n </mat-autocomplete>\n\n </ng-template>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('entity')\" translate>ERROR.FIELD_INVALID</mat-error>\n <ng-content select=\"[matError]\"></ng-content>\n\n </mat-form-field>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\" class=\"ion-align-self-center\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n\n<ng-template #matSuffixTemplate>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"!mobile && !multiple\"\n (click)=\"dropButtonClick.emit($event)\"\n [hidden]=\"disabled\">\n <mat-icon class=\"large select-arrow\">arrow_drop_down</mat-icon>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n", styles: [":host{display:inline-block;position:relative}:host.ion-text-wrap ion-label{white-space:normal!important}button[hidden]{display:none}mat-icon.select-arrow{color:#00000078;font-size:150%}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }, { kind: "component", type: i1.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgInitDirective, selector: "[ngInit]", outputs: ["ngInit"] }, { kind: "directive", type: i5.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i8.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix]" }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "directive", type: i12.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "directive", type: i13.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i14.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i15.HighlightPipe, name: "highlight" }, { kind: "pipe", type: i16.EmptyArrayPipe, name: "isEmptyArray" }, { kind: "pipe", type: i17.StrLengthPipe, name: "strLength" }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
795
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MatAutocompleteField, decorators: [{
796
- type: Component,
797
- args: [{ selector: 'mat-autocomplete-field', providers: [{
798
- provide: NG_VALUE_ACCESSOR,
799
- multi: true,
800
- useExisting: forwardRef(() => MatAutocompleteField)
801
- }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <!-- readonly -->\n <mat-form-field *ngIf=\"_readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [title]=\"_displayValue\"\n class=\"mat-form-field-disabled\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\" readonly=\"true\"\n [formControl]=\"formControl\" >\n <ion-text>{{displayWith(value)}}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n\n <ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [class.mat-form-field-disabled]=\"disabled\"\n [title]=\"_displayValue\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <!-- Mobile or Multiple (use <mat-select>) -->\n <mat-select #matSelect\n *ngIf=\"mobile || multiple; else desktopTemplate\"\n [disableRipple]=\"true\"\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"classList\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [typeaheadDebounceInterval]=\"debounceTime * 10\"\n [required]=\"required\">\n <mat-select-trigger>{{ displayWith(value) }}</mat-select-trigger>\n\n <!-- Search bar -->\n <mat-option class=\"mat-select-searchbar\" *ngIf=\"showSearchBar\"\n [class.mat-select-searchbar-sticky]=\"stickySearchBar\"\n disabled>\n <ion-searchbar #ionSearchbar\n inputmode=\"search\"\n autocomplete=\"off\"\n animated=\"true\"\n showClearButton=\"true\"\n [debounce]=\"debounceTime\"\n (ionClear)=\"markAsLoading()\"\n (ionInput)=\"ionSearchBarChanged($event)\"\n [placeholder]=\"'COMMON.BTN_SEARCH'|translate\"\n ></ion-searchbar>\n </mat-option>\n\n <!-- Headers -->\n <ion-row class=\"mat-select-header column ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.mat-select-searchbar-sticky]=\"showSearchBar && stickySearchBar\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- None option -->\n <mat-option *ngIf=\"!required && !multiple && !clearable\" class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <ng-container *ngIf=\"_$filteredItems | async as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></ion-label>\n </mat-option>\n\n <!-- Options -->\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text [innerHTML]=\"item | propertyGet: path\"></ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initMatSelectInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <!-- footer -->\n <mat-option *ngIf=\"itemCount as count\" class=\"mat-option-footer mat-autocomplete-footer ion-no-padding\" disabled>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </mat-option>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(_displayValue | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n </mat-select>\n\n\n <!--\n NOTE :\n - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n -->\n <ng-template #desktopTemplate>\n <input matInput #matInputText type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowDown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\">\n\n <!-- autocomplete -->\n <mat-autocomplete #autocomplete=\"matAutocomplete\"\n autoActiveFirstOption\n [displayWith]=\"displayWith\"\n [class]=\"classList\"\n [panelWidth]=\"panelWidth\">\n <!-- Headers -->\n <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- Options -->\n <ng-container *ngIf=\"_$filteredItems | async as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></ion-label>\n </mat-option>\n\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\"\n [title]=\"text.innerText\">\n <ion-text><span #text [innerHTML]=\"item | propertyGet: path | highlight: { search: formControl.value, withAccent: highlightAccent }\"></span></ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initAutocompleteInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(_displayValue | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n\n <!-- footer -->\n <ion-row *ngIf=\"itemCount as count\" class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n </mat-autocomplete>\n\n </ng-template>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('entity')\" translate>ERROR.FIELD_INVALID</mat-error>\n <ng-content select=\"[matError]\"></ng-content>\n\n </mat-form-field>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\" class=\"ion-align-self-center\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n\n<ng-template #matSuffixTemplate>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"!mobile && !multiple\"\n (click)=\"dropButtonClick.emit($event)\"\n [hidden]=\"disabled\">\n <mat-icon class=\"large select-arrow\">arrow_drop_down</mat-icon>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n", styles: [":host{display:inline-block;position:relative}:host.ion-text-wrap ion-label{white-space:normal!important}button[hidden]{display:none}mat-icon.select-arrow{color:#00000078;font-size:150%}\n"] }]
802
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.ModalController }, { type: i0.Renderer2 }, { type: Document, decorators: [{
803
- type: Inject,
804
- args: [DOCUMENT]
805
- }] }, { type: i0.ViewRef, decorators: [{
806
- type: Inject,
807
- args: [ChangeDetectorRef]
808
- }] }, { type: i2.FormGroupDirective, decorators: [{
809
- type: Optional
810
- }] }]; }, propDecorators: { equals: [{
811
- type: Input
812
- }], logPrefix: [{
813
- type: Input
814
- }], formControl: [{
815
- type: Input
816
- }], formControlName: [{
817
- type: Input
818
- }], floatLabel: [{
819
- type: Input
820
- }], appearance: [{
821
- type: Input
822
- }], placeholder: [{
823
- type: Input
824
- }], suggestFn: [{
825
- type: Input
826
- }], required: [{
827
- type: Input
828
- }], mobile: [{
829
- type: Input
830
- }], clearable: [{
831
- type: Input
832
- }], debounceTime: [{
833
- type: Input
834
- }], displayWith: [{
835
- type: Input
836
- }], displayAttributes: [{
837
- type: Input
838
- }], displayColumnSizes: [{
839
- type: Input
840
- }], displayColumnNames: [{
841
- type: Input
842
- }], highlightAccent: [{
843
- type: Input
844
- }], showAllOnFocus: [{
845
- type: Input
846
- }], showPanelOnFocus: [{
847
- type: Input
848
- }], autofocus: [{
849
- type: Input
850
- }], config: [{
851
- type: Input
852
- }], i18nPrefix: [{
853
- type: Input
854
- }], noResultMessage: [{
855
- type: Input
856
- }], classList: [{
857
- type: Input,
858
- args: ['class']
859
- }], panelWidth: [{
860
- type: Input
861
- }], matAutocompletePosition: [{
862
- type: Input
863
- }], multiple: [{
864
- type: Input
865
- }], fetchMoreThreshold: [{
866
- type: Input
867
- }], suggestLengthThreshold: [{
868
- type: Input
869
- }], showLoadingSpinner: [{
870
- type: Input
871
- }], debug: [{
872
- type: Input
873
- }], showSearchBar: [{
874
- type: Input
875
- }], stickySearchBar: [{
876
- type: Input
877
- }], applyImplicitValue: [{
878
- type: Input
879
- }], clicked: [{
880
- type: Output,
881
- args: ['click']
882
- }], blurred: [{
883
- type: Output,
884
- args: ['blur']
885
- }], focused: [{
886
- type: Output,
887
- args: ['focus']
888
- }], dropButtonClick: [{
889
- type: Output
890
- }], keydownEscape: [{
891
- type: Output,
892
- args: ['keydown.escape']
893
- }], keyupEnter: [{
894
- type: Output,
895
- args: ['keyup.enter']
896
- }], matSelect: [{
897
- type: ViewChild,
898
- args: ['matSelect']
899
- }], ionSearchbar: [{
900
- type: ViewChild,
901
- args: ['ionSearchbar']
902
- }], matInputText: [{
903
- type: ViewChild,
904
- args: ['matInputText']
905
- }], autocomplete: [{
906
- type: ViewChild,
907
- args: [MatAutocomplete]
908
- }], autocompleteTrigger: [{
909
- type: ViewChild,
910
- args: [MatAutocompleteTrigger]
911
- }], filter: [{
912
- type: Input
913
- }], readonly: [{
914
- type: Input
915
- }], tabindex: [{
916
- type: Input
917
- }], items: [{
918
- type: Input
919
- }] } });
920
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuYXV0b2NvbXBsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL21hdGVyaWFsLmF1dG9jb21wbGV0ZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2F1dG9jb21wbGV0ZS9tYXRlcmlhbC5hdXRvY29tcGxldGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sU0FBUyxFQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBMkMsaUJBQWlCLEVBQXNCLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNILE9BQU8sRUFBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNwRyxPQUFPLEVBQUMsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRS9ILE9BQU8sRUFBQyxzQkFBc0IsRUFBRSxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2pNLE9BQU8sRUFBQyxVQUFVLEVBQWdCLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxrQkFB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O2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUVXLE9BQU87c0JBQXZCLE1BQU07dUJBQUMsT0FBTztnQkFDQyxPQUFPO3NCQUF0QixNQUFNO3VCQUFDLE1BQU07Z0JBQ0csT0FBTztzQkFBdkIsTUFBTTt1QkFBQyxPQUFPO2dCQUNMLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ21CLGFBQWE7c0JBQXRDLE1BQU07dUJBQUMsZ0JBQWdCO2dCQUNELFVBQVU7c0JBQWhDLE1BQU07dUJBQUMsYUFBYTtnQkFFRyxTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ0ssWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNFLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDRyxZQUFZO3NCQUF2QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ1MsbUJBQW1CO3NCQUFyRCxTQUFTO3VCQUFDLHNCQUFzQjtnQkFzQnBCLE1BQU07c0JBQWxCLEtBQUs7Z0JBWU8sUUFBUTtzQkFBcEIsS0FBSztnQkFTTyxRQUFRO3NCQUFwQixLQUFLO2dCQVNPLEtBQUs7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5HX1ZBTFVFX0FDQ0VTU09SLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBpc09ic2VydmFibGUsIG1lcmdlLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRpbWVyfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIG1lcmdlTWFwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7RmV0Y2hNb3JlRm4sIExvYWRSZXN1bHQsIFN1Z2dlc3RGbn0gZnJvbSAnLi4vLi4vc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtjaGFuZ2VDYXNlVG9VbmRlcnNjb3JlLCBmaW5kUGFyZW50V2l0aENsYXNzLCBpc0JsYW5rU3RyaW5nLCBpc05pbCwgaXNOaWxPckJsYW5rLCBpc05vdE5pbCwgaXNOb3ROaWxCb29sZWFuLCBpc05vdE5pbE9yQmxhbmssIGlzTm90TmlsU3RyaW5nLCB0b0Jvb2xlYW4sIHRvTnVtYmVyfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHtmb2N1c0lucHV0LCBJbnB1dEVsZW1lbnQsIHNlbGVjdElucHV0UmFuZ2V9IGZyb20gJy4uLy4uL2lucHV0cyc7XG5pbXBvcnQge2ZpcnN0Tm90TmlsUHJvbWlzZX0gZnJvbSAnLi4vLi4vb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHtEaXNwbGF5Rm4sIEVxdWFsc0ZufSBmcm9tICcuLi8uLi9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7RmxvYXRMYWJlbFR5cGUsIE1hdEZvcm1GaWVsZEFwcGVhcmFuY2V9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHtNYXRTZWxlY3R9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQge01hdEF1dG9jb21wbGV0ZSwgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7ZnJvbVNjcm9sbEVuZEV2ZW50fSBmcm9tICcuLi8uLi9ldmVudHMnO1xuaW1wb3J0IHtJb25TZWFyY2hiYXIsIE1vZGFsQ29udHJvbGxlcn0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtpc01vYmlsZX0gZnJvbSAnLi4vLi4vcGxhdGZvcm1zJztcbmltcG9ydCB7c3VnZ2VzdEZyb21BcnJheX0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtTZWFyY2hiYXJDaGFuZ2VFdmVudERldGFpbH0gZnJvbSAnQGlvbmljL2NvcmUvZGlzdC90eXBlcy9jb21wb25lbnRzL3NlYXJjaGJhci9zZWFyY2hiYXItaW50ZXJmYWNlJztcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlRmllbGRVdGlsc30gZnJvbSAnLi9tYXRlcmlhbC5hdXRvY29tcGxldGUudXRpbHMnO1xuaW1wb3J0IHtNYXRBdXRvY29tcGxldGVGaWVsZENvbmZpZ30gZnJvbSAnLi9tYXRlcmlhbC5hdXRvY29tcGxldGUuY29uZmlnJztcbmltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmNvbnN0IG5vb3AgPSAoXz86IGFueSkgPT4geyB9O1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdtYXQtYXV0b2NvbXBsZXRlLWZpZWxkJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWF0ZXJpYWwuYXV0b2NvbXBsZXRlLnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL21hdGVyaWFsLmF1dG9jb21wbGV0ZS5odG1sJyxcbiAgcHJvdmlkZXJzOiBbe1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIG11bHRpOiB0cnVlLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1hdEF1dG9jb21wbGV0ZUZpZWxkKVxuICB9XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgTWF0QXV0b2NvbXBsZXRlRmllbGQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgSW5wdXRFbGVtZW50LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcblxuICBwcml2YXRlIF9vbkZldGNoTW9yZUNhbGxiYWNrOiBGZXRjaE1vcmVGbjxMb2FkUmVzdWx0PGFueT4+O1xuICBwcml2YXRlIF9pbXBsaWNpdFZhbHVlOiBhbnk7XG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBfaXRlbXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBfb3BlbmVkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgXyRmaWx0ZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfaXRlbUNvdW50OiBudW1iZXI7XG4gIHByaXZhdGUgX3JlbG9hZCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgcHJvdGVjdGVkIF9yZWFkb25seSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX3RhYmluZGV4OiBudW1iZXI7XG4gIHByb3RlY3RlZCBfJGlucHV0SXRlbXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgXyRmaWx0ZXJlZEl0ZW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIF9kaXNwbGF5VmFsdWUgPSAnJztcbiAgcHJvdGVjdGVkIF9tb3JlSXRlbXNDb3VudDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX2ZldGNoTW9yZSQgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuXG4gIEBJbnB1dCgpIGVxdWFsczogRXF1YWxzRm47XG4gIEBJbnB1dCgpIGxvZ1ByZWZpeCA9ICdbbWF0LWF1dG9jb21wbGV0ZV0gJztcbiAgQElucHV0KCkgZm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgQElucHV0KCkgZm9ybUNvbnRyb2xOYW1lOiBzdHJpbmcgPSBudWxsO1xuICBASW5wdXQoKSBmbG9hdExhYmVsOiBGbG9hdExhYmVsVHlwZTtcbiAgQElucHV0KCkgYXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZTtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgQElucHV0KCkgc3VnZ2VzdEZuOiBTdWdnZXN0Rm48YW55LCBhbnk+O1xuICBASW5wdXQoKSByZXF1aXJlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBtb2JpbGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNsZWFyYWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBkZWJvdW5jZVRpbWU6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCgpIGRpc3BsYXlXaXRoOiBEaXNwbGF5Rm4gfCBudWxsO1xuICBASW5wdXQoKSBkaXNwbGF5QXR0cmlidXRlczogc3RyaW5nW107XG4gIEBJbnB1dCgpIGRpc3BsYXlDb2x1bW5TaXplczogKG51bWJlciB8ICdhdXRvJyB8IHVuZGVmaW5lZClbXTtcbiAgQElucHV0KCkgZGlzcGxheUNvbHVtbk5hbWVzOiBzdHJpbmdbXTtcbiAgQElucHV0KCkgaGlnaGxpZ2h0QWNjZW50OiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93QWxsT25Gb2N1czogYm9vbGVhbjtcbiAgQElucHV0KCkgc2hvd1BhbmVsT25Gb2N1czogYm9vbGVhbjtcbiAgQElucHV0KCkgYXV0b2ZvY3VzID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbmZpZzogTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWc7XG4gIEBJbnB1dCgpIGkxOG5QcmVmaXggPSAnUkVGRVJFTlRJQUwuJztcbiAgQElucHV0KCkgbm9SZXN1bHRNZXNzYWdlID0gJ0NPTU1PTi5OT19SRVNVTFQnO1xuICBASW5wdXQoJ2NsYXNzJykgY2xhc3NMaXN0OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBhbmVsV2lkdGg6IHN0cmluZztcbiAgQElucHV0KCkgbWF0QXV0b2NvbXBsZXRlUG9zaXRpb246ICdhdXRvJyB8ICdhYm92ZScgfCAnYmVsb3cnO1xuICBASW5wdXQoKSBtdWx0aXBsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgZmV0Y2hNb3JlVGhyZXNob2xkID0gJzE1JSc7XG4gIEBJbnB1dCgpIHN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQ6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCgpIHNob3dMb2FkaW5nU3Bpbm5lciA9IHRydWU7XG4gIEBJbnB1dCgpIGRlYnVnID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dTZWFyY2hCYXIgPSB0cnVlO1xuICBASW5wdXQoKSBzdGlja3lTZWFyY2hCYXIgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBwbHlJbXBsaWNpdFZhbHVlOiBib29sZWFuIHwgKCgpID0+IGJvb2xlYW4pID0gZmFsc2U7XG5cbiAgQE91dHB1dCgnY2xpY2snKSBjbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuICBAT3V0cHV0KCdibHVyJykgYmx1cnJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcbiAgQE91dHB1dCgnZm9jdXMnKSBmb2N1c2VkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PigpO1xuICBAT3V0cHV0KCkgZHJvcEJ1dHRvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4odHJ1ZSk7XG4gIEBPdXRwdXQoJ2tleWRvd24uZXNjYXBlJykga2V5ZG93bkVzY2FwZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCdrZXl1cC5lbnRlcicpIGtleXVwRW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAVmlld0NoaWxkKCdtYXRTZWxlY3QnKSBtYXRTZWxlY3Q6IE1hdFNlbGVjdDtcbiAgQFZpZXdDaGlsZCgnaW9uU2VhcmNoYmFyJykgaW9uU2VhcmNoYmFyOiBJb25TZWFyY2hiYXI7XG4gIEBWaWV3Q2hpbGQoJ21hdElucHV0VGV4dCcpIG1hdElucHV0VGV4dDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZChNYXRBdXRvY29tcGxldGUpIGF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlO1xuICBAVmlld0NoaWxkKE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpIGF1dG9jb21wbGV0ZVRyaWdnZXI6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXI7XG5cblxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJvdGVjdGVkIG1vZGFsQ29udHJvbGxlcjogTW9kYWxDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByb3RlY3RlZCBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgQEluamVjdChDaGFuZ2VEZXRlY3RvclJlZikgcHJpdmF0ZSB2aWV3UmVmOiBWaWV3UmVmLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZm9ybUdyb3VwRGlyOiBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gICkge1xuICB9XG5cbiAgZ2V0IGl0ZW1Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pdGVtQ291bnQ7XG4gIH1cblxuICBnZXQgY2FuRmV0Y2hNb3JlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrICYmIHRoaXMuX21vcmVJdGVtc0NvdW50ID4gMDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBmaWx0ZXIodmFsdWU6IGFueSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fJGZpbHRlci52YWx1ZSkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIFNldHRpbmcgZmlsdGVyOlwiLCB2YWx1ZSk7XG4gICAgICB0aGlzLl8kZmlsdGVyLm5leHQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBmaWx0ZXIoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fJGZpbHRlci52YWx1ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCByZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdGFiaW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3RhYmluZGV4ID0gdmFsdWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCB0YWJpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90YWJpbmRleDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBpdGVtcyh2YWx1ZTogT2JzZXJ2YWJsZTxhbnlbXT4gfCBhbnlbXSkge1xuICAgIC8vIFJlbW92ZSBwcmV2aW91cyBzdWJzY3JpcHRpb24gb24gaXRlbXMsIChpZiBleGl0cylcbiAgICBpZiAodGhpcy5faXRlbXNTdWJzY3JpcHRpb24pIHtcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLmxvZ1ByZWZpeCArICcgSXRlbXMgcmVjZWl2ZWQgdHdpY2UgIScpO1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZSh0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbik7XG4gICAgICB0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmIChpc09ic2VydmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbiA9IHZhbHVlLnN1YnNjcmliZSh2ID0+IHRoaXMuXyRpbnB1dEl0ZW1zLm5leHQodikpO1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fJGlucHV0SXRlbXMudmFsdWUpIHtcbiAgICAgICAgdGhpcy5fJGlucHV0SXRlbXMubmV4dCh2YWx1ZSBhcyBhbnlbXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGl0ZW1zKCk6IE9ic2VydmFibGU8YW55W10+IHwgYW55W10ge1xuICAgIHJldHVybiB0aGlzLl8kaW5wdXRJdGVtcztcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sLnZhbHVlO1xuICB9XG5cbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZWFkb25seSB8fCB0aGlzLmZvcm1Db250cm9sLmRpc2FibGVkO1xuICB9XG5cbiAgZ2V0IGVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLl9yZWFkb25seSAmJiB0aGlzLmZvcm1Db250cm9sLmVuYWJsZWQ7XG4gIH1cblxuICBnZXQgbG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNOaWwodGhpcy5fJGZpbHRlcmVkSXRlbXMudmFsdWUpO1xuICB9XG5cbiAgZ2V0IGRlc2t0b3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLm1vYmlsZSAmJiAhdGhpcy5tdWx0aXBsZTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1Db250cm9sIHx8IHRoaXMuZm9ybUNvbnRyb2xOYW1lICYmIHRoaXMuZm9ybUdyb3VwRGlyICYmIHRoaXMuZm9ybUdyb3VwRGlyLmZvcm0uZ2V0KHRoaXMuZm9ybUNvbnRyb2xOYW1lKSBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgbWFuZGF0b3J5IGF0dHJpYnV0ZSBcXCdmb3JtQ29udHJvbFxcJyBvciBcXCdmb3JtQ29udHJvbE5hbWVcXCcgaW4gPG1hdC1hdXRvY29tcGxldGUtZmllbGQ+LicpO1xuXG4gICAgLy8gQ29uZmlndXJhdGlvbiBmcm9tIGNvbmZpZyBvYmplY3RcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuc3VnZ2VzdEZuID0gdGhpcy5zdWdnZXN0Rm4gfHwgdGhpcy5jb25maWcuc3VnZ2VzdEZuO1xuICAgICAgaWYgKCF0aGlzLnN1Z2dlc3RGbiAmJiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5jb25maWcuaXRlbXM7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlciA9IHRoaXMuZmlsdGVyIHx8IHRoaXMuY29uZmlnLmZpbHRlcjtcbiAgICAgIHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMgPSB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzIHx8IHRoaXMuY29uZmlnLmF0dHJpYnV0ZXM7XG4gICAgICB0aGlzLmRpc3BsYXlDb2x1bW5TaXplcyA9IHRoaXMuZGlzcGxheUNvbHVtblNpemVzIHx8IHRoaXMuY29uZmlnLmNvbHVtblNpemVzO1xuICAgICAgdGhpcy5kaXNwbGF5Q29sdW1uTmFtZXMgPSB0aGlzLmRpc3BsYXlDb2x1bW5OYW1lcyB8fCB0aGlzLmNvbmZpZy5jb2x1bW5OYW1lcztcbiAgICAgIHRoaXMuZGlzcGxheVdpdGggPSB0aGlzLmRpc3BsYXlXaXRoIHx8IHRoaXMuY29uZmlnLmRpc3BsYXlXaXRoO1xuICAgICAgdGhpcy5lcXVhbHMgPSB0aGlzLmVxdWFscyB8fCB0aGlzLmNvbmZpZy5lcXVhbHM7XG4gICAgICB0aGlzLm11bHRpcGxlID0gdG9Cb29sZWFuKHRoaXMubXVsdGlwbGUsIHRoaXMuY29uZmlnLm11bHRpcGxlKTtcbiAgICAgIHRoaXMubW9iaWxlID0gdG9Cb29sZWFuKHRoaXMubW9iaWxlLCB0aGlzLmNvbmZpZy5tb2JpbGUpO1xuICAgICAgdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkID0gdG9OdW1iZXIodGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkLCB0aGlzLmNvbmZpZy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkKTtcbiAgICAgIHRoaXMuc2hvd0FsbE9uRm9jdXMgPSB0b0Jvb2xlYW4odGhpcy5zaG93QWxsT25Gb2N1cywgdGhpcy5jb25maWcuc2hvd0FsbE9uRm9jdXMpO1xuICAgICAgdGhpcy5zaG93UGFuZWxPbkZvY3VzID0gdG9Cb29sZWFuKHRoaXMuc2hvd1BhbmVsT25Gb2N1cywgdGhpcy5jb25maWcuc2hvd1BhbmVsT25Gb2N1cyk7XG4gICAgICB0aGlzLmNsYXNzTGlzdCA9IHRoaXMuY2xhc3NMaXN0IHx8IHRoaXMuY29uZmlnLmNsYXNzO1xuICAgICAgdGhpcy5kZWJvdW5jZVRpbWUgPSB0b051bWJlcih0aGlzLmRlYm91bmNlVGltZSwgdGhpcy5jb25maWcuZGVib3VuY2VUaW1lKTtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0QWNjZW50ID0gdG9Cb29sZWFuKHRoaXMuaGlnaGxpZ2h0QWNjZW50LCB0b0Jvb2xlYW4odGhpcy5jb25maWcuaGlnaGxpZ2h0QWNjZW50KSk7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB2YWx1ZXNcbiAgICB0aGlzLnJlcXVpcmVkID0gaXNOb3ROaWxCb29sZWFuKHRoaXMucmVxdWlyZWQpID8gdGhpcy5yZXF1aXJlZCA6ICh0aGlzLmZvcm1Db250cm9sLnZhbGlkYXRvciA9PT0gVmFsaWRhdG9ycy5yZXF1aXJlZCB8fCBpc0JsYW5rU3RyaW5nKHRoaXMucmVxdWlyZWQpKTtcbiAgICB0aGlzLm11bHRpcGxlID0gdG9Cb29sZWFuKHRoaXMubXVsdGlwbGUsIGZhbHNlKTtcbiAgICB0aGlzLm1vYmlsZSA9IGlzTm90TmlsKHRoaXMubW9iaWxlKSA/IHRoaXMubW9iaWxlIDogKHRoaXMubXVsdGlwbGUgfHwgaXNNb2JpbGUod2luZG93KSk7XG4gICAgdGhpcy5kaXNwbGF5QXR0cmlidXRlcyA9IHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMgfHwgdGhpcy5maWx0ZXI/LmF0dHJpYnV0ZXMgfHwgWydsYWJlbCcsICduYW1lJ107XG4gICAgdGhpcy5kaXNwbGF5V2l0aCA9IHRoaXMuZGlzcGxheVdpdGggfHwgTWF0QXV0b2NvbXBsZXRlRmllbGRVdGlscy5jcmVhdGVEaXNwbGF5Rm4odGhpcy5kaXNwbGF5QXR0cmlidXRlcywgdGhpcy5tdWx0aXBsZSk7XG4gICAgdGhpcy5lcXVhbHMgPSB0aGlzLmVxdWFscyB8fCBNYXRBdXRvY29tcGxldGVGaWVsZFV0aWxzLmRlZmF1bHRFcXVhbHM7XG5cbiAgICB0aGlzLmRpc3BsYXlDb2x1bW5TaXplcyA9IHRoaXMuZGlzcGxheUNvbHVtblNpemVzXG4gICAgICAvLyBpZiBvbmx5IGNvbHVtbjogYXV0byBzaXplXG4gICAgICB8fCAodGhpcy5kaXNwbGF5QXR0cmlidXRlcy5sZW5ndGggPT09IDEgJiYgW3VuZGVmaW5lZF0pXG4gICAgICAvLyBDb21wdXRlZCBjb2x1bW4gc2l6ZTpcbiAgICAgIC8vIC0gaWYgbGFiZWwgdGhlbiBjb2wgc2l6ZSA9IDJcbiAgICAgIC8vIC0gaWYgcmFua09yZGVyIHRoZW4gY29sIHNpemUgPSAxXG4gICAgICAvLyAtIGVzZSA9PiBhdXRvIHNpemVcbiAgICAgIHx8IHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMubWFwKGF0dHIgPT5cbiAgICAgICAgYXR0ciAmJiAoYXR0ci5lbmRzV2l0aCgnbGFiZWwnKSA/IDNcbiAgICAgICAgICA6IChhdHRyLmVuZHNXaXRoKCdyYW5rT3JkZXInKSA/IDJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkKSkpO1xuICAgIHRoaXMuZGlzcGxheUNvbHVtbk5hbWVzID0gdGhpcy5kaXNwbGF5QXR0cmlidXRlcy5tYXAoKGF0dHIsIGluZGV4KSA9PiB0aGlzLmRpc3BsYXlDb2x1bW5OYW1lcyAmJiB0aGlzLmRpc3BsYXlDb2x1bW5OYW1lc1tpbmRleF0gfHxcbiAgICAgICh0aGlzLmkxOG5QcmVmaXggKyBjaGFuZ2VDYXNlVG9VbmRlcnNjb3JlKGF0dHIpLnRvVXBwZXJDYXNlKCkpKTtcbiAgICBjb25zdCBjbGFzc0xpc3QgPSB0aGlzLmNsYXNzTGlzdD8uc3BsaXQoJyAnKTtcbiAgICB0aGlzLnBhbmVsV2lkdGggPSB0aGlzLnBhbmVsV2lkdGggfHwgKGNsYXNzTGlzdCAmJiAoXG4gICAgICAoY2xhc3NMaXN0LmluY2x1ZGVzKCdtaW4td2lkdGgtbWVkaXVtJykgJiYgJzMwMHB4JylcbiAgICAgIHx8IChjbGFzc0xpc3QuaW5jbHVkZXMoJ21pbi13aWR0aC1sYXJnZScpICYmICc0MDBweCcpXG4gICAgICB8fCAoY2xhc3NMaXN0LmluY2x1ZGVzKCdtaW4td2lkdGgteGxhcmdlJykgJiYgJzQ1MHB4JylcbiAgICAgIHx8IChjbGFzc0xpc3QuaW5jbHVkZXMoJ21pbi13aWR0aC04MHZ3JykgJiYgJzgwdncnKVxuICAgICAgfHwgKGNsYXNzTGlzdC5pbmNsdWRlcygnbWF0LWF1dG9jb21wbGV0ZS1wYW5lbC1mdWxsLXNpemUnKSAmJiAnMTAwdncnKVxuICAgICkpO1xuICAgIHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA9IHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCB8fCAwO1xuICAgIHRoaXMuc2hvd0FsbE9uRm9jdXMgPSB0b0Jvb2xlYW4odGhpcy5zaG93QWxsT25Gb2N1cywgdGhpcy5tb2JpbGUgJiYgdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkIDw9IDApO1xuICAgIHRoaXMuc2hvd1BhbmVsT25Gb2N1cyA9IHRvQm9vbGVhbih0aGlzLnNob3dQYW5lbE9uRm9jdXMsIHRydWUpO1xuICAgIHRoaXMuZGVib3VuY2VUaW1lID0gdG9OdW1iZXIodGhpcy5kZWJvdW5jZVRpbWUsIHRoaXMubW9iaWxlID8gNjUwIDogMjUwKTtcbiAgICB0aGlzLmhpZ2hsaWdodEFjY2VudCA9IHRvQm9vbGVhbih0aGlzLmhpZ2hsaWdodEFjY2VudCwgZmFsc2UpO1xuICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlUG9zaXRpb24gPSB0aGlzLm1hdEF1dG9jb21wbGV0ZVBvc2l0aW9uIHx8ICdhdXRvJztcblxuICAgIC8vIE5vIHN1Z2dlc3RGbjogZmlsdGVyIG9uIHRoZSBnaXZlbiBpdGVtc1xuICAgIGlmICghdGhpcy5zdWdnZXN0Rm4pIHtcbiAgICAgIGNvbnN0IHN1Z2dlc3RGcm9tQXJyYXlGbjogU3VnZ2VzdEZuPGFueSwgYW55PiA9IGFzeW5jICh2YWx1ZSwgZmlsdGVyKSA9PlxuICAgICAgICAvLyBERUJVR1xuICAgICAgICAvL2NvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIENhbGxpbmcgc3VnZ2VzdEZyb21BcnJheSB3aXRoIHZhbHVlPScsIHZhbHVlKTtcblxuICAgICAgICAgc3VnZ2VzdEZyb21BcnJheSh0aGlzLl8kaW5wdXRJdGVtcy52YWx1ZSwgdmFsdWUsIHtcbiAgICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOiB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzLFxuICAgICAgICAgIC4uLmZpbHRlclxuICAgICAgICB9KVxuICAgICAgO1xuICAgICAgLy8gV2FpdCAob25jZSkgdGhhdCBpdGVtcyBhcmUgbG9hZGVkLCB0aGVuIGNhbGwgc3VnZ2VzdCBmcm9tIGFycmF5IGZuXG4gICAgICB0aGlzLnN1Z2dlc3RGbiA9IGFzeW5jICh2YWx1ZSwgZmlsdGVyKSA9PiB7XG4gICAgICAgIGlmIChpc05pbCh0aGlzLl8kaW5wdXRJdGVtcy52YWx1ZSkpIHtcbiAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIFdhaXRpbmcgaXRlbXMgdG8gYmUgc2V0Li4uXCIpO1xuXG4gICAgICAgICAgYXdhaXQgZmlyc3ROb3ROaWxQcm9taXNlKHRoaXMuXyRpbnB1dEl0ZW1zKTtcblxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgUmVjZWl2ZWQgaXRlbXM6XCIsIHRoaXMuaW5wdXRJdGVtcyQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3VnZ2VzdEZuID0gc3VnZ2VzdEZyb21BcnJheUZuO1xuICAgICAgICByZXR1cm4gdGhpcy5zdWdnZXN0Rm4odmFsdWUsIGZpbHRlcik7IC8vIExvb3BcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIFN1Z2dlc3QgKyBtb2JpbGVcbiAgICAvLyA9PiBNYW51YWxseSBmaWxsIGlucHV0IGl0ZW1zLCBmcm9tIHRoZSBnaXZlbiBzdWdnZXN0IGZ1bmN0aW9uXG4gICAgZWxzZSBpZiAodGhpcy5tb2JpbGUgfHwgdGhpcy5tdWx0aXBsZSkge1xuICAgICAgLyp0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICB0aGlzLl8kZmlsdGVyLnBpcGUoXG4gICAgICAgICAgc3RhcnRXaXRoPGFueSwgYW55Pih0aGlzLmZpbHRlciksXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDI1MCksXG4gICAgICAgICAgZmlsdGVyKF8gPT4gdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkIDw9IDApLFxuICAgICAgICAgIHN3aXRjaE1hcCgoZmlsdGVyKSA9PiB0aGlzLnN1Z2dlc3QoJyonLCBmaWx0ZXIpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoaXRlbXMgPT4gdGhpcy4kaW5wdXRJdGVtcy5uZXh0KGl0ZW1zKSlcbiAgICAgICk7Ki9cbiAgICB9XG5cbiAgICAvLyBTZW5kIHZhbHVlIHRvIHN1Z2dlc3Qgd2hlbiA6XG4gICAgLy8gLSBpcyBuaWwgYW5kICcqJywgYW5kIG5vIG1pbiBsZW5ndGggdGhyZXNob2xkXG4gICAgLy8gLSBpcyBub3QgbmlsIGFuZCBub3QgYSBzdHJpbmcgdHlwZSAoZS5nLiBvYmplY3QpXG4gICAgLy8gLSBpcyBub3QgbmlsIGFuZCBpcyBhIHN0cmluZywgYW5kIGhhcyBlbm91Z2ggY2hhcmFjdGVyXG4gICAgY29uc3QgdGhyZXNob2xkRmlsdGVyRm4gPSAodmFsdWUpID0+IHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA8PSAwIHx8IChcbiAgICAgIGlzTm90TmlsKHZhbHVlKSAmJiAoXG4gICAgICAgICEodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJylcbiAgICAgICAgfHwgKHZhbHVlICE9PSAnKicgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+PSB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQpXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IGZpbHRlcmVkSXRlbXNDaGFuZ2VzID0gbWVyZ2UoXG5cbiAgICAgIC8vIFJlbG9hZCBldmVudCAobm8gZGlzdGluY3RVbnRpbENoYW5nZWQoKSBwaXBlLCB0byBmb3JjZSByZWxvYWQgZXZlbiBpZiBzYW1lIHZhbHVlKVxuICAgICAgdGhpcy5fcmVsb2FkJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5lbmFibGVkKSxcbiAgICAgICAgICBmaWx0ZXIodGhyZXNob2xkRmlsdGVyRm4pLFxuICAgICAgICAgIHRhcChfID0+IHRoaXMuc2hvd0xvYWRpbmdTcGlubmVyICYmIHRoaXMubWFya0FzTG9hZGluZygpKVxuICAgICAgICApLFxuXG4gICAgICAvLyBTZWFyY2ggdGV4dCAobm8gZGlzdGluY3RVbnRpbENoYW5nZWQoKSBiZWNhdXNlIG9mIHRoZSBkZWJvdW5jZVRpbWUoKSBwaXBlKVxuICAgICAgdGhpcy5mb3JtQ29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKHZhbHVlID0+IHRoaXMuZW5hYmxlZCAmJiBpc05vdE5pbFN0cmluZyh2YWx1ZSkpLFxuICAgICAgICAgIC8vIE1hcmsgYXMgbG9hZGluZyAodG8gc2hvdyBsb2FkaW5nIHNwaW5uZXIpIC0gYXMgc29vbiBhcyBwb3NzaWJsZSwgYW5kIGJlZm9yZSBkZWJvdW5jZVRpbWVcbiAgICAgICAgICB0YXAoXyA9PiB0aGlzLnNob3dMb2FkaW5nU3Bpbm5lciAmJiB0aGlzLm1hcmtBc0xvYWRpbmcoKSksXG4gICAgICAgICAgLy8gRmlsdGVyIGlmIG5vdCBlbm91Z2ggY2hhcmFjdGVyXG4gICAgICAgICAgZmlsdGVyKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGlmICgodmFsdWU/Lmxlbmd0aCB8fCAwKSA8IHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgZGlzcGxheSB2YWx1ZSwgdG8gZW5hYmxlIHRoZSBtZXNzYWdlIFwibm90IGVub3VnaCBjaGFyYWN0ZXJzXCJcbiAgICAgICAgICAgICAgdGhpcy5fZGlzcGxheVZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIFdhaXQgYSBkZWJvdW5jZSB0aW1lXG4gICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lKVxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy8sdGFwKCh2YWx1ZSkgPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBTZWFyY2ggdGV4dCBjaGFuZ2VzOicsIHZhbHVlKSlcbiAgICAgICAgKSxcblxuICAgICAgLy8gT2JqZWN0IHNldDogdXNlIGl0IChubyBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIHBpcGUgbmVlZClcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aDxhbnksIGFueT4odGhpcy5mb3JtQ29udHJvbC52YWx1ZSksXG4gICAgICAgICAgZmlsdGVyKHZhbHVlID0+IChpc05vdE5pbCh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykpLFxuICAgICAgICAgIHRhcCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgY29udHJvbCBvYmplY3QgY2hhbmdlczonLCB2YWx1ZSk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZGlzcGxheSB2YWx1ZSAoaWYgbmVlZClcbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IHRoaXMuZGlzcGxheVdpdGgodmFsdWUpIHx8ICcnO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Rpc3BsYXlWYWx1ZSAhPT0gZGlzcGxheVZhbHVlKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IGRpc3BsYXlWYWx1ZTtcblxuICAgICAgICAgICAgICAvLyBBcHBseSB0byB0aGUgaW5wdXRbdHlwZT10ZXh0XSBmaWVsZFxuICAgICAgICAgICAgICBpZiAodGhpcy5tYXRJbnB1dFRleHQ/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdElucHV0VGV4dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5fZGlzcGxheVZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG5cbiAgICAgICAgICAvLyBJZiBtdWx0aXBsZTogZG8gbm90IHJlY29tcHV0ZSBpdGVtcyAob25seSBmb3IgdGhlIGZpcnN0IHRpbWUsIHdoZW4gbG9hZGluZylcbiAgICAgICAgICAvLyB3aGVuIGZvcm1Db250cm9sIHZhbHVlIGNoYW5nZXNcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMubXVsdGlwbGUgfHwgdGhpcy5sb2FkaW5nKSxcblxuICAgICAgICAgIG1hcCh2YWx1ZSA9PiB0aGlzLnNob3dBbGxPbkZvY3VzICYmIHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA8PSAwID8gJyonIDogdmFsdWUpXG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAvLyx0YXAodmFsdWUgPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBhbiBjb250cm9sIG9iamVjdCB2YWx1ZTogJywgdmFsdWUpKVxuICAgICAgICApLFxuXG4gICAgICAvLyBNZXJnZSBzb21lIG9ic2VydmFibGVzLCB3aXRoIGEgY29tbW9uIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkgcGlwZVxuICAgICAgbWVyZ2UoXG4gICAgICAgIC8vIE9uIGRyb3Bkb3duIGJ1dHRvbiBjbGljayAobm8gZGVib3VuY2VUaW1lKVxuICAgICAgICB0aGlzLmRyb3BCdXR0b25DbGlja1xuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKGV2ZW50ID0+ICghZXZlbnQgfHwgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpKVxuICAgICAgICAgICksXG4gICAgICAgIC8vIEZvY3VzIG9yIGNsaWNrID0+IExvYWQgYWxsIChubyBkZWJvdW5jZVRpbWUpXG4gICAgICAgIG1lcmdlKHRoaXMuZm9jdXNlZCwgdGhpcy5jbGlja2VkKSxcbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy8ucGlwZSh0YXAoXyA9PiB0aGlzLmRlYnVnICYmIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkIGZvY3VzZWQgb3IgY2xpY2tlZCBldmVudCcpKSksXG4gICAgICAgIC8vIElucHV0IGl0ZW1zIG9yIGZpbHRlciBjaGFuZ2VzXG4gICAgICAgIG1lcmdlKHRoaXMuXyRpbnB1dEl0ZW1zLCB0aGlzLl8kZmlsdGVyKVxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoXyA9PiAhdGhpcy5sb2FkaW5nKVxuICAgICAgICAgICAgLy8sdGFwKF8gPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCAkaW5wdXRJdGVtcyBvciBmaWx0ZXIgZXZlbnQnKSlcbiAgICAgICAgICApXG4gICAgICApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihfID0+IHRoaXMuZW5hYmxlZCksXG4gICAgICAgICAgbWFwKF8gPT4gdGhpcy5zaG93QWxsT25Gb2N1cyA/ICcqJyA6IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpLFxuICAgICAgICAgIC8vIERpc3Rpbmd1aXNoIGNoYW5nZXNcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgodjEsIHYyKSA9PlxuICAgICAgICAgICAgLy8gSWYgbG9hZGluZyAobm90IGxvYWRlZCB5ZXQpLCBzaW11bGF0ZSB0aGF0IHZhbHVlIGNoYW5nZWQgdG8gZm9yY2UgbG9hZFxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID8gZmFsc2UgOiAodjEgPT09IHYyIHx8IHRoaXMuZXF1YWxzKHYxLCB2MikpXG4gICAgICAgICAgKSxcbiAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIGNoYXJhY3RlcnNcbiAgICAgICAgICBmaWx0ZXIodGhyZXNob2xkRmlsdGVyRm4pXG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAvLyx0YXAodmFsdWUgPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCB1cGRhdGUgZXZlbnQgZnJvbSBvYnNlcnZhYmxlczogJywgdmFsdWUpKVxuICAgICAgICApXG4gICAgKVxuXG4gICAgICAucGlwZShcbiAgICAgICAgLy8gU3VnZ2VzdCB2YWx1ZXNcbiAgICAgICAgbWVyZ2VNYXAodmFsdWUgPT4gdGhpcy5zdWdnZXN0KHZhbHVlLCB0aGlzLmZpbHRlcikpLFxuICAgICAgICAvLyBERUJVR1xuICAgICAgICAvL3RhcChpdGVtcyA9PiB0aGlzLmRlYnVnICYmIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkIGZyb20gc3VnZ2VzdDogJywgaXRlbXMpKSxcblxuICAgICAgICAvLyBTdG9yZSBpbXBsaWNpdCB2YWx1ZSAod2lsbCB1c2UgaXQgb25CbHVyIGlmIG5vdCBvdGhlciB2YWx1ZSBzZWxlY3RlZClcbiAgICAgICAgdGFwKGl0ZW1zID0+ICF0aGlzLm11bHRpcGxlICYmICF0aGlzLm1vYmlsZSAmJiB0aGlzLnVwZGF0ZUltcGxpY2l0VmFsdWUoaXRlbXMpKVxuICAgICAgKTtcblxuICAgIC8vIEZldGNoIG1vcmUgZXZlbnRzXG4gICAgY29uc3QgZmV0Y2hNb3JlSXRlbXNDaGFuZ2VzID0gdGhpcy5fZmV0Y2hNb3JlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChldmVudCA9PiBldmVudD8ucHJldmVudERlZmF1bHQoKSksIC8vIEF2b2lkIHRvIGNsb3NlIHRoZSBtYXQtc2VsZWN0XG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmNhbkZldGNoTW9yZSksXG4gICAgICAgIG1lcmdlTWFwKCgpID0+IHRoaXMuZmV0Y2hNb3JlKCkpLFxuXG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIC8vdGFwKG1vcmVJdGVtcyA9PiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBmcm9tIGZldGNoIE1vcmU6ICcsIG1vcmVJdGVtcykpLFxuXG4gICAgICAgIC8vIENvbmNhdCB0byBleGlzdGluZyBpdGVtc1xuICAgICAgICBtYXAobW9yZUl0ZW1zID0+ICh0aGlzLl8kZmlsdGVyZWRJdGVtcy52YWx1ZSB8fCBbXSkuY29uY2F0KG1vcmVJdGVtcykpXG4gICAgICApO1xuXG4gICAgLy8gVXBkYXRlIGZpbHRlcmVkIGl0ZW1zXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIG1lcmdlKFxuICAgICAgICB0aGlzLl8kaW5wdXRJdGVtcyxcblxuICAgICAgICAvLyBVcGRhdGUgaXRlbXMgZXZlbnRzXG4gICAgICAgIGZpbHRlcmVkSXRlbXNDaGFuZ2VzLFxuXG4gICAgICAgIC8vIEZldGNoIG1vcmUgZXZlbnRzXG4gICAgICAgIGZldGNoTW9yZUl0ZW1zQ2hhbmdlc1xuICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKGl0ZW1zID0+IHtcbiAgICAgICAgICAvLyBNYWtlIHN1cmUgY29udHJvbCB2YWx1ZSBpcyBpbnNpZGUgKG1hdC1zZWxlY3QpXG4gICAgICAgICAgaWYgKGl0ZW1zICYmICh0aGlzLm1vYmlsZSB8fCB0aGlzLm11bHRpcGxlKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlO1xuXG4gICAgICAgICAgICAvLyBJZiBmb3JtIHZhbHVlIGlzIG1pc3Npbmc6IGFwcGVuZCB0byBsaXN0XG4gICAgICAgICAgICBpZiAoaXNOb3ROaWwodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5jb25jYXQoXG4gICAgICAgICAgICAgICAgICB2YWx1ZS5maWx0ZXIodiA9PiBpdGVtcy5maW5kSW5kZXgoaXRlbSA9PiB0aGlzLmVxdWFscyhpdGVtLCB2KSkgPT09IC0xKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBpdGVtcy5maW5kSW5kZXgoaXRlbSA9PiB0aGlzLmVxdWFscyhpdGVtLCB2YWx1ZSkpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KHZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFbWl0IGl0ZW1zXG4gICAgICAgICAgdGhpcy5fJGZpbHRlcmVkSXRlbXMubmV4dChpdGVtcyk7XG4gICAgICAgIH0pKTtcblxuICAgIC8vIEFwcGx5aW5nIGltcGxpY2l0IHZhbHVlLCBvbiBibHVyXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuYmx1cnJlZFxuICAgICAgICAucGlwZShcbiAgICAgICAgICAvLyBTa2lwIGlmIG11bHRpcGxlIChubyBpbXBsaWNpdCB2YWx1ZSkgb3IgZGlzYWJsZVxuICAgICAgICAgIGZpbHRlcihfID0+ICF0aGlzLm11bHRpcGxlICYmICF0aGlzLm1vYmlsZSAmJiB0aGlzLmVuYWJsZWQpLFxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy8sdGFwKF8gPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBibHVycmVkIGV2ZW50JykpLFxuICAgICAgICAgIG1hcChfID0+IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgLy8gV2hlbiBsZWF2ZSBjb21wb25lbnQgd2l0aG91dCBvYmplY3QsIHVzZSBpbXBsaWNpdCB2YWx1ZSBpZiA6XG4gICAgICAgICAgLy8gLSBhbiBleHBsaWNpdCB2YWx1ZVxuICAgICAgICAgIC8vIC0gZmllbGQgaXMgbm90IGVtcHR5ICh1c2VyIGZpbGwgc29tZXRoaW5nKVxuICAgICAgICAgIC8vIC0gT1IgZmllbGQgZW1wdHkgYnV0IGlzIHJlcXVpcmVkXG4gICAgICAgICAgaWYgKHRoaXMuX2ltcGxpY2l0VmFsdWUgJiYgKCh0aGlzLnJlcXVpcmVkICYmIGlzTmlsT3JCbGFuayh2YWx1ZSkpIHx8IChpc05vdE5pbE9yQmxhbmsodmFsdWUpICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpKSkge1xuICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMuX2ltcGxpY2l0VmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNQZW5kaW5nKHsgZW1pdEV2ZW50OiBmYWxzZSwgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlLCBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tJZlRvdWNoZWQoKTtcbiAgICAgICAgICAgIHRoaXMuXyRmaWx0ZXJlZEl0ZW1zLm5leHQoW3RoaXMuX2ltcGxpY2l0VmFsdWVdKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTmlsT3JCbGFuayh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZShudWxsKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzUGVuZGluZyh7IGVtaXRFdmVudDogZmFsc2UsIG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSwgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrSWZUb3VjaGVkKCk7XG4gICAgICAgICAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5faW1wbGljaXRWYWx1ZSA9IG51bGw7IC8vIHJlc2V0IHRoZSBpbXBsaWNpdCB2YWx1ZVxuICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpOyAvLyBDbG9uZSBwYW5lbFxuICAgICAgICB9KSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9ybSBjb250cm9sIHN0YXR1cyBjaGFuZ2VcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zdGF0dXNDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50IHN0YXRlXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jaGVja0lmVG91Y2hlZCgpKVxuICAgICk7XG5cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5rZXlkb3duRXNjYXBlLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgIC8vIEF2b2lkIGZvcm0gb3IgcGFnZSB0byBtYW5hZ2UgZXNjYXBlIGV2ZW50XG4gICAgICAgICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBDbG9zaW5nIHRoZSBwYW5lbCAoa2V5ZG93bi5lc2NhcGUpXCIpO1xuXG4gICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLl9maXhNYXRTZWxlY3RQb3NpdGlvbkFuZFNlYXJjaGJhcigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgaWYgKHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5fJGlucHV0SXRlbXMuY29tcGxldGUoKTtcbiAgICB0aGlzLl8kaW5wdXRJdGVtcy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuXyRmaWx0ZXJlZEl0ZW1zLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fJGZpbHRlcmVkSXRlbXMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9yZWxvYWQkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fJGZpbHRlci5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5kcm9wQnV0dG9uQ2xpY2suY29tcGxldGUoKTtcbiAgICB0aGlzLmNsaWNrZWQuY29tcGxldGUoKTtcbiAgICB0aGlzLmJsdXJyZWQuY29tcGxldGUoKTtcbiAgICB0aGlzLmZvY3VzZWQuY29tcGxldGUoKTtcbiAgICB0aGlzLmtleWRvd25Fc2NhcGUuY29tcGxldGUoKTtcbiAgICB0aGlzLmtleXVwRW50ZXIuY29tcGxldGUoKTtcbiAgICB0aGlzLl9mZXRjaE1vcmUkLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZm9ybUNvbnRyb2wgPSBudWxsO1xuICAgIHRoaXMuZGlzcGxheVdpdGggPSBudWxsO1xuICAgIHRoaXMuZXF1YWxzID0gbnVsbDtcbiAgICB0aGlzLnN1Z2dlc3RGbiA9IG51bGw7XG4gICAgdGhpcy5fJGZpbHRlcmVkSXRlbXMgPSBudWxsO1xuICAgIHRoaXMuY29uZmlnID0gbnVsbDtcbiAgICB0aGlzLmNsYXNzTGlzdCA9IG51bGw7XG5cbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IG51bGw7XG5cbiAgICAvLyBEZXN0cm95IHRoZSAnYXV0b2NvbXBsZXRlJyBpbnN0YW5jZSwgdG8gYXZvaWQgbWVtb3J5IGxlYWtcbiAgICBpZiAodGhpcy5hdXRvY29tcGxldGUpIHtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlLm5nT25EZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHRvIHJlbG9hZCBjb250ZW50LiBVc2VmdWwgd2hlbiBmaWx0ZXIgaGFzIGJlZW4gY2hhbmdlZCBidXQgbm90IGRldGVjdGVkXG4gICAqL1xuICByZWxvYWRJdGVtcyh2YWx1ZT86IGFueSkge1xuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIEFza2luZyB0byByZWxvYWRJdGVtcygpXCIpO1xuICAgIC8vIEZvcmNlIGEgcmVmcmVzaFxuICAgIHRoaXMuX3JlbG9hZCQubmV4dCh2YWx1ZSB8fCAodGhpcy5zaG93QWxsT25Gb2N1cyAmJiB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQgPD0gMCA/ICcqJyA6IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpKTtcblxuICAgIC8vIENsZWFyIHRoZSBzZWFyY2ggYmFyIChpZiBoaWRkZW4pXG4gICAgaWYgKHRoaXMubW9iaWxlICYmICF0aGlzLm1hdFNlbGVjdC5wYW5lbE9wZW4gJiYgdGhpcy5pb25TZWFyY2hiYXIpIHtcbiAgICAgIHRoaXMuaW9uU2VhcmNoYmFyLnZhbHVlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBERUJVR1xuICAgIC8vIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBXcml0aW5nIHZhbHVlOiAnLCB2YWx1ZSk7XG5cbiAgICBpZiAodmFsdWUgIT09IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5fZGlzcGxheVZhbHVlID0gdGhpcy5kaXNwbGF5V2l0aCh2YWx1ZSk7XG4gICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpc0Rpc2FibGVkICYmIHRoaXMuYXV0b2NvbXBsZXRlPy5pc09wZW4pIHtcbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZm9jdXMoKSB7XG4gICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICB0aGlzLm1hdFNlbGVjdC5mb2N1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb2N1c0lucHV0KHRoaXMubWF0SW5wdXRUZXh0KTtcbiAgICB9XG4gIH1cblxuICBmaWx0ZXJJbnB1dFRleHRGb2N1c0V2ZW50KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG5cbiAgICAvLyBJZ25vcmUgZXZlbnQgZnJvbSBtYXQtb3B0aW9uXG4gICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdNQVQtT1BUSU9OJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcblxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIENhbmNlbGxpbmcgZm9jdXMgZXZlbnQnKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgU2VsZWN0IGlucHV0IGNvbnRlbnQnKTtcbiAgICBjb25zdCBoYXNDb250ZW50ID0gaXNOb3ROaWxPckJsYW5rKChldmVudC50YXJnZXQgYXMgYW55KT8udmFsdWUpO1xuXG4gICAgLy8gSWYgY29tYm8gaXMgZW1wdHksIG9yIGlmIGhhcyBjb250ZW50IGJ1dCBzaG91bGQgZm9yY2UgdG8gc2hvdyBwYW5lbCBvbiBmb2N1c1xuICAgIGlmICghaGFzQ29udGVudCB8fCB0aGlzLnNob3dQYW5lbE9uRm9jdXMgfHwgdGhpcy5zaG93QWxsT25Gb2N1cykge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEVtaXQgZm9jdXMgZXZlbnQnKTtcblxuICAgICAgdGhpcy5mb2N1c2VkLmVtaXQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlsdGVySW5wdXRUZXh0Qmx1ckV2ZW50KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG5cbiAgICAvLyBJZ25vcmUgZXZlbnQgZnJvbSBtYXQtb3B0aW9uXG4gICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdNQVQtT1BUSU9OJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcblxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBDYW5jZWxsaW5nIGJsdXIgZXZlbnRcIik7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBERUJVR1xuICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEJsdXI6IG1vdmUgY2FyZXQgdG8gdGhlIGJlZ2lubmluZycpO1xuXG4gICAgLy8gTW92ZSBjYXJldCB0byB0aGUgYmVnaW5uaW5nIChmaXggaXNzdWUgSU1BR0lORS00NjkpXG4gICAgc2VsZWN0SW5wdXRSYW5nZShldmVudC50YXJnZXQgYXMgYW55LCAwLCAwKTtcblxuICAgIHRoaXMuYmx1cnJlZC5lbWl0KGV2ZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpb25TZWFyY2hCYXJDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCB8fCAhdGhpcy5tYXRTZWxlY3QucGFuZWxPcGVuKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgUmVjZWl2ZWQgPGlvbi1zZWFyY2hiYXI+IGNoYW5nZXNcIiwgKTtcblxuICAgIC8vIEdldCB0aGUgdmFsdWUgdG8gc2VhcmNoXG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8U2VhcmNoYmFyQ2hhbmdlRXZlbnREZXRhaWw+KT8uZGV0YWlsLnZhbHVlO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBkaXNwbGF5IHZhbHVlIChpbiB0aGUgdmlzaWJsZSBmb3JtIGNvbnRyb2wpXG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLl9kaXNwbGF5VmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBNYXJrIGNvbXBvbmVudCBhcyBsb2FkaW5nXG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG5cbiAgICAvLyBSZWxvYWQgaXRlbXNcbiAgICB0aGlzLnJlbG9hZEl0ZW1zKHZhbHVlKTtcblxuICAgIC8vIFRPRE8gRmluZCBhIHdheSB0byBhdm9pZCBtYXQtc2VsZWN0IHRvIGdpdmUgZm9jdXMgdG8gYW4gb3B0aW9uLCB3aGVuIHR5cGluZ1xuICAgIC8qaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMubWF0U2VsZWN0Ll9lbGVtZW50UmVmO1xuICAgIH0qL1xuICB9XG5cbiAgZmlsdGVyTWF0U2VsZWN0Rm9jdXNFdmVudChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuICAgIC8vIERFQlVHXG4gICAgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgPG1hdC1zZWxlY3Q+IGZvY3VzIGV2ZW50JywgZXZlbnQpO1xuICAgIHRoaXMuZm9jdXNlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGZpbHRlck1hdFNlbGVjdEJsdXJFdmVudChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuXG4gICAgLy8gREVCVUdcbiAgICAvLyBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgUmVjZWl2ZWQgPG1hdC1zZWxlY3Q+IGJsdXIgZXZlbnRcIiwgZXZlbnQpO1xuXG5cbiAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIChcbiAgICAgIC8vIElnbm9yZSBldmVudCBmcm9tIG1hdC1vcHRpb25cbiAgICAgIChldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdNQVQtT1BUSU9OJylcbiAgICAgIHx8IChldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdJTlBVVCcpICYmIGV2ZW50LnJlbGF0ZWRUYXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWFyY2hiYXItaW5wdXQnKSkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAvLyBERUJVR1xuICAgICAgLy8gY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIENhbmNlbGxpbmcgPG1hdC1zZWxlY3Q+IGJsdXIgZXZlbnRcIik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2xlYXJWYWx1ZShldmVudD86IEV2ZW50KSB7XG4gICAgdGhpcy53cml0ZVZhbHVlKG51bGwpO1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5pb25TZWFyY2hiYXIpIHtcbiAgICAgIHRoaXMuaW9uU2VhcmNoYmFyLnZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG4gIH1cblxuICBfaW5pdEF1dG9jb21wbGV0ZUluZmluaXRlU2Nyb2xsKHRocmVzaG9sZD86IHN0cmluZykge1xuICAgIGlmICghdGhpcy5hdXRvY29tcGxldGUpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgLy8gREVCVUdcbiAgICAvL2NvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEluaXQgYXV0b2NvbXBsZXRlIHNjcm9sbCBsaXN0ZW5lcicpO1xuXG4gICAgaWYgKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24ucmVtb3ZlKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3BlbmVkJDogT2JzZXJ2YWJsZTxhbnk+ID0gdGhpcy5hdXRvY29tcGxldGUuX2lzT3BlblxuICAgICAgPyB0aW1lcigwKVxuICAgICAgOiB0aGlzLmF1dG9jb21wbGV0ZS5vcGVuZWQucGlwZShkZWJvdW5jZVRpbWUoMjAwKSk7XG4gICAgY29uc3Qgc2Nyb2xsRW5kJCA9IG9wZW5lZCRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKF8pID0+IHRoaXMuZ2V0QXV0b2NvbXBsZXRlUGFuZWwoKSksXG4gICAgICAgIGZpbHRlcihpc05vdE5pbCksXG4gICAgICAgIHN3aXRjaE1hcCgocGFuZWwpID0+IGZyb21TY3JvbGxFbmRFdmVudChwYW5lbCwgdGhyZXNob2xkKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmF1dG9jb21wbGV0ZS5jbG9zZWQpXG4gICAgICApO1xuXG4gICAgLy8gVHJpZ2dlciBmZXRjaCBtb3JlLCBlbmQgZW5kIHNjcm9sbCByZWFjaGVkXG4gICAgdGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uID0gc2Nyb2xsRW5kJFxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9mZXRjaE1vcmUkLmVtaXQoKSk7XG5cbiAgICAvLyBSZWdpc3RlciBzdWJzY3JpcHRpb25cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbik7XG4gIH1cblxuICBfaW5pdE1hdFNlbGVjdEluZmluaXRlU2Nyb2xsKHRocmVzaG9sZD86IHN0cmluZykge1xuICAgIGlmICghdGhpcy5tYXRTZWxlY3QpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgLy8gREVCVUdcbiAgICAvL2NvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEluaXQgbWF0LXNlbGVjdCBzY3JvbGwgbGlzdGVuZXInKTtcblxuICAgIGlmICh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZSh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IG9wZW5lZCQ6IE9ic2VydmFibGU8YW55PiA9IHRoaXMubWF0U2VsZWN0LnBhbmVsT3BlblxuICAgICAgPyB0aW1lcigwKVxuICAgICAgOiB0aGlzLm1hdFNlbGVjdC5fb3BlbmVkU3RyZWFtLnBpcGUoZGVib3VuY2VUaW1lKDIwMCkpO1xuICAgIGNvbnN0IHNjcm9sbEVuZCQgPSBvcGVuZWQkXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChfKSA9PiB0aGlzLmdldE1hdFNlbGVjdFBhbmVsKCkpLFxuICAgICAgICBmaWx0ZXIoaXNOb3ROaWwpLFxuICAgICAgICBzd2l0Y2hNYXAoKHBhbmVsKSA9PiBmcm9tU2Nyb2xsRW5kRXZlbnQocGFuZWwsIHRocmVzaG9sZCkpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5tYXRTZWxlY3QuX2Nsb3NlZFN0cmVhbSlcbiAgICAgICk7XG5cbiAgICAvLyBUcmlnZ2VyIGZldGNoIG1vcmUsIGVuZCBlbmQgc2Nyb2xsIHJlYWNoZWRcbiAgICB0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24gPSBzY3JvbGxFbmQkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKF8gPT4gdGhpcy5fbW9yZUl0ZW1zQ291bnQgPiAwKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9mZXRjaE1vcmUkLmVtaXQoKSk7XG5cbiAgICAvLyBSZWdpc3RlciBzdWJzY3JpcHRpb25cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbik7XG4gIH1cblxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoIXRoaXMubW9iaWxlICYmIHRoaXMuYXV0b2NvbXBsZXRlPy5pc09wZW4pXG4gICAgICB8fCAodGhpcy5tYXRTZWxlY3Q/LnBhbmVsT3BlbilcbiAgICAgIHx8IGZhbHNlO1xuICB9XG5cbiAgY2xvc2VQYW5lbCgpIHtcbiAgICBpZiAodGhpcy5hdXRvY29tcGxldGU/LmlzT3Blbikge1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVUcmlnZ2VyPy5jbG9zZVBhbmVsKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdFNlbGVjdD8ucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLm1hdFNlbGVjdD8uY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKiAtLSBwcml2YXRlIG1ldGhvZCAtLSAqL1xuXG4gIHByaXZhdGUgYXN5bmMgc3VnZ2VzdCh2YWx1ZTogYW55LCBmaWx0ZXI/OiBhbnkpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgLy8gQ2FsbCBzdWdnZXN0aW9uIGZ1bmN0aW9uXG4gICAgbGV0IHJlcyA9IGF3YWl0IHRoaXMuc3VnZ2VzdEZuKHZhbHVlLCBmaWx0ZXIpO1xuXG4gICAgLy8gREVCVUdcbiAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBGaWx0ZXJlZCBpdGVtcyBieSBzdWdnZXN0Rm46JywgdmFsdWUsIHJlcyk7XG5cbiAgICBpZiAoIXJlcykge1xuICAgICAgdGhpcy5faXRlbUNvdW50ID0gMDtcbiAgICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tb3JlSXRlbXNDb3VudCA9IDA7XG4gICAgICByZXMgPSBbXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXMpKSB7XG4gICAgICByZXMgPSByZXMgYXMgYW55W107XG4gICAgICB0aGlzLl9pdGVtQ291bnQgPSByZXM/Lmxlbmd0aCB8fCAwO1xuICAgICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21vcmVJdGVtc0NvdW50ID0gMDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCB7IGRhdGEsIHRvdGFsLCBmZXRjaE1vcmUgfSA9IHJlcyBhcyBMb2FkUmVzdWx0PGFueT47XG4gICAgICB0aGlzLl9pdGVtQ291bnQgPSB0b051bWJlcih0b3RhbCwgZGF0YSAmJiBkYXRhLmxlbmd0aCB8fCAwKTtcbiAgICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSBmZXRjaE1vcmU7XG4gICAgICB0aGlzLl9tb3JlSXRlbXNDb3VudCA9IGZldGNoTW9yZSAmJiAodGhpcy5faXRlbUNvdW50IC0gZGF0YS5sZW5ndGgpIHx8IDA7XG4gICAgICByZXMgPSBkYXRhO1xuICAgIH1cblxuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgRmlsdGVyZWQgaXRlbXMgYnkgc3VnZ2VzdEZuOicsIHZhbHVlLCByZXMpO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hNb3JlKCk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAoIXRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2spIHJldHVybiBbXTtcblxuICAgIC8vIFNhdmUgdGhlbiByZW1vdmUgZmV0Y2ggZnVuY3Rpb24gKHRvIGF2b2lkIG11bHRpLWNhbGwpXG4gICAgY29uc3QgZmV0Y2hNb3JlRm4gPSB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrO1xuICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB7IGRhdGEsIHRvdGFsLCBmZXRjaE1vcmUgfSA9IGF3YWl0IGZldGNoTW9yZUZuKCk7XG4gICAgdGhpcy5faXRlbUNvdW50ID0gdG90YWwgfHwgdGhpcy5faXRlbUNvdW50O1xuICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSBmZXRjaE1vcmU7XG4gICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSBNYXRoLm1heCgwLCB0aGlzLl9tb3JlSXRlbXNDb3VudCAtIGRhdGEubGVuZ3RoKTsgLy8gQm9ybmUgbWluID0gMFxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbXBsaWNpdFZhbHVlKGl0ZW1zOiBhbnlbXSkge1xuICAgIGNvbnN0IGFwcGx5SW1wbGljaXRWYWx1ZSA9ICh0eXBlb2YgdGhpcy5hcHBseUltcGxpY2l0VmFsdWUgPT09ICdmdW5jdGlvbicpID8gdGhpcy5hcHBseUltcGxpY2l0VmFsdWUoKSA6IHRoaXMuYXBwbHlJbXBsaWNpdFZhbHVlO1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiBhcHBseUltcGxpY2l0VmFsdWUpIHtcbiAgICAgIC8vIFN0b3JlIGltcGxpY2l0IHZhbHVlICh3aWxsIHVzZSBpdCBvbkJsdXIgaWYgbm90IG90aGVyIHZhbHVlIHNlbGVjdGVkKVxuICAgICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gaXRlbXNbMF07XG4gICAgICAgIC8vdGhpcy5mb3JtQ29udHJvbC5zZXRFcnJvcnMobnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tJZlRvdWNoZWQoKSB7XG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wudG91Y2hlZCkge1xuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdXRvY29tcGxldGVQYW5lbCgpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgZWxlID0gdGhpcy5hdXRvY29tcGxldGU/Lm9wdGlvbnMubGFzdD8uX2dldEhvc3RFbGVtZW50KCkucGFyZW50RWxlbWVudDtcbiAgICBpZiAoIWVsZSkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLmxvZ1ByZWZpeCArICcgVW5hYmxlIHRvIGZpbmQgdGhlIGF1dG9jb21wbGV0ZSBkaXYuLi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWF0U2VsZWN0UGFuZWwoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGVsZSA9IHRoaXMubWF0U2VsZWN0Lm9wdGlvbnMubGFzdD8uX2dldEhvc3RFbGVtZW50KCkucGFyZW50RWxlbWVudDtcbiAgICBpZiAoIWVsZSkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLmxvZ1ByZWZpeCArICcgVW5hYmxlIHRvIGZpbmQgdGhlIG1hdC1zZWxlY3QgY29udGFpbmVyLi4uJyk7XG4gICAgfVxuICAgIHJldHVybiBlbGU7XG4gIH1cblxuICBwcml2YXRlIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtBc0xvYWRpbmcoKSB7XG4gICAgaWYgKHRoaXMuXyRmaWx0ZXJlZEl0ZW1zLnZhbHVlKSB7XG4gICAgICB0aGlzLl8kZmlsdGVyZWRJdGVtcy5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLl9pdGVtQ291bnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21vcmVJdGVtc0NvdW50ID0gMDtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZml4TWF0U2VsZWN0UG9zaXRpb25BbmRTZWFyY2hiYXIoKSB7XG4gICAgaWYgKCF0aGlzLm1hdFNlbGVjdCkgcmV0dXJuO1xuXG4gICAgLy8gSGlkZSB0aGUgcGFuZWwgKHdpbGwgYmUgc2hvdyB3aGVuIHJlYWR5KVxuICAgIHRoaXMubWF0U2VsZWN0LnBhbmVsQ2xhc3MgPSAnY2RrLXZpc3VhbGx5LWhpZGRlbic7XG5cbiAgICBsZXQgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMubWF0U2VsZWN0Lm9wZW5lZENoYW5nZVxuICAgICAgICAuc3Vic2NyaWJlKGFzeW5jIChvcGVuKSA9PiB7XG5cbiAgICAgICAgICBpZiAob3Blbikge1xuICAgICAgICAgICAgY29uc3QgcGFuZWxFbGVtZW50ID0gdGhpcy5tYXRTZWxlY3QucGFuZWwubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlQYW5lID0gZmluZFBhcmVudFdpdGhDbGFzcyhwYW5lbEVsZW1lbnQsICdjZGstb3ZlcmxheS1wYW5lJyk7XG5cbiAgICAgICAgICAgIC8vIEZpeCBsZWZ0IHBvc2l0aW9uXG4gICAgICAgICAgICAvLyBGSVhNRSB3aGVuIHNlYXJjaCBiYXIgZW5hYmxlLCB0aGUga2V5Ym9hcmQgc2hvdyByZWFkZCB0aGUgdHJhbnNmb3JtWCxcbiAgICAgICAgICAgIHRoaXMuX2ZpeE1hdFNlbGVjdFBhbmVsUG9zaXRpb24ob3ZlcmxheVBhbmUpO1xuXG4gICAgICAgICAgICAvLyBGaXggb3ZlcmxheSwgZm9yIHNlYXJjaGJhclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1NlYXJjaEJhcikge1xuICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBhd2FpdCB0aGlzLl9maXhTZWFyY2hiYXJPdmVybGF5KHBhbmVsRWxlbWVudCwgb3ZlcmxheVBhbmUpO1xuICAgICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNob3cgdGhlIHBhbmVsXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHBhbmVsRWxlbWVudCwgJ2Nkay12aXN1YWxseS1oaWRkZW4nKTtcblxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBPTiBjbG9zZVxuICAgICAgICAgIGVsc2UgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24ucmVtb3ZlKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9maXhNYXRTZWxlY3RQYW5lbFBvc2l0aW9uKG92ZXJsYXlQYW5lOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghb3ZlcmxheVBhbmUpIHJldHVybjtcbiAgICAvLyBSZW1vdmUgdGhlIHVud2FudGVkIGRlZmF1bHQgdHJhbnNsYXRlWFxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3ZlcmxheVBhbmUsICd0cmFuc2Zvcm0nLFxuICAgICAgb3ZlcmxheVBhbmUuc3R5bGUudHJhbnNmb3JtXG4gICAgICAgIC5zcGxpdCgnICcpXG4gICAgICAgIC5maWx0ZXIoKHByb3ApID0+ICFwcm9wLm1hdGNoKC9edHJhbnNsYXRlWC8pKVxuICAgICAgICAuam9pbignICcpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYWNrIDogaWYgd2UgYXJlIGluIGEgSW9uTW9kYWwsIGl0J3MgbmVjZXNzYXJ5IHRvIG1vdmUgdGhlIENka092ZXJsYXkgY29udGFpbmVyXG4gICAqICAgICBpbiB0aGUgSW9uTW9kYWwgdG8gbWlnaHQga2VlcCBmb2N1cyBpbiBJb25TZWFyY2hiYXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYW5lbEVsZW1lbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2ZpeFNlYXJjaGJhck92ZXJsYXkocGFuZWxFbGVtZW50OiBIVE1MRWxlbWVudCwgb3ZlcmxheVBhbmU6IEhUTUxFbGVtZW50KTogUHJvbWlzZTxTdWJzY3JpcHRpb258dW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLm1hdFNlbGVjdCB8fCAhdGhpcy5pb25TZWFyY2hiYXIpIHJldHVybjtcblxuICAgIGNvbnN0IG1vZGFsRWxlbWVudCA9IGF3YWl0IHRoaXMubW9kYWxDb250cm9sbGVyLmdldFRvcCgpO1xuICAgIGlmICghbW9kYWxFbGVtZW50KSByZXR1cm47IC8vIE5vIG1vZGFsOiBza2lwXG5cbiAgICAvLyBHZXQgdGhlIENESyBvdmVybGF5IGNvbnRhaW5lclxuICAgIGNvbnN0IG92ZXJsYXlDb250YWluZXIgPSBmaW5kUGFyZW50V2l0aENsYXNzKHBhbmVsRWxlbWVudCwgJ2Nkay1vdmVybGF5LWNvbnRhaW5lcicpO1xuICAgIGlmICghb3ZlcmxheUNvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgLy8gREVCVUdcbiAgICBjb25zb2xlLmRlYnVnKGAke3RoaXMubG9nUHJlZml4fSBtb3ZpbmcgdGhlIFwiY2RrLW92ZXJsYXlcIiBjb250YWluZXIgZnJvbSB0aGUgXCJib2R5XCIgdG8gdGhlIFwiaW9uLW1vZGFsXCIgY29udGFpbmVyYCk7XG5cbiAgICBjb25zdCBvcmlnaW5hbFBhcmVudCA9IG92ZXJsYXlDb250YWluZXIucGFyZW50RWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKG1vZGFsRWxlbWVudCwgb3ZlcmxheUNvbnRhaW5lcik7XG5cbiAgICBjb25zdCBzaGlmdExlZnQgPSAodGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5pbm5lcldpZHRoIC0gbW9kYWxFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSAvIDI7XG4gICAgY29uc3Qgc2hpZnRUb3AgPSAodGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5pbm5lckhlaWdodCAtIG1vZGFsRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpIC8gMjtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3ZlcmxheVBhbmUsICdtYXJnaW4tdG9wJywgYC0ke3NoaWZ0VG9wfXB4YCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShvdmVybGF5UGFuZSwgJ21hcmdpbi1sZWZ0JywgYC0ke3NoaWZ0TGVmdH1weGApO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZXZlcnNlIGZ1bmN0aW9uLCB0byByZXBsYWNlIHRoZSBjb250YWluZXIgaW4gYm9keVxuICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKCgpID0+IHtcbiAgICAgIC8vIERFQlVHXG4gICAgICBjb25zb2xlLmRlYnVnKGAke3RoaXMubG9nUHJlZml4fSBtb3ZpbmcgdGhlIFwiY2RrLW92ZXJsYXlcIiBjb250YWluZXIgZnJvbSB0aGUgXCJpb24tbW9kYWxcIiB0byB0aGUgXCJib2R5XCIgY29udGFpbmVyYCk7XG5cbiAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQob3JpZ2luYWxQYXJlbnQvKnRoaXMuZG9jdW1lbnQuYm9keSovLCBvdmVybGF5Q29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPGlvbi1ncmlkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgPGlvbi1yb3c+XG4gICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPCEtLSByZWFkb25seSAtLT5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIl9yZWFkb25seTsgZWxzZSB3cml0YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Zsb2F0TGFiZWxdPVwiZmxvYXRMYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIl9kaXNwbGF5VmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWRcIj5cblxuICAgICAgICA8bWF0LWxhYmVsPnt7cGxhY2Vob2xkZXJ9fTwvbWF0LWxhYmVsPlxuXG4gICAgICAgIDxkaXYgbWF0UHJlZml4PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgaGlkZGVuIHR5cGU9XCJ0ZXh0XCIgcmVhZG9ubHk9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiID5cbiAgICAgICAgPGlvbi10ZXh0Pnt7ZGlzcGxheVdpdGgodmFsdWUpfX08L2lvbi10ZXh0PlxuXG4gICAgICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPG5nLXRlbXBsYXRlICN3cml0YWJsZT5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIl9kaXNwbGF5VmFsdWVcIj5cblxuICAgICAgICAgIDxtYXQtbGFiZWw+e3twbGFjZWhvbGRlcn19PC9tYXQtbGFiZWw+XG5cbiAgICAgICAgICA8ZGl2IG1hdFByZWZpeD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBNb2JpbGUgb3IgTXVsdGlwbGUgKHVzZSA8bWF0LXNlbGVjdD4pIC0tPlxuICAgICAgICAgIDxtYXQtc2VsZWN0ICNtYXRTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1vYmlsZSB8fCBtdWx0aXBsZTsgZWxzZSBkZXNrdG9wVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlUmlwcGxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiX3RhYmluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICBbcGFuZWxDbGFzc109XCJjbGFzc0xpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJmaWx0ZXJNYXRTZWxlY3RGb2N1c0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cImZpbHRlck1hdFNlbGVjdEJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lc2NhcGUpPVwia2V5ZG93bkVzY2FwZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJrZXl1cEVudGVyLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NvbXBhcmVXaXRoXT1cImVxdWFsc1wiXG4gICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cIm11bHRpcGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbF09XCJkZWJvdW5jZVRpbWUgKiAxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCI+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPnt7IGRpc3BsYXlXaXRoKHZhbHVlKSB9fTwvbWF0LXNlbGVjdC10cmlnZ2VyPlxuXG4gICAgICAgICAgICA8IS0tIFNlYXJjaCBiYXIgLS0+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAgY2xhc3M9XCJtYXQtc2VsZWN0LXNlYXJjaGJhclwiICpuZ0lmPVwic2hvd1NlYXJjaEJhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1hdC1zZWxlY3Qtc2VhcmNoYmFyLXN0aWNreV09XCJzdGlja3lTZWFyY2hCYXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPlxuICAgICAgICAgICAgICA8aW9uLXNlYXJjaGJhciAjaW9uU2VhcmNoYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cInNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDbGVhckJ1dHRvbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVib3VuY2VdPVwiZGVib3VuY2VUaW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlvbkNsZWFyKT1cIm1hcmtBc0xvYWRpbmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpb25JbnB1dCk9XCJpb25TZWFyY2hCYXJDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0NPTU1PTi5CVE5fU0VBUkNIJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICA+PC9pb24tc2VhcmNoYmFyPlxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICA8IS0tIEhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8aW9uLXJvdyBjbGFzcz1cIm1hdC1zZWxlY3QtaGVhZGVyIGNvbHVtbiBpb24tbm8tcGFkZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICBbY2xhc3MubXVsdGlwbGVdPVwibXVsdGlwbGVcIlxuICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1hdC1zZWxlY3Qtc2VhcmNoYmFyLXN0aWNreV09XCJzaG93U2VhcmNoQmFyICYmIHN0aWNreVNlYXJjaEJhclwiPlxuICAgICAgICAgICAgICA8aW9uLWNvbCAqbmdGb3I9XCJsZXQgYXR0ciBvZiBkaXNwbGF5QXR0cmlidXRlczsgaW5kZXggYXMgaVwiIFtzaXplXT1cImRpc3BsYXlDb2x1bW5TaXplc1tpXVwiPlxuICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgW2lubmVySFRNTF09XCJkaXNwbGF5Q29sdW1uTmFtZXNbaV0gfCB0cmFuc2xhdGVcIj48L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgPC9pb24tcm93PlxuXG4gICAgICAgICAgICA8IS0tIE5vbmUgb3B0aW9uIC0tPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCIhcmVxdWlyZWQgJiYgIW11bHRpcGxlICYmICFjbGVhcmFibGVcIiBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPjxpIHRyYW5zbGF0ZT5DT01NT04uRU1QVFlfT1BUSU9OPC9pPjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXyRmaWx0ZXJlZEl0ZW1zIHwgYXN5bmMgYXMgaXRlbXM7IGVsc2UgbG9hZGluZ1RlbXBsYXRlXCI+XG4gICAgICAgICAgICAgIDwhLS0gTm8gaXRlbSBvcHRpb24gLS0+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwiaXRlbXMgfCBpc0VtcHR5QXJyYXlcIiBjbGFzcz1cImlvbi1wYWRkaW5nIHRleHQtaXRhbGljXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgPGlvbi1sYWJlbD48aT57e25vUmVzdWx0TWVzc2FnZSB8IHRyYW5zbGF0ZX19PC9pPjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgICAgPCEtLSBPcHRpb25zIC0tPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1wiIFt2YWx1ZV09XCJpdGVtXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgIDxpb24tcm93IFtjbGFzc0xpc3RdPVwiaXRlbS5jbGFzc0xpc3RcIj5cbiAgICAgICAgICAgICAgICAgIDxpb24tY29sICpuZ0Zvcj1cImxldCBwYXRoIG9mIGRpc3BsYXlBdHRyaWJ1dGVzOyBpbmRleCBhcyBpO1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCJkaXNwbGF5Q29sdW1uU2l6ZXNbaV1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0IFtpbm5lckhUTUxdPVwiaXRlbSB8IHByb3BlcnR5R2V0OiBwYXRoXCI+PC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cblxuICAgICAgICAgICAgICA8IS0tIE1vcmUgaXRlbSAtLT5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJfbW9yZUl0ZW1zQ291bnRcIiAobmdJbml0KT1cIl9pbml0TWF0U2VsZWN0SW5maW5pdGVTY3JvbGwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW9uLXBhZGRpbmdcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwhLS0gZm9vdGVyIC0tPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJpdGVtQ291bnQgYXMgY291bnRcIiBjbGFzcz1cIm1hdC1vcHRpb24tZm9vdGVyIG1hdC1hdXRvY29tcGxldGUtZm9vdGVyIGlvbi1uby1wYWRkaW5nXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cImlvbi1mbG9hdC1lbmQgaW9uLXBhZGRpbmctZW5kXCI+PGk+e3snQ09NTU9OLlJFU1VMVF9DT1VOVCd8dHJhbnNsYXRlOiB7Y291bnQ6IGNvdW50fSB9fTwvaT48L2lvbi10ZXh0PlxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICA8IS0tIExvYWRpbmcgc3Bpbm5lciAtLT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbG9hZGluZ1RlbXBsYXRlPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cIihfZGlzcGxheVZhbHVlIHwgc3RyTGVuZ3RoKSA+PSBzdWdnZXN0TGVuZ3RoVGhyZXNob2xkOyBlbHNlIHdhaXRNb3JlQ2hhcmFjdGVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlvbi1wYWRkaW5nXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgIDwhLS0gTmVlZCBtb3JlIGNoYXJhY3RlcnMgLS0+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3dhaXRNb3JlQ2hhcmFjdGVyVGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiaW9uLXBhZGRpbmcgdGV4dC1pdGFsaWNcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAge3snSU5GTy5QTEVBU0VfVFlQRV9NT1JFX0NIQVJBQ1RFUlMnfHRyYW5zbGF0ZTp7bWluTGVuZ3RoOiBzdWdnZXN0TGVuZ3RoVGhyZXNob2xkfSB9fVxuICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cblxuXG4gICAgICAgICAgPCEtLVxuICAgICAgICAgICAgTk9URSA6XG4gICAgICAgICAgICAgLSBcInNlbGVjdElucHV0Q29udGVudCgkZXZlbnQpIHx8IG9uRm9jdXMuZW1pdCgkZXZlbnQpXCIgOiBjYWxsIG9uRm9jdXMgb25seSB3aGVuIHRvIHRoZSBpbnB1dCBpcyBlbXB0eSAobm90aGluZyB0byBzZWxlY3QpXG4gICAgICAgICAgLS0+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNkZXNrdG9wVGVtcGxhdGU+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgI21hdElucHV0VGV4dCB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVQb3NpdGlvbl09XCJtYXRBdXRvY29tcGxldGVQb3NpdGlvblwiXG4gICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCJcbiAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiX3RhYmluZGV4XCJcbiAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja2VkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cImZpbHRlcklucHV0VGV4dEZvY3VzRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiZmlsdGVySW5wdXRUZXh0Qmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJrZXlkb3duRXNjYXBlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImtleXVwRW50ZXIuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAoa2V5dXAuYXJyb3dEb3duKT1cIiFhdXRvY29tcGxldGUuc2hvd1BhbmVsICYmIGRyb3BCdXR0b25DbGljay5lbWl0KCRldmVudClcIj5cblxuICAgICAgICAgICAgPCEtLSBhdXRvY29tcGxldGUgLS0+XG4gICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0b2NvbXBsZXRlPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9BY3RpdmVGaXJzdE9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlXaXRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjbGFzc0xpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhbmVsV2lkdGhdPVwicGFuZWxXaWR0aFwiPlxuICAgICAgICAgICAgICA8IS0tIEhlYWRlcnMgLS0+XG4gICAgICAgICAgICAgIDxpb24tcm93IGNsYXNzPVwibWF0LWF1dG9jb21wbGV0ZS1oZWFkZXIgY29sdW1uIGlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgICAgPGlvbi1jb2wgKm5nRm9yPVwibGV0IGF0dHIgb2YgZGlzcGxheUF0dHJpYnV0ZXM7IGluZGV4IGFzIGlcIiBbc2l6ZV09XCJkaXNwbGF5Q29sdW1uU2l6ZXNbaV1cIj5cbiAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgW2lubmVySFRNTF09XCJkaXNwbGF5Q29sdW1uTmFtZXNbaV0gfCB0cmFuc2xhdGVcIj48L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgIDwvaW9uLXJvdz5cblxuICAgICAgICAgICAgICA8IS0tIE9wdGlvbnMgLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJfJGZpbHRlcmVkSXRlbXMgfCBhc3luYyBhcyBpdGVtczsgZWxzZSBsb2FkaW5nVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICA8IS0tIE5vIGl0ZW0gb3B0aW9uIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwiaXRlbXMgfCBpc0VtcHR5QXJyYXlcIiBjbGFzcz1cImlvbi1wYWRkaW5nIHRleHQtaXRhbGljXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPjxpPnt7bm9SZXN1bHRNZXNzYWdlIHwgdHJhbnNsYXRlfX08L2k+PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXNcIiBbdmFsdWVdPVwiaXRlbVwiIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxpb24tcm93IFtjbGFzc0xpc3RdPVwiaXRlbS5jbGFzc0xpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1jb2wgKm5nRm9yPVwibGV0IHBhdGggb2YgZGlzcGxheUF0dHJpYnV0ZXM7IGluZGV4IGFzIGk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiZGlzcGxheUNvbHVtblNpemVzW2ldXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cInRleHQuaW5uZXJUZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0PjxzcGFuICN0ZXh0IFtpbm5lckhUTUxdPVwiaXRlbSB8IHByb3BlcnR5R2V0OiBwYXRoIHwgaGlnaGxpZ2h0OiB7IHNlYXJjaDogZm9ybUNvbnRyb2wudmFsdWUsIHdpdGhBY2NlbnQ6IGhpZ2hsaWdodEFjY2VudCB9XCI+PC9zcGFuPjwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgICAgICA8IS0tIE1vcmUgaXRlbSAtLT5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cIl9tb3JlSXRlbXNDb3VudFwiIChuZ0luaXQpPVwiX2luaXRBdXRvY29tcGxldGVJbmZpbml0ZVNjcm9sbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlvbi1wYWRkaW5nXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDwhLS0gTG9hZGluZyBzcGlubmVyIC0tPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xvYWRpbmdUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cIihfZGlzcGxheVZhbHVlIHwgc3RyTGVuZ3RoKSA+PSBzdWdnZXN0TGVuZ3RoVGhyZXNob2xkOyBlbHNlIHdhaXRNb3JlQ2hhcmFjdGVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW9uLXBhZGRpbmdcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICA8IS0tIE5lZWQgbW9yZSBjaGFyYWN0ZXJzIC0tPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3dhaXRNb3JlQ2hhcmFjdGVyVGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJpb24tcGFkZGluZyB0ZXh0LWl0YWxpY1wiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAge3snSU5GTy5QTEVBU0VfVFlQRV9NT1JFX0NIQVJBQ1RFUlMnfHRyYW5zbGF0ZTp7bWluTGVuZ3RoOiBzdWdnZXN0TGVuZ3RoVGhyZXNob2xkfSB9fVxuICAgICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgIDwhLS0gZm9vdGVyIC0tPlxuICAgICAgICAgICAgICA8aW9uLXJvdyAqbmdJZj1cIml0ZW1Db3VudCBhcyBjb3VudFwiIGNsYXNzPVwibWF0LWF1dG9jb21wbGV0ZS1mb290ZXIgaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cImlvbi1mbG9hdC1lbmQgaW9uLXBhZGRpbmctZW5kXCI+PGk+e3snQ09NTU9OLlJFU1VMVF9DT1VOVCd8dHJhbnNsYXRlOiB7Y291bnQ6IGNvdW50fSB9fTwvaT48L2lvbi10ZXh0PlxuICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgPC9pb24tcm93PlxuXG4gICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgPGRpdiBtYXRTdWZmaXg+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0U3VmZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtQ29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKVwiIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxuICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtQ29udHJvbC5oYXNFcnJvcignZW50aXR5JylcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfSU5WQUxJRDwvbWF0LWVycm9yPlxuICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRFcnJvcl1cIj48L25nLWNvbnRlbnQ+XG5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9pb24tY29sPlxuICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCIgY2xhc3M9XCJpb24tYWxpZ24tc2VsZi1jZW50ZXJcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRBZnRlcl1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9pb24tY29sPlxuICA8L2lvbi1yb3c+XG48L2lvbi1ncmlkPlxuXG48bmctdGVtcGxhdGUgI21hdFByZWZpeFRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0UHJlZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cblxuPG5nLXRlbXBsYXRlICNtYXRTdWZmaXhUZW1wbGF0ZT5cbiAgPGJ1dHRvbiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICpuZ0lmPVwiIW1vYmlsZSAmJiAhbXVsdGlwbGVcIlxuICAgICAgICAgIChjbGljayk9XCJkcm9wQnV0dG9uQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICBbaGlkZGVuXT1cImRpc2FibGVkXCI+XG4gICAgPG1hdC1pY29uIGNsYXNzPVwibGFyZ2Ugc2VsZWN0LWFycm93XCI+YXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cbiAgPC9idXR0b24+XG4gIDxidXR0b24gbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAqbmdJZj1cImNsZWFyYWJsZVwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgW2hpZGRlbl09XCJkaXNhYmxlZCB8fCAhZm9ybUNvbnRyb2wudmFsdWVcIj5cbiAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICA8L2J1dHRvbj5cblxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0U3VmZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=