@icure/api 8.6.19 → 8.7.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 (326) hide show
  1. package/icc-api/api/IccDocumentApi.d.ts +10 -2
  2. package/icc-api/api/IccDocumentApi.js +22 -4
  3. package/icc-api/api/IccDocumentApi.js.map +1 -1
  4. package/icc-api/api/IccReceiptApi.d.ts +17 -0
  5. package/icc-api/api/IccReceiptApi.js +52 -0
  6. package/icc-api/api/IccReceiptApi.js.map +1 -1
  7. package/icc-api/model/DataAttachment.d.ts +22 -0
  8. package/icc-api/model/DataAttachment.js.map +1 -1
  9. package/icc-api/model/Document.d.ts +6 -0
  10. package/icc-api/model/Document.js.map +1 -1
  11. package/icc-api/model/Receipt.d.ts +6 -0
  12. package/icc-api/model/Receipt.js.map +1 -1
  13. package/icc-x-api/crypto/BaseExchangeDataManager.js +2 -2
  14. package/icc-x-api/crypto/BaseExchangeDataManager.js.map +1 -1
  15. package/icc-x-api/crypto/ExchangeDataManager.js +3 -3
  16. package/icc-x-api/crypto/ExchangeDataManager.js.map +1 -1
  17. package/icc-x-api/crypto/ExtendedApisUtils.d.ts +1 -1
  18. package/icc-x-api/crypto/ExtendedApisUtils.js.map +1 -1
  19. package/icc-x-api/crypto/ExtendedApisUtilsImpl.d.ts +1 -1
  20. package/icc-x-api/crypto/ExtendedApisUtilsImpl.js +8 -2
  21. package/icc-x-api/crypto/ExtendedApisUtilsImpl.js.map +1 -1
  22. package/icc-x-api/crypto/RecoveryDataEncryption.js.map +1 -1
  23. package/icc-x-api/icc-accesslog-x-api.js +7 -7
  24. package/icc-x-api/icc-accesslog-x-api.js.map +1 -1
  25. package/icc-x-api/icc-calendar-item-x-api.js +7 -7
  26. package/icc-x-api/icc-calendar-item-x-api.js.map +1 -1
  27. package/icc-x-api/icc-classification-x-api.js +4 -5
  28. package/icc-x-api/icc-classification-x-api.js.map +1 -1
  29. package/icc-x-api/icc-code-x-api.d.ts +2 -2
  30. package/icc-x-api/icc-code-x-api.js +3 -33
  31. package/icc-x-api/icc-code-x-api.js.map +1 -1
  32. package/icc-x-api/icc-contact-x-api.js +20 -33
  33. package/icc-x-api/icc-contact-x-api.js.map +1 -1
  34. package/icc-x-api/icc-doctemplate-x-api.js.map +1 -1
  35. package/icc-x-api/icc-document-x-api.d.ts +8 -7
  36. package/icc-x-api/icc-document-x-api.js +64 -22
  37. package/icc-x-api/icc-document-x-api.js.map +1 -1
  38. package/icc-x-api/icc-form-x-api.js +3 -4
  39. package/icc-x-api/icc-form-x-api.js.map +1 -1
  40. package/icc-x-api/icc-helement-x-api.js +11 -11
  41. package/icc-x-api/icc-helement-x-api.js.map +1 -1
  42. package/icc-x-api/icc-invoice-x-api.js +3 -4
  43. package/icc-x-api/icc-invoice-x-api.js.map +1 -1
  44. package/icc-x-api/icc-maintenance-task-x-api.js +3 -3
  45. package/icc-x-api/icc-maintenance-task-x-api.js.map +1 -1
  46. package/icc-x-api/icc-patient-x-api.js +29 -29
  47. package/icc-x-api/icc-patient-x-api.js.map +1 -1
  48. package/icc-x-api/icc-receipt-x-api.d.ts +40 -0
  49. package/icc-x-api/icc-receipt-x-api.js +79 -1
  50. package/icc-x-api/icc-receipt-x-api.js.map +1 -1
  51. package/icc-x-api/icc-topic-x-api.js.map +1 -1
  52. package/icc-x-api/utils/code-util.d.ts +23 -0
  53. package/icc-x-api/utils/code-util.js +39 -2
  54. package/icc-x-api/utils/code-util.js.map +1 -1
  55. package/icc-x-api/utils/collection-utils.d.ts +13 -0
  56. package/icc-x-api/utils/collection-utils.js +79 -0
  57. package/icc-x-api/utils/collection-utils.js.map +1 -1
  58. package/icc-x-api/utils/compression-utils.d.ts +28 -0
  59. package/icc-x-api/utils/compression-utils.js +106 -0
  60. package/icc-x-api/utils/compression-utils.js.map +1 -0
  61. package/icc-x-api/utils/crypto-utils.js +7 -7
  62. package/icc-x-api/utils/crypto-utils.js.map +1 -1
  63. package/icc-x-api/utils/formatting-util.d.ts +3 -3
  64. package/icc-x-api/utils/formatting-util.js +22 -23
  65. package/icc-x-api/utils/formatting-util.js.map +1 -1
  66. package/icc-x-api/utils/hcp-util.js +2 -3
  67. package/icc-x-api/utils/hcp-util.js.map +1 -1
  68. package/icc-x-api/utils/insurability-util.js +10 -8
  69. package/icc-x-api/utils/insurability-util.js.map +1 -1
  70. package/icc-x-api/utils/lzma-wasm.d.ts +6 -0
  71. package/icc-x-api/utils/lzma-wasm.js +81 -0
  72. package/icc-x-api/utils/lzma-wasm.js.map +1 -0
  73. package/icc-x-api/utils/mutex.d.ts +12 -0
  74. package/icc-x-api/utils/mutex.js +26 -0
  75. package/icc-x-api/utils/mutex.js.map +1 -0
  76. package/icc-x-api/utils/websocket.js +7 -7
  77. package/icc-x-api/utils/websocket.js.map +1 -1
  78. package/icc-x-api/wasm/lzma/lzma.js +2 -0
  79. package/icc-x-api/wasm/lzma/lzma.wasm +0 -0
  80. package/package.json +2 -11
  81. package/icc-x-api/utils/uuid-encoder.d.ts +0 -44
  82. package/icc-x-api/utils/uuid-encoder.js +0 -114
  83. package/icc-x-api/utils/uuid-encoder.js.map +0 -1
  84. package/test/icc-api/api/IccAgendaApi.d.ts +0 -1
  85. package/test/icc-api/api/IccAgendaApi.js +0 -64
  86. package/test/icc-api/api/IccAgendaApi.js.map +0 -1
  87. package/test/icc-api/api/IccAnonymousAccessApi.d.ts +0 -1
  88. package/test/icc-api/api/IccAnonymousAccessApi.js +0 -58
  89. package/test/icc-api/api/IccAnonymousAccessApi.js.map +0 -1
  90. package/test/icc-api/api/IccCalendarItemApi.d.ts +0 -1
  91. package/test/icc-api/api/IccCalendarItemApi.js +0 -67
  92. package/test/icc-api/api/IccCalendarItemApi.js.map +0 -1
  93. package/test/icc-api/api/IccCalendarItemTypeApi.d.ts +0 -1
  94. package/test/icc-api/api/IccCalendarItemTypeApi.js +0 -96
  95. package/test/icc-api/api/IccCalendarItemTypeApi.js.map +0 -1
  96. package/test/icc-api/api/IccCodeApi.d.ts +0 -1
  97. package/test/icc-api/api/IccCodeApi.js +0 -38
  98. package/test/icc-api/api/IccCodeApi.js.map +0 -1
  99. package/test/icc-api/api/IccDocumentApi.d.ts +0 -1
  100. package/test/icc-api/api/IccDocumentApi.js +0 -199
  101. package/test/icc-api/api/IccDocumentApi.js.map +0 -1
  102. package/test/icc-api/api/IccGroupApi.d.ts +0 -1
  103. package/test/icc-api/api/IccGroupApi.js +0 -50
  104. package/test/icc-api/api/IccGroupApi.js.map +0 -1
  105. package/test/icc-api/api/IccKeywordApi.d.ts +0 -1
  106. package/test/icc-api/api/IccKeywordApi.js +0 -64
  107. package/test/icc-api/api/IccKeywordApi.js.map +0 -1
  108. package/test/icc-api/api/IccMedicalLocationApi.d.ts +0 -1
  109. package/test/icc-api/api/IccMedicalLocationApi.js +0 -64
  110. package/test/icc-api/api/IccMedicalLocationApi.js.map +0 -1
  111. package/test/icc-api/api/IccPlaceApi.d.ts +0 -1
  112. package/test/icc-api/api/IccPlaceApi.js +0 -64
  113. package/test/icc-api/api/IccPlaceApi.js.map +0 -1
  114. package/test/icc-api/api/IccRecoveryDataApi.d.ts +0 -1
  115. package/test/icc-api/api/IccRecoveryDataApi.js +0 -95
  116. package/test/icc-api/api/IccRecoveryDataApi.js.map +0 -1
  117. package/test/icc-api/api/IccRoleApi.d.ts +0 -1
  118. package/test/icc-api/api/IccRoleApi.js +0 -34
  119. package/test/icc-api/api/IccRoleApi.js.map +0 -1
  120. package/test/icc-api/api/IccUserApi.d.ts +0 -1
  121. package/test/icc-api/api/IccUserApi.js +0 -96
  122. package/test/icc-api/api/IccUserApi.js.map +0 -1
  123. package/test/icc-api/e2e/IccCalendarItemApi.d.ts +0 -1
  124. package/test/icc-api/e2e/IccCalendarItemApi.js +0 -46
  125. package/test/icc-api/e2e/IccCalendarItemApi.js.map +0 -1
  126. package/test/icc-api/model/modelHelpersTest.d.ts +0 -1
  127. package/test/icc-api/model/modelHelpersTest.js +0 -45
  128. package/test/icc-api/model/modelHelpersTest.js.map +0 -1
  129. package/test/icc-x-api/auth/group-switch-test.d.ts +0 -1
  130. package/test/icc-x-api/auth/group-switch-test.js +0 -81
  131. package/test/icc-x-api/auth/group-switch-test.js.map +0 -1
  132. package/test/icc-x-api/auth/jwt-concurrency-test.d.ts +0 -2
  133. package/test/icc-x-api/auth/jwt-concurrency-test.js +0 -112
  134. package/test/icc-x-api/auth/jwt-concurrency-test.js.map +0 -1
  135. package/test/icc-x-api/auth/jwt-provider-test.d.ts +0 -1
  136. package/test/icc-x-api/auth/jwt-provider-test.js +0 -197
  137. package/test/icc-x-api/auth/jwt-provider-test.js.map +0 -1
  138. package/test/icc-x-api/auth/smart-auth-provider-test.d.ts +0 -1
  139. package/test/icc-x-api/auth/smart-auth-provider-test.js +0 -224
  140. package/test/icc-x-api/auth/smart-auth-provider-test.js.map +0 -1
  141. package/test/icc-x-api/autofix-anonymity-test.d.ts +0 -1
  142. package/test/icc-x-api/autofix-anonymity-test.js +0 -122
  143. package/test/icc-x-api/autofix-anonymity-test.js.map +0 -1
  144. package/test/icc-x-api/confidential-entities-test.d.ts +0 -1
  145. package/test/icc-x-api/confidential-entities-test.js +0 -168
  146. package/test/icc-x-api/confidential-entities-test.js.map +0 -1
  147. package/test/icc-x-api/crud/comprehensive-crud-test.d.ts +0 -1
  148. package/test/icc-x-api/crud/comprehensive-crud-test.js +0 -276
  149. package/test/icc-x-api/crud/comprehensive-crud-test.js.map +0 -1
  150. package/test/icc-x-api/crud/entities-crud-test-interface.d.ts +0 -16
  151. package/test/icc-x-api/crud/entities-crud-test-interface.js +0 -408
  152. package/test/icc-x-api/crud/entities-crud-test-interface.js.map +0 -1
  153. package/test/icc-x-api/crypto/anonymous-delegations-test.d.ts +0 -1
  154. package/test/icc-x-api/crypto/anonymous-delegations-test.js +0 -587
  155. package/test/icc-x-api/crypto/anonymous-delegations-test.js.map +0 -1
  156. package/test/icc-x-api/crypto/concurrency.d.ts +0 -1
  157. package/test/icc-x-api/crypto/concurrency.js +0 -35
  158. package/test/icc-x-api/crypto/concurrency.js.map +0 -1
  159. package/test/icc-x-api/crypto/crypto-utils.d.ts +0 -1
  160. package/test/icc-x-api/crypto/crypto-utils.js +0 -79
  161. package/test/icc-x-api/crypto/crypto-utils.js.map +0 -1
  162. package/test/icc-x-api/crypto/cryptoTest.d.ts +0 -2
  163. package/test/icc-x-api/crypto/cryptoTest.js +0 -402
  164. package/test/icc-x-api/crypto/cryptoTest.js.map +0 -1
  165. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.d.ts +0 -1
  166. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js +0 -166
  167. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js.map +0 -1
  168. package/test/icc-x-api/crypto/exchange-data-manager-test.d.ts +0 -1
  169. package/test/icc-x-api/crypto/exchange-data-manager-test.js +0 -674
  170. package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +0 -1
  171. package/test/icc-x-api/crypto/full-crypto-test.d.ts +0 -1
  172. package/test/icc-x-api/crypto/full-crypto-test.js +0 -454
  173. package/test/icc-x-api/crypto/full-crypto-test.js.map +0 -1
  174. package/test/icc-x-api/crypto/legacy-metadata-migration-test.d.ts +0 -1
  175. package/test/icc-x-api/crypto/legacy-metadata-migration-test.js +0 -379
  176. package/test/icc-x-api/crypto/legacy-metadata-migration-test.js.map +0 -1
  177. package/test/icc-x-api/crypto/secure-delegations-manager-test.d.ts +0 -1
  178. package/test/icc-x-api/crypto/secure-delegations-manager-test.js +0 -278
  179. package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +0 -1
  180. package/test/icc-x-api/crypto/shamir.d.ts +0 -2
  181. package/test/icc-x-api/crypto/shamir.js +0 -167
  182. package/test/icc-x-api/crypto/shamir.js.map +0 -1
  183. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.d.ts +0 -1
  184. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js +0 -71
  185. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js.map +0 -1
  186. package/test/icc-x-api/crypto/soft-deleted-data-owners.d.ts +0 -2
  187. package/test/icc-x-api/crypto/soft-deleted-data-owners.js +0 -113
  188. package/test/icc-x-api/crypto/soft-deleted-data-owners.js.map +0 -1
  189. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.d.ts +0 -1
  190. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js +0 -246
  191. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js.map +0 -1
  192. package/test/icc-x-api/entity-with-attachments-api-test.d.ts +0 -1
  193. package/test/icc-x-api/entity-with-attachments-api-test.js +0 -142
  194. package/test/icc-x-api/entity-with-attachments-api-test.js.map +0 -1
  195. package/test/icc-x-api/filters/filters.d.ts +0 -1
  196. package/test/icc-x-api/filters/filters.js +0 -49
  197. package/test/icc-x-api/filters/filters.js.map +0 -1
  198. package/test/icc-x-api/filters/healthelement.d.ts +0 -1
  199. package/test/icc-x-api/filters/healthelement.js +0 -333
  200. package/test/icc-x-api/filters/healthelement.js.map +0 -1
  201. package/test/icc-x-api/icc-accesslog-x-api.d.ts +0 -1
  202. package/test/icc-x-api/icc-accesslog-x-api.js +0 -106
  203. package/test/icc-x-api/icc-accesslog-x-api.js.map +0 -1
  204. package/test/icc-x-api/icc-application-settings-x-api.d.ts +0 -1
  205. package/test/icc-x-api/icc-application-settings-x-api.js +0 -91
  206. package/test/icc-x-api/icc-application-settings-x-api.js.map +0 -1
  207. package/test/icc-x-api/icc-auth-api.d.ts +0 -1
  208. package/test/icc-x-api/icc-auth-api.js +0 -47
  209. package/test/icc-x-api/icc-auth-api.js.map +0 -1
  210. package/test/icc-x-api/icc-calendar-item-x-api.d.ts +0 -1
  211. package/test/icc-x-api/icc-calendar-item-x-api.js +0 -150
  212. package/test/icc-x-api/icc-calendar-item-x-api.js.map +0 -1
  213. package/test/icc-x-api/icc-contact-x-api.d.ts +0 -1
  214. package/test/icc-x-api/icc-contact-x-api.js +0 -355
  215. package/test/icc-x-api/icc-contact-x-api.js.map +0 -1
  216. package/test/icc-x-api/icc-document-x-api.d.ts +0 -1
  217. package/test/icc-x-api/icc-document-x-api.js +0 -76
  218. package/test/icc-x-api/icc-document-x-api.js.map +0 -1
  219. package/test/icc-x-api/icc-form-x-api.d.ts +0 -1
  220. package/test/icc-x-api/icc-form-x-api.js +0 -413
  221. package/test/icc-x-api/icc-form-x-api.js.map +0 -1
  222. package/test/icc-x-api/icc-hcparty-x-api-test.d.ts +0 -1
  223. package/test/icc-x-api/icc-hcparty-x-api-test.js +0 -43
  224. package/test/icc-x-api/icc-hcparty-x-api-test.js.map +0 -1
  225. package/test/icc-x-api/icc-helement-x-api-test.d.ts +0 -1
  226. package/test/icc-x-api/icc-helement-x-api-test.js +0 -155
  227. package/test/icc-x-api/icc-helement-x-api-test.js.map +0 -1
  228. package/test/icc-x-api/icc-invoice-x-api.d.ts +0 -1
  229. package/test/icc-x-api/icc-invoice-x-api.js +0 -99
  230. package/test/icc-x-api/icc-invoice-x-api.js.map +0 -1
  231. package/test/icc-x-api/icc-maintenance-task-x-api-test.d.ts +0 -1
  232. package/test/icc-x-api/icc-maintenance-task-x-api-test.js +0 -222
  233. package/test/icc-x-api/icc-maintenance-task-x-api-test.js.map +0 -1
  234. package/test/icc-x-api/icc-message-x-api.d.ts +0 -1
  235. package/test/icc-x-api/icc-message-x-api.js +0 -54
  236. package/test/icc-x-api/icc-message-x-api.js.map +0 -1
  237. package/test/icc-x-api/icc-patient-x-api-test.d.ts +0 -1
  238. package/test/icc-x-api/icc-patient-x-api-test.js +0 -165
  239. package/test/icc-x-api/icc-patient-x-api-test.js.map +0 -1
  240. package/test/icc-x-api/icc-recovery-x-api.d.ts +0 -1
  241. package/test/icc-x-api/icc-recovery-x-api.js +0 -175
  242. package/test/icc-x-api/icc-recovery-x-api.js.map +0 -1
  243. package/test/icc-x-api/icc-topic-x-api.d.ts +0 -1
  244. package/test/icc-x-api/icc-topic-x-api.js +0 -269
  245. package/test/icc-x-api/icc-topic-x-api.js.map +0 -1
  246. package/test/icc-x-api/icc-user-x-api-test.d.ts +0 -1
  247. package/test/icc-x-api/icc-user-x-api-test.js +0 -99
  248. package/test/icc-x-api/icc-user-x-api-test.js.map +0 -1
  249. package/test/icc-x-api/keyless-api.d.ts +0 -1
  250. package/test/icc-x-api/keyless-api.js +0 -125
  251. package/test/icc-x-api/keyless-api.js.map +0 -1
  252. package/test/icc-x-api/patient-user.d.ts +0 -2
  253. package/test/icc-x-api/patient-user.js +0 -103
  254. package/test/icc-x-api/patient-user.js.map +0 -1
  255. package/test/icc-x-api/storage/storage.d.ts +0 -1
  256. package/test/icc-x-api/storage/storage.js +0 -48
  257. package/test/icc-x-api/storage/storage.js.map +0 -1
  258. package/test/icc-x-api/test-api-no-parent.d.ts +0 -1
  259. package/test/icc-x-api/test-api-no-parent.js +0 -79
  260. package/test/icc-x-api/test-api-no-parent.js.map +0 -1
  261. package/test/icc-x-api/test-legacy-data-support.d.ts +0 -1
  262. package/test/icc-x-api/test-legacy-data-support.js +0 -375
  263. package/test/icc-x-api/test-legacy-data-support.js.map +0 -1
  264. package/test/icc-x-api/utils/graph-test.d.ts +0 -1
  265. package/test/icc-x-api/utils/graph-test.js +0 -54
  266. package/test/icc-x-api/utils/graph-test.js.map +0 -1
  267. package/test/icc-x-api/utils/lru-temporised-async-cache-test.d.ts +0 -1
  268. package/test/icc-x-api/utils/lru-temporised-async-cache-test.js +0 -364
  269. package/test/icc-x-api/utils/lru-temporised-async-cache-test.js.map +0 -1
  270. package/test/support/CSM-185.d.ts +0 -1
  271. package/test/support/CSM-185.js +0 -124
  272. package/test/support/CSM-185.js.map +0 -1
  273. package/test/support/CSM-243.d.ts +0 -1
  274. package/test/support/CSM-243.js +0 -120
  275. package/test/support/CSM-243.js.map +0 -1
  276. package/test/support/CSM-543.d.ts +0 -1
  277. package/test/support/CSM-543.js +0 -164
  278. package/test/support/CSM-543.js.map +0 -1
  279. package/test/support/CSM-729.d.ts +0 -1
  280. package/test/support/CSM-729.js +0 -225
  281. package/test/support/CSM-729.js.map +0 -1
  282. package/test/support/CSM-87.d.ts +0 -0
  283. package/test/support/CSM-87.js +0 -21
  284. package/test/support/CSM-87.js.map +0 -1
  285. package/test/support/CSM-93.d.ts +0 -1
  286. package/test/support/CSM-93.js +0 -112
  287. package/test/support/CSM-93.js.map +0 -1
  288. package/test/utils/FakeDataOwnerApi.d.ts +0 -32
  289. package/test/utils/FakeDataOwnerApi.js +0 -136
  290. package/test/utils/FakeDataOwnerApi.js.map +0 -1
  291. package/test/utils/FakeEncryptionKeysManager.d.ts +0 -36
  292. package/test/utils/FakeEncryptionKeysManager.js +0 -98
  293. package/test/utils/FakeEncryptionKeysManager.js.map +0 -1
  294. package/test/utils/FakeExchangeDataApi.d.ts +0 -32
  295. package/test/utils/FakeExchangeDataApi.js +0 -92
  296. package/test/utils/FakeExchangeDataApi.js.map +0 -1
  297. package/test/utils/FakeExchangeDataManager.d.ts +0 -48
  298. package/test/utils/FakeExchangeDataManager.js +0 -82
  299. package/test/utils/FakeExchangeDataManager.js.map +0 -1
  300. package/test/utils/FakeExchangeDataMapManager.d.ts +0 -12
  301. package/test/utils/FakeExchangeDataMapManager.js +0 -38
  302. package/test/utils/FakeExchangeDataMapManager.js.map +0 -1
  303. package/test/utils/FakeGenericApi.d.ts +0 -16
  304. package/test/utils/FakeGenericApi.js +0 -65
  305. package/test/utils/FakeGenericApi.js.map +0 -1
  306. package/test/utils/KeylessCryptoStrategies.d.ts +0 -23
  307. package/test/utils/KeylessCryptoStrategies.js +0 -26
  308. package/test/utils/KeylessCryptoStrategies.js.map +0 -1
  309. package/test/utils/TestApi.d.ts +0 -3
  310. package/test/utils/TestApi.js +0 -30
  311. package/test/utils/TestApi.js.map +0 -1
  312. package/test/utils/TestCollectionUtils.d.ts +0 -1
  313. package/test/utils/TestCollectionUtils.js +0 -109
  314. package/test/utils/TestCollectionUtils.js.map +0 -1
  315. package/test/utils/TestCryptoStrategies.d.ts +0 -42
  316. package/test/utils/TestCryptoStrategies.js +0 -80
  317. package/test/utils/TestCryptoStrategies.js.map +0 -1
  318. package/test/utils/TestStorage.d.ts +0 -23
  319. package/test/utils/TestStorage.js +0 -61
  320. package/test/utils/TestStorage.js.map +0 -1
  321. package/test/utils/roles.d.ts +0 -14
  322. package/test/utils/roles.js +0 -345
  323. package/test/utils/roles.js.map +0 -1
  324. package/test/utils/test_utils.d.ts +0 -87
  325. package/test/utils/test_utils.js +0 -452
  326. package/test/utils/test_utils.js.map +0 -1
