@kalisio/kdk 2.6.4 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/core/api/application.js +2 -4
  2. package/core/api/authentication.js +2 -3
  3. package/core/api/db.js +10 -2
  4. package/core/api/hooks/hooks.authorisations.js +4 -2
  5. package/core/api/hooks/hooks.push.js +6 -2
  6. package/core/api/hooks/hooks.query.js +29 -12
  7. package/core/api/hooks/hooks.users.js +30 -17
  8. package/core/api/models/configurations.model.mongodb.js +4 -0
  9. package/core/api/services/authorisations/authorisations.service.js +1 -1
  10. package/core/api/services/configurations/configurations.hooks.js +33 -0
  11. package/core/api/services/index.js +41 -7
  12. package/core/api/services/messages/messages.hooks.js +9 -3
  13. package/core/client/api.js +14 -1
  14. package/core/client/capabilities.js +1 -6
  15. package/core/client/components/KAvatar.vue +24 -20
  16. package/core/client/components/account/KProfile.vue +10 -71
  17. package/core/client/components/account/index.js +0 -2
  18. package/core/client/components/app/KSettings.vue +1 -0
  19. package/core/client/components/collection/KBoard.vue +4 -3
  20. package/core/client/components/collection/KCardSection.vue +1 -0
  21. package/core/client/components/collection/KGrid.vue +2 -0
  22. package/core/client/components/collection/KTable.vue +5 -1
  23. package/core/client/components/collection/KTimeLine.vue +9 -1
  24. package/core/client/components/collection/index.js +0 -2
  25. package/core/client/components/form/KChipsField.vue +2 -1
  26. package/core/client/components/form/KEmailField.vue +1 -0
  27. package/core/client/components/form/KFileField.vue +22 -1
  28. package/core/client/components/form/KForm.vue +2 -0
  29. package/core/client/components/form/KItemField.vue +1 -0
  30. package/core/client/components/form/KNumberField.vue +1 -0
  31. package/core/client/components/form/KPasswordField.vue +1 -0
  32. package/core/client/components/form/KPhoneField.vue +1 -0
  33. package/core/client/components/form/KPropertyItemField.vue +1 -0
  34. package/core/client/components/form/KResolutionField.vue +1 -0
  35. package/core/client/components/form/KSelectField.vue +31 -0
  36. package/core/client/components/form/KTagField.vue +1 -0
  37. package/core/client/components/form/KTextField.vue +1 -0
  38. package/core/client/components/form/KTokenField.vue +1 -0
  39. package/core/client/components/form/KUnitField.vue +1 -0
  40. package/core/client/components/form/KUrlField.vue +1 -0
  41. package/core/client/components/graphics/KIcon.vue +3 -4
  42. package/core/client/components/layout/KPage.vue +1 -0
  43. package/core/client/components/layout/KWindow.vue +6 -3
  44. package/core/client/components/messages/KMessageComposer.vue +2 -1
  45. package/core/client/components/messages/KMessagesTimeLine.vue +1 -1
  46. package/core/client/components/time/KDate.vue +1 -2
  47. package/core/client/components/time/KDateTime.vue +11 -11
  48. package/core/client/components/time/KTime.vue +1 -1
  49. package/core/client/composables/collection.js +33 -8
  50. package/core/client/composables/errors.js +1 -1
  51. package/core/client/composables/layout.js +9 -9
  52. package/core/client/configurations.js +50 -0
  53. package/core/client/exporter.js +1 -1
  54. package/core/client/i18n/core_en.json +6 -39
  55. package/core/client/i18n/core_fr.json +6 -39
  56. package/core/client/index.js +2 -0
  57. package/core/client/layout.js +8 -8
  58. package/core/client/mixins/mixin.base-activity.js +5 -2
  59. package/core/client/mixins/mixin.base-field.js +3 -3
  60. package/core/client/search.js +2 -1
  61. package/core/client/utils/utils.collection.js +8 -8
  62. package/core/client/utils/utils.items.js +4 -0
  63. package/core/client/utils/utils.push.js +3 -3
  64. package/core/client/utils/utils.session.js +7 -5
  65. package/core/client/utils/utils.shapes.js +38 -7
  66. package/core/client/utils/utils.time.js +21 -22
  67. package/core/common/schemas/users.update-profile.json +3 -2
  68. package/coverage/core/api/application.js.html +392 -398
  69. package/coverage/core/api/authentication.js.html +352 -187
  70. package/coverage/core/api/db.js.html +165 -126
  71. package/coverage/core/api/hooks/hooks.authentication.js.html +22 -196
  72. package/coverage/core/api/hooks/hooks.authorisations.js.html +383 -662
  73. package/coverage/core/api/hooks/hooks.logger.js.html +41 -41
  74. package/coverage/core/api/hooks/hooks.model.js.html +113 -101
  75. package/coverage/core/api/hooks/hooks.push.js.html +124 -97
  76. package/coverage/core/api/hooks/hooks.query.js.html +292 -217
  77. package/coverage/core/api/hooks/hooks.schemas.js.html +123 -123
  78. package/coverage/core/api/hooks/hooks.service.js.html +1 -1
  79. package/coverage/core/api/hooks/hooks.storage.js.html +1 -1
  80. package/coverage/core/api/hooks/{hooks.groups.js.html → hooks.tags.js.html} +100 -76
  81. package/coverage/core/api/hooks/hooks.users.js.html +255 -447
  82. package/coverage/core/api/hooks/index.html +107 -122
  83. package/coverage/core/api/hooks/index.js.html +4 -10
  84. package/coverage/core/api/index.html +46 -61
  85. package/coverage/core/api/index.js.html +9 -9
  86. package/coverage/core/api/marshall.js.html +9 -9
  87. package/coverage/core/api/models/{organisations.model.mongodb.js.html → configurations.model.mongodb.js.html} +10 -7
  88. package/coverage/core/api/models/index.html +35 -50
  89. package/coverage/core/api/models/messages.model.mongodb.js.html +39 -27
  90. package/coverage/core/api/models/tags.model.mongodb.js.html +26 -32
  91. package/coverage/core/api/models/users.model.mongodb.js.html +10 -10
  92. package/coverage/core/api/services/account/account.hooks.js.html +5 -5
  93. package/coverage/core/api/services/account/account.service.js.html +127 -127
  94. package/coverage/core/api/services/account/index.html +22 -22
  95. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  96. package/coverage/core/api/services/authorisations/authorisations.service.js.html +213 -222
  97. package/coverage/core/api/services/authorisations/index.html +21 -21
  98. package/coverage/core/api/services/{organisations/organisations.hooks.js.html → configurations/configurations.hooks.js.html} +16 -10
  99. package/coverage/core/api/services/{groups → configurations}/index.html +8 -8
  100. package/coverage/core/api/services/databases/databases.hooks.js.html +1 -1
  101. package/coverage/core/api/services/databases/databases.service.js.html +1 -1
  102. package/coverage/core/api/services/databases/index.html +1 -1
  103. package/coverage/core/api/services/import-export/import-export.hooks.js.html +76 -76
  104. package/coverage/core/api/services/import-export/import-export.service.js.html +32 -32
  105. package/coverage/core/api/services/import-export/index.html +32 -32
  106. package/coverage/core/api/services/index.html +21 -21
  107. package/coverage/core/api/services/index.js.html +313 -142
  108. package/coverage/core/api/services/mailer/index.html +32 -32
  109. package/coverage/core/api/services/mailer/mailer.hooks.js.html +80 -80
  110. package/coverage/core/api/services/mailer/mailer.service.js.html +32 -32
  111. package/coverage/core/api/services/messages/index.html +21 -21
  112. package/coverage/core/api/services/messages/messages.hooks.js.html +112 -76
  113. package/coverage/core/api/services/push/index.html +32 -32
  114. package/coverage/core/api/services/push/push.hooks.js.html +80 -80
  115. package/coverage/core/api/services/push/push.service.js.html +34 -34
  116. package/coverage/core/api/services/storage/index.html +29 -29
  117. package/coverage/core/api/services/storage/storage.hooks.js.html +80 -80
  118. package/coverage/core/api/services/storage/storage.service.js.html +29 -29
  119. package/coverage/core/api/services/tags/index.html +21 -21
  120. package/coverage/core/api/services/tags/tags.hooks.js.html +119 -71
  121. package/coverage/core/api/services/users/index.html +27 -12
  122. package/coverage/core/api/services/users/users.hooks.js.html +14 -11
  123. package/coverage/core/api/services/users/users.service.js.html +100 -0
  124. package/coverage/core/common/errors.js.html +1 -1
  125. package/coverage/core/common/index.html +42 -27
  126. package/coverage/core/common/index.js.html +1 -1
  127. package/coverage/core/common/permissions.js.html +166 -472
  128. package/coverage/core/common/schema.js.html +4 -4
  129. package/coverage/core/common/utils.js.html +31 -25
  130. package/coverage/core/common/utils.offline.js.html +199 -0
  131. package/coverage/index.html +192 -192
  132. package/coverage/lcov-report/core/api/application.js.html +392 -398
  133. package/coverage/lcov-report/core/api/authentication.js.html +352 -187
  134. package/coverage/lcov-report/core/api/db.js.html +165 -126
  135. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +22 -196
  136. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +383 -662
  137. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +41 -41
  138. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +113 -101
  139. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +124 -97
  140. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +292 -217
  141. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +123 -123
  142. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +1 -1
  143. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +1 -1
  144. package/coverage/lcov-report/core/api/hooks/{hooks.groups.js.html → hooks.tags.js.html} +100 -76
  145. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +255 -447
  146. package/coverage/lcov-report/core/api/hooks/index.html +107 -122
  147. package/coverage/lcov-report/core/api/hooks/index.js.html +4 -10
  148. package/coverage/lcov-report/core/api/index.html +46 -61
  149. package/coverage/lcov-report/core/api/index.js.html +9 -9
  150. package/coverage/lcov-report/core/api/marshall.js.html +9 -9
  151. package/coverage/lcov-report/core/api/models/{organisations.model.mongodb.js.html → configurations.model.mongodb.js.html} +10 -7
  152. package/coverage/lcov-report/core/api/models/index.html +35 -50
  153. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +39 -27
  154. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +26 -32
  155. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +10 -10
  156. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +5 -5
  157. package/coverage/lcov-report/core/api/services/account/account.service.js.html +127 -127
  158. package/coverage/lcov-report/core/api/services/account/index.html +22 -22
  159. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  160. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +213 -222
  161. package/coverage/lcov-report/core/api/services/authorisations/index.html +21 -21
  162. package/coverage/lcov-report/core/api/services/{groups/groups.hooks.js.html → configurations/configurations.hooks.js.html} +16 -10
  163. package/coverage/lcov-report/core/api/services/{groups → configurations}/index.html +8 -8
  164. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +1 -1
  165. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +1 -1
  166. package/coverage/lcov-report/core/api/services/databases/index.html +1 -1
  167. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +76 -76
  168. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +32 -32
  169. package/coverage/lcov-report/core/api/services/import-export/index.html +32 -32
  170. package/coverage/lcov-report/core/api/services/index.html +21 -21
  171. package/coverage/lcov-report/core/api/services/index.js.html +313 -142
  172. package/coverage/lcov-report/core/api/services/mailer/index.html +32 -32
  173. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +80 -80
  174. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +32 -32
  175. package/coverage/lcov-report/core/api/services/messages/index.html +21 -21
  176. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +112 -76
  177. package/coverage/lcov-report/core/api/services/push/index.html +32 -32
  178. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +80 -80
  179. package/coverage/lcov-report/core/api/services/push/push.service.js.html +34 -34
  180. package/coverage/lcov-report/core/api/services/storage/index.html +29 -29
  181. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +80 -80
  182. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +29 -29
  183. package/coverage/lcov-report/core/api/services/tags/index.html +21 -21
  184. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +119 -71
  185. package/coverage/lcov-report/core/api/services/users/index.html +27 -12
  186. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +14 -11
  187. package/coverage/lcov-report/core/api/services/users/users.service.js.html +100 -0
  188. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  189. package/coverage/lcov-report/core/common/index.html +42 -27
  190. package/coverage/lcov-report/core/common/index.js.html +1 -1
  191. package/coverage/lcov-report/core/common/permissions.js.html +166 -472
  192. package/coverage/lcov-report/core/common/schema.js.html +4 -4
  193. package/coverage/lcov-report/core/common/utils.js.html +31 -25
  194. package/coverage/lcov-report/core/common/utils.offline.js.html +199 -0
  195. package/coverage/lcov-report/index.html +192 -192
  196. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +169 -31
  197. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +1 -1
  198. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +215 -35
  199. package/coverage/lcov-report/map/api/hooks/index.html +7 -7
  200. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  201. package/coverage/lcov-report/map/api/index.html +1 -1
  202. package/coverage/lcov-report/map/api/index.js.html +1 -1
  203. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  204. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  205. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +82 -7
  206. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +1 -1
  207. package/coverage/lcov-report/map/api/models/index.html +22 -7
  208. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +1 -1
  209. package/coverage/lcov-report/{core/api/models/groups.model.mongodb.js.html → map/api/models/styles.model.mongodb.js.html} +10 -7
  210. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  211. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  212. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  213. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +39 -12
  214. package/coverage/lcov-report/map/api/services/catalog/index.html +5 -5
  215. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  216. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  217. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +86 -11
  218. package/coverage/lcov-report/map/api/services/features/features.service.js.html +307 -4
  219. package/coverage/lcov-report/map/api/services/features/index.html +7 -7
  220. package/coverage/lcov-report/map/api/services/index.html +5 -5
  221. package/coverage/lcov-report/map/api/services/index.js.html +326 -50
  222. package/coverage/lcov-report/map/api/services/projects/index.html +1 -1
  223. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +1 -1
  224. package/coverage/{core/api/services/organisations → lcov-report/map/api/services/styles}/index.html +10 -25
  225. package/coverage/lcov-report/{core/api/services/organisations/organisations.hooks.js.html → map/api/services/styles/styles.hooks.js.html} +45 -12
  226. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  227. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  228. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +7 -10
  229. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  230. package/coverage/lcov-report/map/common/index.html +19 -19
  231. package/coverage/lcov-report/map/common/index.js.html +1 -1
  232. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  233. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  234. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  235. package/coverage/lcov-report/map/common/opendap-utils.js.html +4 -7
  236. package/coverage/lcov-report/map/common/permissions.js.html +10 -4
  237. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  238. package/coverage/lcov-report/map/common/tms-utils.js.html +9 -12
  239. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +3 -3
  240. package/coverage/lcov-report/map/common/wcs-utils.js.html +12 -15
  241. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +2 -2
  242. package/coverage/lcov-report/map/common/wfs-utils.js.html +14 -17
  243. package/coverage/lcov-report/map/common/wms-utils.js.html +30 -12
  244. package/coverage/lcov-report/map/common/wmts-utils.js.html +10 -13
  245. package/coverage/lcov.info +4157 -3816
  246. package/coverage/map/api/hooks/hooks.catalog.js.html +169 -31
  247. package/coverage/map/api/hooks/hooks.features.js.html +1 -1
  248. package/coverage/map/api/hooks/hooks.query.js.html +215 -35
  249. package/coverage/map/api/hooks/index.html +7 -7
  250. package/coverage/map/api/hooks/index.js.html +1 -1
  251. package/coverage/map/api/index.html +1 -1
  252. package/coverage/map/api/index.js.html +1 -1
  253. package/coverage/map/api/marshall.js.html +1 -1
  254. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  255. package/coverage/map/api/models/catalog.model.mongodb.js.html +82 -7
  256. package/coverage/map/api/models/features.model.mongodb.js.html +1 -1
  257. package/coverage/map/api/models/index.html +22 -7
  258. package/coverage/map/api/models/projects.model.mongodb.js.html +1 -1
  259. package/coverage/{core/api/models/groups.model.mongodb.js.html → map/api/models/styles.model.mongodb.js.html} +10 -7
  260. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  261. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  262. package/coverage/map/api/services/alerts/index.html +1 -1
  263. package/coverage/map/api/services/catalog/catalog.hooks.js.html +39 -12
  264. package/coverage/map/api/services/catalog/index.html +5 -5
  265. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  266. package/coverage/map/api/services/daptiles/index.html +1 -1
  267. package/coverage/map/api/services/features/features.hooks.js.html +86 -11
  268. package/coverage/map/api/services/features/features.service.js.html +307 -4
  269. package/coverage/map/api/services/features/index.html +7 -7
  270. package/coverage/map/api/services/index.html +5 -5
  271. package/coverage/map/api/services/index.js.html +326 -50
  272. package/coverage/map/api/services/projects/index.html +1 -1
  273. package/coverage/map/api/services/projects/projects.hooks.js.html +1 -1
  274. package/coverage/{lcov-report/core/api/services/organisations → map/api/services/styles}/index.html +10 -25
  275. package/coverage/{core/api/services/groups/groups.hooks.js.html → map/api/services/styles/styles.hooks.js.html} +45 -12
  276. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  277. package/coverage/map/common/errors.js.html +1 -1
  278. package/coverage/map/common/geotiff-grid-source.js.html +7 -10
  279. package/coverage/map/common/grid.js.html +1 -1
  280. package/coverage/map/common/index.html +19 -19
  281. package/coverage/map/common/index.js.html +1 -1
  282. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  283. package/coverage/map/common/moment-utils.js.html +1 -1
  284. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  285. package/coverage/map/common/opendap-utils.js.html +4 -7
  286. package/coverage/map/common/permissions.js.html +10 -4
  287. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  288. package/coverage/map/common/tms-utils.js.html +9 -12
  289. package/coverage/map/common/wcs-grid-source.js.html +3 -3
  290. package/coverage/map/common/wcs-utils.js.html +12 -15
  291. package/coverage/map/common/weacast-grid-source.js.html +2 -2
  292. package/coverage/map/common/wfs-utils.js.html +14 -17
  293. package/coverage/map/common/wms-utils.js.html +30 -12
  294. package/coverage/map/common/wmts-utils.js.html +10 -13
  295. package/coverage/tmp/coverage-1028514-1773134124472-0.json +1 -0
  296. package/coverage/tmp/coverage-1028526-1773134124448-0.json +1 -0
  297. package/coverage/tmp/coverage-1028537-1773134124431-0.json +1 -0
  298. package/coverage/tmp/coverage-1028549-1773134124401-0.json +1 -0
  299. package/coverage/tmp/coverage-1028556-1773134124353-0.json +1 -0
  300. package/extras/configs/widgets.top.js +3 -3
  301. package/extras/tests/core/collection.mjs +2 -9
  302. package/extras/tours/pane.top.js +0 -9
  303. package/map/api/hooks/hooks.catalog.js +18 -4
  304. package/map/api/services/catalog/catalog.hooks.js +3 -0
  305. package/map/api/services/features/features.hooks.js +3 -1
  306. package/map/api/services/index.js +2 -6
  307. package/map/api/services/styles/styles.hooks.js +6 -1
  308. package/map/client/components/KFeatureActionButton.vue +9 -3
  309. package/map/client/components/KFeaturesFilterManager.vue +5 -5
  310. package/map/client/components/KFilterCondition.vue +17 -10
  311. package/map/client/components/KLayerEditor.vue +49 -39
  312. package/map/client/components/KMeasureTool.vue +7 -1
  313. package/map/client/components/KTimezoneMap.vue +29 -9
  314. package/map/client/components/catalog/KLayersPanel.vue +26 -16
  315. package/map/client/components/catalog/KLayersSelector.vue +13 -2
  316. package/map/client/components/catalog/KViewsPanel.vue +5 -4
  317. package/map/client/components/form/KSelectLayersField.vue +28 -17
  318. package/map/client/components/form/KSelectViewsField.vue +18 -9
  319. package/map/client/components/form/KTimezoneField.vue +1 -2
  320. package/map/client/components/legend/KVariablesLegend.vue +10 -1
  321. package/map/client/components/location/KLocationCardSection.vue +7 -2
  322. package/map/client/components/location/KLocationMap.vue +31 -7
  323. package/map/client/components/selection/KSelectedLayerFeatures.vue +2 -2
  324. package/map/client/components/stickies/KZoomControl.vue +1 -1
  325. package/map/client/components/styles/KStyleManager.vue +4 -1
  326. package/map/client/components/widget/KTimeSeries.vue +174 -497
  327. package/map/client/components/widget/KTimeSeriesSelector.vue +72 -0
  328. package/map/client/components/widget/KTimeSeriesToolbar.vue +83 -0
  329. package/map/client/composables/catalog.js +6 -10
  330. package/map/client/composables/highlight.js +12 -9
  331. package/map/client/composables/project.js +1 -1
  332. package/map/client/composables/selection.js +8 -7
  333. package/map/client/composables/weather.js +9 -2
  334. package/map/client/geolocation.js +8 -5
  335. package/map/client/i18n/map_en.json +11 -10
  336. package/map/client/i18n/map_fr.json +10 -9
  337. package/map/client/leaflet/TiledFeatureLayer.js +85 -82
  338. package/map/client/leaflet/utils/utils.geojson.js +3 -3
  339. package/map/client/mixins/globe/mixin.base-globe.js +15 -6
  340. package/map/client/mixins/globe/mixin.geojson-layers.js +27 -18
  341. package/map/client/mixins/map/mixin.edit-layers.js +9 -1
  342. package/map/client/mixins/map/mixin.pmtiles-layers.js +118 -29
  343. package/map/client/mixins/map/mixin.tiled-mesh-layers.js +12 -5
  344. package/map/client/mixins/map/mixin.tiled-wind-layers.js +19 -10
  345. package/map/client/mixins/mixin.activity.js +23 -30
  346. package/map/client/mixins/mixin.feature-selection.js +41 -5
  347. package/map/client/planets.js +1 -1
  348. package/map/client/readers/reader.kml.js +2 -3
  349. package/map/client/utils/utils.catalog.js +36 -10
  350. package/map/client/utils/utils.layers.js +39 -8
  351. package/map/client/utils/utils.project.js +4 -0
  352. package/map/client/utils/utils.style.js +37 -7
  353. package/map/client/utils/utils.time-series.js +215 -6
  354. package/map/common/schemas/catalog.update.json +1 -1
  355. package/map/common/weacast-grid-source.js +1 -1
  356. package/package.json +3 -3
  357. package/scripts/kash/CHANGELOG.md +0 -4
  358. package/scripts/kash/README.md +0 -9
  359. package/scripts/kash/kash.sh +45 -40
  360. package/scripts/kash/scripts/run_tests.sh +1 -4
  361. package/test/api/core/authentication.test.js +9 -4
  362. package/test/api/core/config/default.cjs +1 -0
  363. package/test/api/core/hooks.test.js +6 -0
  364. package/test/api/core/index.test.js +43 -18
  365. package/test/api/core/push.test.js +8 -8
  366. package/test/api/core/test-log-2026-03-10.log +60 -0
  367. package/test/api/core/users.test.js +384 -0
  368. package/test/api/map/grid-sources.test.js +1 -1
  369. package/test/api/map/test-log-2026-03-10.log +56 -0
  370. package/vite/package.json +11 -2
  371. package/vite/test/core/composables.test.js +77 -0
  372. package/vite/vitest.config.js +13 -0
  373. package/vite/yarn.lock +1096 -18
  374. package/.vscode/settings.json +0 -5
  375. package/core/client/components/account/KAccount.vue +0 -68
  376. package/core/client/components/account/KDeleteAccountManager.vue +0 -62
  377. package/core/client/components/account/KEmailManager.vue +0 -128
  378. package/core/client/components/account/KPasswordManager.vue +0 -90
  379. package/core/client/components/account/KVerifyEmailManager.vue +0 -105
  380. package/core/client/components/collection/KColumn.vue +0 -227
  381. package/core/client/components/collection/KHistory.vue +0 -113
  382. package/core/client/components/collection/KHistoryEntry.vue +0 -109
  383. package/coverage/core/api/hooks/hooks.organisations.js.html +0 -541
  384. package/coverage/core/api/services/organisations/organisations.service.js.html +0 -343
  385. package/coverage/core/api/utils.js.html +0 -118
  386. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +0 -541
  387. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +0 -343
  388. package/coverage/lcov-report/core/api/utils.js.html +0 -118
  389. package/coverage/tmp/coverage-151166-1723543324307-0.json +0 -1
  390. package/coverage/tmp/coverage-151178-1723543324283-0.json +0 -1
  391. package/coverage/tmp/coverage-151189-1723543324271-0.json +0 -1
  392. package/coverage/tmp/coverage-151201-1723543324248-0.json +0 -1
  393. package/coverage/tmp/coverage-151208-1723543324227-0.json +0 -1
  394. package/scripts/kash/LICENSE +0 -21
  395. package/test/api/core/test-log-2024-04-22.log +0 -84
  396. package/test/api/core/test-log-2024-04-23.log +0 -23
  397. package/test/api/core/test-log-2024-08-13.log +0 -3
  398. package/test/api/map/test-log-2025-03-08.log +0 -0
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">49.74% </span>
26
+ <span class="strong">60.7% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>296/595</span>
28
+ <span class='fraction'>360/593</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">54.71% </span>
33
+ <span class="strong">56% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>29/53</span>
35
+ <span class='fraction'>42/75</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">56.52% </span>
40
+ <span class="strong">60.86% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>13/23</span>
42
+ <span class='fraction'>14/23</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">49.74% </span>
47
+ <span class="strong">60.7% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>296/595</span>
49
+ <span class='fraction'>360/593</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line low'></div>
64
+ <div class='status-line medium'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -656,11 +656,7 @@
656
656
  <a name='L591'></a><a href='#L591'>591</a>
