@sumaris-net/ngx-components 2.6.4-alpha5 → 2.6.4-alpha6

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 (1179) hide show
  1. package/esm2020/public_api.mjs +313 -0
  2. package/esm2020/src/app/admin/admin-routing.module.mjs +41 -0
  3. package/esm2020/src/app/admin/admin.module.mjs +34 -0
  4. package/esm2020/src/app/admin/services/filter/person.filter.mjs +59 -0
  5. package/esm2020/src/app/admin/services/person.service.mjs +161 -0
  6. package/esm2020/src/app/admin/services/validator/person.validator.mjs +34 -0
  7. package/esm2020/src/app/admin/users/users.mjs +234 -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 +61 -0
  12. package/esm2020/src/app/core/account/account.page.mjs +316 -0
  13. package/esm2020/src/app/core/account/new-token.modal.mjs +115 -0
  14. package/esm2020/src/app/core/account/token.table.mjs +137 -0
  15. package/esm2020/src/app/core/auth/auth.form.mjs +131 -0
  16. package/esm2020/src/app/core/auth/auth.modal.mjs +72 -0
  17. package/esm2020/src/app/core/auth/auth.module.mjs +47 -0
  18. package/esm2020/src/app/core/core.module.mjs +184 -0
  19. package/esm2020/src/app/core/core.testing.module.mjs +86 -0
  20. package/esm2020/src/app/core/form/buttons/form-buttons-bar.component.mjs +71 -0
  21. package/esm2020/src/app/core/form/buttons/form-buttons-bar.module.mjs +35 -0
  22. package/esm2020/src/app/core/form/entity/editor.class.mjs +679 -0
  23. package/esm2020/src/app/core/form/entity/entity-editor-modal.class.mjs +421 -0
  24. package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +687 -0
  25. package/esm2020/src/app/core/form/entity/entity-metadata.component.mjs +25 -0
  26. package/esm2020/src/app/core/form/entity/entity.module.mjs +38 -0
  27. package/esm2020/src/app/core/form/form.class.mjs +340 -0
  28. package/esm2020/src/app/core/form/form.module.mjs +66 -0
  29. package/esm2020/src/app/core/form/form.utils.mjs +473 -0
  30. package/esm2020/src/app/core/form/list/list.form.mjs +222 -0
  31. package/esm2020/src/app/core/form/list/list.module.mjs +35 -0
  32. package/esm2020/src/app/core/form/properties/properties.form.mjs +132 -0
  33. package/esm2020/src/app/core/form/properties/properties.module.mjs +43 -0
  34. package/esm2020/src/app/core/form/properties/properties.table.mjs +264 -0
  35. package/esm2020/src/app/core/form/properties/property.validator.mjs +23 -0
  36. package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +90 -0
  37. package/esm2020/src/app/core/form/properties/testing/properties-form.testing.module.mjs +39 -0
  38. package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.mjs +70 -0
  39. package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +45 -0
  40. package/esm2020/src/app/core/form/text-popover/text-form.component.mjs +89 -0
  41. package/esm2020/src/app/core/form/text-popover/text-popover.component.mjs +146 -0
  42. package/esm2020/src/app/core/form/text-popover/text-popover.module.mjs +40 -0
  43. package/esm2020/src/app/core/graphql/graphql.module.mjs +22 -0
  44. package/esm2020/src/app/core/graphql/graphql.service.mjs +762 -0
  45. package/esm2020/src/app/core/graphql/graphql.utils.mjs +117 -0
  46. package/esm2020/src/app/core/home/home.mjs +257 -0
  47. package/esm2020/src/app/core/home/home.module.mjs +48 -0
  48. package/esm2020/src/app/core/icon/icon.component.mjs +41 -0
  49. package/esm2020/src/app/core/icon/icon.module.mjs +29 -0
  50. package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +343 -0
  51. package/esm2020/src/app/core/install/install-upgrade-card.module.mjs +35 -0
  52. package/esm2020/src/app/core/menu/menu.component.mjs +329 -0
  53. package/esm2020/src/app/core/menu/menu.model.mjs +35 -0
  54. package/esm2020/src/app/core/menu/menu.module.mjs +44 -0
  55. package/esm2020/src/app/core/menu/menu.service.mjs +55 -0
  56. package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +27 -0
  57. package/esm2020/src/app/core/offline/update-offline-mode-card.module.mjs +35 -0
  58. package/esm2020/src/app/core/peer/select-peer.modal.mjs +182 -0
  59. package/esm2020/src/app/core/peer/select-peer.module.mjs +42 -0
  60. package/esm2020/src/app/core/register/register-confirm.page.mjs +81 -0
  61. package/esm2020/src/app/core/register/register.form.mjs +181 -0
  62. package/esm2020/src/app/core/register/register.modal.mjs +52 -0
  63. package/esm2020/src/app/core/register/register.module.mjs +44 -0
  64. package/esm2020/src/app/core/services/account.service.mjs +1212 -0
  65. package/esm2020/src/app/core/services/auth-guard.service.mjs +71 -0
  66. package/esm2020/src/app/core/services/base-entity-service.class.mjs +444 -0
  67. package/esm2020/src/app/core/services/base-graphql-service.class.mjs +219 -0
  68. package/esm2020/src/app/core/services/base58.mjs +78 -0
  69. package/esm2020/src/app/core/services/config/core.config.mjs +175 -0
  70. package/esm2020/src/app/core/services/config.service.mjs +354 -0
  71. package/esm2020/src/app/core/services/crypto.service.mjs +114 -0
  72. package/esm2020/src/app/core/services/errors.mjs +50 -0
  73. package/esm2020/src/app/core/services/local-settings.service.mjs +449 -0
  74. package/esm2020/src/app/core/services/model/account.model.mjs +122 -0
  75. package/esm2020/src/app/core/services/model/config.model.mjs +92 -0
  76. package/esm2020/src/app/core/services/model/department.model.mjs +30 -0
  77. package/esm2020/src/app/core/services/model/entity.decorators.mjs +97 -0
  78. package/esm2020/src/app/core/services/model/entity.model.mjs +240 -0
  79. package/esm2020/src/app/core/services/model/filter.model.mjs +94 -0
  80. package/esm2020/src/app/core/services/model/history.model.mjs +2 -0
  81. package/esm2020/src/app/core/services/model/model.enum.mjs +11 -0
  82. package/esm2020/src/app/core/services/model/peer.model.mjs +68 -0
  83. package/esm2020/src/app/core/services/model/person.model.mjs +83 -0
  84. package/esm2020/src/app/core/services/model/referential.model.mjs +164 -0
  85. package/esm2020/src/app/core/services/model/settings.model.mjs +3 -0
  86. package/esm2020/src/app/core/services/model/token.model.mjs +48 -0
  87. package/esm2020/src/app/core/services/network.service.mjs +589 -0
  88. package/esm2020/src/app/core/services/network.types.mjs +20 -0
  89. package/esm2020/src/app/core/services/network.utils.mjs +15 -0
  90. package/esm2020/src/app/core/services/pipes/account.pipes.mjs +38 -0
  91. package/esm2020/src/app/core/services/pipes/department-to-string.pipe.mjs +23 -0
  92. package/esm2020/src/app/core/services/pipes/person-to-string.pipe.mjs +23 -0
  93. package/esm2020/src/app/core/services/pipes/usage-mode.pipes.mjs +37 -0
  94. package/esm2020/src/app/core/services/platform.service.mjs +525 -0
  95. package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +428 -0
  96. package/esm2020/src/app/core/services/storage/entity-store.class.mjs +449 -0
  97. package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +23 -0
  98. package/esm2020/src/app/core/services/testing/referential.validator.mjs +45 -0
  99. package/esm2020/src/app/core/services/validator/account.validator.mjs +56 -0
  100. package/esm2020/src/app/core/services/validator/base.validator.class.mjs +47 -0
  101. package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +66 -0
  102. package/esm2020/src/app/core/services/validator/user-settings.validator.mjs +27 -0
  103. package/esm2020/src/app/core/services/validator/user-token.validator.mjs +52 -0
  104. package/esm2020/src/app/core/settings/settings.module.mjs +34 -0
  105. package/esm2020/src/app/core/settings/settings.page.mjs +312 -0
  106. package/esm2020/src/app/core/table/actions-column.component.mjs +102 -0
  107. package/esm2020/src/app/core/table/async-table.class.mjs +1697 -0
  108. package/esm2020/src/app/core/table/entities-async-table-datasource.class.mjs +384 -0
  109. package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +399 -0
  110. package/esm2020/src/app/core/table/memory-table.class.mjs +53 -0
  111. package/esm2020/src/app/core/table/table-select-columns.component.mjs +43 -0
  112. package/esm2020/src/app/core/table/table.class.mjs +1728 -0
  113. package/esm2020/src/app/core/table/table.model.mjs +12 -0
  114. package/esm2020/src/app/core/table/table.module.mjs +40 -0
  115. package/esm2020/src/app/core/table/table.utils.mjs +30 -0
  116. package/esm2020/src/app/core/table/testing/table-validator.service.mjs +27 -0
  117. package/esm2020/src/app/core/table/testing/table.testing.mjs +280 -0
  118. package/esm2020/src/app/core/table/testing/table.testing.module.mjs +38 -0
  119. package/esm2020/src/app/shared/alerts.mjs +239 -0
  120. package/esm2020/src/app/shared/audio/audio.mjs +248 -0
  121. package/esm2020/src/app/shared/audio/audio.testing.mjs +31 -0
  122. package/esm2020/src/app/shared/audio/audio.testing.module.mjs +45 -0
  123. package/esm2020/src/app/shared/capacitor/keyboard.mjs +40 -0
  124. package/esm2020/src/app/shared/capacitor/plugins.mjs +9 -0
  125. package/esm2020/src/app/shared/constants.mjs +10 -0
  126. package/esm2020/src/app/shared/dates.mjs +147 -0
  127. package/esm2020/src/app/shared/debug/debug-service.class.mjs +3 -0
  128. package/esm2020/src/app/shared/debug/debug.component.mjs +39 -0
  129. package/esm2020/src/app/shared/debug/debug.module.mjs +44 -0
  130. package/esm2020/src/app/shared/directives/autofocus.directive.mjs +92 -0
  131. package/esm2020/src/app/shared/directives/autotitle.directive.mjs +30 -0
  132. package/esm2020/src/app/shared/directives/directives.module.mjs +43 -0
  133. package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +53 -0
  134. package/esm2020/src/app/shared/directives/ng-var.directive.mjs +31 -0
  135. package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +59 -0
  136. package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +40 -0
  137. package/esm2020/src/app/shared/directives/resizable/resizable.module.mjs +17 -0
  138. package/esm2020/src/app/shared/events.mjs +64 -0
  139. package/esm2020/src/app/shared/file/csv.utils.mjs +74 -0
  140. package/esm2020/src/app/shared/file/file.service.mjs +117 -0
  141. package/esm2020/src/app/shared/file/file.utils.mjs +113 -0
  142. package/esm2020/src/app/shared/file/images.utils.mjs +161 -0
  143. package/esm2020/src/app/shared/file/json.utils.mjs +51 -0
  144. package/esm2020/src/app/shared/file/uri.utils.mjs +23 -0
  145. package/esm2020/src/app/shared/focusable.mjs +6 -0
  146. package/esm2020/src/app/shared/form/field.component.mjs +307 -0
  147. package/esm2020/src/app/shared/form/field.model.mjs +25 -0
  148. package/esm2020/src/app/shared/form/loading-spinner.mjs +36 -0
  149. package/esm2020/src/app/shared/forms.mjs +391 -0
  150. package/esm2020/src/app/shared/functions.mjs +477 -0
  151. package/esm2020/src/app/shared/geolocation/geolocation.utils.mjs +80 -0
  152. package/esm2020/src/app/shared/gesture/gesture-config.mjs +49 -0
  153. package/esm2020/src/app/shared/gesture/hammer.utils.mjs +2 -0
  154. package/esm2020/src/app/shared/graph/colors.utils.mjs +64 -0
  155. package/esm2020/src/app/shared/graph/graph-colors.mjs +212 -0
  156. package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +57 -0
  157. package/esm2020/src/app/shared/help/help.modal.mjs +53 -0
  158. package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +23 -0
  159. package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +84 -0
  160. package/esm2020/src/app/shared/hotkeys/shared-hotkeys.module.mjs +42 -0
  161. package/esm2020/src/app/shared/http/http.utils.mjs +52 -0
  162. package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +365 -0
  163. package/esm2020/src/app/shared/image/gallery/image-gallery.module.mjs +59 -0
  164. package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +27 -0
  165. package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +90 -0
  166. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +39 -0
  167. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +56 -0
  168. package/esm2020/src/app/shared/image/image.model.mjs +2 -0
  169. package/esm2020/src/app/shared/image/image.module.mjs +29 -0
  170. package/esm2020/src/app/shared/image/image.service.mjs +98 -0
  171. package/esm2020/src/app/shared/inputs.mjs +231 -0
  172. package/esm2020/src/app/shared/interceptors/progess.interceptor.mjs +27 -0
  173. package/esm2020/src/app/shared/logging/log-level.model.mjs +48 -0
  174. package/esm2020/src/app/shared/logging/logger.model.mjs +47 -0
  175. package/esm2020/src/app/shared/logging/logging-service.class.mjs +121 -0
  176. package/esm2020/src/app/shared/logging/logging-service.config.mjs +2 -0
  177. package/esm2020/src/app/shared/logging/logging-service.module.mjs +30 -0
  178. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +47 -0
  179. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +916 -0
  180. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +78 -0
  181. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +19 -0
  182. package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +209 -0
  183. package/esm2020/src/app/shared/material/badge/badge.directive.mjs +194 -0
  184. package/esm2020/src/app/shared/material/badge/badge.module.mjs +32 -0
  185. package/esm2020/src/app/shared/material/badge/badge.test.mjs +41 -0
  186. package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +68 -0
  187. package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +253 -0
  188. package/esm2020/src/app/shared/material/chips/chips.module.mjs +76 -0
  189. package/esm2020/src/app/shared/material/chips/material.chips.mjs +697 -0
  190. package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +143 -0
  191. package/esm2020/src/app/shared/material/datetime/datetime.module.mjs +91 -0
  192. package/esm2020/src/app/shared/material/datetime/material.date.mjs +376 -0
  193. package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +385 -0
  194. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +499 -0
  195. package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +108 -0
  196. package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +110 -0
  197. package/esm2020/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +103 -0
  198. package/esm2020/src/app/shared/material/duration/duration.module.mjs +67 -0
  199. package/esm2020/src/app/shared/material/duration/duration.utils.mjs +36 -0
  200. package/esm2020/src/app/shared/material/duration/material.duration.mjs +257 -0
  201. package/esm2020/src/app/shared/material/latlong/latlong.utils.mjs +266 -0
  202. package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +381 -0
  203. package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +67 -0
  204. package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +102 -0
  205. package/esm2020/src/app/shared/material/material.animations.mjs +104 -0
  206. package/esm2020/src/app/shared/material/material.module.mjs +224 -0
  207. package/esm2020/src/app/shared/material/material.testing.module.mjs +168 -0
  208. package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +98 -0
  209. package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +80 -0
  210. package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +190 -0
  211. package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +17 -0
  212. package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +162 -0
  213. package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +37 -0
  214. package/esm2020/src/app/shared/material/numpad/numpad.model.mjs +15 -0
  215. package/esm2020/src/app/shared/material/numpad/numpad.module.mjs +60 -0
  216. package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +46 -0
  217. package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +46 -0
  218. package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +22 -0
  219. package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +344 -0
  220. package/esm2020/src/app/shared/material/swipe/swipe.module.mjs +52 -0
  221. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +64 -0
  222. package/esm2020/src/app/shared/modules.mjs +11 -0
  223. package/esm2020/src/app/shared/observables.mjs +103 -0
  224. package/esm2020/src/app/shared/pipes/arrays.pipe.mjs +141 -0
  225. package/esm2020/src/app/shared/pipes/colors.pipe.mjs +23 -0
  226. package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +48 -0
  227. package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +66 -0
  228. package/esm2020/src/app/shared/pipes/date-from-now.pipe.mjs +27 -0
  229. package/esm2020/src/app/shared/pipes/duration.pipe.mjs +34 -0
  230. package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +62 -0
  231. package/esm2020/src/app/shared/pipes/form.pipes.mjs +187 -0
  232. package/esm2020/src/app/shared/pipes/highlight.pipe.mjs +48 -0
  233. package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +46 -0
  234. package/esm2020/src/app/shared/pipes/maps.pipe.mjs +63 -0
  235. package/esm2020/src/app/shared/pipes/math.pipes.mjs +59 -0
  236. package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +21 -0
  237. package/esm2020/src/app/shared/pipes/number-format.pipe.mjs +30 -0
  238. package/esm2020/src/app/shared/pipes/pipes.module.mjs +239 -0
  239. package/esm2020/src/app/shared/pipes/property.pipes.mjs +93 -0
  240. package/esm2020/src/app/shared/pipes/string.pipes.mjs +121 -0
  241. package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +43 -0
  242. package/esm2020/src/app/shared/pipes/types.pipes.mjs +45 -0
  243. package/esm2020/src/app/shared/platforms.mjs +43 -0
  244. package/esm2020/src/app/shared/services/entity-service.class.mjs +7 -0
  245. package/esm2020/src/app/shared/services/job.utils.mjs +92 -0
  246. package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +337 -0
  247. package/esm2020/src/app/shared/services/progress-bar.service.mjs +33 -0
  248. package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +119 -0
  249. package/esm2020/src/app/shared/services/startable-service.class.mjs +110 -0
  250. package/esm2020/src/app/shared/services/translate-context.service.mjs +105 -0
  251. package/esm2020/src/app/shared/services/validator-service.class.mjs +2 -0
  252. package/esm2020/src/app/shared/services.mjs +62 -0
  253. package/esm2020/src/app/shared/shared-routing.module.mjs +70 -0
  254. package/esm2020/src/app/shared/shared.module.mjs +208 -0
  255. package/esm2020/src/app/shared/shared.testing.module.mjs +84 -0
  256. package/esm2020/src/app/shared/storage/storage-explorer.component.mjs +268 -0
  257. package/esm2020/src/app/shared/storage/storage-explorer.module.mjs +60 -0
  258. package/esm2020/src/app/shared/storage/storage.service.mjs +132 -0
  259. package/esm2020/src/app/shared/storage/storage.utils.mjs +13 -0
  260. package/esm2020/src/app/shared/testing/observable.test.mjs +95 -0
  261. package/esm2020/src/app/shared/testing/tests.page.mjs +33 -0
  262. package/esm2020/src/app/shared/toast/toast.testing.mjs +51 -0
  263. package/esm2020/src/app/shared/toast/toast.testing.module.mjs +45 -0
  264. package/esm2020/src/app/shared/toast/toasts.mjs +144 -0
  265. package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +58 -0
  266. package/esm2020/src/app/shared/toolbar/toolbar.mjs +251 -0
  267. package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +53 -0
  268. package/esm2020/src/app/shared/types.mjs +2 -0
  269. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +57 -0
  270. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +45 -0
  271. package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +97 -0
  272. package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +204 -0
  273. package/esm2020/src/app/shared/upload-file/upload-file.model.mjs +20 -0
  274. package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +104 -0
  275. package/esm2020/src/app/shared/validator/validators.mjs +573 -0
  276. package/esm2020/src/app/shared/version/versions.mjs +81 -0
  277. package/esm2020/src/app/social/job/job.module.mjs +42 -0
  278. package/esm2020/src/app/social/job/progression/job-progression.component.mjs +20 -0
  279. package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +216 -0
  280. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +43 -0
  281. package/esm2020/src/app/social/job/progression/job-progression.model.mjs +23 -0
  282. package/esm2020/src/app/social/job/progression/job-progression.service.mjs +71 -0
  283. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +52 -0
  284. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +55 -0
  285. package/esm2020/src/app/social/job/testing/job.testing.module.mjs +35 -0
  286. package/esm2020/src/app/social/message/message.form.mjs +81 -0
  287. package/esm2020/src/app/social/message/message.modal.mjs +93 -0
  288. package/esm2020/src/app/social/message/message.model.mjs +65 -0
  289. package/esm2020/src/app/social/message/message.module.mjs +35 -0
  290. package/esm2020/src/app/social/message/message.service.mjs +84 -0
  291. package/esm2020/src/app/social/social.errors.mjs +10 -0
  292. package/esm2020/src/app/social/social.module.mjs +47 -0
  293. package/esm2020/src/app/social/social.testing.module.mjs +51 -0
  294. package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +114 -0
  295. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +246 -0
  296. package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +227 -0
  297. package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +112 -0
  298. package/esm2020/src/app/social/user-event/testing/user-event.testing.module.mjs +35 -0
  299. package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +111 -0
  300. package/esm2020/src/app/social/user-event/user-event.model.mjs +2 -0
  301. package/esm2020/src/app/social/user-event/user-event.module.mjs +39 -0
  302. package/esm2020/src/app/social/user-event/user-event.service.mjs +487 -0
  303. package/esm2020/src/environments/environment.class.mjs +5 -0
  304. package/esm2020/src/environments/environment.mjs +94 -0
  305. package/esm2020/sumaris-net.ngx-components.mjs +5 -0
  306. package/fesm2015/sumaris-net.ngx-components.mjs +38842 -0
  307. package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -0
  308. package/fesm2020/sumaris-net.ngx-components.mjs +37941 -0
  309. package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -0
  310. package/index.d.ts +5 -0
  311. package/package.json +23 -137
  312. package/public_api.d.ts +286 -0
  313. package/src/app/admin/admin-routing.module.d.ts +9 -0
  314. package/src/app/admin/admin.module.d.ts +10 -0
  315. package/src/app/admin/services/filter/person.filter.d.ts +21 -0
  316. package/src/app/admin/services/person.service.d.ts +44 -0
  317. package/src/app/admin/services/validator/person.validator.d.ts +14 -0
  318. package/src/app/admin/users/users.d.ts +44 -0
  319. package/src/app/admin/users/users.module.d.ts +13 -0
  320. package/src/app/core/about/about.modal.d.ts +32 -0
  321. package/src/app/core/about/about.module.d.ts +10 -0
  322. package/src/app/core/account/account.module.d.ts +15 -0
  323. package/src/app/core/account/account.page.d.ts +68 -0
  324. package/src/app/core/account/new-token.modal.d.ts +41 -0
  325. package/src/app/core/account/token.table.d.ts +25 -0
  326. package/src/app/core/auth/auth.form.d.ts +36 -0
  327. package/src/app/core/auth/auth.modal.d.ts +24 -0
  328. package/src/app/core/auth/auth.module.d.ts +11 -0
  329. package/src/app/core/core.module.d.ts +31 -0
  330. package/src/app/core/core.testing.module.d.ts +14 -0
  331. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +26 -0
  332. package/src/app/core/form/buttons/form-buttons-bar.module.d.ts +9 -0
  333. package/src/app/core/form/entity/editor.class.d.ts +243 -0
  334. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +128 -0
  335. package/src/app/core/form/entity/entity-editor.class.d.ts +205 -0
  336. package/src/app/core/form/entity/entity-metadata.component.d.ts +13 -0
  337. package/src/app/core/form/entity/entity.module.d.ts +10 -0
  338. package/src/app/core/form/form.class.d.ts +155 -0
  339. package/src/app/core/form/form.module.d.ts +13 -0
  340. package/src/app/core/form/form.utils.d.ts +336 -0
  341. package/src/app/core/form/list/list.form.d.ts +81 -0
  342. package/src/app/core/form/list/list.module.d.ts +9 -0
  343. package/src/app/core/form/properties/properties.form.d.ts +44 -0
  344. package/src/app/core/form/properties/properties.module.d.ts +11 -0
  345. package/src/app/core/form/properties/properties.table.d.ts +78 -0
  346. package/src/app/core/form/properties/property.validator.d.ts +13 -0
  347. package/src/app/core/form/properties/testing/properties-form.test.d.ts +19 -0
  348. package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +12 -0
  349. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +14 -0
  350. package/src/app/core/form/text-popover/testing/text-popover.testing.module.d.ts +11 -0
  351. package/src/app/core/form/text-popover/text-form.component.d.ts +32 -0
  352. package/src/app/core/form/text-popover/text-popover.component.d.ts +70 -0
  353. package/src/app/core/form/text-popover/text-popover.module.d.ts +10 -0
  354. package/src/app/core/graphql/graphql.module.d.ts +8 -0
  355. package/src/app/core/graphql/graphql.service.d.ts +148 -0
  356. package/src/app/core/graphql/graphql.utils.d.ts +42 -0
  357. package/src/app/core/home/home.d.ts +74 -0
  358. package/src/app/core/home/home.module.d.ts +12 -0
  359. package/src/app/core/icon/icon.component.d.ts +13 -0
  360. package/src/app/core/icon/icon.module.d.ts +9 -0
  361. package/src/app/core/install/install-upgrade-card.component.d.ts +63 -0
  362. package/src/app/core/install/install-upgrade-card.module.d.ts +9 -0
  363. package/src/app/core/menu/menu.component.d.ts +62 -0
  364. package/src/app/core/menu/menu.model.d.ts +28 -0
  365. package/src/app/core/menu/menu.module.d.ts +10 -0
  366. package/src/app/core/menu/menu.service.d.ts +21 -0
  367. package/src/app/core/offline/update-offline-mode-card.component.d.ts +11 -0
  368. package/src/app/core/offline/update-offline-mode-card.module.d.ts +9 -0
  369. package/src/app/core/peer/select-peer.modal.d.ts +53 -0
  370. package/src/app/core/peer/select-peer.module.d.ts +11 -0
  371. package/src/app/core/register/register-confirm.page.d.ts +24 -0
  372. package/src/app/core/register/register.form.d.ts +48 -0
  373. package/src/app/core/register/register.modal.d.ts +14 -0
  374. package/src/app/core/register/register.module.d.ts +12 -0
  375. package/src/app/core/services/account.service.d.ts +191 -0
  376. package/src/app/core/services/auth-guard.service.d.ts +17 -0
  377. package/src/app/core/services/base-entity-service.class.d.ts +104 -0
  378. package/src/app/core/services/base-graphql-service.class.d.ts +77 -0
  379. package/src/app/core/services/base58.d.ts +7 -0
  380. package/src/app/core/services/config/core.config.d.ts +29 -0
  381. package/src/app/core/services/config.service.d.ts +60 -0
  382. package/src/app/core/services/crypto.service.d.ts +44 -0
  383. package/src/app/core/services/errors.d.ts +51 -0
  384. package/src/app/core/services/local-settings.service.d.ts +90 -0
  385. package/src/app/core/services/model/account.model.d.ts +35 -0
  386. package/src/app/core/services/model/config.model.d.ts +36 -0
  387. package/src/app/core/services/model/department.model.d.ts +11 -0
  388. package/src/app/core/services/model/entity.decorators.d.ts +17 -0
  389. package/src/app/core/services/model/entity.model.d.ts +89 -0
  390. package/src/app/core/services/model/filter.model.d.ts +43 -0
  391. package/src/app/core/services/model/history.model.d.ts +20 -0
  392. package/src/app/core/services/model/model.enum.d.ts +7 -0
  393. package/src/app/core/services/model/peer.model.d.ts +29 -0
  394. package/src/app/core/services/model/person.model.d.ts +31 -0
  395. package/src/app/core/services/model/referential.model.d.ts +77 -0
  396. package/src/app/core/services/model/settings.model.d.ts +26 -0
  397. package/src/app/core/services/model/token.model.d.ts +21 -0
  398. package/src/app/core/services/network.service.d.ts +149 -0
  399. package/src/app/core/services/network.types.d.ts +5 -0
  400. package/src/app/core/services/network.utils.d.ts +31 -0
  401. package/src/app/core/services/pipes/account.pipes.d.ts +15 -0
  402. package/src/app/core/services/pipes/department-to-string.pipe.d.ts +9 -0
  403. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +9 -0
  404. package/src/app/core/services/pipes/usage-mode.pipes.d.ts +15 -0
  405. package/src/app/core/services/platform.service.d.ts +96 -0
  406. package/src/app/core/services/storage/entities-storage.service.d.ts +108 -0
  407. package/src/app/core/services/storage/entity-store.class.d.ts +113 -0
  408. package/src/app/core/services/testing/referential-filter.model.d.ts +9 -0
  409. package/src/app/core/services/testing/referential.validator.d.ts +22 -0
  410. package/src/app/core/services/validator/account.validator.d.ts +17 -0
  411. package/src/app/core/services/validator/base.validator.class.d.ts +21 -0
  412. package/src/app/core/services/validator/local-settings.validator.d.ts +18 -0
  413. package/src/app/core/services/validator/user-settings.validator.d.ts +10 -0
  414. package/src/app/core/services/validator/user-token.validator.d.ts +13 -0
  415. package/src/app/core/settings/settings.module.d.ts +10 -0
  416. package/src/app/core/settings/settings.page.d.ts +68 -0
  417. package/src/app/core/table/actions-column.component.d.ts +48 -0
  418. package/src/app/core/table/async-table.class.d.ts +383 -0
  419. package/src/app/core/table/entities-async-table-datasource.class.d.ts +80 -0
  420. package/src/app/core/table/entities-table-datasource.class.d.ts +94 -0
  421. package/src/app/core/table/memory-table.class.d.ts +25 -0
  422. package/src/app/core/table/table-select-columns.component.d.ts +22 -0
  423. package/src/app/core/table/table.class.d.ts +386 -0
  424. package/src/app/core/table/table.model.d.ts +26 -0
  425. package/src/app/core/table/table.module.d.ts +10 -0
  426. package/src/app/core/table/table.utils.d.ts +11 -0
  427. package/src/app/core/table/testing/table-validator.service.d.ts +17 -0
  428. package/src/app/core/table/testing/table.testing.d.ts +53 -0
  429. package/src/app/core/table/testing/table.testing.module.d.ts +11 -0
  430. package/src/app/shared/alerts.d.ts +53 -0
  431. package/src/app/shared/audio/audio.d.ts +44 -0
  432. package/src/app/shared/audio/audio.testing.d.ts +13 -0
  433. package/src/app/shared/audio/audio.testing.module.d.ts +11 -0
  434. package/src/app/shared/capacitor/keyboard.d.ts +16 -0
  435. package/src/app/shared/capacitor/plugins.d.ts +7 -0
  436. package/src/app/shared/constants.d.ts +7 -0
  437. package/src/app/shared/dates.d.ts +39 -0
  438. package/src/app/shared/debug/debug-service.class.d.ts +5 -0
  439. package/src/app/shared/debug/debug.component.d.ts +13 -0
  440. package/src/app/shared/debug/debug.module.d.ts +12 -0
  441. package/src/app/shared/directives/autofocus.directive.d.ts +19 -0
  442. package/src/app/shared/directives/autotitle.directive.d.ts +10 -0
  443. package/src/app/shared/directives/directives.module.d.ts +12 -0
  444. package/src/app/shared/directives/drag-and-drop.directive.d.ts +17 -0
  445. package/src/app/shared/directives/ng-var.directive.d.ts +12 -0
  446. package/src/app/shared/directives/resizable/resizable.component.d.ts +21 -0
  447. package/src/app/shared/directives/resizable/resizable.directive.d.ts +12 -0
  448. package/src/app/shared/directives/resizable/resizable.module.d.ts +8 -0
  449. package/src/app/shared/events.d.ts +27 -0
  450. package/src/app/shared/file/csv.utils.d.ts +19 -0
  451. package/src/app/shared/file/file.service.d.ts +23 -0
  452. package/src/app/shared/file/file.utils.d.ts +20 -0
  453. package/src/app/shared/file/images.utils.d.ts +19 -0
  454. package/src/app/shared/file/json.utils.d.ts +16 -0
  455. package/src/app/shared/file/uri.utils.d.ts +7 -0
  456. package/src/app/shared/focusable.d.ts +4 -0
  457. package/src/app/shared/form/field.component.d.ts +71 -0
  458. package/src/app/shared/form/field.model.d.ts +37 -0
  459. package/src/app/shared/form/loading-spinner.d.ts +8 -0
  460. package/src/app/shared/forms.d.ts +89 -0
  461. package/src/app/shared/functions.d.ts +132 -0
  462. package/src/app/shared/geolocation/geolocation.utils.d.ts +19 -0
  463. package/src/app/shared/gesture/gesture-config.d.ts +15 -0
  464. package/src/app/shared/gesture/hammer.utils.d.ts +16 -0
  465. package/src/app/shared/graph/colors.utils.d.ts +17 -0
  466. package/src/app/shared/graph/graph-colors.d.ts +63 -0
  467. package/src/app/shared/guard/component-dirty.guard.d.ts +19 -0
  468. package/src/app/shared/help/help.modal.d.ts +33 -0
  469. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +10 -0
  470. package/src/app/shared/hotkeys/hotkeys.service.d.ts +28 -0
  471. package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +11 -0
  472. package/src/app/shared/http/http.utils.d.ts +27 -0
  473. package/src/app/shared/image/gallery/image-gallery.component.d.ts +98 -0
  474. package/src/app/shared/image/gallery/image-gallery.module.d.ts +14 -0
  475. package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +12 -0
  476. package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +33 -0
  477. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +16 -0
  478. package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +12 -0
  479. package/src/app/shared/image/image.model.d.ts +5 -0
  480. package/src/app/shared/image/image.module.d.ts +8 -0
  481. package/src/app/shared/image/image.service.d.ts +32 -0
  482. package/src/app/shared/inputs.d.ts +32 -0
  483. package/src/app/shared/interceptors/progess.interceptor.d.ts +8 -0
  484. package/src/app/shared/logging/log-level.model.d.ts +38 -0
  485. package/src/app/shared/logging/logger.model.d.ts +68 -0
  486. package/src/app/shared/logging/logging-service.class.d.ts +39 -0
  487. package/src/app/shared/logging/logging-service.config.d.ts +25 -0
  488. package/src/app/shared/logging/logging-service.module.d.ts +9 -0
  489. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +36 -0
  490. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +138 -0
  491. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +21 -0
  492. package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +4 -0
  493. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +45 -0
  494. package/src/app/shared/material/badge/badge.directive.d.ts +37 -0
  495. package/src/app/shared/material/badge/badge.module.d.ts +10 -0
  496. package/src/app/shared/material/badge/badge.test.d.ts +21 -0
  497. package/src/app/shared/material/boolean/boolean.module.d.ts +19 -0
  498. package/src/app/shared/material/boolean/material.boolean.d.ts +66 -0
  499. package/src/app/shared/material/chips/chips.module.d.ts +21 -0
  500. package/src/app/shared/material/chips/material.chips.d.ts +126 -0
  501. package/src/app/shared/material/chips/testing/chips.test.d.ts +31 -0
  502. package/src/app/shared/material/datetime/datetime.module.d.ts +24 -0
  503. package/src/app/shared/material/datetime/material.date.d.ts +74 -0
  504. package/src/app/shared/material/datetime/material.dateshort.d.ts +75 -0
  505. package/src/app/shared/material/datetime/material.datetime.d.ts +100 -0
  506. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +31 -0
  507. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +30 -0
  508. package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +29 -0
  509. package/src/app/shared/material/duration/duration.module.d.ts +18 -0
  510. package/src/app/shared/material/duration/duration.utils.d.ts +3 -0
  511. package/src/app/shared/material/duration/material.duration.d.ts +57 -0
  512. package/src/app/shared/material/latlong/latlong.utils.d.ts +13 -0
  513. package/src/app/shared/material/latlong/material.latlong.d.ts +65 -0
  514. package/src/app/shared/material/latlong/material.latlong.module.d.ts +19 -0
  515. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +21 -0
  516. package/src/app/shared/material/material.animations.d.ts +4 -0
  517. package/src/app/shared/material/material.module.d.ts +45 -0
  518. package/src/app/shared/material/material.testing.module.d.ts +25 -0
  519. package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +22 -0
  520. package/src/app/shared/material/numpad/numpad.component.d.ts +26 -0
  521. package/src/app/shared/material/numpad/numpad.container.d.ts +40 -0
  522. package/src/app/shared/material/numpad/numpad.content.d.ts +7 -0
  523. package/src/app/shared/material/numpad/numpad.directive.d.ts +35 -0
  524. package/src/app/shared/material/numpad/numpad.dom-service.d.ts +16 -0
  525. package/src/app/shared/material/numpad/numpad.model.d.ts +30 -0
  526. package/src/app/shared/material/numpad/numpad.module.d.ts +16 -0
  527. package/src/app/shared/material/numpad/testing/numpad.test.d.ts +13 -0
  528. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +15 -0
  529. package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +10 -0
  530. package/src/app/shared/material/swipe/material.swipe.d.ts +89 -0
  531. package/src/app/shared/material/swipe/swipe.module.d.ts +15 -0
  532. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +22 -0
  533. package/src/app/shared/modules.d.ts +8 -0
  534. package/src/app/shared/observables.d.ts +29 -0
  535. package/src/app/shared/pipes/arrays.pipe.d.ts +54 -0
  536. package/src/app/shared/pipes/colors.pipe.d.ts +9 -0
  537. package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +23 -0
  538. package/src/app/shared/pipes/date-format.pipe.d.ts +34 -0
  539. package/src/app/shared/pipes/date-from-now.pipe.d.ts +12 -0
  540. package/src/app/shared/pipes/duration.pipe.d.ts +13 -0
  541. package/src/app/shared/pipes/file-size.pipe.d.ts +30 -0
  542. package/src/app/shared/pipes/form.pipes.d.ts +59 -0
  543. package/src/app/shared/pipes/highlight.pipe.d.ts +11 -0
  544. package/src/app/shared/pipes/latlong-format.pipe.d.ts +20 -0
  545. package/src/app/shared/pipes/maps.pipe.d.ts +22 -0
  546. package/src/app/shared/pipes/math.pipes.d.ts +20 -0
  547. package/src/app/shared/pipes/ng-init.pipe.d.ts +8 -0
  548. package/src/app/shared/pipes/number-format.pipe.d.ts +10 -0
  549. package/src/app/shared/pipes/pipes.module.d.ts +27 -0
  550. package/src/app/shared/pipes/property.pipes.d.ts +26 -0
  551. package/src/app/shared/pipes/string.pipes.d.ts +47 -0
  552. package/src/app/shared/pipes/translate-context.pipe.d.ts +17 -0
  553. package/src/app/shared/pipes/types.pipes.d.ts +18 -0
  554. package/src/app/shared/platforms.d.ts +8 -0
  555. package/src/app/shared/services/entity-service.class.d.ts +73 -0
  556. package/src/app/shared/services/job.utils.d.ts +20 -0
  557. package/src/app/shared/services/memory-entity-service.class.d.ts +71 -0
  558. package/src/app/shared/services/progress-bar.service.d.ts +20 -0
  559. package/src/app/shared/services/startable-observable-service.class.d.ts +33 -0
  560. package/src/app/shared/services/startable-service.class.d.ts +34 -0
  561. package/src/app/shared/services/translate-context.service.d.ts +29 -0
  562. package/src/app/shared/services/validator-service.class.d.ts +10 -0
  563. package/src/app/shared/services.d.ts +9 -0
  564. package/src/app/shared/shared-routing.module.d.ts +22 -0
  565. package/src/app/shared/shared.module.d.ts +31 -0
  566. package/src/app/shared/shared.testing.module.d.ts +17 -0
  567. package/src/app/shared/storage/storage-explorer.component.d.ts +58 -0
  568. package/src/app/shared/storage/storage-explorer.module.d.ts +16 -0
  569. package/src/app/shared/storage/storage.service.d.ts +23 -0
  570. package/src/app/shared/storage/storage.utils.d.ts +19 -0
  571. package/src/app/shared/testing/observable.test.d.ts +25 -0
  572. package/src/app/shared/testing/tests.page.d.ts +20 -0
  573. package/src/app/shared/toast/toast.testing.d.ts +15 -0
  574. package/src/app/shared/toast/toast.testing.module.d.ts +11 -0
  575. package/src/app/shared/toast/toasts.d.ts +17 -0
  576. package/src/app/shared/toolbar/modal-toolbar.d.ts +21 -0
  577. package/src/app/shared/toolbar/toolbar.d.ts +63 -0
  578. package/src/app/shared/toolbar/toolbar.module.d.ts +15 -0
  579. package/src/app/shared/types.d.ts +26 -0
  580. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +20 -0
  581. package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +11 -0
  582. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +39 -0
  583. package/src/app/shared/upload-file/upload-file.component.d.ts +48 -0
  584. package/src/app/shared/upload-file/upload-file.model.d.ts +30 -0
  585. package/src/app/shared/validator/form-error-adapter.class.d.ts +27 -0
  586. package/src/app/shared/validator/validators.d.ts +115 -0
  587. package/src/app/shared/version/versions.d.ts +26 -0
  588. package/src/app/social/job/job.module.d.ts +12 -0
  589. package/src/app/social/job/progression/job-progression.component.d.ts +9 -0
  590. package/src/app/social/job/progression/job-progression.icon.d.ts +49 -0
  591. package/src/app/social/job/progression/job-progression.list.d.ts +21 -0
  592. package/src/app/social/job/progression/job-progression.model.d.ts +11 -0
  593. package/src/app/social/job/progression/job-progression.service.d.ts +34 -0
  594. package/src/app/social/job/testing/job-progression.testing.d.ts +17 -0
  595. package/src/app/social/job/testing/job-progression.testing.service.d.ts +17 -0
  596. package/src/app/social/job/testing/job.testing.module.d.ts +11 -0
  597. package/src/app/social/message/message.form.d.ts +30 -0
  598. package/src/app/social/message/message.modal.d.ts +39 -0
  599. package/src/app/social/message/message.model.d.ts +31 -0
  600. package/src/app/social/message/message.module.d.ts +11 -0
  601. package/src/app/social/message/message.service.d.ts +27 -0
  602. package/src/app/social/social.errors.d.ts +9 -0
  603. package/src/app/social/social.module.d.ts +20 -0
  604. package/src/app/social/social.testing.module.d.ts +13 -0
  605. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +31 -0
  606. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +71 -0
  607. package/src/app/social/user-event/testing/user-event.testing.d.ts +34 -0
  608. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +44 -0
  609. package/src/app/social/user-event/testing/user-event.testing.module.d.ts +11 -0
  610. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +41 -0
  611. package/src/app/social/user-event/user-event.model.d.ts +45 -0
  612. package/src/app/social/user-event/user-event.module.d.ts +12 -0
  613. package/src/app/social/user-event/user-event.service.d.ts +124 -0
  614. package/src/environments/environment.class.d.ts +57 -0
  615. package/src/environments/environment.d.ts +3 -0
  616. package/.editorconfig +0 -24
  617. package/.eslintrc.json +0 -74
  618. package/.gitattribute +0 -1
  619. package/.github/CONTRIBUTING.md +0 -10
  620. package/.github/ISSUE_TEMPLATE.md +0 -6
  621. package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
  622. package/.github/github_disclaimer.md +0 -14
  623. package/.gitlab-ci.yml +0 -46
  624. package/.graphqlconfig +0 -15
  625. package/angular.json +0 -230
  626. package/capacitor.config.json +0 -9
  627. package/ionic.config.json +0 -7
  628. package/karma.conf.js +0 -32
  629. package/ng-package.json +0 -19
  630. package/ngcc.config.js +0 -14
  631. package/public_api.ts +0 -343
  632. package/resources/android/build/tools/android-accept-licenses.sh +0 -14
  633. package/resources/android/icon/drawable-hdpi-icon.png +0 -0
  634. package/resources/android/icon/drawable-ldpi-icon.png +0 -0
  635. package/resources/android/icon/drawable-mdpi-icon.png +0 -0
  636. package/resources/android/icon/drawable-xhdpi-icon.png +0 -0
  637. package/resources/android/icon/drawable-xxhdpi-icon.png +0 -0
  638. package/resources/android/icon/drawable-xxxhdpi-icon.png +0 -0
  639. package/resources/android/splash/drawable-land-hdpi-screen.png +0 -0
  640. package/resources/android/splash/drawable-land-ldpi-screen.png +0 -0
  641. package/resources/android/splash/drawable-land-mdpi-screen.png +0 -0
  642. package/resources/android/splash/drawable-land-xhdpi-screen.png +0 -0
  643. package/resources/android/splash/drawable-land-xxhdpi-screen.png +0 -0
  644. package/resources/android/splash/drawable-land-xxxhdpi-screen.png +0 -0
  645. package/resources/android/splash/drawable-port-hdpi-screen.png +0 -0
  646. package/resources/android/splash/drawable-port-ldpi-screen.png +0 -0
  647. package/resources/android/splash/drawable-port-mdpi-screen.png +0 -0
  648. package/resources/android/splash/drawable-port-xhdpi-screen.png +0 -0
  649. package/resources/android/splash/drawable-port-xxhdpi-screen.png +0 -0
  650. package/resources/android/splash/drawable-port-xxxhdpi-screen.png +0 -0
  651. package/resources/android/splash/drawable-xxxhdpi-screen.png +0 -0
  652. package/resources/icon/TODO.md +0 -11
  653. package/resources/icon.png +0 -0
  654. package/resources/icon.png.md5 +0 -1
  655. package/resources/icon.xcf +0 -0
  656. package/resources/ios/icon/icon-1024.png +0 -0
  657. package/resources/ios/icon/icon-108@2x.png +0 -0
  658. package/resources/ios/icon/icon-20.png +0 -0
  659. package/resources/ios/icon/icon-20@2x.png +0 -0
  660. package/resources/ios/icon/icon-20@3x.png +0 -0
  661. package/resources/ios/icon/icon-24@2x.png +0 -0
  662. package/resources/ios/icon/icon-27.5@2x.png +0 -0
  663. package/resources/ios/icon/icon-29.png +0 -0
  664. package/resources/ios/icon/icon-29@2x.png +0 -0
  665. package/resources/ios/icon/icon-29@3x.png +0 -0
  666. package/resources/ios/icon/icon-40.png +0 -0
  667. package/resources/ios/icon/icon-40@2x.png +0 -0
  668. package/resources/ios/icon/icon-40@3x.png +0 -0
  669. package/resources/ios/icon/icon-44@2x.png +0 -0
  670. package/resources/ios/icon/icon-50.png +0 -0
  671. package/resources/ios/icon/icon-50@2x.png +0 -0
  672. package/resources/ios/icon/icon-60.png +0 -0
  673. package/resources/ios/icon/icon-60@2x.png +0 -0
  674. package/resources/ios/icon/icon-60@3x.png +0 -0
  675. package/resources/ios/icon/icon-72.png +0 -0
  676. package/resources/ios/icon/icon-72@2x.png +0 -0
  677. package/resources/ios/icon/icon-76.png +0 -0
  678. package/resources/ios/icon/icon-76@2x.png +0 -0
  679. package/resources/ios/icon/icon-83.5@2x.png +0 -0
  680. package/resources/ios/icon/icon-86@2x.png +0 -0
  681. package/resources/ios/icon/icon-98@2x.png +0 -0
  682. package/resources/ios/icon/icon-small.png +0 -0
  683. package/resources/ios/icon/icon-small@2x.png +0 -0
  684. package/resources/ios/icon/icon-small@3x.png +0 -0
  685. package/resources/ios/icon/icon.png +0 -0
  686. package/resources/ios/icon/icon@2x.png +0 -0
  687. package/resources/ios/splash/Default-1792h~iphone.png +0 -0
  688. package/resources/ios/splash/Default-2436h.png +0 -0
  689. package/resources/ios/splash/Default-2688h~iphone.png +0 -0
  690. package/resources/ios/splash/Default-568h@2x~iphone.png +0 -0
  691. package/resources/ios/splash/Default-667h.png +0 -0
  692. package/resources/ios/splash/Default-736h.png +0 -0
  693. package/resources/ios/splash/Default-Landscape-1792h~iphone.png +0 -0
  694. package/resources/ios/splash/Default-Landscape-2436h.png +0 -0
  695. package/resources/ios/splash/Default-Landscape-2688h~iphone.png +0 -0
  696. package/resources/ios/splash/Default-Landscape-736h.png +0 -0
  697. package/resources/ios/splash/Default-Landscape@2x~ipad.png +0 -0
  698. package/resources/ios/splash/Default-Landscape@~ipadpro.png +0 -0
  699. package/resources/ios/splash/Default-Landscape~ipad.png +0 -0
  700. package/resources/ios/splash/Default-Portrait@2x~ipad.png +0 -0
  701. package/resources/ios/splash/Default-Portrait@~ipadpro.png +0 -0
  702. package/resources/ios/splash/Default-Portrait~ipad.png +0 -0
  703. package/resources/ios/splash/Default@2x~iphone.png +0 -0
  704. package/resources/ios/splash/Default@2x~universal~anyany.png +0 -0
  705. package/resources/ios/splash/Default~iphone.png +0 -0
  706. package/resources/splash.png +0 -0
  707. package/resources/splash.png.md5 +0 -1
  708. package/scripts/build-android.sh +0 -18
  709. package/scripts/build-i18n.js +0 -24
  710. package/scripts/docker-start.sh +0 -6
  711. package/scripts/emulate-android.sh +0 -17
  712. package/scripts/env-android.sh +0 -83
  713. package/scripts/env-clean.sh +0 -23
  714. package/scripts/env-global.sh +0 -156
  715. package/scripts/install-android-sdk-tools.sh +0 -73
  716. package/scripts/ionic-update.sh +0 -24
  717. package/scripts/node/playground.ts +0 -9
  718. package/scripts/node/resources.js +0 -90
  719. package/scripts/release.sh +0 -149
  720. package/scripts/run-android.sh +0 -59
  721. package/scripts/test.sh +0 -19
  722. package/src/app/admin/admin-routing.module.ts +0 -30
  723. package/src/app/admin/admin.module.ts +0 -23
  724. package/src/app/admin/services/filter/person.filter.ts +0 -77
  725. package/src/app/admin/services/person.service.ts +0 -212
  726. package/src/app/admin/services/validator/person.validator.ts +0 -37
  727. package/src/app/admin/users/users.html +0 -427
  728. package/src/app/admin/users/users.module.ts +0 -34
  729. package/src/app/admin/users/users.scss +0 -59
  730. package/src/app/admin/users/users.ts +0 -257
  731. package/src/app/app-routing.module.ts +0 -126
  732. package/src/app/app.component.html +0 -12
  733. package/src/app/app.component.scss +0 -4
  734. package/src/app/app.component.ts +0 -205
  735. package/src/app/app.module.ts +0 -326
  736. package/src/app/core/about/about.modal.html +0 -140
  737. package/src/app/core/about/about.modal.scss +0 -23
  738. package/src/app/core/about/about.modal.ts +0 -71
  739. package/src/app/core/about/about.module.ts +0 -24
  740. package/src/app/core/account/account.module.ts +0 -38
  741. package/src/app/core/account/account.page.html +0 -241
  742. package/src/app/core/account/account.page.scss +0 -21
  743. package/src/app/core/account/account.page.ts +0 -366
  744. package/src/app/core/account/new-token.modal.html +0 -120
  745. package/src/app/core/account/new-token.modal.ts +0 -138
  746. package/src/app/core/account/token.table.html +0 -177
  747. package/src/app/core/account/token.table.scss +0 -7
  748. package/src/app/core/account/token.table.ts +0 -141
  749. package/src/app/core/auth/auth.form.html +0 -77
  750. package/src/app/core/auth/auth.form.scss +0 -1
  751. package/src/app/core/auth/auth.form.ts +0 -145
  752. package/src/app/core/auth/auth.modal.html +0 -57
  753. package/src/app/core/auth/auth.modal.scss +0 -1
  754. package/src/app/core/auth/auth.modal.ts +0 -80
  755. package/src/app/core/auth/auth.module.ts +0 -33
  756. package/src/app/core/core.module.ts +0 -100
  757. package/src/app/core/core.testing.module.ts +0 -64
  758. package/src/app/core/form/buttons/form-buttons-bar.component.html +0 -59
  759. package/src/app/core/form/buttons/form-buttons-bar.component.scss +0 -14
  760. package/src/app/core/form/buttons/form-buttons-bar.component.ts +0 -70
  761. package/src/app/core/form/buttons/form-buttons-bar.module.ts +0 -24
  762. package/src/app/core/form/entity/editor.class.ts +0 -803
  763. package/src/app/core/form/entity/entity-editor-modal.class.ts +0 -537
  764. package/src/app/core/form/entity/entity-editor.class.ts +0 -885
  765. package/src/app/core/form/entity/entity-metadata.component.html +0 -53
  766. package/src/app/core/form/entity/entity-metadata.component.scss +0 -28
  767. package/src/app/core/form/entity/entity-metadata.component.ts +0 -19
  768. package/src/app/core/form/entity/entity.module.ts +0 -25
  769. package/src/app/core/form/form.class.ts +0 -401
  770. package/src/app/core/form/form.module.ts +0 -37
  771. package/src/app/core/form/form.utils.ts +0 -639
  772. package/src/app/core/form/list/list.form.html +0 -67
  773. package/src/app/core/form/list/list.form.scss +0 -40
  774. package/src/app/core/form/list/list.form.ts +0 -278
  775. package/src/app/core/form/list/list.module.ts +0 -25
  776. package/src/app/core/form/properties/properties.form.html +0 -129
  777. package/src/app/core/form/properties/properties.form.ts +0 -147
  778. package/src/app/core/form/properties/properties.module.ts +0 -30
  779. package/src/app/core/form/properties/properties.table.html +0 -219
  780. package/src/app/core/form/properties/properties.table.scss +0 -0
  781. package/src/app/core/form/properties/properties.table.ts +0 -291
  782. package/src/app/core/form/properties/property.validator.ts +0 -22
  783. package/src/app/core/form/properties/testing/properties-form.test.html +0 -21
  784. package/src/app/core/form/properties/testing/properties-form.test.ts +0 -102
  785. package/src/app/core/form/properties/testing/properties-form.testing.module.ts +0 -25
  786. package/src/app/core/form/text-popover/testing/text-popover.testing.html +0 -45
  787. package/src/app/core/form/text-popover/testing/text-popover.testing.module.ts +0 -32
  788. package/src/app/core/form/text-popover/testing/text-popover.testing.ts +0 -77
  789. package/src/app/core/form/text-popover/text-form.component.html +0 -44
  790. package/src/app/core/form/text-popover/text-form.component.scss +0 -8
  791. package/src/app/core/form/text-popover/text-form.component.ts +0 -65
  792. package/src/app/core/form/text-popover/text-popover.component.html +0 -86
  793. package/src/app/core/form/text-popover/text-popover.component.scss +0 -7
  794. package/src/app/core/form/text-popover/text-popover.component.ts +0 -165
  795. package/src/app/core/form/text-popover/text-popover.module.ts +0 -27
  796. package/src/app/core/graphql/graphql.module.ts +0 -17
  797. package/src/app/core/graphql/graphql.service.ts +0 -969
  798. package/src/app/core/graphql/graphql.utils.ts +0 -167
  799. package/src/app/core/home/home.html +0 -211
  800. package/src/app/core/home/home.module.ts +0 -32
  801. package/src/app/core/home/home.scss +0 -242
  802. package/src/app/core/home/home.ts +0 -298
  803. package/src/app/core/icon/icon.component.html +0 -15
  804. package/src/app/core/icon/icon.component.ts +0 -23
  805. package/src/app/core/icon/icon.module.ts +0 -22
  806. package/src/app/core/install/install-upgrade-card.component.html +0 -144
  807. package/src/app/core/install/install-upgrade-card.component.scss +0 -4
  808. package/src/app/core/install/install-upgrade-card.component.ts +0 -412
  809. package/src/app/core/install/install-upgrade-card.module.ts +0 -23
  810. package/src/app/core/menu/menu.component.html +0 -135
  811. package/src/app/core/menu/menu.component.scss +0 -225
  812. package/src/app/core/menu/menu.component.ts +0 -352
  813. package/src/app/core/menu/menu.model.ts +0 -64
  814. package/src/app/core/menu/menu.module.ts +0 -27
  815. package/src/app/core/menu/menu.service.ts +0 -62
  816. package/src/app/core/offline/update-offline-mode-card.component.html +0 -45
  817. package/src/app/core/offline/update-offline-mode-card.component.scss +0 -4
  818. package/src/app/core/offline/update-offline-mode-card.component.ts +0 -28
  819. package/src/app/core/offline/update-offline-mode-card.module.ts +0 -24
  820. package/src/app/core/peer/select-peer.modal.html +0 -123
  821. package/src/app/core/peer/select-peer.modal.scss +0 -20
  822. package/src/app/core/peer/select-peer.modal.ts +0 -197
  823. package/src/app/core/peer/select-peer.module.ts +0 -28
  824. package/src/app/core/register/register-confirm.page.html +0 -55
  825. package/src/app/core/register/register-confirm.page.scss +0 -121
  826. package/src/app/core/register/register-confirm.page.ts +0 -94
  827. package/src/app/core/register/register.form.html +0 -125
  828. package/src/app/core/register/register.form.scss +0 -10
  829. package/src/app/core/register/register.form.ts +0 -213
  830. package/src/app/core/register/register.modal.html +0 -70
  831. package/src/app/core/register/register.modal.ts +0 -52
  832. package/src/app/core/register/register.module.ts +0 -31
  833. package/src/app/core/services/account.service.ts +0 -1431
  834. package/src/app/core/services/auth-guard.service.ts +0 -70
  835. package/src/app/core/services/base-entity-service.class.ts +0 -598
  836. package/src/app/core/services/base-graphql-service.class.ts +0 -298
  837. package/src/app/core/services/base58.ts +0 -83
  838. package/src/app/core/services/config/account.config.ts +0 -35
  839. package/src/app/core/services/config/core.config.ts +0 -180
  840. package/src/app/core/services/config.service.ts +0 -414
  841. package/src/app/core/services/crypto.service.ts +0 -126
  842. package/src/app/core/services/errors.ts +0 -67
  843. package/src/app/core/services/local-settings.service.spec.ts +0 -32
  844. package/src/app/core/services/local-settings.service.ts +0 -548
  845. package/src/app/core/services/model/account.model.ts +0 -141
  846. package/src/app/core/services/model/config.model.ts +0 -122
  847. package/src/app/core/services/model/department.model.ts +0 -34
  848. package/src/app/core/services/model/entity.decorators.ts +0 -112
  849. package/src/app/core/services/model/entity.model.ts +0 -326
  850. package/src/app/core/services/model/filter.model.ts +0 -139
  851. package/src/app/core/services/model/history.model.ts +0 -25
  852. package/src/app/core/services/model/model.enum.ts +0 -11
  853. package/src/app/core/services/model/peer.model.ts +0 -86
  854. package/src/app/core/services/model/person.model.ts +0 -112
  855. package/src/app/core/services/model/referential.model.ts +0 -244
  856. package/src/app/core/services/model/settings.model.ts +0 -32
  857. package/src/app/core/services/model/token.model.ts +0 -54
  858. package/src/app/core/services/network.service.spec.ts +0 -49
  859. package/src/app/core/services/network.service.ts +0 -729
  860. package/src/app/core/services/network.types.ts +0 -26
  861. package/src/app/core/services/network.utils.ts +0 -57
  862. package/src/app/core/services/pipes/account.pipes.ts +0 -25
  863. package/src/app/core/services/pipes/department-to-string.pipe.ts +0 -15
  864. package/src/app/core/services/pipes/person-to-string.pipe.ts +0 -15
  865. package/src/app/core/services/pipes/usage-mode.pipes.ts +0 -26
  866. package/src/app/core/services/platform.service.spec.ts +0 -56
  867. package/src/app/core/services/platform.service.ts +0 -605
  868. package/src/app/core/services/storage/entities-storage.service.ts +0 -542
  869. package/src/app/core/services/storage/entity-store.class.ts +0 -598
  870. package/src/app/core/services/testing/referential-filter.model.ts +0 -28
  871. package/src/app/core/services/testing/referential.validator.ts +0 -57
  872. package/src/app/core/services/validator/account.validator.ts +0 -58
  873. package/src/app/core/services/validator/base.validator.class.ts +0 -54
  874. package/src/app/core/services/validator/local-settings.validator.ts +0 -72
  875. package/src/app/core/services/validator/user-settings.validator.ts +0 -25
  876. package/src/app/core/services/validator/user-token.validator.ts +0 -55
  877. package/src/app/core/settings/settings.module.ts +0 -24
  878. package/src/app/core/settings/settings.page.html +0 -264
  879. package/src/app/core/settings/settings.page.ts +0 -365
  880. package/src/app/core/table/actions-column.component.html +0 -91
  881. package/src/app/core/table/actions-column.component.ts +0 -70
  882. package/src/app/core/table/async-table.class.ts +0 -1934
  883. package/src/app/core/table/entities-async-table-datasource.class.ts +0 -482
  884. package/src/app/core/table/entities-table-datasource.class.ts +0 -496
  885. package/src/app/core/table/memory-table.class.ts +0 -65
  886. package/src/app/core/table/table-select-columns.component.html +0 -58
  887. package/src/app/core/table/table-select-columns.component.ts +0 -50
  888. package/src/app/core/table/table.class.ts +0 -1973
  889. package/src/app/core/table/table.model.ts +0 -35
  890. package/src/app/core/table/table.module.ts +0 -26
  891. package/src/app/core/table/table.utils.ts +0 -38
  892. package/src/app/core/table/testing/multi-table.testing.ts +0 -261
  893. package/src/app/core/table/testing/table-validator.service.ts +0 -25
  894. package/src/app/core/table/testing/table.testing.html +0 -396
  895. package/src/app/core/table/testing/table.testing.module.ts +0 -25
  896. package/src/app/core/table/testing/table.testing.scss +0 -23
  897. package/src/app/core/table/testing/table.testing.ts +0 -292
  898. package/src/app/shared/alerts.ts +0 -292
  899. package/src/app/shared/audio/audio.testing.html +0 -33
  900. package/src/app/shared/audio/audio.testing.module.ts +0 -32
  901. package/src/app/shared/audio/audio.testing.ts +0 -31
  902. package/src/app/shared/audio/audio.ts +0 -278
  903. package/src/app/shared/base64.utils.ts +0 -66
  904. package/src/app/shared/capacitor/keyboard.ts +0 -40
  905. package/src/app/shared/capacitor/plugins.ts +0 -12
  906. package/src/app/shared/constants.ts +0 -12
  907. package/src/app/shared/dates.ts +0 -163
  908. package/src/app/shared/debug/debug-service.class.ts +0 -8
  909. package/src/app/shared/debug/debug.component.html +0 -13
  910. package/src/app/shared/debug/debug.component.scss +0 -24
  911. package/src/app/shared/debug/debug.component.spec.ts +0 -25
  912. package/src/app/shared/debug/debug.component.ts +0 -27
  913. package/src/app/shared/debug/debug.module.ts +0 -28
  914. package/src/app/shared/directives/autofocus.directive.ts +0 -109
  915. package/src/app/shared/directives/autotitle.directive.ts +0 -24
  916. package/src/app/shared/directives/directives.module.ts +0 -29
  917. package/src/app/shared/directives/drag-and-drop.directive.ts +0 -47
  918. package/src/app/shared/directives/ng-var.directive.ts +0 -32
  919. package/src/app/shared/directives/resizable/resizable.component.ts +0 -47
  920. package/src/app/shared/directives/resizable/resizable.directive.ts +0 -43
  921. package/src/app/shared/directives/resizable/resizable.module.ts +0 -9
  922. package/src/app/shared/directives/resizable/resizable.style.scss +0 -44
  923. package/src/app/shared/directives/resizable/resizable.template.html +0 -6
  924. package/src/app/shared/events.ts +0 -96
  925. package/src/app/shared/file/csv.utils.ts +0 -94
  926. package/src/app/shared/file/file.service.ts +0 -132
  927. package/src/app/shared/file/file.utils.ts +0 -138
  928. package/src/app/shared/file/images.utils.ts +0 -198
  929. package/src/app/shared/file/json.utils.ts +0 -73
  930. package/src/app/shared/file/uri.utils.ts +0 -25
  931. package/src/app/shared/focusable.ts +0 -10
  932. package/src/app/shared/form/field.component.html +0 -261
  933. package/src/app/shared/form/field.component.scss +0 -7
  934. package/src/app/shared/form/field.component.ts +0 -318
  935. package/src/app/shared/form/field.model.ts +0 -64
  936. package/src/app/shared/form/loading-spinner.ts +0 -16
  937. package/src/app/shared/forms.ts +0 -458
  938. package/src/app/shared/functions.ts +0 -492
  939. package/src/app/shared/geolocation/geolocation.utils.ts +0 -101
  940. package/src/app/shared/gesture/gesture-config.ts +0 -45
  941. package/src/app/shared/gesture/hammer.utils.ts +0 -14
  942. package/src/app/shared/graph/colors.utils.ts +0 -74
  943. package/src/app/shared/graph/graph-colors.ts +0 -295
  944. package/src/app/shared/guard/component-dirty.guard.ts +0 -70
  945. package/src/app/shared/help/help.modal.html +0 -42
  946. package/src/app/shared/help/help.modal.ts +0 -61
  947. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.html +0 -11
  948. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.scss +0 -39
  949. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.ts +0 -16
  950. package/src/app/shared/hotkeys/hotkeys.service.ts +0 -89
  951. package/src/app/shared/hotkeys/shared-hotkeys.module.ts +0 -27
  952. package/src/app/shared/http/http.utils.ts +0 -89
  953. package/src/app/shared/image/gallery/image-gallery.component.html +0 -231
  954. package/src/app/shared/image/gallery/image-gallery.component.scss +0 -196
  955. package/src/app/shared/image/gallery/image-gallery.component.ts +0 -389
  956. package/src/app/shared/image/gallery/image-gallery.module.ts +0 -34
  957. package/src/app/shared/image/gallery/testing/gallegry.model.testing.ts +0 -27
  958. package/src/app/shared/image/gallery/testing/gallery.service.testing.ts +0 -102
  959. package/src/app/shared/image/gallery/testing/gallery.testing.html +0 -15
  960. package/src/app/shared/image/gallery/testing/gallery.testing.module.ts +0 -39
  961. package/src/app/shared/image/gallery/testing/gallery.testing.ts +0 -38
  962. package/src/app/shared/image/image.model.ts +0 -6
  963. package/src/app/shared/image/image.module.ts +0 -16
  964. package/src/app/shared/image/image.service.ts +0 -94
  965. package/src/app/shared/image/image.testing.module.ts +0 -23
  966. package/src/app/shared/inputs.ts +0 -282
  967. package/src/app/shared/interceptors/progess.interceptor.ts +0 -25
  968. package/src/app/shared/logging/log-level.model.ts +0 -53
  969. package/src/app/shared/logging/logger.model.ts +0 -120
  970. package/src/app/shared/logging/logging-service.class.ts +0 -134
  971. package/src/app/shared/logging/logging-service.config.ts +0 -29
  972. package/src/app/shared/logging/logging-service.module.ts +0 -22
  973. package/src/app/shared/material/autocomplete/material.autocomplete.config.ts +0 -83
  974. package/src/app/shared/material/autocomplete/material.autocomplete.html +0 -262
  975. package/src/app/shared/material/autocomplete/material.autocomplete.module.ts +0 -45
  976. package/src/app/shared/material/autocomplete/material.autocomplete.scss +0 -21
  977. package/src/app/shared/material/autocomplete/material.autocomplete.ts +0 -1022
  978. package/src/app/shared/material/autocomplete/material.autocomplete.utils.ts +0 -20
  979. package/src/app/shared/material/autocomplete/testing/autocomplete.test.html +0 -876
  980. package/src/app/shared/material/autocomplete/testing/autocomplete.test.spec.ts +0 -38
  981. package/src/app/shared/material/autocomplete/testing/autocomplete.test.ts +0 -247
  982. package/src/app/shared/material/badge/badge.directive.ts +0 -164
  983. package/src/app/shared/material/badge/badge.module.ts +0 -22
  984. package/src/app/shared/material/badge/badge.test.html +0 -261
  985. package/src/app/shared/material/badge/badge.test.ts +0 -36
  986. package/src/app/shared/material/boolean/boolean.module.ts +0 -40
  987. package/src/app/shared/material/boolean/material.boolean.html +0 -155
  988. package/src/app/shared/material/boolean/material.boolean.scss +0 -34
  989. package/src/app/shared/material/boolean/material.boolean.ts +0 -239
  990. package/src/app/shared/material/chips/chips.module.ts +0 -44
  991. package/src/app/shared/material/chips/material.chips.html +0 -146
  992. package/src/app/shared/material/chips/material.chips.scss +0 -65
  993. package/src/app/shared/material/chips/material.chips.ts +0 -768
  994. package/src/app/shared/material/chips/testing/chips.test.html +0 -137
  995. package/src/app/shared/material/chips/testing/chips.test.ts +0 -175
  996. package/src/app/shared/material/datetime/datetime.module.ts +0 -52
  997. package/src/app/shared/material/datetime/material.date.html +0 -132
  998. package/src/app/shared/material/datetime/material.date.scss +0 -17
  999. package/src/app/shared/material/datetime/material.date.ts +0 -408
  1000. package/src/app/shared/material/datetime/material.dateshort.html +0 -134
  1001. package/src/app/shared/material/datetime/material.dateshort.scss +0 -23
  1002. package/src/app/shared/material/datetime/material.dateshort.ts +0 -422
  1003. package/src/app/shared/material/datetime/material.datetime.html +0 -224
  1004. package/src/app/shared/material/datetime/material.datetime.scss +0 -90
  1005. package/src/app/shared/material/datetime/material.datetime.ts +0 -575
  1006. package/src/app/shared/material/datetime/testing/mat-date-time.test.html +0 -354
  1007. package/src/app/shared/material/datetime/testing/mat-date-time.test.ts +0 -134
  1008. package/src/app/shared/material/datetime/testing/mat-date.test.html +0 -418
  1009. package/src/app/shared/material/datetime/testing/mat-date.test.ts +0 -135
  1010. package/src/app/shared/material/datetime/testing/mat-dateshort.test.html +0 -370
  1011. package/src/app/shared/material/datetime/testing/mat-dateshort.test.ts +0 -127
  1012. package/src/app/shared/material/duration/duration.module.ts +0 -39
  1013. package/src/app/shared/material/duration/duration.utils.ts +0 -41
  1014. package/src/app/shared/material/duration/material.duration.html +0 -44
  1015. package/src/app/shared/material/duration/material.duration.scss +0 -28
  1016. package/src/app/shared/material/duration/material.duration.ts +0 -294
  1017. package/src/app/shared/material/latlong/latlong.utils.ts +0 -300
  1018. package/src/app/shared/material/latlong/material.latlong.html +0 -127
  1019. package/src/app/shared/material/latlong/material.latlong.module.ts +0 -40
  1020. package/src/app/shared/material/latlong/material.latlong.scss +0 -48
  1021. package/src/app/shared/material/latlong/material.latlong.ts +0 -421
  1022. package/src/app/shared/material/latlong/testing/latlong.test.html +0 -341
  1023. package/src/app/shared/material/latlong/testing/latlong.test.ts +0 -121
  1024. package/src/app/shared/material/material.animations.ts +0 -129
  1025. package/src/app/shared/material/material.module.ts +0 -94
  1026. package/src/app/shared/material/material.testing.module.ts +0 -135
  1027. package/src/app/shared/material/memory/memory.utils.ts +0 -54
  1028. package/src/app/shared/material/numpad/numpad.animation.ts +0 -1
  1029. package/src/app/shared/material/numpad/numpad.append-to-input.directive.ts +0 -109
  1030. package/src/app/shared/material/numpad/numpad.component.ts +0 -78
  1031. package/src/app/shared/material/numpad/numpad.container.html +0 -32
  1032. package/src/app/shared/material/numpad/numpad.container.scss +0 -50
  1033. package/src/app/shared/material/numpad/numpad.container.ts +0 -176
  1034. package/src/app/shared/material/numpad/numpad.content.html +0 -13
  1035. package/src/app/shared/material/numpad/numpad.content.ts +0 -10
  1036. package/src/app/shared/material/numpad/numpad.directive.ts +0 -173
  1037. package/src/app/shared/material/numpad/numpad.dom-service.ts +0 -46
  1038. package/src/app/shared/material/numpad/numpad.model.ts +0 -55
  1039. package/src/app/shared/material/numpad/numpad.module.ts +0 -38
  1040. package/src/app/shared/material/numpad/testing/numpad.test.html +0 -146
  1041. package/src/app/shared/material/numpad/testing/numpad.test.ts +0 -55
  1042. package/src/app/shared/material/paginator/material.paginator-i18n.ts +0 -49
  1043. package/src/app/shared/material/stepper/material.stepper-i18n.ts +0 -18
  1044. package/src/app/shared/material/swipe/material.swipe.html +0 -63
  1045. package/src/app/shared/material/swipe/material.swipe.scss +0 -39
  1046. package/src/app/shared/material/swipe/material.swipe.ts +0 -350
  1047. package/src/app/shared/material/swipe/swipe.module.ts +0 -33
  1048. package/src/app/shared/material/swipe/testing/swipe.test.html +0 -128
  1049. package/src/app/shared/material/swipe/testing/swipe.test.ts +0 -81
  1050. package/src/app/shared/modules.ts +0 -11
  1051. package/src/app/shared/observables.ts +0 -132
  1052. package/src/app/shared/pipes/arrays.pipe.ts +0 -111
  1053. package/src/app/shared/pipes/colors.pipe.ts +0 -19
  1054. package/src/app/shared/pipes/date-diff-duration.pipe.ts +0 -48
  1055. package/src/app/shared/pipes/date-format.pipe.ts +0 -78
  1056. package/src/app/shared/pipes/date-from-now.pipe.ts +0 -20
  1057. package/src/app/shared/pipes/duration.pipe.spec.ts +0 -51
  1058. package/src/app/shared/pipes/duration.pipe.ts +0 -34
  1059. package/src/app/shared/pipes/file-size.pipe.ts +0 -58
  1060. package/src/app/shared/pipes/form.pipes.ts +0 -204
  1061. package/src/app/shared/pipes/highlight.pipe.ts +0 -37
  1062. package/src/app/shared/pipes/latlong-format.pipe.ts +0 -30
  1063. package/src/app/shared/pipes/maps.pipe.ts +0 -39
  1064. package/src/app/shared/pipes/math.pipes.ts +0 -39
  1065. package/src/app/shared/pipes/ng-init.pipe.ts +0 -14
  1066. package/src/app/shared/pipes/number-format.pipe.ts +0 -21
  1067. package/src/app/shared/pipes/pipes.module.ts +0 -134
  1068. package/src/app/shared/pipes/property.pipes.ts +0 -87
  1069. package/src/app/shared/pipes/string.pipes.ts +0 -85
  1070. package/src/app/shared/pipes/translate-context.pipe.ts +0 -33
  1071. package/src/app/shared/pipes/types.pipes.ts +0 -31
  1072. package/src/app/shared/platforms.ts +0 -58
  1073. package/src/app/shared/services/entity-service.class.ts +0 -127
  1074. package/src/app/shared/services/job.utils.ts +0 -121
  1075. package/src/app/shared/services/memory-entity-service.class.ts +0 -447
  1076. package/src/app/shared/services/progress-bar.service.ts +0 -42
  1077. package/src/app/shared/services/startable-observable-service.class.ts +0 -137
  1078. package/src/app/shared/services/startable-service.class.ts +0 -131
  1079. package/src/app/shared/services/storage.utils.ts +0 -47
  1080. package/src/app/shared/services/translate-context.service.ts +0 -116
  1081. package/src/app/shared/services/validator-service.class.ts +0 -14
  1082. package/src/app/shared/services.ts +0 -91
  1083. package/src/app/shared/shared-routing.module.ts +0 -66
  1084. package/src/app/shared/shared.module.spec.ts +0 -13
  1085. package/src/app/shared/shared.module.ts +0 -146
  1086. package/src/app/shared/shared.testing.module.ts +0 -50
  1087. package/src/app/shared/storage/storage-explorer.component.html +0 -175
  1088. package/src/app/shared/storage/storage-explorer.component.scss +0 -39
  1089. package/src/app/shared/storage/storage-explorer.component.spec.ts +0 -24
  1090. package/src/app/shared/storage/storage-explorer.component.ts +0 -292
  1091. package/src/app/shared/storage/storage-explorer.module.ts +0 -44
  1092. package/src/app/shared/storage/storage.service.ts +0 -133
  1093. package/src/app/shared/storage/storage.utils.ts +0 -25
  1094. package/src/app/shared/testing/observable.test.html +0 -53
  1095. package/src/app/shared/testing/observable.test.scss +0 -3
  1096. package/src/app/shared/testing/observable.test.ts +0 -117
  1097. package/src/app/shared/testing/tests.page.html +0 -30
  1098. package/src/app/shared/testing/tests.page.ts +0 -34
  1099. package/src/app/shared/toast/toast.testing.html +0 -42
  1100. package/src/app/shared/toast/toast.testing.module.ts +0 -32
  1101. package/src/app/shared/toast/toast.testing.ts +0 -58
  1102. package/src/app/shared/toast/toasts.ts +0 -183
  1103. package/src/app/shared/toolbar/modal-toolbar.html +0 -32
  1104. package/src/app/shared/toolbar/modal-toolbar.scss +0 -0
  1105. package/src/app/shared/toolbar/modal-toolbar.ts +0 -63
  1106. package/src/app/shared/toolbar/toolbar.html +0 -71
  1107. package/src/app/shared/toolbar/toolbar.module.ts +0 -35
  1108. package/src/app/shared/toolbar/toolbar.scss +0 -0
  1109. package/src/app/shared/toolbar/toolbar.ts +0 -254
  1110. package/src/app/shared/types.ts +0 -31
  1111. package/src/app/shared/upload-file/testing/upload-file.testing.html +0 -25
  1112. package/src/app/shared/upload-file/testing/upload-file.testing.module.ts +0 -32
  1113. package/src/app/shared/upload-file/testing/upload-file.testing.ts +0 -68
  1114. package/src/app/shared/upload-file/upload-file-popover.component.html +0 -43
  1115. package/src/app/shared/upload-file/upload-file-popover.component.scss +0 -6
  1116. package/src/app/shared/upload-file/upload-file-popover.component.ts +0 -115
  1117. package/src/app/shared/upload-file/upload-file.component.html +0 -46
  1118. package/src/app/shared/upload-file/upload-file.component.scss +0 -130
  1119. package/src/app/shared/upload-file/upload-file.component.ts +0 -218
  1120. package/src/app/shared/upload-file/upload-file.model.ts +0 -41
  1121. package/src/app/shared/validator/form-error-adapter.class.ts +0 -123
  1122. package/src/app/shared/validator/validators.ts +0 -639
  1123. package/src/app/shared/version/versions.ts +0 -91
  1124. package/src/app/social/job/job.module.ts +0 -26
  1125. package/src/app/social/job/progression/job-progression.component.html +0 -22
  1126. package/src/app/social/job/progression/job-progression.component.scss +0 -15
  1127. package/src/app/social/job/progression/job-progression.component.ts +0 -17
  1128. package/src/app/social/job/progression/job-progression.icon.html +0 -28
  1129. package/src/app/social/job/progression/job-progression.icon.scss +0 -5
  1130. package/src/app/social/job/progression/job-progression.icon.ts +0 -238
  1131. package/src/app/social/job/progression/job-progression.list.html +0 -21
  1132. package/src/app/social/job/progression/job-progression.list.scss +0 -17
  1133. package/src/app/social/job/progression/job-progression.list.ts +0 -49
  1134. package/src/app/social/job/progression/job-progression.model.ts +0 -28
  1135. package/src/app/social/job/progression/job-progression.service.ts +0 -86
  1136. package/src/app/social/job/testing/job-progression.testing.html +0 -20
  1137. package/src/app/social/job/testing/job-progression.testing.service.ts +0 -60
  1138. package/src/app/social/job/testing/job-progression.testing.ts +0 -51
  1139. package/src/app/social/job/testing/job.testing.module.ts +0 -22
  1140. package/src/app/social/message/message.form.html +0 -60
  1141. package/src/app/social/message/message.form.scss +0 -6
  1142. package/src/app/social/message/message.form.ts +0 -79
  1143. package/src/app/social/message/message.modal.html +0 -65
  1144. package/src/app/social/message/message.modal.ts +0 -118
  1145. package/src/app/social/message/message.model.ts +0 -81
  1146. package/src/app/social/message/message.module.ts +0 -22
  1147. package/src/app/social/message/message.service.ts +0 -88
  1148. package/src/app/social/social.errors.ts +0 -11
  1149. package/src/app/social/social.module.ts +0 -36
  1150. package/src/app/social/social.testing.module.ts +0 -40
  1151. package/src/app/social/user-event/notification/user-event-notification.icon.html +0 -16
  1152. package/src/app/social/user-event/notification/user-event-notification.icon.ts +0 -108
  1153. package/src/app/social/user-event/notification/user-event-notification.list.html +0 -135
  1154. package/src/app/social/user-event/notification/user-event-notification.list.scss +0 -73
  1155. package/src/app/social/user-event/notification/user-event-notification.list.ts +0 -287
  1156. package/src/app/social/user-event/testing/user-event.testing.html +0 -27
  1157. package/src/app/social/user-event/testing/user-event.testing.model.ts +0 -146
  1158. package/src/app/social/user-event/testing/user-event.testing.module.ts +0 -22
  1159. package/src/app/social/user-event/testing/user-event.testing.service.ts +0 -141
  1160. package/src/app/social/user-event/testing/user-event.testing.ts +0 -253
  1161. package/src/app/social/user-event/user-event.model.ts +0 -73
  1162. package/src/app/social/user-event/user-event.module.ts +0 -25
  1163. package/src/app/social/user-event/user-event.service.ts +0 -679
  1164. package/src/browserslist +0 -9
  1165. package/src/environments/environment.class.ts +0 -83
  1166. package/src/environments/environment.prod.ts +0 -47
  1167. package/src/environments/environment.test.ts +0 -90
  1168. package/src/environments/environment.ts +0 -108
  1169. package/src/favicon.ico +0 -0
  1170. package/src/global.scss +0 -27
  1171. package/src/index.html +0 -80
  1172. package/src/main.ts +0 -17
  1173. package/src/polyfills.ts +0 -68
  1174. package/src/schema.graphql +0 -3112
  1175. package/src/service-worker.js +0 -31
  1176. package/src/zone-flags.ts +0 -31
  1177. package/tsconfig.app.json +0 -15
  1178. package/tsconfig.json +0 -47
  1179. package/tsconfig.spec.json +0 -19
