@sumaris-net/ngx-components 2.0.0-rc9 → 2.0.0

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 (306) hide show
  1. package/README.md +3 -1
  2. package/esm2020/public_api.mjs +35 -22
  3. package/esm2020/src/app/admin/admin-routing.module.mjs +6 -6
  4. package/esm2020/src/app/admin/admin.module.mjs +6 -6
  5. package/esm2020/src/app/admin/services/person.service.mjs +3 -3
  6. package/esm2020/src/app/admin/services/validator/person.validator.mjs +3 -3
  7. package/esm2020/src/app/admin/users/users.mjs +233 -0
  8. package/esm2020/src/app/admin/users/users.module.mjs +54 -0
  9. package/esm2020/src/app/core/about/about.modal.mjs +71 -0
  10. package/esm2020/src/app/core/about/about.module.mjs +34 -0
  11. package/esm2020/src/app/core/account/account.module.mjs +43 -0
  12. package/esm2020/src/app/core/account/account.page.mjs +239 -0
  13. package/esm2020/src/app/core/auth/auth.form.mjs +131 -0
  14. package/esm2020/src/app/core/auth/auth.modal.mjs +72 -0
  15. package/esm2020/src/app/core/auth/auth.module.mjs +47 -0
  16. package/esm2020/src/app/core/core.module.mjs +86 -125
  17. package/esm2020/src/app/core/core.testing.module.mjs +7 -7
  18. package/esm2020/src/app/core/form/{form-buttons-bar.component.mjs → buttons/form-buttons-bar.component.mjs} +7 -7
  19. package/esm2020/src/app/core/form/buttons/form-buttons-bar.module.mjs +35 -0
  20. package/esm2020/src/app/core/form/entity/editor.class.mjs +675 -0
  21. package/esm2020/src/app/core/form/entity/entity-editor-modal.class.mjs +421 -0
  22. package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +646 -0
  23. package/esm2020/src/app/core/form/{entity-metadata.component.mjs → entity/entity-metadata.component.mjs} +6 -6
  24. package/esm2020/src/app/core/form/entity/entity.module.mjs +38 -0
  25. package/esm2020/src/app/core/form/form.class.mjs +4 -4
  26. package/esm2020/src/app/core/form/form.module.mjs +66 -0
  27. package/esm2020/src/app/core/form/list/list.form.mjs +222 -0
  28. package/esm2020/src/app/core/form/list/list.module.mjs +35 -0
  29. package/esm2020/src/app/core/form/properties/properties.form.mjs +3 -3
  30. package/esm2020/src/app/core/form/properties/properties.module.mjs +35 -0
  31. package/esm2020/src/app/core/form/properties/property.validator.mjs +4 -4
  32. package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +3 -3
  33. package/esm2020/src/app/core/form/properties/testing/properties-form.testing.module.mjs +4 -4
  34. package/esm2020/src/app/core/{text-popover → form/text-popover}/testing/text-popover.testing.mjs +4 -4
  35. package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +45 -0
  36. package/esm2020/src/app/core/form/text-popover/text-form.component.mjs +89 -0
  37. package/esm2020/src/app/core/form/text-popover/text-popover.component.mjs +105 -0
  38. package/esm2020/src/app/core/form/text-popover/text-popover.module.mjs +40 -0
  39. package/esm2020/src/app/core/graphql/graphql.module.mjs +4 -4
  40. package/esm2020/src/app/core/graphql/graphql.service.mjs +12 -7
  41. package/esm2020/src/app/core/graphql/graphql.utils.mjs +2 -2
  42. package/esm2020/src/app/core/home/home.mjs +8 -8
  43. package/esm2020/src/app/core/home/home.module.mjs +48 -0
  44. package/esm2020/src/app/core/icon/icon.component.mjs +3 -3
  45. package/esm2020/src/app/core/icon/icon.module.mjs +4 -4
  46. package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +3 -3
  47. package/esm2020/src/app/core/install/install-upgrade-card.module.mjs +17 -15
  48. package/esm2020/src/app/core/menu/menu.component.mjs +5 -5
  49. package/esm2020/src/app/core/menu/menu.module.mjs +9 -10
  50. package/esm2020/src/app/core/menu/menu.service.mjs +3 -3
  51. package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +3 -3
  52. package/esm2020/src/app/core/offline/update-offline-mode-card.module.mjs +35 -0
  53. package/esm2020/src/app/core/peer/select-peer.modal.mjs +55 -11
  54. package/esm2020/src/app/core/peer/select-peer.module.mjs +17 -10
  55. package/esm2020/src/app/core/register/register-confirm.page.mjs +81 -0
  56. package/esm2020/src/app/core/register/register.form.mjs +181 -0
  57. package/esm2020/src/app/core/register/register.modal.mjs +52 -0
  58. package/esm2020/src/app/core/register/register.module.mjs +17 -15
  59. package/esm2020/src/app/core/services/account.service.mjs +22 -23
  60. package/esm2020/src/app/core/services/auth-guard.service.mjs +6 -6
  61. package/esm2020/src/app/core/services/base-entity-service.class.mjs +3 -3
  62. package/esm2020/src/app/core/services/base-graphql-service.class.mjs +8 -8
  63. package/esm2020/src/app/core/services/base58.mjs +2 -2
  64. package/esm2020/src/app/core/services/config.service.mjs +4 -4
  65. package/esm2020/src/app/core/services/crypto.service.mjs +82 -97
  66. package/esm2020/src/app/core/services/local-settings.service.mjs +8 -10
  67. package/esm2020/src/app/core/services/model/entity.decorators.mjs +44 -54
  68. package/esm2020/src/app/core/services/model/peer.model.mjs +3 -3
  69. package/esm2020/src/app/core/services/network.service.mjs +7 -7
  70. package/esm2020/src/app/core/services/pipes/account.pipes.mjs +8 -8
  71. package/esm2020/src/app/core/services/pipes/department-to-string.pipe.mjs +4 -4
  72. package/esm2020/src/app/core/services/pipes/person-to-string.pipe.mjs +4 -4
  73. package/esm2020/src/app/core/services/pipes/usage-mode.pipes.mjs +8 -8
  74. package/esm2020/src/app/core/services/platform.service.mjs +9 -10
  75. package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +3 -3
  76. package/esm2020/src/app/core/services/storage/entity-store.class.mjs +4 -4
  77. package/esm2020/src/app/core/services/testing/referential.validator.mjs +3 -3
  78. package/esm2020/src/app/core/services/validator/account.validator.mjs +3 -3
  79. package/esm2020/src/app/core/services/validator/base.validator.class.mjs +3 -3
  80. package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +3 -3
  81. package/esm2020/src/app/core/services/validator/user-settings.validator.mjs +3 -3
  82. package/esm2020/src/app/core/settings/settings.module.mjs +34 -0
  83. package/esm2020/src/app/core/settings/settings.page.mjs +12 -9
  84. package/esm2020/src/app/core/table/actions-column.component.mjs +3 -3
  85. package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +13 -8
  86. package/esm2020/src/app/core/table/memory-table.class.mjs +3 -3
  87. package/esm2020/src/app/core/table/table-select-columns.component.mjs +3 -3
  88. package/esm2020/src/app/core/table/table.class.mjs +11 -16
  89. package/esm2020/src/app/core/table/table.module.mjs +40 -0
  90. package/esm2020/src/app/core/table/testing/table.testing.mjs +8 -8
  91. package/esm2020/src/app/core/table/testing/table.testing.module.mjs +4 -4
  92. package/esm2020/src/app/shared/audio/audio.mjs +3 -3
  93. package/esm2020/src/app/shared/audio/audio.testing.mjs +3 -3
  94. package/esm2020/src/app/shared/audio/audio.testing.module.mjs +4 -4
  95. package/esm2020/src/app/shared/capacitor/keyboard.mjs +3 -3
  96. package/esm2020/src/app/shared/constants.mjs +4 -2
  97. package/esm2020/src/app/shared/dates.mjs +20 -14
  98. package/esm2020/src/app/shared/debug/debug.component.mjs +3 -3
  99. package/esm2020/src/app/shared/debug/debug.module.mjs +4 -4
  100. package/esm2020/src/app/shared/directives/autofocus.directive.mjs +3 -3
  101. package/esm2020/src/app/shared/directives/autotitle.directive.mjs +3 -3
  102. package/esm2020/src/app/shared/directives/directives.module.mjs +4 -4
  103. package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +3 -3
  104. package/esm2020/src/app/shared/directives/ng-var.directive.mjs +3 -3
  105. package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +3 -3
  106. package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +3 -3
  107. package/esm2020/src/app/shared/directives/resizable/resizable.module.mjs +4 -4
  108. package/esm2020/src/app/shared/file/file.service.mjs +5 -5
  109. package/esm2020/src/app/shared/form/field.component.mjs +3 -3
  110. package/esm2020/src/app/shared/form/loading-spinner.mjs +3 -3
  111. package/esm2020/src/app/shared/gesture/gesture-config.mjs +3 -3
  112. package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +3 -3
  113. package/esm2020/src/app/shared/help/help.modal.mjs +3 -3
  114. package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +3 -3
  115. package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +3 -3
  116. package/esm2020/src/app/shared/hotkeys/shared-hotkeys.module.mjs +4 -4
  117. package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +134 -60
  118. package/esm2020/src/app/shared/image/gallery/image-gallery.module.mjs +19 -7
  119. package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +3 -3
  120. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +13 -7
  121. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +4 -4
  122. package/esm2020/src/app/shared/image/image.module.mjs +5 -5
  123. package/esm2020/src/app/shared/image/image.service.mjs +3 -3
  124. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +7 -6
  125. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +4 -4
  126. package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +3 -3
  127. package/esm2020/src/app/shared/material/badge/badge.directive.mjs +3 -3
  128. package/esm2020/src/app/shared/material/badge/badge.module.mjs +4 -4
  129. package/esm2020/src/app/shared/material/badge/badge.test.mjs +3 -3
  130. package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +4 -4
  131. package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +5 -5
  132. package/esm2020/src/app/shared/material/chips/chips.module.mjs +4 -4
  133. package/esm2020/src/app/shared/material/chips/material.chips.mjs +5 -5
  134. package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +3 -3
  135. package/esm2020/src/app/shared/material/datetime/datetime.module.mjs +4 -4
  136. package/esm2020/src/app/shared/material/datetime/material.date.mjs +7 -8
  137. package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +6 -6
  138. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +7 -8
  139. package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +5 -7
  140. package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +7 -8
  141. package/esm2020/src/app/shared/material/duration/duration.module.mjs +4 -4
  142. package/esm2020/src/app/shared/material/duration/material.duration.mjs +3 -3
  143. package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +3 -3
  144. package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +4 -4
  145. package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +3 -3
  146. package/esm2020/src/app/shared/material/material.module.mjs +4 -4
  147. package/esm2020/src/app/shared/material/material.testing.module.mjs +4 -4
  148. package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +3 -3
  149. package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +3 -3
  150. package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +3 -3
  151. package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +3 -3
  152. package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +3 -3
  153. package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +3 -3
  154. package/esm2020/src/app/shared/material/numpad/numpad.module.mjs +4 -4
  155. package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +3 -3
  156. package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +3 -3
  157. package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +3 -3
  158. package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +3 -3
  159. package/esm2020/src/app/shared/material/swipe/swipe.module.mjs +4 -4
  160. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +7 -8
  161. package/esm2020/src/app/shared/modules.mjs +11 -0
  162. package/esm2020/src/app/shared/pipes/arrays.pipe.mjs +24 -24
  163. package/esm2020/src/app/shared/pipes/colors.pipe.mjs +4 -4
  164. package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +8 -9
  165. package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +4 -4
  166. package/esm2020/src/app/shared/pipes/date-from-now.pipe.mjs +4 -4
  167. package/esm2020/src/app/shared/pipes/duration.pipe.mjs +4 -4
  168. package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +3 -3
  169. package/esm2020/src/app/shared/pipes/form.pipes.mjs +18 -18
  170. package/esm2020/src/app/shared/pipes/highlight.pipe.mjs +4 -4
  171. package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +9 -9
  172. package/esm2020/src/app/shared/pipes/maps.pipe.mjs +12 -12
  173. package/esm2020/src/app/shared/pipes/math.pipes.mjs +12 -12
  174. package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +3 -3
  175. package/esm2020/src/app/shared/pipes/number-format.pipe.mjs +4 -4
  176. package/esm2020/src/app/shared/pipes/pipes.module.mjs +14 -6
  177. package/esm2020/src/app/shared/pipes/property.pipes.mjs +7 -7
  178. package/esm2020/src/app/shared/pipes/string.pipes.mjs +43 -17
  179. package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +8 -8
  180. package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +3 -3
  181. package/esm2020/src/app/shared/services/progress-bar.service.mjs +3 -3
  182. package/esm2020/src/app/shared/services/storage/storage.service.mjs +3 -3
  183. package/esm2020/src/app/shared/services/translate-context.service.mjs +3 -3
  184. package/esm2020/src/app/shared/shared-routing.module.mjs +7 -7
  185. package/esm2020/src/app/shared/shared.module.mjs +9 -5
  186. package/esm2020/src/app/shared/shared.testing.module.mjs +4 -4
  187. package/esm2020/src/app/shared/testing/observable.test.mjs +6 -7
  188. package/esm2020/src/app/shared/testing/tests.page.mjs +3 -3
  189. package/esm2020/src/app/shared/toast/toast.testing.mjs +3 -3
  190. package/esm2020/src/app/shared/toast/toast.testing.module.mjs +4 -4
  191. package/esm2020/src/app/shared/toast/toasts.mjs +1 -1
  192. package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +3 -3
  193. package/esm2020/src/app/shared/toolbar/toolbar.mjs +3 -3
  194. package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +4 -4
  195. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +3 -3
  196. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +4 -4
  197. package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +5 -5
  198. package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +3 -3
  199. package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +3 -3
  200. package/esm2020/src/app/shared/validator/validators.mjs +4 -5
  201. package/esm2020/src/app/social/job/job.module.mjs +4 -4
  202. package/esm2020/src/app/social/job/job.service.mjs +3 -3
  203. package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +3 -3
  204. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +3 -3
  205. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +3 -3
  206. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +3 -3
  207. package/esm2020/src/app/social/job/testing/job.testing.module.mjs +4 -4
  208. package/esm2020/src/app/social/message/message.form.mjs +3 -3
  209. package/esm2020/src/app/social/message/message.modal.mjs +3 -3
  210. package/esm2020/src/app/social/message/message.module.mjs +4 -4
  211. package/esm2020/src/app/social/message/message.service.mjs +3 -3
  212. package/esm2020/src/app/social/social.module.mjs +4 -4
  213. package/esm2020/src/app/social/social.testing.module.mjs +4 -4
  214. package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +3 -3
  215. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +6 -6
  216. package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +13 -12
  217. package/esm2020/src/app/social/user-event/testing/user-event.testing.module.mjs +4 -4
  218. package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +3 -3
  219. package/esm2020/src/app/social/user-event/user-event.module.mjs +4 -4
  220. package/esm2020/src/app/social/user-event/user-event.service.mjs +6 -8
  221. package/fesm2015/sumaris-net.ngx-components.mjs +10181 -9595
  222. package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -1
  223. package/fesm2020/sumaris-net.ngx-components.mjs +10395 -9817
  224. package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -1
  225. package/package.json +2 -1
  226. package/public_api.d.ts +34 -21
  227. package/src/app/admin/admin.module.d.ts +1 -1
  228. package/src/app/admin/users/{list/users.d.ts → users.d.ts} +11 -11
  229. package/src/app/admin/users/users.module.d.ts +13 -0
  230. package/src/app/core/about/{modal-about.d.ts → about.modal.d.ts} +1 -1
  231. package/src/app/core/about/about.module.d.ts +10 -0
  232. package/src/app/core/account/account.module.d.ts +11 -0
  233. package/src/app/core/account/{account.d.ts → account.page.d.ts} +5 -1
  234. package/src/app/core/auth/{form/form-auth.d.ts → auth.form.d.ts} +9 -9
  235. package/src/app/core/auth/{modal/modal-auth.d.ts → auth.modal.d.ts} +4 -4
  236. package/src/app/core/auth/auth.module.d.ts +11 -0
  237. package/src/app/core/core.module.d.ts +20 -29
  238. package/src/app/core/core.testing.module.d.ts +1 -1
  239. package/src/app/core/form/{form-buttons-bar.component.d.ts → buttons/form-buttons-bar.component.d.ts} +2 -2
  240. package/src/app/core/form/buttons/form-buttons-bar.module.d.ts +9 -0
  241. package/src/app/core/form/{editor.class.d.ts → entity/editor.class.d.ts} +9 -9
  242. package/src/app/core/form/{entity-editor-modal.class.d.ts → entity/entity-editor-modal.class.d.ts} +7 -7
  243. package/src/app/core/form/{entity-editor.class.d.ts → entity/entity-editor.class.d.ts} +10 -10
  244. package/src/app/core/form/{entity-metadata.component.d.ts → entity/entity-metadata.component.d.ts} +1 -1
  245. package/src/app/core/form/entity/entity.module.d.ts +10 -0
  246. package/src/app/core/form/form.module.d.ts +13 -0
  247. package/src/app/core/form/{list.form.d.ts → list/list.form.d.ts} +3 -3
  248. package/src/app/core/form/list/list.module.d.ts +9 -0
  249. package/src/app/core/form/properties/properties.module.d.ts +9 -0
  250. package/src/app/core/{text-popover → form/text-popover}/testing/text-popover.testing.d.ts +0 -0
  251. package/src/app/core/{text-popover → form/text-popover}/testing/text-popover.testing.module.d.ts +0 -0
  252. package/src/app/core/{text-popover → form/text-popover}/text-form.component.d.ts +4 -3
  253. package/src/app/core/{text-popover → form/text-popover}/text-popover.component.d.ts +7 -2
  254. package/src/app/core/form/text-popover/text-popover.module.d.ts +10 -0
  255. package/src/app/core/home/home.module.d.ts +12 -0
  256. package/src/app/core/install/install-upgrade-card.module.d.ts +6 -7
  257. package/src/app/core/menu/menu.component.d.ts +1 -1
  258. package/src/app/core/offline/update-offline-mode-card.module.d.ts +9 -0
  259. package/src/app/core/peer/select-peer.modal.d.ts +19 -5
  260. package/src/app/core/peer/select-peer.module.d.ts +6 -4
  261. package/src/app/core/register/{confirm/confirm.d.ts → register-confirm.page.d.ts} +4 -4
  262. package/src/app/core/register/{form/form-register.d.ts → register.form.d.ts} +7 -7
  263. package/src/app/core/register/{modal/modal-register.d.ts → register.modal.d.ts} +2 -2
  264. package/src/app/core/register/register.module.d.ts +6 -6
  265. package/src/app/core/services/account.service.d.ts +8 -9
  266. package/src/app/core/services/base-graphql-service.class.d.ts +9 -8
  267. package/src/app/core/services/crypto.service.d.ts +23 -18
  268. package/src/app/core/services/model/entity.decorators.d.ts +1 -9
  269. package/src/app/core/services/network.service.d.ts +3 -4
  270. package/src/app/core/settings/settings.module.d.ts +10 -0
  271. package/src/app/core/settings/settings.page.d.ts +2 -4
  272. package/src/app/core/table/entities-table-datasource.class.d.ts +1 -0
  273. package/src/app/core/table/table.class.d.ts +2 -6
  274. package/src/app/core/table/table.module.d.ts +10 -0
  275. package/src/app/shared/constants.d.ts +1 -1
  276. package/src/app/shared/dates.d.ts +5 -3
  277. package/src/app/shared/image/gallery/image-gallery.component.d.ts +39 -17
  278. package/src/app/shared/image/gallery/image-gallery.module.d.ts +6 -4
  279. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +1 -0
  280. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +1 -0
  281. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +2 -3
  282. package/src/app/shared/modules.d.ts +8 -0
  283. package/src/app/shared/pipes/pipes.module.d.ts +1 -1
  284. package/src/app/shared/pipes/string.pipes.d.ts +10 -0
  285. package/src/app/shared/shared.module.d.ts +2 -1
  286. package/src/assets/i18n/fr.json +4 -1
  287. package/src/theme/_ngx-components.scss +22 -4
  288. package/esm2020/src/app/admin/users/list/users.mjs +0 -233
  289. package/esm2020/src/app/admin/users/list/users.module.mjs +0 -58
  290. package/esm2020/src/app/core/about/modal-about.mjs +0 -71
  291. package/esm2020/src/app/core/account/account.mjs +0 -230
  292. package/esm2020/src/app/core/auth/form/form-auth.mjs +0 -131
  293. package/esm2020/src/app/core/auth/modal/modal-auth.mjs +0 -72
  294. package/esm2020/src/app/core/form/editor.class.mjs +0 -675
  295. package/esm2020/src/app/core/form/entity-editor-modal.class.mjs +0 -421
  296. package/esm2020/src/app/core/form/entity-editor.class.mjs +0 -646
  297. package/esm2020/src/app/core/form/list.form.mjs +0 -222
  298. package/esm2020/src/app/core/register/confirm/confirm.mjs +0 -81
  299. package/esm2020/src/app/core/register/form/form-register.mjs +0 -181
  300. package/esm2020/src/app/core/register/modal/modal-register.mjs +0 -52
  301. package/esm2020/src/app/core/text-popover/testing/text-popover.testing.module.mjs +0 -45
  302. package/esm2020/src/app/core/text-popover/text-form.component.mjs +0 -84
  303. package/esm2020/src/app/core/text-popover/text-popover.component.mjs +0 -92
  304. package/esm2020/src/app/vendor.mjs +0 -16
  305. package/src/app/admin/users/list/users.module.d.ts +0 -14
  306. package/src/app/vendor.d.ts +0 -11