657
657
  <a name='L592'></a><a href='#L592'>592</a>
658
658
  <a name='L593'></a><a href='#L593'>593</a>
659
- <a name='L594'></a><a href='#L594'>594</a>
660
- <a name='L595'></a><a href='#L595'>595</a>
661
- <a name='L596'></a><a href='#L596'>596</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
662
- <span class="cline-any cline-yes">1x</span>
663
- <span class="cline-any cline-yes">1x</span>
659
+ <a name='L594'></a><a href='#L594'>594</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
664
660
  <span class="cline-any cline-yes">1x</span>
665
661
  <span class="cline-any cline-yes">1x</span>
666
662
  <span class="cline-any cline-yes">1x</span>
@@ -699,65 +695,65 @@
699
695
  <span class="cline-any cline-no">&nbsp;</span>
700
696
  <span class="cline-any cline-yes">1x</span>
701
697
  <span class="cline-any cline-yes">1x</span>
702
- <span class="cline-any cline-yes">21x</span>
703
- <span class="cline-any cline-yes">21x</span>
704
- <span class="cline-any cline-yes">21x</span>
705
- <span class="cline-any cline-no">&nbsp;</span>
706
- <span class="cline-any cline-no">&nbsp;</span>
707
- <span class="cline-any cline-no">&nbsp;</span>
708
- <span class="cline-any cline-yes">21x</span>
709
- <span class="cline-any cline-yes">21x</span>
710
- <span class="cline-any cline-yes">21x</span>
711
- <span class="cline-any cline-yes">21x</span>
712
- <span class="cline-any cline-yes">21x</span>
713
- <span class="cline-any cline-yes">21x</span>
714
- <span class="cline-any cline-yes">21x</span>
715
- <span class="cline-any cline-yes">21x</span>
716
- <span class="cline-any cline-yes">21x</span>
717
- <span class="cline-any cline-yes">21x</span>
718
- <span class="cline-any cline-yes">21x</span>
719
- <span class="cline-any cline-yes">21x</span>
720
- <span class="cline-any cline-yes">21x</span>
721
- <span class="cline-any cline-yes">21x</span>
722
- <span class="cline-any cline-yes">21x</span>
723
- <span class="cline-any cline-yes">21x</span>
724
- <span class="cline-any cline-yes">21x</span>
725
- <span class="cline-any cline-yes">21x</span>
726
- <span class="cline-any cline-yes">21x</span>
727
- <span class="cline-any cline-yes">21x</span>
728
- <span class="cline-any cline-yes">21x</span>
729
- <span class="cline-any cline-yes">21x</span>
730
- <span class="cline-any cline-yes">21x</span>
731
- <span class="cline-any cline-yes">21x</span>
732
- <span class="cline-any cline-yes">14x</span>
733
- <span class="cline-any cline-yes">21x</span>
734
- <span class="cline-any cline-yes">21x</span>
735
- <span class="cline-any cline-yes">21x</span>
736
- <span class="cline-any cline-yes">21x</span>
737
- <span class="cline-any cline-yes">21x</span>
738
- <span class="cline-any cline-yes">7x</span>
739
- <span class="cline-any cline-yes">7x</span>
740
- <span class="cline-any cline-yes">7x</span>
741
- <span class="cline-any cline-yes">7x</span>
742
- <span class="cline-any cline-yes">7x</span>
743
- <span class="cline-any cline-yes">7x</span>
744
- <span class="cline-any cline-yes">21x</span>
745
- <span class="cline-any cline-no">&nbsp;</span>
746
- <span class="cline-any cline-no">&nbsp;</span>
747
- <span class="cline-any cline-yes">21x</span>
748
- <span class="cline-any cline-yes">21x</span>
749
- <span class="cline-any cline-yes">21x</span>
698
+ <span class="cline-any cline-yes">74x</span>
699
+ <span class="cline-any cline-yes">74x</span>
700
+ <span class="cline-any cline-yes">74x</span>
701
+ <span class="cline-any cline-no">&nbsp;</span>
702
+ <span class="cline-any cline-no">&nbsp;</span>
703
+ <span class="cline-any cline-no">&nbsp;</span>
704
+ <span class="cline-any cline-yes">74x</span>
705
+ <span class="cline-any cline-yes">74x</span>
706
+ <span class="cline-any cline-yes">74x</span>
707
+ <span class="cline-any cline-yes">74x</span>
708
+ <span class="cline-any cline-yes">74x</span>
709
+ <span class="cline-any cline-yes">74x</span>
710
+ <span class="cline-any cline-yes">74x</span>
711
+ <span class="cline-any cline-yes">74x</span>
712
+ <span class="cline-any cline-yes">74x</span>
713
+ <span class="cline-any cline-yes">74x</span>
714
+ <span class="cline-any cline-yes">74x</span>
715
+ <span class="cline-any cline-yes">74x</span>
716
+ <span class="cline-any cline-yes">74x</span>
717
+ <span class="cline-any cline-yes">74x</span>
718
+ <span class="cline-any cline-yes">74x</span>
719
+ <span class="cline-any cline-yes">74x</span>
720
+ <span class="cline-any cline-yes">74x</span>
721
+ <span class="cline-any cline-yes">74x</span>
722
+ <span class="cline-any cline-yes">74x</span>
723
+ <span class="cline-any cline-yes">74x</span>
724
+ <span class="cline-any cline-yes">74x</span>
725
+ <span class="cline-any cline-yes">74x</span>
726
+ <span class="cline-any cline-yes">74x</span>
727
+ <span class="cline-any cline-yes">74x</span>
728
+ <span class="cline-any cline-yes">29x</span>
729
+ <span class="cline-any cline-yes">74x</span>
730
+ <span class="cline-any cline-yes">74x</span>
731
+ <span class="cline-any cline-yes">74x</span>
732
+ <span class="cline-any cline-yes">74x</span>
733
+ <span class="cline-any cline-yes">74x</span>
734
+ <span class="cline-any cline-yes">15x</span>
735
+ <span class="cline-any cline-yes">15x</span>
736
+ <span class="cline-any cline-yes">10x</span>
737
+ <span class="cline-any cline-yes">10x</span>
738
+ <span class="cline-any cline-yes">15x</span>
739
+ <span class="cline-any cline-yes">15x</span>
740
+ <span class="cline-any cline-yes">74x</span>
741
+ <span class="cline-any cline-no">&nbsp;</span>
742
+ <span class="cline-any cline-no">&nbsp;</span>
743
+ <span class="cline-any cline-yes">74x</span>
744
+ <span class="cline-any cline-yes">74x</span>
745
+ <span class="cline-any cline-yes">74x</span>
750
746
  <span class="cline-any cline-yes">1x</span>
