@sumaris-net/ngx-components 18.12.0 → 18.12.1

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 (1382) hide show
  1. package/esm2022/public_api.mjs +380 -0
  2. package/esm2022/src/app/admin/admin-routing.module.mjs +34 -0
  3. package/esm2022/src/app/admin/admin.module.mjs +32 -0
  4. package/esm2022/src/app/admin/services/filter/person.filter.mjs +76 -0
  5. package/esm2022/src/app/admin/services/person.service.mjs +184 -0
  6. package/esm2022/src/app/admin/services/validator/person.validator.mjs +72 -0
  7. package/esm2022/src/app/admin/users/users.mjs +379 -0
  8. package/esm2022/src/app/admin/users/users.module.mjs +56 -0
  9. package/esm2022/src/app/core/about/about.modal.mjs +86 -0
  10. package/esm2022/src/app/core/about/about.module.mjs +22 -0
  11. package/esm2022/src/app/core/account/account.module.mjs +75 -0
  12. package/esm2022/src/app/core/account/account.page.mjs +364 -0
  13. package/esm2022/src/app/core/account/new-token.form.mjs +106 -0
  14. package/esm2022/src/app/core/account/new-token.modal.mjs +66 -0
  15. package/esm2022/src/app/core/account/password/change-password.form.mjs +63 -0
  16. package/esm2022/src/app/core/account/password/change-password.module.mjs +22 -0
  17. package/esm2022/src/app/core/account/password/change-password.page.mjs +150 -0
  18. package/esm2022/src/app/core/account/token.table.mjs +157 -0
  19. package/esm2022/src/app/core/auth/auth.form.mjs +159 -0
  20. package/esm2022/src/app/core/auth/auth.modal.mjs +76 -0
  21. package/esm2022/src/app/core/auth/auth.module.mjs +56 -0
  22. package/esm2022/src/app/core/auth/reset-password.modal.mjs +89 -0
  23. package/esm2022/src/app/core/core.module.mjs +151 -0
  24. package/esm2022/src/app/core/core.testing.module.mjs +107 -0
  25. package/esm2022/src/app/core/form/array/form-array.mjs +328 -0
  26. package/esm2022/src/app/core/form/array/testing/form-array-test.module.mjs +23 -0
  27. package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +94 -0
  28. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +108 -0
  29. package/esm2022/src/app/core/form/buttons/form-buttons-bar.module.mjs +31 -0
  30. package/esm2022/src/app/core/form/entity/editor.class.mjs +268 -0
  31. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +420 -0
  32. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +741 -0
  33. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +24 -0
  34. package/esm2022/src/app/core/form/entity/entity.module.mjs +32 -0
  35. package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +190 -0
  36. package/esm2022/src/app/core/form/form-container.class.mjs +340 -0
  37. package/esm2022/src/app/core/form/form.class.mjs +337 -0
  38. package/esm2022/src/app/core/form/form.module.mjs +70 -0
  39. package/esm2022/src/app/core/form/form.utils.mjs +205 -0
  40. package/esm2022/src/app/core/form/list/list.form.mjs +235 -0
  41. package/esm2022/src/app/core/form/list/list.module.mjs +31 -0
  42. package/esm2022/src/app/core/form/properties/properties.form.mjs +317 -0
  43. package/esm2022/src/app/core/form/properties/properties.module.mjs +37 -0
  44. package/esm2022/src/app/core/form/properties/properties.table.mjs +264 -0
  45. package/esm2022/src/app/core/form/properties/properties.utils.mjs +304 -0
  46. package/esm2022/src/app/core/form/properties/property.validator.mjs +70 -0
  47. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +104 -0
  48. package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +23 -0
  49. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +73 -0
  50. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +30 -0
  51. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +161 -0
  52. package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +31 -0
  53. package/esm2022/src/app/core/form/username/username.form.mjs +55 -0
  54. package/esm2022/src/app/core/form/username/username.module.mjs +20 -0
  55. package/esm2022/src/app/core/graphql/graphql.module.mjs +14 -0
  56. package/esm2022/src/app/core/graphql/graphql.service.mjs +781 -0
  57. package/esm2022/src/app/core/graphql/graphql.utils.mjs +119 -0
  58. package/esm2022/src/app/core/home/home.mjs +382 -0
  59. package/esm2022/src/app/core/home/home.module.mjs +46 -0
  60. package/esm2022/src/app/core/icon/icon.component.mjs +40 -0
  61. package/esm2022/src/app/core/icon/icon.module.mjs +20 -0
  62. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +394 -0
  63. package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +31 -0
  64. package/esm2022/src/app/core/menu/menu.component.mjs +258 -0
  65. package/esm2022/src/app/core/menu/menu.model.mjs +272 -0
  66. package/esm2022/src/app/core/menu/menu.module.mjs +47 -0
  67. package/esm2022/src/app/core/menu/menu.service.mjs +666 -0
  68. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +109 -0
  69. package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +50 -0
  70. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +158 -0
  71. package/esm2022/src/app/core/menu/testing/menu.testing.module.mjs +60 -0
  72. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +28 -0
  73. package/esm2022/src/app/core/offline/update-offline-mode-card.module.mjs +31 -0
  74. package/esm2022/src/app/core/peer/select-peer.modal.mjs +344 -0
  75. package/esm2022/src/app/core/peer/select-peer.module.mjs +36 -0
  76. package/esm2022/src/app/core/register/register-confirm.page.mjs +90 -0
  77. package/esm2022/src/app/core/register/register.form.mjs +194 -0
  78. package/esm2022/src/app/core/register/register.modal.mjs +55 -0
  79. package/esm2022/src/app/core/register/register.module.mjs +23 -0
  80. package/esm2022/src/app/core/services/account.service.mjs +1358 -0
  81. package/esm2022/src/app/core/services/auth-guard.service.mjs +74 -0
  82. package/esm2022/src/app/core/services/base-entity-service.class.mjs +485 -0
  83. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +230 -0
  84. package/esm2022/src/app/core/services/base58.mjs +83 -0
  85. package/esm2022/src/app/core/services/config/core.config.mjs +258 -0
  86. package/esm2022/src/app/core/services/config.service.mjs +384 -0
  87. package/esm2022/src/app/core/services/crypto.service.mjs +107 -0
  88. package/esm2022/src/app/core/services/errors.mjs +54 -0
  89. package/esm2022/src/app/core/services/local-settings.service.mjs +516 -0
  90. package/esm2022/src/app/core/services/model/account.model.mjs +178 -0
  91. package/esm2022/src/app/core/services/model/config.model.mjs +107 -0
  92. package/esm2022/src/app/core/services/model/department.model.mjs +35 -0
  93. package/esm2022/src/app/core/services/model/entity.decorators.mjs +97 -0
  94. package/esm2022/src/app/core/services/model/entity.model.mjs +338 -0
  95. package/esm2022/src/app/core/services/model/filter.model.mjs +93 -0
  96. package/esm2022/src/app/core/services/model/history.model.mjs +2 -0
  97. package/esm2022/src/app/core/services/model/model.enum.mjs +11 -0
  98. package/esm2022/src/app/core/services/model/node-feature.model.mjs +31 -0
  99. package/esm2022/src/app/core/services/model/peer.model.mjs +113 -0
  100. package/esm2022/src/app/core/services/model/person.model.mjs +114 -0
  101. package/esm2022/src/app/core/services/model/referential.model.mjs +205 -0
  102. package/esm2022/src/app/core/services/model/settings.model.mjs +6 -0
  103. package/esm2022/src/app/core/services/model/token.model.mjs +57 -0
  104. package/esm2022/src/app/core/services/model/tree-item-entity.model.mjs +195 -0
  105. package/esm2022/src/app/core/services/network.service.mjs +638 -0
  106. package/esm2022/src/app/core/services/network.types.mjs +2 -0
  107. package/esm2022/src/app/core/services/network.utils.mjs +35 -0
  108. package/esm2022/src/app/core/services/pipes/account.pipes.mjs +38 -0
  109. package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +23 -0
  110. package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +23 -0
  111. package/esm2022/src/app/core/services/pipes/pipes.module.mjs +54 -0
  112. package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +21 -0
  113. package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +37 -0
  114. package/esm2022/src/app/core/services/platform.service.mjs +627 -0
  115. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +427 -0
  116. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +450 -0
  117. package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +25 -0
  118. package/esm2022/src/app/core/services/testing/referential.validator.mjs +46 -0
  119. package/esm2022/src/app/core/services/validator/account.validator.mjs +45 -0
  120. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +49 -0
  121. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +57 -0
  122. package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +27 -0
  123. package/esm2022/src/app/core/services/validator/user-token.validator.mjs +55 -0
  124. package/esm2022/src/app/core/settings/settings.module.mjs +23 -0
  125. package/esm2022/src/app/core/settings/settings.page.mjs +403 -0
  126. package/esm2022/src/app/core/table/async-table.class.mjs +1811 -0
  127. package/esm2022/src/app/core/table/column/actions-column.component.mjs +130 -0
  128. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +117 -0
  129. package/esm2022/src/app/core/table/column/row-field.component.mjs +116 -0
  130. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +404 -0
  131. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +405 -0
  132. package/esm2022/src/app/core/table/memory-table.class.mjs +57 -0
  133. package/esm2022/src/app/core/table/table-select-columns.component.mjs +46 -0
  134. package/esm2022/src/app/core/table/table.class.mjs +1867 -0
  135. package/esm2022/src/app/core/table/table.model.mjs +21 -0
  136. package/esm2022/src/app/core/table/table.module.mjs +51 -0
  137. package/esm2022/src/app/core/table/table.pipes.mjs +77 -0
  138. package/esm2022/src/app/core/table/table.utils.mjs +34 -0
  139. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +32 -0
  140. package/esm2022/src/app/core/table/testing/table.testing.mjs +329 -0
  141. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +25 -0
  142. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +25 -0
  143. package/esm2022/src/app/core/table/testing/table2.testing.mjs +273 -0
  144. package/esm2022/src/app/shared/alerts.mjs +243 -0
  145. package/esm2022/src/app/shared/audio/audio.mjs +255 -0
  146. package/esm2022/src/app/shared/audio/audio.testing.mjs +32 -0
  147. package/esm2022/src/app/shared/audio/audio.testing.module.mjs +30 -0
  148. package/esm2022/src/app/shared/capacitor/keyboard.mjs +42 -0
  149. package/esm2022/src/app/shared/capacitor/plugins.mjs +9 -0
  150. package/esm2022/src/app/shared/constants.mjs +16 -0
  151. package/esm2022/src/app/shared/dates.mjs +180 -0
  152. package/esm2022/src/app/shared/debug/debug-service.class.mjs +3 -0
  153. package/esm2022/src/app/shared/debug/debug.component.mjs +44 -0
  154. package/esm2022/src/app/shared/debug/debug.module.mjs +23 -0
  155. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +91 -0
  156. package/esm2022/src/app/shared/directives/autoresize.directive.mjs +75 -0
  157. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +30 -0
  158. package/esm2022/src/app/shared/directives/directives.module.mjs +24 -0
  159. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +52 -0
  160. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +33 -0
  161. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +62 -0
  162. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +45 -0
  163. package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +17 -0
  164. package/esm2022/src/app/shared/directives/throttled-click.directive.mjs +43 -0
  165. package/esm2022/src/app/shared/events.mjs +64 -0
  166. package/esm2022/src/app/shared/file/csv.utils.mjs +97 -0
  167. package/esm2022/src/app/shared/file/file.service.mjs +118 -0
  168. package/esm2022/src/app/shared/file/file.utils.mjs +117 -0
  169. package/esm2022/src/app/shared/file/images.utils.mjs +186 -0
  170. package/esm2022/src/app/shared/file/json.utils.mjs +58 -0
  171. package/esm2022/src/app/shared/file/uri.utils.mjs +29 -0
  172. package/esm2022/src/app/shared/file/url.utils.mjs +164 -0
  173. package/esm2022/src/app/shared/focusable.mjs +6 -0
  174. package/esm2022/src/app/shared/form/field.component.mjs +393 -0
  175. package/esm2022/src/app/shared/form/field.model.mjs +82 -0
  176. package/esm2022/src/app/shared/form/loading-spinner.mjs +35 -0
  177. package/esm2022/src/app/shared/forms.mjs +510 -0
  178. package/esm2022/src/app/shared/functions.mjs +672 -0
  179. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +86 -0
  180. package/esm2022/src/app/shared/gesture/gesture-config.mjs +46 -0
  181. package/esm2022/src/app/shared/gesture/hammer.utils.mjs +2 -0
  182. package/esm2022/src/app/shared/graph/colors.utils.mjs +60 -0
  183. package/esm2022/src/app/shared/graph/graph-colors.mjs +214 -0
  184. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +65 -0
  185. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +23 -0
  186. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +147 -0
  187. package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +24 -0
  188. package/esm2022/src/app/shared/http/http.utils.mjs +56 -0
  189. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +443 -0
  190. package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +62 -0
  191. package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +26 -0
  192. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +87 -0
  193. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +37 -0
  194. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +59 -0
  195. package/esm2022/src/app/shared/image/image.model.mjs +2 -0
  196. package/esm2022/src/app/shared/image/image.module.mjs +24 -0
  197. package/esm2022/src/app/shared/image/image.service.mjs +109 -0
  198. package/esm2022/src/app/shared/inputs.mjs +279 -0
  199. package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +27 -0
  200. package/esm2022/src/app/shared/logging/log-level.model.mjs +48 -0
  201. package/esm2022/src/app/shared/logging/logger.model.mjs +47 -0
  202. package/esm2022/src/app/shared/logging/logging-service.class.mjs +125 -0
  203. package/esm2022/src/app/shared/logging/logging-service.config.mjs +2 -0
  204. package/esm2022/src/app/shared/logging/logging-service.module.mjs +30 -0
  205. package/esm2022/src/app/shared/markdown/markdown.component.mjs +321 -0
  206. package/esm2022/src/app/shared/markdown/markdown.directive.mjs +34 -0
  207. package/esm2022/src/app/shared/markdown/markdown.modal.mjs +99 -0
  208. package/esm2022/src/app/shared/markdown/markdown.module.mjs +87 -0
  209. package/esm2022/src/app/shared/markdown/markdown.service.mjs +204 -0
  210. package/esm2022/src/app/shared/markdown/markdown.utils.mjs +87 -0
  211. package/esm2022/src/app/shared/markdown/testing/markdown.test.mjs +55 -0
  212. package/esm2022/src/app/shared/markdown/testing/markdown.testing.module.mjs +30 -0
  213. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +46 -0
  214. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +1313 -0
  215. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +79 -0
  216. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +18 -0
  217. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +242 -0
  218. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +251 -0
  219. package/esm2022/src/app/shared/material/badge/badge.module.mjs +20 -0
  220. package/esm2022/src/app/shared/material/badge/badge.test.mjs +42 -0
  221. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +67 -0
  222. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +371 -0
  223. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +72 -0
  224. package/esm2022/src/app/shared/material/chips/chips.module.mjs +71 -0
  225. package/esm2022/src/app/shared/material/chips/material.chips.mjs +836 -0
  226. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +151 -0
  227. package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +76 -0
  228. package/esm2022/src/app/shared/material/datetime/material.date.mjs +471 -0
  229. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +457 -0
  230. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +693 -0
  231. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +136 -0
  232. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +127 -0
  233. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +118 -0
  234. package/esm2022/src/app/shared/material/duration/duration.module.mjs +61 -0
  235. package/esm2022/src/app/shared/material/duration/duration.utils.mjs +16 -0
  236. package/esm2022/src/app/shared/material/duration/material.duration.mjs +283 -0
  237. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +85 -0
  238. package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +319 -0
  239. package/esm2022/src/app/shared/material/latlong/material.latlong-input.mjs +432 -0
  240. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +231 -0
  241. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +68 -0
  242. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +137 -0
  243. package/esm2022/src/app/shared/material/material.animations.mjs +200 -0
  244. package/esm2022/src/app/shared/material/material.config.mjs +3 -0
  245. package/esm2022/src/app/shared/material/material.module.mjs +229 -0
  246. package/esm2022/src/app/shared/material/material.testing.module.mjs +245 -0
  247. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +51 -0
  248. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +23 -0
  249. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +379 -0
  250. package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +52 -0
  251. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +67 -0
  252. package/esm2022/src/app/shared/material/test/test-component.mjs +264 -0
  253. package/esm2022/src/app/shared/material/testing/common.test.mjs +111 -0
  254. package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +42 -0
  255. package/esm2022/src/app/shared/material/text/text-form.component.mjs +205 -0
  256. package/esm2022/src/app/shared/material/text/text-form.module.mjs +63 -0
  257. package/esm2022/src/app/shared/modules.mjs +12 -0
  258. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +303 -0
  259. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +49 -0
  260. package/esm2022/src/app/shared/named-filter/named-filter.module.mjs +24 -0
  261. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +69 -0
  262. package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +74 -0
  263. package/esm2022/src/app/shared/named-filter/testing/named-filter.testing.module.mjs +28 -0
  264. package/esm2022/src/app/shared/observables.mjs +100 -0
  265. package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +217 -0
  266. package/esm2022/src/app/shared/pipes/badge.pipes.mjs +24 -0
  267. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +29 -0
  268. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +50 -0
  269. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +72 -0
  270. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +28 -0
  271. package/esm2022/src/app/shared/pipes/dates.pipe.mjs +18 -0
  272. package/esm2022/src/app/shared/pipes/display-with.pipe.mjs +23 -0
  273. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +34 -0
  274. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +53 -0
  275. package/esm2022/src/app/shared/pipes/form.pipes.mjs +219 -0
  276. package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +50 -0
  277. package/esm2022/src/app/shared/pipes/html.pipes.mjs +69 -0
  278. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +42 -0
  279. package/esm2022/src/app/shared/pipes/maps.pipe.mjs +65 -0
  280. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +67 -0
  281. package/esm2022/src/app/shared/pipes/math.pipes.mjs +77 -0
  282. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +19 -0
  283. package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +17 -0
  284. package/esm2022/src/app/shared/pipes/observable.pipes.mjs +61 -0
  285. package/esm2022/src/app/shared/pipes/pipes.module.mjs +285 -0
  286. package/esm2022/src/app/shared/pipes/property.pipes.mjs +135 -0
  287. package/esm2022/src/app/shared/pipes/selection.pipes.mjs +179 -0
  288. package/esm2022/src/app/shared/pipes/string.pipes.mjs +183 -0
  289. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +44 -0
  290. package/esm2022/src/app/shared/pipes/types.pipes.mjs +74 -0
  291. package/esm2022/src/app/shared/pipes/url.pipes.mjs +43 -0
  292. package/esm2022/src/app/shared/platforms.mjs +81 -0
  293. package/esm2022/src/app/shared/print/print.service.mjs +305 -0
  294. package/esm2022/src/app/shared/regexps.mjs +96 -0
  295. package/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +217 -0
  296. package/esm2022/src/app/shared/rx-state/rx-state.module.mjs +19 -0
  297. package/esm2022/src/app/shared/rx-state/rx-state.types.mjs +2 -0
  298. package/esm2022/src/app/shared/services/entity-service.class.mjs +10 -0
  299. package/esm2022/src/app/shared/services/job.utils.mjs +92 -0
  300. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +353 -0
  301. package/esm2022/src/app/shared/services/progress-bar.service.mjs +31 -0
  302. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +118 -0
  303. package/esm2022/src/app/shared/services/startable-service.class.mjs +107 -0
  304. package/esm2022/src/app/shared/services/translate-context.service.mjs +107 -0
  305. package/esm2022/src/app/shared/services/validator-service.class.mjs +2 -0
  306. package/esm2022/src/app/shared/services.mjs +85 -0
  307. package/esm2022/src/app/shared/shared-routing.module.mjs +72 -0
  308. package/esm2022/src/app/shared/shared.module.mjs +229 -0
  309. package/esm2022/src/app/shared/shared.testing.module.mjs +108 -0
  310. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +279 -0
  311. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +42 -0
  312. package/esm2022/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +27 -0
  313. package/esm2022/src/app/shared/storage/storage-explorer.testing.module.mjs +25 -0
  314. package/esm2022/src/app/shared/storage/storage.service.mjs +134 -0
  315. package/esm2022/src/app/shared/storage/storage.utils.mjs +13 -0
  316. package/esm2022/src/app/shared/testing/maskito.test.mjs +41 -0
  317. package/esm2022/src/app/shared/testing/observable.test.mjs +94 -0
  318. package/esm2022/src/app/shared/testing/tests.page.mjs +37 -0
  319. package/esm2022/src/app/shared/toast/toast.testing.mjs +54 -0
  320. package/esm2022/src/app/shared/toast/toast.testing.module.mjs +31 -0
  321. package/esm2022/src/app/shared/toast/toasts.mjs +134 -0
  322. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +62 -0
  323. package/esm2022/src/app/shared/toolbar/toolbar.mjs +267 -0
  324. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +26 -0
  325. package/esm2022/src/app/shared/types.mjs +2 -0
  326. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +59 -0
  327. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +30 -0
  328. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +109 -0
  329. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +216 -0
  330. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +26 -0
  331. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +114 -0
  332. package/esm2022/src/app/shared/validator/validators.mjs +621 -0
  333. package/esm2022/src/app/shared/version/versions.mjs +81 -0
  334. package/esm2022/src/app/social/job/job.module.mjs +23 -0
  335. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +35 -0
  336. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +235 -0
  337. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +47 -0
  338. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +29 -0
  339. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +91 -0
  340. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +38 -0
  341. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +34 -0
  342. package/esm2022/src/app/social/job/testing/job.testing.module.mjs +22 -0
  343. package/esm2022/src/app/social/message/message.form.mjs +141 -0
  344. package/esm2022/src/app/social/message/message.modal.mjs +110 -0
  345. package/esm2022/src/app/social/message/message.model.mjs +75 -0
  346. package/esm2022/src/app/social/message/message.module.mjs +22 -0
  347. package/esm2022/src/app/social/message/message.service.mjs +110 -0
  348. package/esm2022/src/app/social/social.errors.mjs +10 -0
  349. package/esm2022/src/app/social/social.module.mjs +22 -0
  350. package/esm2022/src/app/social/social.testing.module.mjs +40 -0
  351. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +127 -0
  352. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +260 -0
  353. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +257 -0
  354. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +129 -0
  355. package/esm2022/src/app/social/user-event/testing/user-event.testing.module.mjs +22 -0
  356. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +128 -0
  357. package/esm2022/src/app/social/user-event/user-event.model.mjs +2 -0
  358. package/esm2022/src/app/social/user-event/user-event.module.mjs +23 -0
  359. package/esm2022/src/app/social/user-event/user-event.service.mjs +512 -0
  360. package/esm2022/src/environments/environment.class.mjs +65 -0
  361. package/esm2022/src/environments/environment.loader.mjs +77 -0
  362. package/esm2022/src/environments/environment.mjs +109 -0
  363. package/esm2022/sumaris-net.ngx-components.mjs +5 -0
  364. package/fesm2022/sumaris-net.ngx-components.mjs +48742 -0
  365. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -0
  366. package/index.d.ts +5 -0
  367. package/package.json +19 -132
  368. package/public_api.d.ts +344 -0
  369. package/src/app/admin/admin-routing.module.d.ts +9 -0
  370. package/src/app/admin/admin.module.d.ts +10 -0
  371. package/src/app/admin/services/filter/person.filter.d.ts +22 -0
  372. package/src/app/admin/services/person.service.d.ts +37 -0
  373. package/src/app/admin/services/validator/person.validator.d.ts +23 -0
  374. package/src/app/admin/users/users.d.ts +61 -0
  375. package/src/app/admin/users/users.module.d.ts +14 -0
  376. package/src/app/core/about/about.modal.d.ts +32 -0
  377. package/src/app/core/about/about.module.d.ts +11 -0
  378. package/src/app/core/account/account.module.d.ts +18 -0
  379. package/src/app/core/account/account.page.d.ts +83 -0
  380. package/src/app/core/account/new-token.form.d.ts +29 -0
  381. package/src/app/core/account/new-token.modal.d.ts +29 -0
  382. package/src/app/core/account/password/change-password.form.d.ts +19 -0
  383. package/src/app/core/account/password/change-password.module.d.ts +11 -0
  384. package/src/app/core/account/password/change-password.page.d.ts +36 -0
  385. package/src/app/core/account/token.table.d.ts +27 -0
  386. package/src/app/core/auth/auth.form.d.ts +38 -0
  387. package/src/app/core/auth/auth.modal.d.ts +24 -0
  388. package/src/app/core/auth/auth.module.d.ts +13 -0
  389. package/src/app/core/auth/reset-password.modal.d.ts +29 -0
  390. package/src/app/core/core.module.d.ts +28 -0
  391. package/src/app/core/core.testing.module.d.ts +15 -0
  392. package/src/app/core/form/array/form-array.d.ts +137 -0
  393. package/src/app/core/form/array/testing/form-array-test.module.d.ts +12 -0
  394. package/src/app/core/form/array/testing/form-array.test.d.ts +26 -0
  395. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +37 -0
  396. package/src/app/core/form/buttons/form-buttons-bar.module.d.ts +9 -0
  397. package/src/app/core/form/entity/editor.class.d.ts +84 -0
  398. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +126 -0
  399. package/src/app/core/form/entity/entity-editor.class.d.ts +204 -0
  400. package/src/app/core/form/entity/entity-metadata.component.d.ts +13 -0
  401. package/src/app/core/form/entity/entity.module.d.ts +10 -0
  402. package/src/app/core/form/entity/tab-editor.class.d.ts +66 -0
  403. package/src/app/core/form/form-container.class.d.ts +127 -0
  404. package/src/app/core/form/form.class.d.ts +144 -0
  405. package/src/app/core/form/form.module.d.ts +14 -0
  406. package/src/app/core/form/form.utils.d.ts +260 -0
  407. package/src/app/core/form/list/list.form.d.ts +81 -0
  408. package/src/app/core/form/list/list.module.d.ts +9 -0
  409. package/src/app/core/form/properties/properties.form.d.ts +92 -0
  410. package/src/app/core/form/properties/properties.module.d.ts +11 -0
  411. package/src/app/core/form/properties/properties.table.d.ts +72 -0
  412. package/src/app/core/form/properties/properties.utils.d.ts +59 -0
  413. package/src/app/core/form/properties/property.validator.d.ts +27 -0
  414. package/src/app/core/form/properties/testing/properties-form.test.d.ts +22 -0
  415. package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +12 -0
  416. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +16 -0
  417. package/src/app/core/form/text-popover/testing/text-popover.testing.module.d.ts +11 -0
  418. package/src/app/core/form/text-popover/text-popover.component.d.ts +80 -0
  419. package/src/app/core/form/text-popover/text-popover.module.d.ts +9 -0
  420. package/src/app/core/form/username/username.form.d.ts +19 -0
  421. package/src/app/core/form/username/username.module.d.ts +9 -0
  422. package/src/app/core/graphql/graphql.module.d.ts +7 -0
  423. package/src/app/core/graphql/graphql.service.d.ts +142 -0
  424. package/src/app/core/graphql/graphql.utils.d.ts +47 -0
  425. package/src/app/core/home/home.d.ts +109 -0
  426. package/src/app/core/home/home.module.d.ts +14 -0
  427. package/src/app/core/icon/icon.component.d.ts +13 -0
  428. package/src/app/core/icon/icon.module.d.ts +9 -0
  429. package/src/app/core/install/install-upgrade-card.component.d.ts +63 -0
  430. package/src/app/core/install/install-upgrade-card.module.d.ts +9 -0
  431. package/src/app/core/menu/menu.component.d.ts +66 -0
  432. package/src/app/core/menu/menu.model.d.ts +144 -0
  433. package/src/app/core/menu/menu.module.d.ts +12 -0
  434. package/src/app/core/menu/menu.service.d.ts +93 -0
  435. package/src/app/core/menu/sub-menu-tab.directive.d.ts +29 -0
  436. package/src/app/core/menu/testing/menu-other.testing.d.ts +15 -0
  437. package/src/app/core/menu/testing/menu.testing.d.ts +51 -0
  438. package/src/app/core/menu/testing/menu.testing.module.d.ts +12 -0
  439. package/src/app/core/offline/update-offline-mode-card.component.d.ts +11 -0
  440. package/src/app/core/offline/update-offline-mode-card.module.d.ts +9 -0
  441. package/src/app/core/peer/select-peer.modal.d.ts +101 -0
  442. package/src/app/core/peer/select-peer.module.d.ts +12 -0
  443. package/src/app/core/register/register-confirm.page.d.ts +24 -0
  444. package/src/app/core/register/register.form.d.ts +49 -0
  445. package/src/app/core/register/register.modal.d.ts +14 -0
  446. package/src/app/core/register/register.module.d.ts +12 -0
  447. package/src/app/core/services/account.service.d.ts +207 -0
  448. package/src/app/core/services/auth-guard.service.d.ts +17 -0
  449. package/src/app/core/services/base-entity-service.class.d.ts +135 -0
  450. package/src/app/core/services/base-graphql-service.class.d.ts +77 -0
  451. package/src/app/core/services/base58.d.ts +7 -0
  452. package/src/app/core/services/config/core.config.d.ts +46 -0
  453. package/src/app/core/services/config.service.d.ts +63 -0
  454. package/src/app/core/services/crypto.service.d.ts +44 -0
  455. package/src/app/core/services/errors.d.ts +65 -0
  456. package/src/app/core/services/local-settings.service.d.ts +99 -0
  457. package/src/app/core/services/model/account.model.d.ts +56 -0
  458. package/src/app/core/services/model/config.model.d.ts +36 -0
  459. package/src/app/core/services/model/department.model.d.ts +11 -0
  460. package/src/app/core/services/model/entity.decorators.d.ts +17 -0
  461. package/src/app/core/services/model/entity.model.d.ts +133 -0
  462. package/src/app/core/services/model/filter.model.d.ts +37 -0
  463. package/src/app/core/services/model/history.model.d.ts +20 -0
  464. package/src/app/core/services/model/model.enum.d.ts +7 -0
  465. package/src/app/core/services/model/node-feature.model.d.ts +14 -0
  466. package/src/app/core/services/model/peer.model.d.ts +35 -0
  467. package/src/app/core/services/model/person.model.d.ts +37 -0
  468. package/src/app/core/services/model/referential.model.d.ts +84 -0
  469. package/src/app/core/services/model/settings.model.d.ts +29 -0
  470. package/src/app/core/services/model/token.model.d.ts +22 -0
  471. package/src/app/core/services/model/tree-item-entity.model.d.ts +53 -0
  472. package/src/app/core/services/network.service.d.ts +159 -0
  473. package/src/app/core/services/network.types.d.ts +4 -0
  474. package/src/app/core/services/network.utils.d.ts +38 -0
  475. package/src/app/core/services/pipes/account.pipes.d.ts +15 -0
  476. package/src/app/core/services/pipes/department-to-string.pipe.d.ts +9 -0
  477. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +11 -0
  478. package/src/app/core/services/pipes/pipes.module.d.ts +11 -0
  479. package/src/app/core/services/pipes/referential-to-string.pipe.d.ts +13 -0
  480. package/src/app/core/services/pipes/usage-mode.pipes.d.ts +15 -0
  481. package/src/app/core/services/platform.service.d.ts +110 -0
  482. package/src/app/core/services/storage/entities-storage.service.d.ts +108 -0
  483. package/src/app/core/services/storage/entity-store.class.d.ts +113 -0
  484. package/src/app/core/services/testing/referential-filter.model.d.ts +9 -0
  485. package/src/app/core/services/testing/referential.validator.d.ts +22 -0
  486. package/src/app/core/services/validator/account.validator.d.ts +24 -0
  487. package/src/app/core/services/validator/base.validator.class.d.ts +21 -0
  488. package/src/app/core/services/validator/local-settings.validator.d.ts +18 -0
  489. package/src/app/core/services/validator/user-settings.validator.d.ts +10 -0
  490. package/src/app/core/services/validator/user-token.validator.d.ts +13 -0
  491. package/src/app/core/settings/settings.module.d.ts +12 -0
  492. package/src/app/core/settings/settings.page.d.ts +88 -0
  493. package/src/app/core/table/async-table.class.d.ts +395 -0
  494. package/src/app/core/table/column/actions-column.component.d.ts +62 -0
  495. package/src/app/core/table/column/nav-actions-column.component.d.ts +46 -0
  496. package/src/app/core/table/column/row-field.component.d.ts +40 -0
  497. package/src/app/core/table/entities-async-table-datasource.class.d.ts +100 -0
  498. package/src/app/core/table/entities-table-datasource.class.d.ts +103 -0
  499. package/src/app/core/table/memory-table.class.d.ts +25 -0
  500. package/src/app/core/table/table-select-columns.component.d.ts +22 -0
  501. package/src/app/core/table/table.class.d.ts +400 -0
  502. package/src/app/core/table/table.model.d.ts +31 -0
  503. package/src/app/core/table/table.module.d.ts +14 -0
  504. package/src/app/core/table/table.pipes.d.ts +29 -0
  505. package/src/app/core/table/table.utils.d.ts +13 -0
  506. package/src/app/core/table/testing/table-validator.service.d.ts +17 -0
  507. package/src/app/core/table/testing/table.testing.d.ts +54 -0
  508. package/src/app/core/table/testing/table.testing.module.d.ts +14 -0
  509. package/src/app/core/table/testing/table2-validator.service.d.ts +15 -0
  510. package/src/app/core/table/testing/table2.testing.d.ts +48 -0
  511. package/src/app/shared/alerts.d.ts +55 -0
  512. package/src/app/shared/audio/audio.d.ts +45 -0
  513. package/src/app/shared/audio/audio.testing.d.ts +13 -0
  514. package/src/app/shared/audio/audio.testing.module.d.ts +11 -0
  515. package/src/app/shared/capacitor/keyboard.d.ts +16 -0
  516. package/src/app/shared/capacitor/plugins.d.ts +7 -0
  517. package/src/app/shared/constants.d.ts +13 -0
  518. package/src/app/shared/dates.d.ts +61 -0
  519. package/src/app/shared/debug/debug-service.class.d.ts +5 -0
  520. package/src/app/shared/debug/debug.component.d.ts +14 -0
  521. package/src/app/shared/debug/debug.module.d.ts +12 -0
  522. package/src/app/shared/directives/autofocus.directive.d.ts +18 -0
  523. package/src/app/shared/directives/autoresize.directive.d.ts +20 -0
  524. package/src/app/shared/directives/autotitle.directive.d.ts +11 -0
  525. package/src/app/shared/directives/directives.module.d.ts +14 -0
  526. package/src/app/shared/directives/drag-and-drop.directive.d.ts +17 -0
  527. package/src/app/shared/directives/ng-var.directive.d.ts +12 -0
  528. package/src/app/shared/directives/resizable/resizable.component.d.ts +21 -0
  529. package/src/app/shared/directives/resizable/resizable.directive.d.ts +12 -0
  530. package/src/app/shared/directives/resizable/resizable.module.d.ts +8 -0
  531. package/src/app/shared/directives/throttled-click.directive.d.ts +16 -0
  532. package/src/app/shared/events.d.ts +29 -0
  533. package/src/app/shared/file/csv.utils.d.ts +30 -0
  534. package/src/app/shared/file/file.service.d.ts +23 -0
  535. package/src/app/shared/file/file.utils.d.ts +20 -0
  536. package/src/app/shared/file/images.utils.d.ts +36 -0
  537. package/src/app/shared/file/json.utils.d.ts +19 -0
  538. package/src/app/shared/file/uri.utils.d.ts +8 -0
  539. package/src/app/shared/file/url.utils.d.ts +77 -0
  540. package/src/app/shared/focusable.d.ts +4 -0
  541. package/src/app/shared/form/field.component.d.ts +85 -0
  542. package/src/app/shared/form/field.model.d.ts +82 -0
  543. package/src/app/shared/form/loading-spinner.d.ts +8 -0
  544. package/src/app/shared/forms.d.ts +135 -0
  545. package/src/app/shared/functions.d.ts +206 -0
  546. package/src/app/shared/geolocation/geolocation.utils.d.ts +19 -0
  547. package/src/app/shared/gesture/gesture-config.d.ts +15 -0
  548. package/src/app/shared/gesture/hammer.utils.d.ts +16 -0
  549. package/src/app/shared/graph/colors.utils.d.ts +17 -0
  550. package/src/app/shared/graph/graph-colors.d.ts +63 -0
  551. package/src/app/shared/guard/component-dirty.guard.d.ts +14 -0
  552. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +8 -0
  553. package/src/app/shared/hotkeys/hotkeys.service.d.ts +48 -0
  554. package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +11 -0
  555. package/src/app/shared/http/http.utils.d.ts +28 -0
  556. package/src/app/shared/image/gallery/image-gallery.component.d.ts +137 -0
  557. package/src/app/shared/image/gallery/image-gallery.module.d.ts +15 -0
  558. package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +12 -0
  559. package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +33 -0
  560. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +16 -0
  561. package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +13 -0
  562. package/src/app/shared/image/image.model.d.ts +7 -0
  563. package/src/app/shared/image/image.module.d.ts +8 -0
  564. package/src/app/shared/image/image.service.d.ts +36 -0
  565. package/src/app/shared/inputs.d.ts +36 -0
  566. package/src/app/shared/interceptors/progess.interceptor.d.ts +8 -0
  567. package/src/app/shared/logging/log-level.model.d.ts +38 -0
  568. package/src/app/shared/logging/logger.model.d.ts +68 -0
  569. package/src/app/shared/logging/logging-service.class.d.ts +39 -0
  570. package/src/app/shared/logging/logging-service.config.d.ts +25 -0
  571. package/src/app/shared/logging/logging-service.module.d.ts +9 -0
  572. package/src/app/shared/markdown/markdown.component.d.ts +86 -0
  573. package/src/app/shared/markdown/markdown.directive.d.ts +13 -0
  574. package/src/app/shared/markdown/markdown.modal.d.ts +49 -0
  575. package/src/app/shared/markdown/markdown.module.d.ts +17 -0
  576. package/src/app/shared/markdown/markdown.service.d.ts +37 -0
  577. package/src/app/shared/markdown/markdown.utils.d.ts +26 -0
  578. package/src/app/shared/markdown/testing/markdown.test.d.ts +18 -0
  579. package/src/app/shared/markdown/testing/markdown.testing.module.d.ts +12 -0
  580. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +74 -0
  581. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +211 -0
  582. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +22 -0
  583. package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +5 -0
  584. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +48 -0
  585. package/src/app/shared/material/badge/badge.directive.d.ts +43 -0
  586. package/src/app/shared/material/badge/badge.module.d.ts +10 -0
  587. package/src/app/shared/material/badge/badge.test.d.ts +21 -0
  588. package/src/app/shared/material/boolean/boolean.module.d.ts +20 -0
  589. package/src/app/shared/material/boolean/material.boolean.d.ts +93 -0
  590. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +26 -0
  591. package/src/app/shared/material/chips/chips.module.d.ts +21 -0
  592. package/src/app/shared/material/chips/material.chips.d.ts +164 -0
  593. package/src/app/shared/material/chips/testing/chips.test.d.ts +32 -0
  594. package/src/app/shared/material/datetime/datetime.module.d.ts +24 -0
  595. package/src/app/shared/material/datetime/material.date.d.ts +90 -0
  596. package/src/app/shared/material/datetime/material.dateshort.d.ts +89 -0
  597. package/src/app/shared/material/datetime/material.datetime.d.ts +116 -0
  598. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +37 -0
  599. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +32 -0
  600. package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +31 -0
  601. package/src/app/shared/material/duration/duration.module.d.ts +18 -0
  602. package/src/app/shared/material/duration/duration.utils.d.ts +2 -0
  603. package/src/app/shared/material/duration/material.duration.d.ts +64 -0
  604. package/src/app/shared/material/duration/testing/mat-duration.test.d.ts +23 -0
  605. package/src/app/shared/material/latlong/latlong.utils.d.ts +59 -0
  606. package/src/app/shared/material/latlong/material.latlong-input.d.ts +85 -0
  607. package/src/app/shared/material/latlong/material.latlong.d.ts +90 -0
  608. package/src/app/shared/material/latlong/material.latlong.module.d.ts +21 -0
  609. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +28 -0
  610. package/src/app/shared/material/material.animations.d.ts +8 -0
  611. package/src/app/shared/material/material.config.d.ts +3 -0
  612. package/src/app/shared/material/material.module.d.ts +45 -0
  613. package/src/app/shared/material/material.testing.module.d.ts +32 -0
  614. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +12 -0
  615. package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +10 -0
  616. package/src/app/shared/material/swipe/material.swipe.d.ts +89 -0
  617. package/src/app/shared/material/swipe/swipe.module.d.ts +16 -0
  618. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +22 -0
  619. package/src/app/shared/material/test/test-component.d.ts +75 -0
  620. package/src/app/shared/material/testing/common.test.d.ts +25 -0
  621. package/src/app/shared/material/text/testing/text-form.testing.d.ts +19 -0
  622. package/src/app/shared/material/text/text-form.component.d.ts +66 -0
  623. package/src/app/shared/material/text/text-form.module.d.ts +16 -0
  624. package/src/app/shared/modules.d.ts +9 -0
  625. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +62 -0
  626. package/src/app/shared/named-filter/named-filter.model.d.ts +32 -0
  627. package/src/app/shared/named-filter/named-filter.module.d.ts +13 -0
  628. package/src/app/shared/named-filter/named-filter.service.d.ts +32 -0
  629. package/src/app/shared/named-filter/testing/named-filter-selector.testing.d.ts +34 -0
  630. package/src/app/shared/named-filter/testing/named-filter.testing.module.d.ts +10 -0
  631. package/src/app/shared/observables.d.ts +30 -0
  632. package/src/app/shared/pipes/arrays.pipe.d.ts +82 -0
  633. package/src/app/shared/pipes/badge.pipes.d.ts +7 -0
  634. package/src/app/shared/pipes/colors.pipe.d.ts +9 -0
  635. package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +25 -0
  636. package/src/app/shared/pipes/date-format.pipe.d.ts +35 -0
  637. package/src/app/shared/pipes/date-from-now.pipe.d.ts +12 -0
  638. package/src/app/shared/pipes/dates.pipe.d.ts +10 -0
  639. package/src/app/shared/pipes/display-with.pipe.d.ts +8 -0
  640. package/src/app/shared/pipes/duration.pipe.d.ts +23 -0
  641. package/src/app/shared/pipes/file-size.pipe.d.ts +30 -0
  642. package/src/app/shared/pipes/form.pipes.d.ts +69 -0
  643. package/src/app/shared/pipes/highlight.pipe.d.ts +11 -0
  644. package/src/app/shared/pipes/html.pipes.d.ts +22 -0
  645. package/src/app/shared/pipes/latlong-format.pipe.d.ts +20 -0
  646. package/src/app/shared/pipes/maps.pipe.d.ts +23 -0
  647. package/src/app/shared/pipes/maskito.pipe.d.ts +14 -0
  648. package/src/app/shared/pipes/math.pipes.d.ts +26 -0
  649. package/src/app/shared/pipes/ng-init.pipe.d.ts +8 -0
  650. package/src/app/shared/pipes/number-format.pipe.d.ts +9 -0
  651. package/src/app/shared/pipes/observable.pipes.d.ts +25 -0
  652. package/src/app/shared/pipes/pipes.module.d.ts +35 -0
  653. package/src/app/shared/pipes/property.pipes.d.ts +41 -0
  654. package/src/app/shared/pipes/selection.pipes.d.ts +62 -0
  655. package/src/app/shared/pipes/string.pipes.d.ts +68 -0
  656. package/src/app/shared/pipes/translate-context.pipe.d.ts +17 -0
  657. package/src/app/shared/pipes/types.pipes.d.ts +30 -0
  658. package/src/app/shared/pipes/url.pipes.d.ts +27 -0
  659. package/src/app/shared/platforms.d.ts +16 -0
  660. package/src/app/shared/print/print.service.d.ts +94 -0
  661. package/src/app/shared/regexps.d.ts +32 -0
  662. package/src/app/shared/rx-state/rx-state.decorators.d.ts +43 -0
  663. package/src/app/shared/rx-state/rx-state.module.d.ts +10 -0
  664. package/src/app/shared/rx-state/rx-state.types.d.ts +4 -0
  665. package/src/app/shared/services/entity-service.class.d.ts +75 -0
  666. package/src/app/shared/services/job.utils.d.ts +20 -0
  667. package/src/app/shared/services/memory-entity-service.class.d.ts +79 -0
  668. package/src/app/shared/services/progress-bar.service.d.ts +20 -0
  669. package/src/app/shared/services/startable-observable-service.class.d.ts +36 -0
  670. package/src/app/shared/services/startable-service.class.d.ts +37 -0
  671. package/src/app/shared/services/translate-context.service.d.ts +29 -0
  672. package/src/app/shared/services/validator-service.class.d.ts +11 -0
  673. package/src/app/shared/services.d.ts +17 -0
  674. package/src/app/shared/shared-routing.module.d.ts +23 -0
  675. package/src/app/shared/shared.module.d.ts +33 -0
  676. package/src/app/shared/shared.testing.module.d.ts +20 -0
  677. package/src/app/shared/storage/storage-explorer.component.d.ts +59 -0
  678. package/src/app/shared/storage/storage-explorer.module.d.ts +13 -0
  679. package/src/app/shared/storage/storage-explorer.testing-routing.module.d.ts +9 -0
  680. package/src/app/shared/storage/storage-explorer.testing.module.d.ts +10 -0
  681. package/src/app/shared/storage/storage.service.d.ts +22 -0
  682. package/src/app/shared/storage/storage.utils.d.ts +19 -0
  683. package/src/app/shared/testing/maskito.test.d.ts +10 -0
  684. package/src/app/shared/testing/observable.test.d.ts +25 -0
  685. package/src/app/shared/testing/tests.page.d.ts +20 -0
  686. package/src/app/shared/toast/toast.testing.d.ts +15 -0
  687. package/src/app/shared/toast/toast.testing.module.d.ts +12 -0
  688. package/src/app/shared/toast/toasts.d.ts +16 -0
  689. package/src/app/shared/toolbar/modal-toolbar.d.ts +21 -0
  690. package/src/app/shared/toolbar/toolbar.d.ts +70 -0
  691. package/src/app/shared/toolbar/toolbar.module.d.ts +16 -0
  692. package/src/app/shared/types.d.ts +36 -0
  693. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +21 -0
  694. package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +11 -0
  695. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +41 -0
  696. package/src/app/shared/upload-file/upload-file.component.d.ts +50 -0
  697. package/src/app/shared/upload-file/upload-file.model.d.ts +30 -0
  698. package/src/app/shared/validator/form-error-adapter.class.d.ts +33 -0
  699. package/src/app/shared/validator/validators.d.ts +139 -0
  700. package/src/app/shared/version/versions.d.ts +26 -0
  701. package/src/app/social/job/job.module.d.ts +12 -0
  702. package/src/app/social/job/progression/job-progression.component.d.ts +23 -0
  703. package/src/app/social/job/progression/job-progression.icon.d.ts +62 -0
  704. package/src/app/social/job/progression/job-progression.list.d.ts +19 -0
  705. package/src/app/social/job/progression/job-progression.model.d.ts +10 -0
  706. package/src/app/social/job/progression/job-progression.service.d.ts +33 -0
  707. package/src/app/social/job/testing/job-progression.testing.d.ts +13 -0
  708. package/src/app/social/job/testing/job-progression.testing.service.d.ts +9 -0
  709. package/src/app/social/job/testing/job.testing.module.d.ts +11 -0
  710. package/src/app/social/message/message.form.d.ts +36 -0
  711. package/src/app/social/message/message.modal.d.ts +43 -0
  712. package/src/app/social/message/message.model.d.ts +33 -0
  713. package/src/app/social/message/message.module.d.ts +12 -0
  714. package/src/app/social/message/message.service.d.ts +32 -0
  715. package/src/app/social/social.errors.d.ts +9 -0
  716. package/src/app/social/social.module.d.ts +20 -0
  717. package/src/app/social/social.testing.module.d.ts +13 -0
  718. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +32 -0
  719. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +71 -0
  720. package/src/app/social/user-event/testing/user-event.testing.d.ts +35 -0
  721. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +42 -0
  722. package/src/app/social/user-event/testing/user-event.testing.module.d.ts +11 -0
  723. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +42 -0
  724. package/src/app/social/user-event/user-event.model.d.ts +44 -0
  725. package/src/app/social/user-event/user-event.module.d.ts +13 -0
  726. package/src/app/social/user-event/user-event.service.d.ts +124 -0
  727. package/src/assets/manifest.json +1 -1
  728. package/src/environments/environment.class.d.ts +75 -0
  729. package/src/environments/environment.d.ts +2 -0
  730. package/src/environments/environment.loader.d.ts +24 -0
  731. package/.editorconfig +0 -24
  732. package/.eslintrc.json +0 -95
  733. package/.gitattribute +0 -1
  734. package/.github/CONTRIBUTING.md +0 -10
  735. package/.github/ISSUE_TEMPLATE.md +0 -6
  736. package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
  737. package/.github/github_disclaimer.md +0 -14
  738. package/.gitlab-ci.yml +0 -46
  739. package/.graphqlconfig +0 -15
  740. package/.prettierignore +0 -9
  741. package/.prettierrc.json +0 -17
  742. package/angular.json +0 -236
  743. package/capacitor.config.ts +0 -49
  744. package/graphql.config.yml +0 -13
  745. package/ionic.config.json +0 -7
  746. package/karma.conf.js +0 -38
  747. package/ng-package.json +0 -21
  748. package/ngcc.config.js +0 -9
  749. package/public_api.ts +0 -426
  750. package/resources/README.md +0 -7
  751. package/resources/icon/TODO.md +0 -11
  752. package/resources/icon.png +0 -0
  753. package/resources/icon.png.md5 +0 -1
  754. package/resources/icon.xcf +0 -0
  755. package/resources/ios/icon/icon-1024.png +0 -0
  756. package/resources/ios/icon/icon-108@2x.png +0 -0
  757. package/resources/ios/icon/icon-20.png +0 -0
  758. package/resources/ios/icon/icon-20@2x.png +0 -0
  759. package/resources/ios/icon/icon-20@3x.png +0 -0
  760. package/resources/ios/icon/icon-24@2x.png +0 -0
  761. package/resources/ios/icon/icon-27.5@2x.png +0 -0
  762. package/resources/ios/icon/icon-29.png +0 -0
  763. package/resources/ios/icon/icon-29@2x.png +0 -0
  764. package/resources/ios/icon/icon-29@3x.png +0 -0
  765. package/resources/ios/icon/icon-40.png +0 -0
  766. package/resources/ios/icon/icon-40@2x.png +0 -0
  767. package/resources/ios/icon/icon-40@3x.png +0 -0
  768. package/resources/ios/icon/icon-44@2x.png +0 -0
  769. package/resources/ios/icon/icon-50.png +0 -0
  770. package/resources/ios/icon/icon-50@2x.png +0 -0
  771. package/resources/ios/icon/icon-60.png +0 -0
  772. package/resources/ios/icon/icon-60@2x.png +0 -0
  773. package/resources/ios/icon/icon-60@3x.png +0 -0
  774. package/resources/ios/icon/icon-72.png +0 -0
  775. package/resources/ios/icon/icon-72@2x.png +0 -0
  776. package/resources/ios/icon/icon-76.png +0 -0
  777. package/resources/ios/icon/icon-76@2x.png +0 -0
  778. package/resources/ios/icon/icon-83.5@2x.png +0 -0
  779. package/resources/ios/icon/icon-86@2x.png +0 -0
  780. package/resources/ios/icon/icon-98@2x.png +0 -0
  781. package/resources/ios/icon/icon-small.png +0 -0
  782. package/resources/ios/icon/icon-small@2x.png +0 -0
  783. package/resources/ios/icon/icon-small@3x.png +0 -0
  784. package/resources/ios/icon/icon.png +0 -0
  785. package/resources/ios/icon/icon@2x.png +0 -0
  786. package/resources/ios/splash/Default-1792h~iphone.png +0 -0
  787. package/resources/ios/splash/Default-2436h.png +0 -0
  788. package/resources/ios/splash/Default-2688h~iphone.png +0 -0
  789. package/resources/ios/splash/Default-568h@2x~iphone.png +0 -0
  790. package/resources/ios/splash/Default-667h.png +0 -0
  791. package/resources/ios/splash/Default-736h.png +0 -0
  792. package/resources/ios/splash/Default-Landscape-1792h~iphone.png +0 -0
  793. package/resources/ios/splash/Default-Landscape-2436h.png +0 -0
  794. package/resources/ios/splash/Default-Landscape-2688h~iphone.png +0 -0
  795. package/resources/ios/splash/Default-Landscape-736h.png +0 -0
  796. package/resources/ios/splash/Default-Landscape@2x~ipad.png +0 -0
  797. package/resources/ios/splash/Default-Landscape@~ipadpro.png +0 -0
  798. package/resources/ios/splash/Default-Landscape~ipad.png +0 -0
  799. package/resources/ios/splash/Default-Portrait@2x~ipad.png +0 -0
  800. package/resources/ios/splash/Default-Portrait@~ipadpro.png +0 -0
  801. package/resources/ios/splash/Default-Portrait~ipad.png +0 -0
  802. package/resources/ios/splash/Default@2x~iphone.png +0 -0
  803. package/resources/ios/splash/Default@2x~universal~anyany.png +0 -0
  804. package/resources/ios/splash/Default~iphone.png +0 -0
  805. package/resources/splash.png +0 -0
  806. package/resources/splash.png.md5 +0 -1
  807. package/scripts/build-android.sh +0 -18
  808. package/scripts/docker-start.sh +0 -6
  809. package/scripts/emulate-android.sh +0 -17
  810. package/scripts/env-android.sh +0 -83
  811. package/scripts/env-clean.sh +0 -23
  812. package/scripts/env-global.sh +0 -154
  813. package/scripts/install-android-sdk-tools.sh +0 -73
  814. package/scripts/ionic-update.sh +0 -24
  815. package/scripts/node/build-i18n.js +0 -37
  816. package/scripts/node/playground.ts +0 -9
  817. package/scripts/node/resources.js +0 -108
  818. package/scripts/release.sh +0 -162
  819. package/scripts/run-android.sh +0 -59
  820. package/scripts/test.sh +0 -19
  821. package/src/app/admin/admin-routing.module.ts +0 -26
  822. package/src/app/admin/admin.module.ts +0 -20
  823. package/src/app/admin/services/filter/person.filter.ts +0 -86
  824. package/src/app/admin/services/person.service.ts +0 -244
  825. package/src/app/admin/services/validator/person.validator.ts +0 -86
  826. package/src/app/admin/users/users.html +0 -613
  827. package/src/app/admin/users/users.module.ts +0 -32
  828. package/src/app/admin/users/users.scss +0 -80
  829. package/src/app/admin/users/users.ts +0 -387
  830. package/src/app/app-routing.module.ts +0 -165
  831. package/src/app/app.component.html +0 -14
  832. package/src/app/app.component.scss +0 -4
  833. package/src/app/app.component.ts +0 -252
  834. package/src/app/app.module.ts +0 -355
  835. package/src/app/core/about/about.modal.html +0 -145
  836. package/src/app/core/about/about.modal.scss +0 -22
  837. package/src/app/core/about/about.modal.ts +0 -69
  838. package/src/app/core/about/about.module.ts +0 -14
  839. package/src/app/core/account/account.module.ts +0 -43
  840. package/src/app/core/account/account.page.html +0 -329
  841. package/src/app/core/account/account.page.scss +0 -20
  842. package/src/app/core/account/account.page.ts +0 -389
  843. package/src/app/core/account/new-token.form.html +0 -90
  844. package/src/app/core/account/new-token.form.ts +0 -99
  845. package/src/app/core/account/new-token.modal.html +0 -52
  846. package/src/app/core/account/new-token.modal.ts +0 -68
  847. package/src/app/core/account/password/change-password.form.html +0 -62
  848. package/src/app/core/account/password/change-password.form.scss +0 -0
  849. package/src/app/core/account/password/change-password.form.ts +0 -58
  850. package/src/app/core/account/password/change-password.module.ts +0 -14
  851. package/src/app/core/account/password/change-password.page.html +0 -41
  852. package/src/app/core/account/password/change-password.page.scss +0 -49
  853. package/src/app/core/account/password/change-password.page.ts +0 -158
  854. package/src/app/core/account/token.table.html +0 -160
  855. package/src/app/core/account/token.table.scss +0 -7
  856. package/src/app/core/account/token.table.ts +0 -160
  857. package/src/app/core/auth/auth.form.html +0 -108
  858. package/src/app/core/auth/auth.form.scss +0 -0
  859. package/src/app/core/auth/auth.form.ts +0 -165
  860. package/src/app/core/auth/auth.modal.html +0 -50
  861. package/src/app/core/auth/auth.modal.scss +0 -0
  862. package/src/app/core/auth/auth.modal.ts +0 -78
  863. package/src/app/core/auth/auth.module.ts +0 -35
  864. package/src/app/core/auth/reset-password.modal.html +0 -59
  865. package/src/app/core/auth/reset-password.modal.ts +0 -83
  866. package/src/app/core/core.module.ts +0 -72
  867. package/src/app/core/core.testing.module.ts +0 -80
  868. package/src/app/core/form/array/form-array.ts +0 -409
  869. package/src/app/core/form/array/testing/form-array-test.module.ts +0 -15
  870. package/src/app/core/form/array/testing/form-array.test.html +0 -196
  871. package/src/app/core/form/array/testing/form-array.test.ts +0 -119
  872. package/src/app/core/form/buttons/form-buttons-bar.component.html +0 -82
  873. package/src/app/core/form/buttons/form-buttons-bar.component.scss +0 -19
  874. package/src/app/core/form/buttons/form-buttons-bar.component.ts +0 -89
  875. package/src/app/core/form/buttons/form-buttons-bar.module.ts +0 -20
  876. package/src/app/core/form/entity/editor.class.ts +0 -295
  877. package/src/app/core/form/entity/entity-editor-modal.class.ts +0 -494
  878. package/src/app/core/form/entity/entity-editor.class.ts +0 -894
  879. package/src/app/core/form/entity/entity-metadata.component.html +0 -57
  880. package/src/app/core/form/entity/entity-metadata.component.scss +0 -40
  881. package/src/app/core/form/entity/entity-metadata.component.ts +0 -18
  882. package/src/app/core/form/entity/entity.module.ts +0 -20
  883. package/src/app/core/form/entity/tab-editor.class.ts +0 -224
  884. package/src/app/core/form/form-container.class.ts +0 -380
  885. package/src/app/core/form/form.class.ts +0 -377
  886. package/src/app/core/form/form.module.ts +0 -38
  887. package/src/app/core/form/form.utils.ts +0 -305
  888. package/src/app/core/form/list/list.form.html +0 -68
  889. package/src/app/core/form/list/list.form.scss +0 -40
  890. package/src/app/core/form/list/list.form.ts +0 -266
  891. package/src/app/core/form/list/list.module.ts +0 -20
  892. package/src/app/core/form/properties/properties.form.html +0 -160
  893. package/src/app/core/form/properties/properties.form.scss +0 -21
  894. package/src/app/core/form/properties/properties.form.ts +0 -331
  895. package/src/app/core/form/properties/properties.module.ts +0 -24
  896. package/src/app/core/form/properties/properties.table.html +0 -228
  897. package/src/app/core/form/properties/properties.table.scss +0 -0
  898. package/src/app/core/form/properties/properties.table.ts +0 -275
  899. package/src/app/core/form/properties/properties.utils.ts +0 -391
  900. package/src/app/core/form/properties/property.validator.ts +0 -82
  901. package/src/app/core/form/properties/testing/properties-form.test.html +0 -23
  902. package/src/app/core/form/properties/testing/properties-form.test.ts +0 -109
  903. package/src/app/core/form/properties/testing/properties-form.testing.module.ts +0 -14
  904. package/src/app/core/form/text-popover/testing/text-popover.testing.html +0 -50
  905. package/src/app/core/form/text-popover/testing/text-popover.testing.module.ts +0 -21
  906. package/src/app/core/form/text-popover/testing/text-popover.testing.ts +0 -76
  907. package/src/app/core/form/text-popover/text-popover.component.html +0 -89
  908. package/src/app/core/form/text-popover/text-popover.component.scss +0 -7
  909. package/src/app/core/form/text-popover/text-popover.component.ts +0 -176
  910. package/src/app/core/form/text-popover/text-popover.module.ts +0 -19
  911. package/src/app/core/form/username/username.form.html +0 -27
  912. package/src/app/core/form/username/username.form.ts +0 -44
  913. package/src/app/core/form/username/username.module.ts +0 -12
  914. package/src/app/core/graphql/graphql.module.ts +0 -7
  915. package/src/app/core/graphql/graphql.service.ts +0 -962
  916. package/src/app/core/graphql/graphql.utils.ts +0 -166
  917. package/src/app/core/home/home.html +0 -295
  918. package/src/app/core/home/home.module.ts +0 -27
  919. package/src/app/core/home/home.scss +0 -279
  920. package/src/app/core/home/home.ts +0 -422
  921. package/src/app/core/icon/icon.component.html +0 -19
  922. package/src/app/core/icon/icon.component.ts +0 -22
  923. package/src/app/core/icon/icon.module.ts +0 -13
  924. package/src/app/core/install/install-upgrade-card.component.html +0 -144
  925. package/src/app/core/install/install-upgrade-card.component.scss +0 -3
  926. package/src/app/core/install/install-upgrade-card.component.ts +0 -445
  927. package/src/app/core/install/install-upgrade-card.module.ts +0 -18
  928. package/src/app/core/menu/menu.component.html +0 -219
  929. package/src/app/core/menu/menu.component.scss +0 -304
  930. package/src/app/core/menu/menu.component.ts +0 -251
  931. package/src/app/core/menu/menu.filter.ts +0 -28
  932. package/src/app/core/menu/menu.model.ts +0 -356
  933. package/src/app/core/menu/menu.module.ts +0 -27
  934. package/src/app/core/menu/menu.service.ts +0 -727
  935. package/src/app/core/menu/sub-menu-tab.directive.ts +0 -99
  936. package/src/app/core/menu/testing/menu-other.testing.ts +0 -57
  937. package/src/app/core/menu/testing/menu.testing.html +0 -143
  938. package/src/app/core/menu/testing/menu.testing.module.ts +0 -52
  939. package/src/app/core/menu/testing/menu.testing.scss +0 -5
  940. package/src/app/core/menu/testing/menu.testing.ts +0 -175
  941. package/src/app/core/offline/update-offline-mode-card.component.html +0 -39
  942. package/src/app/core/offline/update-offline-mode-card.component.scss +0 -3
  943. package/src/app/core/offline/update-offline-mode-card.component.ts +0 -23
  944. package/src/app/core/offline/update-offline-mode-card.module.ts +0 -20
  945. package/src/app/core/peer/select-peer.modal.html +0 -317
  946. package/src/app/core/peer/select-peer.modal.scss +0 -41
  947. package/src/app/core/peer/select-peer.modal.ts +0 -366
  948. package/src/app/core/peer/select-peer.module.ts +0 -23
  949. package/src/app/core/register/register-confirm.page.html +0 -51
  950. package/src/app/core/register/register-confirm.page.scss +0 -56
  951. package/src/app/core/register/register-confirm.page.ts +0 -90
  952. package/src/app/core/register/register.form.html +0 -143
  953. package/src/app/core/register/register.form.scss +0 -10
  954. package/src/app/core/register/register.form.ts +0 -218
  955. package/src/app/core/register/register.modal.html +0 -66
  956. package/src/app/core/register/register.modal.ts +0 -50
  957. package/src/app/core/register/register.module.ts +0 -15
  958. package/src/app/core/services/account.service.ts +0 -1567
  959. package/src/app/core/services/auth-guard.service.ts +0 -70
  960. package/src/app/core/services/base-entity-service.class.ts +0 -659
  961. package/src/app/core/services/base-graphql-service.class.ts +0 -319
  962. package/src/app/core/services/base58.ts +0 -90
  963. package/src/app/core/services/config/core.config.ts +0 -263
  964. package/src/app/core/services/config.service.ts +0 -425
  965. package/src/app/core/services/crypto.service.ts +0 -126
  966. package/src/app/core/services/errors.ts +0 -80
  967. package/src/app/core/services/local-settings.service.spec.ts +0 -39
  968. package/src/app/core/services/local-settings.service.ts +0 -605
  969. package/src/app/core/services/model/account.model.ts +0 -188
  970. package/src/app/core/services/model/config.model.ts +0 -116
  971. package/src/app/core/services/model/department.model.ts +0 -34
  972. package/src/app/core/services/model/entity.decorators.ts +0 -110
  973. package/src/app/core/services/model/entity.model.ts +0 -409
  974. package/src/app/core/services/model/filter.model.ts +0 -127
  975. package/src/app/core/services/model/history.model.ts +0 -25
  976. package/src/app/core/services/model/model.enum.ts +0 -10
  977. package/src/app/core/services/model/node-feature.model.ts +0 -31
  978. package/src/app/core/services/model/peer.model.ts +0 -119
  979. package/src/app/core/services/model/person.model.ts +0 -122
  980. package/src/app/core/services/model/referential.model.ts +0 -253
  981. package/src/app/core/services/model/settings.model.ts +0 -37
  982. package/src/app/core/services/model/token.model.ts +0 -60
  983. package/src/app/core/services/model/tree-item-entity.model.ts +0 -230
  984. package/src/app/core/services/network.service.spec.ts +0 -47
  985. package/src/app/core/services/network.service.ts +0 -761
  986. package/src/app/core/services/network.types.ts +0 -7
  987. package/src/app/core/services/network.utils.ts +0 -83
  988. package/src/app/core/services/pipes/account.pipes.ts +0 -22
  989. package/src/app/core/services/pipes/department-to-string.pipe.ts +0 -13
  990. package/src/app/core/services/pipes/person-to-string.pipe.ts +0 -13
  991. package/src/app/core/services/pipes/pipes.module.ts +0 -30
  992. package/src/app/core/services/pipes/referential-to-string.pipe.ts +0 -18
  993. package/src/app/core/services/pipes/usage-mode.pipes.ts +0 -23
  994. package/src/app/core/services/platform.service.spec.ts +0 -50
  995. package/src/app/core/services/platform.service.ts +0 -694
  996. package/src/app/core/services/storage/entities-storage.service.ts +0 -557
  997. package/src/app/core/services/storage/entity-store.class.ts +0 -589
  998. package/src/app/core/services/testing/local-settings.config.ts +0 -35
  999. package/src/app/core/services/testing/referential-filter.model.ts +0 -28
  1000. package/src/app/core/services/testing/referential.validator.ts +0 -58
  1001. package/src/app/core/services/testing/user-settings.config.ts +0 -77
  1002. package/src/app/core/services/validator/account.validator.ts +0 -50
  1003. package/src/app/core/services/validator/base.validator.class.ts +0 -51
  1004. package/src/app/core/services/validator/local-settings.validator.ts +0 -59
  1005. package/src/app/core/services/validator/user-settings.validator.ts +0 -22
  1006. package/src/app/core/services/validator/user-token.validator.ts +0 -54
  1007. package/src/app/core/settings/settings.module.ts +0 -15
  1008. package/src/app/core/settings/settings.page.html +0 -300
  1009. package/src/app/core/settings/settings.page.ts +0 -455
  1010. package/src/app/core/table/async-table.class.ts +0 -2019
  1011. package/src/app/core/table/column/actions-column.component.html +0 -219
  1012. package/src/app/core/table/column/actions-column.component.scss +0 -17
  1013. package/src/app/core/table/column/actions-column.component.ts +0 -83
  1014. package/src/app/core/table/column/nav-actions-column.component.html +0 -119
  1015. package/src/app/core/table/column/nav-actions-column.component.ts +0 -108
  1016. package/src/app/core/table/column/row-field.component.html +0 -43
  1017. package/src/app/core/table/column/row-field.component.scss +0 -0
  1018. package/src/app/core/table/column/row-field.component.ts +0 -63
  1019. package/src/app/core/table/entities-async-table-datasource.class.ts +0 -501
  1020. package/src/app/core/table/entities-table-datasource.class.ts +0 -499
  1021. package/src/app/core/table/memory-table.class.ts +0 -56
  1022. package/src/app/core/table/table-select-columns.component.html +0 -56
  1023. package/src/app/core/table/table-select-columns.component.ts +0 -49
  1024. package/src/app/core/table/table.class.ts +0 -2080
  1025. package/src/app/core/table/table.model.ts +0 -39
  1026. package/src/app/core/table/table.module.ts +0 -28
  1027. package/src/app/core/table/table.pipes.ts +0 -87
  1028. package/src/app/core/table/table.utils.ts +0 -42
  1029. package/src/app/core/table/testing/multi-table.testing.html +0 -456
  1030. package/src/app/core/table/testing/multi-table.testing.ts +0 -263
  1031. package/src/app/core/table/testing/table-validator.service.ts +0 -29
  1032. package/src/app/core/table/testing/table.testing.html +0 -556
  1033. package/src/app/core/table/testing/table.testing.module.ts +0 -16
  1034. package/src/app/core/table/testing/table.testing.scss +0 -32
  1035. package/src/app/core/table/testing/table.testing.ts +0 -329
  1036. package/src/app/core/table/testing/table2-validator.service.ts +0 -19
  1037. package/src/app/core/table/testing/table2.testing.html +0 -470
  1038. package/src/app/core/table/testing/table2.testing.scss +0 -25
  1039. package/src/app/core/table/testing/table2.testing.ts +0 -274
  1040. package/src/app/shared/alerts.ts +0 -296
  1041. package/src/app/shared/audio/audio.testing.html +0 -29
  1042. package/src/app/shared/audio/audio.testing.module.ts +0 -21
  1043. package/src/app/shared/audio/audio.testing.ts +0 -27
  1044. package/src/app/shared/audio/audio.ts +0 -273
  1045. package/src/app/shared/base64.utils.ts +0 -66
  1046. package/src/app/shared/capacitor/keyboard.ts +0 -38
  1047. package/src/app/shared/capacitor/plugins.ts +0 -12
  1048. package/src/app/shared/constants.ts +0 -19
  1049. package/src/app/shared/dates.ts +0 -206
  1050. package/src/app/shared/debug/debug-service.class.ts +0 -7
  1051. package/src/app/shared/debug/debug.component.html +0 -13
  1052. package/src/app/shared/debug/debug.component.scss +0 -21
  1053. package/src/app/shared/debug/debug.component.spec.ts +0 -24
  1054. package/src/app/shared/debug/debug.component.ts +0 -25
  1055. package/src/app/shared/debug/debug.module.ts +0 -14
  1056. package/src/app/shared/directives/autofocus.directive.ts +0 -93
  1057. package/src/app/shared/directives/autoresize.directive.ts +0 -67
  1058. package/src/app/shared/directives/autotitle.directive.ts +0 -17
  1059. package/src/app/shared/directives/directives.module.ts +0 -16
  1060. package/src/app/shared/directives/drag-and-drop.directive.ts +0 -46
  1061. package/src/app/shared/directives/ng-var.directive.ts +0 -31
  1062. package/src/app/shared/directives/resizable/resizable.component.ts +0 -48
  1063. package/src/app/shared/directives/resizable/resizable.directive.ts +0 -43
  1064. package/src/app/shared/directives/resizable/resizable.module.ts +0 -9
  1065. package/src/app/shared/directives/resizable/resizable.style.scss +0 -37
  1066. package/src/app/shared/directives/resizable/resizable.template.html +0 -6
  1067. package/src/app/shared/directives/throttled-click.directive.ts +0 -36
  1068. package/src/app/shared/events.ts +0 -93
  1069. package/src/app/shared/file/csv.utils.ts +0 -123
  1070. package/src/app/shared/file/file.service.ts +0 -129
  1071. package/src/app/shared/file/file.utils.ts +0 -142
  1072. package/src/app/shared/file/images.utils.ts +0 -214
  1073. package/src/app/shared/file/json.utils.ts +0 -82
  1074. package/src/app/shared/file/uri.utils.ts +0 -31
  1075. package/src/app/shared/file/url.utils.ts +0 -163
  1076. package/src/app/shared/focusable.ts +0 -8
  1077. package/src/app/shared/form/field.component.html +0 -380
  1078. package/src/app/shared/form/field.component.scss +0 -7
  1079. package/src/app/shared/form/field.component.ts +0 -344
  1080. package/src/app/shared/form/field.model.ts +0 -158
  1081. package/src/app/shared/form/loading-spinner.ts +0 -16
  1082. package/src/app/shared/forms.ts +0 -577
  1083. package/src/app/shared/functions.spec.ts +0 -197
  1084. package/src/app/shared/functions.ts +0 -694
  1085. package/src/app/shared/geolocation/geolocation.utils.ts +0 -105
  1086. package/src/app/shared/gesture/gesture-config.ts +0 -43
  1087. package/src/app/shared/gesture/hammer.utils.ts +0 -14
  1088. package/src/app/shared/graph/colors.utils.ts +0 -69
  1089. package/src/app/shared/graph/graph-colors.ts +0 -270
  1090. package/src/app/shared/guard/component-dirty.guard.ts +0 -67
  1091. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.html +0 -11
  1092. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.scss +0 -37
  1093. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.ts +0 -14
  1094. package/src/app/shared/hotkeys/hotkeys.service.ts +0 -165
  1095. package/src/app/shared/hotkeys/shared-hotkeys.module.ts +0 -15
  1096. package/src/app/shared/http/http.utils.ts +0 -95
  1097. package/src/app/shared/image/gallery/image-gallery.component.html +0 -282
  1098. package/src/app/shared/image/gallery/image-gallery.component.scss +0 -218
  1099. package/src/app/shared/image/gallery/image-gallery.component.ts +0 -434
  1100. package/src/app/shared/image/gallery/image-gallery.module.ts +0 -35
  1101. package/src/app/shared/image/gallery/testing/gallegry.model.testing.ts +0 -23
  1102. package/src/app/shared/image/gallery/testing/gallery.service.testing.ts +0 -99
  1103. package/src/app/shared/image/gallery/testing/gallery.testing.html +0 -27
  1104. package/src/app/shared/image/gallery/testing/gallery.testing.module.ts +0 -39
  1105. package/src/app/shared/image/gallery/testing/gallery.testing.ts +0 -34
  1106. package/src/app/shared/image/image.model.ts +0 -8
  1107. package/src/app/shared/image/image.module.ts +0 -12
  1108. package/src/app/shared/image/image.service.ts +0 -111
  1109. package/src/app/shared/image/image.testing.module.ts +0 -16
  1110. package/src/app/shared/inputs.ts +0 -330
  1111. package/src/app/shared/interceptors/progess.interceptor.ts +0 -24
  1112. package/src/app/shared/logging/log-level.model.ts +0 -53
  1113. package/src/app/shared/logging/logger.model.ts +0 -117
  1114. package/src/app/shared/logging/logging-service.class.ts +0 -131
  1115. package/src/app/shared/logging/logging-service.config.ts +0 -29
  1116. package/src/app/shared/logging/logging-service.module.ts +0 -19
  1117. package/src/app/shared/markdown/markdown.component.html +0 -55
  1118. package/src/app/shared/markdown/markdown.component.scss +0 -75
  1119. package/src/app/shared/markdown/markdown.component.ts +0 -350
  1120. package/src/app/shared/markdown/markdown.directive.ts +0 -28
  1121. package/src/app/shared/markdown/markdown.modal.html +0 -42
  1122. package/src/app/shared/markdown/markdown.modal.ts +0 -91
  1123. package/src/app/shared/markdown/markdown.module.ts +0 -65
  1124. package/src/app/shared/markdown/markdown.service.ts +0 -234
  1125. package/src/app/shared/markdown/markdown.utils.ts +0 -90
  1126. package/src/app/shared/markdown/testing/markdown.test.html +0 -50
  1127. package/src/app/shared/markdown/testing/markdown.test.ts +0 -49
  1128. package/src/app/shared/markdown/testing/markdown.testing.module.ts +0 -22
  1129. package/src/app/shared/material/autocomplete/material.autocomplete.config.ts +0 -127
  1130. package/src/app/shared/material/autocomplete/material.autocomplete.html +0 -400
  1131. package/src/app/shared/material/autocomplete/material.autocomplete.module.ts +0 -41
  1132. package/src/app/shared/material/autocomplete/material.autocomplete.scss +0 -54
  1133. package/src/app/shared/material/autocomplete/material.autocomplete.ts +0 -1375
  1134. package/src/app/shared/material/autocomplete/material.autocomplete.utils.ts +0 -21
  1135. package/src/app/shared/material/autocomplete/testing/autocomplete.test.html +0 -1164
  1136. package/src/app/shared/material/autocomplete/testing/autocomplete.test.spec.ts +0 -33
  1137. package/src/app/shared/material/autocomplete/testing/autocomplete.test.ts +0 -272
  1138. package/src/app/shared/material/badge/badge.directive.ts +0 -217
  1139. package/src/app/shared/material/badge/badge.module.ts +0 -12
  1140. package/src/app/shared/material/badge/badge.test.html +0 -275
  1141. package/src/app/shared/material/badge/badge.test.ts +0 -34
  1142. package/src/app/shared/material/boolean/boolean.module.ts +0 -36
  1143. package/src/app/shared/material/boolean/material.boolean.html +0 -271
  1144. package/src/app/shared/material/boolean/material.boolean.scss +0 -27
  1145. package/src/app/shared/material/boolean/material.boolean.ts +0 -343
  1146. package/src/app/shared/material/boolean/testing/boolean.test.page.html +0 -469
  1147. package/src/app/shared/material/boolean/testing/boolean.test.page.ts +0 -66
  1148. package/src/app/shared/material/chips/chips.module.ts +0 -38
  1149. package/src/app/shared/material/chips/material.chips.html +0 -233
  1150. package/src/app/shared/material/chips/material.chips.scss +0 -67
  1151. package/src/app/shared/material/chips/material.chips.ts +0 -834
  1152. package/src/app/shared/material/chips/testing/chips.test.html +0 -207
  1153. package/src/app/shared/material/chips/testing/chips.test.ts +0 -169
  1154. package/src/app/shared/material/datetime/datetime.module.ts +0 -42
  1155. package/src/app/shared/material/datetime/material.date.html +0 -186
  1156. package/src/app/shared/material/datetime/material.date.scss +0 -17
  1157. package/src/app/shared/material/datetime/material.date.ts +0 -512
  1158. package/src/app/shared/material/datetime/material.dateshort.html +0 -194
  1159. package/src/app/shared/material/datetime/material.dateshort.scss +0 -23
  1160. package/src/app/shared/material/datetime/material.dateshort.ts +0 -497
  1161. package/src/app/shared/material/datetime/material.datetime.html +0 -325
  1162. package/src/app/shared/material/datetime/material.datetime.scss +0 -87
  1163. package/src/app/shared/material/datetime/material.datetime.ts +0 -758
  1164. package/src/app/shared/material/datetime/testing/mat-date-time.test.html +0 -794
  1165. package/src/app/shared/material/datetime/testing/mat-date-time.test.ts +0 -155
  1166. package/src/app/shared/material/datetime/testing/mat-date.test.html +0 -564
  1167. package/src/app/shared/material/datetime/testing/mat-date.test.ts +0 -145
  1168. package/src/app/shared/material/datetime/testing/mat-dateshort.test.html +0 -530
  1169. package/src/app/shared/material/datetime/testing/mat-dateshort.test.ts +0 -133
  1170. package/src/app/shared/material/duration/duration.module.ts +0 -33
  1171. package/src/app/shared/material/duration/duration.utils.ts +0 -18
  1172. package/src/app/shared/material/duration/material.duration.html +0 -116
  1173. package/src/app/shared/material/duration/material.duration.scss +0 -28
  1174. package/src/app/shared/material/duration/material.duration.ts +0 -308
  1175. package/src/app/shared/material/duration/testing/mat-duration.test.html +0 -170
  1176. package/src/app/shared/material/duration/testing/mat-duration.test.ts +0 -88
  1177. package/src/app/shared/material/latlong/latlong.utils.ts +0 -376
  1178. package/src/app/shared/material/latlong/material.latlong-input.html +0 -95
  1179. package/src/app/shared/material/latlong/material.latlong-input.scss +0 -66
  1180. package/src/app/shared/material/latlong/material.latlong-input.ts +0 -445
  1181. package/src/app/shared/material/latlong/material.latlong.html +0 -90
  1182. package/src/app/shared/material/latlong/material.latlong.module.ts +0 -37
  1183. package/src/app/shared/material/latlong/material.latlong.scss +0 -0
  1184. package/src/app/shared/material/latlong/material.latlong.ts +0 -203
  1185. package/src/app/shared/material/latlong/testing/latlong.test.html +0 -1008
  1186. package/src/app/shared/material/latlong/testing/latlong.test.ts +0 -144
  1187. package/src/app/shared/material/material.animations.ts +0 -269
  1188. package/src/app/shared/material/material.config.ts +0 -5
  1189. package/src/app/shared/material/material.module.ts +0 -94
  1190. package/src/app/shared/material/material.testing.module.ts +0 -192
  1191. package/src/app/shared/material/memory/memory.utils.ts +0 -57
  1192. package/src/app/shared/material/numpad/numpad.animation.ts +0 -1
  1193. package/src/app/shared/material/numpad/numpad.append-to-input.directive.ts +0 -110
  1194. package/src/app/shared/material/numpad/numpad.component.ts +0 -73
  1195. package/src/app/shared/material/numpad/numpad.container.html +0 -37
  1196. package/src/app/shared/material/numpad/numpad.container.scss +0 -55
  1197. package/src/app/shared/material/numpad/numpad.container.ts +0 -152
  1198. package/src/app/shared/material/numpad/numpad.content.html +0 -13
  1199. package/src/app/shared/material/numpad/numpad.content.ts +0 -10
  1200. package/src/app/shared/material/numpad/numpad.directive.ts +0 -159
  1201. package/src/app/shared/material/numpad/numpad.dom-service.ts +0 -35
  1202. package/src/app/shared/material/numpad/numpad.model.ts +0 -53
  1203. package/src/app/shared/material/numpad/numpad.module.ts +0 -18
  1204. package/src/app/shared/material/numpad/testing/numpad.test.html +0 -146
  1205. package/src/app/shared/material/numpad/testing/numpad.test.ts +0 -44
  1206. package/src/app/shared/material/paginator/material.paginator-i18n.ts +0 -47
  1207. package/src/app/shared/material/stepper/material.stepper-i18n.ts +0 -17
  1208. package/src/app/shared/material/swipe/material.swipe.html +0 -85
  1209. package/src/app/shared/material/swipe/material.swipe.scss +0 -55
  1210. package/src/app/shared/material/swipe/material.swipe.ts +0 -366
  1211. package/src/app/shared/material/swipe/swipe.module.ts +0 -29
  1212. package/src/app/shared/material/swipe/testing/swipe.test.html +0 -112
  1213. package/src/app/shared/material/swipe/testing/swipe.test.ts +0 -74
  1214. package/src/app/shared/material/test/test-component.css +0 -22
  1215. package/src/app/shared/material/test/test-component.html +0 -40
  1216. package/src/app/shared/material/test/test-component.ts +0 -295
  1217. package/src/app/shared/material/testing/common.test.html +0 -227
  1218. package/src/app/shared/material/testing/common.test.ts +0 -126
  1219. package/src/app/shared/material/text/testing/text-form.testing.html +0 -213
  1220. package/src/app/shared/material/text/testing/text-form.testing.ts +0 -30
  1221. package/src/app/shared/material/text/text-form.component.html +0 -63
  1222. package/src/app/shared/material/text/text-form.component.scss +0 -8
  1223. package/src/app/shared/material/text/text-form.component.ts +0 -177
  1224. package/src/app/shared/material/text/text-form.module.ts +0 -36
  1225. package/src/app/shared/modules.ts +0 -12
  1226. package/src/app/shared/named-filter/named-filter-selector.component.html +0 -77
  1227. package/src/app/shared/named-filter/named-filter-selector.component.scss +0 -3
  1228. package/src/app/shared/named-filter/named-filter-selector.component.ts +0 -287
  1229. package/src/app/shared/named-filter/named-filter.model.ts +0 -64
  1230. package/src/app/shared/named-filter/named-filter.module.ts +0 -15
  1231. package/src/app/shared/named-filter/named-filter.service.ts +0 -100
  1232. package/src/app/shared/named-filter/testing/named-filter-selector.testing.html +0 -61
  1233. package/src/app/shared/named-filter/testing/named-filter-selector.testing.ts +0 -80
  1234. package/src/app/shared/named-filter/testing/named-filter.testing.module.ts +0 -20
  1235. package/src/app/shared/named-filter/testing/named-filter.testing.service.ts +0 -83
  1236. package/src/app/shared/observables.ts +0 -139
  1237. package/src/app/shared/pipes/arrays.pipe.ts +0 -153
  1238. package/src/app/shared/pipes/badge.pipes.ts +0 -17
  1239. package/src/app/shared/pipes/colors.pipe.ts +0 -24
  1240. package/src/app/shared/pipes/date-diff-duration.pipe.ts +0 -53
  1241. package/src/app/shared/pipes/date-format.pipe.ts +0 -73
  1242. package/src/app/shared/pipes/date-from-now.pipe.ts +0 -17
  1243. package/src/app/shared/pipes/dates.pipe.ts +0 -13
  1244. package/src/app/shared/pipes/display-with.pipe.ts +0 -13
  1245. package/src/app/shared/pipes/duration.pipe.spec.ts +0 -41
  1246. package/src/app/shared/pipes/duration.pipe.ts +0 -28
  1247. package/src/app/shared/pipes/file-size.pipe.ts +0 -50
  1248. package/src/app/shared/pipes/form.pipes.ts +0 -209
  1249. package/src/app/shared/pipes/highlight.pipe.ts +0 -41
  1250. package/src/app/shared/pipes/html.pipes.ts +0 -49
  1251. package/src/app/shared/pipes/latlong-format.pipe.ts +0 -28
  1252. package/src/app/shared/pipes/maps.pipe.ts +0 -41
  1253. package/src/app/shared/pipes/maskito.pipe.ts +0 -68
  1254. package/src/app/shared/pipes/math.pipes.ts +0 -46
  1255. package/src/app/shared/pipes/ng-init.pipe.ts +0 -13
  1256. package/src/app/shared/pipes/number-format.pipe.ts +0 -11
  1257. package/src/app/shared/pipes/observable.pipes.ts +0 -45
  1258. package/src/app/shared/pipes/pipes.module.ts +0 -162
  1259. package/src/app/shared/pipes/property.pipes.ts +0 -115
  1260. package/src/app/shared/pipes/selection.pipes.ts +0 -165
  1261. package/src/app/shared/pipes/string.pipes.ts +0 -128
  1262. package/src/app/shared/pipes/translate-context.pipe.ts +0 -27
  1263. package/src/app/shared/pipes/types.pipes.ts +0 -52
  1264. package/src/app/shared/pipes/url.pipes.ts +0 -36
  1265. package/src/app/shared/platforms.ts +0 -99
  1266. package/src/app/shared/print/print.service.ts +0 -337
  1267. package/src/app/shared/regexps.ts +0 -112
  1268. package/src/app/shared/rx-state/rx-state.decorators.ts +0 -281
  1269. package/src/app/shared/rx-state/rx-state.module.ts +0 -11
  1270. package/src/app/shared/rx-state/rx-state.types.ts +0 -5
  1271. package/src/app/shared/services/entity-service.class.ts +0 -120
  1272. package/src/app/shared/services/job.utils.ts +0 -124
  1273. package/src/app/shared/services/memory-entity-service.class.ts +0 -435
  1274. package/src/app/shared/services/progress-bar.service.ts +0 -40
  1275. package/src/app/shared/services/startable-observable-service.class.ts +0 -129
  1276. package/src/app/shared/services/startable-service.class.ts +0 -120
  1277. package/src/app/shared/services/storage.utils.ts +0 -53
  1278. package/src/app/shared/services/translate-context.service.ts +0 -112
  1279. package/src/app/shared/services/validator-service.class.ts +0 -13
  1280. package/src/app/shared/services.ts +0 -134
  1281. package/src/app/shared/shared-routing.module.ts +0 -69
  1282. package/src/app/shared/shared.module.spec.ts +0 -13
  1283. package/src/app/shared/shared.module.ts +0 -168
  1284. package/src/app/shared/shared.testing.module.ts +0 -61
  1285. package/src/app/shared/storage/storage-explorer.component.html +0 -160
  1286. package/src/app/shared/storage/storage-explorer.component.scss +0 -37
  1287. package/src/app/shared/storage/storage-explorer.component.spec.ts +0 -24
  1288. package/src/app/shared/storage/storage-explorer.component.ts +0 -268
  1289. package/src/app/shared/storage/storage-explorer.module.ts +0 -24
  1290. package/src/app/shared/storage/storage-explorer.testing-routing.module.ts +0 -19
  1291. package/src/app/shared/storage/storage-explorer.testing.module.ts +0 -19
  1292. package/src/app/shared/storage/storage.service.ts +0 -131
  1293. package/src/app/shared/storage/storage.utils.ts +0 -25
  1294. package/src/app/shared/testing/maskito.test.html +0 -40
  1295. package/src/app/shared/testing/maskito.test.ts +0 -33
  1296. package/src/app/shared/testing/observable.test.html +0 -53
  1297. package/src/app/shared/testing/observable.test.scss +0 -3
  1298. package/src/app/shared/testing/observable.test.ts +0 -101
  1299. package/src/app/shared/testing/tests.page.html +0 -22
  1300. package/src/app/shared/testing/tests.page.ts +0 -32
  1301. package/src/app/shared/toast/toast.testing.html +0 -50
  1302. package/src/app/shared/toast/toast.testing.module.ts +0 -22
  1303. package/src/app/shared/toast/toast.testing.ts +0 -52
  1304. package/src/app/shared/toast/toasts.ts +0 -161
  1305. package/src/app/shared/toolbar/modal-toolbar.html +0 -30
  1306. package/src/app/shared/toolbar/modal-toolbar.scss +0 -0
  1307. package/src/app/shared/toolbar/modal-toolbar.ts +0 -64
  1308. package/src/app/shared/toolbar/toolbar.html +0 -68
  1309. package/src/app/shared/toolbar/toolbar.module.ts +0 -18
  1310. package/src/app/shared/toolbar/toolbar.scss +0 -0
  1311. package/src/app/shared/toolbar/toolbar.ts +0 -262
  1312. package/src/app/shared/types.ts +0 -44
  1313. package/src/app/shared/upload-file/testing/upload-file.testing.html +0 -30
  1314. package/src/app/shared/upload-file/testing/upload-file.testing.module.ts +0 -21
  1315. package/src/app/shared/upload-file/testing/upload-file.testing.ts +0 -65
  1316. package/src/app/shared/upload-file/upload-file-popover.component.html +0 -46
  1317. package/src/app/shared/upload-file/upload-file-popover.component.scss +0 -6
  1318. package/src/app/shared/upload-file/upload-file-popover.component.ts +0 -115
  1319. package/src/app/shared/upload-file/upload-file.component.html +0 -57
  1320. package/src/app/shared/upload-file/upload-file.component.scss +0 -60
  1321. package/src/app/shared/upload-file/upload-file.component.ts +0 -222
  1322. package/src/app/shared/upload-file/upload-file.model.ts +0 -40
  1323. package/src/app/shared/validator/form-error-adapter.class.ts +0 -136
  1324. package/src/app/shared/validator/validators.ts +0 -725
  1325. package/src/app/shared/version/versions.ts +0 -89
  1326. package/src/app/social/job/job.module.ts +0 -14
  1327. package/src/app/social/job/progression/job-progression.component.html +0 -19
  1328. package/src/app/social/job/progression/job-progression.component.scss +0 -15
  1329. package/src/app/social/job/progression/job-progression.component.ts +0 -39
  1330. package/src/app/social/job/progression/job-progression.icon.html +0 -30
  1331. package/src/app/social/job/progression/job-progression.icon.scss +0 -7
  1332. package/src/app/social/job/progression/job-progression.icon.ts +0 -276
  1333. package/src/app/social/job/progression/job-progression.list.html +0 -25
  1334. package/src/app/social/job/progression/job-progression.list.scss +0 -17
  1335. package/src/app/social/job/progression/job-progression.list.ts +0 -40
  1336. package/src/app/social/job/progression/job-progression.model.ts +0 -26
  1337. package/src/app/social/job/progression/job-progression.service.ts +0 -97
  1338. package/src/app/social/job/testing/job-progression.testing.html +0 -11
  1339. package/src/app/social/job/testing/job-progression.testing.service.ts +0 -33
  1340. package/src/app/social/job/testing/job-progression.testing.ts +0 -28
  1341. package/src/app/social/job/testing/job.testing.module.ts +0 -13
  1342. package/src/app/social/message/message.form.html +0 -71
  1343. package/src/app/social/message/message.form.scss +0 -6
  1344. package/src/app/social/message/message.form.ts +0 -128
  1345. package/src/app/social/message/message.modal.html +0 -68
  1346. package/src/app/social/message/message.modal.ts +0 -117
  1347. package/src/app/social/message/message.model.ts +0 -78
  1348. package/src/app/social/message/message.module.ts +0 -14
  1349. package/src/app/social/message/message.service.ts +0 -104
  1350. package/src/app/social/social.errors.ts +0 -10
  1351. package/src/app/social/social.module.ts +0 -23
  1352. package/src/app/social/social.testing.module.ts +0 -33
  1353. package/src/app/social/user-event/notification/user-event-notification.icon.html +0 -17
  1354. package/src/app/social/user-event/notification/user-event-notification.icon.ts +0 -112
  1355. package/src/app/social/user-event/notification/user-event-notification.list.html +0 -142
  1356. package/src/app/social/user-event/notification/user-event-notification.list.scss +0 -73
  1357. package/src/app/social/user-event/notification/user-event-notification.list.ts +0 -270
  1358. package/src/app/social/user-event/testing/user-event.testing.html +0 -26
  1359. package/src/app/social/user-event/testing/user-event.testing.model.ts +0 -142
  1360. package/src/app/social/user-event/testing/user-event.testing.module.ts +0 -13
  1361. package/src/app/social/user-event/testing/user-event.testing.service.ts +0 -161
  1362. package/src/app/social/user-event/testing/user-event.testing.ts +0 -282
  1363. package/src/app/social/user-event/user-event.model.ts +0 -55
  1364. package/src/app/social/user-event/user-event.module.ts +0 -15
  1365. package/src/app/social/user-event/user-event.service.ts +0 -686
  1366. package/src/browserslist +0 -9
  1367. package/src/environments/environment.class.ts +0 -106
  1368. package/src/environments/environment.loader.ts +0 -90
  1369. package/src/environments/environment.prod.ts +0 -49
  1370. package/src/environments/environment.test.ts +0 -92
  1371. package/src/environments/environment.ts +0 -126
  1372. package/src/favicon.ico +0 -0
  1373. package/src/global.scss +0 -13
  1374. package/src/index.html +0 -76
  1375. package/src/main.ts +0 -18
  1376. package/src/polyfills.ts +0 -34
  1377. package/src/schema.graphql +0 -4381
  1378. package/src/service-worker.js +0 -31
  1379. package/src/test.ts +0 -30
  1380. package/tsconfig.app.json +0 -15
  1381. package/tsconfig.json +0 -47
  1382. package/tsconfig.spec.json +0 -18