@@ -0,0 +1,1697 @@
1
+ import { Directive, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { MatPaginator } from '@angular/material/paginator';
3
+ import { MatSort } from '@angular/material/sort';
4
+ import { MatTable } from '@angular/material/table';
5
+ import { BehaviorSubject, EMPTY, merge, of, Subject, Subscription } from 'rxjs';
6
+ import { catchError, debounceTime, distinctUntilChanged, filter, first, mergeMap, startWith, switchMap, takeUntil, tap } from 'rxjs/operators';
7
+ import { SelectionModel } from '@angular/cdk/collections';
8
+ import { EntityUtils } from '../services/model/entity.model';
9
+ import { AlertController, ModalController, ToastController } from '@ionic/angular';
10
+ import { ActivatedRoute, Router } from '@angular/router';
11
+ import { TableSelectColumnsComponent } from './table-select-columns.component';
12
+ import { Location } from '@angular/common';
13
+ import { ErrorCodes } from '../services/errors';
14
+ import { AppFormUtils } from '../form/form.utils';
15
+ import { LocalSettingsService } from '../services/local-settings.service';
16
+ import { TranslateService } from '@ngx-translate/core';
17
+ import { MatAutocompleteConfigHolder } from '../../shared/material/autocomplete/material.autocomplete.config';
18
+ import { createPromiseEventEmitter, emitPromiseEvent } from '../../shared/events';
19
+ import { changeCaseToUnderscore, isEmptyArray, isNil, isNotNil, toBoolean } from '../../shared/functions';
20
+ import { waitFor, waitForFalse, waitForTrue } from '../../shared/observables';
21
+ import { Toasts } from '../../shared/toast/toasts';
22
+ import { Alerts } from '../../shared/alerts';
23
+ import { FormErrorTranslator } from '../../shared/validator/form-error-adapter.class';
24
+ import { DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_REQUIRED_COLUMNS, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, SETTINGS_DISPLAY_COLUMNS, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN } from './table.model';
25
+ import { AppTableUtils } from './table.utils';
26
+ import * as i0 from "@angular/core";
27
+ import * as i1 from "./entities-async-table-datasource.class";
28
+ // @dynamic
29
+ // noinspection DuplicatedCode
30
+ // eslint-disable-next-line @angular-eslint/directive-class-suffix
31
+ export class AppAsyncTable {
32
+ constructor(injector, columns, _dataSource, _filter) {
33
+ this.columns = columns;
34
+ this._dataSource = _dataSource;
35
+ this._filter = _filter;
36
+ this._initialized = false;
37
+ this._subscription = new Subscription();
38
+ this._cellValueChangesDefs = {};
39
+ this._enabled = true;
40
+ this.allowRowDetail = true;
41
+ this.destroySubject = new Subject();
42
+ this.excludesColumns = [];
43
+ this.totalRowCount = null;
44
+ this.readySubject = new BehaviorSubject(false);
45
+ this.loadingSubject = new BehaviorSubject(true);
46
+ this.savingSubject = new BehaviorSubject(false);
47
+ this.touchedSubject = new BehaviorSubject(false);
48
+ this.dirtySubject = new BehaviorSubject(false);
49
+ this.errorSubject = new BehaviorSubject(undefined);
50
+ this.selection = new SelectionModel(true, []);
51
+ this.permanentSelection = null;
52
+ this.permanentSelectionChangedPrevented = false;
53
+ this.i18nColumnPrefix = 'COMMON.';
54
+ this.autoLoad = true;
55
+ this.focusFirstColumn = false;
56
+ this.confirmBeforeDelete = false;
57
+ this.confirmBeforeCancel = false;
58
+ this.undoableDeletion = false;
59
+ this.propagateRowError = false;
60
+ this.permanentSelectionAllowed = false; // Allow keep selected rows over page change or sort change
61
+ this.defaultPageSize = DEFAULT_PAGE_SIZE;
62
+ this.defaultPageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS;
63
+ this.onRefresh = new EventEmitter();
64
+ this.onOpenRow = new EventEmitter();
65
+ this.onNewRow = new EventEmitter();
66
+ this.onStartEditingRow = new EventEmitter();
67
+ this.onConfirmEditCreateRow = new EventEmitter();
68
+ this.onCancelOrDeleteRow = new EventEmitter();
69
+ this.onBeforeDeleteRows = createPromiseEventEmitter();
70
+ this.onBeforeCancelRows = createPromiseEventEmitter();
71
+ this.onBeforeSave = createPromiseEventEmitter();
72
+ this.onAfterDeletedRows = new EventEmitter();
73
+ this.onSort = new EventEmitter();
74
+ this.onDirty = new EventEmitter();
75
+ this.onError = new EventEmitter();
76
+ this._paginator = null;
77
+ this.route = injector.get(ActivatedRoute);
78
+ this.router = injector.get(Router);
79
+ this.location = injector.get(Location);
80
+ this.settings = injector.get(LocalSettingsService);
81
+ this.translate = injector.get(TranslateService);
82
+ this.modalCtrl = injector.get(ModalController);
83
+ this.alertCtrl = injector.get(AlertController);
84
+ this.toastController = injector.get(ToastController);
85
+ this.formErrorAdapter = injector.get(FormErrorTranslator);
86
+ this.mobile = this.settings.mobile;
87
+ // Autocomplete fields
88
+ this._autocompleteConfigHolder = new MatAutocompleteConfigHolder({
89
+ getUserAttributes: (a, b) => this.settings.getFieldDisplayAttributes(a, b)
90
+ });
91
+ this.autocompleteFields = this._autocompleteConfigHolder.fields;
92
+ }
93
+ get error() {
94
+ return this.errorSubject.value;
95
+ }
96
+ set error(error) {
97
+ this.setError(error);
98
+ }
99
+ get firstUserColumn() {
100
+ return this.displayedColumns[RESERVED_START_COLUMNS.length];
101
+ }
102
+ get lastUserColumn() {
103
+ return this.displayedColumns[this.displayedColumns.length - RESERVED_END_COLUMNS.length - 1];
104
+ }
105
+ set dataSource(value) {
106
+ this.setDatasource(value);
107
+ }
108
+ get dataSource() {
109
+ return this._dataSource;
110
+ }
111
+ set filter(value) {
112
+ this.setFilter(value);
113
+ }
114
+ get filter() {
115
+ return this._filter;
116
+ }
117
+ get empty() {
118
+ return this.loading || this.totalRowCount === 0;
119
+ }
120
+ get selectedEntities() {
121
+ return this.permanentSelection?.selected
122
+ || AppTableUtils.getEntities(this.selection.selected);
123
+ }
124
+ get dirty() {
125
+ return this.dirtySubject.value;
126
+ }
127
+ get valid() {
128
+ return this.dataSource.getRows().every(row => row.editing ? row.valid : true);
129
+ }
130
+ get invalid() {
131
+ return this.dataSource.getRows().some(row => row.editing ? row.invalid : false);
132
+ }
133
+ get pending() {
134
+ return this.dataSource.getRows().some(row => row.editing ? row.pending : false);
135
+ }
136
+ get touched() {
137
+ return this.touchedSubject.value;
138
+ }
139
+ get untouched() {
140
+ return !this.touchedSubject.value;
141
+ }
142
+ disable(opts) {
143
+ if (this.sort)
144
+ this.sort.disabled = true;
145
+ this._enabled = false;
146
+ if (!opts || opts.emitEvent != false)
147
+ this.markForCheck();
148
+ }
149
+ enable(opts) {
150
+ if (this.sort)
151
+ this.sort.disabled = false;
152
+ this._enabled = true;
153
+ if (!opts || opts.emitEvent != false)
154
+ this.markForCheck();
155
+ }
156
+ get enabled() {
157
+ return this._enabled;
158
+ }
159
+ // FIXME: need to hidden buttons (in HTML), etc. when disabled
160
+ set disabled(value) {
161
+ if (value !== !this._enabled) {
162
+ if (value)
163
+ this.disable({ emitEvent: false });
164
+ else
165
+ this.enable({ emitEvent: false });
166
+ }
167
+ }
168
+ get disabled() {
169
+ return !this._enabled;
170
+ }
171
+ markAsDirty(opts) {
172
+ if (this.dirtySubject.value !== true) {
173
+ this.dirtySubject.next(true);
174
+ if (!opts || opts.emitEvent !== false) {
175
+ this.markForCheck();
176
+ }
177
+ }
178
+ }
179
+ markAsPristine(opts) {
180
+ if (this.dirtySubject.value !== false) {
181
+ this.dirtySubject.next(false);
182
+ if (!opts || opts.emitEvent !== false) {
183
+ this.markForCheck();
184
+ }
185
+ }
186
+ }
187
+ async markAsUntouched(opts) {
188
+ let needEmitEvent = false;
189
+ if (this.touchedSubject.value) {
190
+ this.touchedSubject.next(false);
191
+ needEmitEvent = true;
192
+ }
193
+ if (this.dirty || this.dataSource.hasSomeEditingRow()) {
194
+ for (const row of this.dataSource.getEditingRows()) {
195
+ // Cancel the current editing row only if editing and if it was not previously saved
196
+ await this.dataSource.cancelOrDelete(row);
197
+ // Check if row as pristine
198
+ await this.checkIfRowPristine(row, { onlySelf: true /* avoid propagation to table - done just after */ });
199
+ }
200
+ // Check if the table is pristine
201
+ await this.checkIfPristine({ emitEvent: false /*will be done just after*/ });
202
+ needEmitEvent = true;
203
+ }
204
+ this.previouslyEditedRowId = undefined;
205
+ if (needEmitEvent && (!opts || opts.emitEvent !== false))
206
+ this.markForCheck();
207
+ }
208
+ /**
209
+ * @deprecated prefer to use markAllAsTouched()
210
+ * @param opts
211
+ */
212
+ markAsTouched(opts) {
213
+ console.warn('TODO: Replace this call by markAllAsTouched() - because of changes in ngx-components >= 0.16.0');
214
+ if (this.dataSource.hasSomeEditingRow()) {
215
+ this.dataSource.getEditingRows().forEach(row => row.validator?.markAllAsTouched());
216
+ if (!opts || opts.emitEvent !== false) {
217
+ this.markForCheck();
218
+ }
219
+ }
220
+ }
221
+ markAllAsTouched(opts) {
222
+ if (this.touchedSubject.value !== true) {
223
+ this.touchedSubject.next(true);
224
+ if (!opts || opts.emitEvent !== false)
225
+ this.markForCheck();
226
+ }
227
+ if (this.dataSource.hasSomeEditingRow()) {
228
+ this.dataSource.getEditingRows().forEach(row => row.validator?.markAllAsTouched());
229
+ }
230
+ }
231
+ markAsSaving(opts) {
232
+ if (this.savingSubject.value !== true) {
233
+ this.focusColumn = undefined; // unselect focus column
234
+ this.savingSubject.next(true);
235
+ if (!opts || opts.emitEvent !== false)
236
+ this.markForCheck();
237
+ }
238
+ }
239
+ markAsSaved(opts) {
240
+ if (this.savingSubject.value !== false) {
241
+ this.savingSubject.next(false);
242
+ if (!opts || opts.emitEvent !== false)
243
+ this.markForCheck();
244
+ }
245
+ }
246
+ markAsLoading(opts) {
247
+ this.setLoading(true, opts);
248
+ }
249
+ markAsLoaded(opts) {
250
+ this.setLoading(false, opts);
251
+ }
252
+ markAsReady(opts) {
253
+ if (this.readySubject.value !== true) {
254
+ this.readySubject.next(true);
255
+ // If subclasses implements OnReady
256
+ if (typeof this['ngOnReady'] === 'function') {
257
+ this.ngOnReady();
258
+ }
259
+ }
260
+ }
261
+ get loading() {
262
+ return this.loadingSubject.value;
263
+ }
264
+ get loaded() {
265
+ return !this.loadingSubject.value;
266
+ }
267
+ enableSort() {
268
+ if (this.sort)
269
+ this.sort.disabled = false;
270
+ }
271
+ disableSort() {
272
+ if (this.sort)
273
+ this.sort.disabled = true;
274
+ }
275
+ set pageSize(value) {
276
+ this.defaultPageSize = value;
277
+ if (this.paginator) {
278
+ this.paginator.pageSize = value;
279
+ }
280
+ }
281
+ get pageSize() {
282
+ return this.paginator && this.paginator.pageSize || this.defaultPageSize || DEFAULT_PAGE_SIZE;
283
+ }
284
+ get pageOffset() {
285
+ return this.paginator && this.paginator.pageIndex * this.paginator.pageSize || 0;
286
+ }
287
+ get sortActive() {
288
+ return this.sort && this.sort.active;
289
+ }
290
+ get sortDirection() {
291
+ return this.sort && this.sort.direction && (this.sort.direction === 'desc' ? 'desc' : 'asc') || undefined;
292
+ }
293
+ set paginator(value) {
294
+ this._paginator = value;
295
+ }
296
+ get paginator() {
297
+ return this._paginator || this.childPaginator;
298
+ }
299
+ get destroyed() {
300
+ return this.destroySubject?.closed !== false;
301
+ }
302
+ ngOnInit() {
303
+ if (this._initialized)
304
+ return; // Init only once
305
+ this._initialized = true;
306
+ // Set defaults
307
+ this.readOnly = toBoolean(this.readOnly, this.dataSource?.config.readOnly || false); // read/write by default
308
+ this.inlineEdition = !this.readOnly && toBoolean(this.inlineEdition, false); // force to false when readonly
309
+ this.saveBeforeDelete = toBoolean(this.saveBeforeDelete, !this.readOnly); // force to false when readonly
310
+ this.saveBeforeSort = toBoolean(this.saveBeforeSort, !this.readOnly); // force to false when readonly
311
+ this.saveBeforeFilter = toBoolean(this.saveBeforeFilter, !this.readOnly); // force to false when readonly
312
+ this.keepEditedRowOnSave = toBoolean(this.keepEditedRowOnSave, this.inlineEdition);
313
+ this.errorTranslatorOptions = this.errorTranslatorOptions || { separator: ', ', controlPathTranslator: this }; // Can be override in subclasses constructors
314
+ // Check ask user confirmation is possible
315
+ if (this.confirmBeforeDelete && !this.alertCtrl)
316
+ throw Error('Missing \'alertCtrl\' or \'injector\' in component\'s constructor.');
317
+ // Defined unique id for settings for the page
318
+ this.settingsId = this.settingsId || this.generateTableId();
319
+ this.displayedColumns = this.getDisplayColumns();
320
+ // Load the sorted columns, from settings
321
+ {
322
+ const sortedColumn = this.getSortedColumn();
323
+ this.defaultSortBy = sortedColumn.id;
324
+ this.defaultSortDirection = sortedColumn.start;
325
+ }
326
+ this.defaultPageSize = this.getPageSize();
327
+ // Propagate error to event emitter
328
+ this.registerSubscription(this.errorSubject
329
+ .subscribe(value => this.onError.emit(value)));
330
+ // Propagate dirty to event emitter
331
+ this.registerSubscription(this.dirtySubject
332
+ .subscribe(value => this.onDirty.emit(value)));
333
+ // Propagate row dirty state to table
334
+ this.registerSubscription(this.onStartEditingRow
335
+ .pipe(filter(row => row?.validator && true), mergeMap(row => row.validator.valueChanges
336
+ .pipe(filter(row => row.dirty), first(),
337
+ // DEBUG
338
+ //tap(() => console.debug("Propagate row's dirty to table..."))
339
+ // Stop if next another row, or destroying
340
+ takeUntil(this.onStartEditingRow), takeUntil(this.destroySubject))))
341
+ .subscribe(() => this.markAsDirty()));
342
+ // Call datasource refresh, on each refresh events
343
+ this.registerSubscription(this.onRefresh
344
+ .pipe(startWith((this.autoLoad ? {} : 'skip')), switchMap((event) => {
345
+ this.dirtySubject.next(false);
346
+ this.selection.clear();
347
+ if (event === 'skip') {
348
+ return of(undefined);
349
+ }
350
+ if (!this._dataSource) {
351
+ if (this.debug)
352
+ console.debug('[table] Skipping data load: no dataSource defined');
353
+ return of(undefined);
354
+ }
355
+ if (this.debug)
356
+ console.debug('[table] Calling dataSource.watchAll()...');
357
+ return this._dataSource.watchAll(this.pageOffset, this.pageSize, this.sortActive, this.sortDirection, this._filter);
358
+ }), catchError(err => {
359
+ if (this.debug)
360
+ console.error(err);
361
+ this.setError(err && err.message || err);
362
+ return of(undefined); // Continue
363
+ }))
364
+ .subscribe(res => this.updateView(res)));
365
+ // Listen dataSource loading events
366
+ if (this._dataSource)
367
+ this.listenDatasourceLoading(this._dataSource);
368
+ // Permanent selection behavior
369
+ if (this.permanentSelectionAllowed)
370
+ this.initPermanentSelection();
371
+ }
372
+ ngAfterViewInit() {
373
+ // Detect when parent ngOnInit() not call
374
+ if (this.debug && !this.displayedColumns)
375
+ console.warn(`[table] Missing 'displayedColumns'. Did you call parent ngOnInit() in component ${this.constructor.name} ?`);
376
+ // Start listening sort and paginator events
377
+ // noinspection JSIgnoredPromiseFromCall
378
+ this.listenSortAndPaginationEvents();
379
+ }
380
+ ngOnDestroy() {
381
+ this._subscription.unsubscribe();
382
+ // Unsubscribe column value changes
383
+ Object.keys(this._cellValueChangesDefs).forEach(col => this.stopCellValueChanges(col, true));
384
+ this._cellValueChangesDefs = {};
385
+ this.readySubject.unsubscribe();
386
+ this.loadingSubject.unsubscribe();
387
+ this.savingSubject.unsubscribe();
388
+ this.errorSubject.unsubscribe();
389
+ this.dirtySubject.unsubscribe();
390
+ this.onRefresh.unsubscribe();
391
+ this.onOpenRow.unsubscribe();
392
+ this.onNewRow.unsubscribe();
393
+ this.onStartEditingRow.unsubscribe();
394
+ this.onConfirmEditCreateRow.unsubscribe();
395
+ this.onCancelOrDeleteRow.unsubscribe();
396
+ this.onBeforeDeleteRows.unsubscribe();
397
+ this.onBeforeCancelRows.unsubscribe();
398
+ this.onBeforeSave.unsubscribe();
399
+ this.onAfterDeletedRows.unsubscribe();
400
+ this.onSort.unsubscribe();
401
+ this.onDirty.unsubscribe();
402
+ this.onError.unsubscribe();
403
+ this.destroySubject.next();
404
+ this.destroySubject.unsubscribe();
405
+ }
406
+ async updateView(res, opts) {
407
+ if (!res)
408
+ return; // Skip (e.g error)
409
+ if (res && res.data) {
410
+ this.visibleRowCount = res.data.length;
411
+ this.totalRowCount = isNotNil(res.total) ? res.total : ((this.paginator && this.paginator.pageIndex * (this.paginator.pageSize || DEFAULT_PAGE_SIZE) || 0) + this.visibleRowCount);
412
+ if (this.debug)
413
+ console.debug(`[table] ${res.data.length} rows loaded`);
414
+ }
415
+ else {
416
+ //if (this.debug) console.debug('[table] NO rows loaded');
417
+ this.totalRowCount = 0;
418
+ this.visibleRowCount = 0;
419
+ }
420
+ if (!opts || opts.emitEvent !== false) {
421
+ await this.markAsUntouched({ emitEvent: false });
422
+ this.markAsPristine({ emitEvent: false });
423
+ this.markAsLoaded({ emitEvent: false });
424
+ }
425
+ this.markForCheck();
426
+ }
427
+ setDatasource(datasource) {
428
+ if (this._dataSource)
429
+ throw new Error('[table] dataSource already set !');
430
+ if (datasource && this._dataSource !== datasource) {
431
+ this._dataSource = datasource;
432
+ if (this._initialized)
433
+ this.listenDatasourceLoading(datasource);
434
+ }
435
+ }
436
+ resetDataSource() {
437
+ if (this._dataSourceLoadingSubscription) {
438
+ this._dataSourceLoadingSubscription.unsubscribe();
439
+ this._subscription.remove(this._dataSourceLoadingSubscription);
440
+ }
441
+ //this._dataSource?.close();
442
+ this._dataSource = null;
443
+ }
444
+ addColumnDef(column) {
445
+ this.table.addColumnDef(column);
446
+ }
447
+ removeColumnDef(column) {
448
+ this.table.removeColumnDef(column);
449
+ }
450
+ setFilter(filter, opts) {
451
+ opts = opts || { emitEvent: true };
452
+ // Prevent permanent selection change events
453
+ this.permanentSelectionChangedPrevented = toBoolean(opts.permanentSelectionChangedPrevented, this.permanentSelectionChangedPrevented);
454
+ if (this.saveBeforeFilter) {
455
+ // if a dirty table is to be saved before filter
456
+ if (this.dirty) {
457
+ // Save
458
+ this.saveBeforeAction('filter').then(saved => {
459
+ // Apply filter only if user didn't cancel the save or the save is ok
460
+ if (saved) {
461
+ this.applyFilter(filter, opts);
462
+ }
463
+ });
464
+ }
465
+ else {
466
+ // apply filter on non-dirty table
467
+ this.applyFilter(filter, opts);
468
+ }
469
+ }
470
+ else {
471
+ // apply filter directly
472
+ this.applyFilter(filter, opts);
473
+ }
474
+ }
475
+ async confirmAndAdd(event, row) {
476
+ if (!await this.confirmEditCreate(event, row)) {
477
+ return false;
478
+ }
479
+ // Add row
480
+ return this.addRow(event);
481
+ }
482
+ async confirmAndBackward(event, row) {
483
+ // Deleting edited row, if empty and not dirty
484
+ if (this.dataSource.hasSomeEditingRow()) {
485
+ for (const editingRow of this.dataSource.getEditingRows().filter(row => row.id === -1 && row.invalid && !row.dirty)) {
486
+ await this.deleteNewRow(event, editingRow);
487
+ }
488
+ // Wait deletion is done, then edit previous row (by id, because of reloading)
489
+ await this.waitIdle();
490
+ await this.editRowById(event, row.id, { focusColumn: this.lastUserColumn });
491
+ return true;
492
+ }
493
+ // Edit previous row
494
+ await this.editRow(event, row, { focusColumn: this.lastUserColumn });
495
+ return true;
496
+ }
497
+ async confirmAndForward(event, row) {
498
+ if (!this.inlineEdition)
499
+ return false;
500
+ const confirmed = await this.confirmEditCreate(event, row);
501
+ if (!confirmed)
502
+ return false; // Not confirmed
503
+ // Edit next row
504
+ await this.editRowById(event, row.id + 1, { focusColumn: this.firstUserColumn });
505
+ return true;
506
+ }
507
+ /**
508
+ * Confirm the creation of the given row, or if not specified the currently edited row
509
+ *
510
+ * @param event
511
+ * @param row
512
+ */
513
+ async confirmEditCreate(event, row) {
514
+ row = row || this.dataSource.getSingleEditingRow();
515
+ if (!row || !row.editing)
516
+ return true; // no row to confirm
517
+ // Stop event
518
+ event?.stopPropagation();
519
+ // Confirmation edition or creation
520
+ const confirmed = await row.confirmEditCreate();
521
+ if (confirmed) {
522
+ // Mark table as dirty (if row is dirty)
523
+ if (row.dirty) {
524
+ this.markAsDirty({ emitEvent: false /* because of resetError() */ });
525
+ }
526
+ // Clear error
527
+ this.resetError();
528
+ // Emit the confirm event
529
+ this.onConfirmEditCreateRow.next(row);
530
+ return true; // Continue
531
+ }
532
+ if (row.validator) {
533
+ // NOT confirmed = row has error
534
+ if (this.debug) {
535
+ console.warn('[table] Cannot confirm row, because invalid');
536
+ AppFormUtils.logFormErrors(row.validator, '[table] ');
537
+ }
538
+ // fix: mark all controls as touched to show errors
539
+ row.validator.markAllAsTouched();
540
+ // Compute row error, and propagate to table's error
541
+ if (this.propagateRowError) {
542
+ const error = this.getRowError(row);
543
+ this.setError(error);
544
+ }
545
+ }
546
+ // Not confirmed
547
+ return false;
548
+ }
549
+ async cancelOrDelete(event, row, opts) {
550
+ // Delete new row
551
+ if (row.id === -1) {
552
+ await this.deleteNewRow(event, row);
553
+ }
554
+ // Delete existing (but not editing) row
555
+ else if (!row.editing) {
556
+ await this.deleteExistingRow(event, row, opts);
557
+ }
558
+ // Cancel existing (and editing) row
559
+ else {
560
+ await this.cancelExistingRow(event, row, opts);
561
+ }
562
+ }
563
+ async addRow(event, insertAt, opts) {
564
+ if (this.debug)
565
+ console.debug('[table] Asking for new row...');
566
+ if (!this._enabled)
567
+ return false;
568
+ // Use modal if inline edition is disabled
569
+ if (!this.inlineEdition) {
570
+ await this.openNewRowDetail(event);
571
+ return false;
572
+ }
573
+ // Try to finish edited row first
574
+ if (!await this.confirmEditCreate()) {
575
+ return false;
576
+ }
577
+ // Add new row
578
+ const row = await this.addRowToTable(insertAt, opts);
579
+ return !!row;
580
+ }
581
+ async save(opts) {
582
+ opts = {
583
+ keepEditing: this.keepEditedRowOnSave,
584
+ ...opts
585
+ };
586
+ if (this.readOnly) {
587
+ throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
588
+ }
589
+ this.resetError();
590
+ // Keep edited row id (should be done BEFORE confirmEditCreate() )
591
+ const editedRow = this.dataSource.getSingleEditingRow();
592
+ this.previouslyEditedRowId = opts.keepEditing ? ((editedRow?.editing ? editedRow.id : undefined) || this.singleSelectedRow?.id) : undefined;
593
+ const previouslyEditedRowId = this.previouslyEditedRowId;
594
+ const previouslyEditedData = opts.keepEditing ? (isNotNil(previouslyEditedRowId) && editedRow?.currentData || this.singleSelectedRow?.currentData) : undefined;
595
+ if (!await this.confirmEditCreate()) {
596
+ throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
597
+ }
598
+ // Mark as saving
599
+ this.markAsSaving();
600
+ try {
601
+ // Calling service save()
602
+ if (this.debug)
603
+ console.debug('[table] Calling dataSource.save()...');
604
+ const isOK = await this._dataSource.save();
605
+ if (isOK)
606
+ this.markAsPristine();
607
+ return isOK;
608
+ }
609
+ catch (err) {
610
+ this.setError(err && err.message || err);
611
+ throw err;
612
+ }
613
+ finally {
614
+ this.markAsSaved();
615
+ // Restore previous row
616
+ if (isNotNil(previouslyEditedRowId)) {
617
+ await this.selectRowByIdOrData(previouslyEditedRowId, previouslyEditedData);
618
+ }
619
+ }
620
+ }
621
+ async cancel(event, opts) {
622
+ // Check confirmation
623
+ if ((!opts || opts.interactive !== false) && this.dirty && (this.confirmBeforeCancel || this.onBeforeCancelRows.observers.length > 0)) {
624
+ event?.stopPropagation();
625
+ if (!await this.canCancelRows()) {
626
+ return;
627
+ }
628
+ }
629
+ this.onRefresh.emit();
630
+ }
631
+ async duplicateRow(event, row, opts) {
632
+ event?.stopPropagation();
633
+ row = row || this.singleSelectedRow;
634
+ if (!row || !await this.confirmEditCreate(event, row)) {
635
+ return false;
636
+ }
637
+ const newRow = await this.addRowToTable(row.id + 1);
638
+ if (!newRow)
639
+ throw new Error('Cannot add new row to table');
640
+ const json = { ...row.currentData, id: null };
641
+ // Reset some properties (e.g. rankOrder, etc)
642
+ if (opts && opts.skipProperties) {
643
+ const newData = newRow.currentData;
644
+ opts.skipProperties.forEach(key => json[key] = newData[key]);
645
+ }
646
+ if (newRow.validator) {
647
+ newRow.validator.patchValue(json);
648
+ newRow.validator.markAsDirty();
649
+ }
650
+ else {
651
+ if (newRow.currentData?.fromObject) {
652
+ newRow.currentData.fromObject(json);
653
+ }
654
+ else {
655
+ newRow.currentData = json;
656
+ }
657
+ this.markAsDirty();
658
+ }
659
+ // select
660
+ await this.clickRow(undefined, newRow);
661
+ }
662
+ /** Whether the number of selected elements matches the total number of rows. */
663
+ isAllSelected() {
664
+ // DEBUG
665
+ //console.debug('isAllSelected. lengths', this.selection.selected.length, this.totalRowCount);
666
+ return this.selection.selected.length === this.totalRowCount ||
667
+ this.selection.selected.length === this.visibleRowCount;
668
+ }
669
+ /** Selects all rows if they are not all selected; otherwise clear selection. */
670
+ async masterToggle() {
671
+ if (this.loading)
672
+ return;
673
+ if (this.isAllSelected()) {
674
+ this.selection.clear();
675
+ }
676
+ else {
677
+ const rows = this._dataSource.getRows();
678
+ rows.forEach(row => this.selection.select(row));
679
+ }
680
+ }
681
+ async deleteSelection(event, opts) {
682
+ const deleteCount = await this.deleteRows(event, this.selection.selected, opts);
683
+ if (deleteCount > 0)
684
+ this.selection.clear();
685
+ return deleteCount;
686
+ }
687
+ /**
688
+ *
689
+ * @param event
690
+ * @param row
691
+ * @param opts Use interactive=false to avoid user interaction (e.g. user confirmation)
692
+ * And to force deletion even if table is busy
693
+ */
694
+ async deleteRow(event, row, opts) {
695
+ const deleteCount = await this.deleteRows(event, [row], opts);
696
+ return deleteCount === 1;
697
+ }
698
+ /**
699
+ *
700
+ * @param event
701
+ * @param rows
702
+ * @param opts Use interactive=false to avoid user interaction (e.g. user confirmation)
703
+ * And to force deletion even if table is busy
704
+ */
705
+ async deleteRows(event, rows, opts) {
706
+ if (this.readOnly) {
707
+ throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
708
+ }
709
+ if (event?.defaultPrevented)
710
+ return 0; // SKip
711
+ event?.preventDefault();
712
+ this.resetError();
713
+ if (!this._enabled || isEmptyArray(rows))
714
+ return 0; // Skip is disabled, or no rows to delete
715
+ if (this.loading && (!opts || opts.interactive !== false)) {
716
+ console.warn('[app-table] Skip deleteRows() because table is busy (loading). Use opts.interactive = false to force deletion');
717
+ return 0; // Skip if loading
718
+ }
719
+ // Make sure to keep newly created row
720
+ const editedRow = this.dataSource.getSingleEditingRow();
721
+ if (editedRow?.id === -1 && editedRow.editing && !rows.includes(editedRow)) {
722
+ const confirmed = await this.confirmEditCreate();
723
+ if (!confirmed)
724
+ return 0; // Cannot delete (e.g. edited row is invalid)
725
+ }
726
+ // Check if it can delete
727
+ const canDelete = await this.canDeleteRows(rows, opts);
728
+ if (!canDelete)
729
+ return 0; // Cannot delete
730
+ // Reverse row order (on a copy)
731
+ // This is a workaround, need because row.delete() has async execution
732
+ // and index cache is updated with a delay
733
+ let tempRows = rows.slice()
734
+ .sort((a, b) => a.id > b.id ? -1 : 1);
735
+ const deletedRows = [];
736
+ // If data need to be saved first
737
+ if (this.saveBeforeDelete) {
738
+ // Exclude invalid rows (because of save() will fail, when exists some invalid rows)
739
+ tempRows = tempRows.filter(row => {
740
+ // Delete the row :
741
+ // - if newly created row (id = -1),
742
+ // - or if invalid and not editing (= not cancellable)
743
+ if (row.id === -1 || (!row.editing && row.invalid /*do not use !valid because if row is disabled, it will be always !valid */)) {
744
+ if (this.debug)
745
+ console.debug(`[table] Delete row #${row.id}`);
746
+ row.delete();
747
+ this.visibleRowCount--;
748
+ this.totalRowCount--;
749
+ deletedRows.push(row);
750
+ return false; // Exclude from the list to delete using the service
751
+ }
752
+ // Cancel the row (and mark as pristine), when not valid but in edition
753
+ else if (row.editing && !row.valid) {
754
+ row.cancel();
755
+ // Mark row as pristine (if possible)
756
+ this.checkIfRowPristine(row, { emitEvent: false, onlySelf: true /*avoid propagation to table*/ });
757
+ return true; // Keep the row. the row will be deleted after the save
758
+ }
759
+ return true;
760
+ });
761
+ // Apply save, only if there is still some rows to delete
762
+ // WARN: If no more rows (e.g. because all has been cancelled) then continue anyway to clear editedRow and selection (issue IMAGINE-669)
763
+ if (deletedRows.length || tempRows.length) {
764
+ // Save data (e.g. when using memory service)
765
+ const saved = await this.saveBeforeAction('delete');
766
+ if (!saved) {
767
+ // Stop if save cancelled or save failed
768
+ return;
769
+ }
770
+ }
771
+ }
772
+ try {
773
+ // Apply deletion on datasource
774
+ // If no more rows to delete, continue anyway to clear editedRow and selection (issue IMAGINE-669)
775
+ if (tempRows.length) {
776
+ if (this.debug)
777
+ console.debug(`[table] Delete ${tempRows.length} rows...`);
778
+ await this._dataSource.deleteAll(tempRows);
779
+ }
780
+ // DO not update manually, because watchALl().subscribe() will update this count
781
+ //this.totalRowCount -= deleteCount;
782
+ //this.visibleRowCount -= deleteCount;
783
+ this.selection.clear();
784
+ this.markAsDirty({ emitEvent: false /*markForCheck() is called just after*/ });
785
+ this.markForCheck();
786
+ this.onAfterDeletedRows.next(rows);
787
+ return rows.length;
788
+ }
789
+ catch (err) {
790
+ this.setError(err && err.message || err);
791
+ throw err;
792
+ }
793
+ }
794
+ async selectRowById(id) {
795
+ if (id === undefined)
796
+ return false;
797
+ await this.waitIdle();
798
+ const row = this.dataSource.getRow(id);
799
+ if (!row)
800
+ return false;
801
+ return this.clickRow(null, row);
802
+ }
803
+ /**
804
+ * Try to select row by data. Will use dataEquals() (that call EntityUtils.equals()) to find same row's data
805
+ *
806
+ * @param data
807
+ */
808
+ async selectRowByData(data) {
809
+ if (data === undefined)
810
+ return Promise.resolve(false);
811
+ await this.waitIdle();
812
+ const row = this.dataSource.getRows()
813
+ .find(row => this.equals(row.currentData, data));
814
+ if (!row)
815
+ return false;
816
+ return this.clickRow(null, row);
817
+ }
818
+ async clickRow(event, row) {
819
+ if (this.loading) {
820
+ // Wait while loading, and loop
821
+ if (this.debug)
822
+ console.debug('[table] Waiting before apply clickRow() (datasource is busy)...');
823
+ await this.waitIdle({ timeout: 2000 });
824
+ }
825
+ // DEBUG
826
+ //console.debug("[table] Detect click on row");
827
+ // Cancelled by event
828
+ if (event?.defaultPrevented) {
829
+ if (this.debug)
830
+ console.debug('[table] clickRow event is defaultPrevented');
831
+ return false;
832
+ }
833
+ // Already in edition
834
+ if (row.id === -1 || row.editing) {
835
+ if (this.debug)
836
+ console.debug('[table] Row already editing. Skip clickRow event');
837
+ return true;
838
+ }
839
+ // Open the detail page (if not inline editing)
840
+ if (!this.inlineEdition) {
841
+ if (event) {
842
+ event.stopPropagation();
843
+ event.preventDefault();
844
+ }
845
+ this.markAsLoading();
846
+ this.selection.clear();
847
+ this.openRow(row.currentData.id, row)
848
+ .then(() => this.markAsLoaded())
849
+ .catch(() => this.markAsLoaded());
850
+ return true;
851
+ }
852
+ // Start editing row
853
+ return this.editRow(event, row, { focusColumn: undefined /*force to use the click target*/ });
854
+ }
855
+ async moveRow(id, direction) {
856
+ await this.dataSource.move(id, direction);
857
+ }
858
+ ready(opts) {
859
+ return waitForTrue(this.readySubject, opts);
860
+ }
861
+ waitIdle(opts) {
862
+ return waitForFalse(this.loadingSubject, opts);
863
+ }
864
+ async openSelectColumnsModal(event) {
865
+ event?.preventDefault();
866
+ // Copy current columns (deep copy)
867
+ const columns = this.getCurrentColumns();
868
+ const hasTopModal = !!(await this.modalCtrl.getTop());
869
+ const modal = await this.modalCtrl.create({
870
+ component: TableSelectColumnsComponent,
871
+ componentProps: { columns },
872
+ cssClass: hasTopModal && 'stack-modal'
873
+ });
874
+ // Open the modal
875
+ await modal.present();
876
+ // On dismiss
877
+ const { data } = await modal.onDidDismiss();
878
+ if (!data)
879
+ return; // CANCELLED
880
+ // Apply columns
881
+ const userColumns = (data || []).filter(c => c.canHide === false || c.visible).map(c => c.name) || [];
882
+ this.displayedColumns = RESERVED_START_COLUMNS.concat(userColumns).concat(RESERVED_END_COLUMNS);
883
+ this.markForCheck();
884
+ // Update user settings
885
+ await this.savePageSettings(userColumns, SETTINGS_DISPLAY_COLUMNS);
886
+ }
887
+ trackByFn(index, row) {
888
+ return row.id;
889
+ }
890
+ doRefresh(event) {
891
+ this.onRefresh.emit(event);
892
+ // When target wait for a complete (e.g. IonRefresher)
893
+ if (event?.target && event.target.complete) {
894
+ setTimeout(async () => {
895
+ await this.waitIdle();
896
+ event.target.complete();
897
+ });
898
+ }
899
+ }
900
+ getCurrentColumns() {
901
+ const hiddenColumns = this.columns.slice(RESERVED_START_COLUMNS.length)
902
+ .filter(name => this.displayedColumns.indexOf(name) === -1);
903
+ return this.displayedColumns
904
+ .concat(hiddenColumns)
905
+ .filter(name => !RESERVED_START_COLUMNS.includes(name) && !RESERVED_END_COLUMNS.includes(name)
906
+ && !this.excludesColumns.includes(name))
907
+ .map(name => ({
908
+ name,
909
+ label: this.getI18nColumnName(name),
910
+ visible: this.displayedColumns.indexOf(name) !== -1,
911
+ canHide: this.getRequiredColumns().indexOf(name) === -1
912
+ }));
913
+ }
914
+ async escapeEditingRow(event, row) {
915
+ row = row || this.dataSource.getSingleEditingRow();
916
+ if (!row || !row.editing)
917
+ return;
918
+ // DEBUG
919
+ //console.debug('[app-table] Cancel the row (keydown.escape)');
920
+ if (event) {
921
+ // Avoid to cancel the editor
922
+ event.preventDefault();
923
+ event.stopPropagation();
924
+ }
925
+ // If new row (no id)
926
+ if (row.id === -1) {
927
+ if (row.validator) {
928
+ // If pending: Wait end of validation, then loop
929
+ if (row.pending) {
930
+ await AppFormUtils.waitWhilePending(row.validator);
931
+ }
932
+ // Row is invalid: delete the row
933
+ if (row.invalid) {
934
+ await this.deleteNewRow(event, row);
935
+ return;
936
+ }
937
+ }
938
+ }
939
+ // If the row exists (has an id)
940
+ else {
941
+ // need to call cancel function (if confirmation will be called before)
942
+ if (this.confirmBeforeCancel) {
943
+ await this.cancelExistingRow(event, row, { keepEditing: false });
944
+ return;
945
+ }
946
+ }
947
+ // By default, try to confirm the row
948
+ await this.confirmEditCreate(event, row);
949
+ }
950
+ translateControlPath(path) {
951
+ // Can be overridden by subclasses, to resolve all field name
952
+ // Use columns key, has default name
953
+ const i18nColumnKey = this.getI18nColumnName(path);
954
+ return this.translate?.instant(i18nColumnKey) || i18nColumnKey;
955
+ }
956
+ /* -- protected method -- */
957
+ async editRow(event, row, opts) {
958
+ if (!this._enabled || !this.inlineEdition)
959
+ return false;
960
+ if (this.dataSource.getEditingRows().includes(row))
961
+ return true; // Already the edited row
962
+ if (event?.defaultPrevented)
963
+ return false;
964
+ if (!await this.confirmEditCreate()) {
965
+ return false;
966
+ }
967
+ if (!row.editing && !this.loading) {
968
+ this.focusColumn = opts && opts.focusColumn || this.focusColumn;
969
+ await this._dataSource.startEdit(row);
970
+ }
971
+ this.onStartEditingRow.emit(row);
972
+ return true;
973
+ }
974
+ /**
975
+ * Try to select row, by row.id, or by data. WIll use EntityUtils.equals()
976
+ *
977
+ * @param id
978
+ * @param data
979
+ * @protected
980
+ */
981
+ async selectRowByIdOrData(id, data) {
982
+ let done = false;
983
+ try {
984
+ // Select by row id (if NOT a new row)
985
+ if (isNotNil(id) || id !== -1) {
986
+ done = await this.selectRowById(id);
987
+ if (done)
988
+ return true;
989
+ console.warn('[app-table] Save: Cannot reselect row by row.id: ', id);
990
+ }
991
+ // Try by data
992
+ if (data) {
993
+ done = await this.selectRowByData(data);
994
+ if (done)
995
+ return true;
996
+ console.warn('[app-table] Save: Cannot reselect row by data: ', data);
997
+ }
998
+ return false;
999
+ }
1000
+ catch (err) {
1001
+ // Log, but continue
1002
+ console.error(err && err.message || err);
1003
+ return false;
1004
+ }
1005
+ }
1006
+ /**
1007
+ * return the selected row if unique in selection
1008
+ */
1009
+ get singleSelectedRow() {
1010
+ return this.selection.selected?.length === 1 ? this.selection.selected[0] : undefined;
1011
+ }
1012
+ async canDeleteRows(rows, opts) {
1013
+ // Check using emitter
1014
+ if (this.onBeforeDeleteRows.observers.length > 0) {
1015
+ try {
1016
+ const canDelete = await emitPromiseEvent(this.onBeforeDeleteRows, 'canDelete', {
1017
+ detail: { rows }
1018
+ });
1019
+ if (!canDelete)
1020
+ return false;
1021
+ }
1022
+ catch (err) {
1023
+ if (err === 'CANCELLED')
1024
+ return false; // User cancel
1025
+ console.error('Error while checking if can delete rows', err);
1026
+ throw err;
1027
+ }
1028
+ }
1029
+ // Ask user confirmation
1030
+ if (this.confirmBeforeDelete && (!opts || opts.interactive !== false)) {
1031
+ return this.askDeleteConfirmation(null, rows);
1032
+ }
1033
+ return true;
1034
+ }
1035
+ async canCancelRows(rows, opts) {
1036
+ // Get dirty rows
1037
+ rows = rows || this.dataSource.getRows().filter(row => row.validator?.dirty);
1038
+ if (isEmptyArray(rows))
1039
+ return true; // No dirty: OK
1040
+ // Check using emitter
1041
+ if (this.onBeforeCancelRows.observers.length > 0) {
1042
+ try {
1043
+ const isCancel = await emitPromiseEvent(this.onBeforeCancelRows, 'canCancel', {
1044
+ detail: { rows }
1045
+ });
1046
+ if (!isCancel)
1047
+ return false;
1048
+ }
1049
+ catch (err) {
1050
+ if (err === 'CANCELLED')
1051
+ return false; // User cancel
1052
+ console.error('Error while checking if can cancel rows', err);
1053
+ throw err;
1054
+ }
1055
+ }
1056
+ // Ask user confirmation
1057
+ if (this.confirmBeforeCancel && (!opts || opts.interactive !== false)) {
1058
+ return this.askCancelConfirmation(null, rows);
1059
+ }
1060
+ return true;
1061
+ }
1062
+ async saveBeforeAction(saveAction) {
1063
+ if (!this.dirty) {
1064
+ // Continue without save
1065
+ return true;
1066
+ }
1067
+ let save;
1068
+ switch (saveAction) {
1069
+ case 'delete':
1070
+ save = this.saveBeforeDelete;
1071
+ break;
1072
+ case 'filter':
1073
+ save = this.saveBeforeFilter;
1074
+ break;
1075
+ case 'sort':
1076
+ save = this.saveBeforeSort;
1077
+ break;
1078
+ default:
1079
+ save = true;
1080
+ }
1081
+ // Default behavior
1082
+ let confirmed = true;
1083
+ if (save) {
1084
+ if (this.onBeforeSave.observers.length > 0) {
1085
+ // Ask confirmation
1086
+ try {
1087
+ const res = await emitPromiseEvent(this.onBeforeSave, 'beforeSave', {
1088
+ detail: { action: saveAction, valid: this.valid }
1089
+ });
1090
+ confirmed = res.confirmed;
1091
+ save = res.save;
1092
+ }
1093
+ catch (err) {
1094
+ if (err === 'CANCELLED')
1095
+ return false; // User cancel
1096
+ console.error('Error while checking if can delete rows', err);
1097
+ throw err;
1098
+ }
1099
+ }
1100
+ }
1101
+ if (confirmed) {
1102
+ if (save) {
1103
+ // User confirmed save
1104
+ const saved = await this.save();
1105
+ this.markAsDirty(); // Restore dirty flag
1106
+ return saved;
1107
+ }
1108
+ return true; // No save but continue action
1109
+ }
1110
+ return false; // User cancel the action
1111
+ }
1112
+ /**
1113
+ * Open a row detail view. By default, will to open row detail page.
1114
+ * Can be overridden by subclasses, BUT prefer to subscribe on onOpenRow
1115
+ *
1116
+ * @param id
1117
+ * @param row
1118
+ * @protected
1119
+ */
1120
+ async openRow(id, row) {
1121
+ if (this.allowRowDetail) {
1122
+ if (this.debug && this.dirty) {
1123
+ console.warn('[table] Opening row details, but table has unsaved changes!');
1124
+ }
1125
+ if (this.onOpenRow.observers.length) {
1126
+ this.onOpenRow.emit(row);
1127
+ return true;
1128
+ }
1129
+ // No ID defined: unable to open details
1130
+ if (isNil(id)) {
1131
+ console.warn('[table] Opening row details, but data has no id!');
1132
+ return false;
1133
+ }
1134
+ return this.router.navigate(['.', id.toString()], {
1135
+ relativeTo: this.route,
1136
+ queryParams: {}
1137
+ });
1138
+ }
1139
+ return false;
1140
+ }
1141
+ async openNewRowDetail(event) {
1142
+ if (!this.allowRowDetail)
1143
+ return false;
1144
+ if (this.onNewRow.observers.length > 0) {
1145
+ this.onNewRow.emit(event);
1146
+ return true;
1147
+ }
1148
+ return await this.router.navigate(['new'], {
1149
+ relativeTo: this.route
1150
+ });
1151
+ }
1152
+ // can be overridden to add more required columns
1153
+ getRequiredColumns() {
1154
+ return DEFAULT_REQUIRED_COLUMNS;
1155
+ }
1156
+ getUserColumns() {
1157
+ return this.getPageSettings(SETTINGS_DISPLAY_COLUMNS);
1158
+ }
1159
+ getSortedColumn() {
1160
+ const data = this.getPageSettings(SETTINGS_SORTED_COLUMN);
1161
+ const parts = data && data.split(':');
1162
+ if (parts && parts.length === 2 && this.columns.includes(parts[0])) {
1163
+ return { id: parts[0], start: parts[1] === 'desc' ? 'desc' : 'asc', disableClear: false };
1164
+ }
1165
+ if (this.defaultSortBy) {
1166
+ return { id: this.defaultSortBy, start: this.defaultSortDirection || 'asc', disableClear: false };
1167
+ }
1168
+ return { id: 'id', start: 'asc', disableClear: false };
1169
+ }
1170
+ getPageSize() {
1171
+ const pageSize = this.getPageSettings(SETTINGS_PAGE_SIZE);
1172
+ return pageSize || this.defaultPageSize;
1173
+ }
1174
+ getDisplayColumns() {
1175
+ let userColumns = this.getUserColumns();
1176
+ // No user override
1177
+ if (!userColumns) {
1178
+ // Return default, without columns to hide
1179
+ return this.columns.filter(column => !this.excludesColumns.includes(column));
1180
+ }
1181
+ // Get fixed start columns
1182
+ const fixedStartColumns = this.columns.filter(c => RESERVED_START_COLUMNS.includes(c));
1183
+ // Remove end columns
1184
+ const fixedEndColumns = this.columns.filter(c => RESERVED_END_COLUMNS.includes(c));
1185
+ // Remove fixed columns from user columns
1186
+ userColumns = userColumns.filter(c => !fixedStartColumns.includes(c) && !fixedEndColumns.includes(c) && this.columns.includes(c));
1187
+ // Add required columns if missing
1188
+ userColumns.push(...this.getRequiredColumns().filter(c => !fixedStartColumns.includes(c) && !fixedEndColumns.includes(c) && !userColumns.includes(c)));
1189
+ return fixedStartColumns
1190
+ .concat(userColumns)
1191
+ .concat(fixedEndColumns)
1192
+ // Remove columns to hide
1193
+ .filter(column => !this.excludesColumns.includes(column));
1194
+ }
1195
+ /**
1196
+ * Recompute display columns
1197
+ *
1198
+ * @protected
1199
+ */
1200
+ updateColumns() {
1201
+ this.displayedColumns = this.getDisplayColumns();
1202
+ if (!this.loading)
1203
+ this.markForCheck();
1204
+ }
1205
+ registerSubscription(sub) {
1206
+ this._subscription.add(sub);
1207
+ }
1208
+ unregisterSubscription(sub) {
1209
+ this._subscription.remove(sub);
1210
+ }
1211
+ registerAutocompleteField(fieldName, options) {
1212
+ return this._autocompleteConfigHolder.add(fieldName, options);
1213
+ }
1214
+ getI18nColumnName(columnName) {
1215
+ return (this.i18nColumnPrefix || '') + changeCaseToUnderscore(columnName).toUpperCase();
1216
+ }
1217
+ generateTableId() {
1218
+ // noinspection JSNonASCIINames
1219
+ const id = this.location.path(true)
1220
+ .replace(/[?].*$/g, '')
1221
+ .replace(/\/\d+/g, '_id')
1222
+ + '_'
1223
+ // Get a component unique name - See https://stackoverflow.com/questions/60114682/how-to-access-components-unique-encapsulation-id-in-angular-9
1224
+ + (this.constructor['ɵcmp']?.id || this.constructor.name);
1225
+ //if (this.debug) console.debug("[table] id = " + id);
1226
+ return id;
1227
+ }
1228
+ async addRowToTable(insertAt, opts) {
1229
+ // Try to finish edited row first
1230
+ if (!await this.confirmEditCreate()) {
1231
+ console.warn('[table] Cannot add new row, because the previous edited row cannot be confirmed');
1232
+ return undefined;
1233
+ }
1234
+ const editing = this.inlineEdition && (!opts || opts.editing !== false); // true by default, if inlineEdition
1235
+ const row = await this._dataSource.createNew(insertAt, { editing });
1236
+ if (!row)
1237
+ return undefined;
1238
+ if (row.editing) {
1239
+ // Update focused column
1240
+ this.focusFirstColumn = true;
1241
+ this.focusColumn = opts?.focusColumn || this.firstUserColumn;
1242
+ // Emit start editing event
1243
+ this.onStartEditingRow.emit(row);
1244
+ }
1245
+ this.totalRowCount++;
1246
+ this.visibleRowCount++;
1247
+ this.markAsDirty({ emitEvent: false /*markForCheck() is called just after*/ });
1248
+ // Emit event
1249
+ if (!opts || opts.emitEvent !== false)
1250
+ this.markForCheck();
1251
+ return row;
1252
+ }
1253
+ registerCellValueChanges(name, formPath, emitInitialValue) {
1254
+ formPath = formPath || name;
1255
+ emitInitialValue = emitInitialValue || false;
1256
+ let def = this._cellValueChangesDefs[name];
1257
+ if (def && (def.formPath !== formPath || def.emitInitialValue !== emitInitialValue)) {
1258
+ throw Error('Already register a cell value change for this name, with different \'formPath\' or \'emitInitialValue\'. Please use same arguments.');
1259
+ }
1260
+ // Not exists: register new definition
1261
+ if (!def) {
1262
+ if (this.debug)
1263
+ console.debug(`[table] New listener {${name}} for value changes on path ${formPath}`);
1264
+ def = {
1265
+ subject: new Subject(),
1266
+ subscription: null,
1267
+ formPath,
1268
+ emitInitialValue
1269
+ };
1270
+ this._cellValueChangesDefs[name] = def;
1271
+ // Start the listener, when editing starts
1272
+ this.registerSubscription(this.onStartEditingRow.subscribe(row => this.startCellValueChanges(name, row)));
1273
+ }
1274
+ return def.subject;
1275
+ }
1276
+ setShowColumn(columnName, show, opts) {
1277
+ if (!this.excludesColumns.includes(columnName) !== show) {
1278
+ if (!show) {
1279
+ this.excludesColumns.push(columnName);
1280
+ }
1281
+ else {
1282
+ const index = this.excludesColumns.findIndex(value => value === columnName);
1283
+ if (index >= 0)
1284
+ this.excludesColumns.splice(index, 1);
1285
+ }
1286
+ // Recompute display columns
1287
+ if (this.displayedColumns && (!opts || opts.emitEvent !== false)) {
1288
+ this.updateColumns();
1289
+ }
1290
+ }
1291
+ }
1292
+ getShowColumn(columnName) {
1293
+ return !this.excludesColumns.includes(columnName);
1294
+ }
1295
+ startsWithUpperCase(input, search) {
1296
+ return input && input.toUpperCase().startsWith(search);
1297
+ }
1298
+ markForCheck() {
1299
+ // Should be overridden by subclasses, depending on ChangeDetectionStrategy
1300
+ }
1301
+ async askDeleteConfirmation(event, rows) {
1302
+ if (this.undoableDeletion) {
1303
+ // Special message, for undoable deletion
1304
+ return Alerts.askConfirmation(rows?.length === 1 ? 'CONFIRM.DELETE_ROW' : 'CONFIRM.DELETE_ROWS', this.alertCtrl, this.translate, event);
1305
+ }
1306
+ // Immediate deletion action
1307
+ return Alerts.askActionConfirmation(this.alertCtrl, this.translate, true, event);
1308
+ }
1309
+ async askCancelConfirmation(event, rows) {
1310
+ return Alerts.askConfirmation(rows?.length === 1 ? 'CONFIRM.CANCEL_ROW' : 'CONFIRM.CANCEL_ROWS', this.alertCtrl, this.translate, event);
1311
+ }
1312
+ async askRestoreConfirmation(event) {
1313
+ return Alerts.askActionConfirmation(this.alertCtrl, this.translate, false, event);
1314
+ }
1315
+ async showToast(opts) {
1316
+ if (!this.toastController)
1317
+ throw new Error('Missing toastController in component\'s constructor');
1318
+ return Toasts.show(this.toastController, this.translate, opts);
1319
+ }
1320
+ resetError(opts) {
1321
+ this.setError(undefined, opts);
1322
+ }
1323
+ getRowError(row, opts) {
1324
+ row = row || this.dataSource.getSingleEditingRow();
1325
+ if (!row || !this.formErrorAdapter)
1326
+ return undefined;
1327
+ return this.formErrorAdapter.translateFormErrors(row.validator, {
1328
+ ...this.errorTranslatorOptions,
1329
+ ...opts
1330
+ });
1331
+ }
1332
+ setError(value, opts) {
1333
+ if (this.errorSubject.value !== value) {
1334
+ this.errorSubject.next(value);
1335
+ if (!opts || opts.emitEvent !== false) {
1336
+ this.markForCheck();
1337
+ }
1338
+ }
1339
+ }
1340
+ /**
1341
+ * Compare data equality (default by id)
1342
+ * Can be overridden to add additional properties to compare
1343
+ *
1344
+ * @param d1
1345
+ * @param d2
1346
+ * @protected
1347
+ */
1348
+ equals(d1, d2) {
1349
+ return EntityUtils.equals(d1, d2, 'id');
1350
+ }
1351
+ markRowAsDirty(row, opts) {
1352
+ row = row || this.dataSource.getSingleEditingRow();
1353
+ if (row)
1354
+ row.validator?.markAsDirty(opts);
1355
+ this.markAsDirty(opts);
1356
+ }
1357
+ getPageSettings(propertyName) {
1358
+ return this.settings.getPageSettings(this.settingsId, propertyName);
1359
+ }
1360
+ async savePageSettings(value, propertyName) {
1361
+ await this.settings.savePageSetting(this.settingsId, value, propertyName);
1362
+ }
1363
+ /* -- private method -- */
1364
+ async listenSortAndPaginationEvents() {
1365
+ if (!this.table) {
1366
+ // DEBUG only -- alert user that table not found in template
1367
+ if (this.debug) {
1368
+ setTimeout(() => !this.table && console.warn(`[table] Missing <mat-table> in the HTML template (after waiting 500ms)! Component: ${this.constructor.name}`), 500);
1369
+ }
1370
+ // Make sure to wait the table
1371
+ await waitFor(() => !!this.table, { stop: this.destroySubject, stopError: false /*avoid error when destorying the table*/ });
1372
+ }
1373
+ this.registerSubscription(merge(
1374
+ // Listen sort events
1375
+ this.sort && this.sort.sortChange
1376
+ .pipe(filter(() => !this.sort.disabled), mergeMap(async () => this.saveBeforeAction('sort')), filter(res => res === true),
1377
+ // Save sort in settings
1378
+ tap(() => {
1379
+ const value = [this.sort.active, this.sort.direction || 'asc'].join(':');
1380
+ this.savePageSettings(value, SETTINGS_SORTED_COLUMN);
1381
+ }))
1382
+ || EMPTY,
1383
+ // Listen paginator events
1384
+ this.paginator && this.paginator.page
1385
+ .pipe(mergeMap((_) => this.saveBeforeAction('sort')), filter(saved => saved === true),
1386
+ // Save page size in settings
1387
+ tap(() => this.savePageSettings(this.paginator.pageSize, SETTINGS_PAGE_SIZE))) || EMPTY)
1388
+ // Refresh on any sort or paginator events
1389
+ .subscribe(value => {
1390
+ this.onSort.emit(value);
1391
+ this.onRefresh.emit(value);
1392
+ }));
1393
+ // If the user changes the sort order, reset back to the first page.
1394
+ if (this.sort && this.paginator) {
1395
+ this.registerSubscription(this.sort.sortChange
1396
+ .pipe(filter(() => !this.sort.disabled))
1397
+ .subscribe(() => this.paginator.pageIndex = 0));
1398
+ }
1399
+ }
1400
+ async editRowById(event, id, opts) {
1401
+ if (id < 0)
1402
+ return;
1403
+ if (id >= this.visibleRowCount) {
1404
+ await this.addRow(event, undefined, { ...opts, editing: true });
1405
+ }
1406
+ else {
1407
+ const row = await this.dataSource.getRow(id);
1408
+ await this.editRow(event, row, opts);
1409
+ }
1410
+ }
1411
+ setLoading(value, opts) {
1412
+ if (this.loadingSubject.value !== value) {
1413
+ this.loadingSubject.next(value);
1414
+ if (!opts || opts.emitEvent !== false) {
1415
+ this.markForCheck();
1416
+ }
1417
+ }
1418
+ }
1419
+ async deleteNewRow(event, row) {
1420
+ if (row.id !== -1)
1421
+ throw new Error('Row must have id = -1');
1422
+ event?.stopPropagation();
1423
+ this.selection.clear();
1424
+ await this._dataSource.cancelOrDelete(row);
1425
+ this.onCancelOrDeleteRow.next(row);
1426
+ this.resetError();
1427
+ this.totalRowCount--;
1428
+ this.visibleRowCount--;
1429
+ }
1430
+ async deleteExistingRow(event, row, opts) {
1431
+ // Make sure row will be cancelled, and NOT deleted
1432
+ if (row.id === -1)
1433
+ throw new Error('Row must have an id');
1434
+ if (event?.defaultPrevented)
1435
+ return 0; // SKip
1436
+ event?.preventDefault();
1437
+ await this.deleteRow(null, row, opts);
1438
+ }
1439
+ async cancelExistingRow(event, row, opts) {
1440
+ // Make sure row will be cancelled, and NOT deleted
1441
+ if (row.id === -1 || !row.editing)
1442
+ throw new Error('Row cannot be canceling, but only deleting');
1443
+ const confirmed = (!opts || opts.interactive !== false);
1444
+ // Ask user confirmation, if cancel
1445
+ if (!confirmed && row.dirty && (this.confirmBeforeCancel || this.onBeforeCancelRows.observers.length > 0)) {
1446
+ event?.stopPropagation();
1447
+ if (!await this.canCancelRows([row], opts)) {
1448
+ return;
1449
+ }
1450
+ }
1451
+ const keepEditing = row.editing && (!opts || opts.keepEditing !== false);
1452
+ await this._dataSource.cancelOrDelete(row);
1453
+ this.onCancelOrDeleteRow.next(row);
1454
+ // Mark row as pristine
1455
+ await this.checkIfRowPristine(row);
1456
+ // Restore editing state
1457
+ if (keepEditing) {
1458
+ await this.editRow(undefined, row);
1459
+ }
1460
+ }
1461
+ async checkIfRowPristine(row, opts) {
1462
+ // Mark row as pristine
1463
+ const markRowAsPristine = this.dataSource?.config.restoreOriginalDataOnCancel === true;
1464
+ if (markRowAsPristine) {
1465
+ row.validator?.markAsPristine();
1466
+ // Check if table is now pristine
1467
+ if (!opts || opts.onlySelf !== true) {
1468
+ await this.checkIfPristine(opts);
1469
+ }
1470
+ }
1471
+ }
1472
+ async checkIfPristine(opts) {
1473
+ if (!this.dirty)
1474
+ return; // Already pristine
1475
+ const rows = this._dataSource.getRows();
1476
+ const pristine = (rows || []).findIndex(row => row.dirty) === -1;
1477
+ if (pristine)
1478
+ this.markAsPristine(opts);
1479
+ }
1480
+ applyFilter(filter, opts) {
1481
+ if (this.debug)
1482
+ console.debug('[table] Applying filter', filter);
1483
+ this._filter = filter;
1484
+ if (opts && opts.emitEvent) {
1485
+ if (this.paginator && this.paginator.pageIndex > 0) {
1486
+ this.paginator.pageIndex = 0;
1487
+ }
1488
+ this.onRefresh.emit();
1489
+ }
1490
+ }
1491
+ listenDatasourceLoading(dataSource) {
1492
+ if (!dataSource)
1493
+ throw new Error('[table] dataSource not set !');
1494
+ // Cleaning previous subscription on datasource
1495
+ if (isNotNil(this._dataSourceLoadingSubscription)) {
1496
+ if (this.debug)
1497
+ console.debug('[table] Many call to listenDatasource(): Cleaning previous subscriptions...');
1498
+ this._dataSourceLoadingSubscription.unsubscribe();
1499
+ this.unregisterSubscription(this._dataSourceLoadingSubscription);
1500
+ }
1501
+ // Propage loading to table
1502
+ this._dataSourceLoadingSubscription = this._dataSource.loadingSubject
1503
+ .pipe(distinctUntilChanged(),
1504
+ // If changed to True: propagate as soon as possible
1505
+ tap((loading) => loading && this.setLoading(true)),
1506
+ // If changed to False: wait 250ms before propagate (to make sure the spinner has been displayed)
1507
+ debounceTime(250), tap(loading => !loading && this.setLoading(false)))
1508
+ .subscribe();
1509
+ this.registerSubscription(this._dataSourceLoadingSubscription);
1510
+ }
1511
+ startCellValueChanges(name, row) {
1512
+ const def = this._cellValueChangesDefs[name];
1513
+ if (!def) {
1514
+ console.warn('[table] Listener with name {' + name + '} not registered! Please call registerCellValueChanges() before;');
1515
+ return;
1516
+ }
1517
+ // Stop previous subscription
1518
+ if (def.subscription) {
1519
+ def.subscription.unsubscribe();
1520
+ def.subscription = null;
1521
+ }
1522
+ else {
1523
+ if (this.debug)
1524
+ console.debug(`[table] Start values changes on row path {${def.formPath}}`);
1525
+ }
1526
+ // Listen value changes, and redirect to event emitter
1527
+ const control = row.validator && AppFormUtils.getControlFromPath(row.validator, def.formPath);
1528
+ if (!control) {
1529
+ console.warn(`[table] Could not listen cell changes: no validator or invalid form path {${def.formPath}}`);
1530
+ }
1531
+ else {
1532
+ def.subscription = control.valueChanges
1533
+ .pipe(
1534
+ // don't emit if control is disabled
1535
+ filter(() => control.enabled))
1536
+ .subscribe((value) => def.subject.next(value));
1537
+ // Emit the actual value
1538
+ if (def.emitInitialValue !== false) {
1539
+ def.subject.next(control.value);
1540
+ }
1541
+ }
1542
+ }
1543
+ stopCellValueChanges(name, destroy) {
1544
+ const def = this._cellValueChangesDefs[name];
1545
+ if (!def)
1546
+ return;
1547
+ if (def.subscription) {
1548
+ if (this.debug)
1549
+ console.debug('[table] Stop value changes on row path {' + def.formPath + '}');
1550
+ def.subscription.unsubscribe();
1551
+ def.subscription = null;
1552
+ }
1553
+ if (destroy && def.subject) {
1554
+ def.subject.complete();
1555
+ def.subject.unsubscribe();
1556
+ }
1557
+ }
1558
+ /**
1559
+ * Initialize the permanent selection model
1560
+ * @protected
1561
+ */
1562
+ initPermanentSelection() {
1563
+ if (this.permanentSelection)
1564
+ throw new Error('initPermanentSelection() already called!');
1565
+ this.permanentSelection = new SelectionModel(true, []);
1566
+ // Listen sort change
1567
+ this.registerSubscription(this.onSort.subscribe(() => (this.permanentSelectionChangedPrevented = true)) // prevent selection change on sort
1568
+ );
1569
+ // Listen datasource update
1570
+ this.registerSubscription(this.dataSource.rowsSubject
1571
+ // restore the 'adding' selection (for example after a page or sort change)
1572
+ .subscribe((rows) => {
1573
+ this.permanentSelectionChangedPrevented = true;
1574
+ try {
1575
+ const permanentSelectionIds = (this.permanentSelection.selected || []).map(EntityUtils.getId);
1576
+ this.selection.setSelection(...rows.filter((row) => permanentSelectionIds.includes(AppTableUtils.getEntityId(row))));
1577
+ this.markForCheck();
1578
+ }
1579
+ finally {
1580
+ this.permanentSelectionChangedPrevented = false;
1581
+ }
1582
+ }));
1583
+ // Listen selection change
1584
+ this.registerSubscription(this.selection.changed
1585
+ .pipe(filter(() => !this.permanentSelectionChangedPrevented))
1586
+ .subscribe((selectionChange) => {
1587
+ // add to selection
1588
+ if (selectionChange.added.length) {
1589
+ this.permanentSelection.setSelection(...(this.permanentSelection.selected || [])
1590
+ // Add new elements
1591
+ .concat(...AppTableUtils.getEntities(selectionChange.added))
1592
+ // Avoid duplicated entities (Mantis #55351)
1593
+ .filter(EntityUtils.arrayDistinctFilterFn));
1594
+ }
1595
+ // remove from selection
1596
+ if (selectionChange.removed.length) {
1597
+ const removedIds = AppTableUtils.getEntityIds(selectionChange.removed);
1598
+ this.permanentSelection.setSelection(...(this.permanentSelection.selected || [])
1599
+ .filter((entity) => !removedIds.includes(entity.id)));
1600
+ }
1601
+ this.markForCheck();
1602
+ }));
1603
+ }
1604
+ }
1605
+ AppAsyncTable.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AppAsyncTable, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
1606
+ AppAsyncTable.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: AppAsyncTable, inputs: { settingsId: "settingsId", debug: "debug", i18nColumnPrefix: "i18nColumnPrefix", i18nColumnSuffix: "i18nColumnSuffix", autoLoad: "autoLoad", readOnly: "readOnly", inlineEdition: "inlineEdition", focusFirstColumn: "focusFirstColumn", confirmBeforeDelete: "confirmBeforeDelete", confirmBeforeCancel: "confirmBeforeCancel", undoableDeletion: "undoableDeletion", saveBeforeDelete: "saveBeforeDelete", keepEditedRowOnSave: "keepEditedRowOnSave", saveBeforeSort: "saveBeforeSort", saveBeforeFilter: "saveBeforeFilter", propagateRowError: "propagateRowError", permanentSelectionAllowed: "permanentSelectionAllowed", defaultSortBy: "defaultSortBy", defaultSortDirection: "defaultSortDirection", defaultPageSize: "defaultPageSize", defaultPageSizeOptions: "defaultPageSizeOptions", focusColumn: "focusColumn", dataSource: "dataSource", filter: "filter", disabled: "disabled", paginator: "paginator" }, outputs: { onRefresh: "onRefresh", onOpenRow: "onOpenRow", onNewRow: "onNewRow", onStartEditingRow: "onStartEditingRow", onConfirmEditCreateRow: "onConfirmEditCreateRow", onCancelOrDeleteRow: "onCancelOrDeleteRow", onBeforeDeleteRows: "onBeforeDeleteRows", onBeforeCancelRows: "onBeforeCancelRows", onBeforeSave: "onBeforeSave", onAfterDeletedRows: "onAfterDeletedRows", onSort: "onSort", onDirty: "onDirty", onError: "onError" }, viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "childPaginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0 });
1607
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AppAsyncTable, decorators: [{
1608
+ type: Directive
1609
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: undefined }, { type: i1.EntitiesAsyncTableDataSource }, { type: undefined }]; }, propDecorators: { settingsId: [{
1610
+ type: Input
1611
+ }], debug: [{
1612
+ type: Input
1613
+ }], i18nColumnPrefix: [{
1614
+ type: Input
1615
+ }], i18nColumnSuffix: [{
1616
+ type: Input
1617
+ }], autoLoad: [{
1618
+ type: Input
1619
+ }], readOnly: [{
1620
+ type: Input
1621
+ }], inlineEdition: [{
1622
+ type: Input
1623
+ }], focusFirstColumn: [{
1624
+ type: Input
1625
+ }], confirmBeforeDelete: [{
1626
+ type: Input
1627
+ }], confirmBeforeCancel: [{
1628
+ type: Input
1629
+ }], undoableDeletion: [{
1630
+ type: Input
1631
+ }], saveBeforeDelete: [{
1632
+ type: Input
1633
+ }], keepEditedRowOnSave: [{
1634
+ type: Input
1635
+ }], saveBeforeSort: [{
1636
+ type: Input
1637
+ }], saveBeforeFilter: [{
1638
+ type: Input
1639
+ }], propagateRowError: [{
1640
+ type: Input
1641
+ }], permanentSelectionAllowed: [{
1642
+ type: Input
1643
+ }], defaultSortBy: [{
1644
+ type: Input
1645
+ }], defaultSortDirection: [{
1646
+ type: Input
1647
+ }], defaultPageSize: [{
1648
+ type: Input
1649
+ }], defaultPageSizeOptions: [{
1650
+ type: Input
1651
+ }], focusColumn: [{
1652
+ type: Input
1653
+ }], dataSource: [{
1654
+ type: Input
1655
+ }], filter: [{
1656
+ type: Input
1657
+ }], onRefresh: [{
1658
+ type: Output
1659
+ }], onOpenRow: [{
1660
+ type: Output
1661
+ }], onNewRow: [{
1662
+ type: Output
1663
+ }], onStartEditingRow: [{
1664
+ type: Output
1665
+ }], onConfirmEditCreateRow: [{
1666
+ type: Output
1667
+ }], onCancelOrDeleteRow: [{
1668
+ type: Output
1669
+ }], onBeforeDeleteRows: [{
1670
+ type: Output
1671
+ }], onBeforeCancelRows: [{
1672
+ type: Output
1673
+ }], onBeforeSave: [{
1674
+ type: Output
1675
+ }], onAfterDeletedRows: [{
1676
+ type: Output
1677
+ }], onSort: [{
1678
+ type: Output
1679
+ }], onDirty: [{
1680
+ type: Output
1681
+ }], onError: [{
1682
+ type: Output
1683
+ }], disabled: [{
1684
+ type: Input
1685
+ }], paginator: [{
1686
+ type: Input
1687
+ }], table: [{
1688
+ type: ViewChild,
1689
+ args: [MatTable, { static: false }]
1690
+ }], childPaginator: [{
1691
+ type: ViewChild,
1692
+ args: [MatPaginator, { static: false }]
1693
+ }], sort: [{
1694
+ type: ViewChild,
1695
+ args: [MatSort, { static: false }]
1696
+ }] } });
1697
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtdGFibGUuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvdGFibGUvYXN5bmMtdGFibGUuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFZLEtBQUssRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5SCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBOEIsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVGLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9JLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFXLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQWMsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMzRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVB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QWhCLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkEyQ00sUUFBUTtzQkFBcEIsS0FBSztnQkF5Sk8sU0FBUztzQkFBckIsS0FBSztnQkFZa0MsS0FBSztzQkFBNUMsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNNLGNBQWM7c0JBQXpELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDSCxJQUFJO3NCQUExQyxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBNYXRTb3J0LCBNYXRTb3J0YWJsZSwgU29ydERpcmVjdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTWF0VGFibGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIEVNUFRZLCBtZXJnZSwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBmaXJzdCwgbWVyZ2VNYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IEVudGl0eVV0aWxzLCBJRW50aXR5IH0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7IEFsZXJ0Q29udHJvbGxlciwgTW9kYWxDb250cm9sbGVyLCBUb2FzdENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IENvbHVtbkl0ZW0sIFRhYmxlU2VsZWN0Q29sdW1uc0NvbXBvbmVudCB9IGZyb20gJy4vdGFibGUtc2VsZWN0LWNvbHVtbnMuY29tcG9uZW50JztcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9lcnJvcnMnO1xuaW1wb3J0IHsgQXBwRm9ybVV0aWxzLCBJQXBwRm9ybSwgT25SZWFkeSB9IGZyb20gJy4uL2Zvcm0vZm9ybS51dGlscyc7XG5pbXBvcnQgeyBMb2NhbFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlQ29uZmlnSG9sZGVyLCBNYXRBdXRvY29tcGxldGVGaWVsZEFkZE9wdGlvbnMsIE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21hdGVyaWFsL2F1dG9jb21wbGV0ZS9tYXRlcmlhbC5hdXRvY29tcGxldGUuY29uZmlnJztcbmltcG9ydCB7IENvbXBsZXRhYmxlRXZlbnQsIGNyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXIsIGVtaXRQcm9taXNlRXZlbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvZXZlbnRzJztcbmltcG9ydCB7IGNoYW5nZUNhc2VUb1VuZGVyc2NvcmUsIGlzRW1wdHlBcnJheSwgaXNOaWwsIGlzTm90TmlsLCB0b0Jvb2xlYW4gfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IHdhaXRGb3IsIHdhaXRGb3JGYWxzZSwgV2FpdEZvck9wdGlvbnMsIHdhaXRGb3JUcnVlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL29ic2VydmFibGVzJztcbmltcG9ydCB7IFNob3dUb2FzdE9wdGlvbnMsIFRvYXN0cyB9IGZyb20gJy4uLy4uL3NoYXJlZC90b2FzdC90b2FzdHMnO1xuaW1wb3J0IHsgQWxlcnRzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FsZXJ0cyc7XG5pbXBvcnQgeyBDZGtDb2x1bW5EZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvdGFibGUnO1xuaW1wb3J0IHsgTG9hZFJlc3VsdCB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBGb3JtRXJyb3JUcmFuc2xhdG9yLCBGb3JtRXJyb3JUcmFuc2xhdG9yT3B0aW9ucywgSUZvcm1Db250cm9sUGF0aFRyYW5zbGF0b3IgfSBmcm9tICcuLi8uLi9zaGFyZWQvdmFsaWRhdG9yL2Zvcm0tZXJyb3ItYWRhcHRlci5jbGFzcyc7XG5pbXBvcnQge1xuICBDZWxsVmFsdWVDaGFuZ2VMaXN0ZW5lcixcbiAgREVGQVVMVF9QQUdFX1NJWkUsXG4gIERFRkFVTFRfUEFHRV9TSVpFX09QVElPTlMsXG4gIERFRkFVTFRfUkVRVUlSRURfQ09MVU1OUyxcbiAgUkVTRVJWRURfRU5EX0NPTFVNTlMsXG4gIFJFU0VSVkVEX1NUQVJUX0NPTFVNTlMsXG4gIFNhdmVBY3Rpb25UeXBlLFxuICBTRVRUSU5HU19ESVNQTEFZX0NPTFVNTlMsXG4gIFNFVFRJTkdTX1BBR0VfU0laRSxcbiAgU0VUVElOR1NfU09SVEVEX0NPTFVNTlxufSBmcm9tICcuL3RhYmxlLm1vZGVsJztcbmltcG9ydCB7IEFzeW5jVGFibGVFbGVtZW50IH0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlJztcbmltcG9ydCB7IEVudGl0aWVzQXN5bmNUYWJsZURhdGFTb3VyY2UgfSBmcm9tICcuL2VudGl0aWVzLWFzeW5jLXRhYmxlLWRhdGFzb3VyY2UuY2xhc3MnO1xuaW1wb3J0IHtBcHBUYWJsZVV0aWxzfSBmcm9tICcuL3RhYmxlLnV0aWxzJztcblxuLy8gQGR5bmFtaWNcbi8vIG5vaW5zcGVjdGlvbiBEdXBsaWNhdGVkQ29kZVxuQERpcmVjdGl2ZSgpXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBcHBBc3luY1RhYmxlPFQgZXh0ZW5kcyBJRW50aXR5PFQsIElEPixcbiAgRiA9IGFueSxcbiAgSUQgPSBudW1iZXI+XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQsIElBcHBGb3JtLCBJRm9ybUNvbnRyb2xQYXRoVHJhbnNsYXRvciB7XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIF9kYXRhU291cmNlTG9hZGluZ1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgX2NlbGxWYWx1ZUNoYW5nZXNEZWZzOiB7XG4gICAgW2tleTogc3RyaW5nXTogQ2VsbFZhbHVlQ2hhbmdlTGlzdGVuZXI7XG4gIH0gPSB7fTtcblxuICBwcm90ZWN0ZWQgX2VuYWJsZWQgPSB0cnVlO1xuICBwcm90ZWN0ZWQgX2F1dG9jb21wbGV0ZUNvbmZpZ0hvbGRlcjogTWF0QXV0b2NvbXBsZXRlQ29uZmlnSG9sZGVyO1xuICBwcm90ZWN0ZWQgYWxsb3dSb3dEZXRhaWwgPSB0cnVlO1xuICBwcm90ZWN0ZWQgcm91dGU6IEFjdGl2YXRlZFJvdXRlO1xuICBwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXI7XG4gIHByb3RlY3RlZCBsb2NhdGlvbjogTG9jYXRpb247XG4gIHByb3RlY3RlZCBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2U7XG4gIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2U7XG4gIHByb3RlY3RlZCBtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlcjtcbiAgcHJvdGVjdGVkIGFsZXJ0Q3RybDogQWxlcnRDb250cm9sbGVyO1xuICBwcm90ZWN0ZWQgdG9hc3RDb250cm9sbGVyOiBUb2FzdENvbnRyb2xsZXI7XG4gIHByb3RlY3RlZCBwcmV2aW91c2x5RWRpdGVkUm93SWQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGZvcm1FcnJvckFkYXB0ZXI6IEZvcm1FcnJvclRyYW5zbGF0b3I7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZXN0cm95U3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgZXhjbHVkZXNDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuICBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXTtcbiAgdG90YWxSb3dDb3VudDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHZpc2libGVSb3dDb3VudDogbnVtYmVyO1xuICBlcnJvclRyYW5zbGF0b3JPcHRpb25zOiBGb3JtRXJyb3JUcmFuc2xhdG9yT3B0aW9ucztcblxuICByZWFkb25seSByZWFkeVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbG9hZGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBzYXZpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHRvdWNoZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGRpcnR5U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBlcnJvclN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odW5kZWZpbmVkKTtcblxuICBnZXQgZXJyb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvclN1YmplY3QudmFsdWU7XG4gIH1cblxuICBzZXQgZXJyb3IoZXJyb3I6IHN0cmluZykge1xuICAgIHRoaXMuc2V0RXJyb3IoZXJyb3IpO1xuICB9XG5cbiAgc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPEFzeW5jVGFibGVFbGVtZW50PFQ+Pih0cnVlLCBbXSk7XG4gIHBlcm1hbmVudFNlbGVjdGlvbjogU2VsZWN0aW9uTW9kZWw8VD4gPSBudWxsO1xuICBwZXJtYW5lbnRTZWxlY3Rpb25DaGFuZ2VkUHJldmVudGVkID0gZmFsc2U7XG4gIGF1dG9jb21wbGV0ZUZpZWxkczogeyBba2V5OiBzdHJpbmddOiBNYXRBdXRvY29tcGxldGVGaWVsZENvbmZpZyB9O1xuICByZWFkb25seSBtb2JpbGU6IGJvb2xlYW47XG5cbiAgLy8gVGFibGUgb3B0aW9uc1xuICBASW5wdXQoKSBzZXR0aW5nc0lkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRlYnVnOiBib29sZWFuO1xuICBASW5wdXQoKSBpMThuQ29sdW1uUHJlZml4ID0gJ0NPTU1PTi4nO1xuICBASW5wdXQoKSBpMThuQ29sdW1uU3VmZml4OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGF1dG9Mb2FkID0gdHJ1ZTtcbiAgQElucHV0KCkgcmVhZE9ubHk6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlubGluZUVkaXRpb246IGJvb2xlYW47XG4gIEBJbnB1dCgpIGZvY3VzRmlyc3RDb2x1bW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY29uZmlybUJlZm9yZURlbGV0ZSA9IGZhbHNlO1xuICBASW5wdXQoKSBjb25maXJtQmVmb3JlQ2FuY2VsID0gZmFsc2U7XG4gIEBJbnB1dCgpIHVuZG9hYmxlRGVsZXRpb24gPSBmYWxzZTtcbiAgQElucHV0KCkgc2F2ZUJlZm9yZURlbGV0ZTogYm9vbGVhbjtcbiAgQElucHV0KCkga2VlcEVkaXRlZFJvd09uU2F2ZTogYm9vbGVhbjtcbiAgQElucHV0KCkgc2F2ZUJlZm9yZVNvcnQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNhdmVCZWZvcmVGaWx0ZXI6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHByb3BhZ2F0ZVJvd0Vycm9yID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBlcm1hbmVudFNlbGVjdGlvbkFsbG93ZWQgPSBmYWxzZTsgLy8gQWxsb3cga2VlcCBzZWxlY3RlZCByb3dzIG92ZXIgcGFnZSBjaGFuZ2Ugb3Igc29ydCBjaGFuZ2VcblxuICBASW5wdXQoKSBkZWZhdWx0U29ydEJ5OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRlZmF1bHRTb3J0RGlyZWN0aW9uOiBTb3J0RGlyZWN0aW9uO1xuICBASW5wdXQoKSBkZWZhdWx0UGFnZVNpemUgPSBERUZBVUxUX1BBR0VfU0laRTtcbiAgQElucHV0KCkgZGVmYXVsdFBhZ2VTaXplT3B0aW9ucyA9IERFRkFVTFRfUEFHRV9TSVpFX09QVElPTlM7XG5cbiAgLy8gRm9jdXMgbWFuYWdlclxuICBASW5wdXQoKSBmb2N1c0NvbHVtbjogc3RyaW5nO1xuXG4gIGdldCBmaXJzdFVzZXJDb2x1bW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zW1JFU0VSVkVEX1NUQVJUX0NPTFVNTlMubGVuZ3RoXTtcbiAgfVxuXG4gIGdldCBsYXN0VXNlckNvbHVtbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXllZENvbHVtbnNbdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmxlbmd0aCAtIFJFU0VSVkVEX0VORF9DT0xVTU5TLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGRhdGFTb3VyY2UodmFsdWU6IEVudGl0aWVzQXN5bmNUYWJsZURhdGFTb3VyY2U8VCwgRiwgSUQ+KSB7XG4gICAgdGhpcy5zZXREYXRhc291cmNlKHZhbHVlKTtcbiAgfVxuXG4gIGdldCBkYXRhU291cmNlKCk6IEVudGl0aWVzQXN5bmNUYWJsZURhdGFTb3VyY2U8VCwgRiwgSUQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBmaWx0ZXIodmFsdWU6IEYpIHtcbiAgICB0aGlzLnNldEZpbHRlcih2YWx1ZSk7XG4gIH1cblxuICBnZXQgZmlsdGVyKCk6IEYge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXI7XG4gIH1cblxuICBnZXQgZW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZyB8fCB0aGlzLnRvdGFsUm93Q291bnQgPT09IDA7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRFbnRpdGllcygpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLnBlcm1hbmVudFNlbGVjdGlvbj8uc2VsZWN0ZWRcbiAgICAgIHx8IEFwcFRhYmxlVXRpbHMuZ2V0RW50aXRpZXModGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICB9XG5cbiAgQE91dHB1dCgpIG9uUmVmcmVzaCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb25PcGVuUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxBc3luY1RhYmxlRWxlbWVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uTmV3Um93ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvblN0YXJ0RWRpdGluZ1JvdyA9IG5ldyBFdmVudEVtaXR0ZXI8QXN5bmNUYWJsZUVsZW1lbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvbkNvbmZpcm1FZGl0Q3JlYXRlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxBc3luY1RhYmxlRWxlbWVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uQ2FuY2VsT3JEZWxldGVSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPEFzeW5jVGFibGVFbGVtZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25CZWZvcmVEZWxldGVSb3dzID0gY3JlYXRlUHJvbWlzZUV2ZW50RW1pdHRlcjxib29sZWFuLCB7IHJvd3M6IEFzeW5jVGFibGVFbGVtZW50PFQ+W10gfT4oKTtcbiAgQE91dHB1dCgpIG9uQmVmb3JlQ2FuY2VsUm93cyA9IGNyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXI8Ym9vbGVhbiwgeyByb3dzOiBBc3luY1RhYmxlRWxlbWVudDxUPltdIH0+KCk7XG4gIEBPdXRwdXQoKSBvbkJlZm9yZVNhdmUgPSBjcmVhdGVQcm9taXNlRXZlbnRFbWl0dGVyPHsgY29uZmlybWVkOiBib29sZWFuOyBzYXZlOiBib29sZWFuIH0sIHsgYWN0aW9uOiBTYXZlQWN0aW9uVHlwZTsgdmFsaWQ6IGJvb2xlYW4gfT4oKTtcbiAgQE91dHB1dCgpIG9uQWZ0ZXJEZWxldGVkUm93cyA9IG5ldyBFdmVudEVtaXR0ZXI8QXN5bmNUYWJsZUVsZW1lbnQ8VD5bXT4oKTtcbiAgQE91dHB1dCgpIG9uU29ydCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb25EaXJ0eSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIG9uRXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBnZXQgZGlydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlydHlTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgZ2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0Um93cygpLmV2ZXJ5KHJvdyA9PiByb3cuZWRpdGluZyA/IHJvdy52YWxpZCA6IHRydWUpO1xuICB9XG5cbiAgZ2V0IGludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5nZXRSb3dzKCkuc29tZShyb3cgPT4gcm93LmVkaXRpbmcgPyByb3cuaW52YWxpZCA6IGZhbHNlKTtcbiAgfVxuXG4gIGdldCBwZW5kaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0Um93cygpLnNvbWUocm93ID0+IHJvdy5lZGl0aW5nID8gcm93LnBlbmRpbmcgOiBmYWxzZSk7XG4gIH1cblxuICBnZXQgdG91Y2hlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50b3VjaGVkU3ViamVjdC52YWx1ZTtcbiAgfVxuXG4gIGdldCB1bnRvdWNoZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnRvdWNoZWRTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgZGlzYWJsZShvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLnNvcnQpIHRoaXMuc29ydC5kaXNhYmxlZCA9IHRydWU7XG4gICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPSBmYWxzZSkgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGVuYWJsZShvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLnNvcnQpIHRoaXMuc29ydC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPSBmYWxzZSkgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCBlbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICB9XG5cbiAgLy8gRklYTUU6IG5lZWQgdG8gaGlkZGVuIGJ1dHRvbnMgKGluIEhUTUwpLCBldGMuIHdoZW4gZGlzYWJsZWRcbiAgQElucHV0KCkgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlICE9PSAhdGhpcy5fZW5hYmxlZCkge1xuICAgICAgaWYgKHZhbHVlKSB0aGlzLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgZWxzZSB0aGlzLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fZW5hYmxlZDtcbiAgfVxuXG4gIG1hcmtBc0RpcnR5KG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMuZGlydHlTdWJqZWN0LnZhbHVlICE9PSB0cnVlKSB7XG4gICAgICB0aGlzLmRpcnR5U3ViamVjdC5uZXh0KHRydWUpO1xuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG1hcmtBc1ByaXN0aW5lKG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMuZGlydHlTdWJqZWN0LnZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5kaXJ0eVN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbWFya0FzVW50b3VjaGVkKG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgbGV0IG5lZWRFbWl0RXZlbnQgPSBmYWxzZTtcbiAgICBpZiAodGhpcy50b3VjaGVkU3ViamVjdC52YWx1ZSkge1xuICAgICAgdGhpcy50b3VjaGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgIG5lZWRFbWl0RXZlbnQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaXJ0eSB8fCB0aGlzLmRhdGFTb3VyY2UuaGFzU29tZUVkaXRpbmdSb3coKSkge1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5kYXRhU291cmNlLmdldEVkaXRpbmdSb3dzKCkpIHtcblxuICAgICAgICAvLyBDYW5jZWwgdGhlIGN1cnJlbnQgZWRpdGluZyByb3cgb25seSBpZiBlZGl0aW5nIGFuZCBpZiBpdCB3YXMgbm90IHByZXZpb3VzbHkgc2F2ZWRcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlLmNhbmNlbE9yRGVsZXRlKHJvdyk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgcm93IGFzIHByaXN0aW5lXG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJZlJvd1ByaXN0aW5lKHJvdywge29ubHlTZWxmOiB0cnVlIC8qIGF2b2lkIHByb3BhZ2F0aW9uIHRvIHRhYmxlIC0gZG9uZSBqdXN0IGFmdGVyICovfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0YWJsZSBpcyBwcmlzdGluZVxuICAgICAgYXdhaXQgdGhpcy5jaGVja0lmUHJpc3RpbmUoe2VtaXRFdmVudDogZmFsc2UgLyp3aWxsIGJlIGRvbmUganVzdCBhZnRlciovfSk7XG5cbiAgICAgIG5lZWRFbWl0RXZlbnQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLnByZXZpb3VzbHlFZGl0ZWRSb3dJZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAobmVlZEVtaXRFdmVudCAmJiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSkgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBwcmVmZXIgdG8gdXNlIG1hcmtBbGxBc1RvdWNoZWQoKVxuICAgKiBAcGFyYW0gb3B0c1xuICAgKi9cbiAgbWFya0FzVG91Y2hlZChvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGNvbnNvbGUud2FybignVE9ETzogUmVwbGFjZSB0aGlzIGNhbGwgYnkgbWFya0FsbEFzVG91Y2hlZCgpIC0gYmVjYXVzZSBvZiBjaGFuZ2VzIGluIG5neC1jb21wb25lbnRzID49IDAuMTYuMCcpO1xuICAgIGlmICh0aGlzLmRhdGFTb3VyY2UuaGFzU29tZUVkaXRpbmdSb3coKSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLmdldEVkaXRpbmdSb3dzKCkuZm9yRWFjaChyb3cgPT4gcm93LnZhbGlkYXRvcj8ubWFya0FsbEFzVG91Y2hlZCgpKTtcbiAgICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBtYXJrQWxsQXNUb3VjaGVkKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLnRvdWNoZWRTdWJqZWN0LnZhbHVlICE9PSB0cnVlKSB7XG4gICAgICB0aGlzLnRvdWNoZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhU291cmNlLmhhc1NvbWVFZGl0aW5nUm93KCkpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5nZXRFZGl0aW5nUm93cygpLmZvckVhY2gocm93ID0+IHJvdy52YWxpZGF0b3I/Lm1hcmtBbGxBc1RvdWNoZWQoKSk7XG4gICAgfVxuICB9XG5cbiAgbWFya0FzU2F2aW5nKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLnNhdmluZ1N1YmplY3QudmFsdWUgIT09IHRydWUpIHtcbiAgICAgIHRoaXMuZm9jdXNDb2x1bW4gPSB1bmRlZmluZWQ7IC8vIHVuc2VsZWN0IGZvY3VzIGNvbHVtblxuICAgICAgdGhpcy5zYXZpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc1NhdmVkKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLnNhdmluZ1N1YmplY3QudmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnNhdmluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc0xvYWRpbmcob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy5zZXRMb2FkaW5nKHRydWUsIG9wdHMpO1xuICB9XG5cbiAgbWFya0FzTG9hZGVkKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIHRoaXMuc2V0TG9hZGluZyhmYWxzZSwgb3B0cyk7XG4gIH1cblxuICBtYXJrQXNSZWFkeShvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAodGhpcy5yZWFkeVN1YmplY3QudmFsdWUgIT09IHRydWUpIHtcbiAgICAgIHRoaXMucmVhZHlTdWJqZWN0Lm5leHQodHJ1ZSk7XG5cbiAgICAgIC8vIElmIHN1YmNsYXNzZXMgaW1wbGVtZW50cyBPblJlYWR5XG4gICAgICBpZiAodHlwZW9mIHRoaXNbJ25nT25SZWFkeSddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICh0aGlzIGFzIGFueSBhcyBPblJlYWR5KS5uZ09uUmVhZHkoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgbG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU3ViamVjdC52YWx1ZTtcbiAgfVxuXG4gIGdldCBsb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgZW5hYmxlU29ydCgpIHtcbiAgICBpZiAodGhpcy5zb3J0KSB0aGlzLnNvcnQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGRpc2FibGVTb3J0KCkge1xuICAgIGlmICh0aGlzLnNvcnQpIHRoaXMuc29ydC5kaXNhYmxlZCA9IHRydWU7XG4gIH1cblxuICBzZXQgcGFnZVNpemUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuZGVmYXVsdFBhZ2VTaXplID0gdmFsdWU7XG4gICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwYWdlU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhZ2luYXRvciAmJiB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSB8fCB0aGlzLmRlZmF1bHRQYWdlU2l6ZSB8fCBERUZBVUxUX1BBR0VfU0laRTtcbiAgfVxuXG4gIGdldCBwYWdlT2Zmc2V0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFnaW5hdG9yICYmIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCAqIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplIHx8IDA7XG4gIH1cblxuICBnZXQgc29ydEFjdGl2ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNvcnQgJiYgdGhpcy5zb3J0LmFjdGl2ZTtcbiAgfVxuXG4gIGdldCBzb3J0RGlyZWN0aW9uKCk6ICdhc2MnIHwgJ2Rlc2MnIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0ICYmIHRoaXMuc29ydC5kaXJlY3Rpb24gJiYgKHRoaXMuc29ydC5kaXJlY3Rpb24gPT09ICdkZXNjJyA/ICdkZXNjJyA6ICdhc2MnKSB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIF9wYWdpbmF0b3I6IE1hdFBhZ2luYXRvciB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIHNldCBwYWdpbmF0b3IodmFsdWU6IE1hdFBhZ2luYXRvcikge1xuICAgIHRoaXMuX3BhZ2luYXRvciA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHBhZ2luYXRvcigpOiBNYXRQYWdpbmF0b3Ige1xuICAgIHJldHVybiB0aGlzLl9wYWdpbmF0b3IgfHwgdGhpcy5jaGlsZFBhZ2luYXRvcjtcbiAgfVxuXG4gIGdldCBkZXN0cm95ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGVzdHJveVN1YmplY3Q/LmNsb3NlZCAhPT0gZmFsc2U7XG4gIH1cblxuICBAVmlld0NoaWxkKE1hdFRhYmxlLCB7IHN0YXRpYzogZmFsc2UgfSkgdGFibGU6IE1hdFRhYmxlPFQ+O1xuICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvciwgeyBzdGF0aWM6IGZhbHNlIH0pIGNoaWxkUGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XG4gIEBWaWV3Q2hpbGQoTWF0U29ydCwgeyBzdGF0aWM6IGZhbHNlIH0pIHNvcnQ6IE1hdFNvcnQ7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgY29sdW1uczogc3RyaW5nW10sXG4gICAgcHJvdGVjdGVkIF9kYXRhU291cmNlPzogRW50aXRpZXNBc3luY1RhYmxlRGF0YVNvdXJjZTxULCBGLCBJRD4sXG4gICAgcHJpdmF0ZSBfZmlsdGVyPzogRlxuICApIHtcbiAgICB0aGlzLnJvdXRlID0gaW5qZWN0b3IuZ2V0KEFjdGl2YXRlZFJvdXRlKTtcbiAgICB0aGlzLnJvdXRlciA9IGluamVjdG9yLmdldChSb3V0ZXIpO1xuICAgIHRoaXMubG9jYXRpb24gPSBpbmplY3Rvci5nZXQoTG9jYXRpb24pO1xuICAgIHRoaXMuc2V0dGluZ3MgPSBpbmplY3Rvci5nZXQoTG9jYWxTZXR0aW5nc1NlcnZpY2UpO1xuICAgIHRoaXMudHJhbnNsYXRlID0gaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIHRoaXMubW9kYWxDdHJsID0gaW5qZWN0b3IuZ2V0KE1vZGFsQ29udHJvbGxlcik7XG4gICAgdGhpcy5hbGVydEN0cmwgPSBpbmplY3Rvci5nZXQoQWxlcnRDb250cm9sbGVyKTtcbiAgICB0aGlzLnRvYXN0Q29udHJvbGxlciA9IGluamVjdG9yLmdldChUb2FzdENvbnRyb2xsZXIpO1xuICAgIHRoaXMuZm9ybUVycm9yQWRhcHRlciA9IGluamVjdG9yLmdldChGb3JtRXJyb3JUcmFuc2xhdG9yKTtcbiAgICB0aGlzLm1vYmlsZSA9IHRoaXMuc2V0dGluZ3MubW9iaWxlO1xuXG4gICAgLy8gQXV0b2NvbXBsZXRlIGZpZWxkc1xuICAgIHRoaXMuX2F1dG9jb21wbGV0ZUNvbmZpZ0hvbGRlciA9IG5ldyBNYXRBdXRvY29tcGxldGVDb25maWdIb2xkZXIoe1xuICAgICAgZ2V0VXNlckF0dHJpYnV0ZXM6IChhLCBiKSA9PiB0aGlzLnNldHRpbmdzLmdldEZpZWxkRGlzcGxheUF0dHJpYnV0ZXMoYSwgYilcbiAgICB9KTtcbiAgICB0aGlzLmF1dG9jb21wbGV0ZUZpZWxkcyA9IHRoaXMuX2F1dG9jb21wbGV0ZUNvbmZpZ0hvbGRlci5maWVsZHM7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQpIHJldHVybjsgLy8gSW5pdCBvbmx5IG9uY2VcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAvLyBTZXQgZGVmYXVsdHNcbiAgICB0aGlzLnJlYWRPbmx5ID0gdG9Cb29sZWFuKHRoaXMucmVhZE9ubHksIHRoaXMuZGF0YVNvdXJjZT8uY29uZmlnLnJlYWRPbmx5IHx8IGZhbHNlKTsgLy8gcmVhZC93cml0ZSBieSBkZWZhdWx0XG4gICAgdGhpcy5pbmxpbmVFZGl0aW9uID0gIXRoaXMucmVhZE9ubHkgJiYgdG9Cb29sZWFuKHRoaXMuaW5saW5lRWRpdGlvbiwgZmFsc2UpOyAvLyBmb3JjZSB0byBmYWxzZSB3aGVuIHJlYWRvbmx5XG4gICAgdGhpcy5zYXZlQmVmb3JlRGVsZXRlID0gdG9Cb29sZWFuKHRoaXMuc2F2ZUJlZm9yZURlbGV0ZSwgIXRoaXMucmVhZE9ubHkpOyAvLyBmb3JjZSB0byBmYWxzZSB3aGVuIHJlYWRvbmx5XG4gICAgdGhpcy5zYXZlQmVmb3JlU29ydCA9IHRvQm9vbGVhbih0aGlzLnNhdmVCZWZvcmVTb3J0LCAhdGhpcy5yZWFkT25seSk7IC8vIGZvcmNlIHRvIGZhbHNlIHdoZW4gcmVhZG9ubHlcbiAgICB0aGlzLnNhdmVCZWZvcmVGaWx0ZXIgPSB0b0Jvb2xlYW4odGhpcy5zYXZlQmVmb3JlRmlsdGVyLCAhdGhpcy5yZWFkT25seSk7IC8vIGZvcmNlIHRvIGZhbHNlIHdoZW4gcmVhZG9ubHlcbiAgICB0aGlzLmtlZXBFZGl0ZWRSb3dPblNhdmUgPSB0b0Jvb2xlYW4odGhpcy5rZWVwRWRpdGVkUm93T25TYXZlLCB0aGlzLmlubGluZUVkaXRpb24pO1xuICAgIHRoaXMuZXJyb3JUcmFuc2xhdG9yT3B0aW9ucyA9IHRoaXMuZXJyb3JUcmFuc2xhdG9yT3B0aW9ucyB8fCB7IHNlcGFyYXRvcjogJywgJywgY29udHJvbFBhdGhUcmFuc2xhdG9yOiB0aGlzIH07IC8vIENhbiBiZSBvdmVycmlkZSBpbiBzdWJjbGFzc2VzIGNvbnN0cnVjdG9yc1xuXG4gICAgLy8gQ2hlY2sgYXNrIHVzZXIgY29uZmlybWF0aW9uIGlzIHBvc3NpYmxlXG4gICAgaWYgKHRoaXMuY29uZmlybUJlZm9yZURlbGV0ZSAmJiAhdGhpcy5hbGVydEN0cmwpIHRocm93IEVycm9yKCdNaXNzaW5nIFxcJ2FsZXJ0Q3RybFxcJyBvciBcXCdpbmplY3RvclxcJyBpbiBjb21wb25lbnRcXCdzIGNvbnN0cnVjdG9yLicpO1xuXG4gICAgLy8gRGVmaW5lZCB1bmlxdWUgaWQgZm9yIHNldHRpbmdzIGZvciB0aGUgcGFnZVxuICAgIHRoaXMuc2V0dGluZ3NJZCA9IHRoaXMuc2V0dGluZ3NJZCB8fCB0aGlzLmdlbmVyYXRlVGFibGVJZCgpO1xuXG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5nZXREaXNwbGF5Q29sdW1ucygpO1xuXG4gICAgLy8gTG9hZCB0aGUgc29ydGVkIGNvbHVtbnMsIGZyb20gc2V0dGluZ3NcbiAgICB7XG4gICAgICBjb25zdCBzb3J0ZWRDb2x1bW4gPSB0aGlzLmdldFNvcnRlZENvbHVtbigpO1xuICAgICAgdGhpcy5kZWZhdWx0U29ydEJ5ID0gc29ydGVkQ29sdW1uLmlkO1xuICAgICAgdGhpcy5kZWZhdWx0U29ydERpcmVjdGlvbiA9IHNvcnRlZENvbHVtbi5zdGFydDtcbiAgICB9XG5cbiAgICB0aGlzLmRlZmF1bHRQYWdlU2l6ZSA9IHRoaXMuZ2V0UGFnZVNpemUoKTtcblxuICAgIC8vIFByb3BhZ2F0ZSBlcnJvciB0byBldmVudCBlbWl0dGVyXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLmVycm9yU3ViamVjdFxuICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLm9uRXJyb3IuZW1pdCh2YWx1ZSkpKTtcblxuICAgIC8vIFByb3BhZ2F0ZSBkaXJ0eSB0byBldmVudCBlbWl0dGVyXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLmRpcnR5U3ViamVjdFxuICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLm9uRGlydHkuZW1pdCh2YWx1ZSkpKTtcblxuICAgIC8vIFByb3BhZ2F0ZSByb3cgZGlydHkgc3RhdGUgdG8gdGFibGVcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5vblN0YXJ0RWRpdGluZ1Jvd1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIocm93ID0+IHJvdz8udmFsaWRhdG9yICYmIHRydWUpLFxuICAgICAgICAgIG1lcmdlTWFwKHJvdyA9PiByb3cudmFsaWRhdG9yLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIGZpbHRlcihyb3cgPT4gcm93LmRpcnR5KSxcbiAgICAgICAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAgICAgLy90YXAoKCkgPT4gY29uc29sZS5kZWJ1ZyhcIlByb3BhZ2F0ZSByb3cncyBkaXJ0eSB0byB0YWJsZS4uLlwiKSlcblxuICAgICAgICAgICAgICAvLyBTdG9wIGlmIG5leHQgYW5vdGhlciByb3csIG9yIGRlc3Ryb3lpbmdcbiAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMub25TdGFydEVkaXRpbmdSb3cpLFxuICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95U3ViamVjdClcbiAgICAgICAgICAgICkpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm1hcmtBc0RpcnR5KCkpXG4gICAgKTtcblxuICAgIC8vIENhbGwgZGF0YXNvdXJjZSByZWZyZXNoLCBvbiBlYWNoIHJlZnJlc2ggZXZlbnRzXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMub25SZWZyZXNoXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aDxhbnksIGFueT4oKHRoaXMuYXV0b0xvYWQgPyB7fSA6ICdza2lwJykgYXMgYW55KSxcbiAgICAgICAgICBzd2l0Y2hNYXAoXG4gICAgICAgICAgICAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmRpcnR5U3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgICAgICAgaWYgKGV2ZW50ID09PSAnc2tpcCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIXRoaXMuX2RhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW3RhYmxlXSBTa2lwcGluZyBkYXRhIGxvYWQ6IG5vIGRhdGFTb3VyY2UgZGVmaW5lZCcpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbdGFibGVdIENhbGxpbmcgZGF0YVNvdXJjZS53YXRjaEFsbCgpLi4uJyk7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlLndhdGNoQWxsKFxuICAgICAgICAgICAgICAgIHRoaXMucGFnZU9mZnNldCxcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VTaXplLFxuICAgICAgICAgICAgICAgIHRoaXMuc29ydEFjdGl2ZSxcbiAgICAgICAgICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb24sXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgdGhpcy5zZXRFcnJvcihlcnIgJiYgZXJyLm1lc3NhZ2UgfHwgZXJyKTtcbiAgICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpOyAvLyBDb250aW51ZVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShyZXMgPT4gdGhpcy51cGRhdGVWaWV3KHJlcyBhcyBMb2FkUmVzdWx0PFQ+IHwgdW5kZWZpbmVkKSkpO1xuXG4gICAgLy8gTGlzdGVuIGRhdGFTb3VyY2UgbG9hZGluZyBldmVudHNcbiAgICBpZiAodGhpcy5fZGF0YVNvdXJjZSkgdGhpcy5saXN0ZW5EYXRhc291cmNlTG9hZGluZyh0aGlzLl9kYXRhU291cmNlKTtcblxuICAgIC8vIFBlcm1hbmVudCBzZWxlY3Rpb24gYmVoYXZpb3JcbiAgICBpZiAodGhpcy5wZXJtYW5lbnRTZWxlY3Rpb25BbGxvd2VkKSB0aGlzLmluaXRQZXJtYW5lbnRTZWxlY3Rpb24oKTt9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIERldGVjdCB3aGVuIHBhcmVudCBuZ09uSW5pdCgpIG5vdCBjYWxsXG4gICAgaWYgKHRoaXMuZGVidWcgJiYgIXRoaXMuZGlzcGxheWVkQ29sdW1ucykgY29uc29sZS53YXJuKGBbdGFibGVdIE1pc3NpbmcgJ2Rpc3BsYXllZENvbHVtbnMnLiBEaWQgeW91IGNhbGwgcGFyZW50IG5nT25Jbml0KCkgaW4gY29tcG9uZW50ICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSA/YCk7XG5cbiAgICAvLyBTdGFydCBsaXN0ZW5pbmcgc29ydCBhbmQgcGFnaW5hdG9yIGV2ZW50c1xuICAgIC8vIG5vaW5zcGVjdGlvbiBKU0lnbm9yZWRQcm9taXNlRnJvbUNhbGxcbiAgICB0aGlzLmxpc3RlblNvcnRBbmRQYWdpbmF0aW9uRXZlbnRzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcblxuICAgIC8vIFVuc3Vic2NyaWJlIGNvbHVtbiB2YWx1ZSBjaGFuZ2VzXG4gICAgT2JqZWN0LmtleXModGhpcy5fY2VsbFZhbHVlQ2hhbmdlc0RlZnMpLmZvckVhY2goY29sID0+IHRoaXMuc3RvcENlbGxWYWx1ZUNoYW5nZXMoY29sLCB0cnVlKSk7XG4gICAgdGhpcy5fY2VsbFZhbHVlQ2hhbmdlc0RlZnMgPSB7fTtcblxuICAgIHRoaXMucmVhZHlTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2F2aW5nU3ViamVjdC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZXJyb3JTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXJ0eVN1YmplY3QudW5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMub25SZWZyZXNoLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vbk9wZW5Sb3cudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uTmV3Um93LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vblN0YXJ0RWRpdGluZ1Jvdy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub25Db25maXJtRWRpdENyZWF0ZVJvdy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub25DYW5jZWxPckRlbGV0ZVJvdy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub25CZWZvcmVEZWxldGVSb3dzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vbkJlZm9yZUNhbmNlbFJvd3MudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uQmVmb3JlU2F2ZS51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub25BZnRlckRlbGV0ZWRSb3dzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vblNvcnQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uRGlydHkudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uRXJyb3IudW5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMuZGVzdHJveVN1YmplY3QubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveVN1YmplY3QudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVZpZXcocmVzOiBMb2FkUmVzdWx0PFQ+IHwgdW5kZWZpbmVkLCBvcHRzPzoge1xuICAgIGVtaXRFdmVudD86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXJlcykgcmV0dXJuOyAvLyBTa2lwIChlLmcgZXJyb3IpXG4gICAgaWYgKHJlcyAmJiByZXMuZGF0YSkge1xuICAgICAgdGhpcy52aXNpYmxlUm93Q291bnQgPSByZXMuZGF0YS5sZW5ndGg7XG4gICAgICB0aGlzLnRvdGFsUm93Q291bnQgPSBpc05vdE5pbChyZXMudG90YWwpID8gcmVzLnRvdGFsIDogKCh0aGlzLnBhZ2luYXRvciAmJiB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggKiAodGhpcy5wYWdpbmF0b3IucGFnZVNpemUgfHwgREVGQVVMVF9QQUdFX1NJWkUpIHx8IDApICsgdGhpcy52aXNpYmxlUm93Q291bnQpO1xuICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZV0gJHtyZXMuZGF0YS5sZW5ndGh9IHJvd3MgbG9hZGVkYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1t0YWJsZV0gTk8gcm93cyBsb2FkZWQnKTtcbiAgICAgIHRoaXMudG90YWxSb3dDb3VudCA9IDA7XG4gICAgICB0aGlzLnZpc2libGVSb3dDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5tYXJrQXNVbnRvdWNoZWQoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5tYXJrQXNQcmlzdGluZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB0aGlzLm1hcmtBc0xvYWRlZCh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHNldERhdGFzb3VyY2UoZGF0YXNvdXJjZTogRW50aXRpZXNBc3luY1RhYmxlRGF0YVNvdXJjZTxULCBGLCBJRD4pIHtcbiAgICBpZiAodGhpcy5fZGF0YVNvdXJjZSkgdGhyb3cgbmV3IEVycm9yKCdbdGFibGVdIGRhdGFTb3VyY2UgYWxyZWFkeSBzZXQgIScpO1xuICAgIGlmIChkYXRhc291cmNlICYmIHRoaXMuX2RhdGFTb3VyY2UgIT09IGRhdGFzb3VyY2UpIHtcbiAgICAgIHRoaXMuX2RhdGFTb3VyY2UgPSBkYXRhc291cmNlO1xuICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB0aGlzLmxpc3RlbkRhdGFzb3VyY2VMb2FkaW5nKGRhdGFzb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0RGF0YVNvdXJjZSgpIHtcbiAgICBpZiAodGhpcy5fZGF0YVNvdXJjZUxvYWRpbmdTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX2RhdGFTb3VyY2VMb2FkaW5nU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24ucmVtb3ZlKHRoaXMuX2RhdGFTb3VyY2VMb2FkaW5nU3Vic2NyaXB0aW9uKTtcbiAgICB9XG4gICAgLy90aGlzLl9kYXRhU291cmNlPy5jbG9zZSgpO1xuICAgIHRoaXMuX2RhdGFTb3VyY2UgPSBudWxsO1xuICB9XG5cbiAgYWRkQ29sdW1uRGVmKGNvbHVtbjogQ2RrQ29sdW1uRGVmKSB7XG4gICAgdGhpcy50YWJsZS5hZGRDb2x1bW5EZWYoY29sdW1uKTtcbiAgfVxuXG4gIHJlbW92ZUNvbHVtbkRlZihjb2x1bW46IENka0NvbHVtbkRlZikge1xuICAgIHRoaXMudGFibGUucmVtb3ZlQ29sdW1uRGVmKGNvbHVtbik7XG4gIH1cblxuICBzZXRGaWx0ZXIoZmlsdGVyOiBGLCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuOyBwZXJtYW5lbnRTZWxlY3Rpb25DaGFuZ2VkUHJldmVudGVkPzogYm9vbGVhbiB9KSB7XG4gICAgb3B0cyA9IG9wdHMgfHwgeyBlbWl0RXZlbnQ6IHRydWUgfTtcblxuICAgIC8vIFByZXZlbnQgcGVybWFuZW50IHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnRzXG4gICAgdGhpcy5wZXJtYW5lbnRTZWxlY3Rpb25DaGFuZ2VkUHJldmVudGVkID0gdG9Cb29sZWFuKG9wdHMucGVybWFuZW50U2VsZWN0aW9uQ2hhbmdlZFByZXZlbnRlZCwgdGhpcy5wZXJtYW5lbnRTZWxlY3Rpb25DaGFuZ2VkUHJldmVudGVkKTtcblxuICAgIGlmICh0aGlzLnNhdmVCZWZvcmVGaWx0ZXIpIHtcblxuICAgICAgLy8gaWYgYSBkaXJ0eSB0YWJsZSBpcyB0byBiZSBzYXZlZCBiZWZvcmUgZmlsdGVyXG4gICAgICBpZiAodGhpcy5kaXJ0eSkge1xuXG4gICAgICAgIC8vIFNhdmVcbiAgICAgICAgdGhpcy5zYXZlQmVmb3JlQWN0aW9uKCdmaWx0ZXInKS50aGVuKHNhdmVkID0+IHtcbiAgICAgICAgICAvLyBBcHBseSBmaWx0ZXIgb25seSBpZiB1c2VyIGRpZG4ndCBjYW5jZWwgdGhlIHNhdmUgb3IgdGhlIHNhdmUgaXMgb2tcbiAgICAgICAgICBpZiAoc2F2ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoZmlsdGVyLCBvcHRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhcHBseSBmaWx0ZXIgb24gbm9uLWRpcnR5IHRhYmxlXG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoZmlsdGVyLCBvcHRzKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG5cbiAgICAgIC8vIGFwcGx5IGZpbHRlciBkaXJlY3RseVxuICAgICAgdGhpcy5hcHBseUZpbHRlcihmaWx0ZXIsIG9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNvbmZpcm1BbmRBZGQoZXZlbnQ/OiBFdmVudCwgcm93PzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWF3YWl0IHRoaXMuY29uZmlybUVkaXRDcmVhdGUoZXZlbnQsIHJvdykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gQWRkIHJvd1xuICAgIHJldHVybiB0aGlzLmFkZFJvdyhldmVudCk7XG4gIH1cblxuICBhc3luYyBjb25maXJtQW5kQmFja3dhcmQoZXZlbnQ/OiBFdmVudCwgcm93PzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcblxuICAgIC8vIERlbGV0aW5nIGVkaXRlZCByb3csIGlmIGVtcHR5IGFuZCBub3QgZGlydHlcbiAgICBpZiAodGhpcy5kYXRhU291cmNlLmhhc1NvbWVFZGl0aW5nUm93KCkpIHtcbiAgICAgIGZvciAoY29uc3QgZWRpdGluZ1JvdyBvZiB0aGlzLmRhdGFTb3VyY2UuZ2V0RWRpdGluZ1Jvd3MoKS5maWx0ZXIocm93ID0+IHJvdy5pZCA9PT0gLTEgJiYgcm93LmludmFsaWQgJiYgIXJvdy5kaXJ0eSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVOZXdSb3coZXZlbnQsIGVkaXRpbmdSb3cpO1xuICAgICAgfVxuXG4gICAgICAvLyBXYWl0IGRlbGV0aW9uIGlzIGRvbmUsIHRoZW4gZWRpdCBwcmV2aW91cyByb3cgKGJ5IGlkLCBiZWNhdXNlIG9mIHJlbG9hZGluZylcbiAgICAgIGF3YWl0IHRoaXMud2FpdElkbGUoKTtcbiAgICAgIGF3YWl0IHRoaXMuZWRpdFJvd0J5SWQoZXZlbnQsIHJvdy5pZCwgeyBmb2N1c0NvbHVtbjogdGhpcy5sYXN0VXNlckNvbHVtbiB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEVkaXQgcHJldmlvdXMgcm93XG4gICAgYXdhaXQgdGhpcy5lZGl0Um93KGV2ZW50LCByb3csIHsgZm9jdXNDb2x1bW46IHRoaXMubGFzdFVzZXJDb2x1bW4gfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBjb25maXJtQW5kRm9yd2FyZChldmVudD86IEV2ZW50LCByb3c/OiBBc3luY1RhYmxlRWxlbWVudDxUPik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy5pbmxpbmVFZGl0aW9uKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm1FZGl0Q3JlYXRlKGV2ZW50LCByb3cpO1xuICAgIGlmICghY29uZmlybWVkKSByZXR1cm4gZmFsc2U7IC8vIE5vdCBjb25maXJtZWRcblxuICAgIC8vIEVkaXQgbmV4dCByb3dcbiAgICBhd2FpdCB0aGlzLmVkaXRSb3dCeUlkKGV2ZW50LCByb3cuaWQgKyAxLCB7IGZvY3VzQ29sdW1uOiB0aGlzLmZpcnN0VXNlckNvbHVtbiB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maXJtIHRoZSBjcmVhdGlvbiBvZiB0aGUgZ2l2ZW4gcm93LCBvciBpZiBub3Qgc3BlY2lmaWVkIHRoZSBjdXJyZW50bHkgZWRpdGVkIHJvd1xuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICogQHBhcmFtIHJvd1xuICAgKi9cbiAgYXN5bmMgY29uZmlybUVkaXRDcmVhdGUoZXZlbnQ/OiBFdmVudCwgcm93PzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByb3cgPSByb3cgfHwgdGhpcy5kYXRhU291cmNlLmdldFNpbmdsZUVkaXRpbmdSb3coKTtcbiAgICBpZiAoIXJvdyB8fCAhcm93LmVkaXRpbmcpIHJldHVybiB0cnVlOyAvLyBubyByb3cgdG8gY29uZmlybVxuXG4gICAgLy8gU3RvcCBldmVudFxuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIC8vIENvbmZpcm1hdGlvbiBlZGl0aW9uIG9yIGNyZWF0aW9uXG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgcm93LmNvbmZpcm1FZGl0Q3JlYXRlKCk7XG5cbiAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICAvLyBNYXJrIHRhYmxlIGFzIGRpcnR5IChpZiByb3cgaXMgZGlydHkpXG4gICAgICBpZiAocm93LmRpcnR5KSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoeyBlbWl0RXZlbnQ6IGZhbHNlIC8qIGJlY2F1c2Ugb2YgcmVzZXRFcnJvcigpICovIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciBlcnJvclxuICAgICAgdGhpcy5yZXNldEVycm9yKCk7XG5cbiAgICAgIC8vIEVtaXQgdGhlIGNvbmZpcm0gZXZlbnRcbiAgICAgIHRoaXMub25Db25maXJtRWRpdENyZWF0ZVJvdy5uZXh0KHJvdyk7XG5cbiAgICAgIHJldHVybiB0cnVlOyAvLyBDb250aW51ZVxuICAgIH1cblxuICAgIGlmIChyb3cudmFsaWRhdG9yKSB7XG4gICAgICAvLyBOT1QgY29uZmlybWVkID0gcm93IGhhcyBlcnJvclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbdGFibGVdIENhbm5vdCBjb25maXJtIHJvdywgYmVjYXVzZSBpbnZhbGlkJyk7XG4gICAgICAgIEFwcEZvcm1VdGlscy5sb2dGb3JtRXJyb3JzKHJvdy52YWxpZGF0b3IsICdbdGFibGVdICcpO1xuICAgICAgfVxuXG4gICAgICAvLyBmaXg6IG1hcmsgYWxsIGNvbnRyb2xzIGFzIHRvdWNoZWQgdG8gc2hvdyBlcnJvcnNcbiAgICAgIHJvdy52YWxpZGF0b3IubWFya0FsbEFzVG91Y2hlZCgpO1xuXG4gICAgICAvLyBDb21wdXRlIHJvdyBlcnJvciwgYW5kIHByb3BhZ2F0ZSB0byB0YWJsZSdzIGVycm9yXG4gICAgICBpZiAodGhpcy5wcm9wYWdhdGVSb3dFcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuZ2V0Um93RXJyb3Iocm93KTtcbiAgICAgICAgdGhpcy5zZXRFcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm90IGNvbmZpcm1lZFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIGNhbmNlbE9yRGVsZXRlKGV2ZW50OiBFdmVudCwgcm93OiBBc3luY1RhYmxlRWxlbWVudDxUPiwgb3B0cz86IHsgaW50ZXJhY3RpdmU/OiBib29sZWFuOyBrZWVwRWRpdGluZz86IGJvb2xlYW4gfSkge1xuICAgIC8vIERlbGV0ZSBuZXcgcm93XG4gICAgaWYgKHJvdy5pZCA9PT0gLTEpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlTmV3Um93KGV2ZW50LCByb3cpO1xuICAgIH1cbiAgICAvLyBEZWxldGUgZXhpc3RpbmcgKGJ1dCBub3QgZWRpdGluZykgcm93XG4gICAgZWxzZSBpZiAoIXJvdy5lZGl0aW5nKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZUV4aXN0aW5nUm93KGV2ZW50LCByb3csIG9wdHMpO1xuICAgIH1cbiAgICAvLyBDYW5jZWwgZXhpc3RpbmcgKGFuZCBlZGl0aW5nKSByb3dcbiAgICBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuY2FuY2VsRXhpc3RpbmdSb3coZXZlbnQsIHJvdywgb3B0cyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWRkUm93KGV2ZW50PzogRXZlbnQsIGluc2VydEF0PzogbnVtYmVyLCBvcHRzPzogeyBmb2N1c0NvbHVtbj86IHN0cmluZzsgZWRpdGluZz86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbdGFibGVdIEFza2luZyBmb3IgbmV3IHJvdy4uLicpO1xuICAgIGlmICghdGhpcy5fZW5hYmxlZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gVXNlIG1vZGFsIGlmIGlubGluZSBlZGl0aW9uIGlzIGRpc2FibGVkXG4gICAgaWYgKCF0aGlzLmlubGluZUVkaXRpb24pIHtcbiAgICAgIGF3YWl0IHRoaXMub3Blbk5ld1Jvd0RldGFpbChldmVudCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIGZpbmlzaCBlZGl0ZWQgcm93IGZpcnN0XG4gICAgaWYgKCFhd2FpdCB0aGlzLmNvbmZpcm1FZGl0Q3JlYXRlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBBZGQgbmV3IHJvd1xuICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuYWRkUm93VG9UYWJsZShpbnNlcnRBdCwgb3B0cyk7XG4gICAgcmV0dXJuICEhcm93O1xuICB9XG5cbiAgYXN5bmMgc2F2ZShvcHRzPzogeyBrZWVwRWRpdGluZz86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIG9wdHMgPSB7XG4gICAgICBrZWVwRWRpdGluZzogdGhpcy5rZWVwRWRpdGVkUm93T25TYXZlLFxuICAgICAgLi4ub3B0c1xuICAgIH07XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIHRocm93IHsgY29kZTogRXJyb3JDb2Rlcy5UQUJMRV9SRUFEX09OTFksIG1lc3NhZ2U6ICdFUlJPUi5UQUJMRV9SRUFEX09OTFknIH07XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG5cbiAgICAvLyBLZWVwIGVkaXRlZCByb3cgaWQgKHNob3VsZCBiZSBkb25lIEJFRk9SRSBjb25maXJtRWRpdENyZWF0ZSgpIClcbiAgICBjb25zdCBlZGl0ZWRSb3cgPSB0aGlzLmRhdGFTb3VyY2UuZ2V0U2luZ2xlRWRpdGluZ1JvdygpO1xuICAgIHRoaXMucHJldmlvdXNseUVkaXRlZFJvd0lkID0gb3B0cy5rZWVwRWRpdGluZyA/ICgoZWRpdGVkUm93Py5lZGl0aW5nID8gZWRpdGVkUm93LmlkIDogdW5kZWZpbmVkKSB8fCB0aGlzLnNpbmdsZVNlbGVjdGVkUm93Py5pZCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcHJldmlvdXNseUVkaXRlZFJvd0lkID0gdGhpcy5wcmV2aW91c2x5RWRpdGVkUm93SWQ7XG4gICAgY29uc3QgcHJldmlvdXNseUVkaXRlZERhdGEgPSBvcHRzLmtlZXBFZGl0aW5nID8gKGlzTm90TmlsKHByZXZpb3VzbHlFZGl0ZWRSb3dJZCkgJiYgZWRpdGVkUm93Py5jdXJyZW50RGF0YSB8fCB0aGlzLnNpbmdsZVNlbGVjdGVkUm93Py5jdXJyZW50RGF0YSkgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWF3YWl0IHRoaXMuY29uZmlybUVkaXRDcmVhdGUoKSkge1xuICAgICAgdGhyb3cgeyBjb2RlOiBFcnJvckNvZGVzLlRBQkxFX0lOVkFMSURfUk9XX0VSUk9SLCBtZXNzYWdlOiAnRVJST1IuVEFCTEVfSU5WQUxJRF9ST1dfRVJST1InIH07XG4gICAgfVxuXG4gICAgLy8gTWFyayBhcyBzYXZpbmdcbiAgICB0aGlzLm1hcmtBc1NhdmluZygpO1xuXG4gICAgdHJ5IHtcblxuICAgICAgLy8gQ2FsbGluZyBzZXJ2aWNlIHNhdmUoKVxuICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1t0YWJsZV0gQ2FsbGluZyBkYXRhU291cmNlLnNhdmUoKS4uLicpO1xuICAgICAgY29uc3QgaXNPSyA9IGF3YWl0IHRoaXMuX2RhdGFTb3VyY2Uuc2F2ZSgpO1xuXG4gICAgICBpZiAoaXNPSykgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuXG4gICAgICByZXR1cm4gaXNPSztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc2V0RXJyb3IoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVycik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubWFya0FzU2F2ZWQoKTtcblxuICAgICAgLy8gUmVzdG9yZSBwcmV2aW91cyByb3dcbiAgICAgIGlmIChpc05vdE5pbChwcmV2aW91c2x5RWRpdGVkUm93SWQpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VsZWN0Um93QnlJZE9yRGF0YShwcmV2aW91c2x5RWRpdGVkUm93SWQsIHByZXZpb3VzbHlFZGl0ZWREYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBjYW5jZWwoZXZlbnQ/OiBFdmVudCwgb3B0cz86IHsgaW50ZXJhY3RpdmU/OiBib29sZWFuIH0pIHtcblxuICAgIC8vIENoZWNrIGNvbmZpcm1hdGlvblxuICAgIGlmICgoIW9wdHMgfHwgb3B0cy5pbnRlcmFjdGl2ZSAhPT0gZmFsc2UpICYmIHRoaXMuZGlydHkgJiYgKHRoaXMuY29uZmlybUJlZm9yZUNhbmNlbCB8fCB0aGlzLm9uQmVmb3JlQ2FuY2VsUm93cy5vYnNlcnZlcnMubGVuZ3RoID4gMCkpIHtcbiAgICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmICghYXdhaXQgdGhpcy5jYW5DYW5jZWxSb3dzKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub25SZWZyZXNoLmVtaXQoKTtcbiAgfVxuXG4gIGFzeW5jIGR1cGxpY2F0ZVJvdyhldmVudD86IEV2ZW50LCByb3c/OiBBc3luY1RhYmxlRWxlbWVudDxUPiwgb3B0cz86IHtcbiAgICBza2lwUHJvcGVydGllcz86IHN0cmluZ1tdO1xuICB9KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgcm93ID0gcm93IHx8IHRoaXMuc2luZ2xlU2VsZWN0ZWRSb3c7XG4gICAgaWYgKCFyb3cgfHwgIWF3YWl0IHRoaXMuY29uZmlybUVkaXRDcmVhdGUoZXZlbnQsIHJvdykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdSb3cgPSBhd2FpdCB0aGlzLmFkZFJvd1RvVGFibGUocm93LmlkICsgMSk7XG4gICAgaWYgKCFuZXdSb3cpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBuZXcgcm93IHRvIHRhYmxlJyk7XG4gICAgY29uc3QganNvbiA9IHsgLi4ucm93LmN1cnJlbnREYXRhLCBpZDogbnVsbCB9O1xuXG4gICAgLy8gUmVzZXQgc29tZSBwcm9wZXJ0aWVzIChlLmcuIHJhbmtPcmRlciwgZXRjKVxuICAgIGlmIChvcHRzICYmIG9wdHMuc2tpcFByb3BlcnRpZXMpIHtcbiAgICAgIGNvbnN0IG5ld0RhdGEgPSBuZXdSb3cuY3VycmVudERhdGE7XG4gICAgICBvcHRzLnNraXBQcm9wZXJ0aWVzLmZvckVhY2goa2V5ID0+IGpzb25ba2V5XSA9IG5ld0RhdGFba2V5XSk7XG4gICAgfVxuXG4gICAgaWYgKG5ld1Jvdy52YWxpZGF0b3IpIHtcbiAgICAgIG5ld1Jvdy52YWxpZGF0b3IucGF0Y2hWYWx1ZShqc29uKTtcbiAgICAgIG5ld1Jvdy52YWxpZGF0b3IubWFya0FzRGlydHkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5ld1Jvdy5jdXJyZW50RGF0YT8uZnJvbU9iamVjdCkge1xuICAgICAgICBuZXdSb3cuY3VycmVudERhdGEuZnJvbU9iamVjdChqc29uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1Jvdy5jdXJyZW50RGF0YSA9IGpzb247XG4gICAgICB9XG4gICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgfVxuXG4gICAgLy8gc2VsZWN0XG4gICAgYXdhaXQgdGhpcy5jbGlja1Jvdyh1bmRlZmluZWQsIG5ld1Jvdyk7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGVsZW1lbnRzIG1hdGNoZXMgdGhlIHRvdGFsIG51bWJlciBvZiByb3dzLiAqL1xuICBpc0FsbFNlbGVjdGVkKCkge1xuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKCdpc0FsbFNlbGVjdGVkLiBsZW5ndGhzJywgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoLCB0aGlzLnRvdGFsUm93Q291bnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCA9PT0gdGhpcy50b3RhbFJvd0NvdW50IHx8XG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPT09IHRoaXMudmlzaWJsZVJvd0NvdW50O1xuICB9XG5cbiAgLyoqIFNlbGVjdHMgYWxsIHJvd3MgaWYgdGhleSBhcmUgbm90IGFsbCBzZWxlY3RlZDsgb3RoZXJ3aXNlIGNsZWFyIHNlbGVjdGlvbi4gKi9cbiAgYXN5bmMgbWFzdGVyVG9nZ2xlKCkge1xuXG4gICAgaWYgKHRoaXMubG9hZGluZykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzQWxsU2VsZWN0ZWQoKSkge1xuICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgcm93cyA9IHRoaXMuX2RhdGFTb3VyY2UuZ2V0Um93cygpO1xuICAgICAgcm93cy5mb3JFYWNoKHJvdyA9PiB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2VsZWN0aW9uKGV2ZW50OiBFdmVudCwgb3B0cz86IHtpbnRlcmFjdGl2ZT86IGJvb2xlYW59KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBkZWxldGVDb3VudCA9IGF3YWl0IHRoaXMuZGVsZXRlUm93cyhldmVudCwgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQsIG9wdHMpO1xuICAgIGlmIChkZWxldGVDb3VudCA+IDApIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgcmV0dXJuIGRlbGV0ZUNvdW50O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFxuICAgKiBAcGFyYW0gcm93XG4gICAqIEBwYXJhbSBvcHRzIFVzZSBpbnRlcmFjdGl2ZT1mYWxzZSB0byBhdm9pZCB1c2VyIGludGVyYWN0aW9uIChlLmcuIHVzZXIgY29uZmlybWF0aW9uKVxuICAgKiAgQW5kIHRvIGZvcmNlIGRlbGV0aW9uIGV2ZW4gaWYgdGFibGUgaXMgYnVzeVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlUm93KGV2ZW50OiBFdmVudCB8IG51bGwsIHJvdzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4sIG9wdHM/OiB7IGludGVyYWN0aXZlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZGVsZXRlQ291bnQgPSBhd2FpdCB0aGlzLmRlbGV0ZVJvd3MoZXZlbnQsIFtyb3ddLCBvcHRzKTtcbiAgICByZXR1cm4gZGVsZXRlQ291bnQgPT09IDE7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEBwYXJhbSByb3dzXG4gICAqIEBwYXJhbSBvcHRzIFVzZSBpbnRlcmFjdGl2ZT1mYWxzZSB0byBhdm9pZCB1c2VyIGludGVyYWN0aW9uIChlLmcuIHVzZXIgY29uZmlybWF0aW9uKVxuICAgKiAgICBBbmQgdG8gZm9yY2UgZGVsZXRpb24gZXZlbiBpZiB0YWJsZSBpcyBidXN5XG4gICAqL1xuICBhc3luYyBkZWxldGVSb3dzKGV2ZW50OiBFdmVudCB8IG51bGwsIHJvd3M6IEFzeW5jVGFibGVFbGVtZW50PFQ+W10sIG9wdHM/OiB7IGludGVyYWN0aXZlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgdGhyb3cgeyBjb2RlOiBFcnJvckNvZGVzLlRBQkxFX1JFQURfT05MWSwgbWVzc2FnZTogJ0VSUk9SLlRBQkxFX1JFQURfT05MWScgfTtcbiAgICB9XG4gICAgaWYgKGV2ZW50Py5kZWZhdWx0UHJldmVudGVkKSByZXR1cm4gMDsgLy8gU0tpcFxuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuXG4gICAgaWYgKCF0aGlzLl9lbmFibGVkIHx8IGlzRW1wdHlBcnJheShyb3dzKSkgcmV0dXJuIDA7IC8vIFNraXAgaXMgZGlzYWJsZWQsIG9yIG5vIHJvd3MgdG8gZGVsZXRlXG5cbiAgICBpZiAodGhpcy5sb2FkaW5nICYmICghb3B0cyB8fCBvcHRzLmludGVyYWN0aXZlICE9PSBmYWxzZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignW2FwcC10YWJsZV0gU2tpcCBkZWxldGVSb3dzKCkgYmVjYXVzZSB0YWJsZSBpcyBidXN5IChsb2FkaW5nKS4gVXNlIG9wdHMuaW50ZXJhY3RpdmUgPSBmYWxzZSB0byBmb3JjZSBkZWxldGlvbicpO1xuICAgICAgcmV0dXJuIDA7IC8vIFNraXAgaWYgbG9hZGluZ1xuICAgIH1cblxuICAgIC8vIE1ha2Ugc3VyZSB0byBrZWVwIG5ld2x5IGNyZWF0ZWQgcm93XG4gICAgY29uc3QgZWRpdGVkUm93ID0gdGhpcy5kYXRhU291cmNlLmdldFNpbmdsZUVkaXRpbmdSb3coKTtcbiAgICBpZiAoZWRpdGVkUm93Py5pZCA9PT0gLTEgJiYgZWRpdGVkUm93LmVkaXRpbmcgJiYgIXJvd3MuaW5jbHVkZXMoZWRpdGVkUm93KSkge1xuICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5jb25maXJtRWRpdENyZWF0ZSgpO1xuICAgICAgaWYgKCFjb25maXJtZWQpIHJldHVybiAwOyAvLyBDYW5ub3QgZGVsZXRlIChlLmcuIGVkaXRlZCByb3cgaXMgaW52YWxpZClcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpdCBjYW4gZGVsZXRlXG4gICAgY29uc3QgY2FuRGVsZXRlID0gYXdhaXQgdGhpcy5jYW5EZWxldGVSb3dzKHJvd3MsIG9wdHMpO1xuICAgIGlmICghY2FuRGVsZXRlKSByZXR1cm4gMDsgLy8gQ2Fubm90IGRlbGV0ZVxuXG4gICAgLy8gUmV2ZXJzZSByb3cgb3JkZXIgKG9uIGEgY29weSlcbiAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCwgbmVlZCBiZWNhdXNlIHJvdy5kZWxldGUoKSBoYXMgYXN5bmMgZXhlY3V0aW9uXG4gICAgLy8gYW5kIGluZGV4IGNhY2hlIGlzIHVwZGF0ZWQgd2l0aCBhIGRlbGF5XG4gICAgbGV0IHRlbXBSb3dzID0gcm93cy5zbGljZSgpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5pZCA+IGIuaWQgPyAtMSA6IDEpO1xuXG4gICAgY29uc3QgZGVsZXRlZFJvd3M6IEFzeW5jVGFibGVFbGVtZW50PFQ+W10gPSBbXTtcblxuICAgIC8vIElmIGRhdGEgbmVlZCB0byBiZSBzYXZlZCBmaXJzdFxuICAgIGlmICh0aGlzLnNhdmVCZWZvcmVEZWxldGUpIHtcbiAgICAgIC8vIEV4Y2x1ZGUgaW52YWxpZCByb3dzIChiZWNhdXNlIG9mIHNhdmUoKSB3aWxsIGZhaWwsIHdoZW4gZXhpc3RzIHNvbWUgaW52YWxpZCByb3dzKVxuICAgICAgdGVtcFJvd3MgPSB0ZW1wUm93cy5maWx0ZXIocm93ID0+IHtcbiAgICAgICAgLy8gRGVsZXRlIHRoZSByb3cgOlxuICAgICAgICAvLyAtIGlmIG5ld2x5IGNyZWF0ZWQgcm93IChpZCA9IC0xKSxcbiAgICAgICAgLy8gLSBvciBpZiBpbnZhbGlkIGFuZCBub3QgZWRpdGluZyAoPSBub3QgY2FuY2VsbGFibGUpXG4gICAgICAgIGlmIChyb3cuaWQgPT09IC0xIHx8ICghcm93LmVkaXRpbmcgJiYgcm93LmludmFsaWQgLypkbyBub3QgdXNlICF2YWxpZCBiZWNhdXNlIGlmIHJvdyBpcyBkaXNhYmxlZCwgaXQgd2lsbCBiZSBhbHdheXMgIXZhbGlkICovKSkge1xuICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGBbdGFibGVdIERlbGV0ZSByb3cgIyR7cm93LmlkfWApO1xuICAgICAgICAgIHJvdy5kZWxldGUoKTtcbiAgICAgICAgICB0aGlzLnZpc2libGVSb3dDb3VudC0tO1xuICAgICAgICAgIHRoaXMudG90YWxSb3dDb3VudC0tO1xuICAgICAgICAgIGRlbGV0ZWRSb3dzLnB1c2gocm93KTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEV4Y2x1ZGUgZnJvbSB0aGUgbGlzdCB0byBkZWxldGUgdXNpbmcgdGhlIHNlcnZpY2VcbiAgICAgICAgfVxuICAgICAgICAvLyBDYW5jZWwgdGhlIHJvdyAoYW5kIG1hcmsgYXMgcHJpc3RpbmUpLCB3aGVuIG5vdCB2YWxpZCBidXQgaW4gZWRpdGlvblxuICAgICAgICBlbHNlIGlmIChyb3cuZWRpdGluZyAmJiAhcm93LnZhbGlkKSB7XG4gICAgICAgICAgcm93LmNhbmNlbCgpO1xuICAgICAgICAgIC8vIE1hcmsgcm93IGFzIHByaXN0aW5lIChpZiBwb3NzaWJsZSlcbiAgICAgICAgICB0aGlzLmNoZWNrSWZSb3dQcmlzdGluZShyb3csIHsgZW1pdEV2ZW50OiBmYWxzZSwgb25seVNlbGY6IHRydWUgLyphdm9pZCBwcm9wYWdhdGlvbiB0byB0YWJsZSovIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBLZWVwIHRoZSByb3cuIHRoZSByb3cgd2lsbCBiZSBkZWxldGVkIGFmdGVyIHRoZSBzYXZlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBcHBseSBzYXZlLCBvbmx5IGlmIHRoZXJlIGlzIHN0aWxsIHNvbWUgcm93cyB0byBkZWxldGVcbiAgICAgIC8vIFdBUk46IElmIG5vIG1vcmUgcm93cyAoZS5nLiBiZWNhdXNlIGFsbCBoYXMgYmVlbiBjYW5jZWxsZWQpIHRoZW4gY29udGludWUgYW55d2F5IHRvIGNsZWFyIGVkaXRlZFJvdyBhbmQgc2VsZWN0aW9uIChpc3N1ZSBJTUFHSU5FLTY2OSlcbiAgICAgIGlmIChkZWxldGVkUm93cy5sZW5ndGggfHwgdGVtcFJvd3MubGVuZ3RoKSB7XG5cbiAgICAgICAgLy8gU2F2ZSBkYXRhIChlLmcuIHdoZW4gdXNpbmcgbWVtb3J5IHNlcnZpY2UpXG4gICAgICAgIGNvbnN0IHNhdmVkID0gYXdhaXQgdGhpcy5zYXZlQmVmb3JlQWN0aW9uKCdkZWxldGUnKTtcbiAgICAgICAgaWYgKCFzYXZlZCkge1xuICAgICAgICAgIC8vIFN0b3AgaWYgc2F2ZSBjYW5jZWxsZWQgb3Igc2F2ZSBmYWlsZWRcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuXG4gICAgICAvLyBBcHBseSBkZWxldGlvbiBvbiBkYXRhc291cmNlXG4gICAgICAvLyBJZiBubyBtb3JlIHJvd3MgdG8gZGVsZXRlLCBjb250aW51ZSBhbnl3YXkgdG8gY2xlYXIgZWRpdGVkUm93IGFuZCBzZWxlY3Rpb24gKGlzc3VlIElNQUdJTkUtNjY5KVxuICAgICAgaWYgKHRlbXBSb3dzLmxlbmd0aCkge1xuICAgICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3RhYmxlXSBEZWxldGUgJHt0ZW1wUm93cy5sZW5ndGh9IHJvd3MuLi5gKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fZGF0YVNvdXJjZS5kZWxldGVBbGwodGVtcFJvd3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBETyBub3QgdXBkYXRlIG1hbnVhbGx5LCBiZWNhdXNlIHdhdGNoQUxsKCkuc3Vic2NyaWJlKCkgd2lsbCB1cGRhdGUgdGhpcyBjb3VudFxuICAgICAgLy90aGlzLnRvdGFsUm93Q291bnQgLT0gZGVsZXRlQ291bnQ7XG4gICAgICAvL3RoaXMudmlzaWJsZVJvd0NvdW50IC09IGRlbGV0ZUNvdW50O1xuXG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgdGhpcy5tYXJrQXNEaXJ0eSh7IGVtaXRFdmVudDogZmFsc2UgLyptYXJrRm9yQ2hlY2soKSBpcyBjYWxsZWQganVzdCBhZnRlciovIH0pO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgdGhpcy5vbkFmdGVyRGVsZXRlZFJvd3MubmV4dChyb3dzKTtcblxuICAgICAgcmV0dXJuIHJvd3MubGVuZ3RoO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zZXRFcnJvcihlcnIgJiYgZXJyLm1lc3NhZ2UgfHwgZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZWxlY3RSb3dCeUlkKGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgIGF3YWl0IHRoaXMud2FpdElkbGUoKTtcbiAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Um93KGlkKTtcbiAgICBpZiAoIXJvdykgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmNsaWNrUm93KG51bGwsIHJvdyk7XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHNlbGVjdCByb3cgYnkgZGF0YS4gV2lsbCB1c2UgZGF0YUVxdWFscygpICh0aGF0IGNhbGwgRW50aXR5VXRpbHMuZXF1YWxzKCkpIHRvIGZpbmQgc2FtZSByb3cncyBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBhc3luYyBzZWxlY3RSb3dCeURhdGEoZGF0YTogVCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgIGF3YWl0IHRoaXMud2FpdElkbGUoKTtcbiAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Um93cygpXG4gICAgICAuZmluZChyb3cgPT4gdGhpcy5lcXVhbHMocm93LmN1cnJlbnREYXRhLCBkYXRhKSk7XG4gICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5jbGlja1JvdyhudWxsLCByb3cpO1xuICB9XG5cbiAgYXN5bmMgY2xpY2tSb3coZXZlbnQ6IEV2ZW50IHwgdW5kZWZpbmVkLCByb3c6IEFzeW5jVGFibGVFbGVtZW50PFQ+KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMubG9hZGluZykge1xuICAgICAgLy8gV2FpdCB3aGlsZSBsb2FkaW5nLCBhbmQgbG9vcFxuICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1t0YWJsZV0gV2FpdGluZyBiZWZvcmUgYXBwbHkgY2xpY2tSb3coKSAoZGF0YXNvdXJjZSBpcyBidXN5KS4uLicpO1xuICAgICAgYXdhaXQgdGhpcy53YWl0SWRsZSh7IHRpbWVvdXQ6IDIwMDAgfSk7XG4gICAgfVxuXG4gICAgLy8gREVCVUdcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJbdGFibGVdIERldGVjdCBjbGljayBvbiByb3dcIik7XG5cbiAgICAvLyBDYW5jZWxsZWQgYnkgZXZlbnRcbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbdGFibGVdIGNsaWNrUm93IGV2ZW50IGlzIGRlZmF1bHRQcmV2ZW50ZWQnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBBbHJlYWR5IGluIGVkaXRpb25cbiAgICBpZiAocm93LmlkID09PSAtMSB8fCByb3cuZWRpdGluZykge1xuICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1t0YWJsZV0gUm93IGFscmVhZHkgZWRpdGluZy4gU2tpcCBjbGlja1JvdyBldmVudCcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gT3BlbiB0aGUgZGV0YWlsIHBhZ2UgKGlmIG5vdCBpbmxpbmUgZWRpdGluZylcbiAgICBpZiAoIXRoaXMuaW5saW5lRWRpdGlvbikge1xuXG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcblxuICAgICAgdGhpcy5vcGVuUm93KHJvdy5jdXJyZW50RGF0YS5pZCwgcm93KVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLm1hcmtBc0xvYWRlZCgpKVxuICAgICAgICAuY2F0Y2goKCkgPT4gdGhpcy5tYXJrQXNMb2FkZWQoKSk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IGVkaXRpbmcgcm93XG4gICAgcmV0dXJuIHRoaXMuZWRpdFJvdyhldmVudCwgcm93LCB7IGZvY3VzQ29sdW1uOiB1bmRlZmluZWQgLypmb3JjZSB0byB1c2UgdGhlIGNsaWNrIHRhcmdldCovIH0pO1xuICB9XG5cbiAgYXN5bmMgbW92ZVJvdyhpZDogbnVtYmVyLCBkaXJlY3Rpb246IG51bWJlcikge1xuICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5tb3ZlKGlkLCBkaXJlY3Rpb24pO1xuICB9XG5cbiAgcmVhZHkob3B0cz86IFdhaXRGb3JPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHdhaXRGb3JUcnVlKHRoaXMucmVhZHlTdWJqZWN0LCBvcHRzKTtcbiAgfVxuXG4gIHdhaXRJZGxlKG9wdHM/OiBXYWl0Rm9yT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB3YWl0Rm9yRmFsc2UodGhpcy5sb2FkaW5nU3ViamVjdCwgb3B0cyk7XG4gIH1cblxuICBhc3luYyBvcGVuU2VsZWN0Q29sdW1uc01vZGFsKGV2ZW50PzogRXZlbnQpOiBQcm9taXNlPGFueT4ge1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgLy8gQ29weSBjdXJyZW50IGNvbHVtbnMgKGRlZXAgY29weSlcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRDdXJyZW50Q29sdW1ucygpO1xuXG4gICAgY29uc3QgaGFzVG9wTW9kYWwgPSAhIShhd2FpdCB0aGlzLm1vZGFsQ3RybC5nZXRUb3AoKSk7XG4gICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xuICAgICAgY29tcG9uZW50OiBUYWJsZVNlbGVjdENvbHVtbnNDb21wb25lbnQsXG4gICAgICBjb21wb25lbnRQcm9wczogeyBjb2x1bW5zIH0sXG4gICAgICBjc3NDbGFzczogaGFzVG9wTW9kYWwgJiYgJ3N0YWNrLW1vZGFsJ1xuICAgIH0pO1xuXG4gICAgLy8gT3BlbiB0aGUgbW9kYWxcbiAgICBhd2FpdCBtb2RhbC5wcmVzZW50KCk7XG5cbiAgICAvLyBPbiBkaXNtaXNzXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBtb2RhbC5vbkRpZERpc21pc3MoKTtcbiAgICBpZiAoIWRhdGEpIHJldHVybjsgLy8gQ0FOQ0VMTEVEXG5cbiAgICAvLyBBcHBseSBjb2x1bW5zXG4gICAgY29uc3QgdXNlckNvbHVtbnMgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKGMgPT4gYy5jYW5IaWRlID09PSBmYWxzZSB8fCBjLnZpc2libGUpLm1hcChjID0+IGMubmFtZSkgfHwgW107XG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gUkVTRVJWRURfU1RBUlRfQ09MVU1OUy5jb25jYXQodXNlckNvbHVtbnMpLmNvbmNhdChSRVNFUlZFRF9FTkRfQ09MVU1OUyk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcblxuICAgIC8vIFVwZGF0ZSB1c2VyIHNldHRpbmdzXG4gICAgYXdhaXQgdGhpcy5zYXZlUGFnZVNldHRpbmdzKHVzZXJDb2x1bW5zLCBTRVRUSU5HU19ESVNQTEFZX0NPTFVNTlMpO1xuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIHJvdzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4pIHtcbiAgICByZXR1cm4gcm93LmlkO1xuICB9XG5cbiAgZG9SZWZyZXNoKGV2ZW50PzogQ29tcGxldGFibGVFdmVudCkge1xuICAgIHRoaXMub25SZWZyZXNoLmVtaXQoZXZlbnQpO1xuXG4gICAgLy8gV2hlbiB0YXJnZXQgd2FpdCBmb3IgYSBjb21wbGV0ZSAoZS5nLiBJb25SZWZyZXNoZXIpXG4gICAgaWYgKGV2ZW50Py50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LmNvbXBsZXRlKSB7XG4gICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0SWRsZSgpO1xuICAgICAgICBldmVudC50YXJnZXQuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldEN1cnJlbnRDb2x1bW5zKCk6IENvbHVtbkl0ZW1bXSB7XG4gICAgY29uc3QgaGlkZGVuQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5zbGljZShSRVNFUlZFRF9TVEFSVF9DT0xVTU5TLmxlbmd0aClcbiAgICAgIC5maWx0ZXIobmFtZSA9PiB0aGlzLmRpc3BsYXllZENvbHVtbnMuaW5kZXhPZihuYW1lKSA9PT0gLTEpO1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXllZENvbHVtbnNcbiAgICAgIC5jb25jYXQoaGlkZGVuQ29sdW1ucylcbiAgICAgIC5maWx0ZXIobmFtZSA9PiAhUkVTRVJWRURfU1RBUlRfQ09MVU1OUy5pbmNsdWRlcyhuYW1lKSAmJiAhUkVTRVJWRURfRU5EX0NPTFVNTlMuaW5jbHVkZXMobmFtZSlcbiAgICAgICAgJiYgIXRoaXMuZXhjbHVkZXNDb2x1bW5zLmluY2x1ZGVzKG5hbWUpKVxuICAgICAgLm1hcChuYW1lID0+ICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGxhYmVsOiB0aGlzLmdldEkxOG5Db2x1bW5OYW1lKG5hbWUpLFxuICAgICAgICB2aXNpYmxlOiB0aGlzLmRpc3BsYXllZENvbHVtbnMuaW5kZXhPZihuYW1lKSAhPT0gLTEsXG4gICAgICAgIGNhbkhpZGU6IHRoaXMuZ2V0UmVxdWlyZWRDb2x1bW5zKCkuaW5kZXhPZihuYW1lKSA9PT0gLTFcbiAgICAgIH0pKTtcbiAgfVxuXG4gIGFzeW5jIGVzY2FwZUVkaXRpbmdSb3coZXZlbnQ/OiBFdmVudCwgcm93PzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4pIHtcbiAgICByb3cgPSByb3cgfHwgdGhpcy5kYXRhU291cmNlLmdldFNpbmdsZUVkaXRpbmdSb3coKTtcbiAgICBpZiAoIXJvdyB8fCAhcm93LmVkaXRpbmcpIHJldHVybjtcblxuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKCdbYXBwLXRhYmxlXSBDYW5jZWwgdGhlIHJvdyAoa2V5ZG93bi5lc2NhcGUpJyk7XG5cbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIC8vIEF2b2lkIHRvIGNhbmNlbCB0aGUgZWRpdG9yXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgLy8gSWYgbmV3IHJvdyAobm8gaWQpXG4gICAgaWYgKHJvdy5pZCA9PT0gLTEpIHtcbiAgICAgIGlmIChyb3cudmFsaWRhdG9yKSB7XG4gICAgICAgIC8vIElmIHBlbmRpbmc6IFdhaXQgZW5kIG9mIHZhbGlkYXRpb24sIHRoZW4gbG9vcFxuICAgICAgICBpZiAocm93LnBlbmRpbmcpIHtcbiAgICAgICAgICBhd2FpdCBBcHBGb3JtVXRpbHMud2FpdFdoaWxlUGVuZGluZyhyb3cudmFsaWRhdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJvdyBpcyBpbnZhbGlkOiBkZWxldGUgdGhlIHJvd1xuICAgICAgICBpZiAocm93LmludmFsaWQpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZU5ld1JvdyhldmVudCwgcm93KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGhlIHJvdyBleGlzdHMgKGhhcyBhbiBpZClcbiAgICBlbHNlIHtcbiAgICAgIC8vIG5lZWQgdG8gY2FsbCBjYW5jZWwgZnVuY3Rpb24gKGlmIGNvbmZpcm1hdGlvbiB3aWxsIGJlIGNhbGxlZCBiZWZvcmUpXG4gICAgICBpZiAodGhpcy5jb25maXJtQmVmb3JlQ2FuY2VsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2FuY2VsRXhpc3RpbmdSb3coZXZlbnQsIHJvdywgeyBrZWVwRWRpdGluZzogZmFsc2UgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCeSBkZWZhdWx0LCB0cnkgdG8gY29uZmlybSB0aGUgcm93XG4gICAgYXdhaXQgdGhpcy5jb25maXJtRWRpdENyZWF0ZShldmVudCwgcm93KTtcbiAgfVxuXG4gIHRyYW5zbGF0ZUNvbnRyb2xQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gQ2FuIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcywgdG8gcmVzb2x2ZSBhbGwgZmllbGQgbmFtZVxuXG4gICAgLy8gVXNlIGNvbHVtbnMga2V5LCBoYXMgZGVmYXVsdCBuYW1lXG4gICAgY29uc3QgaTE4bkNvbHVtbktleSA9IHRoaXMuZ2V0STE4bkNvbHVtbk5hbWUocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlPy5pbnN0YW50KGkxOG5Db2x1bW5LZXkpIHx8IGkxOG5Db2x1bW5LZXk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kIC0tICovXG5cblxuICBwcm90ZWN0ZWQgYXN5bmMgZWRpdFJvdyhldmVudDogRXZlbnQgfCB1bmRlZmluZWQsIHJvdzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4sIG9wdHM/OiB7IGZvY3VzQ29sdW1uPzogc3RyaW5nIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcblxuICAgIGlmICghdGhpcy5fZW5hYmxlZCB8fCAhdGhpcy5pbmxpbmVFZGl0aW9uKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuZGF0YVNvdXJjZS5nZXRFZGl0aW5nUm93cygpLmluY2x1ZGVzKHJvdykpIHJldHVybiB0cnVlOyAvLyBBbHJlYWR5IHRoZSBlZGl0ZWQgcm93XG4gICAgaWYgKGV2ZW50Py5kZWZhdWx0UHJldmVudGVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoIWF3YWl0IHRoaXMuY29uZmlybUVkaXRDcmVhdGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghcm93LmVkaXRpbmcgJiYgIXRoaXMubG9hZGluZykge1xuICAgICAgdGhpcy5mb2N1c0NvbHVtbiA9IG9wdHMgJiYgb3B0cy5mb2N1c0NvbHVtbiB8fCB0aGlzLmZvY3VzQ29sdW1uO1xuICAgICAgYXdhaXQgdGhpcy5fZGF0YVNvdXJjZS5zdGFydEVkaXQocm93KTtcbiAgICB9XG4gICAgdGhpcy5vblN0YXJ0RWRpdGluZ1Jvdy5lbWl0KHJvdyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHNlbGVjdCByb3csIGJ5IHJvdy5pZCwgb3IgYnkgZGF0YS4gV0lsbCB1c2UgRW50aXR5VXRpbHMuZXF1YWxzKClcbiAgICpcbiAgICogQHBhcmFtIGlkXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBzZWxlY3RSb3dCeUlkT3JEYXRhKGlkOiBudW1iZXIsIGRhdGE/OiBUKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICB0cnkge1xuXG4gICAgICAvLyBTZWxlY3QgYnkgcm93IGlkIChpZiBOT1QgYSBuZXcgcm93KVxuICAgICAgaWYgKGlzTm90TmlsKGlkKSB8fCBpZCAhPT0gLTEpIHtcbiAgICAgICAgZG9uZSA9IGF3YWl0IHRoaXMuc2VsZWN0Um93QnlJZChpZCk7XG4gICAgICAgIGlmIChkb25lKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc29sZS53YXJuKCdbYXBwLXRhYmxlXSBTYXZlOiBDYW5ub3QgcmVzZWxlY3Qgcm93IGJ5IHJvdy5pZDogJywgaWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBUcnkgYnkgZGF0YVxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZG9uZSA9IGF3YWl0IHRoaXMuc2VsZWN0Um93QnlEYXRhKGRhdGEpO1xuICAgICAgICBpZiAoZG9uZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnNvbGUud2FybignW2FwcC10YWJsZV0gU2F2ZTogQ2Fubm90IHJlc2VsZWN0IHJvdyBieSBkYXRhOiAnLCBkYXRhKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gTG9nLCBidXQgY29udGludWVcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVycik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiB0aGUgc2VsZWN0ZWQgcm93IGlmIHVuaXF1ZSBpbiBzZWxlY3Rpb25cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgc2luZ2xlU2VsZWN0ZWRSb3coKTogQXN5bmNUYWJsZUVsZW1lbnQ8VD4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZD8ubGVuZ3RoID09PSAxID8gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRbMF0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2FuRGVsZXRlUm93cyhyb3dzOiBBc3luY1RhYmxlRWxlbWVudDxUPltdLCBvcHRzPzogeyBpbnRlcmFjdGl2ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXG4gICAgLy8gQ2hlY2sgdXNpbmcgZW1pdHRlclxuICAgIGlmICh0aGlzLm9uQmVmb3JlRGVsZXRlUm93cy5vYnNlcnZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2FuRGVsZXRlID0gYXdhaXQgZW1pdFByb21pc2VFdmVudCh0aGlzLm9uQmVmb3JlRGVsZXRlUm93cywgJ2NhbkRlbGV0ZScsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgcm93cyB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNhbkRlbGV0ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgPT09ICdDQU5DRUxMRUQnKSByZXR1cm4gZmFsc2U7IC8vIFVzZXIgY2FuY2VsXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoaWxlIGNoZWNraW5nIGlmIGNhbiBkZWxldGUgcm93cycsIGVycik7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBc2sgdXNlciBjb25maXJtYXRpb25cbiAgICBpZiAodGhpcy5jb25maXJtQmVmb3JlRGVsZXRlICYmICghb3B0cyB8fCBvcHRzLmludGVyYWN0aXZlICE9PSBmYWxzZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmFza0RlbGV0ZUNvbmZpcm1hdGlvbihudWxsLCByb3dzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2FuQ2FuY2VsUm93cyhyb3dzPzogQXN5bmNUYWJsZUVsZW1lbnQ8VD5bXSwgb3B0cz86IHsgaW50ZXJhY3RpdmU/OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcblxuICAgIC8vIEdldCBkaXJ0eSByb3dzXG4gICAgcm93cyA9IHJvd3MgfHwgdGhpcy5kYXRhU291cmNlLmdldFJvd3MoKS5maWx0ZXIocm93ID0+IHJvdy52YWxpZGF0b3I/LmRpcnR5KTtcblxuICAgIGlmIChpc0VtcHR5QXJyYXkocm93cykpIHJldHVybiB0cnVlOyAvLyBObyBkaXJ0eTogT0tcblxuICAgIC8vIENoZWNrIHVzaW5nIGVtaXR0ZXJcbiAgICBpZiAodGhpcy5vbkJlZm9yZUNhbmNlbFJvd3Mub2JzZXJ2ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGlzQ2FuY2VsID0gYXdhaXQgZW1pdFByb21pc2VFdmVudCh0aGlzLm9uQmVmb3JlQ2FuY2VsUm93cywgJ2NhbkNhbmNlbCcsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgcm93cyB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWlzQ2FuY2VsKSByZXR1cm4gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciA9PT0gJ0NBTkNFTExFRCcpIHJldHVybiBmYWxzZTsgLy8gVXNlciBjYW5jZWxcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hpbGUgY2hlY2tpbmcgaWYgY2FuIGNhbmNlbCByb3dzJywgZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFzayB1c2VyIGNvbmZpcm1hdGlvblxuICAgIGlmICh0aGlzLmNvbmZpcm1CZWZvcmVDYW5jZWwgJiYgKCFvcHRzIHx8IG9wdHMuaW50ZXJhY3RpdmUgIT09IGZhbHNlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXNrQ2FuY2VsQ29uZmlybWF0aW9uKG51bGwsIHJvd3MpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzYXZlQmVmb3JlQWN0aW9uKHNhdmVBY3Rpb246IFNhdmVBY3Rpb25UeXBlKTogUHJvbWlzZTxib29sZWFuPiB7XG5cbiAgICBpZiAoIXRoaXMuZGlydHkpIHtcbiAgICAgIC8vIENvbnRpbnVlIHdpdGhvdXQgc2F2ZVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgbGV0IHNhdmU6IGJvb2xlYW47XG4gICAgc3dpdGNoIChzYXZlQWN0aW9uKSB7XG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICBzYXZlID0gdGhpcy5zYXZlQmVmb3JlRGVsZXRlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZpbHRlcic6XG4gICAgICAgIHNhdmUgPSB0aGlzLnNhdmVCZWZvcmVGaWx0ZXI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc29ydCc6XG4gICAgICAgIHNhdmUgPSB0aGlzLnNhdmVCZWZvcmVTb3J0O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHNhdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgYmVoYXZpb3JcbiAgICBsZXQgY29uZmlybWVkID0gdHJ1ZTtcblxuICAgIGlmIChzYXZlKSB7XG4gICAgICBpZiAodGhpcy5vbkJlZm9yZVNhdmUub2JzZXJ2ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gQXNrIGNvbmZpcm1hdGlvblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGVtaXRQcm9taXNlRXZlbnQodGhpcy5vbkJlZm9yZVNhdmUsICdiZWZvcmVTYXZlJywge1xuICAgICAgICAgICAgZGV0YWlsOiB7IGFjdGlvbjogc2F2ZUFjdGlvbiwgdmFsaWQ6IHRoaXMudmFsaWQgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbmZpcm1lZCA9IHJlcy5jb25maXJtZWQ7XG4gICAgICAgICAgc2F2ZSA9IHJlcy5zYXZlO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoZXJyID09PSAnQ0FOQ0VMTEVEJykgcmV0dXJuIGZhbHNlOyAvLyBVc2VyIGNhbmNlbFxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoaWxlIGNoZWNraW5nIGlmIGNhbiBkZWxldGUgcm93cycsIGVycik7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICBpZiAoc2F2ZSkge1xuICAgICAgICAvLyBVc2VyIGNvbmZpcm1lZCBzYXZlXG4gICAgICAgIGNvbnN0IHNhdmVkID0gYXdhaXQgdGhpcy5zYXZlKCk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTsgLy8gUmVzdG9yZSBkaXJ0eSBmbGFnXG4gICAgICAgIHJldHVybiBzYXZlZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlOyAvLyBObyBzYXZlIGJ1dCBjb250aW51ZSBhY3Rpb25cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7IC8vIFVzZXIgY2FuY2VsIHRoZSBhY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgcm93IGRldGFpbCB2aWV3LiBCeSBkZWZhdWx0LCB3aWxsIHRvIG9wZW4gcm93IGRldGFpbCBwYWdlLlxuICAgKiBDYW4gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLCBCVVQgcHJlZmVyIHRvIHN1YnNjcmliZSBvbiBvbk9wZW5Sb3dcbiAgICpcbiAgICogQHBhcmFtIGlkXG4gICAqIEBwYXJhbSByb3dcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9wZW5Sb3coaWQ6IElELCByb3c6IEFzeW5jVGFibGVFbGVtZW50PFQ+KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuYWxsb3dSb3dEZXRhaWwpIHtcbiAgICAgIGlmICh0aGlzLmRlYnVnICYmIHRoaXMuZGlydHkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbdGFibGVdIE9wZW5pbmcgcm93IGRldGFpbHMsIGJ1dCB0YWJsZSBoYXMgdW5zYXZlZCBjaGFuZ2VzIScpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vbk9wZW5Sb3cub2JzZXJ2ZXJzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLm9uT3BlblJvdy5lbWl0KHJvdyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBObyBJRCBkZWZpbmVkOiB1bmFibGUgdG8gb3BlbiBkZXRhaWxzXG4gICAgICBpZiAoaXNOaWwoaWQpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW3RhYmxlXSBPcGVuaW5nIHJvdyBkZXRhaWxzLCBidXQgZGF0YSBoYXMgbm8gaWQhJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLicsIGlkLnRvU3RyaW5nKCldLCB7XG4gICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICAgIHF1ZXJ5UGFyYW1zOiB7fVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBvcGVuTmV3Um93RGV0YWlsKGV2ZW50PzogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLmFsbG93Um93RGV0YWlsKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5vbk5ld1Jvdy5vYnNlcnZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5vbk5ld1Jvdy5lbWl0KGV2ZW50KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ25ldyddLCB7XG4gICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlXG4gICAgfSk7XG4gIH1cblxuICAvLyBjYW4gYmUgb3ZlcnJpZGRlbiB0byBhZGQgbW9yZSByZXF1aXJlZCBjb2x1bW5zXG4gIHByb3RlY3RlZCBnZXRSZXF1aXJlZENvbHVtbnMoKSB7XG4gICAgcmV0dXJuIERFRkFVTFRfUkVRVUlSRURfQ09MVU1OUztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRVc2VyQ29sdW1ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFnZVNldHRpbmdzKFNFVFRJTkdTX0RJU1BMQVlfQ09MVU1OUyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U29ydGVkQ29sdW1uKCk6IE1hdFNvcnRhYmxlIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRQYWdlU2V0dGluZ3MoU0VUVElOR1NfU09SVEVEX0NPTFVNTik7XG4gICAgY29uc3QgcGFydHMgPSBkYXRhICYmIGRhdGEuc3BsaXQoJzonKTtcbiAgICBpZiAocGFydHMgJiYgcGFydHMubGVuZ3RoID09PSAyICYmIHRoaXMuY29sdW1ucy5pbmNsdWRlcyhwYXJ0c1swXSkpIHtcbiAgICAgIHJldHVybiB7IGlkOiBwYXJ0c1swXSwgc3RhcnQ6IHBhcnRzWzFdID09PSAnZGVzYycgPyAnZGVzYycgOiAnYXNjJywgZGlzYWJsZUNsZWFyOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWZhdWx0U29ydEJ5KSB7XG4gICAgICByZXR1cm4geyBpZDogdGhpcy5kZWZhdWx0U29ydEJ5LCBzdGFydDogdGhpcy5kZWZhdWx0U29ydERpcmVjdGlvbiB8fCAnYXNjJywgZGlzYWJsZUNsZWFyOiBmYWxzZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBpZDogJ2lkJywgc3RhcnQ6ICdhc2MnLCBkaXNhYmxlQ2xlYXI6IGZhbHNlIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UGFnZVNpemUoKTogbnVtYmVyIHtcbiAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMuZ2V0UGFnZVNldHRpbmdzPG51bWJlcj4oU0VUVElOR1NfUEFHRV9TSVpFKTtcbiAgICByZXR1cm4gcGFnZVNpemUgfHwgdGhpcy5kZWZhdWx0UGFnZVNpemU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheUNvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIGxldCB1c2VyQ29sdW1ucyA9IHRoaXMuZ2V0VXNlckNvbHVtbnMoKTtcblxuICAgIC8vIE5vIHVzZXIgb3ZlcnJpZGVcbiAgICBpZiAoIXVzZXJDb2x1bW5zKSB7XG4gICAgICAvLyBSZXR1cm4gZGVmYXVsdCwgd2l0aG91dCBjb2x1bW5zIHRvIGhpZGVcbiAgICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiAhdGhpcy5leGNsdWRlc0NvbHVtbnMuaW5jbHVkZXMoY29sdW1uKSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IGZpeGVkIHN0YXJ0IGNvbHVtbnNcbiAgICBjb25zdCBmaXhlZFN0YXJ0Q29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBSRVNFUlZFRF9TVEFSVF9DT0xVTU5TLmluY2x1ZGVzKGMpKTtcblxuICAgIC8vIFJlbW92ZSBlbmQgY29sdW1uc1xuICAgIGNvbnN0IGZpeGVkRW5kQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBSRVNFUlZFRF9FTkRfQ09MVU1OUy5pbmNsdWRlcyhjKSk7XG5cbiAgICAvLyBSZW1vdmUgZml4ZWQgY29sdW1ucyBmcm9tIHVzZXIgY29sdW1uc1xuICAgIHVzZXJDb2x1bW5zID0gdXNlckNvbHVtbnMuZmlsdGVyKGMgPT4gIWZpeGVkU3RhcnRDb2x1bW5zLmluY2x1ZGVzKGMpICYmICFmaXhlZEVuZENvbHVtbnMuaW5jbHVkZXMoYykgJiYgdGhpcy5jb2x1bW5zLmluY2x1ZGVzKGMpKTtcblxuICAgIC8vIEFkZCByZXF1aXJlZCBjb2x1bW5zIGlmIG1pc3NpbmdcbiAgICB1c2VyQ29sdW1ucy5wdXNoKC4uLnRoaXMuZ2V0UmVxdWlyZWRDb2x1bW5zKCkuZmlsdGVyKGMgPT4gIWZpeGVkU3RhcnRDb2x1bW5zLmluY2x1ZGVzKGMpICYmICFmaXhlZEVuZENvbHVtbnMuaW5jbHVkZXMoYykgJiYgIXVzZXJDb2x1bW5zLmluY2x1ZGVzKGMpKSk7XG5cbiAgICByZXR1cm4gZml4ZWRTdGFydENvbHVtbnNcbiAgICAgIC5jb25jYXQodXNlckNvbHVtbnMpXG4gICAgICAuY29uY2F0KGZpeGVkRW5kQ29sdW1ucylcbiAgICAgIC8vIFJlbW92ZSBjb2x1bW5zIHRvIGhpZGVcbiAgICAgIC5maWx0ZXIoY29sdW1uID0+ICF0aGlzLmV4Y2x1ZGVzQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW4pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbXB1dGUgZGlzcGxheSBjb2x1bW5zXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCB1cGRhdGVDb2x1bW5zKCkge1xuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuZ2V0RGlzcGxheUNvbHVtbnMoKTtcbiAgICBpZiAoIXRoaXMubG9hZGluZykgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlclN1YnNjcmlwdGlvbihzdWI6IFN1YnNjcmlwdGlvbikge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoc3ViKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1bnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHN1YjogU3Vic2NyaXB0aW9uKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZShzdWIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyQXV0b2NvbXBsZXRlRmllbGQ8RSA9IGFueSwgRUYgPSBhbnk+KGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zPzogTWF0QXV0b2NvbXBsZXRlRmllbGRBZGRPcHRpb25zPEUsIEVGPik6IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnPEUsIEVGPiB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dG9jb21wbGV0ZUNvbmZpZ0hvbGRlci5hZGQoZmllbGROYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRJMThuQ29sdW1uTmFtZShjb2x1bW5OYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKHRoaXMuaTE4bkNvbHVtblByZWZpeCB8fCAnJykgKyBjaGFuZ2VDYXNlVG9VbmRlcnNjb3JlKGNvbHVtbk5hbWUpLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVUYWJsZUlkKCkge1xuICAgIC8vIG5vaW5zcGVjdGlvbiBKU05vbkFTQ0lJTmFtZXNcbiAgICBjb25zdCBpZCA9IHRoaXMubG9jYXRpb24ucGF0aCh0cnVlKVxuICAgICAgICAucmVwbGFjZSgvWz9dLiokL2csICcnKVxuICAgICAgICAucmVwbGFjZSgvXFwvXFxkKy9nLCAnX2lkJylcbiAgICAgICsgJ18nXG4gICAgICAvLyBHZXQgYSBjb21wb25lbnQgdW5pcXVlIG5hbWUgLSBTZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjAxMTQ2ODIvaG93LXRvLWFjY2Vzcy1jb21wb25lbnRzLXVuaXF1ZS1lbmNhcHN1bGF0aW9uLWlkLWluLWFuZ3VsYXItOVxuICAgICAgKyAodGhpcy5jb25zdHJ1Y3RvclsnybVjbXAnXT8uaWQgfHwgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKFwiW3RhYmxlXSBpZCA9IFwiICsgaWQpO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBhZGRSb3dUb1RhYmxlKGluc2VydEF0PzogbnVtYmVyLCBvcHRzPzogeyBmb2N1c0NvbHVtbj86IHN0cmluZzsgZWRpdGluZz86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW4gfSk6IFByb21pc2U8QXN5bmNUYWJsZUVsZW1lbnQ8VD4gfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBUcnkgdG8gZmluaXNoIGVkaXRlZCByb3cgZmlyc3RcbiAgICBpZiAoIWF3YWl0IHRoaXMuY29uZmlybUVkaXRDcmVhdGUoKSkge1xuICAgICAgY29uc29sZS53YXJuKCdbdGFibGVdIENhbm5vdCBhZGQgbmV3IHJvdywgYmVjYXVzZSB0aGUgcHJldmlvdXMgZWRpdGVkIHJvdyBjYW5ub3QgYmUgY29uZmlybWVkJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGVkaXRpbmcgPSB0aGlzLmlubGluZUVkaXRpb24gJiYgKCFvcHRzIHx8IG9wdHMuZWRpdGluZyAhPT0gZmFsc2UpOyAvLyB0cnVlIGJ5IGRlZmF1bHQsIGlmIGlubGluZUVkaXRpb25cblxuICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuX2RhdGFTb3VyY2UuY3JlYXRlTmV3KGluc2VydEF0LCB7IGVkaXRpbmcgfSk7XG4gICAgaWYgKCFyb3cpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBpZiAocm93LmVkaXRpbmcpIHtcbiAgICAgIC8vIFVwZGF0ZSBmb2N1c2VkIGNvbHVtblxuICAgICAgdGhpcy5mb2N1c0ZpcnN0Q29sdW1uID0gdHJ1ZTtcbiAgICAgIHRoaXMuZm9jdXNDb2x1bW4gPSBvcHRzPy5mb2N1c0NvbHVtbiB8fCB0aGlzLmZpcnN0VXNlckNvbHVtbjtcblxuICAgICAgLy8gRW1pdCBzdGFydCBlZGl0aW5nIGV2ZW50XG4gICAgICB0aGlzLm9uU3RhcnRFZGl0aW5nUm93LmVtaXQocm93KTtcbiAgICB9XG5cbiAgICB0aGlzLnRvdGFsUm93Q291bnQrKztcbiAgICB0aGlzLnZpc2libGVSb3dDb3VudCsrO1xuXG4gICAgdGhpcy5tYXJrQXNEaXJ0eSh7IGVtaXRFdmVudDogZmFsc2UgLyptYXJrRm9yQ2hlY2soKSBpcyBjYWxsZWQganVzdCBhZnRlciovIH0pO1xuXG4gICAgLy8gRW1pdCBldmVudFxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHRoaXMubWFya0ZvckNoZWNrKCk7XG5cbiAgICByZXR1cm4gcm93O1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyQ2VsbFZhbHVlQ2hhbmdlcyhuYW1lOiBzdHJpbmcsIGZvcm1QYXRoPzogc3RyaW5nLCBlbWl0SW5pdGlhbFZhbHVlPzogYm9vbGVhbik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgZm9ybVBhdGggPSBmb3JtUGF0aCB8fCBuYW1lO1xuICAgIGVtaXRJbml0aWFsVmFsdWUgPSBlbWl0SW5pdGlhbFZhbHVlIHx8IGZhbHNlO1xuICAgIGxldCBkZWYgPSB0aGlzLl9jZWxsVmFsdWVDaGFuZ2VzRGVmc1tuYW1lXTtcbiAgICBpZiAoZGVmICYmIChkZWYuZm9ybVBhdGggIT09IGZvcm1QYXRoIHx8IGRlZi5lbWl0SW5pdGlhbFZhbHVlICE9PSBlbWl0SW5pdGlhbFZhbHVlKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0FscmVhZHkgcmVnaXN0ZXIgYSBjZWxsIHZhbHVlIGNoYW5nZSBmb3IgdGhpcyBuYW1lLCB3aXRoIGRpZmZlcmVudCBcXCdmb3JtUGF0aFxcJyBvciBcXCdlbWl0SW5pdGlhbFZhbHVlXFwnLiBQbGVhc2UgdXNlIHNhbWUgYXJndW1lbnRzLicpO1xuICAgIH1cblxuICAgIC8vIE5vdCBleGlzdHM6IHJlZ2lzdGVyIG5ldyBkZWZpbml0aW9uXG4gICAgaWYgKCFkZWYpIHtcbiAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGBbdGFibGVdIE5ldyBsaXN0ZW5lciB7JHtuYW1lfX0gZm9yIHZhbHVlIGNoYW5nZXMgb24gcGF0aCAke2Zvcm1QYXRofWApO1xuICAgICAgZGVmID0ge1xuICAgICAgICBzdWJqZWN0OiBuZXcgU3ViamVjdDxhbnk+KCksXG4gICAgICAgIHN1YnNjcmlwdGlvbjogbnVsbCxcbiAgICAgICAgZm9ybVBhdGgsXG4gICAgICAgIGVtaXRJbml0aWFsVmFsdWVcbiAgICAgIH07XG4gICAgICB0aGlzLl9jZWxsVmFsdWVDaGFuZ2VzRGVmc1tuYW1lXSA9IGRlZjtcblxuICAgICAgLy8gU3RhcnQgdGhlIGxpc3RlbmVyLCB3aGVuIGVkaXRpbmcgc3RhcnRzXG4gICAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgICB0aGlzLm9uU3RhcnRFZGl0aW5nUm93LnN1YnNjcmliZShyb3cgPT4gdGhpcy5zdGFydENlbGxWYWx1ZUNoYW5nZXMobmFtZSwgcm93KSkpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWYuc3ViamVjdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRTaG93Q29sdW1uKGNvbHVtbk5hbWU6IHN0cmluZywgc2hvdzogYm9vbGVhbiwgb3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKCF0aGlzLmV4Y2x1ZGVzQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW5OYW1lKSAhPT0gc2hvdykge1xuICAgICAgaWYgKCFzaG93KSB7XG4gICAgICAgIHRoaXMuZXhjbHVkZXNDb2x1bW5zLnB1c2goY29sdW1uTmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZXhjbHVkZXNDb2x1bW5zLmZpbmRJbmRleCh2YWx1ZSA9PiB2YWx1ZSA9PT0gY29sdW1uTmFtZSk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB0aGlzLmV4Y2x1ZGVzQ29sdW1ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWNvbXB1dGUgZGlzcGxheSBjb2x1bW5zXG4gICAgICBpZiAodGhpcy5kaXNwbGF5ZWRDb2x1bW5zICYmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ29sdW1ucygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTaG93Q29sdW1uKGNvbHVtbk5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5leGNsdWRlc0NvbHVtbnMuaW5jbHVkZXMoY29sdW1uTmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnRzV2l0aFVwcGVyQ2FzZShpbnB1dDogc3RyaW5nLCBzZWFyY2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpbnB1dCAmJiBpbnB1dC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoc2VhcmNoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgLy8gU2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcywgZGVwZW5kaW5nIG9uIENoYW5nZURldGVjdGlvblN0cmF0ZWd5XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYXNrRGVsZXRlQ29uZmlybWF0aW9uKGV2ZW50PzogRXZlbnQsIHJvd3M/OiBBc3luY1RhYmxlRWxlbWVudDxUPltdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMudW5kb2FibGVEZWxldGlvbikge1xuICAgICAgLy8gU3BlY2lhbCBtZXNzYWdlLCBmb3IgdW5kb2FibGUgZGVsZXRpb25cbiAgICAgIHJldHVybiBBbGVydHMuYXNrQ29uZmlybWF0aW9uKHJvd3M/Lmxlbmd0aCA9PT0gMSA/ICdDT05GSVJNLkRFTEVURV9ST1cnIDogJ0NPTkZJUk0uREVMRVRFX1JPV1MnLCB0aGlzLmFsZXJ0Q3RybCwgdGhpcy50cmFuc2xhdGUsIGV2ZW50KTtcbiAgICB9XG4gICAgLy8gSW1tZWRpYXRlIGRlbGV0aW9uIGFjdGlvblxuICAgIHJldHVybiBBbGVydHMuYXNrQWN0aW9uQ29uZmlybWF0aW9uKHRoaXMuYWxlcnRDdHJsLCB0aGlzLnRyYW5zbGF0ZSwgdHJ1ZSwgZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFza0NhbmNlbENvbmZpcm1hdGlvbihldmVudD86IEV2ZW50LCByb3dzPzogQXN5bmNUYWJsZUVsZW1lbnQ8VD5bXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBBbGVydHMuYXNrQ29uZmlybWF0aW9uKHJvd3M/Lmxlbmd0aCA9PT0gMSA/ICdDT05GSVJNLkNBTkNFTF9ST1cnIDogJ0NPTkZJUk0uQ0FOQ0VMX1JPV1MnLCB0aGlzLmFsZXJ0Q3RybCwgdGhpcy50cmFuc2xhdGUsIGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBhc2tSZXN0b3JlQ29uZmlybWF0aW9uKGV2ZW50PzogRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gQWxlcnRzLmFza0FjdGlvbkNvbmZpcm1hdGlvbih0aGlzLmFsZXJ0Q3RybCwgdGhpcy50cmFuc2xhdGUsIGZhbHNlLCBldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc2hvd1RvYXN0KG9wdHM6IFNob3dUb2FzdE9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMudG9hc3RDb250cm9sbGVyKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdG9hc3RDb250cm9sbGVyIGluIGNvbXBvbmVudFxcJ3MgY29uc3RydWN0b3InKTtcbiAgICByZXR1cm4gVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCBvcHRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldEVycm9yKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIHRoaXMuc2V0RXJyb3IodW5kZWZpbmVkLCBvcHRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSb3dFcnJvcihyb3c/OiBBc3luY1RhYmxlRWxlbWVudDxUPiwgb3B0cz86IEZvcm1FcnJvclRyYW5zbGF0b3JPcHRpb25zKTogc3RyaW5nIHtcbiAgICByb3cgPSByb3cgfHwgdGhpcy5kYXRhU291cmNlLmdldFNpbmdsZUVkaXRpbmdSb3coKTtcbiAgICBpZiAoIXJvdyB8fCAhdGhpcy5mb3JtRXJyb3JBZGFwdGVyKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHRoaXMuZm9ybUVycm9yQWRhcHRlci50cmFuc2xhdGVGb3JtRXJyb3JzKHJvdy52YWxpZGF0b3IsIHtcbiAgICAgIC4uLnRoaXMuZXJyb3JUcmFuc2xhdG9yT3B0aW9ucyxcbiAgICAgIC4uLm9wdHNcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRFcnJvcih2YWx1ZTogc3RyaW5nLCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAodGhpcy5lcnJvclN1YmplY3QudmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLmVycm9yU3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyZSBkYXRhIGVxdWFsaXR5IChkZWZhdWx0IGJ5IGlkKVxuICAgKiBDYW4gYmUgb3ZlcnJpZGRlbiB0byBhZGQgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGNvbXBhcmVcbiAgICpcbiAgICogQHBhcmFtIGQxXG4gICAqIEBwYXJhbSBkMlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZXF1YWxzKGQxOiBULCBkMjogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBFbnRpdHlVdGlscy5lcXVhbHMoZDEsIGQyLCAnaWQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrUm93QXNEaXJ0eShyb3c/OiBBc3luY1RhYmxlRWxlbWVudDxUPiwgb3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RVZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICByb3cgPSByb3cgfHwgdGhpcy5kYXRhU291cmNlLmdldFNpbmdsZUVkaXRpbmdSb3coKTtcbiAgICBpZiAocm93KSByb3cudmFsaWRhdG9yPy5tYXJrQXNEaXJ0eShvcHRzKTtcbiAgICB0aGlzLm1hcmtBc0RpcnR5KG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFBhZ2VTZXR0aW5nczxUID0gYW55Pihwcm9wZXJ0eU5hbWU/OiBzdHJpbmcpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5nZXRQYWdlU2V0dGluZ3ModGhpcy5zZXR0aW5nc0lkLCBwcm9wZXJ0eU5hbWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVQYWdlU2V0dGluZ3ModmFsdWU6IGFueSwgcHJvcGVydHlOYW1lPzogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5zZXR0aW5ncy5zYXZlUGFnZVNldHRpbmcodGhpcy5zZXR0aW5nc0lkLCB2YWx1ZSwgcHJvcGVydHlOYW1lKTtcbiAgfVxuXG4gIC8qIC0tIHByaXZhdGUgbWV0aG9kIC0tICovXG5cbiAgcHJpdmF0ZSBhc3luYyBsaXN0ZW5Tb3J0QW5kUGFnaW5hdGlvbkV2ZW50cygpIHtcblxuICAgIGlmICghdGhpcy50YWJsZSkge1xuXG4gICAgICAvLyBERUJVRyBvbmx5IC0tIGFsZXJ0IHVzZXIgdGhhdCB0YWJsZSBub3QgZm91bmQgaW4gdGVtcGxhdGVcbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gIXRoaXMudGFibGUgJiYgY29uc29sZS53YXJuKGBbdGFibGVdIE1pc3NpbmcgPG1hdC10YWJsZT4gaW4gdGhlIEhUTUwgdGVtcGxhdGUgKGFmdGVyIHdhaXRpbmcgNTAwbXMpISBDb21wb25lbnQ6ICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfWApLCA1MDApO1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIHN1cmUgdG8gd2FpdCB0aGUgdGFibGVcbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4gISF0aGlzLnRhYmxlLCB7IHN0b3A6IHRoaXMuZGVzdHJveVN1YmplY3QsIHN0b3BFcnJvcjogZmFsc2UvKmF2b2lkIGVycm9yIHdoZW4gZGVzdG9yeWluZyB0aGUgdGFibGUqLyB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIC8vIExpc3RlbiBzb3J0IGV2ZW50c1xuICAgICAgICB0aGlzLnNvcnQgJiYgdGhpcy5zb3J0LnNvcnRDaGFuZ2VcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5zb3J0LmRpc2FibGVkKSxcbiAgICAgICAgICAgIG1lcmdlTWFwKGFzeW5jICgpID0+IHRoaXMuc2F2ZUJlZm9yZUFjdGlvbignc29ydCcpKSxcbiAgICAgICAgICAgIGZpbHRlcihyZXMgPT4gcmVzID09PSB0cnVlKSxcbiAgICAgICAgICAgIC8vIFNhdmUgc29ydCBpbiBzZXR0aW5nc1xuICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBbdGhpcy5zb3J0LmFjdGl2ZSwgdGhpcy5zb3J0LmRpcmVjdGlvbiB8fCAnYXNjJ10uam9pbignOicpO1xuICAgICAgICAgICAgICB0aGlzLnNhdmVQYWdlU2V0dGluZ3ModmFsdWUsIFNFVFRJTkdTX1NPUlRFRF9DT0xVTU4pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIHx8IEVNUFRZLFxuXG4gICAgICAgIC8vIExpc3RlbiBwYWdpbmF0b3IgZXZlbnRzXG4gICAgICAgIHRoaXMucGFnaW5hdG9yICYmIHRoaXMucGFnaW5hdG9yLnBhZ2VcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIG1lcmdlTWFwKChfKSA9PiB0aGlzLnNhdmVCZWZvcmVBY3Rpb24oJ3NvcnQnKSksXG4gICAgICAgICAgICBmaWx0ZXIoc2F2ZWQgPT4gc2F2ZWQgPT09IHRydWUpLFxuICAgICAgICAgICAgLy8gU2F2ZSBwYWdlIHNpemUgaW4gc2V0dGluZ3NcbiAgICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLnNhdmVQYWdlU2V0dGluZ3ModGhpcy5wYWdpbmF0b3IucGFnZVNpemUsIFNFVFRJTkdTX1BBR0VfU0laRSkpXG4gICAgICAgICAgKSB8fCBFTVBUWVxuICAgICAgKVxuICAgICAgICAvLyBSZWZyZXNoIG9uIGFueSBzb3J0IG9yIHBhZ2luYXRvciBldmVudHNcbiAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgdGhpcy5vblNvcnQuZW1pdCh2YWx1ZSk7XG4gICAgICAgICAgdGhpcy5vblJlZnJlc2guZW1pdCh2YWx1ZSk7XG4gICAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIElmIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHNvcnQgb3JkZXIsIHJlc2V0IGJhY2sgdG8gdGhlIGZpcnN0IHBhZ2UuXG4gICAgaWYgKHRoaXMuc29ydCAmJiB0aGlzLnBhZ2luYXRvcikge1xuICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgICAgdGhpcy5zb3J0LnNvcnRDaGFuZ2VcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5zb3J0LmRpc2FibGVkKVxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IDApXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZWRpdFJvd0J5SWQoZXZlbnQ6IEV2ZW50IHwgdW5kZWZpbmVkLCBpZDogbnVtYmVyLCBvcHRzPzogeyBmb2N1c0NvbHVtbj86IHN0cmluZyB9KSB7XG4gICAgaWYgKGlkIDwgMCkgcmV0dXJuO1xuICAgIGlmIChpZCA+PSB0aGlzLnZpc2libGVSb3dDb3VudCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGRSb3coZXZlbnQsIHVuZGVmaW5lZCwgeyAuLi5vcHRzLCBlZGl0aW5nOiB0cnVlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLmRhdGFTb3VyY2UuZ2V0Um93KGlkKTtcbiAgICAgIGF3YWl0IHRoaXMuZWRpdFJvdyhldmVudCwgcm93LCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldExvYWRpbmcodmFsdWU6IGJvb2xlYW4sIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHZhbHVlKTtcblxuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGVsZXRlTmV3Um93KGV2ZW50OiBFdmVudCB8IHVuZGVmaW5lZCwgcm93OiBBc3luY1RhYmxlRWxlbWVudDxUPikgey8vIE1ha2Ugc3VyZSByb3cgd2lsbCBiZSBjYW5jZWxsZWQsIGFuZCBOT1QgZGVsZXRlZFxuICAgIGlmIChyb3cuaWQgIT09IC0xKSB0aHJvdyBuZXcgRXJyb3IoJ1JvdyBtdXN0IGhhdmUgaWQgPSAtMScpO1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgYXdhaXQgdGhpcy5fZGF0YVNvdXJjZS5jYW5jZWxPckRlbGV0ZShyb3cpO1xuICAgIHRoaXMub25DYW5jZWxPckRlbGV0ZVJvdy5uZXh0KHJvdyk7XG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG4gICAgdGhpcy50b3RhbFJvd0NvdW50LS07XG4gICAgdGhpcy52aXNpYmxlUm93Q291bnQtLTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGVsZXRlRXhpc3RpbmdSb3coZXZlbnQ6IEV2ZW50IHwgbnVsbCwgcm93OiBBc3luY1RhYmxlRWxlbWVudDxUPiwgb3B0cz86IHsgaW50ZXJhY3RpdmU/OiBib29sZWFuIH0pIHtcbiAgICAvLyBNYWtlIHN1cmUgcm93IHdpbGwgYmUgY2FuY2VsbGVkLCBhbmQgTk9UIGRlbGV0ZWRcbiAgICBpZiAocm93LmlkID09PSAtMSkgdGhyb3cgbmV3IEVycm9yKCdSb3cgbXVzdCBoYXZlIGFuIGlkJyk7XG5cbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybiAwOyAvLyBTS2lwXG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBhd2FpdCB0aGlzLmRlbGV0ZVJvdyhudWxsLCByb3csIG9wdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjYW5jZWxFeGlzdGluZ1JvdyhldmVudDogRXZlbnQgfCB1bmRlZmluZWQsIHJvdzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4sIG9wdHM/OiB7IGludGVyYWN0aXZlPzogYm9vbGVhbjsga2VlcEVkaXRpbmc/OiBib29sZWFuIH0pIHtcbiAgICAvLyBNYWtlIHN1cmUgcm93IHdpbGwgYmUgY2FuY2VsbGVkLCBhbmQgTk9UIGRlbGV0ZWRcbiAgICBpZiAocm93LmlkID09PSAtMSB8fCAhcm93LmVkaXRpbmcpIHRocm93IG5ldyBFcnJvcignUm93IGNhbm5vdCBiZSBjYW5jZWxpbmcsIGJ1dCBvbmx5IGRlbGV0aW5nJyk7XG5cbiAgICBjb25zdCBjb25maXJtZWQgPSAoIW9wdHMgfHwgb3B0cy5pbnRlcmFjdGl2ZSAhPT0gZmFsc2UpO1xuXG4gICAgLy8gQXNrIHVzZXIgY29uZmlybWF0aW9uLCBpZiBjYW5jZWxcbiAgICBpZiAoIWNvbmZpcm1lZCAmJiByb3cuZGlydHkgJiYgKHRoaXMuY29uZmlybUJlZm9yZUNhbmNlbCB8fCB0aGlzLm9uQmVmb3JlQ2FuY2VsUm93cy5vYnNlcnZlcnMubGVuZ3RoID4gMCkpIHtcbiAgICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmICghYXdhaXQgdGhpcy5jYW5DYW5jZWxSb3dzKFtyb3ddLCBvcHRzKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qga2VlcEVkaXRpbmcgPSByb3cuZWRpdGluZyAmJiAoIW9wdHMgfHwgb3B0cy5rZWVwRWRpdGluZyAhPT0gZmFsc2UpO1xuICAgIGF3YWl0IHRoaXMuX2RhdGFTb3VyY2UuY2FuY2VsT3JEZWxldGUocm93KTtcbiAgICB0aGlzLm9uQ2FuY2VsT3JEZWxldGVSb3cubmV4dChyb3cpO1xuXG4gICAgLy8gTWFyayByb3cgYXMgcHJpc3RpbmVcbiAgICBhd2FpdCB0aGlzLmNoZWNrSWZSb3dQcmlzdGluZShyb3cpO1xuXG4gICAgLy8gUmVzdG9yZSBlZGl0aW5nIHN0YXRlXG4gICAgaWYgKGtlZXBFZGl0aW5nKSB7XG4gICAgICBhd2FpdCB0aGlzLmVkaXRSb3codW5kZWZpbmVkLCByb3cpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tJZlJvd1ByaXN0aW5lKHJvdzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4sIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW47IG9ubHlTZWxmPzogYm9vbGVhbiB9KSB7XG4gICAgLy8gTWFyayByb3cgYXMgcHJpc3RpbmVcbiAgICBjb25zdCBtYXJrUm93QXNQcmlzdGluZSA9IHRoaXMuZGF0YVNvdXJjZT8uY29uZmlnLnJlc3RvcmVPcmlnaW5hbERhdGFPbkNhbmNlbCA9PT0gdHJ1ZTtcbiAgICBpZiAobWFya1Jvd0FzUHJpc3RpbmUpIHtcbiAgICAgIHJvdy52YWxpZGF0b3I/Lm1hcmtBc1ByaXN0aW5lKCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRhYmxlIGlzIG5vdyBwcmlzdGluZVxuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMub25seVNlbGYgIT09IHRydWUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmUHJpc3RpbmUob3B0cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0lmUHJpc3RpbmUob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKCF0aGlzLmRpcnR5KSByZXR1cm47IC8vIEFscmVhZHkgcHJpc3RpbmVcblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLl9kYXRhU291cmNlLmdldFJvd3MoKTtcbiAgICBjb25zdCBwcmlzdGluZSA9IChyb3dzIHx8IFtdKS5maW5kSW5kZXgocm93ID0+IHJvdy5kaXJ0eSkgPT09IC0xO1xuICAgIGlmIChwcmlzdGluZSkgdGhpcy5tYXJrQXNQcmlzdGluZShvcHRzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXIoZmlsdGVyOiBGLCBvcHRzOiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbdGFibGVdIEFwcGx5aW5nIGZpbHRlcicsIGZpbHRlcik7XG4gICAgdGhpcy5fZmlsdGVyID0gZmlsdGVyO1xuICAgIGlmIChvcHRzICYmIG9wdHMuZW1pdEV2ZW50KSB7XG4gICAgICBpZiAodGhpcy5wYWdpbmF0b3IgJiYgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID4gMCkge1xuICAgICAgICB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggPSAwO1xuICAgICAgfVxuICAgICAgdGhpcy5vblJlZnJlc2guZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuRGF0YXNvdXJjZUxvYWRpbmcoZGF0YVNvdXJjZTogRW50aXRpZXNBc3luY1RhYmxlRGF0YVNvdXJjZTxULCBGLCBJRD4pIHtcbiAgICBpZiAoIWRhdGFTb3VyY2UpIHRocm93IG5ldyBFcnJvcignW3RhYmxlXSBkYXRhU291cmNlIG5vdCBzZXQgIScpO1xuXG4gICAgLy8gQ2xlYW5pbmcgcHJldmlvdXMgc3Vic2NyaXB0aW9uIG9uIGRhdGFzb3VyY2VcbiAgICBpZiAoaXNOb3ROaWwodGhpcy5fZGF0YVNvdXJjZUxvYWRpbmdTdWJzY3JpcHRpb24pKSB7XG4gICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW3RhYmxlXSBNYW55IGNhbGwgdG8gbGlzdGVuRGF0YXNvdXJjZSgpOiBDbGVhbmluZyBwcmV2aW91cyBzdWJzY3JpcHRpb25zLi4uJyk7XG4gICAgICB0aGlzLl9kYXRhU291cmNlTG9hZGluZ1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy51bnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHRoaXMuX2RhdGFTb3VyY2VMb2FkaW5nU3Vic2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBQcm9wYWdlIGxvYWRpbmcgdG8gdGFibGVcbiAgICB0aGlzLl9kYXRhU291cmNlTG9hZGluZ1N1YnNjcmlwdGlvbiA9IHRoaXMuX2RhdGFTb3VyY2UubG9hZGluZ1N1YmplY3RcbiAgICAgIC5waXBlKFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuXG4gICAgICAgIC8vIElmIGNoYW5nZWQgdG8gVHJ1ZTogcHJvcGFnYXRlIGFzIHNvb24gYXMgcG9zc2libGVcbiAgICAgICAgdGFwKChsb2FkaW5nKSA9PiBsb2FkaW5nICYmIHRoaXMuc2V0TG9hZGluZyh0cnVlKSksXG5cbiAgICAgICAgLy8gSWYgY2hhbmdlZCB0byBGYWxzZTogd2FpdCAyNTBtcyBiZWZvcmUgcHJvcGFnYXRlICh0byBtYWtlIHN1cmUgdGhlIHNwaW5uZXIgaGFzIGJlZW4gZGlzcGxheWVkKVxuICAgICAgICBkZWJvdW5jZVRpbWUoMjUwKSxcbiAgICAgICAgdGFwKGxvYWRpbmcgPT4gIWxvYWRpbmcgJiYgdGhpcy5zZXRMb2FkaW5nKGZhbHNlKSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHRoaXMuX2RhdGFTb3VyY2VMb2FkaW5nU3Vic2NyaXB0aW9uKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBzdGFydENlbGxWYWx1ZUNoYW5nZXMobmFtZTogc3RyaW5nLCByb3c6IEFzeW5jVGFibGVFbGVtZW50PFQ+KSB7XG4gICAgY29uc3QgZGVmID0gdGhpcy5fY2VsbFZhbHVlQ2hhbmdlc0RlZnNbbmFtZV07XG4gICAgaWYgKCFkZWYpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3RhYmxlXSBMaXN0ZW5lciB3aXRoIG5hbWUgeycgKyBuYW1lICsgJ30gbm90IHJlZ2lzdGVyZWQhIFBsZWFzZSBjYWxsIHJlZ2lzdGVyQ2VsbFZhbHVlQ2hhbmdlcygpIGJlZm9yZTsnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gU3RvcCBwcmV2aW91cyBzdWJzY3JpcHRpb25cbiAgICBpZiAoZGVmLnN1YnNjcmlwdGlvbikge1xuICAgICAgZGVmLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgZGVmLnN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGBbdGFibGVdIFN0YXJ0IHZhbHVlcyBjaGFuZ2VzIG9uIHJvdyBwYXRoIHske2RlZi5mb3JtUGF0aH19YCk7XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuIHZhbHVlIGNoYW5nZXMsIGFuZCByZWRpcmVjdCB0byBldmVudCBlbWl0dGVyXG4gICAgY29uc3QgY29udHJvbCA9IHJvdy52YWxpZGF0b3IgJiYgQXBwRm9ybVV0aWxzLmdldENvbnRyb2xGcm9tUGF0aChyb3cudmFsaWRhdG9yLCBkZWYuZm9ybVBhdGgpO1xuICAgIGlmICghY29udHJvbCkge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFibGVdIENvdWxkIG5vdCBsaXN0ZW4gY2VsbCBjaGFuZ2VzOiBubyB2YWxpZGF0b3Igb3IgaW52YWxpZCBmb3JtIHBhdGggeyR7ZGVmLmZvcm1QYXRofX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVmLnN1YnNjcmlwdGlvbiA9IGNvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIC8vIGRvbid0IGVtaXQgaWYgY29udHJvbCBpcyBkaXNhYmxlZFxuICAgICAgICAgIGZpbHRlcigoKSA9PiBjb250cm9sLmVuYWJsZWQpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IGRlZi5zdWJqZWN0Lm5leHQodmFsdWUpKTtcblxuICAgICAgLy8gRW1pdCB0aGUgYWN0dWFsIHZhbHVlXG4gICAgICBpZiAoZGVmLmVtaXRJbml0aWFsVmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICAgIGRlZi5zdWJqZWN0Lm5leHQoY29udHJvbC52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdG9wQ2VsbFZhbHVlQ2hhbmdlcyhuYW1lOiBzdHJpbmcsIGRlc3Ryb3k/OiBib29sZWFuKSB7XG4gICAgY29uc3QgZGVmID0gdGhpcy5fY2VsbFZhbHVlQ2hhbmdlc0RlZnNbbmFtZV07XG4gICAgaWYgKCFkZWYpIHJldHVybjtcbiAgICBpZiAoZGVmLnN1YnNjcmlwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1t0YWJsZV0gU3RvcCB2YWx1ZSBjaGFuZ2VzIG9uIHJvdyBwYXRoIHsnICsgZGVmLmZvcm1QYXRoICsgJ30nKTtcbiAgICAgIGRlZi5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIGRlZi5zdWJzY3JpcHRpb24gPSBudWxsO1xuICAgIH1cbiAgICBpZiAoZGVzdHJveSAmJiBkZWYuc3ViamVjdCkge1xuICAgICAgZGVmLnN1YmplY3QuY29tcGxldGUoKTtcbiAgICAgIGRlZi5zdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIHBlcm1hbmVudCBzZWxlY3Rpb24gbW9kZWxcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJpdmF0ZSBpbml0UGVybWFuZW50U2VsZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLnBlcm1hbmVudFNlbGVjdGlvbikgdGhyb3cgbmV3IEVycm9yKCdpbml0UGVybWFuZW50U2VsZWN0aW9uKCkgYWxyZWFkeSBjYWxsZWQhJyk7XG5cbiAgICB0aGlzLnBlcm1hbmVudFNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxUPih0cnVlLCBbXSk7XG5cbiAgICAvLyBMaXN0ZW4gc29ydCBjaGFuZ2VcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5vblNvcnQuc3Vic2NyaWJlKCgpID0+ICh0aGlzLnBlcm1hbmVudFNlbGVjdGlvbkNoYW5nZWRQcmV2ZW50ZWQgPSB0cnVlKSkgLy8gcHJldmVudCBzZWxlY3Rpb24gY2hhbmdlIG9uIHNvcnRcbiAgICApO1xuXG4gICAgLy8gTGlzdGVuIGRhdGFzb3VyY2UgdXBkYXRlXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5yb3dzU3ViamVjdFxuICAgICAgICAvLyByZXN0b3JlIHRoZSAnYWRkaW5nJyBzZWxlY3Rpb24gKGZvciBleGFtcGxlIGFmdGVyIGEgcGFnZSBvciBzb3J0IGNoYW5nZSlcbiAgICAgICAgLnN1YnNjcmliZSgocm93cykgPT4ge1xuICAgICAgICAgIHRoaXMucGVybWFuZW50U2VsZWN0aW9uQ2hhbmdlZFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBlcm1hbmVudFNlbGVjdGlvbklkcyA9ICh0aGlzLnBlcm1hbmVudFNlbGVjdGlvbi5zZWxlY3RlZCB8fCBbXSkubWFwKEVudGl0eVV0aWxzLmdldElkKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvbiguLi5yb3dzLmZpbHRlcigocm93KSA9PiBwZXJtYW5lbnRTZWxlY3Rpb25JZHMuaW5jbHVkZXMoQXBwVGFibGVVdGlscy5nZXRFbnRpdHlJZChyb3cpKSkpO1xuICAgICAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnBlcm1hbmVudFNlbGVjdGlvbkNoYW5nZWRQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIExpc3RlbiBzZWxlY3Rpb24gY2hhbmdlXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNoYW5nZWRcbiAgICAgICAgLnBpcGUoZmlsdGVyKCgpID0+ICF0aGlzLnBlcm1hbmVudFNlbGVjdGlvbkNoYW5nZWRQcmV2ZW50ZWQpKVxuICAgICAgICAuc3Vic2NyaWJlKChzZWxlY3Rpb25DaGFuZ2UpID0+IHtcbiAgICAgICAgICAvLyBhZGQgdG8gc2VsZWN0aW9uXG4gICAgICAgICAgaWYgKHNlbGVjdGlvbkNoYW5nZS5hZGRlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucGVybWFuZW50U2VsZWN0aW9uLnNldFNlbGVjdGlvbihcbiAgICAgICAgICAgICAgLi4uKHRoaXMucGVybWFuZW50U2VsZWN0aW9uLnNlbGVjdGVkIHx8IFtdKVxuICAgICAgICAgICAgICAgIC8vIEFkZCBuZXcgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAuY29uY2F0KC4uLkFwcFRhYmxlVXRpbHMuZ2V0RW50aXRpZXMoc2VsZWN0aW9uQ2hhbmdlLmFkZGVkKSlcbiAgICAgICAgICAgICAgICAvLyBBdm9pZCBkdXBsaWNhdGVkIGVudGl0aWVzIChNYW50aXMgIzU1MzUxKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoRW50aXR5VXRpbHMuYXJyYXlEaXN0aW5jdEZpbHRlckZuKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcmVtb3ZlIGZyb20gc2VsZWN0aW9uXG4gICAgICAgICAgaWYgKHNlbGVjdGlvbkNoYW5nZS5yZW1vdmVkLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZElkcyA9IEFwcFRhYmxlVXRpbHMuZ2V0RW50aXR5SWRzKHNlbGVjdGlvbkNoYW5nZS5yZW1vdmVkKTtcbiAgICAgICAgICAgIHRoaXMucGVybWFuZW50U2VsZWN0aW9uLnNldFNlbGVjdGlvbihcbiAgICAgICAgICAgICAgLi4uKHRoaXMucGVybWFuZW50U2VsZWN0aW9uLnNlbGVjdGVkIHx8IFtdKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGVudGl0eSkgPT4gIXJlbW92ZWRJZHMuaW5jbHVkZXMoZW50aXR5LmlkKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG4iXX0=