751
747
  <span class="cline-any cline-yes">1x</span>
752
- <span class="cline-any cline-yes">21x</span>
753
- <span class="cline-any cline-yes">21x</span>
754
- <span class="cline-any cline-yes">21x</span>
755
- <span class="cline-any cline-yes">21x</span>
756
- <span class="cline-any cline-yes">21x</span>
757
- <span class="cline-any cline-yes">21x</span>
758
- <span class="cline-any cline-yes">21x</span>
759
- <span class="cline-any cline-yes">21x</span>
760
- <span class="cline-any cline-yes">21x</span>
748
+ <span class="cline-any cline-yes">73x</span>
749
+ <span class="cline-any cline-yes">73x</span>
750
+ <span class="cline-any cline-yes">73x</span>
751
+ <span class="cline-any cline-yes">73x</span>
752
+ <span class="cline-any cline-yes">73x</span>
753
+ <span class="cline-any cline-yes">73x</span>
754
+ <span class="cline-any cline-yes">73x</span>
755
+ <span class="cline-any cline-yes">73x</span>
756
+ <span class="cline-any cline-yes">73x</span>
761
757
  <span class="cline-any cline-no">&nbsp;</span>
762
758
  <span class="cline-any cline-no">&nbsp;</span>
763
759
  <span class="cline-any cline-no">&nbsp;</span>
@@ -765,11 +761,11 @@
765
761
  <span class="cline-any cline-no">&nbsp;</span>
766
762
  <span class="cline-any cline-no">&nbsp;</span>
767
763
  <span class="cline-any cline-no">&nbsp;</span>
768
- <span class="cline-any cline-yes">21x</span>
769
- <span class="cline-any cline-yes">21x</span>
770
- <span class="cline-any cline-yes">21x</span>
771
- <span class="cline-any cline-yes">21x</span>
772
- <span class="cline-any cline-yes">21x</span>
764
+ <span class="cline-any cline-yes">73x</span>
765
+ <span class="cline-any cline-yes">73x</span>
766
+ <span class="cline-any cline-yes">73x</span>
767
+ <span class="cline-any cline-yes">73x</span>
768
+ <span class="cline-any cline-yes">73x</span>
773
769
  <span class="cline-any cline-no">&nbsp;</span>
774
770
  <span class="cline-any cline-no">&nbsp;</span>