@@ -0,0 +1,382 @@
1
+ import { ChangeDetectionStrategy, Component, Inject, InjectionToken, Optional } from '@angular/core';
2
+ import { RegisterModal } from '../register/register.modal';
3
+ import { BehaviorSubject, Subscription } from 'rxjs';
4
+ import { accountToString } from '../services/model/account.model';
5
+ import { APP_LOCALES } from '../services/model/settings.model';
6
+ import { debounceTime, distinctUntilChanged, map, startWith } from 'rxjs/operators';
7
+ import { AppAuthModal } from '../auth/auth.modal';
8
+ import { MenuItems } from '../menu/menu.model';
9
+ import { Toasts } from '../../shared/toast/toasts';
10
+ import { fadeInAnimation, slideUpDownAnimation } from '../../shared/material/material.animations';
11
+ import { isNilOrBlank, isNotEmptyArray, isNotNil, isNotNilOrBlank } from '../../shared/functions';
12
+ import { ENVIRONMENT } from '../../../environments/environment.class';
13
+ import { CORE_CONFIG_OPTIONS } from '../services/config/core.config';
14
+ import { RxState } from '@rx-angular/state';
15
+ import { ImagesUtils } from '../../shared/file/images.utils';
16
+ import { UriUtils } from '../../shared/file/uri.utils';
17
+ import { Peer } from '../services/model/peer.model';
18
+ import { AppMarkdownModal } from '../../shared/markdown/markdown.modal';
19
+ import * as i0 from "@angular/core";
20
+ import * as i1 from "../services/account.service";
21
+ import * as i2 from "@ionic/angular";
22
+ import * as i3 from "@ngx-translate/core";
23
+ import * as i4 from "../services/config.service";
24
+ import * as i5 from "../services/platform.service";
25
+ import * as i6 from "../services/network.service";
26
+ import * as i7 from "../services/local-settings.service";
27
+ import * as i8 from "@angular/common";
28
+ import * as i9 from "@rx-angular/template/if";
29
+ import * as i10 from "@angular/material/icon";
30
+ import * as i11 from "@angular/material/button";
31
+ import * as i12 from "@angular/material/menu";
32
+ import * as i13 from "../../shared/toolbar/toolbar";
33
+ import * as i14 from "@angular/router";
34
+ import * as i15 from "../install/install-upgrade-card.component";
35
+ import * as i16 from "@rx-angular/template/push";
36
+ import * as i17 from "../../shared/pipes/date-format.pipe";
37
+ import * as i18 from "../../shared/pipes/date-from-now.pipe";
38
+ import * as i19 from "../../shared/pipes/arrays.pipe";
39
+ import * as i20 from "../../shared/pipes/string.pipes";
40
+ import * as i21 from "../../../environments/environment.class";
41
+ /**
42
+ * @param files
43
+ * @deprecated use `getRandomImageWithCredit()` instead
44
+ **/
45
+ export const getRandomImage = ImagesUtils.getRandomImage;
46
+ export const getRandomImageWithCredit = ImagesUtils.getRandomImageWithCredit;
47
+ export const APP_HOME_BUTTONS = new InjectionToken('homeButton');
48
+ export class HomePage extends RxState {
49
+ accountService;
50
+ modalCtrl;
51
+ translate;
52
+ toastController;
53
+ configService;
54
+ platform;
55
+ cd;
56
+ network;
57
+ settings;
58
+ environment;
59
+ locales;
60
+ buttons;
61
+ _debug;
62
+ _subscription = new Subscription();
63
+ _config;
64
+ darkMode$ = this.select('darkMode');
65
+ pageHistory$ = this.select('pageHistory');
66
+ loading$ = this.select('loading');
67
+ mobile;
68
+ waitingNetwork = false;
69
+ accountName = '';
70
+ isLogin;
71
+ $partners = new BehaviorSubject(null);
72
+ logo;
73
+ description;
74
+ appName;
75
+ isWeb;
76
+ canRegister;
77
+ contentStyle;
78
+ contentCredits;
79
+ legalInformation;
80
+ offline;
81
+ $filteredButtons = new BehaviorSubject(undefined);
82
+ showAccountButton;
83
+ set pageHistory(value) {
84
+ this.set('pageHistory', () => value);
85
+ }
86
+ get pageHistory() {
87
+ return this.get('pageHistory');
88
+ }
89
+ set loading(value) {
90
+ this.set('loading', () => value);
91
+ }
92
+ get loading() {
93
+ return this.get('loading');
94
+ }
95
+ set showSpinner(value) {
96
+ this.set('showSpinner', () => value);
97
+ }
98
+ get showSpinner() {
99
+ return this.get('showSpinner');
100
+ }
101
+ set showPartnerBanner(value) {
102
+ this.set('showPartnerBanner', () => value);
103
+ }
104
+ get showPartnerBanner() {
105
+ return this.get('showPartnerBanner');
106
+ }
107
+ set showLegalInformation(value) {
108
+ this.set('showLegalInformation', () => value);
109
+ }
110
+ get showLegalInformation() {
111
+ return this.get('showLegalInformation');
112
+ }
113
+ set showInstallLinks(value) {
114
+ this.set('showInstallLinks', () => value);
115
+ }
116
+ get showInstallLinks() {
117
+ return this.get('showInstallLinks');
118
+ }
119
+ set darkMode(value) {
120
+ this.set('darkMode', () => value);
121
+ }
122
+ get darkMode() {
123
+ return this.get('darkMode');
124
+ }
125
+ get currentLocaleCode() {
126
+ return this.loading ? '' : (this.translate.currentLang || this.translate.defaultLang || this.environment.defaultLocale)?.substring(0, 2);
127
+ }
128
+ get partnerBannerSize() {
129
+ return this.showLegalInformation ? 9 : 12;
130
+ }
131
+ constructor(accountService, modalCtrl, translate, toastController, configService, platform, cd, network, settings, environment, locales, buttons) {
132
+ super();
133
+ this.accountService = accountService;
134
+ this.modalCtrl = modalCtrl;
135
+ this.translate = translate;
136
+ this.toastController = toastController;
137
+ this.configService = configService;
138
+ this.platform = platform;
139
+ this.cd = cd;
140
+ this.network = network;
141
+ this.settings = settings;
142
+ this.environment = environment;
143
+ this.locales = locales;
144
+ this.buttons = buttons;
145
+ this.set({
146
+ loading: true,
147
+ showPartnerBanner: false,
148
+ showSpinner: !this.platform.started,
149
+ darkMode: this.settings.isDarkMode,
150
+ });
151
+ this.mobile = this.platform.is('mobile');
152
+ this.platform.ready().then(() => this.start());
153
+ this.showAccountButton = environment.account?.showAccountButton ?? true;
154
+ this.connect('darkMode', this.settings.darkMode$);
155
+ // DEV
156
+ this._debug = !environment.production;
157
+ }
158
+ ngOnDestroy() {
159
+ this._subscription.unsubscribe();
160
+ }
161
+ async login() {
162
+ const modal = await this.modalCtrl.create({
163
+ component: AppAuthModal,
164
+ });
165
+ return modal.present();
166
+ }
167
+ async register() {
168
+ const modal = await this.modalCtrl.create({
169
+ component: RegisterModal,
170
+ backdropDismiss: false,
171
+ });
172
+ return modal.present();
173
+ }
174
+ async logout(event) {
175
+ await this.accountService.logout();
176
+ // If was offline, try to reconnect (because can be a forced offline mode)
177
+ if (this.offline) {
178
+ await this.tryOnline();
179
+ }
180
+ }
181
+ changeLanguage(locale) {
182
+ this.settings.apply({ locale }).then(() => {
183
+ this.markForCheck();
184
+ });
185
+ }
186
+ getPagePath(index, page) {
187
+ return page?.path;
188
+ }
189
+ tryOnline() {
190
+ this.waitingNetwork = true;
191
+ this.markForCheck();
192
+ this.network
193
+ .tryOnline({
194
+ showLoadingToast: false,
195
+ showOnlineToast: true,
196
+ showOfflineToast: false,
197
+ })
198
+ .then(() => {
199
+ this.waitingNetwork = false;
200
+ this.markForCheck();
201
+ });
202
+ }
203
+ /* -- protected method -- */
204
+ async start() {
205
+ await this.accountService.ready();
206
+ this.isLogin = this.accountService.isLogin();
207
+ if (this.isLogin) {
208
+ this.onLogin(this.accountService.account);
209
+ }
210
+ this.offline = this.network.offline;
211
+ // Listen login/logout events
212
+ this._subscription.add(this.accountService.onLogin.subscribe((account) => this.onLogin(account)));
213
+ this._subscription.add(this.accountService.onLogout.subscribe(() => this.onLogout()));
214
+ // Listen pod config
215
+ this._subscription.add(this.configService.config.subscribe((config) => this.onConfigLoaded(config)));
216
+ // Listen settings changes
217
+ this._subscription.add(this.settings.onChange
218
+ .pipe(
219
+ // Add a delay, to avoid to apply changes to often
220
+ debounceTime(250),
221
+ // Start with current settings
222
+ startWith(await this.settings.ready()))
223
+ .subscribe((res) => this.onSettingsChanged(res)));
224
+ // Listen network changes
225
+ this._subscription.add(this.network.onNetworkStatusChanges
226
+ .pipe(
227
+ //debounceTime(450),
228
+ //tap(() => this.waitingNetwork = false),
229
+ map((connectionType) => connectionType === 'none'), distinctUntilChanged())
230
+ .subscribe((offline) => {
231
+ this.offline = offline;
232
+ this.markForCheck();
233
+ }));
234
+ }
235
+ async showToast(opts) {
236
+ await Toasts.show(this.toastController, this.translate, opts);
237
+ }
238
+ onConfigLoaded(config) {
239
+ console.debug('[home] Applying configuration', config);
240
+ this._config = config;
241
+ this.appName = this._config.label || this.environment.defaultAppName || 'SUMARiS';
242
+ this.logo = this._config.largeLogo || this._config.smallLogo || undefined;
243
+ this.description = config.name;
244
+ this.isWeb = this.platform.isWeb();
245
+ this.canRegister = this._config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.REGISTRATION_ENABLE);
246
+ this.legalInformation = [
247
+ {
248
+ title: 'HOME.PRIVACY_POLICY',
249
+ path: this._config.getProperty(CORE_CONFIG_OPTIONS.PRIVACY_POLICY_URL) ?? this.environment.privacyPolicyUrl,
250
+ },
251
+ {
252
+ title: 'HOME.TERMS_OF_USE',
253
+ path: this._config.getProperty(CORE_CONFIG_OPTIONS.TERMS_OF_USE_URL) ?? this.environment.termsOfUseUrl,
254
+ },
255
+ ].filter((item) => isNotNilOrBlank(item.path));
256
+ this.showLegalInformation = isNotEmptyArray(this.legalInformation);
257
+ const partners = (this._config.partners || []).filter((p) => p && p.logo);
258
+ this.$partners.next(partners);
259
+ this.showPartnerBanner = partners.length > 0;
260
+ // TODO load install links
261
+ // If not already set, compute the background image
262
+ if (!this.contentStyle) {
263
+ const backgroundImages = (config.backgroundImages || [])
264
+ // Filter on not nil, because can occur if detected has not exists (see config-service.js)
265
+ .filter((img) => isNotNil(img) &&
266
+ // If offline, filter on local dataURL image
267
+ (!this.offline || !img.startsWith('http')));
268
+ // Background image found: select one randomly
269
+ if (backgroundImages.length) {
270
+ const { image, credits } = getRandomImageWithCredit(backgroundImages);
271
+ this.contentStyle = image ? { 'background-image': `url(${image})` } : {};
272
+ this.contentCredits = credits || '';
273
+ }
274
+ // Use background color
275
+ else {
276
+ const primaryColor = config.getProperty(CORE_CONFIG_OPTIONS.COLOR_PRIMARY) || 'var(--ion-color-primary)';
277
+ this.contentStyle = (primaryColor && { 'background-color': primaryColor }) || {};
278
+ }
279
+ }
280
+ this.refreshButtons();
281
+ this.markForCheck();
282
+ // If first load, hide the loading indicator
283
+ this.loading = false;
284
+ }
285
+ onSettingsChanged(settings) {
286
+ if (settings.pageHistory !== this.pageHistory) {
287
+ console.debug('[home] Page history loaded');
288
+ this.pageHistory = settings.pageHistory || [];
289
+ }
290
+ }
291
+ onLogin(account) {
292
+ if (!account)
293
+ return; // Skip
294
+ //console.debug('[home] Logged account: ', account);
295
+ this.isLogin = true;
296
+ this.accountName = accountToString(account);
297
+ this.refreshButtons(account);
298
+ this.markForCheck();
299
+ }
300
+ onLogout() {
301
+ this.isLogin = false;
302
+ this.accountName = '';
303
+ this.pageHistory = [];
304
+ this.refreshButtons();
305
+ this.markForCheck();
306
+ }
307
+ refreshButtons(account) {
308
+ if (!this._config)
309
+ return; // Skip (waiting config to be loaded)
310
+ if (this._debug)
311
+ console.debug('[home] Refreshing buttons...');
312
+ account = account || this.accountService.account;
313
+ const filteredButtons = (this.buttons || [])
314
+ .filter((item) => MenuItems.checkIfVisible(item, account, this._config, {
315
+ isLogin: this.isLogin,
316
+ debug: this._debug,
317
+ logPrefix: '[home]',
318
+ }))
319
+ .map((item) => {
320
+ // Replace title using properties
321
+ if (isNotNilOrBlank(item.titleProperty) && this._config) {
322
+ const title = this._config.properties[item.titleProperty];
323
+ if (title)
324
+ return { ...item, title }; // Create a copy, to keep the original item.title
325
+ }
326
+ return item;
327
+ });
328
+ this.$filteredButtons.next(filteredButtons);
329
+ }
330
+ async openMarkdownModal(event, item = null) {
331
+ if (isNilOrBlank(item?.path))
332
+ return;
333
+ // Resolve relative path
334
+ let url = item.path;
335
+ if (this.network.peer && (url.startsWith('./') || url.startsWith('/'))) {
336
+ url = Peer.path(this.network.peer, url);
337
+ }
338
+ const pathFilename = UriUtils.getFilename(url);
339
+ const isMarkdownFile = pathFilename.endsWith('.md');
340
+ // Open as markdown
341
+ if (isMarkdownFile) {
342
+ await AppMarkdownModal.show(this.modalCtrl, {
343
+ title: this.translate.instant(item.title, item.titleArgs),
344
+ src: url,
345
+ enableNavigationHistory: false,
346
+ canPrint: !this.mobile,
347
+ });
348
+ }
349
+ else {
350
+ // Open as external link
351
+ await this.platform.open(url);
352
+ }
353
+ }
354
+ async toggleDarkMode() {
355
+ const enable = !this.settings.isDarkMode;
356
+ await this.settings.apply({ darkMode: enable, autoDarkMode: false });
357
+ }
358
+ async removePageHistory(path) {
359
+ await this.settings.removePageHistory(path);
360
+ }
361
+ markForCheck() {
362
+ this.cd.markForCheck();
363
+ }
364
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HomePage, deps: [{ token: i1.AccountService }, { token: i2.ModalController }, { token: i3.TranslateService }, { token: i2.ToastController }, { token: i4.ConfigService }, { token: i5.PlatformService }, { token: i0.ChangeDetectorRef }, { token: i6.NetworkService }, { token: i7.LocalSettingsService }, { token: ENVIRONMENT }, { token: APP_LOCALES }, { token: APP_HOME_BUTTONS, optional: true }], target: i0.ɵɵFactoryTarget.Component });
365
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: HomePage, selector: "app-page-home", usesInheritance: true, ngImport: i0, template: "<app-toolbar [canGoBack]=\"false\" visible-xs visible-sm visible-mobile>\n <ion-buttons slot=\"end\">\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button (click)=\"toggleDarkMode()\">\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'sunny' : 'moon'\"></ion-icon>\n </ion-button>\n }\n\n <!-- Change locale button -->\n <ion-button [matMenuTriggerFor]=\"localeMenu\">\n <ion-icon slot=\"start\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n</app-toolbar>\n\n<!-- Change locale menu -->\n<mat-menu #localeMenu=\"matMenu\">\n <ng-template matMenuContent>\n @for (item of locales; track item.key) {\n <button mat-menu-item (click)=\"changeLanguage(item.key)\">\n <ion-label>{{ item.value }}</ion-label>\n </button>\n }\n </ng-template>\n</mat-menu>\n\n<ion-content [ngStyle]=\"contentStyle\" no-padding-xs>\n @if (contentCredits | isNotNilOrBlank) {\n <span class=\"content-credits\">\n <ion-text>{{ contentCredits }}</ion-text>\n </span>\n }\n\n <!-- loading spinner -->\n <div class=\"loading-page\" [class.cdk-visually-hidden]=\"!(loading$ | push)\">\n @if (showSpinner) {\n <div class=\"spinner\">\n <p [innerHTML]=\"'COMMON.LOADING_DOTS' | translate\"></p>\n <div class=\"sk-cube1 sk-cube\"></div>\n <div class=\"sk-cube2 sk-cube\"></div>\n <div class=\"sk-cube4 sk-cube\"></div>\n <div class=\"sk-cube3 sk-cube\"></div>\n </div>\n }\n </div>\n\n <!-- Desktop: translucent top toolbar -->\n @if (!mobile) {\n <div class=\"hidden-xs hidden-sm\">\n <ion-toolbar color=\"traansparent\" translucent>\n <ion-buttons slot=\"start\">\n <ion-menu-toggle>\n <ion-button color=\"light\" fill=\"clear\">\n <ion-icon slot=\"icon-only\" name=\"menu\"></ion-icon>\n </ion-button>\n </ion-menu-toggle>\n </ion-buttons>\n\n <ion-buttons slot=\"end\">\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n (click)=\"toggleDarkMode()\"\n [title]=\"'HOME.BTN_DARK_MODE' | translate\"\n >\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'moon' : 'sunny'\"></ion-icon>\n </ion-button>\n }\n <!-- change locale button -->\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n [matMenuTriggerFor]=\"localeMenu\"\n [title]=\"'SETTINGS.LOCALE' | translate\"\n >\n <ion-icon slot=\"icon-only\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </div>\n }\n\n <!-- Install (and upgrade) card -->\n <app-install-upgrade-card [isLogin]=\"isLogin\" [showInstallButton]=\"true\"></app-install-upgrade-card>\n\n @if (!(loading$ | push)) {\n <!-- Welcome card -->\n <ion-card class=\"main welcome ion-padding ion-text-center ion-align-self-center\" @fadeInAnimation>\n <ion-card-header>\n <ion-card-title class=\"ion-text-center\">\n <span *ngIf=\"isWeb\" [innerHTML]=\"'HOME.WELCOME_WEB' | translate: { appName: appName }\"></span>\n <span *ngIf=\"!isWeb\" [innerHTML]=\"'HOME.WELCOME_APP' | translate: { appName: appName }\"></span>\n </ion-card-title>\n <ion-card-subtitle [innerHTML]=\"description\"></ion-card-subtitle>\n </ion-card-header>\n <ion-card-content class=\"ion-no-padding\">\n <ion-text color=\"primary\">\n <img *ngIf=\"logo\" [attr.src]=\"logo\" alt=\"Logo\" />\n </ion-text>\n <!-- register help text -->\n <ion-text *ngIf=\"!isLogin && canRegister\">\n <br />\n <span translate>HOME.REGISTER_HELP</span>\n </ion-text>\n <div class=\"ion-padding-top\">\n <!-- If NOT login -->\n <ng-container *ngIf=\"!isLogin; else loginButtons\">\n <ion-button *ngIf=\"canRegister\" expand=\"block\" color=\"tertiary\" (click)=\"register()\">\n <span translate>HOME.BTN_REGISTER</span>\n </ion-button>\n <ion-button expand=\"block\" color=\"light\" [routerLink]=\"['/']\" (click)=\"login()\">\n <span translate>AUTH.BTN_LOGIN</span>\n </ion-button>\n </ng-container>\n\n <!-- If user login -->\n <ng-template #loginButtons>\n <!-- Feature buttons -->\n <ng-container *rxIf=\"$filteredButtons; let buttons\">\n <ng-container *ngFor=\"let item of buttons\">\n <ion-button\n *ngIf=\"item.path\"\n expand=\"block\"\n color=\"tertiary\"\n [class]=\"item.cssClass\"\n [routerLink]=\"item.path\"\n routerDirection=\"root\"\n >\n <ion-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n <mat-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.matIcon\">{{ item.matIcon }}</mat-icon>\n <ion-text>{{ 'HOME.BTN_DATA_ENTRY' | translate: { name: (item.title | translate) } }}</ion-text>\n </ion-button>\n\n <!-- divider -->\n <div *ngIf=\"!item.path && !item.action\" [class]=\"item.cssClass\">\n <ion-label translate>{{ item.title }}&nbsp;</ion-label>\n </div>\n </ng-container>\n\n <!--<p *ngIf=\"buttons.length\" class=\"visible-mobile\">&nbsp;</p>-->\n </ng-container>\n\n <ion-button *ngIf=\"showAccountButton\" expand=\"block\" color=\"secondary\" [routerLink]=\"['/account']\">\n <ion-icon slot=\"start\" class=\"ion-float-start\" name=\"person-circle\"></ion-icon>\n <ion-text translate>HOME.BTN_MY_ACCOUNT</ion-text>\n </ion-button>\n\n <p hidden-xs hidden-sm hidden-mobile>\n <ion-text\n [innerHTML]=\"'HOME.NOT_THIS_ACCOUNT_QUESTION' | translate: { displayName: accountName }\"\n ></ion-text>\n <br />\n <ion-text>\n <a href=\"#\" (click)=\"logout($event)\">\n <span translate>HOME.BTN_DISCONNECT</span>\n </a>\n </ion-text>\n </p>\n </ng-template>\n </div>\n </ion-card-content>\n </ion-card>\n\n <!-- Page history -->\n @let pageHistory = isLogin && (pageHistory$ | push);\n @if (pageHistory | isNotEmptyArray) {\n <ion-grid class=\"history-container ion-align-self-center\">\n <ion-row>\n @for (page of pageHistory; track page.path) {\n <ion-col size=\"12\" size-xl=\"\" class=\"ion-text-center\">\n <ion-card class=\"ion-align-self-start ion-text-start\" @fadeInAnimation>\n <ion-card-header class=\"ion-no-padding\">\n <!-- top bar -->\n <ion-card-subtitle>\n <button\n type=\"button\"\n tabindex=\"-1\"\n (click)=\"removePageHistory(page.path)\"\n mat-icon-button\n class=\"ion-float-start ion-no-margin close-button\"\n >\n <mat-icon>close</mat-icon>\n </button>\n <ion-label [innerHTML]=\"page.subtitle | translate\"></ion-label>\n <ion-text class=\"ion-float-end\" [title]=\"page.time | dateFormat: { time: true }\">\n <small>\n <ion-icon name=\"time-outline\"></ion-icon>\n &nbsp;{{ page.time | dateFromNow }}\n </small>\n &nbsp;\n </ion-text>\n </ion-card-subtitle>\n\n <!-- main page -->\n <ion-card-title class=\"ion-no-margin ion-no-padding\">\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"page.path\"\n routerDirection=\"root\"\n lines=\"none\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"page.icon\" slot=\"start\" [name]=\"page.icon\"></ion-icon>\n <mat-icon *ngIf=\"page.matIcon\" slot=\"start\">{{ page.matIcon }}</mat-icon>\n\n <ion-label color=\"primary\" [innerHTML]=\"page.title\"></ion-label>\n </ion-item>\n </ion-card-title>\n </ion-card-header>\n\n <!-- children pages -->\n @if (page.children | isNotEmptyArray) {\n <ion-card-content class=\"ion-no-padding ion-padding-start\">\n <ion-list class=\"ion-no-padding\">\n @for (childPage of page.children; track childPage.path) {\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"childPage.path\"\n routerDirection=\"root\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"childPage.icon\" slot=\"start\" color=\"dark\" [name]=\"childPage.icon\"></ion-icon>\n <mat-icon *ngIf=\"childPage.matIcon\" slot=\"start\" color=\"dark\">\n {{ childPage.matIcon }}\n </mat-icon>\n\n <ion-label color=\"dark\" [innerHTML]=\"childPage.title\"></ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-card-content>\n }\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n } @else if (showPartnerBanner || showLegalInformation) {\n <ng-container *ngTemplateOutlet=\"bottomBanner\"></ng-container>\n }\n }\n</ion-content>\n\n<ng-template #bottomBanner>\n <ion-grid class=\"bottom-banner ion-text-center\" [class.floating]=\"!mobile\" @fadeInAnimation>\n <ion-row>\n @if (showPartnerBanner) {\n <ion-col size=\"12\" [sizeLg]=\"partnerBannerSize\" class=\"ion-text-center\">\n @if (showLegalInformation) {\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.PARTNERS' | translate }}</ion-list-header>\n </ion-list>\n }\n <!-- partners -->\n @for (item of $partners | async; track $index) {\n <a href=\"{{ item.siteUrl }}\">\n <img class=\"logo\" src=\"{{ item.logo }}\" alt=\"{{ item.label }}\" [title]=\"item.label\" />\n </a>\n }\n </ion-col>\n }\n @if (showLegalInformation) {\n <ion-col size=\"12\" size-sm=\"6\" size-lg=\"3\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header class=\"ion-text-left\">{{ 'HOME.LEGAL_INFORMATION' | translate }}</ion-list-header>\n @for (item of legalInformation; track item.path) {\n <ion-item (click)=\"openMarkdownModal($event, item)\" lines=\"none\" [button]=\"true\">\n <ion-label>\n <p>\n {{ item.title | translate: item.titleArgs }}\n </p>\n </ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-col>\n @if (showInstallLinks) {\n <ion-col size=\"12\" size-lg=\"3\" offset-lg=\"9\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.INSTALL_APP' | translate }}</ion-list-header>\n <!-- TODO -->\n </ion-list>\n </ion-col>\n }\n }\n </ion-row>\n </ion-grid>\n</ng-template>\n", styles: [":host{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .7)}h1,h2,h3,h4,h5{white-space:normal}.center,ion-content ion-card.welcome img{text-align:center;display:inline-block}ion-content{--background: transparent;background-size:cover;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-color:var(--ion-background-color);display:inline-block;padding:15px}ion-content .loading-page{display:block;height:100%;width:100%;position:absolute;background-color:transparent;z-index:5;transition:background .5s linear;-webkit-transition:background 1.5s linear}ion-content .loading-page.hidden{background-color:rgba(var(--ion-color-primary),0)}ion-content ion-card{z-index:9}ion-content ion-card ion-card-header{display:block}ion-content ion-card ion-card-header ion-card-subtitle,ion-content ion-card ion-card-header ion-card-title{display:block;width:100%}ion-content ion-card.main{min-width:240px;max-width:400px;margin-left:auto;margin-right:auto}ion-content ion-card.welcome{background-color:var(--ion-card-background-color)}ion-content ion-card.welcome button{margin-top:16px}ion-content ion-card.welcome img{max-width:250px}ion-content .history-container{margin-left:auto;margin-right:auto}ion-content .history-container ion-card{display:inline-block;box-sizing:border-box;z-index:8;min-width:240px;max-width:400px;width:100%;margin-left:auto;margin-right:auto;background-color:var(--ion-card-background-color)}ion-content .history-container ion-card ion-card-header ion-card-subtitle{height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle button[float-start]{--mdc-icon-button-state-layer-size: 40px;padding:8px;z-index:99;margin:0}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label{line-height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label[float-end]{padding-right:16px;font-weight:400}ion-content .history-container ion-card ion-card-header ion-card-title ion-item{width:100%;--ion-item-background: $transparent;--ion-item-icon-color: var(--ion-color-primary);--ion-item-text-color: var(--ion-color-primary)}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-header ion-card-title ion-item mat-icon[slot=start]{margin-right:unset;margin-inline-end:16px!important;color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-text,ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-label{color:var(--ion-item-text-color)!important;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}ion-content .history-container ion-card ion-card-content ion-list{--ion-item-background: var(--ion-color-transparent)}ion-content .history-container ion-card ion-card-content ion-list ion-item{--ion-item-icon-color: var(--ion-color-dark);--ion-item-text-color: var(--ion-color-dark)}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-content ion-list ion-item mat-icon[slot=start]{color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor;margin-right:unset;margin-inline-end:16px!important}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-text,ion-content .history-container ion-card ion-card-content ion-list ion-item ion-label{color:var(--ion-item-text-color)!important}ion-content .bottom-banner{background-color:var(--ion-card-background-color);min-width:240px;z-index:0}ion-content .bottom-banner.floating{position:absolute;left:16px;right:16px;bottom:16px}ion-content .bottom-banner img.logo{max-height:50px;margin-left:8px}ion-content ion-text{text-align:center}@media screen and (max-width: 575px){ion-content ion-card{min-width:160px;width:calc(100% - 20px);max-width:100%;margin-left:10px;margin-right:10px}ion-content ion-card h1{margin-top:0;font-size:20px}ion-content ion-card ion-card-content ion-button{margin-top:8px}ion-content .bottom-banner.floating{display:block;position:unset}ion-content .bottom-banner img.logo{max-height:30px}}@media screen and (max-width: 767px) and (min-width: 576px){ion-content{min-height:555px}ion-content .bottom-banner img.logo{max-height:40px}}@media screen and (min-width: 768px){ion-content{min-height:calc(100% - 100px)}}.content-credits{position:absolute;right:0;bottom:0}.content-credits ion-text{padding-inline-start:4px;padding-inline-end:4px;font-size:.8rem;background-color:var(--ion-background-color, white);color:var(--ion-text-color);opacity:.65}@media screen and (min-width: 992px){.left-border{border-left:1px solid var(--ion-color-medium)}}.bottom-banner ion-list-header{min-height:30px}.bottom-banner ion-item{--min-height: 28px}.bottom-banner ion-item ion-label{margin-top:3px!important;margin-bottom:3px!important}\n"], dependencies: [{ kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i2.IonCardSubtitle, selector: "ion-card-subtitle", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonListHeader, selector: "ion-list-header", inputs: ["color", "lines", "mode"] }, { kind: "component", type: i2.IonMenuToggle, selector: "ion-menu-toggle", inputs: ["autoHide", "menu"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i2.RouterLinkDelegate, selector: ":not(a):not(area)[routerLink]" }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i9.RxIf, selector: "[rxIf]", inputs: ["rxIf", "rxIfStrategy", "rxIfElse", "rxIfThen", "rxIfSuspense", "rxIfComplete", "rxIfError", "rxIfContextTrigger", "rxIfNextTrigger", "rxIfSuspenseTrigger", "rxIfErrorTrigger", "rxIfCompleteTrigger", "rxIfParent", "rxIfPatchZone", "rxIfRenderCallback"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i12.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i12.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i12.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i13.ToolbarComponent, selector: "app-toolbar", inputs: ["progressBarMode", "title", "color", "class", "id", "backHref", "defaultBackHref", "hasValidate", "hasClose", "hasSearch", "canGoBack", "canShowMenu"], outputs: ["onValidate", "onClose", "onValidateAndClose", "onBackClick", "onSearch"] }, { kind: "directive", type: i14.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i15.AppInstallUpgradeCard, selector: "app-install-upgrade-card", inputs: ["isLogin", "showUpgradeWarning", "showOfflineWarning", "showInstallButton", "debug"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: i16.RxPush, name: "push" }, { kind: "pipe", type: i17.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i18.DateFromNowPipe, name: "dateFromNow" }, { kind: "pipe", type: i19.NotEmptyArrayPipe, name: "isNotEmptyArray" }, { kind: "pipe", type: i20.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }], animations: [fadeInAnimation, slideUpDownAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
366
+ }
367
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HomePage, decorators: [{
368
+ type: Component,
369
+ args: [{ selector: 'app-page-home', changeDetection: ChangeDetectionStrategy.OnPush, animations: [fadeInAnimation, slideUpDownAnimation], template: "<app-toolbar [canGoBack]=\"false\" visible-xs visible-sm visible-mobile>\n <ion-buttons slot=\"end\">\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button (click)=\"toggleDarkMode()\">\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'sunny' : 'moon'\"></ion-icon>\n </ion-button>\n }\n\n <!-- Change locale button -->\n <ion-button [matMenuTriggerFor]=\"localeMenu\">\n <ion-icon slot=\"start\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n</app-toolbar>\n\n<!-- Change locale menu -->\n<mat-menu #localeMenu=\"matMenu\">\n <ng-template matMenuContent>\n @for (item of locales; track item.key) {\n <button mat-menu-item (click)=\"changeLanguage(item.key)\">\n <ion-label>{{ item.value }}</ion-label>\n </button>\n }\n </ng-template>\n</mat-menu>\n\n<ion-content [ngStyle]=\"contentStyle\" no-padding-xs>\n @if (contentCredits | isNotNilOrBlank) {\n <span class=\"content-credits\">\n <ion-text>{{ contentCredits }}</ion-text>\n </span>\n }\n\n <!-- loading spinner -->\n <div class=\"loading-page\" [class.cdk-visually-hidden]=\"!(loading$ | push)\">\n @if (showSpinner) {\n <div class=\"spinner\">\n <p [innerHTML]=\"'COMMON.LOADING_DOTS' | translate\"></p>\n <div class=\"sk-cube1 sk-cube\"></div>\n <div class=\"sk-cube2 sk-cube\"></div>\n <div class=\"sk-cube4 sk-cube\"></div>\n <div class=\"sk-cube3 sk-cube\"></div>\n </div>\n }\n </div>\n\n <!-- Desktop: translucent top toolbar -->\n @if (!mobile) {\n <div class=\"hidden-xs hidden-sm\">\n <ion-toolbar color=\"traansparent\" translucent>\n <ion-buttons slot=\"start\">\n <ion-menu-toggle>\n <ion-button color=\"light\" fill=\"clear\">\n <ion-icon slot=\"icon-only\" name=\"menu\"></ion-icon>\n </ion-button>\n </ion-menu-toggle>\n </ion-buttons>\n\n <ion-buttons slot=\"end\">\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n (click)=\"toggleDarkMode()\"\n [title]=\"'HOME.BTN_DARK_MODE' | translate\"\n >\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'moon' : 'sunny'\"></ion-icon>\n </ion-button>\n }\n <!-- change locale button -->\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n [matMenuTriggerFor]=\"localeMenu\"\n [title]=\"'SETTINGS.LOCALE' | translate\"\n >\n <ion-icon slot=\"icon-only\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </div>\n }\n\n <!-- Install (and upgrade) card -->\n <app-install-upgrade-card [isLogin]=\"isLogin\" [showInstallButton]=\"true\"></app-install-upgrade-card>\n\n @if (!(loading$ | push)) {\n <!-- Welcome card -->\n <ion-card class=\"main welcome ion-padding ion-text-center ion-align-self-center\" @fadeInAnimation>\n <ion-card-header>\n <ion-card-title class=\"ion-text-center\">\n <span *ngIf=\"isWeb\" [innerHTML]=\"'HOME.WELCOME_WEB' | translate: { appName: appName }\"></span>\n <span *ngIf=\"!isWeb\" [innerHTML]=\"'HOME.WELCOME_APP' | translate: { appName: appName }\"></span>\n </ion-card-title>\n <ion-card-subtitle [innerHTML]=\"description\"></ion-card-subtitle>\n </ion-card-header>\n <ion-card-content class=\"ion-no-padding\">\n <ion-text color=\"primary\">\n <img *ngIf=\"logo\" [attr.src]=\"logo\" alt=\"Logo\" />\n </ion-text>\n <!-- register help text -->\n <ion-text *ngIf=\"!isLogin && canRegister\">\n <br />\n <span translate>HOME.REGISTER_HELP</span>\n </ion-text>\n <div class=\"ion-padding-top\">\n <!-- If NOT login -->\n <ng-container *ngIf=\"!isLogin; else loginButtons\">\n <ion-button *ngIf=\"canRegister\" expand=\"block\" color=\"tertiary\" (click)=\"register()\">\n <span translate>HOME.BTN_REGISTER</span>\n </ion-button>\n <ion-button expand=\"block\" color=\"light\" [routerLink]=\"['/']\" (click)=\"login()\">\n <span translate>AUTH.BTN_LOGIN</span>\n </ion-button>\n </ng-container>\n\n <!-- If user login -->\n <ng-template #loginButtons>\n <!-- Feature buttons -->\n <ng-container *rxIf=\"$filteredButtons; let buttons\">\n <ng-container *ngFor=\"let item of buttons\">\n <ion-button\n *ngIf=\"item.path\"\n expand=\"block\"\n color=\"tertiary\"\n [class]=\"item.cssClass\"\n [routerLink]=\"item.path\"\n routerDirection=\"root\"\n >\n <ion-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n <mat-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.matIcon\">{{ item.matIcon }}</mat-icon>\n <ion-text>{{ 'HOME.BTN_DATA_ENTRY' | translate: { name: (item.title | translate) } }}</ion-text>\n </ion-button>\n\n <!-- divider -->\n <div *ngIf=\"!item.path && !item.action\" [class]=\"item.cssClass\">\n <ion-label translate>{{ item.title }}&nbsp;</ion-label>\n </div>\n </ng-container>\n\n <!--<p *ngIf=\"buttons.length\" class=\"visible-mobile\">&nbsp;</p>-->\n </ng-container>\n\n <ion-button *ngIf=\"showAccountButton\" expand=\"block\" color=\"secondary\" [routerLink]=\"['/account']\">\n <ion-icon slot=\"start\" class=\"ion-float-start\" name=\"person-circle\"></ion-icon>\n <ion-text translate>HOME.BTN_MY_ACCOUNT</ion-text>\n </ion-button>\n\n <p hidden-xs hidden-sm hidden-mobile>\n <ion-text\n [innerHTML]=\"'HOME.NOT_THIS_ACCOUNT_QUESTION' | translate: { displayName: accountName }\"\n ></ion-text>\n <br />\n <ion-text>\n <a href=\"#\" (click)=\"logout($event)\">\n <span translate>HOME.BTN_DISCONNECT</span>\n </a>\n </ion-text>\n </p>\n </ng-template>\n </div>\n </ion-card-content>\n </ion-card>\n\n <!-- Page history -->\n @let pageHistory = isLogin && (pageHistory$ | push);\n @if (pageHistory | isNotEmptyArray) {\n <ion-grid class=\"history-container ion-align-self-center\">\n <ion-row>\n @for (page of pageHistory; track page.path) {\n <ion-col size=\"12\" size-xl=\"\" class=\"ion-text-center\">\n <ion-card class=\"ion-align-self-start ion-text-start\" @fadeInAnimation>\n <ion-card-header class=\"ion-no-padding\">\n <!-- top bar -->\n <ion-card-subtitle>\n <button\n type=\"button\"\n tabindex=\"-1\"\n (click)=\"removePageHistory(page.path)\"\n mat-icon-button\n class=\"ion-float-start ion-no-margin close-button\"\n >\n <mat-icon>close</mat-icon>\n </button>\n <ion-label [innerHTML]=\"page.subtitle | translate\"></ion-label>\n <ion-text class=\"ion-float-end\" [title]=\"page.time | dateFormat: { time: true }\">\n <small>\n <ion-icon name=\"time-outline\"></ion-icon>\n &nbsp;{{ page.time | dateFromNow }}\n </small>\n &nbsp;\n </ion-text>\n </ion-card-subtitle>\n\n <!-- main page -->\n <ion-card-title class=\"ion-no-margin ion-no-padding\">\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"page.path\"\n routerDirection=\"root\"\n lines=\"none\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"page.icon\" slot=\"start\" [name]=\"page.icon\"></ion-icon>\n <mat-icon *ngIf=\"page.matIcon\" slot=\"start\">{{ page.matIcon }}</mat-icon>\n\n <ion-label color=\"primary\" [innerHTML]=\"page.title\"></ion-label>\n </ion-item>\n </ion-card-title>\n </ion-card-header>\n\n <!-- children pages -->\n @if (page.children | isNotEmptyArray) {\n <ion-card-content class=\"ion-no-padding ion-padding-start\">\n <ion-list class=\"ion-no-padding\">\n @for (childPage of page.children; track childPage.path) {\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"childPage.path\"\n routerDirection=\"root\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"childPage.icon\" slot=\"start\" color=\"dark\" [name]=\"childPage.icon\"></ion-icon>\n <mat-icon *ngIf=\"childPage.matIcon\" slot=\"start\" color=\"dark\">\n {{ childPage.matIcon }}\n </mat-icon>\n\n <ion-label color=\"dark\" [innerHTML]=\"childPage.title\"></ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-card-content>\n }\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n } @else if (showPartnerBanner || showLegalInformation) {\n <ng-container *ngTemplateOutlet=\"bottomBanner\"></ng-container>\n }\n }\n</ion-content>\n\n<ng-template #bottomBanner>\n <ion-grid class=\"bottom-banner ion-text-center\" [class.floating]=\"!mobile\" @fadeInAnimation>\n <ion-row>\n @if (showPartnerBanner) {\n <ion-col size=\"12\" [sizeLg]=\"partnerBannerSize\" class=\"ion-text-center\">\n @if (showLegalInformation) {\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.PARTNERS' | translate }}</ion-list-header>\n </ion-list>\n }\n <!-- partners -->\n @for (item of $partners | async; track $index) {\n <a href=\"{{ item.siteUrl }}\">\n <img class=\"logo\" src=\"{{ item.logo }}\" alt=\"{{ item.label }}\" [title]=\"item.label\" />\n </a>\n }\n </ion-col>\n }\n @if (showLegalInformation) {\n <ion-col size=\"12\" size-sm=\"6\" size-lg=\"3\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header class=\"ion-text-left\">{{ 'HOME.LEGAL_INFORMATION' | translate }}</ion-list-header>\n @for (item of legalInformation; track item.path) {\n <ion-item (click)=\"openMarkdownModal($event, item)\" lines=\"none\" [button]=\"true\">\n <ion-label>\n <p>\n {{ item.title | translate: item.titleArgs }}\n </p>\n </ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-col>\n @if (showInstallLinks) {\n <ion-col size=\"12\" size-lg=\"3\" offset-lg=\"9\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.INSTALL_APP' | translate }}</ion-list-header>\n <!-- TODO -->\n </ion-list>\n </ion-col>\n }\n }\n </ion-row>\n </ion-grid>\n</ng-template>\n", styles: [":host{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .7)}h1,h2,h3,h4,h5{white-space:normal}.center,ion-content ion-card.welcome img{text-align:center;display:inline-block}ion-content{--background: transparent;background-size:cover;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-color:var(--ion-background-color);display:inline-block;padding:15px}ion-content .loading-page{display:block;height:100%;width:100%;position:absolute;background-color:transparent;z-index:5;transition:background .5s linear;-webkit-transition:background 1.5s linear}ion-content .loading-page.hidden{background-color:rgba(var(--ion-color-primary),0)}ion-content ion-card{z-index:9}ion-content ion-card ion-card-header{display:block}ion-content ion-card ion-card-header ion-card-subtitle,ion-content ion-card ion-card-header ion-card-title{display:block;width:100%}ion-content ion-card.main{min-width:240px;max-width:400px;margin-left:auto;margin-right:auto}ion-content ion-card.welcome{background-color:var(--ion-card-background-color)}ion-content ion-card.welcome button{margin-top:16px}ion-content ion-card.welcome img{max-width:250px}ion-content .history-container{margin-left:auto;margin-right:auto}ion-content .history-container ion-card{display:inline-block;box-sizing:border-box;z-index:8;min-width:240px;max-width:400px;width:100%;margin-left:auto;margin-right:auto;background-color:var(--ion-card-background-color)}ion-content .history-container ion-card ion-card-header ion-card-subtitle{height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle button[float-start]{--mdc-icon-button-state-layer-size: 40px;padding:8px;z-index:99;margin:0}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label{line-height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label[float-end]{padding-right:16px;font-weight:400}ion-content .history-container ion-card ion-card-header ion-card-title ion-item{width:100%;--ion-item-background: $transparent;--ion-item-icon-color: var(--ion-color-primary);--ion-item-text-color: var(--ion-color-primary)}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-header ion-card-title ion-item mat-icon[slot=start]{margin-right:unset;margin-inline-end:16px!important;color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-text,ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-label{color:var(--ion-item-text-color)!important;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}ion-content .history-container ion-card ion-card-content ion-list{--ion-item-background: var(--ion-color-transparent)}ion-content .history-container ion-card ion-card-content ion-list ion-item{--ion-item-icon-color: var(--ion-color-dark);--ion-item-text-color: var(--ion-color-dark)}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-content ion-list ion-item mat-icon[slot=start]{color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor;margin-right:unset;margin-inline-end:16px!important}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-text,ion-content .history-container ion-card ion-card-content ion-list ion-item ion-label{color:var(--ion-item-text-color)!important}ion-content .bottom-banner{background-color:var(--ion-card-background-color);min-width:240px;z-index:0}ion-content .bottom-banner.floating{position:absolute;left:16px;right:16px;bottom:16px}ion-content .bottom-banner img.logo{max-height:50px;margin-left:8px}ion-content ion-text{text-align:center}@media screen and (max-width: 575px){ion-content ion-card{min-width:160px;width:calc(100% - 20px);max-width:100%;margin-left:10px;margin-right:10px}ion-content ion-card h1{margin-top:0;font-size:20px}ion-content ion-card ion-card-content ion-button{margin-top:8px}ion-content .bottom-banner.floating{display:block;position:unset}ion-content .bottom-banner img.logo{max-height:30px}}@media screen and (max-width: 767px) and (min-width: 576px){ion-content{min-height:555px}ion-content .bottom-banner img.logo{max-height:40px}}@media screen and (min-width: 768px){ion-content{min-height:calc(100% - 100px)}}.content-credits{position:absolute;right:0;bottom:0}.content-credits ion-text{padding-inline-start:4px;padding-inline-end:4px;font-size:.8rem;background-color:var(--ion-background-color, white);color:var(--ion-text-color);opacity:.65}@media screen and (min-width: 992px){.left-border{border-left:1px solid var(--ion-color-medium)}}.bottom-banner ion-list-header{min-height:30px}.bottom-banner ion-item{--min-height: 28px}.bottom-banner ion-item ion-label{margin-top:3px!important;margin-bottom:3px!important}\n"] }]
370
+ }], ctorParameters: () => [{ type: i1.AccountService }, { type: i2.ModalController }, { type: i3.TranslateService }, { type: i2.ToastController }, { type: i4.ConfigService }, { type: i5.PlatformService }, { type: i0.ChangeDetectorRef }, { type: i6.NetworkService }, { type: i7.LocalSettingsService }, { type: i21.Environment, decorators: [{
371
+ type: Inject,
372
+ args: [ENVIRONMENT]
373
+ }] }, { type: undefined, decorators: [{
374
+ type: Inject,
375
+ args: [APP_LOCALES]
376
+ }] }, { type: undefined, decorators: [{
377
+ type: Optional
378
+ }, {
379
+ type: Inject,
380
+ args: [APP_HOME_BUTTONS]
381
+ }] }] });
382
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9ob21lL2hvbWUudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvaG9tZS9ob21lLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBYSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkksT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXJELE9BQU8sRUFBVyxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUczRSxPQUFPLEVBQUUsV0FBVyxFQUErQixNQUFNLGtDQUFrQyxDQUFDO0FBSzVGLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRCxPQUFPLEVBQWEsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUQsT0FBTyxFQUFvQixNQUFNLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbEcsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xHLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUVuRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENB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QyxVQUFVLENBQUM7UUFDekMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVTLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFZO1FBQzVDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRVMsWUFBWTtRQUNwQixJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pCLENBQUM7d0dBOVdVLFFBQVEsNlNBK0ZULFdBQVcsYUFDWCxXQUFXLGFBQ0MsZ0JBQWdCOzRGQWpHM0IsUUFBUSw0RUN0RHJCLGdvWUF1U0Esc3lWRG5QYyxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQzs7NEZBRXhDLFFBQVE7a0JBUHBCLFNBQVM7K0JBQ0UsZUFBZSxtQkFHUix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLENBQUMsZUFBZSxFQUFFLG9CQUFvQixDQUFDOzswQkFpR2hELE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdCwgSW5qZWN0aW9uVG9rZW4sIE9uRGVzdHJveSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZGFsQ29udHJvbGxlciwgVG9hc3RDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgUmVnaXN0ZXJNb2RhbCB9IGZyb20gJy4uL3JlZ2lzdGVyL3JlZ2lzdGVyLm1vZGFsJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBY2NvdW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQgeyBBY2NvdW50LCBhY2NvdW50VG9TdHJpbmcgfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9hY2NvdW50Lm1vZGVsJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9jb25maWcubW9kZWwnO1xuaW1wb3J0IHsgRGVwYXJ0bWVudCB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2RlcGFydG1lbnQubW9kZWwnO1xuaW1wb3J0IHsgQVBQX0xPQ0FMRVMsIExvY2FsZUNvbmZpZywgTG9jYWxTZXR0aW5ncyB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL3NldHRpbmdzLm1vZGVsJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEFwcEF1dGhNb2RhbCB9IGZyb20gJy4uL2F1dGgvYXV0aC5tb2RhbCc7XG5pbXBvcnQgeyBOZXR3b3JrU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBJTWVudUl0ZW0sIE1lbnVJdGVtcyB9IGZyb20gJy4uL21lbnUvbWVudS5tb2RlbCc7XG5pbXBvcnQgeyBTaG93VG9hc3RPcHRpb25zLCBUb2FzdHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvdG9hc3QvdG9hc3RzJztcbmltcG9ydCB7IGZhZGVJbkFuaW1hdGlvbiwgc2xpZGVVcERvd25BbmltYXRpb24gfSBmcm9tICcuLi8uLi9zaGFyZWQvbWF0ZXJpYWwvbWF0ZXJpYWwuYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBpc05pbE9yQmxhbmssIGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWwsIGlzTm90TmlsT3JCbGFuayB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQsIEVOVklST05NRU5UIH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7IEhpc3RvcnlQYWdlUmVmZXJlbmNlIH0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvaGlzdG9yeS5tb2RlbCc7XG5pbXBvcnQgeyBDT1JFX0NPTkZJR19PUFRJT05TIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnL2NvcmUuY29uZmlnJztcbmltcG9ydCB7IFJ4U3RhdGUgfSBmcm9tICdAcngtYW5ndWxhci9zdGF0ZSc7XG5pbXBvcnQgeyBJbWFnZXNVdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlZC9maWxlL2ltYWdlcy51dGlscyc7XG5pbXBvcnQgeyBVcmlVdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlZC9maWxlL3VyaS51dGlscyc7XG5pbXBvcnQgeyBQZWVyIH0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvcGVlci5tb2RlbCc7XG5pbXBvcnQgeyBBcHBNYXJrZG93bk1vZGFsIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21hcmtkb3duL21hcmtkb3duLm1vZGFsJztcblxuLyoqXG4gKiBAcGFyYW0gZmlsZXNcbiAqIEBkZXByZWNhdGVkIHVzZSBgZ2V0UmFuZG9tSW1hZ2VXaXRoQ3JlZGl0KClgIGluc3RlYWRcbiAqKi9cbmV4cG9ydCBjb25zdCBnZXRSYW5kb21JbWFnZSA9IEltYWdlc1V0aWxzLmdldFJhbmRvbUltYWdlO1xuZXhwb3J0IGNvbnN0IGdldFJhbmRvbUltYWdlV2l0aENyZWRpdCA9IEltYWdlc1V0aWxzLmdldFJhbmRvbUltYWdlV2l0aENyZWRpdDtcblxuZXhwb3J0IGNvbnN0IEFQUF9IT01FX0JVVFRPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48SU1lbnVJdGVtW10+KCdob21lQnV0dG9uJyk7XG5leHBvcnQgaW50ZXJmYWNlIEhvbWVQYWdlU3RhdGUge1xuICBsb2FkaW5nOiBib29sZWFuO1xuICBzaG93U3Bpbm5lcjogYm9vbGVhbjtcbiAgc2hvd1BhcnRuZXJCYW5uZXI6IGJvb2xlYW47XG4gIHNob3dMZWdhbEluZm9ybWF0aW9uOiBib29sZWFuO1xuICBzaG93SW5zdGFsbExpbmtzOiBib29sZWFuO1xuICBwYWdlSGlzdG9yeTogSGlzdG9yeVBhZ2VSZWZlcmVuY2VbXTtcbiAgZGFya01vZGU6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wYWdlLWhvbWUnLFxuICB0ZW1wbGF0ZVVybDogJ2hvbWUuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2hvbWUuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgYW5pbWF0aW9uczogW2ZhZGVJbkFuaW1hdGlvbiwgc2xpZGVVcERvd25BbmltYXRpb25dLFxufSlcbmV4cG9ydCBjbGFzcyBIb21lUGFnZSBleHRlbmRzIFJ4U3RhdGU8SG9tZVBhZ2VTdGF0ZT4gaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWJ1ZzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIF9jb25maWc6IENvbmZpZ3VyYXRpb247XG5cbiAgcHJvdGVjdGVkIGRhcmtNb2RlJCA9IHRoaXMuc2VsZWN0KCdkYXJrTW9kZScpO1xuICBwcm90ZWN0ZWQgcGFnZUhpc3RvcnkkID0gdGhpcy5zZWxlY3QoJ3BhZ2VIaXN0b3J5Jyk7XG4gIHByb3RlY3RlZCBsb2FkaW5nJCA9IHRoaXMuc2VsZWN0KCdsb2FkaW5nJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBtb2JpbGU6IGJvb2xlYW47XG5cbiAgd2FpdGluZ05ldHdvcmsgPSBmYWxzZTtcbiAgYWNjb3VudE5hbWUgPSAnJztcbiAgaXNMb2dpbjogYm9vbGVhbjtcbiAgJHBhcnRuZXJzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEZXBhcnRtZW50W10+KG51bGwpO1xuICBsb2dvOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGFwcE5hbWU6IHN0cmluZztcbiAgaXNXZWI6IGJvb2xlYW47XG4gIGNhblJlZ2lzdGVyOiBib29sZWFuO1xuICBjb250ZW50U3R5bGU6IGFueTtcbiAgY29udGVudENyZWRpdHM6IHN0cmluZztcbiAgbGVnYWxJbmZvcm1hdGlvbjogSU1lbnVJdGVtW107XG4gIG9mZmxpbmU6IGJvb2xlYW47XG4gICRmaWx0ZXJlZEJ1dHRvbnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElNZW51SXRlbVtdPih1bmRlZmluZWQpO1xuICByZWFkb25seSBzaG93QWNjb3VudEJ1dHRvbjogYm9vbGVhbjtcblxuICBzZXQgcGFnZUhpc3RvcnkodmFsdWU6IEhpc3RvcnlQYWdlUmVmZXJlbmNlW10pIHtcbiAgICB0aGlzLnNldCgncGFnZUhpc3RvcnknLCAoKSA9PiB2YWx1ZSk7XG4gIH1cblxuICBnZXQgcGFnZUhpc3RvcnkoKTogSGlzdG9yeVBhZ2VSZWZlcmVuY2VbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdwYWdlSGlzdG9yeScpO1xuICB9XG5cbiAgc2V0IGxvYWRpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldCgnbG9hZGluZycsICgpID0+IHZhbHVlKTtcbiAgfVxuXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldCgnbG9hZGluZycpO1xuICB9XG5cbiAgc2V0IHNob3dTcGlubmVyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXQoJ3Nob3dTcGlubmVyJywgKCkgPT4gdmFsdWUpO1xuICB9XG4gIGdldCBzaG93U3Bpbm5lcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ3Nob3dTcGlubmVyJyk7XG4gIH1cblxuICBzZXQgc2hvd1BhcnRuZXJCYW5uZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldCgnc2hvd1BhcnRuZXJCYW5uZXInLCAoKSA9PiB2YWx1ZSk7XG4gIH1cbiAgZ2V0IHNob3dQYXJ0bmVyQmFubmVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldCgnc2hvd1BhcnRuZXJCYW5uZXInKTtcbiAgfVxuXG4gIHNldCBzaG93TGVnYWxJbmZvcm1hdGlvbih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0KCdzaG93TGVnYWxJbmZvcm1hdGlvbicsICgpID0+IHZhbHVlKTtcbiAgfVxuICBnZXQgc2hvd0xlZ2FsSW5mb3JtYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdzaG93TGVnYWxJbmZvcm1hdGlvbicpO1xuICB9XG5cbiAgc2V0IHNob3dJbnN0YWxsTGlua3ModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldCgnc2hvd0luc3RhbGxMaW5rcycsICgpID0+IHZhbHVlKTtcbiAgfVxuICBnZXQgc2hvd0luc3RhbGxMaW5rcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ3Nob3dJbnN0YWxsTGlua3MnKTtcbiAgfVxuXG4gIHNldCBkYXJrTW9kZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0KCdkYXJrTW9kZScsICgpID0+IHZhbHVlKTtcbiAgfVxuICBnZXQgZGFya01vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdkYXJrTW9kZScpO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRMb2NhbGVDb2RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZyA/ICcnIDogKHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nIHx8IHRoaXMudHJhbnNsYXRlLmRlZmF1bHRMYW5nIHx8IHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdExvY2FsZSk/LnN1YnN0cmluZygwLCAyKTtcbiAgfVxuXG4gIGdldCBwYXJ0bmVyQmFubmVyU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNob3dMZWdhbEluZm9ybWF0aW9uID8gOSA6IDEyO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHVibGljIG5ldHdvcms6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHB1YmxpYyBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2UsXG4gICAgQEluamVjdChFTlZJUk9OTUVOVCkgcHJvdGVjdGVkIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCxcbiAgICBASW5qZWN0KEFQUF9MT0NBTEVTKSBwdWJsaWMgbG9jYWxlczogTG9jYWxlQ29uZmlnW10sXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfSE9NRV9CVVRUT05TKSBwdWJsaWMgYnV0dG9uczogSU1lbnVJdGVtW11cbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNldCg8UGFydGlhbDxIb21lUGFnZVN0YXRlPj57XG4gICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgc2hvd1BhcnRuZXJCYW5uZXI6IGZhbHNlLFxuICAgICAgc2hvd1NwaW5uZXI6ICF0aGlzLnBsYXRmb3JtLnN0YXJ0ZWQsXG4gICAgICBkYXJrTW9kZTogdGhpcy5zZXR0aW5ncy5pc0RhcmtNb2RlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5tb2JpbGUgPSB0aGlzLnBsYXRmb3JtLmlzKCdtb2JpbGUnKTtcbiAgICB0aGlzLnBsYXRmb3JtLnJlYWR5KCkudGhlbigoKSA9PiB0aGlzLnN0YXJ0KCkpO1xuICAgIHRoaXMuc2hvd0FjY291bnRCdXR0b24gPSBlbnZpcm9ubWVudC5hY2NvdW50Py5zaG93QWNjb3VudEJ1dHRvbiA/PyB0cnVlO1xuXG4gICAgdGhpcy5jb25uZWN0KCdkYXJrTW9kZScsIHRoaXMuc2V0dGluZ3MuZGFya01vZGUkKTtcblxuICAgIC8vIERFVlxuICAgIHRoaXMuX2RlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGFzeW5jIGxvZ2luKCkge1xuICAgIGNvbnN0IG1vZGFsID0gYXdhaXQgdGhpcy5tb2RhbEN0cmwuY3JlYXRlKHtcbiAgICAgIGNvbXBvbmVudDogQXBwQXV0aE1vZGFsLFxuICAgIH0pO1xuICAgIHJldHVybiBtb2RhbC5wcmVzZW50KCk7XG4gIH1cblxuICBhc3luYyByZWdpc3RlcigpIHtcbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxDdHJsLmNyZWF0ZSh7XG4gICAgICBjb21wb25lbnQ6IFJlZ2lzdGVyTW9kYWwsXG4gICAgICBiYWNrZHJvcERpc21pc3M6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiBtb2RhbC5wcmVzZW50KCk7XG4gIH1cblxuICBhc3luYyBsb2dvdXQoZXZlbnQ6IGFueSkge1xuICAgIGF3YWl0IHRoaXMuYWNjb3VudFNlcnZpY2UubG9nb3V0KCk7XG5cbiAgICAvLyBJZiB3YXMgb2ZmbGluZSwgdHJ5IHRvIHJlY29ubmVjdCAoYmVjYXVzZSBjYW4gYmUgYSBmb3JjZWQgb2ZmbGluZSBtb2RlKVxuICAgIGlmICh0aGlzLm9mZmxpbmUpIHtcbiAgICAgIGF3YWl0IHRoaXMudHJ5T25saW5lKCk7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlTGFuZ3VhZ2UobG9jYWxlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldHRpbmdzLmFwcGx5KHsgbG9jYWxlIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFBhZ2VQYXRoKGluZGV4OiBudW1iZXIsIHBhZ2U6IEhpc3RvcnlQYWdlUmVmZXJlbmNlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGFnZT8ucGF0aDtcbiAgfVxuXG4gIHRyeU9ubGluZSgpIHtcbiAgICB0aGlzLndhaXRpbmdOZXR3b3JrID0gdHJ1ZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgdGhpcy5uZXR3b3JrXG4gICAgICAudHJ5T25saW5lKHtcbiAgICAgICAgc2hvd0xvYWRpbmdUb2FzdDogZmFsc2UsXG4gICAgICAgIHNob3dPbmxpbmVUb2FzdDogdHJ1ZSxcbiAgICAgICAgc2hvd09mZmxpbmVUb2FzdDogZmFsc2UsXG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLndhaXRpbmdOZXR3b3JrID0gZmFsc2U7XG4gICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2QgIC0tICovXG5cbiAgcHJvdGVjdGVkIGFzeW5jIHN0YXJ0KCkge1xuICAgIGF3YWl0IHRoaXMuYWNjb3VudFNlcnZpY2UucmVhZHkoKTtcblxuICAgIHRoaXMuaXNMb2dpbiA9IHRoaXMuYWNjb3VudFNlcnZpY2UuaXNMb2dpbigpO1xuICAgIGlmICh0aGlzLmlzTG9naW4pIHtcbiAgICAgIHRoaXMub25Mb2dpbih0aGlzLmFjY291bnRTZXJ2aWNlLmFjY291bnQpO1xuICAgIH1cblxuICAgIHRoaXMub2ZmbGluZSA9IHRoaXMubmV0d29yay5vZmZsaW5lO1xuXG4gICAgLy8gTGlzdGVuIGxvZ2luL2xvZ291dCBldmVudHNcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMuYWNjb3VudFNlcnZpY2Uub25Mb2dpbi5zdWJzY3JpYmUoKGFjY291bnQpID0+IHRoaXMub25Mb2dpbihhY2NvdW50KSkpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQodGhpcy5hY2NvdW50U2VydmljZS5vbkxvZ291dC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkxvZ291dCgpKSk7XG5cbiAgICAvLyBMaXN0ZW4gcG9kIGNvbmZpZ1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQodGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5zdWJzY3JpYmUoKGNvbmZpZykgPT4gdGhpcy5vbkNvbmZpZ0xvYWRlZChjb25maWcpKSk7XG5cbiAgICAvLyBMaXN0ZW4gc2V0dGluZ3MgY2hhbmdlc1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLnNldHRpbmdzLm9uQ2hhbmdlXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIC8vIEFkZCBhIGRlbGF5LCB0byBhdm9pZCB0byBhcHBseSBjaGFuZ2VzIHRvIG9mdGVuXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDI1MCksXG4gICAgICAgICAgLy8gU3RhcnQgd2l0aCBjdXJyZW50IHNldHRpbmdzXG4gICAgICAgICAgc3RhcnRXaXRoKGF3YWl0IHRoaXMuc2V0dGluZ3MucmVhZHkoKSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXMpID0+IHRoaXMub25TZXR0aW5nc0NoYW5nZWQocmVzKSlcbiAgICApO1xuXG4gICAgLy8gTGlzdGVuIG5ldHdvcmsgY2hhbmdlc1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLm5ldHdvcmsub25OZXR3b3JrU3RhdHVzQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICAvL2RlYm91bmNlVGltZSg0NTApLFxuICAgICAgICAgIC8vdGFwKCgpID0+IHRoaXMud2FpdGluZ05ldHdvcmsgPSBmYWxzZSksXG4gICAgICAgICAgbWFwKChjb25uZWN0aW9uVHlwZSkgPT4gY29ubmVjdGlvblR5cGUgPT09ICdub25lJyksXG4gICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKG9mZmxpbmUpID0+IHtcbiAgICAgICAgICB0aGlzLm9mZmxpbmUgPSBvZmZsaW5lO1xuICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzaG93VG9hc3Qob3B0czogU2hvd1RvYXN0T3B0aW9ucykge1xuICAgIGF3YWl0IFRvYXN0cy5zaG93KHRoaXMudG9hc3RDb250cm9sbGVyLCB0aGlzLnRyYW5zbGF0ZSwgb3B0cyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Db25maWdMb2FkZWQoY29uZmlnOiBDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW2hvbWVdIEFwcGx5aW5nIGNvbmZpZ3VyYXRpb24nLCBjb25maWcpO1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcblxuICAgIHRoaXMuYXBwTmFtZSA9IHRoaXMuX2NvbmZpZy5sYWJlbCB8fCB0aGlzLmVudmlyb25tZW50LmRlZmF1bHRBcHBOYW1lIHx8ICdTVU1BUmlTJztcbiAgICB0aGlzLmxvZ28gPSB0aGlzLl9jb25maWcubGFyZ2VMb2dvIHx8IHRoaXMuX2NvbmZpZy5zbWFsbExvZ28gfHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBjb25maWcubmFtZTtcbiAgICB0aGlzLmlzV2ViID0gdGhpcy5wbGF0Zm9ybS5pc1dlYigpO1xuICAgIHRoaXMuY2FuUmVnaXN0ZXIgPSB0aGlzLl9jb25maWcuZ2V0UHJvcGVydHlBc0Jvb2xlYW4oQ09SRV9DT05GSUdfT1BUSU9OUy5SRUdJU1RSQVRJT05fRU5BQkxFKTtcbiAgICB0aGlzLmxlZ2FsSW5mb3JtYXRpb24gPSBbXG4gICAgICB7XG4gICAgICAgIHRpdGxlOiAnSE9NRS5QUklWQUNZX1BPTElDWScsXG4gICAgICAgIHBhdGg6IHRoaXMuX2NvbmZpZy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLlBSSVZBQ1lfUE9MSUNZX1VSTCkgPz8gKHRoaXMuZW52aXJvbm1lbnQucHJpdmFjeVBvbGljeVVybCBhcyBzdHJpbmcpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdGl0bGU6ICdIT01FLlRFUk1TX09GX1VTRScsXG4gICAgICAgIHBhdGg6IHRoaXMuX2NvbmZpZy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLlRFUk1TX09GX1VTRV9VUkwpID8/ICh0aGlzLmVudmlyb25tZW50LnRlcm1zT2ZVc2VVcmwgYXMgc3RyaW5nKSxcbiAgICAgIH0sXG4gICAgXS5maWx0ZXIoKGl0ZW0pID0+IGlzTm90TmlsT3JCbGFuayhpdGVtLnBhdGgpKTtcbiAgICB0aGlzLnNob3dMZWdhbEluZm9ybWF0aW9uID0gaXNOb3RFbXB0eUFycmF5KHRoaXMubGVnYWxJbmZvcm1hdGlvbik7XG5cbiAgICBjb25zdCBwYXJ0bmVycyA9ICh0aGlzLl9jb25maWcucGFydG5lcnMgfHwgW10pLmZpbHRlcigocCkgPT4gcCAmJiBwLmxvZ28pO1xuICAgIHRoaXMuJHBhcnRuZXJzLm5leHQocGFydG5lcnMpO1xuICAgIHRoaXMuc2hvd1BhcnRuZXJCYW5uZXIgPSBwYXJ0bmVycy5sZW5ndGggPiAwO1xuICAgIC8vIFRPRE8gbG9hZCBpbnN0YWxsIGxpbmtzXG5cbiAgICAvLyBJZiBub3QgYWxyZWFkeSBzZXQsIGNvbXB1dGUgdGhlIGJhY2tncm91bmQgaW1hZ2VcbiAgICBpZiAoIXRoaXMuY29udGVudFN0eWxlKSB7XG4gICAgICBjb25zdCBiYWNrZ3JvdW5kSW1hZ2VzID0gKGNvbmZpZy5iYWNrZ3JvdW5kSW1hZ2VzIHx8IFtdKVxuICAgICAgICAvLyBGaWx0ZXIgb24gbm90IG5pbCwgYmVjYXVzZSBjYW4gb2NjdXIgaWYgZGV0ZWN0ZWQgaGFzIG5vdCBleGlzdHMgKHNlZSBjb25maWctc2VydmljZS5qcylcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoaW1nKSA9PlxuICAgICAgICAgICAgaXNOb3ROaWwoaW1nKSAmJlxuICAgICAgICAgICAgLy8gSWYgb2ZmbGluZSwgZmlsdGVyIG9uIGxvY2FsIGRhdGFVUkwgaW1hZ2VcbiAgICAgICAgICAgICghdGhpcy5vZmZsaW5lIHx8ICFpbWcuc3RhcnRzV2l0aCgnaHR0cCcpKVxuICAgICAgICApO1xuXG4gICAgICAvLyBCYWNrZ3JvdW5kIGltYWdlIGZvdW5kOiBzZWxlY3Qgb25lIHJhbmRvbWx5XG4gICAgICBpZiAoYmFja2dyb3VuZEltYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgeyBpbWFnZSwgY3JlZGl0cyB9ID0gZ2V0UmFuZG9tSW1hZ2VXaXRoQ3JlZGl0KGJhY2tncm91bmRJbWFnZXMpO1xuICAgICAgICB0aGlzLmNvbnRlbnRTdHlsZSA9IGltYWdlID8geyAnYmFja2dyb3VuZC1pbWFnZSc6IGB1cmwoJHtpbWFnZX0pYCB9IDoge307XG4gICAgICAgIHRoaXMuY29udGVudENyZWRpdHMgPSBjcmVkaXRzIHx8ICcnO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2UgYmFja2dyb3VuZCBjb2xvclxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHByaW1hcnlDb2xvciA9IGNvbmZpZy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLkNPTE9SX1BSSU1BUlkpIHx8ICd2YXIoLS1pb24tY29sb3ItcHJpbWFyeSknO1xuICAgICAgICB0aGlzLmNvbnRlbnRTdHlsZSA9IChwcmltYXJ5Q29sb3IgJiYgeyAnYmFja2dyb3VuZC1jb2xvcic6IHByaW1hcnlDb2xvciB9KSB8fCB7fTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnJlZnJlc2hCdXR0b25zKCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcblxuICAgIC8vIElmIGZpcnN0IGxvYWQsIGhpZGUgdGhlIGxvYWRpbmcgaW5kaWNhdG9yXG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TZXR0aW5nc0NoYW5nZWQoc2V0dGluZ3M6IExvY2FsU2V0dGluZ3MpIHtcbiAgICBpZiAoc2V0dGluZ3MucGFnZUhpc3RvcnkgIT09IHRoaXMucGFnZUhpc3RvcnkpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tob21lXSBQYWdlIGhpc3RvcnkgbG9hZGVkJyk7XG4gICAgICB0aGlzLnBhZ2VIaXN0b3J5ID0gc2V0dGluZ3MucGFnZUhpc3RvcnkgfHwgW107XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uTG9naW4oYWNjb3VudDogQWNjb3VudCkge1xuICAgIGlmICghYWNjb3VudCkgcmV0dXJuOyAvLyBTa2lwXG4gICAgLy9jb25zb2xlLmRlYnVnKCdbaG9tZV0gTG9nZ2VkIGFjY291bnQ6ICcsIGFjY291bnQpO1xuICAgIHRoaXMuaXNMb2dpbiA9IHRydWU7XG4gICAgdGhpcy5hY2NvdW50TmFtZSA9IGFjY291bnRUb1N0cmluZyhhY2NvdW50KTtcbiAgICB0aGlzLnJlZnJlc2hCdXR0b25zKGFjY291bnQpO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Mb2dvdXQoKSB7XG4gICAgdGhpcy5pc0xvZ2luID0gZmFsc2U7XG4gICAgdGhpcy5hY2NvdW50TmFtZSA9ICcnO1xuICAgIHRoaXMucGFnZUhpc3RvcnkgPSBbXTtcbiAgICB0aGlzLnJlZnJlc2hCdXR0b25zKCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWZyZXNoQnV0dG9ucyhhY2NvdW50PzogQWNjb3VudCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnKSByZXR1cm47IC8vIFNraXAgKHdhaXRpbmcgY29uZmlnIHRvIGJlIGxvYWRlZClcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1tob21lXSBSZWZyZXNoaW5nIGJ1dHRvbnMuLi4nKTtcblxuICAgIGFjY291bnQgPSBhY2NvdW50IHx8IHRoaXMuYWNjb3VudFNlcnZpY2UuYWNjb3VudDtcbiAgICBjb25zdCBmaWx0ZXJlZEJ1dHRvbnMgPSAodGhpcy5idXR0b25zIHx8IFtdKVxuICAgICAgLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgICAgTWVudUl0ZW1zLmNoZWNrSWZWaXNpYmxlKGl0ZW0sIGFjY291bnQsIHRoaXMuX2NvbmZpZywge1xuICAgICAgICAgIGlzTG9naW46IHRoaXMuaXNMb2dpbixcbiAgICAgICAgICBkZWJ1ZzogdGhpcy5fZGVidWcsXG4gICAgICAgICAgbG9nUHJlZml4OiAnW2hvbWVdJyxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgLy8gUmVwbGFjZSB0aXRsZSB1c2luZyBwcm9wZXJ0aWVzXG4gICAgICAgIGlmIChpc05vdE5pbE9yQmxhbmsoaXRlbS50aXRsZVByb3BlcnR5KSAmJiB0aGlzLl9jb25maWcpIHtcbiAgICAgICAgICBjb25zdCB0aXRsZSA9IHRoaXMuX2NvbmZpZy5wcm9wZXJ0aWVzW2l0ZW0udGl0bGVQcm9wZXJ0eV07XG4gICAgICAgICAgaWYgKHRpdGxlKSByZXR1cm4geyAuLi5pdGVtLCB0aXRsZSB9OyAvLyBDcmVhdGUgYSBjb3B5LCB0byBrZWVwIHRoZSBvcmlnaW5hbCBpdGVtLnRpdGxlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9KTtcblxuICAgIHRoaXMuJGZpbHRlcmVkQnV0dG9ucy5uZXh0KGZpbHRlcmVkQnV0dG9ucyk7XG4gIH1cblxuICBhc3luYyBvcGVuTWFya2Rvd25Nb2RhbChldmVudD86IEV2ZW50LCBpdGVtOiBJTWVudUl0ZW0gPSBudWxsKSB7XG4gICAgaWYgKGlzTmlsT3JCbGFuayhpdGVtPy5wYXRoKSkgcmV0dXJuO1xuXG4gICAgLy8gUmVzb2x2ZSByZWxhdGl2ZSBwYXRoXG4gICAgbGV0IHVybCA9IGl0ZW0ucGF0aDtcbiAgICBpZiAodGhpcy5uZXR3b3JrLnBlZXIgJiYgKHVybC5zdGFydHNXaXRoKCcuLycpIHx8IHVybC5zdGFydHNXaXRoKCcvJykpKSB7XG4gICAgICB1cmwgPSBQZWVyLnBhdGgodGhpcy5uZXR3b3JrLnBlZXIsIHVybCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aEZpbGVuYW1lID0gVXJpVXRpbHMuZ2V0RmlsZW5hbWUodXJsKTtcbiAgICBjb25zdCBpc01hcmtkb3duRmlsZSA9IHBhdGhGaWxlbmFtZS5lbmRzV2l0aCgnLm1kJyk7XG5cbiAgICAvLyBPcGVuIGFzIG1hcmtkb3duXG4gICAgaWYgKGlzTWFya2Rvd25GaWxlKSB7XG4gICAgICBhd2FpdCBBcHBNYXJrZG93bk1vZGFsLnNob3codGhpcy5tb2RhbEN0cmwsIHtcbiAgICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoaXRlbS50aXRsZSwgaXRlbS50aXRsZUFyZ3MpLFxuICAgICAgICBzcmM6IHVybCxcbiAgICAgICAgZW5hYmxlTmF2aWdhdGlvbkhpc3Rvcnk6IGZhbHNlLFxuICAgICAgICBjYW5QcmludDogIXRoaXMubW9iaWxlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE9wZW4gYXMgZXh0ZXJuYWwgbGlua1xuICAgICAgYXdhaXQgdGhpcy5wbGF0Zm9ybS5vcGVuKHVybCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHRvZ2dsZURhcmtNb2RlKCkge1xuICAgIGNvbnN0IGVuYWJsZSA9ICF0aGlzLnNldHRpbmdzLmlzRGFya01vZGU7XG4gICAgYXdhaXQgdGhpcy5zZXR0aW5ncy5hcHBseSh7IGRhcmtNb2RlOiBlbmFibGUsIGF1dG9EYXJrTW9kZTogZmFsc2UgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVtb3ZlUGFnZUhpc3RvcnkocGF0aDogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5zZXR0aW5ncy5yZW1vdmVQYWdlSGlzdG9yeShwYXRoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGFwcC10b29sYmFyIFtjYW5Hb0JhY2tdPVwiZmFsc2VcIiB2aXNpYmxlLXhzIHZpc2libGUtc20gdmlzaWJsZS1tb2JpbGU+XG4gIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgPCEtLSBkYXJrIG1vZGUgKGlmIGFsbG93IGJ5IHRoZSBlbnZpcm9ubWVudCB0b2tlbikgLS0+XG4gICAgQGlmIChzZXR0aW5ncy5hbGxvd0RhcmtNb2RlKSB7XG4gICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlRGFya01vZGUoKVwiPlxuICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIFtuYW1lXT1cIihkYXJrTW9kZSQgfCBwdXNoKSA/ICdzdW5ueScgOiAnbW9vbidcIj48L2lvbi1pY29uPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIH1cblxuICAgIDwhLS0gQ2hhbmdlIGxvY2FsZSBidXR0b24gLS0+XG4gICAgPGlvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImxvY2FsZU1lbnVcIj5cbiAgICAgIDxpb24taWNvbiBzbG90PVwic3RhcnRcIiBuYW1lPVwibGFuZ3VhZ2VcIj48L2lvbi1pY29uPlxuICAgIDwvaW9uLWJ1dHRvbj5cbiAgPC9pb24tYnV0dG9ucz5cbjwvYXBwLXRvb2xiYXI+XG5cbjwhLS0gQ2hhbmdlIGxvY2FsZSBtZW51IC0tPlxuPG1hdC1tZW51ICNsb2NhbGVNZW51PVwibWF0TWVudVwiPlxuICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQ+XG4gICAgQGZvciAoaXRlbSBvZiBsb2NhbGVzOyB0cmFjayBpdGVtLmtleSkge1xuICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjaGFuZ2VMYW5ndWFnZShpdGVtLmtleSlcIj5cbiAgICAgICAgPGlvbi1sYWJlbD57eyBpdGVtLnZhbHVlIH19PC9pb24tbGFiZWw+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gIDwvbmctdGVtcGxhdGU+XG48L21hdC1tZW51PlxuXG48aW9uLWNvbnRlbnQgW25nU3R5bGVdPVwiY29udGVudFN0eWxlXCIgbm8tcGFkZGluZy14cz5cbiAgQGlmIChjb250ZW50Q3JlZGl0cyB8IGlzTm90TmlsT3JCbGFuaykge1xuICAgIDxzcGFuIGNsYXNzPVwiY29udGVudC1jcmVkaXRzXCI+XG4gICAgICA8aW9uLXRleHQ+e3sgY29udGVudENyZWRpdHMgfX08L2lvbi10ZXh0PlxuICAgIDwvc3Bhbj5cbiAgfVxuXG4gIDwhLS0gbG9hZGluZyBzcGlubmVyIC0tPlxuICA8ZGl2IGNsYXNzPVwibG9hZGluZy1wYWdlXCIgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIShsb2FkaW5nJCB8IHB1c2gpXCI+XG4gICAgQGlmIChzaG93U3Bpbm5lcikge1xuICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj5cbiAgICAgICAgPHAgW2lubmVySFRNTF09XCInQ09NTU9OLkxPQURJTkdfRE9UUycgfCB0cmFuc2xhdGVcIj48L3A+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzay1jdWJlMSBzay1jdWJlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzay1jdWJlMiBzay1jdWJlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzay1jdWJlNCBzay1jdWJlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzay1jdWJlMyBzay1jdWJlXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDwhLS0gRGVza3RvcDogdHJhbnNsdWNlbnQgdG9wIHRvb2xiYXIgLS0+XG4gIEBpZiAoIW1vYmlsZSkge1xuICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4teHMgaGlkZGVuLXNtXCI+XG4gICAgICA8aW9uLXRvb2xiYXIgY29sb3I9XCJ0cmFhbnNwYXJlbnRcIiB0cmFuc2x1Y2VudD5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgICAgIDxpb24tbWVudS10b2dnbGU+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBjb2xvcj1cImxpZ2h0XCIgZmlsbD1cImNsZWFyXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cIm1lbnVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLW1lbnUtdG9nZ2xlPlxuICAgICAgICA8L2lvbi1idXR0b25zPlxuXG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICAgICAgPCEtLSBkYXJrIG1vZGUgKGlmIGFsbG93IGJ5IHRoZSBlbnZpcm9ubWVudCB0b2tlbikgLS0+XG4gICAgICAgICAgQGlmIChzZXR0aW5ncy5hbGxvd0RhcmtNb2RlKSB7XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICBjb2xvcj1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgIGZpbGw9XCJzb2xpZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEYXJrTW9kZSgpXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidIT01FLkJUTl9EQVJLX01PREUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBbbmFtZV09XCIoZGFya01vZGUkIHwgcHVzaCkgPyAnbW9vbicgOiAnc3VubnknXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPCEtLSBjaGFuZ2UgbG9jYWxlIGJ1dHRvbiAtLT5cbiAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgZmlsbD1cInNvbGlkXCJcbiAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJsb2NhbGVNZW51XCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInU0VUVElOR1MuTE9DQUxFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwibGFuZ3VhZ2VcIj48L2lvbi1pY29uPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9kaXY+XG4gIH1cblxuICA8IS0tIEluc3RhbGwgKGFuZCB1cGdyYWRlKSBjYXJkIC0tPlxuICA8YXBwLWluc3RhbGwtdXBncmFkZS1jYXJkIFtpc0xvZ2luXT1cImlzTG9naW5cIiBbc2hvd0luc3RhbGxCdXR0b25dPVwidHJ1ZVwiPjwvYXBwLWluc3RhbGwtdXBncmFkZS1jYXJkPlxuXG4gIEBpZiAoIShsb2FkaW5nJCB8IHB1c2gpKSB7XG4gICAgPCEtLSBXZWxjb21lIGNhcmQgLS0+XG4gICAgPGlvbi1jYXJkIGNsYXNzPVwibWFpbiB3ZWxjb21lIGlvbi1wYWRkaW5nIGlvbi10ZXh0LWNlbnRlciBpb24tYWxpZ24tc2VsZi1jZW50ZXJcIiBAZmFkZUluQW5pbWF0aW9uPlxuICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgPGlvbi1jYXJkLXRpdGxlIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1dlYlwiIFtpbm5lckhUTUxdPVwiJ0hPTUUuV0VMQ09NRV9XRUInIHwgdHJhbnNsYXRlOiB7IGFwcE5hbWU6IGFwcE5hbWUgfVwiPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc1dlYlwiIFtpbm5lckhUTUxdPVwiJ0hPTUUuV0VMQ09NRV9BUFAnIHwgdHJhbnNsYXRlOiB7IGFwcE5hbWU6IGFwcE5hbWUgfVwiPjwvc3Bhbj5cbiAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlIFtpbm5lckhUTUxdPVwiZGVzY3JpcHRpb25cIj48L2lvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICA8aW9uLWNhcmQtY29udGVudCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgIDxpb24tdGV4dCBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICA8aW1nICpuZ0lmPVwibG9nb1wiIFthdHRyLnNyY109XCJsb2dvXCIgYWx0PVwiTG9nb1wiIC8+XG4gICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIDwhLS0gcmVnaXN0ZXIgaGVscCB0ZXh0IC0tPlxuICAgICAgICA8aW9uLXRleHQgKm5nSWY9XCIhaXNMb2dpbiAmJiBjYW5SZWdpc3RlclwiPlxuICAgICAgICAgIDxiciAvPlxuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5IT01FLlJFR0lTVEVSX0hFTFA8L3NwYW4+XG4gICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpb24tcGFkZGluZy10b3BcIj5cbiAgICAgICAgICA8IS0tIElmIE5PVCBsb2dpbiAtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9naW47IGVsc2UgbG9naW5CdXR0b25zXCI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cImNhblJlZ2lzdGVyXCIgZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cInRlcnRpYXJ5XCIgKGNsaWNrKT1cInJlZ2lzdGVyKClcIj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkhPTUUuQlROX1JFR0lTVEVSPC9zcGFuPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cImxpZ2h0XCIgW3JvdXRlckxpbmtdPVwiWycvJ11cIiAoY2xpY2spPVwibG9naW4oKVwiPlxuICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+QVVUSC5CVE5fTE9HSU48L3NwYW4+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8IS0tIElmIHVzZXIgbG9naW4gLS0+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNsb2dpbkJ1dHRvbnM+XG4gICAgICAgICAgICA8IS0tIEZlYXR1cmUgYnV0dG9ucyAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKnJ4SWY9XCIkZmlsdGVyZWRCdXR0b25zOyBsZXQgYnV0dG9uc1wiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnBhdGhcIlxuICAgICAgICAgICAgICAgICAgZXhwYW5kPVwiYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJ0ZXJ0aWFyeVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiaXRlbS5jc3NDbGFzc1wiXG4gICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJpdGVtLnBhdGhcIlxuICAgICAgICAgICAgICAgICAgcm91dGVyRGlyZWN0aW9uPVwicm9vdFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJzdGFydFwiIGNsYXNzPVwiaW9uLWZsb2F0LXN0YXJ0XCIgKm5nSWY9XCJpdGVtLmljb25cIiBbbmFtZV09XCJpdGVtLmljb25cIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHNsb3Q9XCJzdGFydFwiIGNsYXNzPVwiaW9uLWZsb2F0LXN0YXJ0XCIgKm5nSWY9XCJpdGVtLm1hdEljb25cIj57eyBpdGVtLm1hdEljb24gfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0Pnt7ICdIT01FLkJUTl9EQVRBX0VOVFJZJyB8IHRyYW5zbGF0ZTogeyBuYW1lOiAoaXRlbS50aXRsZSB8IHRyYW5zbGF0ZSkgfSB9fTwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBkaXZpZGVyIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXRlbS5wYXRoICYmICFpdGVtLmFjdGlvblwiIFtjbGFzc109XCJpdGVtLmNzc0NsYXNzXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT57eyBpdGVtLnRpdGxlIH19Jm5ic3A7PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDwhLS08cCAqbmdJZj1cImJ1dHRvbnMubGVuZ3RoXCIgY2xhc3M9XCJ2aXNpYmxlLW1vYmlsZVwiPiZuYnNwOzwvcD4tLT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cInNob3dBY2NvdW50QnV0dG9uXCIgZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cInNlY29uZGFyeVwiIFtyb3V0ZXJMaW5rXT1cIlsnL2FjY291bnQnXVwiPlxuICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgY2xhc3M9XCJpb24tZmxvYXQtc3RhcnRcIiBuYW1lPVwicGVyc29uLWNpcmNsZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgIDxpb24tdGV4dCB0cmFuc2xhdGU+SE9NRS5CVE5fTVlfQUNDT1VOVDwvaW9uLXRleHQ+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgICAgICAgIDxwIGhpZGRlbi14cyBoaWRkZW4tc20gaGlkZGVuLW1vYmlsZT5cbiAgICAgICAgICAgICAgPGlvbi10ZXh0XG4gICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCInSE9NRS5OT1RfVEhJU19BQ0NPVU5UX1FVRVNUSU9OJyB8IHRyYW5zbGF0ZTogeyBkaXNwbGF5TmFtZTogYWNjb3VudE5hbWUgfVwiXG4gICAgICAgICAgICAgID48L2lvbi10ZXh0PlxuICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgPGlvbi10ZXh0PlxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cImxvZ291dCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+SE9NRS5CVE5fRElTQ09OTkVDVDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgPC9pb24tY2FyZD5cblxuICAgIDwhLS0gUGFnZSBoaXN0b3J5IC0tPlxuICAgIEBsZXQgcGFnZUhpc3RvcnkgPSBpc0xvZ2luICYmIChwYWdlSGlzdG9yeSQgfCBwdXNoKTtcbiAgICBAaWYgKHBhZ2VIaXN0b3J5IHwgaXNOb3RFbXB0eUFycmF5KSB7XG4gICAgICA8aW9uLWdyaWQgY2xhc3M9XCJoaXN0b3J5LWNvbnRhaW5lciBpb24tYWxpZ24tc2VsZi1jZW50ZXJcIj5cbiAgICAgICAgPGlvbi1yb3c+XG4gICAgICAgICAgQGZvciAocGFnZSBvZiBwYWdlSGlzdG9yeTsgdHJhY2sgcGFnZS5wYXRoKSB7XG4gICAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiMTJcIiBzaXplLXhsPVwiXCIgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkIGNsYXNzPVwiaW9uLWFsaWduLXNlbGYtc3RhcnQgaW9uLXRleHQtc3RhcnRcIiBAZmFkZUluQW5pbWF0aW9uPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgPCEtLSB0b3AgYmFyIC0tPlxuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVBhZ2VIaXN0b3J5KHBhZ2UucGF0aClcIlxuICAgICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW9uLWZsb2F0LXN0YXJ0IGlvbi1uby1tYXJnaW4gY2xvc2UtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIFtpbm5lckhUTUxdPVwicGFnZS5zdWJ0aXRsZSB8IHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJpb24tZmxvYXQtZW5kXCIgW3RpdGxlXT1cInBhZ2UudGltZSB8IGRhdGVGb3JtYXQ6IHsgdGltZTogdHJ1ZSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJ0aW1lLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7e3sgcGFnZS50aW1lIHwgZGF0ZUZyb21Ob3cgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgICAgICAgPC9pb24tY2FyZC1zdWJ0aXRsZT5cblxuICAgICAgICAgICAgICAgICAgPCEtLSBtYWluIHBhZ2UgLS0+XG4gICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGUgY2xhc3M9XCJpb24tbm8tbWFyZ2luIGlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpb24taXRlbVxuICAgICAgICAgICAgICAgICAgICAgIGRldGFpbD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIHRhcHBhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LTF4XCJcbiAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJwYWdlLnBhdGhcIlxuICAgICAgICAgICAgICAgICAgICAgIHJvdXRlckRpcmVjdGlvbj1cInJvb3RcIlxuICAgICAgICAgICAgICAgICAgICAgIGxpbmVzPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIHBhZ2UgaWNvbi0tPlxuICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiAqbmdJZj1cInBhZ2UuaWNvblwiIHNsb3Q9XCJzdGFydFwiIFtuYW1lXT1cInBhZ2UuaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwicGFnZS5tYXRJY29uXCIgc2xvdD1cInN0YXJ0XCI+e3sgcGFnZS5tYXRJY29uIH19PC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJwcmltYXJ5XCIgW2lubmVySFRNTF09XCJwYWdlLnRpdGxlXCI+PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBjaGlsZHJlbiBwYWdlcyAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKHBhZ2UuY2hpbGRyZW4gfCBpc05vdEVtcHR5QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmcgaW9uLXBhZGRpbmctc3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1saXN0IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjaGlsZFBhZ2Ugb2YgcGFnZS5jaGlsZHJlbjsgdHJhY2sgY2hpbGRQYWdlLnBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24taXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwcGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LTF4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiY2hpbGRQYWdlLnBhdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXJEaXJlY3Rpb249XCJyb290XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBwYWdlIGljb24tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uICpuZ0lmPVwiY2hpbGRQYWdlLmljb25cIiBzbG90PVwic3RhcnRcIiBjb2xvcj1cImRhcmtcIiBbbmFtZV09XCJjaGlsZFBhZ2UuaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImNoaWxkUGFnZS5tYXRJY29uXCIgc2xvdD1cInN0YXJ0XCIgY29sb3I9XCJkYXJrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2hpbGRQYWdlLm1hdEljb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIGNvbG9yPVwiZGFya1wiIFtpbm5lckhUTUxdPVwiY2hpbGRQYWdlLnRpdGxlXCI+PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tbGlzdD5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgfVxuICAgICAgICA8L2lvbi1yb3c+XG4gICAgICA8L2lvbi1ncmlkPlxuICAgIH0gQGVsc2UgaWYgKHNob3dQYXJ0bmVyQmFubmVyIHx8IHNob3dMZWdhbEluZm9ybWF0aW9uKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYm90dG9tQmFubmVyXCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuICB9XG48L2lvbi1jb250ZW50PlxuXG48bmctdGVtcGxhdGUgI2JvdHRvbUJhbm5lcj5cbiAgPGlvbi1ncmlkIGNsYXNzPVwiYm90dG9tLWJhbm5lciBpb24tdGV4dC1jZW50ZXJcIiBbY2xhc3MuZmxvYXRpbmddPVwiIW1vYmlsZVwiIEBmYWRlSW5BbmltYXRpb24+XG4gICAgPGlvbi1yb3c+XG4gICAgICBAaWYgKHNob3dQYXJ0bmVyQmFubmVyKSB7XG4gICAgICAgIDxpb24tY29sIHNpemU9XCIxMlwiIFtzaXplTGddPVwicGFydG5lckJhbm5lclNpemVcIiBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIEBpZiAoc2hvd0xlZ2FsSW5mb3JtYXRpb24pIHtcbiAgICAgICAgICAgIDxpb24tbGlzdCBjbGFzcz1cImxlZ2FsLWluZm9cIj5cbiAgICAgICAgICAgICAgPGlvbi1saXN0LWhlYWRlcj57eyAnSE9NRS5QQVJUTkVSUycgfCB0cmFuc2xhdGUgfX08L2lvbi1saXN0LWhlYWRlcj5cbiAgICAgICAgICAgIDwvaW9uLWxpc3Q+XG4gICAgICAgICAgfVxuICAgICAgICAgIDwhLS0gcGFydG5lcnMgLS0+XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiAkcGFydG5lcnMgfCBhc3luYzsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8YSBocmVmPVwie3sgaXRlbS5zaXRlVXJsIH19XCI+XG4gICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJsb2dvXCIgc3JjPVwie3sgaXRlbS5sb2dvIH19XCIgYWx0PVwie3sgaXRlbS5sYWJlbCB9fVwiIFt0aXRsZV09XCJpdGVtLmxhYmVsXCIgLz5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIH1cbiAgICAgIEBpZiAoc2hvd0xlZ2FsSW5mb3JtYXRpb24pIHtcbiAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjEyXCIgc2l6ZS1zbT1cIjZcIiBzaXplLWxnPVwiM1wiIFtjbGFzcy5sZWZ0LWJvcmRlcl09XCJzaG93UGFydG5lckJhbm5lclwiPlxuICAgICAgICAgIDxpb24tbGlzdCBjbGFzcz1cImxlZ2FsLWluZm9cIj5cbiAgICAgICAgICAgIDxpb24tbGlzdC1oZWFkZXIgY2xhc3M9XCJpb24tdGV4dC1sZWZ0XCI+e3sgJ0hPTUUuTEVHQUxfSU5GT1JNQVRJT04nIHwgdHJhbnNsYXRlIH19PC9pb24tbGlzdC1oZWFkZXI+XG4gICAgICAgICAgICBAZm9yIChpdGVtIG9mIGxlZ2FsSW5mb3JtYXRpb247IHRyYWNrIGl0ZW0ucGF0aCkge1xuICAgICAgICAgICAgICA8aW9uLWl0ZW0gKGNsaWNrKT1cIm9wZW5NYXJrZG93bk1vZGFsKCRldmVudCwgaXRlbSlcIiBsaW5lcz1cIm5vbmVcIiBbYnV0dG9uXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0udGl0bGUgfCB0cmFuc2xhdGU6IGl0ZW0udGl0bGVBcmdzIH19XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9pb24tbGlzdD5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgICBAaWYgKHNob3dJbnN0YWxsTGlua3MpIHtcbiAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiMTJcIiBzaXplLWxnPVwiM1wiIG9mZnNldC1sZz1cIjlcIiBbY2xhc3MubGVmdC1ib3JkZXJdPVwic2hvd1BhcnRuZXJCYW5uZXJcIj5cbiAgICAgICAgICAgIDxpb24tbGlzdCBjbGFzcz1cImxlZ2FsLWluZm9cIj5cbiAgICAgICAgICAgICAgPGlvbi1saXN0LWhlYWRlcj57eyAnSE9NRS5JTlNUQUxMX0FQUCcgfCB0cmFuc2xhdGUgfX08L2lvbi1saXN0LWhlYWRlcj5cbiAgICAgICAgICAgICAgPCEtLSBUT0RPIC0tPlxuICAgICAgICAgICAgPC9pb24tbGlzdD5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2lvbi1yb3c+XG4gIDwvaW9uLWdyaWQ+XG48L25nLXRlbXBsYXRlPlxuIl19