@@ -1,375 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- require("isomorphic-fetch");
13
- const apiV6_1 = require("@icure/apiV6");
14
- const apiV7_1 = require("@icure/apiV7");
15
- const icc_x_api_1 = require("../../icc-x-api");
16
- const test_utils_1 = require("../utils/test_utils");
17
- const chai_1 = require("chai");
18
- const crypto_1 = require("crypto");
19
- const uuid_1 = require("uuid");
20
- const HealthcareParty_1 = require("../../icc-api/model/HealthcareParty");
21
- const TestStorage_1 = require("../utils/TestStorage");
22
- const TestCryptoStrategies_1 = require("../utils/TestCryptoStrategies");
23
- const EntityShareRequest_1 = require("../../icc-api/model/requests/EntityShareRequest");
24
- const types_1 = require("@icure/test-setup/types");
25
- const utils_1 = require("../../icc-x-api/crypto/utils");
26
- var RequestedPermissionEnum = EntityShareRequest_1.EntityShareRequest.RequestedPermissionEnum;
27
- function checkEncryptedData(actual, expected, actualName) {
28
- (0, chai_1.expect)(actual.secretContent, `${actualName} - secret content`).to.equal(expected.secretContent);
29
- (0, chai_1.expect)(actual.secretIds, `${actualName} - secret ids`).to.have.length(expected.secretIds.length);
30
- for (const expectedId of expected.secretIds) {
31
- (0, chai_1.expect)(actual.secretIds, `${actualName} - secret id`).to.contain(expectedId);
32
- }
33
- (0, chai_1.expect)(actual.owningEntityIds, `${actualName} - owning entity id`).to.have.length(expected.owningEntityIds.length);
34
- for (const expectedId of expected.owningEntityIds) {
35
- (0, chai_1.expect)(actual.owningEntityIds, `${actualName} - owning entity id`).to.contain(expectedId);
36
- }
37
- }
38
- (0, test_utils_1.setLocalStorage)(fetch);
39
- const cryptoPrimitives = new icc_x_api_1.WebCryptoPrimitives(crypto_1.webcrypto);
40
- let env;
41
- class ApiFactoryV6 {
42
- constructor() {
43
- this.version = 'apiV6.x';
44
- }
45
- masterApi(env) {
46
- return __awaiter(this, void 0, void 0, function* () {
47
- const apis = yield (0, apiV6_1.Api)(env.iCureUrl + '/rest/v1', env.masterHcp.user, env.masterHcp.password, crypto_1.webcrypto, fetch, false, false, new TestStorage_1.TestStorage(), new TestStorage_1.TestKeyStorage());
48
- return {
49
- createUser: () => __awaiter(this, void 0, void 0, function* () {
50
- const pair = yield cryptoPrimitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha1);
51
- const hcp = yield apis.healthcarePartyApi.createHealthcareParty(new HealthcareParty_1.HealthcareParty({ id: (0, uuid_1.v4)(), firstName: `name`, lastName: 'v6' }));
52
- const user = yield apis.userApi.createUser(new apiV6_1.User({
53
- id: (0, uuid_1.v4)(),
54
- login: `v6-${(0, uuid_1.v4)()}`,
55
- status: 'ACTIVE',
56
- healthcarePartyId: hcp.id,
57
- }));
58
- return {
59
- login: user.login,
60
- password: yield apis.userApi.getToken(user.id, (0, uuid_1.v4)()),
61
- key: pair,
62
- ownerId: hcp.id,
63
- };
64
- }),
65
- };
66
- });
67
- }
68
- testApi(credentials) {
69
- return __awaiter(this, void 0, void 0, function* () {
70
- const apis = yield (0, apiV6_1.Api)(env.iCureUrl + '/rest/v1', credentials.login, credentials.password, crypto_1.webcrypto, fetch);
71
- // await apis.cryptoApi.cacheKeyPair(await cryptoPrimitives.RSA.exportKeys(credentials.key, "jwk", "jwk"))
72
- const user = yield apis.userApi.getCurrentUser();
73
- yield apis.cryptoApi.addKeyPairForOwner(apis.maintenanceTaskApi, user, yield apis.cryptoApi.getDataOwner(credentials.ownerId), credentials.key, false, false);
74
- return {
75
- userDetails: () => __awaiter(this, void 0, void 0, function* () {
76
- return { userId: user.id, dataOwnerId: credentials.ownerId };
77
- }),
78
- createEncryptedData: () => __awaiter(this, void 0, void 0, function* () {
79
- const note = `v6 note ${(0, uuid_1.v4)()}`;
80
- const patient = yield apis.patientApi.createPatientWithUser(user, yield apis.patientApi.newInstance(user));
81
- const healthdata = yield apis.healthcareElementApi.createHealthElementWithUser(user, yield apis.healthcareElementApi.newInstance(user, patient, { note }));
82
- return {
83
- id: healthdata.id,
84
- secretContent: note,
85
- secretIds: (yield apis.cryptoApi.extractDelegationsSFKs(healthdata, credentials.ownerId)).extractedKeys,
86
- owningEntityIds: [patient.id],
87
- };
88
- }),
89
- getDecryptedData: (id) => __awaiter(this, void 0, void 0, function* () {
90
- const healthdata = yield apis.healthcareElementApi.getHealthElementWithUser(user, id);
91
- return {
92
- secretContent: healthdata.note,
93
- secretIds: (yield apis.cryptoApi.extractDelegationsSFKs(healthdata, credentials.ownerId)).extractedKeys,
94
- owningEntityIds: (yield apis.cryptoApi.extractCryptedFKs(healthdata, credentials.ownerId)).extractedKeys,
95
- };
96
- }),
97
- shareEncryptedData: (dataId, delegateId) => __awaiter(this, void 0, void 0, function* () {
98
- const healthElement = yield apis.healthcareElementApi.getHealthElementWithUser(user, dataId);
99
- const patientIds = (yield apis.cryptoApi.extractCryptedFKs(healthElement, credentials.ownerId)).extractedKeys;
100
- (0, chai_1.expect)(patientIds).to.have.length(1);
101
- const patient = yield apis.patientApi.getPatientWithUser(user, patientIds[0]);
102
- const secretIds = (yield apis.cryptoApi.extractDelegationsSFKs(healthElement, credentials.ownerId)).extractedKeys;
103
- (0, chai_1.expect)(secretIds).to.have.length(1);
104
- yield apis.healthcareElementApi.modifyHealthElementWithUser(user, (yield apis.cryptoApi.extendedDelegationsAndCryptedForeignKeys(healthElement, patient, credentials.ownerId, delegateId, secretIds[0])).modifiedObject);
105
- }),
106
- };
107
- });
108
- }
109
- }
110
- class TestCryptoStrategiesV7 {
111
- constructor(key) {
112
- this.key = key;
113
- this.RSA = new icc_x_api_1.RSAUtilsImpl(crypto_1.webcrypto);
114
- }
115
- generateNewKeyForDataOwner(self) {
116
- return __awaiter(this, void 0, void 0, function* () {
117
- if (!this.key)
118
- return false;
119
- const knownKeys = new Set(...(0, utils_1.hexPublicKeysWithSha1Of)(self));
120
- if (knownKeys.size <= 0)
121
- return this.key;
122
- return false;
123
- });
124
- }
125
- recoverAndVerifySelfHierarchyKeys(keysData) {
126
- return __awaiter(this, void 0, void 0, function* () {
127
- const self = keysData[keysData.length - 1].dataOwner;
128
- const knownKeys = new Set([...(0, utils_1.hexPublicKeysWithSha1Of)(self.dataOwner), ...(0, utils_1.hexPublicKeysWithSha256Of)(self.dataOwner)]);
129
- const publicKey = this.key ? (0, icc_x_api_1.ua2hex)(yield this.RSA.exportKey(this.key.publicKey, 'spki')) : undefined;
130
- return Object.fromEntries(yield Promise.all(keysData.map((currData) => __awaiter(this, void 0, void 0, function* () {
131
- if (currData.dataOwner.dataOwner.id !== self.dataOwner.id) {
132
- return [
133
- currData.dataOwner.dataOwner.id,
134
- {
135
- recoveredKeys: {},
136
- keyAuthenticity: {},
137
- },
138
- ];
139
- }
140
- else if (publicKey === undefined || !knownKeys.has(publicKey)) {
141
- return [currData.dataOwner.dataOwner.id, { recoveredKeys: {}, keyAuthenticity: {} }];
142
- }
143
- else {
144
- return [currData.dataOwner.dataOwner.id, { recoveredKeys: { [publicKey.slice(-32)]: this.key }, keyAuthenticity: {} }];
145
- }
146
- }))));
147
- });
148
- }
149
- verifyDelegatePublicKeys(delegate, publicKeys) {
150
- return Promise.resolve(publicKeys);
151
- }
152
- }
153
- class ApiFactoryV7 {
154
- constructor() {
155
- this.version = 'apiV7.x';
156
- }
157
- masterApi(env) {
158
- return __awaiter(this, void 0, void 0, function* () {
159
- const key = {
160
- privateKey: yield cryptoPrimitives.RSA.importKey('pkcs8', (0, icc_x_api_1.ua2ab)((0, icc_x_api_1.hex2ua)(env.masterHcp.privateKey)), ['decrypt'], icc_x_api_1.ShaVersion.Sha1),
161
- publicKey: yield cryptoPrimitives.RSA.importKey('spki', (0, icc_x_api_1.ua2ab)((0, icc_x_api_1.hex2ua)(env.masterHcp.publicKey)), ['encrypt'], icc_x_api_1.ShaVersion.Sha1),
162
- };
163
- const apis = yield apiV7_1.IcureApi.initialise(env.iCureUrl, { username: env.masterHcp.user, password: env.masterHcp.password }, new TestCryptoStrategiesV7(key), crypto_1.webcrypto, fetch, {
164
- storage: new TestStorage_1.TestStorage(),
165
- keyStorage: new TestStorage_1.TestKeyStorage(),
166
- });
167
- return {
168
- createUser: () => __awaiter(this, void 0, void 0, function* () {
169
- const pair = yield cryptoPrimitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha1);
170
- const hcp = yield apis.healthcarePartyApi.createHealthcareParty(new HealthcareParty_1.HealthcareParty({ id: (0, uuid_1.v4)(), firstName: `name`, lastName: 'v7' }));
171
- const user = yield apis.userApi.createUser(new apiV7_1.User({
172
- id: (0, uuid_1.v4)(),
173
- login: `v7-${(0, uuid_1.v4)()}`,
174
- status: 'ACTIVE',
175
- healthcarePartyId: hcp.id,
176
- }));
177
- return {
178
- login: user.login,
179
- password: yield apis.userApi.getToken(user.id, (0, uuid_1.v4)()),
180
- key: pair,
181
- ownerId: hcp.id,
182
- };
183
- }),
184
- };
185
- });
186
- }
187
- testApi(credentials) {
188
- return __awaiter(this, void 0, void 0, function* () {
189
- const testStorage = yield (0, TestStorage_1.testStorageWithKeys)([
190
- {
191
- dataOwnerId: credentials.ownerId,
192
- pairs: [
193
- {
194
- keyPair: {
195
- publicKey: (0, icc_x_api_1.ua2hex)(yield cryptoPrimitives.RSA.exportKey(credentials.key.publicKey, 'spki')),
196
- privateKey: (0, icc_x_api_1.ua2hex)(yield cryptoPrimitives.RSA.exportKey(credentials.key.privateKey, 'pkcs8')),
197
- },
198
- shaVersion: icc_x_api_1.ShaVersion.Sha1,
199
- },
200
- ],
201
- },
202
- ]);
203
- const apis = yield apiV7_1.IcureApi.initialise(env.iCureUrl, {
204
- username: credentials.login,
205
- password: credentials.password,
206
- }, new TestCryptoStrategiesV7(credentials.key), crypto_1.webcrypto, fetch, {
207
- storage: testStorage.storage,
208
- keyStorage: testStorage.keyStorage,
209
- entryKeysFactory: testStorage.keyFactory,
210
- });
211
- const user = yield apis.userApi.getCurrentUser();
212
- return {
213
- userDetails: () => __awaiter(this, void 0, void 0, function* () {
214
- return { userId: user.id, dataOwnerId: credentials.ownerId };
215
- }),
216
- createEncryptedData: () => __awaiter(this, void 0, void 0, function* () {
217
- const note = `v7 note ${uuid_1.v4}`;
218
- const patient = yield apis.patientApi.createPatientWithUser(user, yield apis.patientApi.newInstance(user));
219
- const healthdata = yield apis.healthcareElementApi.createHealthElementWithUser(user, yield apis.healthcareElementApi.newInstance(user, patient, { note }));
220
- const secretIds = yield apis.cryptoApi.entities.secretIdsOf(healthdata);
221
- (0, chai_1.expect)(secretIds).to.have.length(1);
222
- return {
223
- id: healthdata.id,
224
- secretContent: note,
225
- secretIds,
226
- owningEntityIds: [patient.id],
227
- };
228
- }),
229
- getDecryptedData: (id) => __awaiter(this, void 0, void 0, function* () {
230
- const healthdata = yield apis.healthcareElementApi.getHealthElementWithUser(user, id);
231
- return {
232
- secretContent: healthdata.note,
233
- secretIds: yield apis.cryptoApi.entities.secretIdsOf(healthdata),
234
- owningEntityIds: yield apis.cryptoApi.entities.owningEntityIdsOf(healthdata),
235
- };
236
- }),
237
- shareEncryptedData: (dataId, delegateId) => __awaiter(this, void 0, void 0, function* () {
238
- const healthElement = yield apis.healthcareElementApi.getHealthElementWithUser(user, dataId);
239
- const encryptionKeys = yield apis.cryptoApi.entities.encryptionKeysOf(healthElement);
240
- const secretIds = yield apis.cryptoApi.entities.secretIdsOf(healthElement);
241
- const owningEntityIds = yield apis.cryptoApi.entities.owningEntityIdsOf(healthElement);
242
- yield apis.healthcareElementApi.modifyHealthElementWithUser(user, yield apis.cryptoApi.entities.entityWithExtendedEncryptedMetadata(healthElement, delegateId, secretIds, encryptionKeys, owningEntityIds, []));
243
- }),
244
- };
245
- });
246
- }
247
- }
248
- class ApiFactoryV8 {
249
- constructor() {
250
- this.version = 'apiV8.x';
251
- }
252
- masterApi(env) {
253
- return __awaiter(this, void 0, void 0, function* () {
254
- const key = {
255
- privateKey: yield cryptoPrimitives.RSA.importKey('pkcs8', (0, icc_x_api_1.ua2ab)((0, icc_x_api_1.hex2ua)(env.masterHcp.privateKey)), ['decrypt'], icc_x_api_1.ShaVersion.Sha1),
256
- publicKey: yield cryptoPrimitives.RSA.importKey('spki', (0, icc_x_api_1.ua2ab)((0, icc_x_api_1.hex2ua)(env.masterHcp.publicKey)), ['encrypt'], icc_x_api_1.ShaVersion.Sha1),
257
- };
258
- const apis = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, { username: env.masterHcp.user, password: env.masterHcp.password }, new TestCryptoStrategies_1.TestCryptoStrategies(key), crypto_1.webcrypto, fetch, {
259
- storage: new TestStorage_1.TestStorage(),
260
- keyStorage: new TestStorage_1.TestKeyStorage(),
261
- });
262
- return {
263
- createUser: () => __awaiter(this, void 0, void 0, function* () {
264
- const pair = yield cryptoPrimitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
265
- const hcp = yield apis.healthcarePartyApi.createHealthcareParty(new HealthcareParty_1.HealthcareParty({ id: (0, uuid_1.v4)(), firstName: `name`, lastName: 'v7' }));
266
- const user = yield apis.userApi.createUser(new apiV7_1.User({
267
- id: (0, uuid_1.v4)(),
268
- login: `v7-${(0, uuid_1.v4)()}`,
269
- status: 'ACTIVE',
270
- healthcarePartyId: hcp.id,
271
- }));
272
- return {
273
- login: user.login,
274
- password: yield apis.userApi.getToken(user.id, (0, uuid_1.v4)()),
275
- key: pair,
276
- ownerId: hcp.id,
277
- };
278
- }),
279
- };
280
- });
281
- }
282
- testApi(credentials) {
283
- return __awaiter(this, void 0, void 0, function* () {
284
- const testStorage = yield (0, TestStorage_1.testStorageWithKeys)([
285
- {
286
- dataOwnerId: credentials.ownerId,
287
- pairs: [
288
- {
289
- keyPair: {
290
- publicKey: (0, icc_x_api_1.ua2hex)(yield cryptoPrimitives.RSA.exportKey(credentials.key.publicKey, 'spki')),
291
- privateKey: (0, icc_x_api_1.ua2hex)(yield cryptoPrimitives.RSA.exportKey(credentials.key.privateKey, 'pkcs8')),
292
- },
293
- shaVersion: icc_x_api_1.ShaVersion.Sha1,
294
- },
295
- ],
296
- },
297
- ]);
298
- const apis = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, {
299
- username: credentials.login,
300
- password: credentials.password,
301
- }, new TestCryptoStrategies_1.TestCryptoStrategies(credentials.key), crypto_1.webcrypto, fetch, {
302
- storage: testStorage.storage,
303
- keyStorage: testStorage.keyStorage,
304
- entryKeysFactory: testStorage.keyFactory,
305
- });
306
- const user = yield apis.userApi.getCurrentUser();
307
- return {
308
- userDetails: () => __awaiter(this, void 0, void 0, function* () {
309
- return { userId: user.id, dataOwnerId: credentials.ownerId };
310
- }),
311
- createEncryptedData: () => __awaiter(this, void 0, void 0, function* () {
312
- const note = `v8 note ${(0, uuid_1.v4)()}`;
313
- const patient = yield apis.patientApi.createPatientWithUser(user, yield apis.patientApi.newInstance(user));
314
- const healthdata = yield apis.healthcareElementApi.createHealthElementWithUser(user, yield apis.healthcareElementApi.newInstance(user, patient, { note }));
315
- return {
316
- id: healthdata.id,
317
- secretContent: note,
318
- secretIds: [],
319
- owningEntityIds: [patient.id],
320
- };
321
- }),
322
- getDecryptedData: (id) => __awaiter(this, void 0, void 0, function* () {
323
- const healthdata = yield apis.healthcareElementApi.getHealthElementWithUser(user, id);
324
- return {
325
- secretContent: healthdata.note,
326
- secretIds: yield apis.cryptoApi.xapi.secretIdsOf({ entity: healthdata, type: icc_x_api_1.EntityWithDelegationTypeName.HealthElement }, undefined),
327
- owningEntityIds: yield apis.healthcareElementApi.decryptPatientIdOf(healthdata),
328
- };
329
- }),
330
- shareEncryptedData: (dataId, delegateId) => __awaiter(this, void 0, void 0, function* () {
331
- const healthElement = yield apis.healthcareElementApi.getHealthElementWithUser(user, dataId);
332
- yield apis.healthcareElementApi.shareWith(delegateId, healthElement, { requestedPermissions: RequestedPermissionEnum.MAX_WRITE });
333
- }),
334
- };
335
- });
336
- }
337
- }
338
- // Api factories in chronological version order
339
- let chronologicalApiFactories = [new ApiFactoryV6(), new ApiFactoryV7(), new ApiFactoryV8()];
340
- describe('All apis versions', function () {
341
- return __awaiter(this, void 0, void 0, function* () {
342
- before(function () {
343
- return __awaiter(this, void 0, void 0, function* () {
344
- this.timeout(600000);
345
- env = yield (0, test_utils_1.getEnvironmentInitializer)().then((initializer) => initializer.execute((0, types_1.getEnvVariables)()));
346
- });
347
- });
348
- for (let legacyApiIndex = 0; legacyApiIndex < chronologicalApiFactories.length - 1; legacyApiIndex++) {
349
- const legacyApiFactory = chronologicalApiFactories[legacyApiIndex];
350
- const newApiFactories = chronologicalApiFactories.slice(legacyApiIndex + 1);
351
- it(`should be able to read and share data from older apis without affecting accessibility for older apis - ${legacyApiFactory.version}`, function () {
352
- return __awaiter(this, void 0, void 0, function* () {
353
- const legacyMasterApi = yield legacyApiFactory.masterApi(env);
354
- const legacyUserCredentials = yield legacyMasterApi.createUser();
355
- const legacyUserApi = yield legacyApiFactory.testApi(legacyUserCredentials);
356
- const data = yield legacyUserApi.createEncryptedData();
357
- checkEncryptedData(yield legacyUserApi.getDecryptedData(data.id), data, 'Original decrypted data');
358
- const newApis = yield Promise.all(newApiFactories.map((factory) => __awaiter(this, void 0, void 0, function* () {
359
- const newLegacyUserApi = yield factory.testApi(legacyUserCredentials);
360
- const newUser = yield factory.masterApi(env).then((masterApi) => masterApi.createUser());
361
- const newUserApi = yield factory.testApi(newUser);
362
- return { newLegacyUserApi, newUserApi, version: factory.version };
363
- })));
364
- for (const { newLegacyUserApi, newUserApi, version } of newApis) {
365
- checkEncryptedData(yield newLegacyUserApi.getDecryptedData(data.id), data, `Data decrypted by legacy user on new api (${version})`);
366
- yield newLegacyUserApi.shareEncryptedData(data.id, (yield newUserApi.userDetails()).dataOwnerId);
367
- checkEncryptedData(yield newUserApi.getDecryptedData(data.id), data, `Data decrypted by new user (${version})`);
368
- }
369
- checkEncryptedData(yield legacyUserApi.getDecryptedData(data.id), data, `Data after changes by new versions of api`);
370
- });
371
- });
372
- }
373
- });
374
- });
375
- //# sourceMappingURL=test-legacy-data-support.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-legacy-data-support.js","sourceRoot":"","sources":["../../../test/icc-x-api/test-legacy-data-support.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,4BAAyB;AACzB,wCAA2D;AAC3D,wCAAkJ;AAClJ,+CAUwB;AACxB,oDAAgF;AAEhF,+BAA6B;AAC7B,mCAAkC;AAElC,+BAAiC;AACjC,yEAAqE;AACrE,sDAAuF;AACvF,wEAAoE;AACpE,wFAAoF;AACpF,mDAAmE;AACnE,wDAAiG;AACjG,IAAO,uBAAuB,GAAG,uCAAkB,CAAC,uBAAuB,CAAA;AA+B3E,SAAS,kBAAkB,CAAC,MAAqB,EAAE,QAAuB,EAAE,UAAkB;IAC5F,IAAA,aAAM,EAAC,MAAM,CAAC,aAAa,EAAE,GAAG,UAAU,mBAAmB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;IAC/F,IAAA,aAAM,EAAC,MAAM,CAAC,SAAS,EAAE,GAAG,UAAU,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAChG,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC5C,IAAA,aAAM,EAAC,MAAM,CAAC,SAAS,EAAE,GAAG,UAAU,cAAc,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAC9E,CAAC;IACD,IAAA,aAAM,EAAC,MAAM,CAAC,eAAe,EAAE,GAAG,UAAU,qBAAqB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;IAClH,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,eAAe,EAAE,CAAC;QAClD,IAAA,aAAM,EAAC,MAAM,CAAC,eAAe,EAAE,GAAG,UAAU,qBAAqB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAC3F,CAAC;AACH,CAAC;AAED,IAAA,4BAAe,EAAC,KAAK,CAAC,CAAA;AACtB,MAAM,gBAAgB,GAAG,IAAI,+BAAmB,CAAC,kBAAgB,CAAC,CAAA;AAClE,IAAI,GAAa,CAAA;AAEjB,MAAM,YAAY;IAAlB;QACW,YAAO,GAAW,SAAS,CAAA;IA0FtC,CAAC;IAxFO,SAAS,CAAC,GAAa;;YAC3B,MAAM,IAAI,GAAG,MAAM,IAAA,WAAK,EACtB,GAAG,CAAC,QAAQ,GAAG,UAAU,EACzB,GAAG,CAAC,SAAU,CAAC,IAAI,EACnB,GAAG,CAAC,SAAU,CAAC,QAAQ,EACvB,kBAAgB,EAChB,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,yBAAW,EAAE,EACjB,IAAI,4BAAc,EAAE,CACrB,CAAA;YACD,OAA6B;gBAC3B,UAAU,EAAE,GAAS,EAAE;oBACrB,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,IAAI,CAAC,CAAA;oBACxE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,IAAI,iCAAe,CAAC,EAAE,EAAE,EAAE,IAAA,SAAI,GAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;oBACvI,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CACxC,IAAI,YAAM,CAAC;wBACT,EAAE,EAAE,IAAA,SAAI,GAAE;wBACV,KAAK,EAAE,MAAM,IAAA,SAAI,GAAE,EAAE;wBACrB,MAAM,EAAE,QAAQ;wBAChB,iBAAiB,EAAE,GAAG,CAAC,EAAE;qBAC1B,CAAC,CACH,CAAA;oBACD,OAAO;wBACL,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,QAAQ,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAG,EAAE,IAAA,SAAI,GAAE,CAAC;wBACvD,GAAG,EAAE,IAAI;wBACT,OAAO,EAAE,GAAG,CAAC,EAAE;qBAChB,CAAA;gBACH,CAAC,CAAA;aACF,CAAA;QACH,CAAC;KAAA;IAEK,OAAO,CAAC,WAA4B;;YACxC,MAAM,IAAI,GAAG,MAAM,IAAA,WAAK,EAAC,GAAG,CAAC,QAAQ,GAAG,UAAU,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE,kBAAgB,EAAE,KAAK,CAAC,CAAA;YACrH,0GAA0G;YAC1G,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAA;YAChD,MAAM,IAAI,CAAC,SAAS,CAAC,kBAAkB,CACrC,IAAI,CAAC,kBAAkB,EACvB,IAAI,EACJ,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,EACtD,WAAW,CAAC,GAAG,EACf,KAAK,EACL,KAAK,CACN,CAAA;YACD,OAAO;gBACL,WAAW,EAAE,GAAS,EAAE;oBACtB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAG,EAAE,WAAW,EAAE,WAAW,CAAC,OAAO,EAAE,CAAA;gBAC/D,CAAC,CAAA;gBACD,mBAAmB,EAAE,GAAS,EAAE;oBAC9B,MAAM,IAAI,GAAG,WAAW,IAAA,SAAI,GAAE,EAAE,CAAA;oBAChC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAA;oBAC1G,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,2BAA2B,CAC5E,IAAI,EACJ,MAAM,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CACrE,CAAA;oBACD,OAAO;wBACL,EAAE,EAAE,UAAU,CAAC,EAAE;wBACjB,aAAa,EAAE,IAAI;wBACnB,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa;wBACvG,eAAe,EAAE,CAAC,OAAO,CAAC,EAAa,CAAC;qBACzC,CAAA;gBACH,CAAC,CAAA;gBACD,gBAAgB,EAAE,CAAO,EAAE,EAAE,EAAE;oBAC7B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;oBACrF,OAAO;wBACL,aAAa,EAAE,UAAU,CAAC,IAAK;wBAC/B,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa;wBACvG,eAAe,EAAE,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa;qBACzG,CAAA;gBACH,CAAC,CAAA;gBACD,kBAAkB,EAAE,CAAO,MAAM,EAAE,UAAU,EAAE,EAAE;oBAC/C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;oBAC5F,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,aAAa,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAA;oBAC7G,IAAA,aAAM,EAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;oBACpC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;oBAC7E,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,aAAa,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAA;oBACjH,IAAA,aAAM,EAAC,SAAS,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;oBACnC,MAAM,IAAI,CAAC,oBAAoB,CAAC,2BAA2B,CACzD,IAAI,EACJ,CACE,MAAM,IAAI,CAAC,SAAS,CAAC,wCAAwC,CAAC,aAAa,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CACrI,CAAC,cAAc,CACjB,CAAA;gBACH,CAAC,CAAA;aACF,CAAA;QACH,CAAC;KAAA;CACF;AAED,MAAM,sBAAsB;IAE1B,YAA6B,GAAmC;QAAnC,QAAG,GAAH,GAAG,CAAgC;QAD/C,QAAG,GAAG,IAAI,wBAAY,CAAC,kBAAgB,CAAC,CAAA;IACU,CAAC;IAE9D,0BAA0B,CAAC,IAAyB;;YACxD,IAAI,CAAC,IAAI,CAAC,GAAG;gBAAE,OAAO,KAAK,CAAA;YAC3B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,IAAA,+BAAuB,EAAC,IAAI,CAAC,CAAC,CAAA;YAC3D,IAAI,SAAS,CAAC,IAAI,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,GAAG,CAAA;YACxC,OAAO,KAAK,CAAA;QACd,CAAC;KAAA;IAEK,iCAAiC,CACrC,QAIG;;YAIH,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;YACpD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAA,+BAAuB,EAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAA,iCAAyB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YACrH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAA,kBAAM,EAAC,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YACrG,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,OAAO,CAAC,GAAG,CACf,QAAQ,CAAC,GAAG,CAAC,CAAO,QAAQ,EAAE,EAAE;gBAC9B,IAAI,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAG,KAAK,IAAI,CAAC,SAAS,CAAC,EAAG,EAAE,CAAC;oBAC5D,OAAO;wBACL,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAG;wBAChC;4BACE,aAAa,EAAE,EAAE;4BACjB,eAAe,EAAE,EAAE;yBACpB;qBACF,CAAA;gBACH,CAAC;qBAAM,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;oBAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAG,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,CAAA;gBACvF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAG,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,CAAA;gBACzH,CAAC;YACH,CAAC,CAAA,CAAC,CACH,CACF,CAAA;QACH,CAAC;KAAA;IAED,wBAAwB,CAAC,QAAa,EAAE,UAAoB;QAC1D,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACpC,CAAC;CACF;AACD,MAAM,YAAY;IAAlB;QACW,YAAO,GAAW,SAAS,CAAA;IA+GtC,CAAC;IA7GO,SAAS,CAAC,GAAa;;YAC3B,MAAM,GAAG,GAAG;gBACV,UAAU,EAAE,MAAM,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,IAAA,iBAAK,EAAC,IAAA,kBAAM,EAAC,GAAG,CAAC,SAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,sBAAU,CAAC,IAAI,CAAC;gBACjI,SAAS,EAAE,MAAM,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,IAAA,iBAAK,EAAC,IAAA,kBAAM,EAAC,GAAG,CAAC,SAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,sBAAU,CAAC,IAAI,CAAC;aAC/H,CAAA;YACD,MAAM,IAAI,GAAG,MAAM,gBAAK,CAAC,UAAU,CACjC,GAAG,CAAC,QAAQ,EACZ,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAU,CAAC,QAAQ,EAAE,EACpE,IAAI,sBAAsB,CAAC,GAAG,CAAC,EAC/B,kBAAgB,EAChB,KAAK,EACL;gBACE,OAAO,EAAE,IAAI,yBAAW,EAAE;gBAC1B,UAAU,EAAE,IAAI,4BAAc,EAAE;aACjC,CACF,CAAA;YACD,OAA6B;gBAC3B,UAAU,EAAE,GAAS,EAAE;oBACrB,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,IAAI,CAAC,CAAA;oBACxE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,IAAI,iCAAe,CAAC,EAAE,EAAE,EAAE,IAAA,SAAI,GAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;oBACvI,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CACxC,IAAI,YAAM,CAAC;wBACT,EAAE,EAAE,IAAA,SAAI,GAAE;wBACV,KAAK,EAAE,MAAM,IAAA,SAAI,GAAE,EAAE;wBACrB,MAAM,EAAE,QAAQ;wBAChB,iBAAiB,EAAE,GAAG,CAAC,EAAE;qBAC1B,CAAC,CACH,CAAA;oBACD,OAAO;wBACL,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,QAAQ,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAG,EAAE,IAAA,SAAI,GAAE,CAAC;wBACvD,GAAG,EAAE,IAAI;wBACT,OAAO,EAAE,GAAG,CAAC,EAAE;qBAChB,CAAA;gBACH,CAAC,CAAA;aACF,CAAA;QACH,CAAC;KAAA;IAEK,OAAO,CAAC,WAA4B;;YACxC,MAAM,WAAW,GAAG,MAAM,IAAA,iCAAmB,EAAC;gBAC5C;oBACE,WAAW,EAAE,WAAW,CAAC,OAAO;oBAChC,KAAK,EAAE;wBACL;4BACE,OAAO,EAAE;gCACP,SAAS,EAAE,IAAA,kBAAM,EAAC,MAAM,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gCAC1F,UAAU,EAAE,IAAA,kBAAM,EAAC,MAAM,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;6BAC9F;4BACD,UAAU,EAAE,sBAAU,CAAC,IAAI;yBAC5B;qBACF;iBACF;aACF,CAAC,CAAA;YACF,MAAM,IAAI,GAAG,MAAM,gBAAK,CAAC,UAAU,CACjC,GAAG,CAAC,QAAQ,EACZ;gBACE,QAAQ,EAAE,WAAW,CAAC,KAAK;gBAC3B,QAAQ,EAAE,WAAW,CAAC,QAAQ;aAC/B,EACD,IAAI,sBAAsB,CAAC,WAAW,CAAC,GAAG,CAAC,EAC3C,kBAAgB,EAChB,KAAK,EACL;gBACE,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,UAAU,EAAE,WAAW,CAAC,UAAU;gBAClC,gBAAgB,EAAE,WAAW,CAAC,UAAU;aACzC,CACF,CAAA;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAA;YAChD,OAAO;gBACL,WAAW,EAAE,GAAS,EAAE;oBACtB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAG,EAAE,WAAW,EAAE,WAAW,CAAC,OAAO,EAAE,CAAA;gBAC/D,CAAC,CAAA;gBACD,mBAAmB,EAAE,GAAS,EAAE;oBAC9B,MAAM,IAAI,GAAG,WAAW,SAAI,EAAE,CAAA;oBAC9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAA;oBAC1G,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,2BAA2B,CAC5E,IAAI,EACJ,MAAM,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CACrE,CAAA;oBACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;oBACvE,IAAA,aAAM,EAAC,SAAS,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;oBACnC,OAAO;wBACL,EAAE,EAAE,UAAU,CAAC,EAAE;wBACjB,aAAa,EAAE,IAAI;wBACnB,SAAS;wBACT,eAAe,EAAE,CAAC,OAAO,CAAC,EAAa,CAAC;qBACzC,CAAA;gBACH,CAAC,CAAA;gBACD,gBAAgB,EAAE,CAAO,EAAE,EAAE,EAAE;oBAC7B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;oBACrF,OAAO;wBACL,aAAa,EAAE,UAAU,CAAC,IAAK;wBAC/B,SAAS,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC;wBAChE,eAAe,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,UAAU,CAAC;qBAC7E,CAAA;gBACH,CAAC,CAAA;gBACD,kBAAkB,EAAE,CAAO,MAAM,EAAE,UAAU,EAAE,EAAE;oBAC/C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;oBAC5F,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAA;oBACpF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,CAAA;oBAC1E,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAA;oBACtF,MAAM,IAAI,CAAC,oBAAoB,CAAC,2BAA2B,CACzD,IAAI,EACJ,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,mCAAmC,CAAC,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,EAAE,CAAC,CAC7I,CAAA;gBACH,CAAC,CAAA;aACF,CAAA;QACH,CAAC;KAAA;CACF;AAED,MAAM,YAAY;IAAlB;QACW,YAAO,GAAW,SAAS,CAAA;IAuGtC,CAAC;IArGO,SAAS,CAAC,GAAa;;YAC3B,MAAM,GAAG,GAAG;gBACV,UAAU,EAAE,MAAM,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,IAAA,iBAAK,EAAC,IAAA,kBAAM,EAAC,GAAG,CAAC,SAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,sBAAU,CAAC,IAAI,CAAC;gBACjI,SAAS,EAAE,MAAM,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,IAAA,iBAAK,EAAC,IAAA,kBAAM,EAAC,GAAG,CAAC,SAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,sBAAU,CAAC,IAAI,CAAC;aAC/H,CAAA;YACD,MAAM,IAAI,GAAG,MAAM,oBAAK,CAAC,UAAU,CACjC,GAAG,CAAC,QAAQ,EACZ,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAU,CAAC,QAAQ,EAAE,EACpE,IAAI,2CAAoB,CAAC,GAAG,CAAC,EAC7B,kBAAgB,EAChB,KAAK,EACL;gBACE,OAAO,EAAE,IAAI,yBAAW,EAAE;gBAC1B,UAAU,EAAE,IAAI,4BAAc,EAAE;aACjC,CACF,CAAA;YACD,OAA6B;gBAC3B,UAAU,EAAE,GAAS,EAAE;oBACrB,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;oBAC1E,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,IAAI,iCAAe,CAAC,EAAE,EAAE,EAAE,IAAA,SAAI,GAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;oBACvI,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CACxC,IAAI,YAAM,CAAC;wBACT,EAAE,EAAE,IAAA,SAAI,GAAE;wBACV,KAAK,EAAE,MAAM,IAAA,SAAI,GAAE,EAAE;wBACrB,MAAM,EAAE,QAAQ;wBAChB,iBAAiB,EAAE,GAAG,CAAC,EAAE;qBAC1B,CAAC,CACH,CAAA;oBACD,OAAO;wBACL,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,QAAQ,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAG,EAAE,IAAA,SAAI,GAAE,CAAC;wBACvD,GAAG,EAAE,IAAI;wBACT,OAAO,EAAE,GAAG,CAAC,EAAE;qBAChB,CAAA;gBACH,CAAC,CAAA;aACF,CAAA;QACH,CAAC;KAAA;IAEK,OAAO,CAAC,WAA4B;;YACxC,MAAM,WAAW,GAAG,MAAM,IAAA,iCAAmB,EAAC;gBAC5C;oBACE,WAAW,EAAE,WAAW,CAAC,OAAO;oBAChC,KAAK,EAAE;wBACL;4BACE,OAAO,EAAE;gCACP,SAAS,EAAE,IAAA,kBAAM,EAAC,MAAM,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gCAC1F,UAAU,EAAE,IAAA,kBAAM,EAAC,MAAM,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;6BAC9F;4BACD,UAAU,EAAE,sBAAU,CAAC,IAAI;yBAC5B;qBACF;iBACF;aACF,CAAC,CAAA;YACF,MAAM,IAAI,GAAG,MAAM,oBAAK,CAAC,UAAU,CACjC,GAAG,CAAC,QAAQ,EACZ;gBACE,QAAQ,EAAE,WAAW,CAAC,KAAK;gBAC3B,QAAQ,EAAE,WAAW,CAAC,QAAQ;aAC/B,EACD,IAAI,2CAAoB,CAAC,WAAW,CAAC,GAAG,CAAC,EACzC,kBAAgB,EAChB,KAAK,EACL;gBACE,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,UAAU,EAAE,WAAW,CAAC,UAAU;gBAClC,gBAAgB,EAAE,WAAW,CAAC,UAAU;aACzC,CACF,CAAA;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAA;YAChD,OAAO;gBACL,WAAW,EAAE,GAAS,EAAE;oBACtB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAG,EAAE,WAAW,EAAE,WAAW,CAAC,OAAO,EAAE,CAAA;gBAC/D,CAAC,CAAA;gBACD,mBAAmB,EAAE,GAAS,EAAE;oBAC9B,MAAM,IAAI,GAAG,WAAW,IAAA,SAAI,GAAE,EAAE,CAAA;oBAChC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAA;oBAC1G,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,2BAA2B,CAC5E,IAAI,EACJ,MAAM,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CACrE,CAAA;oBACD,OAAO;wBACL,EAAE,EAAE,UAAU,CAAC,EAAE;wBACjB,aAAa,EAAE,IAAI;wBACnB,SAAS,EAAE,EAAE;wBACb,eAAe,EAAE,CAAC,OAAO,CAAC,EAAa,CAAC;qBACzC,CAAA;gBACH,CAAC,CAAA;gBACD,gBAAgB,EAAE,CAAO,EAAE,EAAE,EAAE;oBAC7B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;oBACrF,OAAO;wBACL,aAAa,EAAE,UAAU,CAAC,IAAK;wBAC/B,SAAS,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,wCAA4B,CAAC,aAAa,EAAE,EAAE,SAAS,CAAC;wBACrI,eAAe,EAAE,MAAM,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,UAAU,CAAC;qBAChF,CAAA;gBACH,CAAC,CAAA;gBACD,kBAAkB,EAAE,CAAO,MAAM,EAAE,UAAU,EAAE,EAAE;oBAC/C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;oBAC5F,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,oBAAoB,EAAE,uBAAuB,CAAC,SAAS,EAAE,CAAC,CAAA;gBACnI,CAAC,CAAA;aACF,CAAA;QACH,CAAC;KAAA;CACF;AAED,+CAA+C;AAC/C,IAAI,yBAAyB,GAAiB,CAAC,IAAI,YAAY,EAAE,EAAE,IAAI,YAAY,EAAE,EAAE,IAAI,YAAY,EAAE,CAAC,CAAA;AAE1G,QAAQ,CAAC,mBAAmB,EAAE;;QAC5B,MAAM,CAAC;;gBACL,IAAI,CAAC,OAAO,CAAC,MAAO,CAAC,CAAA;gBACrB,GAAG,GAAG,MAAM,IAAA,sCAAyB,GAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,IAAA,uBAAe,GAAE,CAAC,CAAC,CAAA;YACvG,CAAC;SAAA,CAAC,CAAA;QAEF,KAAK,IAAI,cAAc,GAAG,CAAC,EAAE,cAAc,GAAG,yBAAyB,CAAC,MAAM,GAAG,CAAC,EAAE,cAAc,EAAE,EAAE,CAAC;YACrG,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,cAAc,CAAC,CAAA;YAClE,MAAM,eAAe,GAAG,yBAAyB,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAA;YAC3E,EAAE,CAAC,0GAA0G,gBAAgB,CAAC,OAAO,EAAE,EAAE;;oBACvI,MAAM,eAAe,GAAG,MAAM,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;oBAC7D,MAAM,qBAAqB,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,CAAA;oBAChE,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAA;oBAC3E,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,mBAAmB,EAAE,CAAA;oBACtD,kBAAkB,CAAC,MAAM,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,yBAAyB,CAAC,CAAA;oBAClG,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,eAAe,CAAC,GAAG,CAAC,CAAO,OAAO,EAAE,EAAE;wBACpC,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAA;wBACrE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAA;wBACxF,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;wBACjD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAA;oBACnE,CAAC,CAAA,CAAC,CACH,CAAA;oBACD,KAAK,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,CAAC;wBAChE,kBAAkB,CAAC,MAAM,gBAAgB,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,6CAA6C,OAAO,GAAG,CAAC,CAAA;wBACnI,MAAM,gBAAgB,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,MAAM,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,CAAA;wBAChG,kBAAkB,CAAC,MAAM,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,+BAA+B,OAAO,GAAG,CAAC,CAAA;oBACjH,CAAC;oBACD,kBAAkB,CAAC,MAAM,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,2CAA2C,CAAC,CAAA;gBACtH,CAAC;aAAA,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;CAAA,CAAC,CAAA","sourcesContent":["import 'isomorphic-fetch'\nimport { Api as ApiV6, User as UserV6 } from '@icure/apiV6'\nimport { CryptoStrategies as CryptoStrategiesV7, DataOwnerWithType as DataOwnerWithTypeV7, IcureApi as ApiV7, User as UserV7 } from '@icure/apiV7'\nimport {\n WebCryptoPrimitives,\n EntityWithDelegationTypeName,\n hex2ua,\n IcureApi as ApiV8,\n RSAUtils,\n RSAUtilsImpl,\n ShaVersion,\n ua2hex,\n ua2ab,\n} from '../../icc-x-api'\nimport { getEnvironmentInitializer, setLocalStorage } from '../utils/test_utils'\nimport { KeyPair } from '../../icc-x-api/crypto/RSA'\nimport { expect } from 'chai'\nimport { webcrypto } from 'crypto'\nimport { CryptoPrimitives } from '../../icc-x-api/crypto/CryptoPrimitives'\nimport { v4 as uuid } from 'uuid'\nimport { HealthcareParty } from '../../icc-api/model/HealthcareParty'\nimport { TestKeyStorage, TestStorage, testStorageWithKeys } from '../utils/TestStorage'\nimport { TestCryptoStrategies } from '../utils/TestCryptoStrategies'\nimport { EntityShareRequest } from '../../icc-api/model/requests/EntityShareRequest'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { hexPublicKeysWithSha1Of, hexPublicKeysWithSha256Of } from '../../icc-x-api/crypto/utils'\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\n\ntype UserCredentials = {\n login: string\n password: string\n ownerId: string\n key: KeyPair<CryptoKey>\n}\ntype EncryptedData = {\n secretContent: string\n secretIds: string[]\n owningEntityIds: string[]\n}\n\ninterface UniformizedMasterApi {\n createUser(): Promise<UserCredentials>\n}\n\ninterface UniformizedTestApi {\n userDetails(): Promise<{ userId: string; dataOwnerId: string }>\n createEncryptedData(): Promise<{ id: string } & EncryptedData>\n getDecryptedData(id: string): Promise<EncryptedData>\n shareEncryptedData(dataId: string, delegateId: string): Promise<void>\n}\n\ninterface ApiFactory {\n readonly version: string\n masterApi(env: TestVars): Promise<UniformizedMasterApi>\n testApi(credentials: UserCredentials): Promise<UniformizedTestApi>\n}\n\nfunction checkEncryptedData(actual: EncryptedData, expected: EncryptedData, actualName: string) {\n expect(actual.secretContent, `${actualName} - secret content`).to.equal(expected.secretContent)\n expect(actual.secretIds, `${actualName} - secret ids`).to.have.length(expected.secretIds.length)\n for (const expectedId of expected.secretIds) {\n expect(actual.secretIds, `${actualName} - secret id`).to.contain(expectedId)\n }\n expect(actual.owningEntityIds, `${actualName} - owning entity id`).to.have.length(expected.owningEntityIds.length)\n for (const expectedId of expected.owningEntityIds) {\n expect(actual.owningEntityIds, `${actualName} - owning entity id`).to.contain(expectedId)\n }\n}\n\nsetLocalStorage(fetch)\nconst cryptoPrimitives = new WebCryptoPrimitives(webcrypto as any)\nlet env: TestVars\n\nclass ApiFactoryV6 implements ApiFactory {\n readonly version: string = 'apiV6.x'\n\n async masterApi(env: TestVars): Promise<UniformizedMasterApi> {\n const apis = await ApiV6(\n env.iCureUrl + '/rest/v1',\n env.masterHcp!.user,\n env.masterHcp!.password,\n webcrypto as any,\n fetch,\n false,\n false,\n new TestStorage(),\n new TestKeyStorage()\n )\n return <UniformizedMasterApi>{\n createUser: async () => {\n const pair = await cryptoPrimitives.RSA.generateKeyPair(ShaVersion.Sha1)\n const hcp = await apis.healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: `name`, lastName: 'v6' }))\n const user = await apis.userApi.createUser(\n new UserV6({\n id: uuid(),\n login: `v6-${uuid()}`,\n status: 'ACTIVE',\n healthcarePartyId: hcp.id,\n })\n )\n return {\n login: user.login,\n password: await apis.userApi.getToken(user.id!, uuid()),\n key: pair,\n ownerId: hcp.id,\n }\n },\n }\n }\n\n async testApi(credentials: UserCredentials): Promise<UniformizedTestApi> {\n const apis = await ApiV6(env.iCureUrl + '/rest/v1', credentials.login, credentials.password, webcrypto as any, fetch)\n // await apis.cryptoApi.cacheKeyPair(await cryptoPrimitives.RSA.exportKeys(credentials.key, \"jwk\", \"jwk\"))\n const user = await apis.userApi.getCurrentUser()\n await apis.cryptoApi.addKeyPairForOwner(\n apis.maintenanceTaskApi,\n user,\n await apis.cryptoApi.getDataOwner(credentials.ownerId),\n credentials.key,\n false,\n false\n )\n return {\n userDetails: async () => {\n return { userId: user.id!, dataOwnerId: credentials.ownerId }\n },\n createEncryptedData: async () => {\n const note = `v6 note ${uuid()}`\n const patient = await apis.patientApi.createPatientWithUser(user, await apis.patientApi.newInstance(user))\n const healthdata = await apis.healthcareElementApi.createHealthElementWithUser(\n user,\n await apis.healthcareElementApi.newInstance(user, patient, { note })\n )\n return {\n id: healthdata.id,\n secretContent: note,\n secretIds: (await apis.cryptoApi.extractDelegationsSFKs(healthdata, credentials.ownerId)).extractedKeys,\n owningEntityIds: [patient.id! as string],\n }\n },\n getDecryptedData: async (id) => {\n const healthdata = await apis.healthcareElementApi.getHealthElementWithUser(user, id)\n return {\n secretContent: healthdata.note!,\n secretIds: (await apis.cryptoApi.extractDelegationsSFKs(healthdata, credentials.ownerId)).extractedKeys,\n owningEntityIds: (await apis.cryptoApi.extractCryptedFKs(healthdata, credentials.ownerId)).extractedKeys,\n }\n },\n shareEncryptedData: async (dataId, delegateId) => {\n const healthElement = await apis.healthcareElementApi.getHealthElementWithUser(user, dataId)\n const patientIds = (await apis.cryptoApi.extractCryptedFKs(healthElement, credentials.ownerId)).extractedKeys\n expect(patientIds).to.have.length(1)\n const patient = await apis.patientApi.getPatientWithUser(user, patientIds[0])\n const secretIds = (await apis.cryptoApi.extractDelegationsSFKs(healthElement, credentials.ownerId)).extractedKeys\n expect(secretIds).to.have.length(1)\n await apis.healthcareElementApi.modifyHealthElementWithUser(\n user,\n (\n await apis.cryptoApi.extendedDelegationsAndCryptedForeignKeys(healthElement, patient, credentials.ownerId, delegateId, secretIds[0])\n ).modifiedObject\n )\n },\n }\n }\n}\n\nclass TestCryptoStrategiesV7 implements CryptoStrategiesV7 {\n private readonly RSA = new RSAUtilsImpl(webcrypto as any)\n constructor(private readonly key: KeyPair<CryptoKey> | undefined) {}\n\n async generateNewKeyForDataOwner(self: DataOwnerWithTypeV7): Promise<KeyPair<CryptoKey> | boolean> {\n if (!this.key) return false\n const knownKeys = new Set(...hexPublicKeysWithSha1Of(self))\n if (knownKeys.size <= 0) return this.key\n return false\n }\n\n async recoverAndVerifySelfHierarchyKeys(\n keysData: {\n dataOwner: DataOwnerWithTypeV7\n unknownKeys: string[]\n unavailableKeys: string[]\n }[]\n ): Promise<{\n [p: string]: { recoveredKeys: { [p: string]: KeyPair<CryptoKey> }; keyAuthenticity: { [p: string]: boolean } }\n }> {\n const self = keysData[keysData.length - 1].dataOwner\n const knownKeys = new Set([...hexPublicKeysWithSha1Of(self.dataOwner), ...hexPublicKeysWithSha256Of(self.dataOwner)])\n const publicKey = this.key ? ua2hex(await this.RSA.exportKey(this.key.publicKey, 'spki')) : undefined\n return Object.fromEntries(\n await Promise.all(\n keysData.map(async (currData) => {\n if (currData.dataOwner.dataOwner.id! !== self.dataOwner.id!) {\n return [\n currData.dataOwner.dataOwner.id!,\n {\n recoveredKeys: {},\n keyAuthenticity: {},\n },\n ]\n } else if (publicKey === undefined || !knownKeys.has(publicKey)) {\n return [currData.dataOwner.dataOwner.id!, { recoveredKeys: {}, keyAuthenticity: {} }]\n } else {\n return [currData.dataOwner.dataOwner.id!, { recoveredKeys: { [publicKey.slice(-32)]: this.key }, keyAuthenticity: {} }]\n }\n })\n )\n )\n }\n\n verifyDelegatePublicKeys(delegate: any, publicKeys: string[]): Promise<string[]> {\n return Promise.resolve(publicKeys)\n }\n}\nclass ApiFactoryV7 implements ApiFactory {\n readonly version: string = 'apiV7.x'\n\n async masterApi(env: TestVars): Promise<UniformizedMasterApi> {\n const key = {\n privateKey: await cryptoPrimitives.RSA.importKey('pkcs8', ua2ab(hex2ua(env.masterHcp!.privateKey)), ['decrypt'], ShaVersion.Sha1),\n publicKey: await cryptoPrimitives.RSA.importKey('spki', ua2ab(hex2ua(env.masterHcp!.publicKey)), ['encrypt'], ShaVersion.Sha1),\n }\n const apis = await ApiV7.initialise(\n env.iCureUrl,\n { username: env.masterHcp!.user, password: env.masterHcp!.password },\n new TestCryptoStrategiesV7(key),\n webcrypto as any,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n return <UniformizedMasterApi>{\n createUser: async () => {\n const pair = await cryptoPrimitives.RSA.generateKeyPair(ShaVersion.Sha1)\n const hcp = await apis.healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: `name`, lastName: 'v7' }))\n const user = await apis.userApi.createUser(\n new UserV7({\n id: uuid(),\n login: `v7-${uuid()}`,\n status: 'ACTIVE',\n healthcarePartyId: hcp.id,\n })\n )\n return {\n login: user.login,\n password: await apis.userApi.getToken(user.id!, uuid()),\n key: pair,\n ownerId: hcp.id,\n }\n },\n }\n }\n\n async testApi(credentials: UserCredentials): Promise<UniformizedTestApi> {\n const testStorage = await testStorageWithKeys([\n {\n dataOwnerId: credentials.ownerId,\n pairs: [\n {\n keyPair: {\n publicKey: ua2hex(await cryptoPrimitives.RSA.exportKey(credentials.key.publicKey, 'spki')),\n privateKey: ua2hex(await cryptoPrimitives.RSA.exportKey(credentials.key.privateKey, 'pkcs8')),\n },\n shaVersion: ShaVersion.Sha1,\n },\n ],\n },\n ])\n const apis = await ApiV7.initialise(\n env.iCureUrl,\n {\n username: credentials.login,\n password: credentials.password,\n },\n new TestCryptoStrategiesV7(credentials.key),\n webcrypto as any,\n fetch,\n {\n storage: testStorage.storage,\n keyStorage: testStorage.keyStorage,\n entryKeysFactory: testStorage.keyFactory,\n }\n )\n const user = await apis.userApi.getCurrentUser()\n return {\n userDetails: async () => {\n return { userId: user.id!, dataOwnerId: credentials.ownerId }\n },\n createEncryptedData: async () => {\n const note = `v7 note ${uuid}`\n const patient = await apis.patientApi.createPatientWithUser(user, await apis.patientApi.newInstance(user))\n const healthdata = await apis.healthcareElementApi.createHealthElementWithUser(\n user,\n await apis.healthcareElementApi.newInstance(user, patient, { note })\n )\n const secretIds = await apis.cryptoApi.entities.secretIdsOf(healthdata)\n expect(secretIds).to.have.length(1)\n return {\n id: healthdata.id,\n secretContent: note,\n secretIds,\n owningEntityIds: [patient.id! as string],\n }\n },\n getDecryptedData: async (id) => {\n const healthdata = await apis.healthcareElementApi.getHealthElementWithUser(user, id)\n return {\n secretContent: healthdata.note!,\n secretIds: await apis.cryptoApi.entities.secretIdsOf(healthdata),\n owningEntityIds: await apis.cryptoApi.entities.owningEntityIdsOf(healthdata),\n }\n },\n shareEncryptedData: async (dataId, delegateId) => {\n const healthElement = await apis.healthcareElementApi.getHealthElementWithUser(user, dataId)\n const encryptionKeys = await apis.cryptoApi.entities.encryptionKeysOf(healthElement)\n const secretIds = await apis.cryptoApi.entities.secretIdsOf(healthElement)\n const owningEntityIds = await apis.cryptoApi.entities.owningEntityIdsOf(healthElement)\n await apis.healthcareElementApi.modifyHealthElementWithUser(\n user,\n await apis.cryptoApi.entities.entityWithExtendedEncryptedMetadata(healthElement, delegateId, secretIds, encryptionKeys, owningEntityIds, [])\n )\n },\n }\n }\n}\n\nclass ApiFactoryV8 implements ApiFactory {\n readonly version: string = 'apiV8.x'\n\n async masterApi(env: TestVars): Promise<UniformizedMasterApi> {\n const key = {\n privateKey: await cryptoPrimitives.RSA.importKey('pkcs8', ua2ab(hex2ua(env.masterHcp!.privateKey)), ['decrypt'], ShaVersion.Sha1),\n publicKey: await cryptoPrimitives.RSA.importKey('spki', ua2ab(hex2ua(env.masterHcp!.publicKey)), ['encrypt'], ShaVersion.Sha1),\n }\n const apis = await ApiV8.initialise(\n env.iCureUrl,\n { username: env.masterHcp!.user, password: env.masterHcp!.password },\n new TestCryptoStrategies(key),\n webcrypto as any,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n return <UniformizedMasterApi>{\n createUser: async () => {\n const pair = await cryptoPrimitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const hcp = await apis.healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: `name`, lastName: 'v7' }))\n const user = await apis.userApi.createUser(\n new UserV7({\n id: uuid(),\n login: `v7-${uuid()}`,\n status: 'ACTIVE',\n healthcarePartyId: hcp.id,\n })\n )\n return {\n login: user.login,\n password: await apis.userApi.getToken(user.id!, uuid()),\n key: pair,\n ownerId: hcp.id,\n }\n },\n }\n }\n\n async testApi(credentials: UserCredentials): Promise<UniformizedTestApi> {\n const testStorage = await testStorageWithKeys([\n {\n dataOwnerId: credentials.ownerId,\n pairs: [\n {\n keyPair: {\n publicKey: ua2hex(await cryptoPrimitives.RSA.exportKey(credentials.key.publicKey, 'spki')),\n privateKey: ua2hex(await cryptoPrimitives.RSA.exportKey(credentials.key.privateKey, 'pkcs8')),\n },\n shaVersion: ShaVersion.Sha1,\n },\n ],\n },\n ])\n const apis = await ApiV8.initialise(\n env.iCureUrl,\n {\n username: credentials.login,\n password: credentials.password,\n },\n new TestCryptoStrategies(credentials.key),\n webcrypto as any,\n fetch,\n {\n storage: testStorage.storage,\n keyStorage: testStorage.keyStorage,\n entryKeysFactory: testStorage.keyFactory,\n }\n )\n const user = await apis.userApi.getCurrentUser()\n return {\n userDetails: async () => {\n return { userId: user.id!, dataOwnerId: credentials.ownerId }\n },\n createEncryptedData: async () => {\n const note = `v8 note ${uuid()}`\n const patient = await apis.patientApi.createPatientWithUser(user, await apis.patientApi.newInstance(user))\n const healthdata = await apis.healthcareElementApi.createHealthElementWithUser(\n user,\n await apis.healthcareElementApi.newInstance(user, patient, { note })\n )\n return {\n id: healthdata.id,\n secretContent: note,\n secretIds: [],\n owningEntityIds: [patient.id! as string],\n }\n },\n getDecryptedData: async (id) => {\n const healthdata = await apis.healthcareElementApi.getHealthElementWithUser(user, id)\n return {\n secretContent: healthdata.note!,\n secretIds: await apis.cryptoApi.xapi.secretIdsOf({ entity: healthdata, type: EntityWithDelegationTypeName.HealthElement }, undefined),\n owningEntityIds: await apis.healthcareElementApi.decryptPatientIdOf(healthdata),\n }\n },\n shareEncryptedData: async (dataId, delegateId) => {\n const healthElement = await apis.healthcareElementApi.getHealthElementWithUser(user, dataId)\n await apis.healthcareElementApi.shareWith(delegateId, healthElement, { requestedPermissions: RequestedPermissionEnum.MAX_WRITE })\n },\n }\n }\n}\n\n// Api factories in chronological version order\nlet chronologicalApiFactories: ApiFactory[] = [new ApiFactoryV6(), new ApiFactoryV7(), new ApiFactoryV8()]\n\ndescribe('All apis versions', async function () {\n before(async function () {\n this.timeout(600_000)\n env = await getEnvironmentInitializer().then((initializer) => initializer.execute(getEnvVariables()))\n })\n\n for (let legacyApiIndex = 0; legacyApiIndex < chronologicalApiFactories.length - 1; legacyApiIndex++) {\n const legacyApiFactory = chronologicalApiFactories[legacyApiIndex]\n const newApiFactories = chronologicalApiFactories.slice(legacyApiIndex + 1)\n it(`should be able to read and share data from older apis without affecting accessibility for older apis - ${legacyApiFactory.version}`, async function () {\n const legacyMasterApi = await legacyApiFactory.masterApi(env)\n const legacyUserCredentials = await legacyMasterApi.createUser()\n const legacyUserApi = await legacyApiFactory.testApi(legacyUserCredentials)\n const data = await legacyUserApi.createEncryptedData()\n checkEncryptedData(await legacyUserApi.getDecryptedData(data.id), data, 'Original decrypted data')\n const newApis = await Promise.all(\n newApiFactories.map(async (factory) => {\n const newLegacyUserApi = await factory.testApi(legacyUserCredentials)\n const newUser = await factory.masterApi(env).then((masterApi) => masterApi.createUser())\n const newUserApi = await factory.testApi(newUser)\n return { newLegacyUserApi, newUserApi, version: factory.version }\n })\n )\n for (const { newLegacyUserApi, newUserApi, version } of newApis) {\n checkEncryptedData(await newLegacyUserApi.getDecryptedData(data.id), data, `Data decrypted by legacy user on new api (${version})`)\n await newLegacyUserApi.shareEncryptedData(data.id, (await newUserApi.userDetails()).dataOwnerId)\n checkEncryptedData(await newUserApi.getDecryptedData(data.id), data, `Data decrypted by new user (${version})`)\n }\n checkEncryptedData(await legacyUserApi.getDecryptedData(data.id), data, `Data after changes by new versions of api`)\n })\n }\n})\n"]}
@@ -1 +0,0 @@
1
- export {};
@@ -1,54 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const graph_utils_1 = require("../../../icc-x-api/utils/graph-utils");
4
- const chai_1 = require("chai");
5
- const collection_utils_1 = require("../../../icc-x-api/utils/collection-utils");
6
- function graphEquals(graphA, graphB) {
7
- if (!(0, collection_utils_1.setEquals)(new Set(Object.keys(graphA)), new Set(Object.keys(graphA)))) {
8
- return false;
9
- }
10
- return Object.keys(graphA).every((key) => (0, collection_utils_1.setEquals)(graphA[key], graphB[key]));
11
- }
12
- describe('Terminal nodes', function () {
13
- it('should match expected', function () {
14
- // Online representation of graph https://www.plantuml.com/plantuml/svg/LSux2e8n00FWFQVuHnLw1Ud3jlRHta7GJHsqtby9MPm-I234ljVbjJwFEtQ7_MRCSNDmrCi0JwCyoOAWFjA4H3CoZVACGgkSgBIX_TdHwS3G_bHkRy_hx-4N
15
- const graph = (0, graph_utils_1.graphFromEdges)([
16
- ['A', 'B'],
17
- ['A', 'C'],
18
- ['B', 'D'],
19
- ['B', 'E'],
20
- ['B', 'I'],
21
- ['C', 'C'],
22
- // NO D,
23
- ['E', 'F'],
24
- ['F', 'G'],
25
- ['G', 'E'],
26
- ['G', 'H'],
27
- // NO H,
28
- ['I', 'J'],
29
- ['I', 'N'],
30
- ['J', 'K'],
31
- ['K', 'K'],
32
- ['K', 'L'],
33
- ['L', 'M'],
34
- ['M', 'I'],
35
- ['N', 'L'],
36
- ]);
37
- const copy = Object.entries(graph).reduce((acc, [node, edges]) => {
38
- acc[node] = new Set(Array.from(edges));
39
- return acc;
40
- }, {});
41
- (0, chai_1.expect)(graphEquals(graph, copy)).to.be.true;
42
- const terminals = Object.entries((0, graph_utils_1.reachSetsAcyclic)((0, graph_utils_1.acyclic)(graph).acyclicGraph))
43
- .filter(([, v]) => v.size === 0)
44
- .map(([k]) => k);
45
- (0, chai_1.expect)(graphEquals(graph, copy)).to.be.true;
46
- (0, chai_1.expect)(terminals).to.have.length(4);
47
- (0, chai_1.expect)(terminals).to.contain('C');
48
- (0, chai_1.expect)(terminals).to.contain('D');
49
- (0, chai_1.expect)(terminals).to.contain('H');
50
- const alternatives = new Set(['I', 'J', 'K', 'L', 'M', 'N']);
51
- (0, chai_1.expect)(Array.from(terminals).filter((x) => alternatives.has(x))).to.have.length(1);
52
- });
53
- });
54
- //# sourceMappingURL=graph-test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"graph-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/utils/graph-test.ts"],"names":[],"mappings":";;AAAA,sEAAuG;AACvG,+BAA6B;AAC7B,gFAAqE;AAErE,SAAS,WAAW,CAAC,MAAa,EAAE,MAAa;IAC/C,IAAI,CAAC,IAAA,4BAAS,EAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,4BAAS,EAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAChF,CAAC;AAED,QAAQ,CAAC,gBAAgB,EAAE;IACzB,EAAE,CAAC,uBAAuB,EAAE;QAC1B,gMAAgM;QAChM,MAAM,KAAK,GAAG,IAAA,4BAAc,EAAC;YAC3B,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,QAAQ;YACR,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,QAAQ;YACR,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;SACX,CAAC,CAAA;QACF,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YACtE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;YACtC,OAAO,GAAG,CAAA;QACZ,CAAC,EAAE,EAAE,CAAC,CAAA;QACN,IAAA,aAAM,EAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAA;QAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAA,8BAAgB,EAAC,IAAA,qBAAO,EAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC;aAC5E,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC;aAC/B,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;QAClB,IAAA,aAAM,EAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAA;QAC3C,IAAA,aAAM,EAAC,SAAS,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACnC,IAAA,aAAM,EAAC,SAAS,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACjC,IAAA,aAAM,EAAC,SAAS,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACjC,IAAA,aAAM,EAAC,SAAS,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACjC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QAC5D,IAAA,aAAM,EAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACpF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["import { acyclic, Graph, graphFromEdges, reachSetsAcyclic } from '../../../icc-x-api/utils/graph-utils'\nimport { expect } from 'chai'\nimport { setEquals } from '../../../icc-x-api/utils/collection-utils'\n\nfunction graphEquals(graphA: Graph, graphB: Graph): boolean {\n if (!setEquals(new Set(Object.keys(graphA)), new Set(Object.keys(graphA)))) {\n return false\n }\n return Object.keys(graphA).every((key) => setEquals(graphA[key], graphB[key]))\n}\n\ndescribe('Terminal nodes', function () {\n it('should match expected', function () {\n // Online representation of graph https://www.plantuml.com/plantuml/svg/LSux2e8n00FWFQVuHnLw1Ud3jlRHta7GJHsqtby9MPm-I234ljVbjJwFEtQ7_MRCSNDmrCi0JwCyoOAWFjA4H3CoZVACGgkSgBIX_TdHwS3G_bHkRy_hx-4N\n const graph = graphFromEdges([\n ['A', 'B'],\n ['A', 'C'],\n ['B', 'D'],\n ['B', 'E'],\n ['B', 'I'],\n ['C', 'C'],\n // NO D,\n ['E', 'F'],\n ['F', 'G'],\n ['G', 'E'],\n ['G', 'H'],\n // NO H,\n ['I', 'J'],\n ['I', 'N'],\n ['J', 'K'],\n ['K', 'K'],\n ['K', 'L'],\n ['L', 'M'],\n ['M', 'I'],\n ['N', 'L'],\n ])\n const copy = Object.entries(graph).reduce<Graph>((acc, [node, edges]) => {\n acc[node] = new Set(Array.from(edges))\n return acc\n }, {})\n expect(graphEquals(graph, copy)).to.be.true\n const terminals = Object.entries(reachSetsAcyclic(acyclic(graph).acyclicGraph))\n .filter(([, v]) => v.size === 0)\n .map(([k]) => k)\n expect(graphEquals(graph, copy)).to.be.true\n expect(terminals).to.have.length(4)\n expect(terminals).to.contain('C')\n expect(terminals).to.contain('D')\n expect(terminals).to.contain('H')\n const alternatives = new Set(['I', 'J', 'K', 'L', 'M', 'N'])\n expect(Array.from(terminals).filter((x) => alternatives.has(x))).to.have.length(1)\n })\n})\n"]}