775
771
  <span class="cline-any cline-no">&nbsp;</span>
@@ -777,7 +773,7 @@
777
773
  <span class="cline-any cline-no">&nbsp;</span>
778
774
  <span class="cline-any cline-no">&nbsp;</span>
779
775
  <span class="cline-any cline-no">&nbsp;</span>
780
- <span class="cline-any cline-yes">21x</span>
776
+ <span class="cline-any cline-yes">73x</span>
781
777
  <span class="cline-any cline-no">&nbsp;</span>
782
778
  <span class="cline-any cline-no">&nbsp;</span>
783
779
  <span class="cline-any cline-no">&nbsp;</span>
@@ -785,9 +781,9 @@
785
781
  <span class="cline-any cline-no">&nbsp;</span>
786
782
  <span class="cline-any cline-no">&nbsp;</span>
787
783
  <span class="cline-any cline-no">&nbsp;</span>
788
- <span class="cline-any cline-yes">21x</span>
789
- <span class="cline-any cline-yes">21x</span>
790
- <span class="cline-any cline-yes">21x</span>
784
+ <span class="cline-any cline-yes">73x</span>
785
+ <span class="cline-any cline-yes">73x</span>
786
+ <span class="cline-any cline-yes">73x</span>
791
787
  <span class="cline-any cline-yes">1x</span>
792
788
  <span class="cline-any cline-yes">1x</span>
793
789
  <span class="cline-any cline-no">&nbsp;</span>
@@ -824,39 +820,39 @@
824
820
  <span class="cline-any cline-no">&nbsp;</span>
825
821
  <span class="cline-any cline-no">&nbsp;</span>
826
822
  <span class="cline-any cline-yes">1x</span>
823
+ <span class="cline-any cline-yes">73x</span>
824
+ <span class="cline-any cline-yes">73x</span>
825
+ <span class="cline-any cline-yes">73x</span>
826
+ <span class="cline-any cline-yes">73x</span>
827
+ <span class="cline-any cline-yes">73x</span>
828
+ <span class="cline-any cline-yes">73x</span>
829
+ <span class="cline-any cline-yes">73x</span>
830
+ <span class="cline-any cline-yes">73x</span>
831
+ <span class="cline-any cline-yes">73x</span>
832
+ <span class="cline-any cline-yes">73x</span>
833
+ <span class="cline-any cline-yes">73x</span>
834
+ <span class="cline-any cline-yes">73x</span>
835
+ <span class="cline-any cline-yes">73x</span>
836
+ <span class="cline-any cline-yes">73x</span>
837
+ <span class="cline-any cline-yes">73x</span>
838
+ <span class="cline-any cline-yes">73x</span>
839
+ <span class="cline-any cline-yes">73x</span>
840
+ <span class="cline-any cline-yes">73x</span>
841
+ <span class="cline-any cline-yes">73x</span>
842
+ <span class="cline-any cline-yes">73x</span>
843
+ <span class="cline-any cline-yes">73x</span>
844
+ <span class="cline-any cline-yes">73x</span>
845
+ <span class="cline-any cline-yes">73x</span>
827
846
  <span class="cline-any cline-yes">28x</span>
828
847
  <span class="cline-any cline-yes">28x</span>
829
848
  <span class="cline-any cline-yes">28x</span>
849
+ <span class="cline-any cline-yes">19x</span>
850
+ <span class="cline-any cline-yes">19x</span>
851
+ <span class="cline-any cline-yes">19x</span>
852
+ <span class="cline-any cline-yes">19x</span>
853
+ <span class="cline-any cline-yes">19x</span>
830
854
  <span class="cline-any cline-yes">28x</span>
831
- <span class="cline-any cline-yes">28x</span>
832
- <span class="cline-any cline-yes">28x</span>
833
- <span class="cline-any cline-yes">28x</span>
834
- <span class="cline-any cline-yes">28x</span>
835
- <span class="cline-any cline-yes">28x</span>
836
- <span class="cline-any cline-yes">28x</span>
837
- <span class="cline-any cline-yes">28x</span>
838
- <span class="cline-any cline-yes">28x</span>
839
- <span class="cline-any cline-yes">28x</span>
840
- <span class="cline-any cline-yes">28x</span>
841
- <span class="cline-any cline-yes">28x</span>
842
- <span class="cline-any cline-yes">28x</span>
843
- <span class="cline-any cline-yes">28x</span>
844
- <span class="cline-any cline-yes">28x</span>
845
- <span class="cline-any cline-yes">28x</span>
846
- <span class="cline-any cline-yes">28x</span>
847
- <span class="cline-any cline-yes">28x</span>
848
- <span class="cline-any cline-yes">28x</span>
849
- <span class="cline-any cline-yes">28x</span>
850
- <span class="cline-any cline-yes">14x</span>
851
- <span class="cline-any cline-yes">14x</span>
852
- <span class="cline-any cline-yes">14x</span>
853
- <span class="cline-any cline-yes">7x</span>
854
- <span class="cline-any cline-yes">7x</span>
855
- <span class="cline-any cline-yes">7x</span>
856
- <span class="cline-any cline-yes">7x</span>
857
- <span class="cline-any cline-yes">7x</span>
858
- <span class="cline-any cline-yes">14x</span>
859
- <span class="cline-any cline-yes">28x</span>
855
+ <span class="cline-any cline-yes">73x</span>
860
856
  <span class="cline-any cline-no">&nbsp;</span>
861
857
  <span class="cline-any cline-no">&nbsp;</span>
862
858
  <span class="cline-any cline-no">&nbsp;</span>
@@ -864,40 +860,40 @@
864
860
  <span class="cline-any cline-no">&nbsp;</span>
865
861
  <span class="cline-any cline-no">&nbsp;</span>
866
862
  <span class="cline-any cline-no">&nbsp;</span>
867
- <span class="cline-any cline-yes">28x</span>
868
- <span class="cline-any cline-yes">28x</span>
869
- <span class="cline-any cline-yes">28x</span>
870
- <span class="cline-any cline-yes">28x</span>
871
- <span class="cline-any cline-yes">7x</span>
872
- <span class="cline-any cline-yes">7x</span>
873
- <span class="cline-any cline-yes">28x</span>
874
- <span class="cline-any cline-no">&nbsp;</span>
875
- <span class="cline-any cline-yes">21x</span>
876
- <span class="cline-any cline-yes">21x</span>
877
- <span class="cline-any cline-yes">21x</span>
878
- <span class="cline-any cline-yes">21x</span>
879
- <span class="cline-any cline-yes">21x</span>
880
- <span class="cline-any cline-yes">21x</span>
881
- <span class="cline-any cline-yes">14x</span>
882
- <span class="cline-any cline-yes">14x</span>
883
- <span class="cline-any cline-yes">14x</span>
884
- <span class="cline-any cline-yes">21x</span>
885
- <span class="cline-any cline-yes">21x</span>
886
- <span class="cline-any cline-yes">21x</span>
887
- <span class="cline-any cline-yes">28x</span>
888
- <span class="cline-any cline-yes">7x</span>
889
- <span class="cline-any cline-yes">7x</span>
890
- <span class="cline-any cline-yes">7x</span>
891
- <span class="cline-any cline-yes">7x</span>
892
- <span class="cline-any cline-no">&nbsp;</span>
893
- <span class="cline-any cline-no">&nbsp;</span>
894
- <span class="cline-any cline-no">&nbsp;</span>
895
- <span class="cline-any cline-no">&nbsp;</span>
896
- <span class="cline-any cline-no">&nbsp;</span>
863
+ <span class="cline-any cline-yes">73x</span>
864
+ <span class="cline-any cline-yes">73x</span>
865
+ <span class="cline-any cline-yes">73x</span>
866
+ <span class="cline-any cline-yes">73x</span>
867
+ <span class="cline-any cline-yes">19x</span>
868
+ <span class="cline-any cline-yes">19x</span>
869
+ <span class="cline-any cline-yes">73x</span>
897
870
  <span class="cline-any cline-no">&nbsp;</span>
871
+ <span class="cline-any cline-yes">54x</span>
872
+ <span class="cline-any cline-yes">54x</span>
873
+ <span class="cline-any cline-yes">54x</span>
874
+ <span class="cline-any cline-yes">54x</span>
875
+ <span class="cline-any cline-yes">54x</span>
876
+ <span class="cline-any cline-yes">54x</span>
877
+ <span class="cline-any cline-yes">45x</span>
878
+ <span class="cline-any cline-yes">45x</span>
879
+ <span class="cline-any cline-yes">54x</span>
880
+ <span class="cline-any cline-yes">54x</span>
881
+ <span class="cline-any cline-yes">54x</span>
882
+ <span class="cline-any cline-yes">73x</span>
883
+ <span class="cline-any cline-yes">73x</span>
884
+ <span class="cline-any cline-yes">19x</span>
885
+ <span class="cline-any cline-yes">19x</span>
886
+ <span class="cline-any cline-yes">19x</span>
887
+ <span class="cline-any cline-yes">19x</span>
888
+ <span class="cline-any cline-yes">9x</span>
889
+ <span class="cline-any cline-yes">9x</span>
890
+ <span class="cline-any cline-yes">9x</span>
898
891
  <span class="cline-any cline-no">&nbsp;</span>
899
892
  <span class="cline-any cline-no">&nbsp;</span>
900
- <span class="cline-any cline-yes">7x</span>
893
+ <span class="cline-any cline-yes">9x</span>
894
+ <span class="cline-any cline-yes">9x</span>
895
+ <span class="cline-any cline-yes">9x</span>
896
+ <span class="cline-any cline-yes">19x</span>
901
897
  <span class="cline-any cline-no">&nbsp;</span>
902
898
  <span class="cline-any cline-no">&nbsp;</span>
903
899
  <span class="cline-any cline-no">&nbsp;</span>
@@ -905,17 +901,17 @@
905
901
  <span class="cline-any cline-no">&nbsp;</span>
906
902
  <span class="cline-any cline-no">&nbsp;</span>
907
903
  <span class="cline-any cline-no">&nbsp;</span>
908
- <span class="cline-any cline-yes">7x</span>
909
- <span class="cline-any cline-yes">21x</span>
910
- <span class="cline-any cline-yes">21x</span>
911
- <span class="cline-any cline-yes">21x</span>
912
- <span class="cline-any cline-yes">21x</span>
913
- <span class="cline-any cline-yes">21x</span>
914
- <span class="cline-any cline-yes">21x</span>
915
- <span class="cline-any cline-yes">21x</span>
916
- <span class="cline-any cline-yes">21x</span>
917
- <span class="cline-any cline-yes">21x</span>
918
- <span class="cline-any cline-yes">28x</span>
904
+ <span class="cline-any cline-yes">19x</span>
905
+ <span class="cline-any cline-yes">73x</span>
906
+ <span class="cline-any cline-yes">73x</span>
907
+ <span class="cline-any cline-yes">73x</span>
908
+ <span class="cline-any cline-yes">73x</span>
909
+ <span class="cline-any cline-yes">73x</span>
910
+ <span class="cline-any cline-yes">73x</span>
911
+ <span class="cline-any cline-yes">73x</span>
912
+ <span class="cline-any cline-yes">73x</span>
913
+ <span class="cline-any cline-yes">73x</span>
914
+ <span class="cline-any cline-yes">73x</span>
919
915
  <span class="cline-any cline-yes">1x</span>
920
916
  <span class="cline-any cline-no">&nbsp;</span>
921
917
  <span class="cline-any cline-no">&nbsp;</span>
@@ -937,116 +933,114 @@
937
933
  <span class="cline-any cline-no">&nbsp;</span>