@@ -0,0 +1,421 @@
1
+ import { ChangeDetectorRef, Directive, Input, Optional } from '@angular/core';
2
+ import { Router } from '@angular/router';
3
+ import { AlertController, ModalController } from '@ionic/angular';
4
+ import { TranslateService } from '@ngx-translate/core';
5
+ import { BehaviorSubject, Subject } from 'rxjs';
6
+ import { LocalSettingsService } from '../../services/local-settings.service';
7
+ import { AppTabEditor, AppTabEditorOptions } from './editor.class';
8
+ import { AppFormUtils } from '../form.utils';
9
+ import { Alerts } from '../../../shared/alerts';
10
+ import { ErrorCodes } from '../../services/errors';
11
+ import { isNil, isNotNil, isNotNilOrBlank } from '../../../shared/functions';
12
+ import { DateFormatPipe } from '../../../shared/pipes/date-format.pipe';
13
+ import { ENVIRONMENT } from '../../../../environments/environment.class';
14
+ import { waitForFalse } from '../../../shared/observables';
15
+ import { FormErrorTranslator } from '../../../shared/validator/form-error-adapter.class';
16
+ import { debounceTime } from 'rxjs/operators';
17
+ import * as i0 from "@angular/core";
18
+ export class AppEntityEditorModalOptions extends AppTabEditorOptions {
19
+ }
20
+ // @dynamic
21
+ // eslint-disable-next-line @angular-eslint/directive-class-suffix
22
+ export class AppEntityEditorModal extends AppTabEditor {
23
+ constructor(injector, dataType, options) {
24
+ super(null, injector.get(Router), injector.get(AlertController), injector.get(TranslateService), options);
25
+ this.dataType = dataType;
26
+ this.savingSubject = new BehaviorSubject(false);
27
+ this.$title = new Subject();
28
+ this.i18nSuffix = null;
29
+ this.environement = injector.get(ENVIRONMENT);
30
+ options = {
31
+ // Default options
32
+ i18nPrefix: '',
33
+ // Override defaults
34
+ ...options
35
+ };
36
+ this.queryTabIndexParamName = undefined; // Important: avoid query parameter changed
37
+ this.settings = injector.get(LocalSettingsService);
38
+ this.errorTranslator = injector.get(FormErrorTranslator);
39
+ this.cd = injector.get(ChangeDetectorRef);
40
+ this.dateFormat = injector.get(DateFormatPipe);
41
+ this.modalCtrl = injector.get(ModalController);
42
+ this.i18nContext = {
43
+ prefix: options.i18nPrefix,
44
+ suffix: this.i18nSuffix || ''
45
+ };
46
+ // FOR DEV ONLY ----
47
+ //this.debug = !environment.production;
48
+ }
49
+ set isNew(value) {
50
+ this._isNew = value;
51
+ }
52
+ get isNew() {
53
+ return isNotNil(this._isNew) ? this._isNew : isNil(this.data?.id);
54
+ }
55
+ /**
56
+ * @deprecated use isNew instead
57
+ */
58
+ get isNewData() {
59
+ return this.isNew;
60
+ }
61
+ /**
62
+ * @deprecated use isNew instead
63
+ */
64
+ set isNewData(value) {
65
+ this.isNew = value;
66
+ }
67
+ set disabled(value) {
68
+ this._enabled = !value;
69
+ }
70
+ get disabled() {
71
+ return !this._enabled;
72
+ }
73
+ get isOnFieldMode() {
74
+ return this.settings.isOnFieldMode(this._usageMode);
75
+ }
76
+ get saving() {
77
+ return this.savingSubject.value;
78
+ }
79
+ markAsSaving(opts) {
80
+ if (this.savingSubject.value !== true) {
81
+ this.savingSubject.next(true);
82
+ if (!opts || opts.emitEvent !== false)
83
+ this.markForCheck();
84
+ }
85
+ }
86
+ markAsSaved(opts) {
87
+ if (this.savingSubject.value !== false) {
88
+ this.savingSubject.next(false);
89
+ if (!opts || opts.emitEvent !== false)
90
+ this.markForCheck();
91
+ }
92
+ }
93
+ ngOnInit() {
94
+ // Default values
95
+ this.mobile = isNotNil(this.mobile) ? this.mobile : this.settings.mobile;
96
+ super.ngOnInit();
97
+ // Register forms
98
+ this.registerForms();
99
+ // Disable
100
+ if (this.disabled)
101
+ this.disable();
102
+ if (this.isNewData) {
103
+ // Update the title.
104
+ this.updateTitle();
105
+ }
106
+ else {
107
+ // Update title each time value changes
108
+ this.registerSubscription(this.form.valueChanges
109
+ .pipe(debounceTime(250))
110
+ .subscribe(json => this.updateTitle(json)));
111
+ }
112
+ }
113
+ ngAfterViewInit() {
114
+ super.ngAfterViewInit();
115
+ if (this.onAfterModalInit) {
116
+ Promise.resolve(this.onAfterModalInit(this))
117
+ .then(() => this.load());
118
+ }
119
+ else {
120
+ // Use a timeout to avoid error 'NG0100: ExpressionChangedAfterItHasBeenCheckedError'
121
+ setTimeout(() => this.load());
122
+ }
123
+ }
124
+ ngOnDestroy() {
125
+ super.ngOnDestroy();
126
+ this.$title.complete();
127
+ this.$title.unsubscribe();
128
+ this.savingSubject.unsubscribe();
129
+ }
130
+ waitIdle(opts) {
131
+ // Wait end of saving
132
+ if (this.saving)
133
+ return waitForFalse(this.savingSubject);
134
+ return super.waitIdle(opts);
135
+ }
136
+ async load() {
137
+ this.markAsReady();
138
+ this.markAsLoading();
139
+ try {
140
+ await this.updateView(this.data);
141
+ }
142
+ catch (err) {
143
+ if (err === 'CANCELLED')
144
+ return;
145
+ this.setError(err);
146
+ this.selectedTabIndex = 0;
147
+ }
148
+ finally {
149
+ this.markAsLoaded();
150
+ }
151
+ }
152
+ reload() {
153
+ if (this.dirty) {
154
+ return this.load();
155
+ }
156
+ }
157
+ unload(opts) {
158
+ throw new Error("No implemented on modal");
159
+ }
160
+ async updateView(data, opts) {
161
+ this.resetError();
162
+ if (!this.data)
163
+ throw { code: ErrorCodes.DATA_NOT_FOUND_ERROR, message: 'ERROR.DATA_NO_FOUND' };
164
+ await this.setValue(data);
165
+ if (!opts || opts.emitEvent !== false) {
166
+ this.markAsPristine();
167
+ this.markAsUntouched();
168
+ this.updateViewState(data);
169
+ // Update the title.
170
+ this.updateTitle(data);
171
+ }
172
+ }
173
+ /**
174
+ * Enable or disable state
175
+ */
176
+ updateViewState(data, opts) {
177
+ if (this.isNewData || this.enabled) {
178
+ this.enable(opts);
179
+ }
180
+ else {
181
+ this.disable(opts);
182
+ // Allow to sort table
183
+ this.tables?.forEach(t => t.enableSort());
184
+ }
185
+ }
186
+ async saveAndClose(event) {
187
+ const data = await this.saveAndGetDataIfValid();
188
+ if (data) {
189
+ this.modalCtrl.dismiss(data);
190
+ return true;
191
+ }
192
+ return false;
193
+ }
194
+ async close(event) {
195
+ if (this.dirty) {
196
+ const saveBeforeLeave = await Alerts.askSaveBeforeLeave(this.alertCtrl, this.translate, event);
197
+ // User cancelled
198
+ if (isNil(saveBeforeLeave) || event && event.defaultPrevented) {
199
+ return;
200
+ }
201
+ // Is user confirm: close normally
202
+ if (saveBeforeLeave === true) {
203
+ await this.saveAndClose(event);
204
+ return;
205
+ }
206
+ }
207
+ await this.modalCtrl.dismiss();
208
+ }
209
+ /**
210
+ * Save the editor, by calling the dataService.save().
211
+ * Ensure that editor if valid. If not, display an error
212
+ * @param event
213
+ * @param opts
214
+ */
215
+ async save(event, opts) {
216
+ if (this.loading || this.saving || this.disabled) {
217
+ console.debug(this._logPrefix + 'Skip save: modal is busy (loading or saving)');
218
+ return false;
219
+ }
220
+ if (!this.dirty) {
221
+ console.debug(this._logPrefix + 'Skip save: modal not dirty');
222
+ return true;
223
+ }
224
+ // Wait end of async validation
225
+ await this.waitWhilePending();
226
+ // If invalid
227
+ if (this.invalid) {
228
+ this.logFormErrors();
229
+ this.setError('COMMON.FORM.HAS_ERROR');
230
+ this.openFirstInvalidTab();
231
+ this.scrollToTop();
232
+ this.markAllAsTouched();
233
+ this.submitted = true;
234
+ return false;
235
+ }
236
+ this.markAsSaving();
237
+ this.resetError();
238
+ if (this.debug)
239
+ console.debug(this._logPrefix + 'Saving data...');
240
+ try {
241
+ // Save all dirty children
242
+ const saved = await this.saveDirtyChildren();
243
+ if (!saved)
244
+ return false;
245
+ // Fill data
246
+ this.data = await this.getValue();
247
+ // Mark as submitted
248
+ this.submitted = true;
249
+ return true;
250
+ }
251
+ catch (err) {
252
+ this.submitted = true;
253
+ this.setError(err);
254
+ this.selectedTabIndex = 0;
255
+ this.scrollToTop(); // Scroll to top (to show error)
256
+ this.markAsDirty();
257
+ this.enable();
258
+ return false;
259
+ }
260
+ finally {
261
+ this.markAsSaved();
262
+ }
263
+ }
264
+ /**
265
+ * Save data (if dirty and valid), and return it. Otherwise, return nil value.
266
+ */
267
+ async saveAndGetDataIfValid() {
268
+ // Form is not valid
269
+ if (!this.valid) {
270
+ // Make sure validation is finished
271
+ await AppFormUtils.waitWhilePending(this);
272
+ // If invalid: Open the first tab in error
273
+ if (this.invalid) {
274
+ this.openFirstInvalidTab();
275
+ return undefined;
276
+ }
277
+ // Continue (valid)
278
+ }
279
+ // Form is valid, but not saved
280
+ if (this.dirty) {
281
+ const saved = await this.save(new Event('save'));
282
+ if (!saved)
283
+ return undefined;
284
+ }
285
+ // Valid and saved data
286
+ return this.data;
287
+ }
288
+ async delete(event) {
289
+ if (this.loading || this.saving)
290
+ return false;
291
+ this.markAsSaving();
292
+ this.resetError();
293
+ try {
294
+ // Delegate deletion to modal caller
295
+ if (this.onDelete) {
296
+ const result = await this.onDelete(event, this.data);
297
+ // User cancelled
298
+ if (isNil(result) || (event && event.defaultPrevented))
299
+ return;
300
+ if (result) {
301
+ await this.modalCtrl.dismiss(this.data, 'delete');
302
+ }
303
+ }
304
+ // Or dismiss, with the role 'delete'
305
+ else {
306
+ if (this.isNewData) {
307
+ console.error(this._logPrefix + "Trying to delete a new data. Make no sense!");
308
+ }
309
+ await this.modalCtrl.dismiss(this.data, 'delete');
310
+ }
311
+ }
312
+ catch (err) {
313
+ this.submitted = true;
314
+ this.setError(err);
315
+ this.selectedTabIndex = 0;
316
+ this.markAsSaved();
317
+ if (this.enabled)
318
+ this.enable();
319
+ return false;
320
+ }
321
+ }
322
+ resetError(opts) {
323
+ if (isNotNilOrBlank(this.error)) {
324
+ this.error = null;
325
+ if (!opts || opts.emitEvent !== false)
326
+ this.markForCheck();
327
+ }
328
+ }
329
+ setError(err, opts) {
330
+ if (!err) {
331
+ super.setError(undefined, opts);
332
+ }
333
+ else if (typeof err === 'string') {
334
+ console.error('[entity-editor] Error: ' + (err || ''));
335
+ super.setError(err, opts);
336
+ }
337
+ else {
338
+ console.error('[entity-editor] Error: ' + err.message || '', err);
339
+ let userMessage = err.message && this.translate.instant(err.message) || err;
340
+ // Add details error (if any) under the main message
341
+ const detailMessage = (!err.details || typeof err.details === 'string')
342
+ ? err.details
343
+ : err.details.message;
344
+ if (isNotNilOrBlank(detailMessage)) {
345
+ const cssClass = opts?.detailsCssClass || 'error-details';
346
+ userMessage += `<br/><small class="${cssClass}" title="${detailMessage}">`;
347
+ userMessage += detailMessage.length < 70 ? detailMessage : detailMessage.substring(0, 67) + '...';
348
+ userMessage += '</small>';
349
+ }
350
+ super.setError(userMessage, opts);
351
+ }
352
+ }
353
+ /* -- protected methods -- */
354
+ waitWhilePending(opts) {
355
+ return AppFormUtils.waitWhilePending(this, opts);
356
+ }
357
+ async getValue() {
358
+ const json = await this.getJsonValueToSave();
359
+ const res = new this.dataType();
360
+ res.fromObject(json);
361
+ return res;
362
+ }
363
+ getJsonValueToSave() {
364
+ return Promise.resolve(this.form.value);
365
+ }
366
+ /**
367
+ * Compute the title
368
+ *
369
+ * @param data
370
+ */
371
+ async updateTitle(data) {
372
+ data = data || this.data;
373
+ const title = await this.computeTitle(data);
374
+ this.$title.next(title);
375
+ }
376
+ async scrollToTop(duration) {
377
+ if (this.content) {
378
+ return this.content.scrollToTop(duration);
379
+ }
380
+ }
381
+ markForCheck() {
382
+ this.cd?.markForCheck();
383
+ }
384
+ /* -- private functions -- */
385
+ /**
386
+ * Open the first tab that is invalid
387
+ */
388
+ openFirstInvalidTab() {
389
+ const invalidTabIndex = this.getFirstInvalidTabIndex();
390
+ if (invalidTabIndex !== -1 && this.selectedTabIndex !== invalidTabIndex) {
391
+ this.selectedTabIndex = invalidTabIndex;
392
+ this.markForCheck();
393
+ }
394
+ }
395
+ }
396
+ AppEntityEditorModal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: AppEntityEditorModal, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
397
+ AppEntityEditorModal.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.8", type: AppEntityEditorModal, inputs: { data: "data", mobile: "mobile", usageMode: "usageMode", onAfterModalInit: "onAfterModalInit", onDelete: "onDelete", i18nSuffix: "i18nSuffix", isNew: "isNew", isNewData: "isNewData", disabled: "disabled" }, usesInheritance: true, ngImport: i0 });
398
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: AppEntityEditorModal, decorators: [{
399
+ type: Directive
400
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: undefined }, { type: undefined, decorators: [{
401
+ type: Optional
402
+ }] }]; }, propDecorators: { data: [{
403
+ type: Input
404
+ }], mobile: [{
405
+ type: Input
406
+ }], usageMode: [{
407
+ type: Input
408
+ }], onAfterModalInit: [{
409
+ type: Input
410
+ }], onDelete: [{
411
+ type: Input
412
+ }], i18nSuffix: [{
413
+ type: Input
414
+ }], isNew: [{
415
+ type: Input
416
+ }], isNewData: [{
417
+ type: Input
418
+ }], disabled: [{
419
+ type: Input
420
+ }] } });
421
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWVkaXRvci1tb2RhbC5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9mb3JtL2VudGl0eS9lbnRpdHktZWRpdG9yLW1vZGFsLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsaUJBQWlCLEVBQUUsU0FBUyxFQUFZLEtBQUssRUFBcUIsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUMsZUFBZSxFQUFFLGVBQWUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWhFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBSTNFLE9BQU8sRUFBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDM0UsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHdDQUF3QyxDQUFDO0FBQ3RFLE9BQU8sRUFBYyxXQUFXLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQUMsWUFBWSxFQUFpQixNQUFNLDZCQUE2QixDQUFDO0FBQ3pFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9E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bmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge0FsZXJ0Q29udHJvbGxlciwgTW9kYWxDb250cm9sbGVyfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5cbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0xvY2FsU2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7RW50aXR5fSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHtVc2FnZU1vZGV9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vZGVsL3NldHRpbmdzLm1vZGVsJztcbmltcG9ydCB7Rm9ybUdyb3VwfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0FwcFRhYkVkaXRvciwgQXBwVGFiRWRpdG9yT3B0aW9uc30gZnJvbSAnLi9lZGl0b3IuY2xhc3MnO1xuaW1wb3J0IHtBcHBGb3JtVXRpbHN9IGZyb20gJy4uL2Zvcm0udXRpbHMnO1xuaW1wb3J0IHtBbGVydHN9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9hbGVydHMnO1xuaW1wb3J0IHtFcnJvckNvZGVzfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lcnJvcnMnO1xuaW1wb3J0IHtpc05pbCwgaXNOb3ROaWwsIGlzTm90TmlsT3JCbGFua30gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0RhdGVGb3JtYXRQaXBlfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvcGlwZXMvZGF0ZS1mb3JtYXQucGlwZSc7XG5pbXBvcnQge0Vudmlyb25tZW50LCBFTlZJUk9OTUVOVH0gZnJvbSAnLi4vLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7d2FpdEZvckZhbHNlLCBXYWl0Rm9yT3B0aW9uc30gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL29ic2VydmFibGVzJztcbmltcG9ydCB7Rm9ybUVycm9yVHJhbnNsYXRvcn0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3ZhbGlkYXRvci9mb3JtLWVycm9yLWFkYXB0ZXIuY2xhc3MnO1xuaW1wb3J0IHtBcHBFcnJvcldpdGhEZXRhaWxzfSBmcm9tICcuL2VudGl0eS1lZGl0b3IuY2xhc3MnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWV9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuXG5leHBvcnQgaW50ZXJmYWNlIElFbnRpdHlFZGl0b3JNb2RhbE9wdGlvbnM8XG4gIFQgZXh0ZW5kcyBFbnRpdHk8VCwgSUQ+ICA9IEVudGl0eTxhbnksIGFueT4sXG4gIElEID0gbnVtYmVyPiB7XG5cbiAgLy8gRGF0YVxuICBpc05ldzogYm9vbGVhbjtcbiAgZGF0YTogVDtcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgb25BZnRlck1vZGFsSW5pdD86IDxNIGV4dGVuZHMgQXBwRW50aXR5RWRpdG9yTW9kYWw8VCwgSUQ+Pihtb2RhbDogTSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIG9uRGVsZXRlPzogKGV2ZW50OiBFdmVudCwgZGF0YTogVCkgPT4gUHJvbWlzZTxib29sZWFuPjtcblxuICB1c2FnZU1vZGU6IFVzYWdlTW9kZTtcbiAgbW9iaWxlOiBib29sZWFuO1xuICBpMThuU3VmZml4Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQXBwRW50aXR5RWRpdG9yTW9kYWxPcHRpb25zIGV4dGVuZHMgQXBwVGFiRWRpdG9yT3B0aW9ucyB7XG4gIGkxOG5QcmVmaXg/OiBzdHJpbmc7XG59XG5cbi8vIEBkeW5hbWljXG5ARGlyZWN0aXZlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFwcEVudGl0eUVkaXRvck1vZGFsPFxuICBUIGV4dGVuZHMgRW50aXR5PFQsIElEPixcbiAgSUQgPSBudW1iZXIsXG4gIE8gZXh0ZW5kcyBBcHBFbnRpdHlFZGl0b3JNb2RhbE9wdGlvbnMgPSBBcHBFbnRpdHlFZGl0b3JNb2RhbE9wdGlvbnNcbiAgPlxuICBleHRlbmRzIEFwcFRhYkVkaXRvcjxULCBJRD5cbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgSUVudGl0eUVkaXRvck1vZGFsT3B0aW9uczxULCBJRD4ge1xuXG4gIHByaXZhdGUgX3VzYWdlTW9kZTogVXNhZ2VNb2RlO1xuICBwcm90ZWN0ZWQgX2xvZ1ByZWZpeDtcbiAgcHJvdGVjdGVkIF9pc05ldzogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGF0ZUZvcm1hdDogRGF0ZUZvcm1hdFBpcGU7XG4gIHByb3RlY3RlZCByZWFkb25seSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWY7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2U7XG4gIHByb3RlY3RlZCByZWFkb25seSBtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVudmlyb25lbWVudDogRW52aXJvbm1lbnQ7XG4gIHByb3RlY3RlZCBlcnJvclRyYW5zbGF0b3I6IEZvcm1FcnJvclRyYW5zbGF0b3I7XG5cbiAgcmVhZG9ubHkgc2F2aW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICR0aXRsZSA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICBASW5wdXQoKSBkYXRhOiBUO1xuICBASW5wdXQoKSBtb2JpbGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHVzYWdlTW9kZTogVXNhZ2VNb2RlO1xuICBASW5wdXQoKSBvbkFmdGVyTW9kYWxJbml0OiA8TSBleHRlbmRzIEFwcEVudGl0eUVkaXRvck1vZGFsPFQsIElEPj4obW9kYWw6IE0pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBASW5wdXQoKSBvbkRlbGV0ZTogKGV2ZW50OiBFdmVudCwgZGF0YTogVCkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgQElucHV0KCkgaTE4blN1ZmZpeDogc3RyaW5nID0gbnVsbDtcblxuICBASW5wdXQoKSBzZXQgaXNOZXcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc05ldyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGlzTmV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05vdE5pbCh0aGlzLl9pc05ldykgPyB0aGlzLl9pc05ldyA6IGlzTmlsKHRoaXMuZGF0YT8uaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBpc05ldyBpbnN0ZWFkXG4gICAqL1xuICBnZXQgaXNOZXdEYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTmV3O1xuICB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgaXNOZXcgaW5zdGVhZFxuICAgKi9cbiAgQElucHV0KCkgc2V0IGlzTmV3RGF0YSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuaXNOZXcgPSB2YWx1ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2VuYWJsZWQgPSAhdmFsdWU7XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLl9lbmFibGVkO1xuICB9XG5cbiAgZ2V0IGlzT25GaWVsZE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuaXNPbkZpZWxkTW9kZSh0aGlzLl91c2FnZU1vZGUpO1xuICB9XG5cbiAgZ2V0IHNhdmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zYXZpbmdTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgbWFya0FzU2F2aW5nKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSl7XG4gICAgaWYgKHRoaXMuc2F2aW5nU3ViamVjdC52YWx1ZSAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zYXZpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc1NhdmVkKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSl7XG4gICAgaWYgKHRoaXMuc2F2aW5nU3ViamVjdC52YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuc2F2aW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgZGF0YVR5cGU6IG5ldygpID0+IFQsXG4gICAgQE9wdGlvbmFsKCkgb3B0aW9ucz86IE9cbiAgKSB7XG4gICAgc3VwZXIobnVsbCxcbiAgICAgIGluamVjdG9yLmdldChSb3V0ZXIpLFxuICAgICAgaW5qZWN0b3IuZ2V0KEFsZXJ0Q29udHJvbGxlciksXG4gICAgICBpbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSksXG4gICAgICBvcHRpb25zKTtcbiAgICB0aGlzLmVudmlyb25lbWVudCA9IGluamVjdG9yLmdldChFTlZJUk9OTUVOVCk7XG4gICAgb3B0aW9ucyA9IDxPPntcbiAgICAgIC8vIERlZmF1bHQgb3B0aW9uc1xuICAgICAgaTE4blByZWZpeDogJycsXG5cbiAgICAgIC8vIE92ZXJyaWRlIGRlZmF1bHRzXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIHRoaXMucXVlcnlUYWJJbmRleFBhcmFtTmFtZSA9IHVuZGVmaW5lZDsgLy8gSW1wb3J0YW50OiBhdm9pZCBxdWVyeSBwYXJhbWV0ZXIgY2hhbmdlZFxuICAgIHRoaXMuc2V0dGluZ3MgPSBpbmplY3Rvci5nZXQoTG9jYWxTZXR0aW5nc1NlcnZpY2UpO1xuICAgIHRoaXMuZXJyb3JUcmFuc2xhdG9yID0gaW5qZWN0b3IuZ2V0KEZvcm1FcnJvclRyYW5zbGF0b3IpO1xuICAgIHRoaXMuY2QgPSBpbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgIHRoaXMuZGF0ZUZvcm1hdCA9IGluamVjdG9yLmdldChEYXRlRm9ybWF0UGlwZSk7XG4gICAgdGhpcy5tb2RhbEN0cmwgPSBpbmplY3Rvci5nZXQoTW9kYWxDb250cm9sbGVyKTtcbiAgICB0aGlzLmkxOG5Db250ZXh0ID0ge1xuICAgICAgcHJlZml4OiBvcHRpb25zLmkxOG5QcmVmaXgsXG4gICAgICBzdWZmaXg6IHRoaXMuaTE4blN1ZmZpeCB8fCAnJ1xuICAgIH07XG5cbiAgICAvLyBGT1IgREVWIE9OTFkgLS0tLVxuICAgIC8vdGhpcy5kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICAvLyBEZWZhdWx0IHZhbHVlc1xuICAgIHRoaXMubW9iaWxlID0gaXNOb3ROaWwodGhpcy5tb2JpbGUpID8gdGhpcy5tb2JpbGUgOiB0aGlzLnNldHRpbmdzLm1vYmlsZTtcblxuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICAvLyBSZWdpc3RlciBmb3Jtc1xuICAgIHRoaXMucmVnaXN0ZXJGb3JtcygpO1xuXG4gICAgLy8gRGlzYWJsZVxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB0aGlzLmRpc2FibGUoKTtcblxuICAgIGlmICh0aGlzLmlzTmV3RGF0YSkge1xuICAgICAgLy8gVXBkYXRlIHRoZSB0aXRsZS5cbiAgICAgIHRoaXMudXBkYXRlVGl0bGUoKTtcbiAgICB9XG5cbiAgICBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZSB0aXRsZSBlYWNoIHRpbWUgdmFsdWUgY2hhbmdlc1xuICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgICAgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgyNTApKVxuICAgICAgICAgIC5zdWJzY3JpYmUoanNvbiA9PiB0aGlzLnVwZGF0ZVRpdGxlKGpzb24pKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG5cbiAgICBpZiAodGhpcy5vbkFmdGVyTW9kYWxJbml0KSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUodGhpcy5vbkFmdGVyTW9kYWxJbml0KHRoaXMpKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLmxvYWQoKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gVXNlIGEgdGltZW91dCB0byBhdm9pZCBlcnJvciAnTkcwMTAwOiBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yJ1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmxvYWQoKSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB0aGlzLiR0aXRsZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuJHRpdGxlLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zYXZpbmdTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICB3YWl0SWRsZShvcHRzPzogV2FpdEZvck9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBXYWl0IGVuZCBvZiBzYXZpbmdcbiAgICBpZiAodGhpcy5zYXZpbmcpIHJldHVybiB3YWl0Rm9yRmFsc2UodGhpcy5zYXZpbmdTdWJqZWN0KTtcblxuICAgIHJldHVybiBzdXBlci53YWl0SWRsZShvcHRzKTtcbiAgfVxuXG4gIGFzeW5jIGxvYWQoKSB7XG4gICAgdGhpcy5tYXJrQXNSZWFkeSgpO1xuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlVmlldyh0aGlzLmRhdGEpO1xuICAgIH1cbiAgICBjYXRjaChlcnIpIHtcbiAgICAgIGlmIChlcnIgPT09ICdDQU5DRUxMRUQnKSByZXR1cm47XG4gICAgICB0aGlzLnNldEVycm9yKGVycik7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSAwO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgdW5sb2FkKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGltcGxlbWVudGVkIG9uIG1vZGFsXCIpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlVmlldyhkYXRhOiBUIHwgbnVsbCwgb3B0cz86IHtcbiAgICBlbWl0RXZlbnQ/OiBib29sZWFuO1xuICAgIG9wZW5UYWJJbmRleD86IG51bWJlcjtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG5cbiAgICBpZiAoIXRoaXMuZGF0YSkgdGhyb3cge2NvZGU6IEVycm9yQ29kZXMuREFUQV9OT1RfRk9VTkRfRVJST1IsIG1lc3NhZ2U6ICdFUlJPUi5EQVRBX05PX0ZPVU5EJ307XG5cbiAgICBhd2FpdCB0aGlzLnNldFZhbHVlKGRhdGEpO1xuXG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgdGhpcy5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgIHRoaXMudXBkYXRlVmlld1N0YXRlKGRhdGEpO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIHRpdGxlLlxuICAgICAgdGhpcy51cGRhdGVUaXRsZShkYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIG9yIGRpc2FibGUgc3RhdGVcbiAgICovXG4gIHVwZGF0ZVZpZXdTdGF0ZShkYXRhOiBULCBvcHRzPzoge29ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMuaXNOZXdEYXRhIHx8IHRoaXMuZW5hYmxlZCkge1xuICAgICAgdGhpcy5lbmFibGUob3B0cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlKG9wdHMpO1xuXG4gICAgICAvLyBBbGxvdyB0byBzb3J0IHRhYmxlXG4gICAgICB0aGlzLnRhYmxlcz8uZm9yRWFjaCh0ID0+IHQuZW5hYmxlU29ydCgpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlQW5kQ2xvc2UoZXZlbnQ/OiBFdmVudHxFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuc2F2ZUFuZEdldERhdGFJZlZhbGlkKCk7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMubW9kYWxDdHJsLmRpc21pc3MoZGF0YSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgY2xvc2UoZXZlbnQ6IEV2ZW50fEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZGlydHkpIHtcbiAgICAgIGNvbnN0IHNhdmVCZWZvcmVMZWF2ZSA9IGF3YWl0IEFsZXJ0cy5hc2tTYXZlQmVmb3JlTGVhdmUodGhpcy5hbGVydEN0cmwsIHRoaXMudHJhbnNsYXRlLCBldmVudCk7XG5cbiAgICAgIC8vIFVzZXIgY2FuY2VsbGVkXG4gICAgICBpZiAoaXNOaWwoc2F2ZUJlZm9yZUxlYXZlKSB8fCBldmVudCAmJiBldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSXMgdXNlciBjb25maXJtOiBjbG9zZSBub3JtYWxseVxuICAgICAgaWYgKHNhdmVCZWZvcmVMZWF2ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVBbmRDbG9zZShldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm1vZGFsQ3RybC5kaXNtaXNzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSB0aGUgZWRpdG9yLCBieSBjYWxsaW5nIHRoZSBkYXRhU2VydmljZS5zYXZlKCkuXG4gICAqIEVuc3VyZSB0aGF0IGVkaXRvciBpZiB2YWxpZC4gSWYgbm90LCBkaXNwbGF5IGFuIGVycm9yXG4gICAqIEBwYXJhbSBldmVudFxuICAgKiBAcGFyYW0gb3B0c1xuICAgKi9cbiAgYXN5bmMgc2F2ZShldmVudD86IEV2ZW50fEV2ZW50LCBvcHRzPzogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMubG9hZGluZyB8fCB0aGlzLnNhdmluZyB8fCB0aGlzLmRpc2FibGVkKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKHRoaXMuX2xvZ1ByZWZpeCArICdTa2lwIHNhdmU6IG1vZGFsIGlzIGJ1c3kgKGxvYWRpbmcgb3Igc2F2aW5nKScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGlydHkpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5fbG9nUHJlZml4ICsgJ1NraXAgc2F2ZTogbW9kYWwgbm90IGRpcnR5Jyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBXYWl0IGVuZCBvZiBhc3luYyB2YWxpZGF0aW9uXG4gICAgYXdhaXQgdGhpcy53YWl0V2hpbGVQZW5kaW5nKCk7XG5cbiAgICAvLyBJZiBpbnZhbGlkXG4gICAgaWYgKHRoaXMuaW52YWxpZCkge1xuICAgICAgdGhpcy5sb2dGb3JtRXJyb3JzKCk7XG4gICAgICB0aGlzLnNldEVycm9yKCdDT01NT04uRk9STS5IQVNfRVJST1InKTtcbiAgICAgIHRoaXMub3BlbkZpcnN0SW52YWxpZFRhYigpO1xuICAgICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkKCk7XG5cbiAgICAgIHRoaXMuc3VibWl0dGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLm1hcmtBc1NhdmluZygpO1xuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuXG4gICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5fbG9nUHJlZml4ICsgJ1NhdmluZyBkYXRhLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gU2F2ZSBhbGwgZGlydHkgY2hpbGRyZW5cbiAgICAgIGNvbnN0IHNhdmVkID0gYXdhaXQgdGhpcy5zYXZlRGlydHlDaGlsZHJlbigpO1xuICAgICAgaWYgKCFzYXZlZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBGaWxsIGRhdGFcbiAgICAgIHRoaXMuZGF0YSA9IGF3YWl0IHRoaXMuZ2V0VmFsdWUoKTtcblxuICAgICAgLy8gTWFyayBhcyBzdWJtaXR0ZWRcbiAgICAgIHRoaXMuc3VibWl0dGVkID0gdHJ1ZTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWU7XG4gICAgICB0aGlzLnNldEVycm9yKGVycik7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSAwO1xuICAgICAgdGhpcy5zY3JvbGxUb1RvcCgpOyAvLyBTY3JvbGwgdG8gdG9wICh0byBzaG93IGVycm9yKVxuICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgdGhpcy5lbmFibGUoKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLm1hcmtBc1NhdmVkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgZGF0YSAoaWYgZGlydHkgYW5kIHZhbGlkKSwgYW5kIHJldHVybiBpdC4gT3RoZXJ3aXNlLCByZXR1cm4gbmlsIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgc2F2ZUFuZEdldERhdGFJZlZhbGlkKCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIEZvcm0gaXMgbm90IHZhbGlkXG4gICAgaWYgKCF0aGlzLnZhbGlkKSB7XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB2YWxpZGF0aW9uIGlzIGZpbmlzaGVkXG4gICAgICBhd2FpdCBBcHBGb3JtVXRpbHMud2FpdFdoaWxlUGVuZGluZyh0aGlzKTtcblxuICAgICAgLy8gSWYgaW52YWxpZDogT3BlbiB0aGUgZmlyc3QgdGFiIGluIGVycm9yXG4gICAgICBpZiAodGhpcy5pbnZhbGlkKSB7XG4gICAgICAgIHRoaXMub3BlbkZpcnN0SW52YWxpZFRhYigpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyBDb250aW51ZSAodmFsaWQpXG4gICAgfVxuXG4gICAgLy8gRm9ybSBpcyB2YWxpZCwgYnV0IG5vdCBzYXZlZFxuICAgIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICBjb25zdCBzYXZlZCA9IGF3YWl0IHRoaXMuc2F2ZShuZXcgRXZlbnQoJ3NhdmUnKSk7XG4gICAgICBpZiAoIXNhdmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFZhbGlkIGFuZCBzYXZlZCBkYXRhXG4gICAgcmV0dXJuIHRoaXMuZGF0YTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShldmVudD86IEV2ZW50fEV2ZW50KSB7XG4gICAgaWYgKHRoaXMubG9hZGluZyB8fCB0aGlzLnNhdmluZykgcmV0dXJuIGZhbHNlO1xuXG4gICAgdGhpcy5tYXJrQXNTYXZpbmcoKTtcbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICB0cnkge1xuXG4gICAgICAvLyBEZWxlZ2F0ZSBkZWxldGlvbiB0byBtb2RhbCBjYWxsZXJcbiAgICAgIGlmICh0aGlzLm9uRGVsZXRlKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub25EZWxldGUoZXZlbnQsIHRoaXMuZGF0YSk7XG5cbiAgICAgICAgLy8gVXNlciBjYW5jZWxsZWRcbiAgICAgICAgaWYgKGlzTmlsKHJlc3VsdCkgfHwgKGV2ZW50ICYmIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMubW9kYWxDdHJsLmRpc21pc3ModGhpcy5kYXRhLCAnZGVsZXRlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gT3IgZGlzbWlzcywgd2l0aCB0aGUgcm9sZSAnZGVsZXRlJ1xuICAgICAgZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmlzTmV3RGF0YSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5fbG9nUHJlZml4ICsgXCJUcnlpbmcgdG8gZGVsZXRlIGEgbmV3IGRhdGEuIE1ha2Ugbm8gc2Vuc2UhXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5tb2RhbEN0cmwuZGlzbWlzcyh0aGlzLmRhdGEsICdkZWxldGUnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zZXRFcnJvcihlcnIpO1xuICAgICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gMDtcbiAgICAgIHRoaXMubWFya0FzU2F2ZWQoKTtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQpIHRoaXMuZW5hYmxlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRFcnJvcihvcHRzPzoge2VtaXRFdmVudD86IGJvb2xlYW59KSB7XG4gICAgaWYgKGlzTm90TmlsT3JCbGFuayh0aGlzLmVycm9yKSkge1xuICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHNldEVycm9yKGVycjogc3RyaW5nIHwgQXBwRXJyb3JXaXRoRGV0YWlscywgb3B0cz86IHtlbWl0RXZlbnQ/OiBib29sZWFuOyBkZXRhaWxzQ3NzQ2xhc3M/OiBzdHJpbmc7fSkge1xuICAgIGlmICghZXJyKSB7XG4gICAgICBzdXBlci5zZXRFcnJvcih1bmRlZmluZWQsIG9wdHMpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc29sZS5lcnJvcignW2VudGl0eS1lZGl0b3JdIEVycm9yOiAnICsgKGVyciB8fCAnJykpO1xuICAgICAgc3VwZXIuc2V0RXJyb3IoZXJyIGFzIHN0cmluZywgb3B0cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignW2VudGl0eS1lZGl0b3JdIEVycm9yOiAnICsgZXJyLm1lc3NhZ2UgfHwgJycsIGVycik7XG4gICAgICBsZXQgdXNlck1lc3NhZ2UgPSBlcnIubWVzc2FnZSAmJiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGVyci5tZXNzYWdlKSB8fCBlcnI7XG5cbiAgICAgIC8vIEFkZCBkZXRhaWxzIGVycm9yIChpZiBhbnkpIHVuZGVyIHRoZSBtYWluIG1lc3NhZ2VcbiAgICAgIGNvbnN0IGRldGFpbE1lc3NhZ2UgPSAoIWVyci5kZXRhaWxzIHx8IHR5cGVvZiBlcnIuZGV0YWlscyA9PT0gJ3N0cmluZycpXG4gICAgICAgID8gZXJyLmRldGFpbHMgYXMgc3RyaW5nXG4gICAgICAgIDogZXJyLmRldGFpbHMubWVzc2FnZTtcbiAgICAgIGlmIChpc05vdE5pbE9yQmxhbmsoZGV0YWlsTWVzc2FnZSkpIHtcbiAgICAgICAgY29uc3QgY3NzQ2xhc3MgPSBvcHRzPy5kZXRhaWxzQ3NzQ2xhc3MgfHwgJ2Vycm9yLWRldGFpbHMnO1xuICAgICAgICB1c2VyTWVzc2FnZSArPSBgPGJyLz48c21hbGwgY2xhc3M9XCIke2Nzc0NsYXNzfVwiIHRpdGxlPVwiJHtkZXRhaWxNZXNzYWdlfVwiPmA7XG4gICAgICAgIHVzZXJNZXNzYWdlICs9IGRldGFpbE1lc3NhZ2UubGVuZ3RoIDwgNzAgPyBkZXRhaWxNZXNzYWdlIDogZGV0YWlsTWVzc2FnZS5zdWJzdHJpbmcoMCwgNjcpICsgJy4uLic7XG4gICAgICAgIHVzZXJNZXNzYWdlICs9ICc8L3NtYWxsPic7XG4gICAgICB9XG4gICAgICBzdXBlci5zZXRFcnJvcih1c2VyTWVzc2FnZSwgb3B0cyk7XG4gICAgfVxuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIGFic3RyYWN0IG1ldGhvZHMgKHRvIG92ZXJyaWRlKSAtLSAqL1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWdpc3RlckZvcm1zKCk7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNvbXB1dGVUaXRsZShkYXRhOiBUKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzZXRWYWx1ZShkYXRhOiBUKTogUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBmb3JtKCk6IEZvcm1Hcm91cDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0Rmlyc3RJbnZhbGlkVGFiSW5kZXgoKTogbnVtYmVyO1xuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIHdhaXRXaGlsZVBlbmRpbmcob3B0cz86IFdhaXRGb3JPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIEFwcEZvcm1VdGlscy53YWl0V2hpbGVQZW5kaW5nKHRoaXMsIG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldFZhbHVlKCk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCB0aGlzLmdldEpzb25WYWx1ZVRvU2F2ZSgpO1xuXG4gICAgY29uc3QgcmVzID0gbmV3IHRoaXMuZGF0YVR5cGUoKTtcbiAgICByZXMuZnJvbU9iamVjdChqc29uKTtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SnNvblZhbHVlVG9TYXZlKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmZvcm0udmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgdGhlIHRpdGxlXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlVGl0bGUoZGF0YT86IFQpIHtcbiAgICBkYXRhID0gZGF0YSB8fCB0aGlzLmRhdGE7XG4gICAgY29uc3QgdGl0bGUgPSBhd2FpdCB0aGlzLmNvbXB1dGVUaXRsZShkYXRhKTtcbiAgICB0aGlzLiR0aXRsZS5uZXh0KHRpdGxlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzY3JvbGxUb1RvcChkdXJhdGlvbj86IG51bWJlcikge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuc2Nyb2xsVG9Ub3AoZHVyYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZD8ubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiAtLSBwcml2YXRlIGZ1bmN0aW9ucyAtLSAqL1xuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBmaXJzdCB0YWIgdGhhdCBpcyBpbnZhbGlkXG4gICAqL1xuICBwcml2YXRlIG9wZW5GaXJzdEludmFsaWRUYWIoKSB7XG4gICAgY29uc3QgaW52YWxpZFRhYkluZGV4ID0gdGhpcy5nZXRGaXJzdEludmFsaWRUYWJJbmRleCgpO1xuICAgIGlmIChpbnZhbGlkVGFiSW5kZXggIT09IC0xICYmIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCAhPT0gaW52YWxpZFRhYkluZGV4KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSBpbnZhbGlkVGFiSW5kZXg7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG59XG4iXX0=