@sumaris-net/ngx-components 18.12.0 → 18.12.2

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