938
934
  <span class="cline-any cline-no">&nbsp;</span>
939
935
  <span class="cline-any cline-yes">1x</span>
940
- <span class="cline-any cline-no">&nbsp;</span>
941
- <span class="cline-any cline-no">&nbsp;</span>
942
- <span class="cline-any cline-no">&nbsp;</span>
943
- <span class="cline-any cline-no">&nbsp;</span>
944
- <span class="cline-any cline-no">&nbsp;</span>
936
+ <span class="cline-any cline-yes">3x</span>
937
+ <span class="cline-any cline-yes">3x</span>
938
+ <span class="cline-any cline-yes">3x</span>
939
+ <span class="cline-any cline-yes">3x</span>
940
+ <span class="cline-any cline-yes">3x</span>
945
941
  <span class="cline-any cline-yes">1x</span>
946
942
  <span class="cline-any cline-yes">1x</span>
943
+ <span class="cline-any cline-yes">3x</span>
944
+ <span class="cline-any cline-yes">3x</span>
945
+ <span class="cline-any cline-yes">3x</span>
946
+ <span class="cline-any cline-yes">3x</span>
947
+ <span class="cline-any cline-yes">3x</span>
948
+ <span class="cline-any cline-yes">3x</span>
947
949
  <span class="cline-any cline-no">&nbsp;</span>
948
950
  <span class="cline-any cline-no">&nbsp;</span>
951
+ <span class="cline-any cline-yes">3x</span>
952
+ <span class="cline-any cline-yes">3x</span>
953
+ <span class="cline-any cline-yes">3x</span>
954
+ <span class="cline-any cline-yes">3x</span>
955
+ <span class="cline-any cline-yes">3x</span>
949
956
  <span class="cline-any cline-no">&nbsp;</span>
950
957
  <span class="cline-any cline-no">&nbsp;</span>
951
- <span class="cline-any cline-no">&nbsp;</span>
952
- <span class="cline-any cline-no">&nbsp;</span>
953
- <span class="cline-any cline-no">&nbsp;</span>
954
- <span class="cline-any cline-no">&nbsp;</span>
955
- <span class="cline-any cline-no">&nbsp;</span>
956
- <span class="cline-any cline-no">&nbsp;</span>
957
- <span class="cline-any cline-no">&nbsp;</span>
958
- <span class="cline-any cline-no">&nbsp;</span>
959
- <span class="cline-any cline-no">&nbsp;</span>
960
- <span class="cline-any cline-no">&nbsp;</span>
961
- <span class="cline-any cline-no">&nbsp;</span>
962
- <span class="cline-any cline-no">&nbsp;</span>
963
- <span class="cline-any cline-no">&nbsp;</span>
964
- <span class="cline-any cline-no">&nbsp;</span>
965
- <span class="cline-any cline-no">&nbsp;</span>
966
- <span class="cline-any cline-no">&nbsp;</span>
967
- <span class="cline-any cline-no">&nbsp;</span>
968
- <span class="cline-any cline-no">&nbsp;</span>
969
- <span class="cline-any cline-no">&nbsp;</span>
970
- <span class="cline-any cline-no">&nbsp;</span>
971
- <span class="cline-any cline-no">&nbsp;</span>
972
- <span class="cline-any cline-no">&nbsp;</span>
973
- <span class="cline-any cline-no">&nbsp;</span>
974
- <span class="cline-any cline-no">&nbsp;</span>
975
- <span class="cline-any cline-no">&nbsp;</span>
976
- <span class="cline-any cline-no">&nbsp;</span>
977
- <span class="cline-any cline-no">&nbsp;</span>
978
- <span class="cline-any cline-no">&nbsp;</span>
979
- <span class="cline-any cline-no">&nbsp;</span>
980
- <span class="cline-any cline-no">&nbsp;</span>
981
- <span class="cline-any cline-no">&nbsp;</span>
982
- <span class="cline-any cline-no">&nbsp;</span>
983
- <span class="cline-any cline-no">&nbsp;</span>
984
- <span class="cline-any cline-no">&nbsp;</span>
985
- <span class="cline-any cline-no">&nbsp;</span>
986
- <span class="cline-any cline-no">&nbsp;</span>
987
- <span class="cline-any cline-no">&nbsp;</span>
988
- <span class="cline-any cline-no">&nbsp;</span>
989
- <span class="cline-any cline-no">&nbsp;</span>
990
- <span class="cline-any cline-no">&nbsp;</span>
991
- <span class="cline-any cline-no">&nbsp;</span>
992
- <span class="cline-any cline-no">&nbsp;</span>
993
- <span class="cline-any cline-no">&nbsp;</span>
994
- <span class="cline-any cline-no">&nbsp;</span>
995
- <span class="cline-any cline-no">&nbsp;</span>
996
- <span class="cline-any cline-no">&nbsp;</span>
958
+ <span class="cline-any cline-yes">3x</span>
959
+ <span class="cline-any cline-yes">3x</span>
960
+ <span class="cline-any cline-yes">3x</span>
961
+ <span class="cline-any cline-yes">3x</span>
997
962
  <span class="cline-any cline-yes">1x</span>
998
963
  <span class="cline-any cline-yes">1x</span>
999
964
  <span class="cline-any cline-yes">1x</span>
1000
965
  <span class="cline-any cline-yes">1x</span>
1001
966
  <span class="cline-any cline-yes">1x</span>
1002
- <span class="cline-any cline-yes">9x</span>
1003
- <span class="cline-any cline-yes">9x</span>
1004
- <span class="cline-any cline-yes">9x</span>
1005
- <span class="cline-any cline-yes">9x</span>
1006
- <span class="cline-any cline-yes">9x</span>
1007
- <span class="cline-any cline-yes">9x</span>
1008
- <span class="cline-any cline-yes">9x</span>
1009
- <span class="cline-any cline-yes">9x</span>
1010
- <span class="cline-any cline-yes">9x</span>
1011
- <span class="cline-any cline-yes">9x</span>
1012
- <span class="cline-any cline-yes">9x</span>
967
+ <span class="cline-any cline-yes">1x</span>
968
+ <span class="cline-any cline-yes">1x</span>
969
+ <span class="cline-any cline-yes">1x</span>
970
+ <span class="cline-any cline-yes">1x</span>
971
+ <span class="cline-any cline-yes">3x</span>
1013
972
  <span class="cline-any cline-no">&nbsp;</span>
1014
973
  <span class="cline-any cline-no">&nbsp;</span>
1015
974
  <span class="cline-any cline-no">&nbsp;</span>
1016
- <span class="cline-any cline-yes">9x</span>
1017
- <span class="cline-any cline-yes">9x</span>
1018
- <span class="cline-any cline-yes">9x</span>
1019
- <span class="cline-any cline-yes">9x</span>
1020
- <span class="cline-any cline-yes">9x</span>
1021
- <span class="cline-any cline-yes">18x</span>
1022
- <span class="cline-any cline-yes">18x</span>
1023
- <span class="cline-any cline-yes">18x</span>
1024
- <span class="cline-any cline-yes">18x</span>
1025
- <span class="cline-any cline-yes">18x</span>
1026
- <span class="cline-any cline-no">&nbsp;</span>
975
+ <span class="cline-any cline-yes">1x</span>
976
+ <span class="cline-any cline-yes">1x</span>
977
+ <span class="cline-any cline-yes">3x</span>
1027
978
  <span class="cline-any cline-no">&nbsp;</span>
1028
979
  <span class="cline-any cline-no">&nbsp;</span>
1029
- <span class="cline-any cline-yes">9x</span>
1030
- <span class="cline-any cline-yes">9x</span>
1031
- <span class="cline-any cline-yes">9x</span>
1032
- <span class="cline-any cline-yes">9x</span>
1033
- <span class="cline-any cline-yes">9x</span>
1034
980
  <span class="cline-any cline-yes">1x</span>
1035
- <span class="cline-any cline-yes">9x</span>
1036
- <span class="cline-any cline-yes">9x</span>
1037
- <span class="cline-any cline-yes">9x</span>
1038
- <span class="cline-any cline-yes">9x</span>
1039
- <span class="cline-any cline-yes">9x</span>
1040
- <span class="cline-any cline-yes">9x</span>
1041
- <span class="cline-any cline-no">&nbsp;</span>
981
+ <span class="cline-any cline-yes">1x</span>
982
+ <span class="cline-any cline-yes">1x</span>
983
+ <span class="cline-any cline-yes">1x</span>
984
+ <span class="cline-any cline-yes">1x</span>
985
+ <span class="cline-any cline-yes">3x</span>
1042
986
  <span class="cline-any cline-no">&nbsp;</span>
1043
987
  <span class="cline-any cline-no">&nbsp;</span>
988
+ <span class="cline-any cline-yes">3x</span>
989
+ <span class="cline-any cline-yes">2x</span>
990
+ <span class="cline-any cline-yes">2x</span>
991
+ <span class="cline-any cline-yes">2x</span>
992
+ <span class="cline-any cline-yes">2x</span>
993
+ <span class="cline-any cline-yes">1x</span>
994
+ <span class="cline-any cline-yes">1x</span>
995
+ <span class="cline-any cline-yes">1x</span>
996
+ <span class="cline-any cline-yes">1x</span>
997
+ <span class="cline-any cline-yes">1x</span>
998
+ <span class="cline-any cline-yes">11x</span>
999
+ <span class="cline-any cline-yes">11x</span>
1000
+ <span class="cline-any cline-yes">11x</span>
1001
+ <span class="cline-any cline-yes">11x</span>
1002
+ <span class="cline-any cline-yes">11x</span>
1003
+ <span class="cline-any cline-yes">11x</span>
1004
+ <span class="cline-any cline-yes">11x</span>
1005
+ <span class="cline-any cline-yes">11x</span>
1006
+ <span class="cline-any cline-yes">11x</span>
1007
+ <span class="cline-any cline-yes">11x</span>
1008
+ <span class="cline-any cline-yes">11x</span>
1044
1009
  <span class="cline-any cline-no">&nbsp;</span>
1045
1010
  <span class="cline-any cline-no">&nbsp;</span>
1046
1011
  <span class="cline-any cline-no">&nbsp;</span>
1012
+ <span class="cline-any cline-yes">11x</span>
1013
+ <span class="cline-any cline-yes">11x</span>
1014
+ <span class="cline-any cline-yes">11x</span>
1015
+ <span class="cline-any cline-yes">11x</span>
1016
+ <span class="cline-any cline-yes">11x</span>
1017
+ <span class="cline-any cline-yes">22x</span>
1018
+ <span class="cline-any cline-yes">22x</span>
1019
+ <span class="cline-any cline-yes">22x</span>
1020
+ <span class="cline-any cline-yes">22x</span>
1021
+ <span class="cline-any cline-yes">22x</span>
1047
1022
  <span class="cline-any cline-no">&nbsp;</span>
1048
1023
  <span class="cline-any cline-no">&nbsp;</span>
1049
1024
  <span class="cline-any cline-no">&nbsp;</span>
1025
+ <span class="cline-any cline-yes">11x</span>
1026
+ <span class="cline-any cline-yes">11x</span>
1027
+ <span class="cline-any cline-yes">11x</span>
1028
+ <span class="cline-any cline-yes">11x</span>
1029
+ <span class="cline-any cline-yes">11x</span>
1030
+ <span class="cline-any cline-yes">1x</span>
1031
+ <span class="cline-any cline-yes">11x</span>
1032
+ <span class="cline-any cline-yes">11x</span>
1033
+ <span class="cline-any cline-yes">11x</span>
1034
+ <span class="cline-any cline-yes">11x</span>
1035
+ <span class="cline-any cline-yes">11x</span>
1036
+ <span class="cline-any cline-yes">11x</span>
1037
+ <span class="cline-any cline-yes">8x</span>
1038
+ <span class="cline-any cline-yes">8x</span>
1039
+ <span class="cline-any cline-yes">8x</span>
1040
+ <span class="cline-any cline-yes">8x</span>
1041
+ <span class="cline-any cline-yes">8x</span>
1042
+ <span class="cline-any cline-yes">8x</span>
1043
+ <span class="cline-any cline-yes">8x</span>
1050
1044
  <span class="cline-any cline-no">&nbsp;</span>
1051
1045
  <span class="cline-any cline-no">&nbsp;</span>
1052
1046
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1124,91 +1118,93 @@
1124
1118
  <span class="cline-any cline-no">&nbsp;</span>
1125
1119
  <span class="cline-any cline-no">&nbsp;</span>
1126
1120
  <span class="cline-any cline-no">&nbsp;</span>
1127
- <span class="cline-any cline-yes">9x</span>
1121
+ <span class="cline-any cline-yes">8x</span>
1122
+ <span class="cline-any cline-yes">8x</span>
1123
+ <span class="cline-any cline-yes">11x</span>
1128
1124
  <span class="cline-any cline-yes">1x</span>
1129
- <span class="cline-any cline-yes">9x</span>
1130
- <span class="cline-any cline-yes">9x</span>
1131
- <span class="cline-any cline-no">&nbsp;</span>
1132
- <span class="cline-any cline-no">&nbsp;</span>
1133
- <span class="cline-any cline-no">&nbsp;</span>
1134
- <span class="cline-any cline-no">&nbsp;</span>
1135
- <span class="cline-any cline-yes">9x</span>
1136
- <span class="cline-any cline-yes">9x</span>
1125
+ <span class="cline-any cline-yes">11x</span>
1126
+ <span class="cline-any cline-yes">11x</span>
1137
1127
  <span class="cline-any cline-yes">1x</span>
1138
1128
  <span class="cline-any cline-yes">1x</span>
1139
- <span class="cline-any cline-yes">9x</span>
1140
- <span class="cline-any cline-yes">9x</span>
1141
- <span class="cline-any cline-yes">9x</span>
1142
- <span class="cline-any cline-yes">9x</span>
1143
- <span class="cline-any cline-yes">9x</span>
1144
- <span class="cline-any cline-yes">9x</span>
1145
- <span class="cline-any cline-yes">9x</span>
1146
- <span class="cline-any cline-yes">9x</span>
1147
- <span class="cline-any cline-yes">9x</span>
1148
- <span class="cline-any cline-yes">9x</span>
1149
- <span class="cline-any cline-yes">9x</span>
1150
- <span class="cline-any cline-yes">9x</span>
1129
+ <span class="cline-any cline-yes">1x</span>
1130
+ <span class="cline-any cline-yes">1x</span>
1131
+ <span class="cline-any cline-yes">11x</span>
1132
+ <span class="cline-any cline-yes">11x</span>
1133
+ <span class="cline-any cline-yes">1x</span>
1134
+ <span class="cline-any cline-yes">1x</span>
1135
+ <span class="cline-any cline-yes">11x</span>
1136
+ <span class="cline-any cline-yes">11x</span>
1137
+ <span class="cline-any cline-yes">11x</span>
1138
+ <span class="cline-any cline-yes">11x</span>
1139
+ <span class="cline-any cline-yes">11x</span>
1140
+ <span class="cline-any cline-yes">11x</span>
1141
+ <span class="cline-any cline-yes">11x</span>
1142
+ <span class="cline-any cline-yes">11x</span>
1143
+ <span class="cline-any cline-yes">11x</span>
1144
+ <span class="cline-any cline-yes">11x</span>
1145
+ <span class="cline-any cline-yes">11x</span>
1146
+ <span class="cline-any cline-yes">11x</span>
1151
1147
  <span class="cline-any cline-yes">2x</span>
1152
1148
  <span class="cline-any cline-yes">2x</span>
1153
1149
  <span class="cline-any cline-yes">2x</span>
1154
- <span class="cline-any cline-yes">9x</span>
1155
- <span class="cline-any cline-yes">9x</span>
1156
- <span class="cline-any cline-yes">9x</span>
1157
- <span class="cline-any cline-yes">9x</span>
1158
- <span class="cline-any cline-no">&nbsp;</span>
1159
- <span class="cline-any cline-no">&nbsp;</span>
1160
- <span class="cline-any cline-no">&nbsp;</span>
1161
- <span class="cline-any cline-no">&nbsp;</span>
1162
- <span class="cline-any cline-yes">9x</span>
1163
- <span class="cline-any cline-yes">9x</span>
1164
1150
  <span class="cline-any cline-yes">11x</span>
1165
1151
  <span class="cline-any cline-yes">11x</span>
1166
1152
  <span class="cline-any cline-yes">11x</span>
1167
- <span class="cline-any cline-no">&nbsp;</span>
1168
1153
  <span class="cline-any cline-yes">11x</span>
1169
1154
  <span class="cline-any cline-no">&nbsp;</span>
1170
1155
  <span class="cline-any cline-no">&nbsp;</span>
1171
1156
  <span class="cline-any cline-no">&nbsp;</span>
1157
+ <span class="cline-any cline-no">&nbsp;</span>
1172
1158
  <span class="cline-any cline-yes">11x</span>
1173
1159
  <span class="cline-any cline-yes">11x</span>
1174
- <span class="cline-any cline-yes">11x</span>
1175
- <span class="cline-any cline-yes">11x</span>
1160
+ <span class="cline-any cline-yes">119x</span>
1161
+ <span class="cline-any cline-yes">119x</span>
1162
+ <span class="cline-any cline-yes">119x</span>
1176
1163
  <span class="cline-any cline-no">&nbsp;</span>
1164
+ <span class="cline-any cline-yes">119x</span>
1177
1165
  <span class="cline-any cline-no">&nbsp;</span>
1178
1166
  <span class="cline-any cline-no">&nbsp;</span>
1167
+ <span class="cline-any cline-no">&nbsp;</span>
1168
+ <span class="cline-any cline-yes">119x</span>
1169
+ <span class="cline-any cline-yes">119x</span>
1170
+ <span class="cline-any cline-yes">119x</span>
1171
+ <span class="cline-any cline-yes">119x</span>
1172
+ <span class="cline-any cline-yes">2x</span>
1173
+ <span class="cline-any cline-yes">2x</span>
1174
+ <span class="cline-any cline-yes">2x</span>
1175
+ <span class="cline-any cline-yes">119x</span>
1176
+ <span class="cline-any cline-yes">11x</span>
1179
1177
  <span class="cline-any cline-yes">11x</span>
1180
- <span class="cline-any cline-yes">9x</span>
1181
- <span class="cline-any cline-yes">9x</span>
1182
1178
  <span class="cline-any cline-no">&nbsp;</span>
1183
1179
  <span class="cline-any cline-no">&nbsp;</span>
1184
1180
  <span class="cline-any cline-no">&nbsp;</span>
1185
- <span class="cline-any cline-yes">9x</span>
1186
- <span class="cline-any cline-yes">9x</span>
1181
+ <span class="cline-any cline-yes">11x</span>
1182
+ <span class="cline-any cline-yes">11x</span>
1187
1183
  <span class="cline-any cline-no">&nbsp;</span>
1188
1184
  <span class="cline-any cline-no">&nbsp;</span>
1189
1185
  <span class="cline-any cline-no">&nbsp;</span>
1190
- <span class="cline-any cline-yes">9x</span>
1191
- <span class="cline-any cline-yes">9x</span>
1192
- <span class="cline-any cline-yes">28x</span>
1193
- <span class="cline-any cline-yes">21x</span>
1194
- <span class="cline-any cline-yes">28x</span>
1195
- <span class="cline-any cline-yes">9x</span>
1196
- <span class="cline-any cline-yes">9x</span>
1186
+ <span class="cline-any cline-yes">11x</span>
1187
+ <span class="cline-any cline-yes">11x</span>
1188
+ <span class="cline-any cline-yes">73x</span>
1189
+ <span class="cline-any cline-yes">73x</span>
1190
+ <span class="cline-any cline-yes">73x</span>
1191
+ <span class="cline-any cline-yes">11x</span>
1192
+ <span class="cline-any cline-yes">11x</span>
1197
1193
  <span class="cline-any cline-no">&nbsp;</span>
1198
1194
  <span class="cline-any cline-no">&nbsp;</span>
1199
1195
  <span class="cline-any cline-no">&nbsp;</span>
1200
- <span class="cline-any cline-yes">9x</span>
1201
- <span class="cline-any cline-yes">9x</span>
1196
+ <span class="cline-any cline-yes">11x</span>
1197
+ <span class="cline-any cline-yes">11x</span>
1202
1198
  <span class="cline-any cline-yes">1x</span>
1203
1199
  <span class="cline-any cline-yes">1x</span>
1204
- <span class="cline-any cline-yes">9x</span>
1205
- <span class="cline-any cline-yes">9x</span>
1206
- <span class="cline-any cline-yes">9x</span>
1207
- <span class="cline-any cline-yes">77x</span>
1208
- <span class="cline-any cline-yes">63x</span>
1209
- <span class="cline-any cline-yes">77x</span>
1210
- <span class="cline-any cline-yes">9x</span>
1211
- <span class="cline-any cline-yes">9x</span>
1200
+ <span class="cline-any cline-yes">11x</span>
1201
+ <span class="cline-any cline-yes">11x</span>
1202
+ <span class="cline-any cline-yes">11x</span>
1203
+ <span class="cline-any cline-yes">95x</span>
1204
+ <span class="cline-any cline-yes">95x</span>
1205
+ <span class="cline-any cline-yes">95x</span>
1206
+ <span class="cline-any cline-yes">11x</span>
1207
+ <span class="cline-any cline-yes">11x</span>
1212
1208
  <span class="cline-any cline-no">&nbsp;</span>
1213
1209
  <span class="cline-any cline-no">&nbsp;</span>
1214
1210
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1233,26 +1229,26 @@
1233
1229
  <span class="cline-any cline-no">&nbsp;</span>
1234
1230
  <span class="cline-any cline-no">&nbsp;</span>
1235
1231
  <span class="cline-any cline-no">&nbsp;</span>
1236
- <span class="cline-any cline-yes">9x</span>
1237
- <span class="cline-any cline-yes">9x</span>
1238
- <span class="cline-any cline-yes">9x</span>
1239
- <span class="cline-any cline-yes">9x</span>
1240
- <span class="cline-any cline-yes">9x</span>
1241
- <span class="cline-any cline-yes">9x</span>
1242
- <span class="cline-any cline-yes">9x</span>
1243
- <span class="cline-any cline-yes">9x</span>
1244
- <span class="cline-any cline-yes">9x</span>
1245
- <span class="cline-any cline-yes">9x</span>
1246
- <span class="cline-any cline-yes">9x</span>
1247
- <span class="cline-any cline-yes">9x</span>
1248
- <span class="cline-any cline-yes">9x</span>
1249
- <span class="cline-any cline-yes">9x</span>
1250
- <span class="cline-any cline-yes">9x</span>
1251
- <span class="cline-any cline-yes">9x</span>
1252
- <span class="cline-any cline-yes">9x</span>
1253
- <span class="cline-any cline-yes">9x</span>
1254
- <span class="cline-any cline-yes">9x</span>
1255
- <span class="cline-any cline-yes">9x</span>
1232
+ <span class="cline-any cline-yes">11x</span>
1233
+ <span class="cline-any cline-yes">11x</span>
1234
+ <span class="cline-any cline-yes">11x</span>
1235
+ <span class="cline-any cline-yes">11x</span>
1236
+ <span class="cline-any cline-yes">11x</span>
1237
+ <span class="cline-any cline-yes">11x</span>
1238
+ <span class="cline-any cline-yes">11x</span>
1239
+ <span class="cline-any cline-yes">11x</span>
1240
+ <span class="cline-any cline-yes">11x</span>
1241
+ <span class="cline-any cline-yes">11x</span>
1242
+ <span class="cline-any cline-yes">11x</span>
1243
+ <span class="cline-any cline-yes">11x</span>
1244
+ <span class="cline-any cline-yes">11x</span>
1245
+ <span class="cline-any cline-yes">11x</span>
1246
+ <span class="cline-any cline-yes">11x</span>
1247
+ <span class="cline-any cline-yes">11x</span>
1248
+ <span class="cline-any cline-yes">11x</span>
1249
+ <span class="cline-any cline-yes">11x</span>
1250
+ <span class="cline-any cline-yes">11x</span>
1251
+ <span class="cline-any cline-yes">11x</span>
1256
1252
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import path from 'path'
1257
1253
  import url from 'url'
1258
1254
  import fs from 'fs-extra'
@@ -1271,14 +1267,12 @@ import configuration from '@feathersjs/configuration'
1271
1267
  import errors from '@feathersjs/errors'
1272
1268
  import express, { authenticate } from '@feathersjs/express'
1273
1269
  import socketio from '@feathersjs/socketio'
1274
- import mongodb from 'mongodb'
1275
- import { Database, idToString } from './db.js'
1270
+ import { Database, isObjectID, idToString } from './db.js'
1276
1271
  import auth from './authentication.js'
1277
1272
  &nbsp;
1278
1273
  const debug = makeDebug('kdk:core:application')
1279
1274
  const debugLimiter = makeDebug('kdk:core:application:limiter')
1280
1275
  const { TooManyRequests, Forbidden, BadRequest } = errors
1281
- const { ObjectID } = mongodb
1282
1276
  const { rest } = express
1283
1277
  const sift = siftModule.default
1284
1278
  &nbsp;
@@ -1354,10 +1348,10 @@ export async function configureService (name, service, servicesPath) {
1354
1348
  }
1355
1349
  } <span class="branch-0 cbranch-no" title="branch not covered" >catch (error) {</span>
1356
1350
  <span class="cstat-no" title="statement not covered" > debug('No ' + name + ' service hooks configured on path ' + servicesPath)</span>
1357
- <span class="cstat-no" title="statement not covered" > if (error.code !== 'ERR_MODULE_NOT_FOUND') {</span>
1358
- <span class="cstat-no" title="statement not covered" > // Log error in this case as this might be linked to a syntax error in required file</span>
1359
- <span class="cstat-no" title="statement not covered" > debug(filepath, error)</span>
1360
- <span class="cstat-no" title="statement not covered" > }</span>
1351
+ <span class="cstat-no" title="statement not covered" > // if (error.code !== 'ERR_MODULE_NOT_FOUND') {</span>
1352
+ <span class="cstat-no" title="statement not covered" > // Log error in this case as this might be linked to a syntax error in required file</span>
1353
+ <span class="cstat-no" title="statement not covered" > debug(filepath, error)</span>
1354
+ <span class="cstat-no" title="statement not covered" > // }</span>
1361
1355
  <span class="cstat-no" title="statement not covered" > // As this is optionnal this require has to fail silently</span>
1362
1356
  <span class="cstat-no" title="statement not covered" > }</span>
1363
1357
  &nbsp;
@@ -1374,10 +1368,10 @@ export async function configureService (name, service, servicesPath) {
1374
1368
  <span class="cstat-no" title="statement not covered" > }</span>
1375
1369
  } <span class="branch-0 cbranch-no" title="branch not covered" >catch (error) {</span>
1376
1370
  <span class="cstat-no" title="statement not covered" > debug('No ' + name + ' service channels configured on path ' + servicesPath)</span>
1377
- <span class="cstat-no" title="statement not covered" > if (error.code !== 'ERR_MODULE_NOT_FOUND') {</span>
1378
- <span class="cstat-no" title="statement not covered" > // Log error in this case as this might be linked to a syntax error in required file</span>
1379
- <span class="cstat-no" title="statement not covered" > debug(filepath, error)</span>
1380
- <span class="cstat-no" title="statement not covered" > }</span>
1371
+ <span class="cstat-no" title="statement not covered" > // if (error.code !== 'ERR_MODULE_NOT_FOUND') {</span>
1372
+ <span class="cstat-no" title="statement not covered" > // Log error in this case as this might be linked to a syntax error in required file</span>
1373
+ <span class="cstat-no" title="statement not covered" > debug(filepath, error)</span>
1374
+ <span class="cstat-no" title="statement not covered" > // }</span>
1381
1375
  <span class="cstat-no" title="statement not covered" > // As this is optionnal this require has to fail silently</span>
1382
1376
  <span class="cstat-no" title="statement not covered" > }</span>
1383
1377
  &nbsp;
@@ -1453,10 +1447,10 @@ async function createService (name, app, options = {}) {
1453
1447
  }
1454
1448
  } <span class="branch-0 cbranch-no" title="branch not covered" >catch (error) {</span>
1455
1449
  <span class="cstat-no" title="statement not covered" > debug('No ' + fileName + ' service model configured on path ' + serviceOptions.modelsPath)</span>
1456
- <span class="cstat-no" title="statement not covered" > if (error.code !== 'ERR_MODULE_NOT_FOUND') {</span>
1457
- <span class="cstat-no" title="statement not covered" > // Log error in this case as this might be linked to a syntax error in required file</span>
1458
- <span class="cstat-no" title="statement not covered" > debug(fileName, error)</span>
1459
- <span class="cstat-no" title="statement not covered" > }</span>
1450
+ <span class="cstat-no" title="statement not covered" > // if (error.code !== 'ERR_MODULE_NOT_FOUND') {</span>
1451
+ <span class="cstat-no" title="statement not covered" > // Log error in this case as this might be linked to a syntax error in required file</span>
1452
+ <span class="cstat-no" title="statement not covered" > debug(fileName, error)</span>
1453
+ <span class="cstat-no" title="statement not covered" > // }</span>
1460
1454
  <span class="cstat-no" title="statement not covered" > // As this is optionnal this require has to fail silently</span>
1461
1455
  <span class="cstat-no" title="statement not covered" > }</span>
1462
1456
  &nbsp;
@@ -1476,22 +1470,22 @@ async function createService (name, app, options = {}) {
1476
1470
  service = service(name, app, serviceOptions)
1477
1471
  }
1478
1472
  // Need to set this manually for services not using class inheritance or default adapters
1479
- if (serviceOptions.events) <span class="branch-0 cbranch-no" title="branch not covered" >service.events = serviceOptions.events</span>
1473
+ if (serviceOptions.events) service.events = serviceOptions.events
1480
1474
  }
1481
1475
  // Optionnally a specific service mixin can be provided, apply it
1482
1476
  if (dbService &amp;&amp; serviceOptions.servicesPath) {
1483
1477
  const filepath = path.join(serviceOptions.servicesPath, fileName, `${fileName}.service.js`)
1484
1478
  try {
1485
1479
  const fileExists = await fs.pathExists(filepath)
1486
- if (fileExists) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1487
- <span class="cstat-no" title="statement not covered" > let serviceMixin = (await import(url.pathToFileURL(filepath))).default</span>
1488
- <span class="cstat-no" title="statement not covered" > // If we get a function try to call it assuming it will return the mixin object</span>
1489
- <span class="cstat-no" title="statement not covered" > if (typeof serviceMixin === 'function') {</span>
1480
+ if (fileExists) {
1481
+ let serviceMixin = (await import(url.pathToFileURL(filepath))).default
1482
+ // If we get a function try to call it assuming it will return the mixin object
1483
+ if (typeof serviceMixin === 'function') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1490
1484
  <span class="cstat-no" title="statement not covered" > serviceMixin = await serviceMixin.bind(dbService)(fileName, app, serviceOptions)</span>
1491
1485
  <span class="cstat-no" title="statement not covered" > }</span>
1492
- <span class="cstat-no" title="statement not covered" > Object.assign(service, serviceMixin)</span>
1493
- <span class="cstat-no" title="statement not covered" > debug(name + ' service mixin configured on path ' + serviceOptions.servicesPath)</span>
1494
- <span class="cstat-no" title="statement not covered" > }</span>
1486
+ Object.assign(service, serviceMixin)
1487
+ debug(name + ' service mixin configured on path ' + serviceOptions.servicesPath)
1488
+ }
1495
1489
  } <span class="branch-0 cbranch-no" title="branch not covered" >catch (error) {</span>
1496
1490
  <span class="cstat-no" title="statement not covered" > debug('No ' + fileName + ' service mixin configured on path ' + serviceOptions.servicesPath)</span>
1497
1491
  <span class="cstat-no" title="statement not covered" > // if (error.code !== 'ERR_MODULE_NOT_FOUND') {</span>
@@ -1531,64 +1525,64 @@ export function createWebhook (path, app, options = {}) {
1531
1525
  if (options.context) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1532
1526
  <span class="cstat-no" title="statement not covered" > webhookPath = idToString(options.context) + '/' + webhookPath</span>
1533
1527
  <span class="cstat-no" title="statement not covered" > }</span>
1534
- const isAllowed = <span class="fstat-no" title="function not covered" >(payload) =&gt; {</span>
1535
- <span class="cstat-no" title="statement not covered" > // Default is to expose all services/operations</span>
1536
- <span class="cstat-no" title="statement not covered" > if (!options.filter) return true</span>
1537
- <span class="cstat-no" title="statement not covered" > const result = [payload].filter(sift(options.filter))</span>
1538
- <span class="cstat-no" title="statement not covered" > return result.length &gt; 0</span>
1539
- <span class="cstat-no" title="statement not covered" > }</span>
1528
+ const isAllowed = (payload) =&gt; {
1529
+ // Default is to expose all services/operations
1530
+ if (!options.filter) <span class="branch-0 cbranch-no" title="branch not covered" >return true</span>
1531
+ const result = [payload].filter(sift(options.filter))
1532
+ return result.length &gt; 0
1533
+ }
1540
1534
  &nbsp;
1541
1535
  app.post(app.get('apiPath') + '/webhooks/' + webhookPath, authenticate('jwt'), async (req, res, next) =&gt; {
1542
- <span class="cstat-no" title="statement not covered" > const payload = req.body</span>
1543
- <span class="cstat-no" title="statement not covered" > const config = app.get('authentication')</span>
1544
- <span class="cstat-no" title="statement not covered" > res.set('content-type', 'application/json')</span>
1545
- <span class="cstat-no" title="statement not covered" > const params = _.get(req, 'feathers', {})</span>
1546
- <span class="cstat-no" title="statement not covered" > try {</span>
1547
- <span class="cstat-no" title="statement not covered" > if (options.preprocessor) {</span>
1536
+ const payload = req.body
1537
+ const config = app.get('authentication')
1538
+ res.set('content-type', 'application/json')
1539
+ const params = _.get(req, 'feathers', {})
1540
+ try {
1541
+ if (options.preprocessor) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1548
1542
  <span class="cstat-no" title="statement not covered" > await options.preprocessor(req, res, payload)</span>
1549
1543
  <span class="cstat-no" title="statement not covered" > }</span>
1550
- <span class="cstat-no" title="statement not covered" > // Authenticate when required</span>
1551
- <span class="cstat-no" title="statement not covered" > if (config) {</span>
1552
- <span class="cstat-no" title="statement not covered" > params.checkAuthorisation = true</span>
1553
- <span class="cstat-no" title="statement not covered" > }</span>
1554
- <span class="cstat-no" title="statement not covered" > if (req.headers['content-type'] !== 'application/json') {</span>
1544
+ // Authenticate when required
1545
+ if (config) {
1546
+ params.checkAuthorisation = true
1547
+ }
1548
+ if (req.headers['content-type'] !== 'application/json') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1555
1549
  <span class="cstat-no" title="statement not covered" > throw new BadRequest('Webhooks expect application/json content type')</span>
1556
1550
  <span class="cstat-no" title="statement not covered" > }</span>
1557
- <span class="cstat-no" title="statement not covered" > if (!isAllowed(payload)) throw new Forbidden('Service or operation not allowed for webhook')</span>
1558
- <span class="cstat-no" title="statement not covered" > const service = app.getService(payload.service, options.context || payload.context)</span>
1559
- <span class="cstat-no" title="statement not covered" > if (!service) throw new BadRequest('Service could not be found')</span>
1560
- <span class="cstat-no" title="statement not covered" > if (typeof service[payload.operation] !== 'function') throw new BadRequest('Service operation could not be found')</span>
1561
- <span class="cstat-no" title="statement not covered" > const args = []</span>
1562
- <span class="cstat-no" title="statement not covered" > // Get/Update/Patch/Remove</span>
1563
- <span class="cstat-no" title="statement not covered" > const operationsWithId = ['get', 'update', 'patch', 'remove']</span>
1564
- <span class="cstat-no" title="statement not covered" > if (operationsWithId.includes(payload.operation)) {</span>
1565
- <span class="cstat-no" title="statement not covered" > if (!_.has(payload, 'id')) throw new BadRequest('Missing id for operation')</span>
1566
- <span class="cstat-no" title="statement not covered" > args.push(_.get(payload, 'id'))</span>
1567
- <span class="cstat-no" title="statement not covered" > }</span>
1568
- <span class="cstat-no" title="statement not covered" > // Create/Update/Patch</span>
1569
- <span class="cstat-no" title="statement not covered" > const operationsWithData = ['create', 'update', 'patch']</span>
1570
- <span class="cstat-no" title="statement not covered" > if (operationsWithData.includes(payload.operation)) {</span>
1551
+ if (!isAllowed(payload)) throw new Forbidden('Service or operation not allowed for webhook')
1552
+ const service = app.getService(payload.service, options.context || payload.context)
1553
+ if (!service) <span class="branch-0 cbranch-no" title="branch not covered" >throw new BadRequest('Service could not be found')</span>
1554
+ if (typeof service[payload.operation] !== 'function') <span class="branch-0 cbranch-no" title="branch not covered" >throw new BadRequest('Service operation could not be found')</span>
1555
+ const args = []
1556
+ // Get/Update/Patch/Remove
1557
+ const operationsWithId = ['get', 'update', 'patch', 'remove']
1558
+ if (operationsWithId.includes(payload.operation)) {
1559
+ if (!_.has(payload, 'id')) <span class="branch-0 cbranch-no" title="branch not covered" >throw new BadRequest('Missing id for operation')</span>
1560
+ args.push(_.get(payload, 'id'))
1561
+ }
1562
+ // Create/Update/Patch
1563
+ const operationsWithData = ['create', 'update', 'patch']
1564
+ if (operationsWithData.includes(payload.operation)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1571
1565
  <span class="cstat-no" title="statement not covered" > if (!_.has(payload, 'data')) throw new BadRequest('Missing data for operation')</span>
1572
1566
  <span class="cstat-no" title="statement not covered" > args.push(_.get(payload, 'data'))</span>
1573
1567
  <span class="cstat-no" title="statement not covered" > }</span>
1574
- <span class="cstat-no" title="statement not covered" > // Params</span>
1575
- <span class="cstat-no" title="statement not covered" > args.push(params)</span>
1576
- <span class="cstat-no" title="statement not covered" > if (options.postprocessor) {</span>
1568
+ // Params
1569
+ args.push(params)
1570
+ if (options.postprocessor) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1577
1571
  <span class="cstat-no" title="statement not covered" > await options.postprocessor(service, args, payload)</span>
1578
1572
  <span class="cstat-no" title="statement not covered" > }</span>
1579
- <span class="cstat-no" title="statement not covered" > try {</span>
1580
- <span class="cstat-no" title="statement not covered" > debug(`Performing ${payload.service} service ${payload.operation} operation through webhook ${webhookPath} with args:`, args)</span>
1581
- <span class="cstat-no" title="statement not covered" > const result = await service[payload.operation].apply(service, args)</span>
1582
- <span class="cstat-no" title="statement not covered" > // Send back result</span>
1583
- <span class="cstat-no" title="statement not covered" > res.json(result)</span>
1584
- <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1573
+ try {
1574
+ debug(`Performing ${payload.service} service ${payload.operation} operation through webhook ${webhookPath} with args:`, args)
1575
+ const result = await service[payload.operation].apply(service, args)
1576
+ // Send back result
1577
+ res.json(result)
1578
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (error) {</span>
1585
1579
  <span class="cstat-no" title="statement not covered" > throw new BadRequest('Service operation could not be performed')</span>
1586
1580
  <span class="cstat-no" title="statement not covered" > }</span>
1587
- <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1588
- <span class="cstat-no" title="statement not covered" > debug(`Webhook ${webhookPath} error:`, error)</span>
1589
- <span class="cstat-no" title="statement not covered" > // Send back error</span>
1590
- <span class="cstat-no" title="statement not covered" > res.status(error.code || 500).json(error.toJSON())</span>
1591
- <span class="cstat-no" title="statement not covered" > }</span>
1581
+ } catch (error) {
1582
+ debug(`Webhook ${webhookPath} error:`, error)
1583
+ // Send back error
1584
+ res.status(error.code <span class="branch-0 cbranch-no" title="branch not covered" >|| 500)</span>.json(error.toJSON())
1585
+ }
1592
1586
  })
1593
1587
  &nbsp;
1594
1588
  debug(`Webhook ${webhookPath} registration completed`)
@@ -1633,13 +1627,13 @@ function setupSockets (app) {
1633
1627
  let nbConnections = 0
1634
1628
  &nbsp;
1635
1629
  return io =&gt; {
1636
- <span class="cstat-no" title="statement not covered" > // By default EventEmitters will print a warning if more than 10 listeners are added for a particular event.</span>
1637
- <span class="cstat-no" title="statement not covered" > // The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.</span>
1638
- <span class="cstat-no" title="statement not covered" > io.sockets.setMaxListeners(0)</span>
1639
- <span class="cstat-no" title="statement not covered" > const maxConnections = _.get(apiLimiter, 'websocket.maxConcurrency', 0)</span>
1640
- <span class="cstat-no" title="statement not covered" > const maxIpConnections = _.get(apiLimiter, 'websocket.concurrency', 0)</span>
1641
- <span class="cstat-no" title="statement not covered" ></span>
1642
- <span class="cstat-no" title="statement not covered" > io.on('connection', socket =&gt; {</span>
1630
+ // By default EventEmitters will print a warning if more than 10 listeners are added for a particular event.
1631
+ // The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.
1632
+ io.sockets.setMaxListeners(0)
1633
+ const maxConnections = _.get(apiLimiter, 'websocket.maxConcurrency', 0)
1634
+ const maxIpConnections = _.get(apiLimiter, 'websocket.concurrency', 0)
1635
+ &nbsp;
1636
+ io.on('connection', socket =&gt; {
1643
1637
  <span class="cstat-no" title="statement not covered" > nbConnections++</span>
1644
1638
  <span class="cstat-no" title="statement not covered" > debug(`New socket connection on server with pid ${process.pid}`, socket.id, socket.conn.remoteAddress, nbConnections)</span>
1645
1639
  <span class="cstat-no" title="statement not covered" > // Setup disconnect handler first</span>
@@ -1717,16 +1711,16 @@ function setupSockets (app) {
1717
1711
  <span class="cstat-no" title="statement not covered" > next()</span>
1718
1712
  <span class="cstat-no" title="statement not covered" > })</span>
1719
1713
  <span class="cstat-no" title="statement not covered" > }</span>
1720
- <span class="cstat-no" title="statement not covered" > })</span>
1721
- <span class="cstat-no" title="statement not covered" > }</span>
1714
+ })
1715
+ }
1722
1716
  }
1723
1717
  &nbsp;
1724
1718
  function setupHealthcheck (app) {
1725
1719
  app.get('/healthcheck', async (req, res) =&gt; {
1726
- <span class="cstat-no" title="statement not covered" > res.set('Content-Type', 'application/json')</span>
1727
- <span class="cstat-no" title="statement not covered" > const result = await app.db.healthcheck()</span>
1728
- <span class="cstat-no" title="statement not covered" > const status = (result ? 200 : 500)</span>
1729
- <span class="cstat-no" title="statement not covered" > return res.status(status).json({ isRunning: true, isDatabaseRunning: result })</span>
1720
+ res.set('Content-Type', 'application/json')
1721
+ const result = await app.db.healthcheck()
1722
+ const status = (result ? 200 <span class="branch-0 cbranch-no" title="branch not covered" >: 500)</span>
1723
+ return res.status(status).json({ isRunning: true, isDatabaseRunning: result })
1730
1724
  })
1731
1725
  }
1732
1726
  &nbsp;
@@ -1762,15 +1756,15 @@ export function kdk (config = {}) {
1762
1756
  <span class="cstat-no" title="statement not covered" > return app.service(app.get('apiPath') + '/' + context + '/' + path)</span>
1763
1757
  } else if (context <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp; typeof context === 'object')</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1764
1758
  <span class="cstat-no" title="statement not covered" > // Could be Object ID or raw object</span>
1765
- <span class="cstat-no" title="statement not covered" > if (ObjectID.isValid(context)) return app.service(app.get('apiPath') + '/' + context.toString() + '/' + path)</span>
1759
+ <span class="cstat-no" title="statement not covered" > if (isObjectID(context)) return app.service(app.get('apiPath') + '/' + context.toString() + '/' + path)</span>
1766
1760
  <span class="cstat-no" title="statement not covered" > else return app.service(app.get('apiPath') + '/' + context._id.toString() + '/' + path)</span>
1767
1761
  } else {
1768
1762
  return app.service(app.get('apiPath') + '/' + path)
1769
1763
  }
1770
- } <span class="branch-0 cbranch-no" title="branch not covered" >catch {</span>
1771
- <span class="cstat-no" title="statement not covered" > // We return a false-y value in case the service wasn't found</span>
1772
- <span class="cstat-no" title="statement not covered" > return null</span>
1773
- <span class="cstat-no" title="statement not covered" > }</span>
1764
+ } catch {
1765
+ // We return a false-y value in case the service wasn't found
1766
+ return null
1767
+ }
1774
1768
  }
1775
1769
  // This is used to add hooks/filters to services
1776
1770
  app.configureService = <span class="fstat-no" title="function not covered" >async function (name, service, servicesPath) {</span>
@@ -1855,7 +1849,7 @@ export function kdk (config = {}) {
1855
1849
  <div class='footer quiet pad2 space-top1 center small'>
1856
1850
  Code coverage generated by
1857
1851
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1858
- at 2024-08-13T10:02:04.843Z
1852
+ at 2026-03-10T09:15:24.743Z
1859
1853
  </div>
1860
1854
  <script src="../../prettify.js"></script>
1861
1855
  <script>