@icure/api 8.0.64 → 8.0.66
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.
- package/icc-api/api/internal/IccExchangeDataApi.d.ts +2 -0
- package/icc-api/api/internal/IccExchangeDataApi.js +10 -0
- package/icc-api/api/internal/IccExchangeDataApi.js.map +1 -1
- package/icc-api/iccApi.d.ts +0 -1
- package/icc-api/iccApi.js +0 -1
- package/icc-api/iccApi.js.map +1 -1
- package/icc-api/index.d.ts +0 -1
- package/icc-api/index.js +0 -1
- package/icc-api/index.js.map +1 -1
- package/icc-x-api/crypto/AccessControlSecretUtils.d.ts +4 -13
- package/icc-x-api/crypto/AccessControlSecretUtils.js +19 -29
- package/icc-x-api/crypto/AccessControlSecretUtils.js.map +1 -1
- package/icc-x-api/crypto/BaseExchangeDataManager.d.ts +8 -3
- package/icc-x-api/crypto/BaseExchangeDataManager.js +45 -10
- package/icc-x-api/crypto/BaseExchangeDataManager.js.map +1 -1
- package/icc-x-api/crypto/BaseExchangeKeysManager.d.ts +2 -3
- package/icc-x-api/crypto/BaseExchangeKeysManager.js +17 -20
- package/icc-x-api/crypto/BaseExchangeKeysManager.js.map +1 -1
- package/icc-x-api/crypto/CryptoPrimitives.d.ts +2 -0
- package/icc-x-api/crypto/CryptoPrimitives.js +3 -0
- package/icc-x-api/crypto/CryptoPrimitives.js.map +1 -1
- package/icc-x-api/crypto/DelegationsDeAnonymization.d.ts +3 -3
- package/icc-x-api/crypto/DelegationsDeAnonymization.js +7 -7
- package/icc-x-api/crypto/DelegationsDeAnonymization.js.map +1 -1
- package/icc-x-api/crypto/ExchangeDataManager.d.ts +19 -29
- package/icc-x-api/crypto/ExchangeDataManager.js +200 -225
- package/icc-x-api/crypto/ExchangeDataManager.js.map +1 -1
- package/icc-x-api/crypto/ExchangeDataMapManager.js +6 -4
- package/icc-x-api/crypto/ExchangeDataMapManager.js.map +1 -1
- package/icc-x-api/crypto/ExchangeKeysManager.d.ts +4 -16
- package/icc-x-api/crypto/ExchangeKeysManager.js +44 -41
- package/icc-x-api/crypto/ExchangeKeysManager.js.map +1 -1
- package/icc-x-api/crypto/ExtendedApisUtils.d.ts +47 -25
- package/icc-x-api/crypto/ExtendedApisUtils.js.map +1 -1
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.d.ts +19 -18
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.js +213 -134
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.js.map +1 -1
- package/icc-x-api/crypto/HMACUtils.d.ts +2 -2
- package/icc-x-api/crypto/HMACUtils.js +3 -4
- package/icc-x-api/crypto/HMACUtils.js.map +1 -1
- package/icc-x-api/crypto/NativeCryptoPrimitivesBridge.d.ts +1 -0
- package/icc-x-api/crypto/NativeCryptoPrimitivesBridge.js +5 -0
- package/icc-x-api/crypto/NativeCryptoPrimitivesBridge.js.map +1 -1
- package/icc-x-api/crypto/SecureDelegationsManager.d.ts +0 -1
- package/icc-x-api/crypto/SecureDelegationsManager.js +17 -49
- package/icc-x-api/crypto/SecureDelegationsManager.js.map +1 -1
- package/icc-x-api/crypto/SecurityMetadataDecryptor.d.ts +59 -90
- package/icc-x-api/crypto/SecurityMetadataDecryptor.js +470 -56
- package/icc-x-api/crypto/SecurityMetadataDecryptor.js.map +1 -1
- package/icc-x-api/crypto/ShamirKeysManager.js +1 -1
- package/icc-x-api/crypto/ShamirKeysManager.js.map +1 -1
- package/icc-x-api/crypto/TransferKeysManager.d.ts +1 -3
- package/icc-x-api/crypto/TransferKeysManager.js +2 -4
- package/icc-x-api/crypto/TransferKeysManager.js.map +1 -1
- package/icc-x-api/icc-accesslog-x-api.d.ts +2 -2
- package/icc-x-api/icc-accesslog-x-api.js +7 -3
- package/icc-x-api/icc-accesslog-x-api.js.map +1 -1
- package/icc-x-api/icc-calendar-item-x-api.js +4 -2
- package/icc-x-api/icc-calendar-item-x-api.js.map +1 -1
- package/icc-x-api/icc-contact-x-api.d.ts +0 -1
- package/icc-x-api/icc-contact-x-api.js +33 -48
- package/icc-x-api/icc-contact-x-api.js.map +1 -1
- package/icc-x-api/icc-crypto-x-api.js +1 -1
- package/icc-x-api/icc-crypto-x-api.js.map +1 -1
- package/icc-x-api/icc-document-x-api.d.ts +2 -2
- package/icc-x-api/icc-document-x-api.js +45 -42
- package/icc-x-api/icc-document-x-api.js.map +1 -1
- package/icc-x-api/icc-form-x-api.js +3 -1
- package/icc-x-api/icc-form-x-api.js.map +1 -1
- package/icc-x-api/icc-helement-x-api.js +4 -4
- package/icc-x-api/icc-helement-x-api.js.map +1 -1
- package/icc-x-api/icc-maintenance-task-x-api.js +4 -2
- package/icc-x-api/icc-maintenance-task-x-api.js.map +1 -1
- package/icc-x-api/icc-message-x-api.js +4 -2
- package/icc-x-api/icc-message-x-api.js.map +1 -1
- package/icc-x-api/icc-patient-x-api.js +5 -7
- package/icc-x-api/icc-patient-x-api.js.map +1 -1
- package/icc-x-api/icc-topic-x-api.js +2 -2
- package/icc-x-api/icc-topic-x-api.js.map +1 -1
- package/icc-x-api/index.d.ts +6 -2
- package/icc-x-api/index.js +16 -20
- package/icc-x-api/index.js.map +1 -1
- package/icc-x-api/utils/crypto-utils.d.ts +6 -4
- package/icc-x-api/utils/crypto-utils.js +27 -6
- package/icc-x-api/utils/crypto-utils.js.map +1 -1
- package/icc-x-api/utils/simple-lru-cache.d.ts +19 -0
- package/icc-x-api/utils/simple-lru-cache.js +90 -0
- package/icc-x-api/utils/simple-lru-cache.js.map +1 -0
- package/package.json +4 -2
- package/test/icc-x-api/crud/entities-crud-test-interface.js +0 -8
- package/test/icc-x-api/crud/entities-crud-test-interface.js.map +1 -1
- package/test/icc-x-api/crypto/exchange-data-manager-test.js +75 -93
- package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +1 -1
- package/test/icc-x-api/crypto/legacy-metadata-migration-test.js.map +1 -1
- package/test/icc-x-api/crypto/secure-delegations-manager-test.js +28 -16
- package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +1 -1
- package/test/utils/FakeEncryptionKeysManager.d.ts +1 -0
- package/test/utils/FakeEncryptionKeysManager.js +11 -0
- package/test/utils/FakeEncryptionKeysManager.js.map +1 -1
- package/test/utils/FakeExchangeDataApi.d.ts +4 -2
- package/test/utils/FakeExchangeDataApi.js +24 -6
- package/test/utils/FakeExchangeDataApi.js.map +1 -1
- package/test/utils/FakeExchangeDataManager.d.ts +10 -10
- package/test/utils/FakeExchangeDataManager.js +12 -22
- package/test/utils/FakeExchangeDataManager.js.map +1 -1
- package/test/utils/TestApi.js +1 -0
- package/test/utils/TestApi.js.map +1 -1
- package/icc-api/api/IccArticleApi.d.ts +0 -72
- package/icc-api/api/IccArticleApi.js +0 -149
- package/icc-api/api/IccArticleApi.js.map +0 -1
- package/icc-x-api/crypto/LegacyDelegationSecurityMetadataDecryptor.d.ts +0 -33
- package/icc-x-api/crypto/LegacyDelegationSecurityMetadataDecryptor.js +0 -141
- package/icc-x-api/crypto/LegacyDelegationSecurityMetadataDecryptor.js.map +0 -1
- package/icc-x-api/crypto/SecureDelegationsSecurityMetadataDecryptor.d.ts +0 -46
- package/icc-x-api/crypto/SecureDelegationsSecurityMetadataDecryptor.js +0 -312
- package/icc-x-api/crypto/SecureDelegationsSecurityMetadataDecryptor.js.map +0 -1
- package/icc-x-api/crypto/UserSignatureKeysManager.d.ts +0 -26
- package/icc-x-api/crypto/UserSignatureKeysManager.js +0 -78
- package/icc-x-api/crypto/UserSignatureKeysManager.js.map +0 -1
- package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.d.ts +0 -1
- package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.js +0 -393
- package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.js.map +0 -1
- package/test/icc-x-api/crypto/security-metadata-decryptor-chain-test.d.ts +0 -1
- package/test/icc-x-api/crypto/security-metadata-decryptor-chain-test.js +0 -213
- package/test/icc-x-api/crypto/security-metadata-decryptor-chain-test.js.map +0 -1
- package/test/icc-x-api/crypto/signature-keys-manager-test.d.ts +0 -1
- package/test/icc-x-api/crypto/signature-keys-manager-test.js +0 -44
- package/test/icc-x-api/crypto/signature-keys-manager-test.js.map +0 -1
- package/test/utils/FakeSignatureKeysManager.d.ts +0 -16
- package/test/utils/FakeSignatureKeysManager.js +0 -54
- package/test/utils/FakeSignatureKeysManager.js.map +0 -1
|
@@ -13,7 +13,6 @@ const mocha_1 = require("mocha");
|
|
|
13
13
|
const CryptoPrimitives_1 = require("../../../icc-x-api/crypto/CryptoPrimitives");
|
|
14
14
|
const crypto_1 = require("crypto");
|
|
15
15
|
const FakeEncryptionKeysManager_1 = require("../../utils/FakeEncryptionKeysManager");
|
|
16
|
-
const SecureDelegationsSecurityMetadataDecryptor_1 = require("../../../icc-x-api/crypto/SecureDelegationsSecurityMetadataDecryptor");
|
|
17
16
|
const SecureDelegationsEncryption_1 = require("../../../icc-x-api/crypto/SecureDelegationsEncryption");
|
|
18
17
|
const icc_x_api_1 = require("../../../icc-x-api");
|
|
19
18
|
const SecureDelegationsManager_1 = require("../../../icc-x-api/crypto/SecureDelegationsManager");
|
|
@@ -23,16 +22,15 @@ const BaseExchangeDataManager_1 = require("../../../icc-x-api/crypto/BaseExchang
|
|
|
23
22
|
const FakeExchangeDataApi_1 = require("../../utils/FakeExchangeDataApi");
|
|
24
23
|
const FakeDataOwnerApi_1 = require("../../utils/FakeDataOwnerApi");
|
|
25
24
|
const TestCryptoStrategies_1 = require("../../utils/TestCryptoStrategies");
|
|
26
|
-
const FakeSignatureKeysManager_1 = require("../../utils/FakeSignatureKeysManager");
|
|
27
25
|
const EntityShareRequest_1 = require("../../../icc-api/model/requests/EntityShareRequest");
|
|
28
26
|
const chai_1 = require("chai");
|
|
29
27
|
const SecurityMetadata_1 = require("../../../icc-api/model/SecurityMetadata");
|
|
30
28
|
const SecureDelegation_1 = require("../../../icc-api/model/SecureDelegation");
|
|
31
|
-
const collection_utils_1 = require("../../../icc-x-api/utils/collection-utils");
|
|
32
29
|
const EntitySharedMetadataUpdateRequest_1 = require("../../../icc-api/model/requests/EntitySharedMetadataUpdateRequest");
|
|
33
30
|
const utils_1 = require("../../../icc-x-api/crypto/utils");
|
|
34
31
|
const DataOwnerTypeEnum_1 = require("../../../icc-api/model/DataOwnerTypeEnum");
|
|
35
32
|
const FakeExchangeDataMapManager_1 = require("../../utils/FakeExchangeDataMapManager");
|
|
33
|
+
const SecurityMetadataDecryptor_1 = require("../../../icc-x-api/crypto/SecurityMetadataDecryptor");
|
|
36
34
|
var RequestedPermissionEnum = EntityShareRequest_1.EntityShareRequest.RequestedPermissionInternal;
|
|
37
35
|
var EntryUpdateTypeEnum = EntitySharedMetadataUpdateRequest_1.EntitySharedMetadataUpdateRequest.EntryUpdateTypeEnum;
|
|
38
36
|
(0, mocha_1.describe)('Secure delegations manager', function () {
|
|
@@ -47,10 +45,10 @@ var EntryUpdateTypeEnum = EntitySharedMetadataUpdateRequest_1.EntitySharedMetada
|
|
|
47
45
|
let dataOwnerApi;
|
|
48
46
|
let exchangeDataMapManager;
|
|
49
47
|
let secureDelegationsEncryption;
|
|
50
|
-
let decryptor;
|
|
51
48
|
let manager;
|
|
52
49
|
let exchangeData;
|
|
53
50
|
let accessControlSecretUtils;
|
|
51
|
+
let decryptor;
|
|
54
52
|
function initialiseComponents(explicitSelf, explicitDelegate) {
|
|
55
53
|
return __awaiter(this, void 0, void 0, function* () {
|
|
56
54
|
selfId = primitives.randomUuid();
|
|
@@ -74,12 +72,26 @@ var EntryUpdateTypeEnum = EntitySharedMetadataUpdateRequest_1.EntitySharedMetada
|
|
|
74
72
|
const exchangeDataApi = new FakeExchangeDataApi_1.FakeExchangeDataApi();
|
|
75
73
|
accessControlSecretUtils = new AccessControlSecretUtils_1.AccessControlSecretUtils(primitives);
|
|
76
74
|
const encryptionKeysManager = yield FakeEncryptionKeysManager_1.FakeEncryptionKeysManager.create(primitives, [selfKeypair]);
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
exchangeData = yield (0, ExchangeDataManager_1.initialiseExchangeDataManagerForCurrentDataOwner)(baseExchangeData, encryptionKeysManager, signatureKeysManager, accessControlSecretUtils, cryptoStrategies, dataOwnerApi, primitives, true);
|
|
75
|
+
const baseExchangeData = new BaseExchangeDataManager_1.BaseExchangeDataManager(exchangeDataApi, dataOwnerApi, primitives, !explicitSelf, false);
|
|
76
|
+
exchangeData = yield (0, ExchangeDataManager_1.initialiseExchangeDataManagerForCurrentDataOwner)(baseExchangeData, encryptionKeysManager, accessControlSecretUtils, cryptoStrategies, dataOwnerApi, primitives, true);
|
|
80
77
|
exchangeDataMapManager = new FakeExchangeDataMapManager_1.FakeExchangeDataMapManager();
|
|
81
78
|
secureDelegationsEncryption = new SecureDelegationsEncryption_1.SecureDelegationsEncryption(encryptionKeysManager, primitives);
|
|
82
|
-
decryptor = new
|
|
79
|
+
decryptor = new SecurityMetadataDecryptor_1.SecurityMetadataDecryptor({
|
|
80
|
+
cache: {},
|
|
81
|
+
get base() {
|
|
82
|
+
throw 'unused';
|
|
83
|
+
},
|
|
84
|
+
getDecryptionExchangeKeysFor(delegatorId, delegateId) {
|
|
85
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
86
|
+
return Promise.resolve([]);
|
|
87
|
+
});
|
|
88
|
+
},
|
|
89
|
+
reloadCache() {
|
|
90
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
91
|
+
throw 'unused';
|
|
92
|
+
});
|
|
93
|
+
},
|
|
94
|
+
}, primitives, exchangeData, exchangeDataMapManager, secureDelegationsEncryption, dataOwnerApi);
|
|
83
95
|
manager = new SecureDelegationsManager_1.SecureDelegationsManager(exchangeData, exchangeDataMapManager, secureDelegationsEncryption, accessControlSecretUtils, encryptionKeysManager, primitives, dataOwnerApi, cryptoStrategies, !explicitSelf);
|
|
84
96
|
});
|
|
85
97
|
}
|
|
@@ -140,9 +152,9 @@ var EntryUpdateTypeEnum = EntitySharedMetadataUpdateRequest_1.EntitySharedMetada
|
|
|
140
152
|
};
|
|
141
153
|
yield exchangeDataMapManager.createExchangeDataMaps({ [secDelKey]: shareParams.encryptedExchangeDataId });
|
|
142
154
|
yield exchangeData.clearOrRepopulateCache();
|
|
143
|
-
const decryptedSecretIds = (yield
|
|
144
|
-
const decryptedEncryptionKeys = (yield
|
|
145
|
-
const decryptedOwningEntityIds = (yield
|
|
155
|
+
const decryptedSecretIds = (yield decryptor.decryptAll(fakeEntity.entity, [selfId], SecurityMetadataDecryptor_1.SecurityMetadataType.SecretId))[0].extracted;
|
|
156
|
+
const decryptedEncryptionKeys = (yield decryptor.decryptAll(fakeEntity.entity, [selfId], SecurityMetadataDecryptor_1.SecurityMetadataType.EncryptionKey))[0].extracted;
|
|
157
|
+
const decryptedOwningEntityIds = (yield decryptor.decryptAll(fakeEntity.entity, [selfId], SecurityMetadataDecryptor_1.SecurityMetadataType.OwningEntityId))[0].extracted;
|
|
146
158
|
(0, chai_1.expect)(decryptedSecretIds).to.have.length(secretIds.length);
|
|
147
159
|
for (const secretId of secretIds) {
|
|
148
160
|
(0, chai_1.expect)(decryptedSecretIds).to.include(secretId);
|
|
@@ -175,9 +187,9 @@ var EntryUpdateTypeEnum = EntitySharedMetadataUpdateRequest_1.EntitySharedMetada
|
|
|
175
187
|
yield initialiseComponents(false, false);
|
|
176
188
|
const canonicalSfk = primitives.randomUuid();
|
|
177
189
|
const aliasSfk = primitives.randomUuid();
|
|
178
|
-
const exchangeDataInfo = yield exchangeData.getOrCreateEncryptionDataTo(delegateId,
|
|
179
|
-
const canonicalKey = yield accessControlSecretUtils.secureDelegationKeyFor(exchangeDataInfo.accessControlSecret, icc_x_api_1.EntityWithDelegationTypeName.Patient
|
|
180
|
-
const aliasKey = yield accessControlSecretUtils.secureDelegationKeyFor(exchangeDataInfo.accessControlSecret, icc_x_api_1.EntityWithDelegationTypeName.Patient
|
|
190
|
+
const exchangeDataInfo = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
|
|
191
|
+
const canonicalKey = yield accessControlSecretUtils.secureDelegationKeyFor(exchangeDataInfo.accessControlSecret, icc_x_api_1.EntityWithDelegationTypeName.Patient);
|
|
192
|
+
const aliasKey = yield accessControlSecretUtils.secureDelegationKeyFor(exchangeDataInfo.accessControlSecret, icc_x_api_1.EntityWithDelegationTypeName.Patient);
|
|
181
193
|
const existingSecretIds = [(0, icc_x_api_1.ua2hex)(primitives.randomBytes(16))];
|
|
182
194
|
const newSecretIds = [(0, icc_x_api_1.ua2hex)(primitives.randomBytes(16))];
|
|
183
195
|
const existingEncryptionKeys = [];
|
|
@@ -234,8 +246,8 @@ var EntryUpdateTypeEnum = EntitySharedMetadataUpdateRequest_1.EntitySharedMetada
|
|
|
234
246
|
return __awaiter(this, void 0, void 0, function* () {
|
|
235
247
|
yield initialiseComponents(false, false);
|
|
236
248
|
const canonicalSfk = primitives.randomUuid();
|
|
237
|
-
const exchangeDataInfo = yield exchangeData.getOrCreateEncryptionDataTo(delegateId,
|
|
238
|
-
const canonicalKey = yield accessControlSecretUtils.secureDelegationKeyFor(exchangeDataInfo.accessControlSecret, icc_x_api_1.EntityWithDelegationTypeName.Patient
|
|
249
|
+
const exchangeDataInfo = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
|
|
250
|
+
const canonicalKey = yield accessControlSecretUtils.secureDelegationKeyFor(exchangeDataInfo.accessControlSecret, icc_x_api_1.EntityWithDelegationTypeName.Patient);
|
|
239
251
|
const existingSecretIds = [(0, icc_x_api_1.ua2hex)(primitives.randomBytes(16))];
|
|
240
252
|
const existingEncryptionKeys = [];
|
|
241
253
|
const existingOwningEntityIds = [(0, icc_x_api_1.ua2hex)(primitives.randomBytes(16))];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secure-delegations-manager-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/secure-delegations-manager-test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAgC;AAChC,iFAAkG;AAClG,mCAAkC;AAClC,qFAAiF;AACjF,qIAAiI;AACjI,uGAAmG;AACnG,kDAA6F;AAC7F,iGAA6F;AAC7F,iGAA6F;AAC7F,uFAAqI;AACrI,+FAA2F;AAC3F,yEAAqE;AACrE,mEAA+D;AAC/D,2EAAuE;AACvE,mFAA+E;AAE/E,2FAAuF;AACvF,+BAA6B;AAE7B,8EAA0E;AAC1E,8EAA0E;AAC1E,gFAAiF;AACjF,yHAAqH;AACrH,2DAAkF;AAClF,gFAA4E;AAC5E,uFAAmF;AACnF,IAAO,uBAAuB,GAAG,uCAAkB,CAAC,2BAA2B,CAAA;AAC/E,IAAO,mBAAmB,GAAG,qEAAiC,CAAC,mBAAmB,CAAA;AAElF,IAAA,gBAAQ,EAAC,4BAA4B,EAAE;;QACrC,MAAM,UAAU,GAAG,IAAI,sCAAmB,CAAC,kBAAgB,CAAC,CAAA;QAC5D,IAAI,MAAc,CAAA;QAClB,IAAI,SAAiB,CAAA;QACrB,IAAI,WAA+B,CAAA;QACnC,IAAI,UAAkB,CAAA;QACtB,IAAI,aAAqB,CAAA;QACzB,IAAI,eAAmC,CAAA;QACvC,IAAI,YAA8B,CAAA;QAClC,IAAI,sBAAkD,CAAA;QACtD,IAAI,2BAAwD,CAAA;QAC5D,IAAI,SAAqD,CAAA;QACzD,IAAI,OAAiC,CAAA;QACrC,IAAI,YAAiC,CAAA;QACrC,IAAI,wBAAkD,CAAA;QAEtD,SAAe,oBAAoB,CAAC,YAAqB,EAAE,gBAAyB;;gBAClF,MAAM,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;gBAChC,WAAW,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;gBACrE,SAAS,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAA;gBAC5F,UAAU,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;gBACpC,eAAe,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;gBACzE,aAAa,GAAG,IAAA,qBAAa,EAAC,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;gBACxG,YAAY,GAAG,IAAI,mCAAgB,CACjC;oBACE,EAAE,EAAE,MAAM;oBACV,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,qCAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,qCAAiB,CAAC,OAAO;oBACtE,SAAS,EAAE,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;iBACjF,EACD;oBACE;wBACE,EAAE,EAAE,UAAU;wBACd,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,qCAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,qCAAiB,CAAC,OAAO;wBAC1E,SAAS,EAAE,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;qBACrF;iBACF,CACF,CAAA;gBACD,MAAM,gBAAgB,GAAG,IAAI,2CAAoB,EAAE,CAAA;gBACnD,MAAM,eAAe,GAAG,IAAI,yCAAmB,EAAE,CAAA;gBACjD,wBAAwB,GAAG,IAAI,mDAAwB,CAAC,UAAU,CAAC,CAAA;gBACnE,MAAM,qBAAqB,GAAG,MAAM,qDAAyB,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;gBAC/F,MAAM,oBAAoB,GAAG,IAAI,mDAAwB,CAAC,UAAU,CAAC,CAAA;gBACrE,MAAM,gBAAgB,GAAG,IAAI,iDAAuB,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,YAAY,CAAC,CAAA;gBAC9G,YAAY,GAAG,MAAM,IAAA,sEAAgD,EACnE,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,IAAI,CACL,CAAA;gBACD,sBAAsB,GAAG,IAAI,uDAA0B,EAAE,CAAA;gBACzD,2BAA2B,GAAG,IAAI,yDAA2B,CAAC,qBAAqB,EAAE,UAAU,CAAC,CAAA;gBAChG,SAAS,GAAG,IAAI,uFAA0C,CAAC,YAAY,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,YAAY,CAAC,CAAA;gBAC3I,OAAO,GAAG,IAAI,mDAAwB,CACpC,YAAY,EACZ,sBAAsB,EACtB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,CAAC,YAAY,CACd,CAAA;YACH,CAAC;SAAA;QAED,EAAE,CAAC,gFAAgF,EAAE;;gBACnF,SAAe,MAAM,CAAC,YAAqB,EAAE,gBAAyB;;;wBACpE,MAAM,oBAAoB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAA;wBAC1D,MAAM,SAAS,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;wBAC1F,MAAM,cAAc,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;wBAC3D,MAAM,eAAe,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;wBACpI,MAAM,UAAU,GAAG,wCAA4B,CAAC,OAAO,CAAA;wBACvD,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,8BAA8B,CACtE,EAAE,MAAM,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EACvD,UAAU,EACV,SAAS,EACT,cAAc,EACd,eAAe,EACf,uCAAkB,CAAC,uBAAuB,CAAC,SAAS,CACrD,CAAA;wBACD,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;wBAC/C,IAAA,aAAM,EAAC,mBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;wBACnD,IAAA,aAAM,EAAC,mBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;wBACtD,MAAM,WAAW,GAAG,mBAAoB,CAAC,KAAM,CAAA;wBAC/C,IAAA,aAAM,EAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;wBACvD,IAAI,YAAY,IAAI,gBAAgB,EAAE;4BACpC,IAAA,aAAM,EAAC,WAAW,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;4BACtD,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,MAAA,WAAW,CAAC,uBAAuB,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;yBACpF;6BAAM,IAAI,YAAY,IAAI,CAAC,gBAAgB,EAAE;4BAC5C,IAAA,aAAM,EAAC,WAAW,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;4BAClD,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,MAAA,WAAW,CAAC,uBAAuB,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;4BACnF,IAAA,aAAM,EAAC,WAAW,CAAC,uBAAwB,CAAC,IAAA,yBAAiB,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;yBAC/F;6BAAM,IAAI,CAAC,YAAY,IAAI,gBAAgB,EAAE;4BAC5C,IAAA,aAAM,EAAC,WAAW,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;4BAClD,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,MAAA,WAAW,CAAC,uBAAuB,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;4BACnF,IAAA,aAAM,EAAC,WAAW,CAAC,uBAAwB,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;yBAChF;6BAAM;4BACL,IAAA,aAAM,EAAC,WAAW,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;4BAClD,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,MAAA,WAAW,CAAC,uBAAuB,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;yBACpF;wBACD,MAAM,SAAS,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,MAAM,CAAC,IAAA,kBAAM,EAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;wBAC3F,MAAM,UAAU,GAAwE;4BACtF,MAAM,EAAE;gCACN,iBAAiB,EAAE,EAAE;gCACrB,gBAAgB,EAAE,IAAI,mCAAgB,CAAC;oCACrC,iBAAiB,EAAE;wCACjB,CAAC,SAAS,CAAC,EAAE,IAAI,mCAAgB,CAAC;4CAChC,SAAS,EAAE,WAAW,CAAC,iBAAiB;4CACxC,QAAQ,EAAE,WAAW,CAAC,gBAAgB;4CACtC,SAAS,EAAE,WAAW,CAAC,SAAS;4CAChC,cAAc,EAAE,WAAW,CAAC,cAAc;4CAC1C,eAAe,EAAE,WAAW,CAAC,eAAe;4CAC5C,cAAc,EAAE,WAAW,CAAC,cAAc;4CAC1C,uBAAuB,EAAE,WAAW,CAAC,uBAAuB;4CAC5D,WAAW,EAAE,mCAAgB,CAAC,eAAe,CAAC,KAAK;yCACpD,CAAC;qCACH;iCACF,CAAC;6BACH;4BACD,IAAI,EAAE,wCAA4B,CAAC,OAAO;yBAC3C,CAAA;wBACD,MAAM,sBAAsB,CAAC,sBAAsB,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,uBAAwB,EAAE,CAAC,CAAA;wBAC1G,MAAM,YAAY,CAAC,sBAAsB,EAAE,CAAA;wBAC3C,MAAM,kBAAkB,GAAG,CAAC,MAAM,IAAA,wCAAqB,EAAC,SAAS,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;wBACpI,MAAM,uBAAuB,GAAG,CAAC,MAAM,IAAA,wCAAqB,EAAC,SAAS,CAAC,uBAAuB,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;wBAC9I,MAAM,wBAAwB,GAAG,CAAC,MAAM,IAAA,wCAAqB,EAAC,SAAS,CAAC,wBAAwB,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;wBAChJ,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;wBAC3D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;4BAChC,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;yBAChD;wBACD,IAAA,aAAM,EAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;wBACrE,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;4BAC1C,IAAA,aAAM,EAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;yBAC1D;wBACD,IAAA,aAAM,EAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;wBACvE,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE;4BAC5C,IAAA,aAAM,EAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;yBAC5D;;iBACF;gBACD,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;gBAC/B,MAAM,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;gBAC1B,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;gBAC3B,MAAM,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;gBACzB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;gBAC3B,MAAM,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;gBACzB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBACvB,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YAC1B,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,0FAA0F,EAAE;;gBAC7F,SAAe,MAAM,CAAC,uBAAgC;;;wBACpD,MAAM,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;wBACxC,MAAM,YAAY,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;wBAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;wBACxC,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,EAAE,wCAA4B,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,CAAA;wBACpI,MAAM,YAAY,GAAG,MAAM,wBAAwB,CAAC,sBAAsB,CACxE,gBAAgB,CAAC,mBAAmB,EACpC,wCAA4B,CAAC,OAAO,EACpC,YAAY,CACb,CAAA;wBACD,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,sBAAsB,CACpE,gBAAgB,CAAC,mBAAmB,EACpC,wCAA4B,CAAC,OAAO,EACpC,QAAQ,CACT,CAAA;wBACD,MAAM,iBAAiB,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;wBAC9D,MAAM,YAAY,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;wBACzD,MAAM,sBAAsB,GAAa,EAAE,CAAA;wBAC3C,MAAM,iBAAiB,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;wBAC9D,MAAM,uBAAuB,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;wBACpE,MAAM,kBAAkB,GAAa,EAAE,CAAA;wBACvC,MAAM,UAAU,GAAwE;4BACtF,MAAM,EAAE;gCACN,iBAAiB,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;gCACxE,gBAAgB,EAAE,IAAI,mCAAgB,CAAC;oCACrC,iBAAiB,EAAE;wCACjB,CAAC,YAAY,CAAC,EAAE,IAAI,mCAAgB,CAAC;4CACnC,SAAS,EAAE,MAAM;4CACjB,QAAQ,EAAE,MAAM;4CAChB,SAAS,EAAE,MAAM,2BAA2B,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,WAAW,CAAC;4CAC9G,cAAc,EAAE,MAAM,2BAA2B,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,WAAW,CAAC;4CAC7H,eAAe,EAAE,MAAM,2BAA2B,CAAC,sBAAsB,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,WAAW,CAAC;4CAChI,WAAW,EAAE,mCAAgB,CAAC,eAAe,CAAC,KAAK;yCACpD,CAAC;qCACH;oCACD,gBAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE;iCAC/C,CAAC;6BACH;4BACD,IAAI,EAAE,wCAA4B,CAAC,OAAO;yBAC3C,CAAA;wBACD,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,8BAA8B,CACtE,UAAU,EACV,UAAU,EACV,CAAC,GAAG,iBAAiB,EAAE,GAAG,YAAY,CAAC,EACvC,CAAC,GAAG,sBAAsB,EAAE,GAAG,iBAAiB,CAAC,EACjD,CAAC,GAAG,uBAAuB,EAAE,GAAG,kBAAkB,CAAC,EACnD,uBAAuB,CAAC,SAAS,CAClC,CAAA;wBACD,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;wBAC/C,IAAA,aAAM,EAAC,mBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;wBAClD,IAAA,aAAM,EAAC,mBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;wBACvD,MAAM,YAAY,GAAG,mBAAoB,CAAC,MAAO,CAAA;wBACjD,IAAA,aAAM,EAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;wBACrE,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAA,YAAY,CAAC,SAAS,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;wBACrF,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAA,YAAY,CAAC,SAAS,mCAAI,EAAE,CAAC,EAAE;4BACjF,IAAA,aAAM,EAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;4BACvD,IAAA,aAAM,EAAC,YAAY,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,2BAA2B,CAAC,eAAe,CAAC,QAAQ,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAA;yBAC3H;wBACD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAA,YAAY,CAAC,cAAc,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;wBAC/F,KAAK,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAA,YAAY,CAAC,cAAc,mCAAI,EAAE,CAAC,EAAE;4BAC3F,IAAA,aAAM,EAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;4BACvD,IAAA,aAAM,EAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,2BAA2B,CAAC,oBAAoB,CAAC,aAAa,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAA;yBAC1I;wBACD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAA,YAAY,CAAC,eAAe,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;wBACjG,KAAK,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAA,YAAY,CAAC,eAAe,mCAAI,EAAE,CAAC,EAAE;4BAC7F,IAAA,aAAM,EAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;4BACvD,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,2BAA2B,CAAC,qBAAqB,CAAC,cAAc,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAA;yBAC7I;;iBACF;gBACD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;gBAClB,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,qFAAqF,EAAE;;gBACxF,MAAM,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;gBACxC,MAAM,YAAY,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;gBAC5C,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,EAAE,wCAA4B,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,CAAA;gBACpI,MAAM,YAAY,GAAG,MAAM,wBAAwB,CAAC,sBAAsB,CACxE,gBAAgB,CAAC,mBAAmB,EACpC,wCAA4B,CAAC,OAAO,EACpC,YAAY,CACb,CAAA;gBACD,MAAM,iBAAiB,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;gBAC9D,MAAM,sBAAsB,GAAa,EAAE,CAAA;gBAC3C,MAAM,uBAAuB,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;gBACpE,MAAM,UAAU,GAAwE;oBACtF,MAAM,EAAE;wBACN,iBAAiB,EAAE,CAAC,YAAY,CAAC;wBACjC,gBAAgB,EAAE,IAAI,mCAAgB,CAAC;4BACrC,iBAAiB,EAAE;gCACjB,CAAC,YAAY,CAAC,EAAE,IAAI,mCAAgB,CAAC;oCACnC,SAAS,EAAE,MAAM;oCACjB,QAAQ,EAAE,MAAM;oCAChB,SAAS,EAAE,MAAM,2BAA2B,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,WAAW,CAAC;oCAC9G,cAAc,EAAE,MAAM,2BAA2B,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,WAAW,CAAC;oCAC7H,eAAe,EAAE,MAAM,2BAA2B,CAAC,sBAAsB,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,WAAW,CAAC;oCAChI,WAAW,EAAE,mCAAgB,CAAC,eAAe,CAAC,KAAK;iCACpD,CAAC;6BACH;yBACF,CAAC;qBACH;oBACD,IAAI,EAAE,wCAA4B,CAAC,OAAO;iBAC3C,CAAA;gBACD,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,8BAA8B,CACtE,UAAU,EACV,UAAU,EACV,CAAC,GAAG,iBAAiB,CAAC,EACtB,CAAC,GAAG,sBAAsB,CAAC,EAC3B,CAAC,GAAG,uBAAuB,CAAC,EAC5B,uBAAuB,CAAC,SAAS,CAClC,CAAA;gBACD,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;YAC7C,CAAC;SAAA,CAAC,CAAA;IACJ,CAAC;CAAA,CAAC,CAAA","sourcesContent":["import { describe } from 'mocha'\nimport { CryptoPrimitives, WebCryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { webcrypto } from 'crypto'\nimport { FakeEncryptionKeysManager } from '../../utils/FakeEncryptionKeysManager'\nimport { SecureDelegationsSecurityMetadataDecryptor } from '../../../icc-x-api/crypto/SecureDelegationsSecurityMetadataDecryptor'\nimport { SecureDelegationsEncryption } from '../../../icc-x-api/crypto/SecureDelegationsEncryption'\nimport { EntityWithDelegationTypeName, hex2ua, ShaVersion, ua2hex } from '../../../icc-x-api'\nimport { SecureDelegationsManager } from '../../../icc-x-api/crypto/SecureDelegationsManager'\nimport { AccessControlSecretUtils } from '../../../icc-x-api/crypto/AccessControlSecretUtils'\nimport { ExchangeDataManager, initialiseExchangeDataManagerForCurrentDataOwner } from '../../../icc-x-api/crypto/ExchangeDataManager'\nimport { BaseExchangeDataManager } from '../../../icc-x-api/crypto/BaseExchangeDataManager'\nimport { FakeExchangeDataApi } from '../../utils/FakeExchangeDataApi'\nimport { FakeDataOwnerApi } from '../../utils/FakeDataOwnerApi'\nimport { TestCryptoStrategies } from '../../utils/TestCryptoStrategies'\nimport { FakeSignatureKeysManager } from '../../utils/FakeSignatureKeysManager'\nimport { KeyPair } from '../../../icc-x-api/crypto/RSA'\nimport { EntityShareRequest } from '../../../icc-api/model/requests/EntityShareRequest'\nimport { expect } from 'chai'\nimport { EncryptedEntityStub } from '../../../icc-api/model/models'\nimport { SecurityMetadata } from '../../../icc-api/model/SecurityMetadata'\nimport { SecureDelegation } from '../../../icc-api/model/SecureDelegation'\nimport { asyncGeneratorToArray } from '../../../icc-x-api/utils/collection-utils'\nimport { EntitySharedMetadataUpdateRequest } from '../../../icc-api/model/requests/EntitySharedMetadataUpdateRequest'\nimport { fingerprintV1toV2, fingerprintV2 } from '../../../icc-x-api/crypto/utils'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { FakeExchangeDataMapManager } from '../../utils/FakeExchangeDataMapManager'\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionInternal\nimport EntryUpdateTypeEnum = EntitySharedMetadataUpdateRequest.EntryUpdateTypeEnum\n\ndescribe('Secure delegations manager', async function () {\n const primitives = new WebCryptoPrimitives(webcrypto as any)\n let selfId: string\n let selfKeyFp: string\n let selfKeypair: KeyPair<CryptoKey>\n let delegateId: string\n let delegateKeyFp: string\n let delegateKeypair: KeyPair<CryptoKey>\n let dataOwnerApi: FakeDataOwnerApi\n let exchangeDataMapManager: FakeExchangeDataMapManager\n let secureDelegationsEncryption: SecureDelegationsEncryption\n let decryptor: SecureDelegationsSecurityMetadataDecryptor\n let manager: SecureDelegationsManager\n let exchangeData: ExchangeDataManager\n let accessControlSecretUtils: AccessControlSecretUtils\n\n async function initialiseComponents(explicitSelf: boolean, explicitDelegate: boolean) {\n selfId = primitives.randomUuid()\n selfKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n selfKeyFp = ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki')).slice(-32)\n delegateId = primitives.randomUuid()\n delegateKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n delegateKeyFp = fingerprintV2(ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki')))\n dataOwnerApi = new FakeDataOwnerApi(\n {\n id: selfId,\n type: explicitSelf ? DataOwnerTypeEnum.Hcp : DataOwnerTypeEnum.Patient,\n publicKey: ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki')),\n },\n [\n {\n id: delegateId,\n type: explicitDelegate ? DataOwnerTypeEnum.Hcp : DataOwnerTypeEnum.Patient,\n publicKey: ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki')),\n },\n ]\n )\n const cryptoStrategies = new TestCryptoStrategies()\n const exchangeDataApi = new FakeExchangeDataApi()\n accessControlSecretUtils = new AccessControlSecretUtils(primitives)\n const encryptionKeysManager = await FakeEncryptionKeysManager.create(primitives, [selfKeypair])\n const signatureKeysManager = new FakeSignatureKeysManager(primitives)\n const baseExchangeData = new BaseExchangeDataManager(exchangeDataApi, dataOwnerApi, primitives, !explicitSelf)\n exchangeData = await initialiseExchangeDataManagerForCurrentDataOwner(\n baseExchangeData,\n encryptionKeysManager,\n signatureKeysManager,\n accessControlSecretUtils,\n cryptoStrategies,\n dataOwnerApi,\n primitives,\n true\n )\n exchangeDataMapManager = new FakeExchangeDataMapManager()\n secureDelegationsEncryption = new SecureDelegationsEncryption(encryptionKeysManager, primitives)\n decryptor = new SecureDelegationsSecurityMetadataDecryptor(exchangeData, exchangeDataMapManager, secureDelegationsEncryption, dataOwnerApi)\n manager = new SecureDelegationsManager(\n exchangeData,\n exchangeDataMapManager,\n secureDelegationsEncryption,\n accessControlSecretUtils,\n encryptionKeysManager,\n primitives,\n dataOwnerApi,\n cryptoStrategies,\n !explicitSelf\n )\n }\n\n it('should make a share request which will create a decryptable secure delegation.', async function () {\n async function doTest(explicitSelf: boolean, explicitDelegate: boolean) {\n await initialiseComponents(explicitSelf, explicitDelegate)\n const secretIds = [ua2hex(primitives.randomBytes(16)), ua2hex(primitives.randomBytes(16))]\n const encryptionKeys = [ua2hex(primitives.randomBytes(16))]\n const owningEntityIds = [ua2hex(primitives.randomBytes(16)), ua2hex(primitives.randomBytes(16)), ua2hex(primitives.randomBytes(16))]\n const entityType = EntityWithDelegationTypeName.Patient\n const shareOrUpdateParams = await manager.makeShareOrUpdateRequestParams(\n { entity: { secretForeignKeys: [] }, type: entityType },\n delegateId,\n secretIds,\n encryptionKeys,\n owningEntityIds,\n EntityShareRequest.RequestedPermissionEnum.MAX_WRITE\n )\n expect(shareOrUpdateParams).to.not.be.undefined\n expect(shareOrUpdateParams!.update).to.be.undefined\n expect(shareOrUpdateParams!.share).to.not.be.undefined\n const shareParams = shareOrUpdateParams!.share!\n expect(shareParams.accessControlKeys).to.have.length(1)\n if (explicitSelf && explicitDelegate) {\n expect(shareParams.exchangeDataId).to.not.be.undefined\n expect(Object.entries(shareParams.encryptedExchangeDataId ?? {})).to.have.length(0)\n } else if (explicitSelf && !explicitDelegate) {\n expect(shareParams.exchangeDataId).to.be.undefined\n expect(Object.entries(shareParams.encryptedExchangeDataId ?? {})).to.have.length(1)\n expect(shareParams.encryptedExchangeDataId![fingerprintV1toV2(selfKeyFp)]).to.not.be.undefined\n } else if (!explicitSelf && explicitDelegate) {\n expect(shareParams.exchangeDataId).to.be.undefined\n expect(Object.entries(shareParams.encryptedExchangeDataId ?? {})).to.have.length(1)\n expect(shareParams.encryptedExchangeDataId![delegateKeyFp]).to.not.be.undefined\n } else {\n expect(shareParams.exchangeDataId).to.be.undefined\n expect(Object.entries(shareParams.encryptedExchangeDataId ?? {})).to.have.length(0)\n }\n const secDelKey = ua2hex(await primitives.sha256(hex2ua(shareParams.accessControlKeys[0])))\n const fakeEntity: { entity: EncryptedEntityStub; type: EntityWithDelegationTypeName } = {\n entity: {\n secretForeignKeys: [],\n securityMetadata: new SecurityMetadata({\n secureDelegations: {\n [secDelKey]: new SecureDelegation({\n delegator: shareParams.explicitDelegator,\n delegate: shareParams.explicitDelegate,\n secretIds: shareParams.secretIds,\n encryptionKeys: shareParams.encryptionKeys,\n owningEntityIds: shareParams.owningEntityIds,\n exchangeDataId: shareParams.exchangeDataId,\n encryptedExchangeDataId: shareParams.encryptedExchangeDataId,\n permissions: SecureDelegation.AccessLevelEnum.WRITE,\n }),\n },\n }),\n },\n type: EntityWithDelegationTypeName.Patient,\n }\n await exchangeDataMapManager.createExchangeDataMaps({ [secDelKey]: shareParams.encryptedExchangeDataId! })\n await exchangeData.clearOrRepopulateCache()\n const decryptedSecretIds = (await asyncGeneratorToArray(decryptor.decryptSecretIdsOf(fakeEntity, [selfId]))).map((x) => x.decrypted)\n const decryptedEncryptionKeys = (await asyncGeneratorToArray(decryptor.decryptEncryptionKeysOf(fakeEntity, [selfId]))).map((x) => x.decrypted)\n const decryptedOwningEntityIds = (await asyncGeneratorToArray(decryptor.decryptOwningEntityIdsOf(fakeEntity, [selfId]))).map((x) => x.decrypted)\n expect(decryptedSecretIds).to.have.length(secretIds.length)\n for (const secretId of secretIds) {\n expect(decryptedSecretIds).to.include(secretId)\n }\n expect(decryptedEncryptionKeys).to.have.length(encryptionKeys.length)\n for (const encryptionKey of encryptionKeys) {\n expect(decryptedEncryptionKeys).to.include(encryptionKey)\n }\n expect(decryptedOwningEntityIds).to.have.length(owningEntityIds.length)\n for (const owningEntityId of owningEntityIds) {\n expect(decryptedOwningEntityIds).to.include(owningEntityId)\n }\n }\n console.log('Patient->Patient')\n await doTest(false, false)\n console.log('Hcp->Patient')\n await doTest(true, false)\n console.log('Patient->Hcp')\n await doTest(false, true)\n console.log('Hcp->Hcp')\n await doTest(true, true)\n })\n\n it('should make an update request which the missing entries for existing secure delegations.', async function () {\n async function doTest(makeAccessibleFromAlias: boolean) {\n await initialiseComponents(false, false)\n const canonicalSfk = primitives.randomUuid()\n const aliasSfk = primitives.randomUuid()\n const exchangeDataInfo = await exchangeData.getOrCreateEncryptionDataTo(delegateId, EntityWithDelegationTypeName.Patient, [], false)\n const canonicalKey = await accessControlSecretUtils.secureDelegationKeyFor(\n exchangeDataInfo.accessControlSecret,\n EntityWithDelegationTypeName.Patient,\n canonicalSfk\n )\n const aliasKey = await accessControlSecretUtils.secureDelegationKeyFor(\n exchangeDataInfo.accessControlSecret,\n EntityWithDelegationTypeName.Patient,\n aliasSfk\n )\n const existingSecretIds = [ua2hex(primitives.randomBytes(16))]\n const newSecretIds = [ua2hex(primitives.randomBytes(16))]\n const existingEncryptionKeys: string[] = []\n const newEncryptionKeys = [ua2hex(primitives.randomBytes(16))]\n const existingOwningEntityIds = [ua2hex(primitives.randomBytes(16))]\n const newOwningEntityIds: string[] = []\n const fakeEntity: { entity: EncryptedEntityStub; type: EntityWithDelegationTypeName } = {\n entity: {\n secretForeignKeys: makeAccessibleFromAlias ? [aliasSfk] : [canonicalSfk],\n securityMetadata: new SecurityMetadata({\n secureDelegations: {\n [canonicalKey]: new SecureDelegation({\n delegator: selfId,\n delegate: selfId,\n secretIds: await secureDelegationsEncryption.encryptSecretIds(existingSecretIds, exchangeDataInfo.exchangeKey),\n encryptionKeys: await secureDelegationsEncryption.encryptEncryptionKeys(existingEncryptionKeys, exchangeDataInfo.exchangeKey),\n owningEntityIds: await secureDelegationsEncryption.encryptOwningEntityIds(existingOwningEntityIds, exchangeDataInfo.exchangeKey),\n permissions: SecureDelegation.AccessLevelEnum.WRITE,\n }),\n },\n keysEquivalences: { [aliasKey]: canonicalKey },\n }),\n },\n type: EntityWithDelegationTypeName.Patient,\n }\n const shareOrUpdateParams = await manager.makeShareOrUpdateRequestParams(\n fakeEntity,\n delegateId,\n [...existingSecretIds, ...newSecretIds],\n [...existingEncryptionKeys, ...newEncryptionKeys],\n [...existingOwningEntityIds, ...newOwningEntityIds],\n RequestedPermissionEnum.MAX_WRITE\n )\n expect(shareOrUpdateParams).to.not.be.undefined\n expect(shareOrUpdateParams!.share).to.be.undefined\n expect(shareOrUpdateParams!.update).to.not.be.undefined\n const updateParams = shareOrUpdateParams!.update!\n expect(updateParams.metadataAccessControlHash).to.equal(canonicalKey)\n expect(Object.keys(updateParams.secretIds ?? {})).to.have.length(newSecretIds.length)\n for (const [secretId, updateType] of Object.entries(updateParams.secretIds ?? {})) {\n expect(updateType).to.equal(EntryUpdateTypeEnum.CREATE)\n expect(newSecretIds).to.contain(await secureDelegationsEncryption.decryptSecretId(secretId, exchangeDataInfo.exchangeKey))\n }\n expect(Object.keys(updateParams.encryptionKeys ?? {})).to.have.length(newEncryptionKeys.length)\n for (const [encryptionKey, updateType] of Object.entries(updateParams.encryptionKeys ?? {})) {\n expect(updateType).to.equal(EntryUpdateTypeEnum.CREATE)\n expect(newEncryptionKeys).to.contain(await secureDelegationsEncryption.decryptEncryptionKey(encryptionKey, exchangeDataInfo.exchangeKey))\n }\n expect(Object.keys(updateParams.owningEntityIds ?? {})).to.have.length(newOwningEntityIds.length)\n for (const [owningEntityId, updateType] of Object.entries(updateParams.owningEntityIds ?? {})) {\n expect(updateType).to.equal(EntryUpdateTypeEnum.CREATE)\n expect(newOwningEntityIds).to.contain(await secureDelegationsEncryption.decryptOwningEntityId(owningEntityId, exchangeDataInfo.exchangeKey))\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should return undefined for existing secure delegations if it contains all entries.', async function () {\n await initialiseComponents(false, false)\n const canonicalSfk = primitives.randomUuid()\n const exchangeDataInfo = await exchangeData.getOrCreateEncryptionDataTo(delegateId, EntityWithDelegationTypeName.Patient, [], false)\n const canonicalKey = await accessControlSecretUtils.secureDelegationKeyFor(\n exchangeDataInfo.accessControlSecret,\n EntityWithDelegationTypeName.Patient,\n canonicalSfk\n )\n const existingSecretIds = [ua2hex(primitives.randomBytes(16))]\n const existingEncryptionKeys: string[] = []\n const existingOwningEntityIds = [ua2hex(primitives.randomBytes(16))]\n const fakeEntity: { entity: EncryptedEntityStub; type: EntityWithDelegationTypeName } = {\n entity: {\n secretForeignKeys: [canonicalSfk],\n securityMetadata: new SecurityMetadata({\n secureDelegations: {\n [canonicalKey]: new SecureDelegation({\n delegator: selfId,\n delegate: selfId,\n secretIds: await secureDelegationsEncryption.encryptSecretIds(existingSecretIds, exchangeDataInfo.exchangeKey),\n encryptionKeys: await secureDelegationsEncryption.encryptEncryptionKeys(existingEncryptionKeys, exchangeDataInfo.exchangeKey),\n owningEntityIds: await secureDelegationsEncryption.encryptOwningEntityIds(existingOwningEntityIds, exchangeDataInfo.exchangeKey),\n permissions: SecureDelegation.AccessLevelEnum.WRITE,\n }),\n },\n }),\n },\n type: EntityWithDelegationTypeName.Patient,\n }\n const shareOrUpdateParams = await manager.makeShareOrUpdateRequestParams(\n fakeEntity,\n delegateId,\n [...existingSecretIds],\n [...existingEncryptionKeys],\n [...existingOwningEntityIds],\n RequestedPermissionEnum.MAX_WRITE\n )\n expect(shareOrUpdateParams).to.be.undefined\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"secure-delegations-manager-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/secure-delegations-manager-test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAgC;AAChC,iFAAgF;AAChF,mCAAkC;AAClC,qFAAiF;AACjF,uGAAmG;AACnG,kDAA6F;AAC7F,iGAA6F;AAC7F,iGAA6F;AAC7F,uFAAqI;AACrI,+FAA2F;AAC3F,yEAAqE;AACrE,mEAA+D;AAC/D,2EAAuE;AAEvE,2FAAuF;AACvF,+BAA6B;AAE7B,8EAA0E;AAC1E,8EAA0E;AAE1E,yHAAqH;AACrH,2DAAkF;AAClF,gFAA4E;AAC5E,uFAAmF;AACnF,mGAAqH;AAErH,IAAO,uBAAuB,GAAG,uCAAkB,CAAC,2BAA2B,CAAA;AAC/E,IAAO,mBAAmB,GAAG,qEAAiC,CAAC,mBAAmB,CAAA;AAElF,IAAA,gBAAQ,EAAC,4BAA4B,EAAE;;QACrC,MAAM,UAAU,GAAG,IAAI,sCAAmB,CAAC,kBAAgB,CAAC,CAAA;QAC5D,IAAI,MAAc,CAAA;QAClB,IAAI,SAAiB,CAAA;QACrB,IAAI,WAA+B,CAAA;QACnC,IAAI,UAAkB,CAAA;QACtB,IAAI,aAAqB,CAAA;QACzB,IAAI,eAAmC,CAAA;QACvC,IAAI,YAA8B,CAAA;QAClC,IAAI,sBAAkD,CAAA;QACtD,IAAI,2BAAwD,CAAA;QAC5D,IAAI,OAAiC,CAAA;QACrC,IAAI,YAAiC,CAAA;QACrC,IAAI,wBAAkD,CAAA;QACtD,IAAI,SAAoC,CAAA;QAExC,SAAe,oBAAoB,CAAC,YAAqB,EAAE,gBAAyB;;gBAClF,MAAM,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;gBAChC,WAAW,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;gBACrE,SAAS,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAA;gBAC5F,UAAU,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;gBACpC,eAAe,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;gBACzE,aAAa,GAAG,IAAA,qBAAa,EAAC,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;gBACxG,YAAY,GAAG,IAAI,mCAAgB,CACjC;oBACE,EAAE,EAAE,MAAM;oBACV,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,qCAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,qCAAiB,CAAC,OAAO;oBACtE,SAAS,EAAE,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;iBACjF,EACD;oBACE;wBACE,EAAE,EAAE,UAAU;wBACd,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,qCAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,qCAAiB,CAAC,OAAO;wBAC1E,SAAS,EAAE,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;qBACrF;iBACF,CACF,CAAA;gBACD,MAAM,gBAAgB,GAAG,IAAI,2CAAoB,EAAE,CAAA;gBACnD,MAAM,eAAe,GAAG,IAAI,yCAAmB,EAAE,CAAA;gBACjD,wBAAwB,GAAG,IAAI,mDAAwB,CAAC,UAAU,CAAC,CAAA;gBACnE,MAAM,qBAAqB,GAAG,MAAM,qDAAyB,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;gBAC/F,MAAM,gBAAgB,GAAG,IAAI,iDAAuB,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;gBACrH,YAAY,GAAG,MAAM,IAAA,sEAAgD,EACnE,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,IAAI,CACL,CAAA;gBACD,sBAAsB,GAAG,IAAI,uDAA0B,EAAE,CAAA;gBACzD,2BAA2B,GAAG,IAAI,yDAA2B,CAAC,qBAAqB,EAAE,UAAU,CAAC,CAAA;gBAChG,SAAS,GAAG,IAAI,qDAAyB,CACvC;oBACE,KAAK,EAAE,EAAE;oBACT,IAAI,IAAI;wBACN,MAAM,QAAQ,CAAA;oBAChB,CAAC;oBACK,4BAA4B,CAAC,WAAmB,EAAE,UAAkB;;4BACxE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;wBAC5B,CAAC;qBAAA;oBACK,WAAW;;4BACf,MAAM,QAAQ,CAAA;wBAChB,CAAC;qBAAA;iBACK,EACR,UAAU,EACV,YAAY,EACZ,sBAAsB,EACtB,2BAA2B,EAC3B,YAAY,CACb,CAAA;gBACD,OAAO,GAAG,IAAI,mDAAwB,CACpC,YAAY,EACZ,sBAAsB,EACtB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,CAAC,YAAY,CACd,CAAA;YACH,CAAC;SAAA;QAED,EAAE,CAAC,gFAAgF,EAAE;;gBACnF,SAAe,MAAM,CAAC,YAAqB,EAAE,gBAAyB;;;wBACpE,MAAM,oBAAoB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAA;wBAC1D,MAAM,SAAS,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;wBAC1F,MAAM,cAAc,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;wBAC3D,MAAM,eAAe,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;wBACpI,MAAM,UAAU,GAAG,wCAA4B,CAAC,OAAO,CAAA;wBACvD,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,8BAA8B,CACtE,EAAE,MAAM,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EACvD,UAAU,EACV,SAAS,EACT,cAAc,EACd,eAAe,EACf,uCAAkB,CAAC,uBAAuB,CAAC,SAAS,CACrD,CAAA;wBACD,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;wBAC/C,IAAA,aAAM,EAAC,mBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;wBACnD,IAAA,aAAM,EAAC,mBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;wBACtD,MAAM,WAAW,GAAG,mBAAoB,CAAC,KAAM,CAAA;wBAC/C,IAAA,aAAM,EAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;wBACvD,IAAI,YAAY,IAAI,gBAAgB,EAAE;4BACpC,IAAA,aAAM,EAAC,WAAW,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;4BACtD,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,MAAA,WAAW,CAAC,uBAAuB,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;yBACpF;6BAAM,IAAI,YAAY,IAAI,CAAC,gBAAgB,EAAE;4BAC5C,IAAA,aAAM,EAAC,WAAW,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;4BAClD,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,MAAA,WAAW,CAAC,uBAAuB,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;4BACnF,IAAA,aAAM,EAAC,WAAW,CAAC,uBAAwB,CAAC,IAAA,yBAAiB,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;yBAC/F;6BAAM,IAAI,CAAC,YAAY,IAAI,gBAAgB,EAAE;4BAC5C,IAAA,aAAM,EAAC,WAAW,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;4BAClD,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,MAAA,WAAW,CAAC,uBAAuB,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;4BACnF,IAAA,aAAM,EAAC,WAAW,CAAC,uBAAwB,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;yBAChF;6BAAM;4BACL,IAAA,aAAM,EAAC,WAAW,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;4BAClD,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,MAAA,WAAW,CAAC,uBAAuB,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;yBACpF;wBACD,MAAM,SAAS,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,MAAM,CAAC,IAAA,kBAAM,EAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;wBAC3F,MAAM,UAAU,GAAwE;4BACtF,MAAM,EAAE;gCACN,iBAAiB,EAAE,EAAE;gCACrB,gBAAgB,EAAE,IAAI,mCAAgB,CAAC;oCACrC,iBAAiB,EAAE;wCACjB,CAAC,SAAS,CAAC,EAAE,IAAI,mCAAgB,CAAC;4CAChC,SAAS,EAAE,WAAW,CAAC,iBAAiB;4CACxC,QAAQ,EAAE,WAAW,CAAC,gBAAgB;4CACtC,SAAS,EAAE,WAAW,CAAC,SAAS;4CAChC,cAAc,EAAE,WAAW,CAAC,cAAc;4CAC1C,eAAe,EAAE,WAAW,CAAC,eAAe;4CAC5C,cAAc,EAAE,WAAW,CAAC,cAAc;4CAC1C,uBAAuB,EAAE,WAAW,CAAC,uBAAuB;4CAC5D,WAAW,EAAE,mCAAgB,CAAC,eAAe,CAAC,KAAK;yCACpD,CAAC;qCACH;iCACF,CAAC;6BACH;4BACD,IAAI,EAAE,wCAA4B,CAAC,OAAO;yBAC3C,CAAA;wBACD,MAAM,sBAAsB,CAAC,sBAAsB,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,uBAAwB,EAAE,CAAC,CAAA;wBAC1G,MAAM,YAAY,CAAC,sBAAsB,EAAE,CAAA;wBAC3C,MAAM,kBAAkB,GAAG,CAAC,MAAM,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,gDAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;wBAChI,MAAM,uBAAuB,GAAG,CAAC,MAAM,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,gDAAoB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;wBAC1I,MAAM,wBAAwB,GAAG,CAAC,MAAM,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,gDAAoB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;wBAC5I,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;wBAC3D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;4BAChC,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;yBAChD;wBACD,IAAA,aAAM,EAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;wBACrE,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;4BAC1C,IAAA,aAAM,EAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;yBAC1D;wBACD,IAAA,aAAM,EAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;wBACvE,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE;4BAC5C,IAAA,aAAM,EAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;yBAC5D;;iBACF;gBACD,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;gBAC/B,MAAM,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;gBAC1B,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;gBAC3B,MAAM,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;gBACzB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;gBAC3B,MAAM,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;gBACzB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBACvB,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YAC1B,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,0FAA0F,EAAE;;gBAC7F,SAAe,MAAM,CAAC,uBAAgC;;;wBACpD,MAAM,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;wBACxC,MAAM,YAAY,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;wBAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;wBACxC,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;wBAC1F,MAAM,YAAY,GAAG,MAAM,wBAAwB,CAAC,sBAAsB,CACxE,gBAAgB,CAAC,mBAAmB,EACpC,wCAA4B,CAAC,OAAO,CACrC,CAAA;wBACD,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,sBAAsB,CACpE,gBAAgB,CAAC,mBAAmB,EACpC,wCAA4B,CAAC,OAAO,CACrC,CAAA;wBACD,MAAM,iBAAiB,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;wBAC9D,MAAM,YAAY,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;wBACzD,MAAM,sBAAsB,GAAa,EAAE,CAAA;wBAC3C,MAAM,iBAAiB,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;wBAC9D,MAAM,uBAAuB,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;wBACpE,MAAM,kBAAkB,GAAa,EAAE,CAAA;wBACvC,MAAM,UAAU,GAAwE;4BACtF,MAAM,EAAE;gCACN,iBAAiB,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;gCACxE,gBAAgB,EAAE,IAAI,mCAAgB,CAAC;oCACrC,iBAAiB,EAAE;wCACjB,CAAC,YAAY,CAAC,EAAE,IAAI,mCAAgB,CAAC;4CACnC,SAAS,EAAE,MAAM;4CACjB,QAAQ,EAAE,MAAM;4CAChB,SAAS,EAAE,MAAM,2BAA2B,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,WAAW,CAAC;4CAC9G,cAAc,EAAE,MAAM,2BAA2B,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,WAAW,CAAC;4CAC7H,eAAe,EAAE,MAAM,2BAA2B,CAAC,sBAAsB,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,WAAW,CAAC;4CAChI,WAAW,EAAE,mCAAgB,CAAC,eAAe,CAAC,KAAK;yCACpD,CAAC;qCACH;oCACD,gBAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE;iCAC/C,CAAC;6BACH;4BACD,IAAI,EAAE,wCAA4B,CAAC,OAAO;yBAC3C,CAAA;wBACD,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,8BAA8B,CACtE,UAAU,EACV,UAAU,EACV,CAAC,GAAG,iBAAiB,EAAE,GAAG,YAAY,CAAC,EACvC,CAAC,GAAG,sBAAsB,EAAE,GAAG,iBAAiB,CAAC,EACjD,CAAC,GAAG,uBAAuB,EAAE,GAAG,kBAAkB,CAAC,EACnD,uBAAuB,CAAC,SAAS,CAClC,CAAA;wBACD,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;wBAC/C,IAAA,aAAM,EAAC,mBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;wBAClD,IAAA,aAAM,EAAC,mBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;wBACvD,MAAM,YAAY,GAAG,mBAAoB,CAAC,MAAO,CAAA;wBACjD,IAAA,aAAM,EAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;wBACrE,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAA,YAAY,CAAC,SAAS,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;wBACrF,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAA,YAAY,CAAC,SAAS,mCAAI,EAAE,CAAC,EAAE;4BACjF,IAAA,aAAM,EAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;4BACvD,IAAA,aAAM,EAAC,YAAY,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,2BAA2B,CAAC,eAAe,CAAC,QAAQ,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAA;yBAC3H;wBACD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAA,YAAY,CAAC,cAAc,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;wBAC/F,KAAK,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAA,YAAY,CAAC,cAAc,mCAAI,EAAE,CAAC,EAAE;4BAC3F,IAAA,aAAM,EAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;4BACvD,IAAA,aAAM,EAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,2BAA2B,CAAC,oBAAoB,CAAC,aAAa,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAA;yBAC1I;wBACD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAA,YAAY,CAAC,eAAe,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;wBACjG,KAAK,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAA,YAAY,CAAC,eAAe,mCAAI,EAAE,CAAC,EAAE;4BAC7F,IAAA,aAAM,EAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;4BACvD,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,2BAA2B,CAAC,qBAAqB,CAAC,cAAc,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAA;yBAC7I;;iBACF;gBACD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;gBAClB,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,qFAAqF,EAAE;;gBACxF,MAAM,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;gBACxC,MAAM,YAAY,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;gBAC5C,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;gBAC1F,MAAM,YAAY,GAAG,MAAM,wBAAwB,CAAC,sBAAsB,CACxE,gBAAgB,CAAC,mBAAmB,EACpC,wCAA4B,CAAC,OAAO,CACrC,CAAA;gBACD,MAAM,iBAAiB,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;gBAC9D,MAAM,sBAAsB,GAAa,EAAE,CAAA;gBAC3C,MAAM,uBAAuB,GAAG,CAAC,IAAA,kBAAM,EAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;gBACpE,MAAM,UAAU,GAAwE;oBACtF,MAAM,EAAE;wBACN,iBAAiB,EAAE,CAAC,YAAY,CAAC;wBACjC,gBAAgB,EAAE,IAAI,mCAAgB,CAAC;4BACrC,iBAAiB,EAAE;gCACjB,CAAC,YAAY,CAAC,EAAE,IAAI,mCAAgB,CAAC;oCACnC,SAAS,EAAE,MAAM;oCACjB,QAAQ,EAAE,MAAM;oCAChB,SAAS,EAAE,MAAM,2BAA2B,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,WAAW,CAAC;oCAC9G,cAAc,EAAE,MAAM,2BAA2B,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,WAAW,CAAC;oCAC7H,eAAe,EAAE,MAAM,2BAA2B,CAAC,sBAAsB,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,WAAW,CAAC;oCAChI,WAAW,EAAE,mCAAgB,CAAC,eAAe,CAAC,KAAK;iCACpD,CAAC;6BACH;yBACF,CAAC;qBACH;oBACD,IAAI,EAAE,wCAA4B,CAAC,OAAO;iBAC3C,CAAA;gBACD,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,8BAA8B,CACtE,UAAU,EACV,UAAU,EACV,CAAC,GAAG,iBAAiB,CAAC,EACtB,CAAC,GAAG,sBAAsB,CAAC,EAC3B,CAAC,GAAG,uBAAuB,CAAC,EAC5B,uBAAuB,CAAC,SAAS,CAClC,CAAA;gBACD,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;YAC7C,CAAC;SAAA,CAAC,CAAA;IACJ,CAAC;CAAA,CAAC,CAAA","sourcesContent":["import { describe } from 'mocha'\nimport { WebCryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { webcrypto } from 'crypto'\nimport { FakeEncryptionKeysManager } from '../../utils/FakeEncryptionKeysManager'\nimport { SecureDelegationsEncryption } from '../../../icc-x-api/crypto/SecureDelegationsEncryption'\nimport { EntityWithDelegationTypeName, hex2ua, ShaVersion, ua2hex } from '../../../icc-x-api'\nimport { SecureDelegationsManager } from '../../../icc-x-api/crypto/SecureDelegationsManager'\nimport { AccessControlSecretUtils } from '../../../icc-x-api/crypto/AccessControlSecretUtils'\nimport { ExchangeDataManager, initialiseExchangeDataManagerForCurrentDataOwner } from '../../../icc-x-api/crypto/ExchangeDataManager'\nimport { BaseExchangeDataManager } from '../../../icc-x-api/crypto/BaseExchangeDataManager'\nimport { FakeExchangeDataApi } from '../../utils/FakeExchangeDataApi'\nimport { FakeDataOwnerApi } from '../../utils/FakeDataOwnerApi'\nimport { TestCryptoStrategies } from '../../utils/TestCryptoStrategies'\nimport { KeyPair } from '../../../icc-x-api/crypto/RSA'\nimport { EntityShareRequest } from '../../../icc-api/model/requests/EntityShareRequest'\nimport { expect } from 'chai'\nimport { EncryptedEntityStub } from '../../../icc-api/model/models'\nimport { SecurityMetadata } from '../../../icc-api/model/SecurityMetadata'\nimport { SecureDelegation } from '../../../icc-api/model/SecureDelegation'\nimport { asyncGeneratorToArray } from '../../../icc-x-api/utils/collection-utils'\nimport { EntitySharedMetadataUpdateRequest } from '../../../icc-api/model/requests/EntitySharedMetadataUpdateRequest'\nimport { fingerprintV1toV2, fingerprintV2 } from '../../../icc-x-api/crypto/utils'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { FakeExchangeDataMapManager } from '../../utils/FakeExchangeDataMapManager'\nimport { SecurityMetadataDecryptor, SecurityMetadataType } from '../../../icc-x-api/crypto/SecurityMetadataDecryptor'\nimport { BaseExchangeKeysManager } from '../../../icc-x-api/crypto/BaseExchangeKeysManager'\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionInternal\nimport EntryUpdateTypeEnum = EntitySharedMetadataUpdateRequest.EntryUpdateTypeEnum\n\ndescribe('Secure delegations manager', async function () {\n const primitives = new WebCryptoPrimitives(webcrypto as any)\n let selfId: string\n let selfKeyFp: string\n let selfKeypair: KeyPair<CryptoKey>\n let delegateId: string\n let delegateKeyFp: string\n let delegateKeypair: KeyPair<CryptoKey>\n let dataOwnerApi: FakeDataOwnerApi\n let exchangeDataMapManager: FakeExchangeDataMapManager\n let secureDelegationsEncryption: SecureDelegationsEncryption\n let manager: SecureDelegationsManager\n let exchangeData: ExchangeDataManager\n let accessControlSecretUtils: AccessControlSecretUtils\n let decryptor: SecurityMetadataDecryptor\n\n async function initialiseComponents(explicitSelf: boolean, explicitDelegate: boolean) {\n selfId = primitives.randomUuid()\n selfKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n selfKeyFp = ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki')).slice(-32)\n delegateId = primitives.randomUuid()\n delegateKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n delegateKeyFp = fingerprintV2(ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki')))\n dataOwnerApi = new FakeDataOwnerApi(\n {\n id: selfId,\n type: explicitSelf ? DataOwnerTypeEnum.Hcp : DataOwnerTypeEnum.Patient,\n publicKey: ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki')),\n },\n [\n {\n id: delegateId,\n type: explicitDelegate ? DataOwnerTypeEnum.Hcp : DataOwnerTypeEnum.Patient,\n publicKey: ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki')),\n },\n ]\n )\n const cryptoStrategies = new TestCryptoStrategies()\n const exchangeDataApi = new FakeExchangeDataApi()\n accessControlSecretUtils = new AccessControlSecretUtils(primitives)\n const encryptionKeysManager = await FakeEncryptionKeysManager.create(primitives, [selfKeypair])\n const baseExchangeData = new BaseExchangeDataManager(exchangeDataApi, dataOwnerApi, primitives, !explicitSelf, false)\n exchangeData = await initialiseExchangeDataManagerForCurrentDataOwner(\n baseExchangeData,\n encryptionKeysManager,\n accessControlSecretUtils,\n cryptoStrategies,\n dataOwnerApi,\n primitives,\n true\n )\n exchangeDataMapManager = new FakeExchangeDataMapManager()\n secureDelegationsEncryption = new SecureDelegationsEncryption(encryptionKeysManager, primitives)\n decryptor = new SecurityMetadataDecryptor(\n {\n cache: {},\n get base(): BaseExchangeKeysManager {\n throw 'unused'\n },\n async getDecryptionExchangeKeysFor(delegatorId: string, delegateId: string): Promise<CryptoKey[]> {\n return Promise.resolve([])\n },\n async reloadCache(): Promise<void> {\n throw 'unused'\n },\n } as any,\n primitives,\n exchangeData,\n exchangeDataMapManager,\n secureDelegationsEncryption,\n dataOwnerApi\n )\n manager = new SecureDelegationsManager(\n exchangeData,\n exchangeDataMapManager,\n secureDelegationsEncryption,\n accessControlSecretUtils,\n encryptionKeysManager,\n primitives,\n dataOwnerApi,\n cryptoStrategies,\n !explicitSelf\n )\n }\n\n it('should make a share request which will create a decryptable secure delegation.', async function () {\n async function doTest(explicitSelf: boolean, explicitDelegate: boolean) {\n await initialiseComponents(explicitSelf, explicitDelegate)\n const secretIds = [ua2hex(primitives.randomBytes(16)), ua2hex(primitives.randomBytes(16))]\n const encryptionKeys = [ua2hex(primitives.randomBytes(16))]\n const owningEntityIds = [ua2hex(primitives.randomBytes(16)), ua2hex(primitives.randomBytes(16)), ua2hex(primitives.randomBytes(16))]\n const entityType = EntityWithDelegationTypeName.Patient\n const shareOrUpdateParams = await manager.makeShareOrUpdateRequestParams(\n { entity: { secretForeignKeys: [] }, type: entityType },\n delegateId,\n secretIds,\n encryptionKeys,\n owningEntityIds,\n EntityShareRequest.RequestedPermissionEnum.MAX_WRITE\n )\n expect(shareOrUpdateParams).to.not.be.undefined\n expect(shareOrUpdateParams!.update).to.be.undefined\n expect(shareOrUpdateParams!.share).to.not.be.undefined\n const shareParams = shareOrUpdateParams!.share!\n expect(shareParams.accessControlKeys).to.have.length(1)\n if (explicitSelf && explicitDelegate) {\n expect(shareParams.exchangeDataId).to.not.be.undefined\n expect(Object.entries(shareParams.encryptedExchangeDataId ?? {})).to.have.length(0)\n } else if (explicitSelf && !explicitDelegate) {\n expect(shareParams.exchangeDataId).to.be.undefined\n expect(Object.entries(shareParams.encryptedExchangeDataId ?? {})).to.have.length(1)\n expect(shareParams.encryptedExchangeDataId![fingerprintV1toV2(selfKeyFp)]).to.not.be.undefined\n } else if (!explicitSelf && explicitDelegate) {\n expect(shareParams.exchangeDataId).to.be.undefined\n expect(Object.entries(shareParams.encryptedExchangeDataId ?? {})).to.have.length(1)\n expect(shareParams.encryptedExchangeDataId![delegateKeyFp]).to.not.be.undefined\n } else {\n expect(shareParams.exchangeDataId).to.be.undefined\n expect(Object.entries(shareParams.encryptedExchangeDataId ?? {})).to.have.length(0)\n }\n const secDelKey = ua2hex(await primitives.sha256(hex2ua(shareParams.accessControlKeys[0])))\n const fakeEntity: { entity: EncryptedEntityStub; type: EntityWithDelegationTypeName } = {\n entity: {\n secretForeignKeys: [],\n securityMetadata: new SecurityMetadata({\n secureDelegations: {\n [secDelKey]: new SecureDelegation({\n delegator: shareParams.explicitDelegator,\n delegate: shareParams.explicitDelegate,\n secretIds: shareParams.secretIds,\n encryptionKeys: shareParams.encryptionKeys,\n owningEntityIds: shareParams.owningEntityIds,\n exchangeDataId: shareParams.exchangeDataId,\n encryptedExchangeDataId: shareParams.encryptedExchangeDataId,\n permissions: SecureDelegation.AccessLevelEnum.WRITE,\n }),\n },\n }),\n },\n type: EntityWithDelegationTypeName.Patient,\n }\n await exchangeDataMapManager.createExchangeDataMaps({ [secDelKey]: shareParams.encryptedExchangeDataId! })\n await exchangeData.clearOrRepopulateCache()\n const decryptedSecretIds = (await decryptor.decryptAll(fakeEntity.entity, [selfId], SecurityMetadataType.SecretId))[0].extracted\n const decryptedEncryptionKeys = (await decryptor.decryptAll(fakeEntity.entity, [selfId], SecurityMetadataType.EncryptionKey))[0].extracted\n const decryptedOwningEntityIds = (await decryptor.decryptAll(fakeEntity.entity, [selfId], SecurityMetadataType.OwningEntityId))[0].extracted\n expect(decryptedSecretIds).to.have.length(secretIds.length)\n for (const secretId of secretIds) {\n expect(decryptedSecretIds).to.include(secretId)\n }\n expect(decryptedEncryptionKeys).to.have.length(encryptionKeys.length)\n for (const encryptionKey of encryptionKeys) {\n expect(decryptedEncryptionKeys).to.include(encryptionKey)\n }\n expect(decryptedOwningEntityIds).to.have.length(owningEntityIds.length)\n for (const owningEntityId of owningEntityIds) {\n expect(decryptedOwningEntityIds).to.include(owningEntityId)\n }\n }\n console.log('Patient->Patient')\n await doTest(false, false)\n console.log('Hcp->Patient')\n await doTest(true, false)\n console.log('Patient->Hcp')\n await doTest(false, true)\n console.log('Hcp->Hcp')\n await doTest(true, true)\n })\n\n it('should make an update request which the missing entries for existing secure delegations.', async function () {\n async function doTest(makeAccessibleFromAlias: boolean) {\n await initialiseComponents(false, false)\n const canonicalSfk = primitives.randomUuid()\n const aliasSfk = primitives.randomUuid()\n const exchangeDataInfo = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const canonicalKey = await accessControlSecretUtils.secureDelegationKeyFor(\n exchangeDataInfo.accessControlSecret,\n EntityWithDelegationTypeName.Patient\n )\n const aliasKey = await accessControlSecretUtils.secureDelegationKeyFor(\n exchangeDataInfo.accessControlSecret,\n EntityWithDelegationTypeName.Patient\n )\n const existingSecretIds = [ua2hex(primitives.randomBytes(16))]\n const newSecretIds = [ua2hex(primitives.randomBytes(16))]\n const existingEncryptionKeys: string[] = []\n const newEncryptionKeys = [ua2hex(primitives.randomBytes(16))]\n const existingOwningEntityIds = [ua2hex(primitives.randomBytes(16))]\n const newOwningEntityIds: string[] = []\n const fakeEntity: { entity: EncryptedEntityStub; type: EntityWithDelegationTypeName } = {\n entity: {\n secretForeignKeys: makeAccessibleFromAlias ? [aliasSfk] : [canonicalSfk],\n securityMetadata: new SecurityMetadata({\n secureDelegations: {\n [canonicalKey]: new SecureDelegation({\n delegator: selfId,\n delegate: selfId,\n secretIds: await secureDelegationsEncryption.encryptSecretIds(existingSecretIds, exchangeDataInfo.exchangeKey),\n encryptionKeys: await secureDelegationsEncryption.encryptEncryptionKeys(existingEncryptionKeys, exchangeDataInfo.exchangeKey),\n owningEntityIds: await secureDelegationsEncryption.encryptOwningEntityIds(existingOwningEntityIds, exchangeDataInfo.exchangeKey),\n permissions: SecureDelegation.AccessLevelEnum.WRITE,\n }),\n },\n keysEquivalences: { [aliasKey]: canonicalKey },\n }),\n },\n type: EntityWithDelegationTypeName.Patient,\n }\n const shareOrUpdateParams = await manager.makeShareOrUpdateRequestParams(\n fakeEntity,\n delegateId,\n [...existingSecretIds, ...newSecretIds],\n [...existingEncryptionKeys, ...newEncryptionKeys],\n [...existingOwningEntityIds, ...newOwningEntityIds],\n RequestedPermissionEnum.MAX_WRITE\n )\n expect(shareOrUpdateParams).to.not.be.undefined\n expect(shareOrUpdateParams!.share).to.be.undefined\n expect(shareOrUpdateParams!.update).to.not.be.undefined\n const updateParams = shareOrUpdateParams!.update!\n expect(updateParams.metadataAccessControlHash).to.equal(canonicalKey)\n expect(Object.keys(updateParams.secretIds ?? {})).to.have.length(newSecretIds.length)\n for (const [secretId, updateType] of Object.entries(updateParams.secretIds ?? {})) {\n expect(updateType).to.equal(EntryUpdateTypeEnum.CREATE)\n expect(newSecretIds).to.contain(await secureDelegationsEncryption.decryptSecretId(secretId, exchangeDataInfo.exchangeKey))\n }\n expect(Object.keys(updateParams.encryptionKeys ?? {})).to.have.length(newEncryptionKeys.length)\n for (const [encryptionKey, updateType] of Object.entries(updateParams.encryptionKeys ?? {})) {\n expect(updateType).to.equal(EntryUpdateTypeEnum.CREATE)\n expect(newEncryptionKeys).to.contain(await secureDelegationsEncryption.decryptEncryptionKey(encryptionKey, exchangeDataInfo.exchangeKey))\n }\n expect(Object.keys(updateParams.owningEntityIds ?? {})).to.have.length(newOwningEntityIds.length)\n for (const [owningEntityId, updateType] of Object.entries(updateParams.owningEntityIds ?? {})) {\n expect(updateType).to.equal(EntryUpdateTypeEnum.CREATE)\n expect(newOwningEntityIds).to.contain(await secureDelegationsEncryption.decryptOwningEntityId(owningEntityId, exchangeDataInfo.exchangeKey))\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should return undefined for existing secure delegations if it contains all entries.', async function () {\n await initialiseComponents(false, false)\n const canonicalSfk = primitives.randomUuid()\n const exchangeDataInfo = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const canonicalKey = await accessControlSecretUtils.secureDelegationKeyFor(\n exchangeDataInfo.accessControlSecret,\n EntityWithDelegationTypeName.Patient\n )\n const existingSecretIds = [ua2hex(primitives.randomBytes(16))]\n const existingEncryptionKeys: string[] = []\n const existingOwningEntityIds = [ua2hex(primitives.randomBytes(16))]\n const fakeEntity: { entity: EncryptedEntityStub; type: EntityWithDelegationTypeName } = {\n entity: {\n secretForeignKeys: [canonicalSfk],\n securityMetadata: new SecurityMetadata({\n secureDelegations: {\n [canonicalKey]: new SecureDelegation({\n delegator: selfId,\n delegate: selfId,\n secretIds: await secureDelegationsEncryption.encryptSecretIds(existingSecretIds, exchangeDataInfo.exchangeKey),\n encryptionKeys: await secureDelegationsEncryption.encryptEncryptionKeys(existingEncryptionKeys, exchangeDataInfo.exchangeKey),\n owningEntityIds: await secureDelegationsEncryption.encryptOwningEntityIds(existingOwningEntityIds, exchangeDataInfo.exchangeKey),\n permissions: SecureDelegation.AccessLevelEnum.WRITE,\n }),\n },\n }),\n },\n type: EntityWithDelegationTypeName.Patient,\n }\n const shareOrUpdateParams = await manager.makeShareOrUpdateRequestParams(\n fakeEntity,\n delegateId,\n [...existingSecretIds],\n [...existingEncryptionKeys],\n [...existingOwningEntityIds],\n RequestedPermissionEnum.MAX_WRITE\n )\n expect(shareOrUpdateParams).to.be.undefined\n })\n})\n"]}
|
|
@@ -32,4 +32,5 @@ export declare class FakeEncryptionKeysManager extends UserEncryptionKeysManager
|
|
|
32
32
|
};
|
|
33
33
|
deleteKey(fp: string): void;
|
|
34
34
|
addOrUpdateKey(primitives: CryptoPrimitives, pair: KeyPair<CryptoKey>, verified: boolean): Promise<void>;
|
|
35
|
+
unverifyExistingKeysAndCreateNewVerified(primitives: CryptoPrimitives): Promise<void>;
|
|
35
36
|
}
|
|
@@ -11,6 +11,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.FakeEncryptionKeysManager = void 0;
|
|
13
13
|
const UserEncryptionKeysManager_1 = require("../../icc-x-api/crypto/UserEncryptionKeysManager");
|
|
14
|
+
const RSA_1 = require("../../icc-x-api/crypto/RSA");
|
|
14
15
|
const icc_x_api_1 = require("../../icc-x-api");
|
|
15
16
|
const _ = require("lodash");
|
|
16
17
|
const utils_1 = require("../../icc-x-api/crypto/utils");
|
|
@@ -82,6 +83,16 @@ class FakeEncryptionKeysManager extends UserEncryptionKeysManager_1.UserEncrypti
|
|
|
82
83
|
this.keys[fp] = { pair, verified };
|
|
83
84
|
});
|
|
84
85
|
}
|
|
86
|
+
unverifyExistingKeysAndCreateNewVerified(primitives) {
|
|
87
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
88
|
+
Object.values(this.keys).map((x) => {
|
|
89
|
+
x.verified = false;
|
|
90
|
+
});
|
|
91
|
+
const newKey = yield primitives.RSA.generateKeyPair(RSA_1.ShaVersion.Sha256);
|
|
92
|
+
const newKeyFp = (0, utils_1.fingerprintV1)((0, icc_x_api_1.ua2hex)(yield primitives.RSA.exportKey(newKey.publicKey, 'spki')));
|
|
93
|
+
this.keys[newKeyFp] = { pair: newKey, verified: true };
|
|
94
|
+
});
|
|
95
|
+
}
|
|
85
96
|
}
|
|
86
97
|
exports.FakeEncryptionKeysManager = FakeEncryptionKeysManager;
|
|
87
98
|
//# sourceMappingURL=FakeEncryptionKeysManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FakeEncryptionKeysManager.js","sourceRoot":"","sources":["../../../test/utils/FakeEncryptionKeysManager.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gGAA4F;
|
|
1
|
+
{"version":3,"file":"FakeEncryptionKeysManager.js","sourceRoot":"","sources":["../../../test/utils/FakeEncryptionKeysManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { UserEncryptionKeysManager } from '../../icc-x-api/crypto/UserEncryptionKeysManager'\nimport { DataOwner } from '../../icc-x-api/icc-data-owner-x-api'\nimport { KeyPair, ShaVersion } from '../../icc-x-api/crypto/RSA'\nimport { CryptoPrimitives } from '../../icc-x-api/crypto/CryptoPrimitives'\nimport { ua2hex } from '../../icc-x-api'\nimport * as _ from 'lodash'\nimport { fingerprintV1 } from '../../icc-x-api/crypto/utils'\n\nexport class FakeEncryptionKeysManager extends UserEncryptionKeysManager {\n constructor(private readonly keys: { [fingerprint: string]: { pair: KeyPair<CryptoKey>; verified: boolean } }) {\n super(null as any, null as any, null as any, null as any, null as any, null as any, null as any)\n }\n\n static async create(\n primitives: CryptoPrimitives,\n verifiedKeys: KeyPair<CryptoKey>[],\n unverifiedKeys: KeyPair<CryptoKey>[] = []\n ): Promise<FakeEncryptionKeysManager> {\n const keysByFingerprint = {} as { [fingerprint: string]: { pair: KeyPair<CryptoKey>; verified: boolean } }\n for (const key of verifiedKeys) {\n const fingerprint = fingerprintV1(ua2hex(await primitives.RSA.exportKey(key.publicKey, 'spki')))\n keysByFingerprint[fingerprint] = { pair: key, verified: true }\n }\n for (const key of unverifiedKeys) {\n const fingerprint = fingerprintV1(ua2hex(await primitives.RSA.exportKey(key.publicKey, 'spki')))\n keysByFingerprint[fingerprint] = { pair: key, verified: false }\n }\n return new FakeEncryptionKeysManager(keysByFingerprint)\n }\n\n async getCurrentUserAvailablePublicKeysHex(verifiedOnly: boolean): Promise<string[]> {\n throw new Error('Not implemented')\n }\n\n async getCurrentUserHierarchyAvailablePublicKeysHex(): Promise<string[]> {\n throw new Error('Not implemented')\n }\n\n getKeyPairForFingerprint(fingerprint: string): { pair: KeyPair<CryptoKey>; verified: boolean } | undefined {\n const key = this.keys[fingerprint]\n if (key) return _.cloneDeep(key)\n return undefined\n }\n\n async initialiseKeys(): Promise<{ newKeyPair: KeyPair<CryptoKey>; newKeyFingerprint: string } | undefined> {\n return Promise.resolve(undefined)\n }\n\n async reloadKeys(): Promise<void> {}\n\n getSelfVerifiedKeys(): { fingerprint: string; pair: KeyPair<CryptoKey> }[] {\n const res = []\n for (const [fingerprint, { pair, verified }] of Object.entries(this.keys)) {\n if (verified) res.push({ fingerprint, pair })\n }\n return res\n }\n\n async getVerifiedPublicKeysFor(dataOwner: DataOwner): Promise<string[]> {\n throw new Error('Not implemented')\n }\n\n getDecryptionKeys(): { [p: string]: KeyPair<CryptoKey> } {\n return Object.fromEntries(Object.entries(this.keys).map(([fp, { pair }]) => [fp, pair]))\n }\n\n deleteKey(fp: string) {\n delete this.keys[fp]\n }\n\n async addOrUpdateKey(primitives: CryptoPrimitives, pair: KeyPair<CryptoKey>, verified: boolean) {\n const fp = fingerprintV1(ua2hex(await primitives.RSA.exportKey(pair.publicKey, 'spki')))\n this.keys[fp] = { pair, verified }\n }\n\n async unverifyExistingKeysAndCreateNewVerified(primitives: CryptoPrimitives) {\n Object.values(this.keys).map((x) => {\n x.verified = false\n })\n const newKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const newKeyFp = fingerprintV1(ua2hex(await primitives.RSA.exportKey(newKey.publicKey, 'spki')))\n this.keys[newKeyFp] = { pair: newKey, verified: true }\n }\n}\n"]}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { IccExchangeDataApi } from '../../icc-api/api/internal/IccExchangeDataApi';
|
|
2
2
|
import { ExchangeData } from '../../icc-api/model/internal/ExchangeData';
|
|
3
3
|
import { PaginatedListExchangeData } from '../../icc-api/model/PaginatedListExchangeData';
|
|
4
|
+
import { ListOfIds } from '../../icc-api/model/ListOfIds';
|
|
4
5
|
export type CallCount = {
|
|
5
|
-
getExchangeDataById: number;
|
|
6
6
|
createExchangeData: number;
|
|
7
7
|
modifyExchangeData: number;
|
|
8
8
|
getExchangeDataByParticipant: number;
|
|
9
9
|
getExchangeDataByDelegatorDelegate: number;
|
|
10
|
+
getExchangeDataByIds: number;
|
|
10
11
|
};
|
|
11
12
|
export type ExpectedCallCount = {
|
|
12
|
-
getExchangeDataById?: number;
|
|
13
13
|
createExchangeData?: number;
|
|
14
14
|
modifyExchangeData?: number;
|
|
15
15
|
getExchangeDataByParticipant?: number;
|
|
16
16
|
getExchangeDataByDelegatorDelegate?: number;
|
|
17
|
+
getExchangeDataByIds?: number;
|
|
17
18
|
};
|
|
18
19
|
export declare class FakeExchangeDataApi extends IccExchangeDataApi {
|
|
19
20
|
private readonly data;
|
|
@@ -24,6 +25,7 @@ export declare class FakeExchangeDataApi extends IccExchangeDataApi {
|
|
|
24
25
|
createExchangeData(body: ExchangeData): Promise<ExchangeData>;
|
|
25
26
|
modifyExchangeData(body: ExchangeData): Promise<ExchangeData>;
|
|
26
27
|
getExchangeDataById(exchangeDataId: string): Promise<ExchangeData>;
|
|
28
|
+
getExchangeDataByIds(body: ListOfIds): Promise<ExchangeData[]>;
|
|
27
29
|
getExchangeDataByDelegatorDelegate(delegatorId: string, delegateId: string): Promise<ExchangeData[]>;
|
|
28
30
|
getExchangeDataByParticipant(dataOwnerId: string, startDocumentId?: string, limit?: number): Promise<PaginatedListExchangeData>;
|
|
29
31
|
getAll(): ExchangeData[];
|
|
@@ -1,4 +1,13 @@
|
|
|
1
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
|
+
};
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
12
|
exports.FakeExchangeDataApi = void 0;
|
|
4
13
|
const IccExchangeDataApi_1 = require("../../icc-api/api/internal/IccExchangeDataApi");
|
|
@@ -29,9 +38,9 @@ class FakeExchangeDataApi extends IccExchangeDataApi_1.IccExchangeDataApi {
|
|
|
29
38
|
this._callCount = {
|
|
30
39
|
createExchangeData: 0,
|
|
31
40
|
modifyExchangeData: 0,
|
|
32
|
-
getExchangeDataById: 0,
|
|
33
41
|
getExchangeDataByDelegatorDelegate: 0,
|
|
34
42
|
getExchangeDataByParticipant: 0,
|
|
43
|
+
getExchangeDataByIds: 0,
|
|
35
44
|
};
|
|
36
45
|
}
|
|
37
46
|
createExchangeData(body) {
|
|
@@ -43,11 +52,20 @@ class FakeExchangeDataApi extends IccExchangeDataApi_1.IccExchangeDataApi {
|
|
|
43
52
|
return Promise.resolve(new ExchangeData_1.ExchangeData(this.data.modifyObject(body)));
|
|
44
53
|
}
|
|
45
54
|
getExchangeDataById(exchangeDataId) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
55
|
+
throw new Error('Individual retrieve should not be used anymore');
|
|
56
|
+
}
|
|
57
|
+
getExchangeDataByIds(body) {
|
|
58
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
59
|
+
this._callCount.getExchangeDataByIds += 1;
|
|
60
|
+
const allRetrieved = [];
|
|
61
|
+
for (const id of body.ids) {
|
|
62
|
+
const retrieved = this.data.getById(id);
|
|
63
|
+
if (retrieved) {
|
|
64
|
+
allRetrieved.push(new ExchangeData_1.ExchangeData(retrieved));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return Promise.resolve(allRetrieved);
|
|
68
|
+
});
|
|
51
69
|
}
|
|
52
70
|
getExchangeDataByDelegatorDelegate(delegatorId, delegateId) {
|
|
53
71
|
this._callCount.getExchangeDataByDelegatorDelegate += 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FakeExchangeDataApi.js","sourceRoot":"","sources":["../../../test/utils/FakeExchangeDataApi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FakeExchangeDataApi.js","sourceRoot":"","sources":["../../../test/utils/FakeExchangeDataApi.ts"],"names":[],"mappings":"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","sourcesContent":["import { IccExchangeDataApi } from '../../icc-api/api/internal/IccExchangeDataApi'\nimport { ExchangeData } from '../../icc-api/model/internal/ExchangeData'\nimport { PaginatedListExchangeData } from '../../icc-api/model/PaginatedListExchangeData'\nimport { FakeGenericApi } from './FakeGenericApi'\nimport { PaginatedDocumentKeyIdPairObject } from '../../icc-api/model/PaginatedDocumentKeyIdPairObject'\nimport * as _ from 'lodash'\nimport { expect } from 'chai'\nimport base = Mocha.reporters.base\nimport { ListOfIds } from '../../icc-api/model/ListOfIds'\n\nexport type CallCount = {\n createExchangeData: number\n modifyExchangeData: number\n getExchangeDataByParticipant: number\n getExchangeDataByDelegatorDelegate: number\n getExchangeDataByIds: number\n}\n\nexport type ExpectedCallCount = {\n createExchangeData?: number\n modifyExchangeData?: number\n getExchangeDataByParticipant?: number\n getExchangeDataByDelegatorDelegate?: number\n getExchangeDataByIds?: number\n}\n\nexport class FakeExchangeDataApi extends IccExchangeDataApi {\n private readonly data = new FakeGenericApi<ExchangeData>()\n private _callCount: CallCount = {\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByDelegatorDelegate: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByIds: 0,\n }\n\n public get callCount(): CallCount {\n return _.cloneDeep(this._callCount)\n }\n\n compareCallCountFromBaseline(baseline: CallCount, expected: ExpectedCallCount) {\n for (const [key, v] of Object.entries(expected)) {\n const curr = (this._callCount as any)[key] as number\n const currBaseline = (baseline as any)[key] as number\n expect(curr).to.equal(\n currBaseline + v,\n `Actual call count for ${key} does not match expected\n Current: ${JSON.stringify(this._callCount)}\n Baseline: ${JSON.stringify(baseline)}\n ExpectedDifference: ${JSON.stringify(expected)}\n `\n )\n }\n }\n\n constructor() {\n super('fake', {}, null as any, null as any)\n }\n\n createExchangeData(body: ExchangeData): Promise<ExchangeData> {\n this._callCount.createExchangeData += 1\n return Promise.resolve(new ExchangeData(this.data.createObject(body)))\n }\n\n modifyExchangeData(body: ExchangeData): Promise<ExchangeData> {\n this._callCount.modifyExchangeData += 1\n return Promise.resolve(new ExchangeData(this.data.modifyObject(body)))\n }\n\n getExchangeDataById(exchangeDataId: string): Promise<ExchangeData> {\n throw new Error('Individual retrieve should not be used anymore')\n }\n\n async getExchangeDataByIds(body: ListOfIds): Promise<ExchangeData[]> {\n this._callCount.getExchangeDataByIds += 1\n const allRetrieved: ExchangeData[] = []\n for (const id of body.ids!) {\n const retrieved = this.data.getById(id)\n if (retrieved) {\n allRetrieved.push(new ExchangeData(retrieved))\n }\n }\n return Promise.resolve(allRetrieved)\n }\n\n getExchangeDataByDelegatorDelegate(delegatorId: string, delegateId: string): Promise<ExchangeData[]> {\n this._callCount.getExchangeDataByDelegatorDelegate += 1\n return Promise.resolve(\n this.data\n .getAll()\n .filter((x) => x.delegate === delegateId && x.delegator === delegatorId)\n .map((x) => new ExchangeData(x))\n )\n }\n\n getExchangeDataByParticipant(dataOwnerId: string, startDocumentId?: string, limit?: number): Promise<PaginatedListExchangeData> {\n this._callCount.getExchangeDataByParticipant += 1\n const retrieved = this.data.getPaged(startDocumentId, limit ?? 1000)\n return Promise.resolve(\n new PaginatedListExchangeData({\n pageSize: retrieved.rows.length,\n totalSize: retrieved.rows.length,\n rows: retrieved.rows.filter((x) => x.delegator === dataOwnerId || x.delegate === dataOwnerId).map((x) => new ExchangeData(x)),\n nextKeyPair: new PaginatedDocumentKeyIdPairObject({ startKeyDocId: retrieved.nextId }),\n })\n )\n }\n\n getAll(): ExchangeData[] {\n return this.data.getAll().map((x) => new ExchangeData(x))\n }\n}\n"]}
|
|
@@ -4,27 +4,27 @@ import { ExchangeData } from '../../icc-api/model/internal/ExchangeData';
|
|
|
4
4
|
import { BaseExchangeDataManager } from '../../icc-x-api/crypto/BaseExchangeDataManager';
|
|
5
5
|
import { CryptoPrimitives } from '../../icc-x-api';
|
|
6
6
|
export declare class FakeDecryptionExchangeDataManager implements ExchangeDataManager {
|
|
7
|
-
private readonly expectedEntityType;
|
|
8
|
-
private readonly expectedSecretForeignKeys;
|
|
9
7
|
private readonly cryptoPrimitives;
|
|
10
|
-
constructor(
|
|
8
|
+
constructor(cryptoPrimitives: CryptoPrimitives);
|
|
11
9
|
private readonly dataByHash;
|
|
12
10
|
private readonly dataById;
|
|
13
11
|
clearOrRepopulateCache(): Promise<void>;
|
|
14
12
|
getAccessControlKeysValue(entityType: EntityWithDelegationTypeName): Promise<string | undefined>;
|
|
15
|
-
getCachedDecryptionDataKeyByAccessControlHash(hashes: string[]
|
|
13
|
+
getCachedDecryptionDataKeyByAccessControlHash(hashes: string[]): Promise<{
|
|
16
14
|
[p: string]: {
|
|
17
15
|
exchangeData: ExchangeData;
|
|
18
16
|
exchangeKey: CryptoKey;
|
|
19
17
|
accessControlSecret: string;
|
|
20
18
|
};
|
|
21
19
|
}>;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
getDecryptionDataKeyByIds(ids: string[], retrieveIfNotCached: boolean): Promise<{
|
|
21
|
+
[id: string]: {
|
|
22
|
+
exchangeKey: CryptoKey | undefined;
|
|
23
|
+
accessControlSecret: string | undefined;
|
|
24
|
+
exchangeData: ExchangeData;
|
|
25
|
+
};
|
|
26
|
+
}>;
|
|
27
|
+
getOrCreateEncryptionDataTo(delegateId: string): Promise<{
|
|
28
28
|
exchangeData: ExchangeData;
|
|
29
29
|
accessControlSecret: string;
|
|
30
30
|
exchangeKey: CryptoKey;
|
|
@@ -10,11 +10,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.FakeDecryptionExchangeDataManager = void 0;
|
|
13
|
-
const chai_1 = require("chai");
|
|
14
13
|
class FakeDecryptionExchangeDataManager {
|
|
15
|
-
constructor(
|
|
16
|
-
this.expectedEntityType = expectedEntityType;
|
|
17
|
-
this.expectedSecretForeignKeys = expectedSecretForeignKeys;
|
|
14
|
+
constructor(cryptoPrimitives) {
|
|
18
15
|
this.cryptoPrimitives = cryptoPrimitives;
|
|
19
16
|
this.dataByHash = {};
|
|
20
17
|
this.dataById = {};
|
|
@@ -25,10 +22,8 @@ class FakeDecryptionExchangeDataManager {
|
|
|
25
22
|
getAccessControlKeysValue(entityType) {
|
|
26
23
|
throw new Error('This method is not supported by fake exchange data manager and should not be used.');
|
|
27
24
|
}
|
|
28
|
-
getCachedDecryptionDataKeyByAccessControlHash(hashes
|
|
25
|
+
getCachedDecryptionDataKeyByAccessControlHash(hashes) {
|
|
29
26
|
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
-
(0, chai_1.expect)(entityType).to.equal(this.expectedEntityType);
|
|
31
|
-
(0, chai_1.expect)(entitySecretForeignKeys).to.equal(this.expectedSecretForeignKeys);
|
|
32
27
|
const res = {};
|
|
33
28
|
for (const hash of hashes) {
|
|
34
29
|
const retrieved = this.dataByHash[hash];
|
|
@@ -38,26 +33,21 @@ class FakeDecryptionExchangeDataManager {
|
|
|
38
33
|
return res;
|
|
39
34
|
});
|
|
40
35
|
}
|
|
41
|
-
|
|
36
|
+
getDecryptionDataKeyByIds(ids, retrieveIfNotCached) {
|
|
42
37
|
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
-
|
|
44
|
-
(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
38
|
+
const res = {};
|
|
39
|
+
for (const id of ids) {
|
|
40
|
+
const retrieved = this.dataById[id];
|
|
41
|
+
if (retrieved) {
|
|
42
|
+
if (retrieveIfNotCached || !retrieved.fakeNonCached) {
|
|
43
|
+
res[id] = retrieved;
|
|
44
|
+
}
|
|
49
45
|
}
|
|
50
|
-
else
|
|
51
|
-
return undefined;
|
|
52
|
-
}
|
|
53
|
-
else if (!retrieveIfNotCached) {
|
|
54
|
-
return undefined;
|
|
55
46
|
}
|
|
56
|
-
|
|
57
|
-
throw new Error('Exchange data does not exist.');
|
|
47
|
+
return res;
|
|
58
48
|
});
|
|
59
49
|
}
|
|
60
|
-
getOrCreateEncryptionDataTo(delegateId
|
|
50
|
+
getOrCreateEncryptionDataTo(delegateId) {
|
|
61
51
|
throw new Error('This method should not be used with this fake exchange data manager: only retrieval decryption data is supported');
|
|
62
52
|
}
|
|
63
53
|
cacheFakeData(exchangeData, keyAndHashesFromSecret, fakeNonCached) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FakeExchangeDataManager.js","sourceRoot":"","sources":["../../../test/utils/FakeExchangeDataManager.ts"],"names":[],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"FakeExchangeDataManager.js","sourceRoot":"","sources":["../../../test/utils/FakeExchangeDataManager.ts"],"names":[],"mappings":";;;;;;;;;;;;AAOA,MAAa,iCAAiC;IAC5C,YAA6B,gBAAkC;QAAlC,qBAAgB,GAAhB,gBAAgB,CAAkB;QAE9C,eAAU,GAA4G,EAAE,CAAA;QACxH,aAAQ,GAErB,EAAE,CAAA;IAL4D,CAAC;IAOnE,sBAAsB;QACpB,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAA;IACvG,CAAC;IAED,yBAAyB,CAAC,UAAwC;QAChE,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAA;IACvG,CAAC;IAEK,6CAA6C,CACjD,MAAgB;;YAEhB,MAAM,GAAG,GAAyG,EAAE,CAAA;YACpH,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;gBACzB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;gBACvC,IAAI,SAAS;oBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAA;aACrC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;KAAA;IAEK,yBAAyB,CAC7B,GAAa,EACb,mBAA4B;;YAE5B,MAAM,GAAG,GAAkI,EAAE,CAAA;YAC7I,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;gBACpB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;gBACnC,IAAI,SAAS,EAAE;oBACb,IAAI,mBAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE;wBACnD,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAA;qBACpB;iBACF;aACF;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;KAAA;IAED,2BAA2B,CAAC,UAAkB;QAC5C,MAAM,IAAI,KAAK,CAAC,kHAAkH,CAAC,CAAA;IACrI,CAAC;IAED,aAAa,CACX,YAA0B,EAC1B,sBAMa,EACb,aAAuB;;QAEvB,MAAM,QAAQ,GAAG,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,MAAA,sBAAsB,CAAC,mBAAmB,mCAAI,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QACxI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,GAAG;YAChC,YAAY;YACZ,WAAW,EAAE,sBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,WAAW;YAChD,aAAa,EAAE,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,KAAK;YACrC,mBAAmB,EAAE,QAAQ;SAC9B,CAAA;QACD,IAAI,sBAAsB,EAAE;YAC1B,KAAK,MAAM,IAAI,IAAI,sBAAsB,CAAC,MAAM,EAAE;gBAChD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,sBAAsB,CAAC,WAAW,EAAE,mBAAmB,EAAE,QAAS,EAAE,CAAA;aAC1H;SACF;IACH,CAAC;IAED,gBAAgB,CAAC,cAAsB,EAAE,qBAA6B;QACpE,MAAM,IAAI,KAAK,CAAC,kHAAkH,CAAC,CAAA;IACrI,CAAC;IAED,oBAAoB,CAAC,UAAwC;QAC3D,MAAM,IAAI,KAAK,CAAC,kHAAkH,CAAC,CAAA;IACrI,CAAC;IAED,IAAI,IAAI;QACN,MAAM,IAAI,KAAK,CAAC,kHAAkH,CAAC,CAAA;IACrI,CAAC;CACF;AAnFD,8EAmFC","sourcesContent":["import { ExchangeDataManager } from '../../icc-x-api/crypto/ExchangeDataManager'\nimport { EntityWithDelegationTypeName } from '../../icc-x-api/utils/EntityWithDelegationTypeName'\nimport { ExchangeData } from '../../icc-api/model/internal/ExchangeData'\nimport { expect } from 'chai'\nimport { BaseExchangeDataManager } from '../../icc-x-api/crypto/BaseExchangeDataManager'\nimport { CryptoPrimitives } from '../../icc-x-api'\n\nexport class FakeDecryptionExchangeDataManager implements ExchangeDataManager {\n constructor(private readonly cryptoPrimitives: CryptoPrimitives) {}\n\n private readonly dataByHash: { [hash: string]: { exchangeData: ExchangeData; exchangeKey: CryptoKey; accessControlSecret: string } } = {}\n private readonly dataById: {\n [id: string]: { exchangeData: ExchangeData; exchangeKey: CryptoKey | undefined; accessControlSecret: string | undefined; fakeNonCached: boolean }\n } = {}\n\n clearOrRepopulateCache(): Promise<void> {\n throw new Error('This method is not supported by fake exchange data manager and should not be used.')\n }\n\n getAccessControlKeysValue(entityType: EntityWithDelegationTypeName): Promise<string | undefined> {\n throw new Error('This method is not supported by fake exchange data manager and should not be used.')\n }\n\n async getCachedDecryptionDataKeyByAccessControlHash(\n hashes: string[]\n ): Promise<{ [p: string]: { exchangeData: ExchangeData; exchangeKey: CryptoKey; accessControlSecret: string } }> {\n const res: { [p: string]: { exchangeData: ExchangeData; accessControlSecret: string; exchangeKey: CryptoKey } } = {}\n for (const hash of hashes) {\n const retrieved = this.dataByHash[hash]\n if (retrieved) res[hash] = retrieved\n }\n return res\n }\n\n async getDecryptionDataKeyByIds(\n ids: string[],\n retrieveIfNotCached: boolean\n ): Promise<{ [id: string]: { exchangeKey: CryptoKey | undefined; accessControlSecret: string | undefined; exchangeData: ExchangeData } }> {\n const res: { [id: string]: { exchangeKey: CryptoKey | undefined; accessControlSecret: string | undefined; exchangeData: ExchangeData } } = {}\n for (const id of ids) {\n const retrieved = this.dataById[id]\n if (retrieved) {\n if (retrieveIfNotCached || !retrieved.fakeNonCached) {\n res[id] = retrieved\n }\n }\n }\n return res\n }\n\n getOrCreateEncryptionDataTo(delegateId: string): Promise<{ exchangeData: ExchangeData; accessControlSecret: string; exchangeKey: CryptoKey }> {\n throw new Error('This method should not be used with this fake exchange data manager: only retrieval decryption data is supported')\n }\n\n cacheFakeData(\n exchangeData: ExchangeData,\n keyAndHashesFromSecret:\n | {\n exchangeKey: CryptoKey\n accessControlSecret?: string\n hashes: string[]\n }\n | undefined,\n fakeNonCached?: boolean\n ) {\n const acSecret = !!keyAndHashesFromSecret ? keyAndHashesFromSecret.accessControlSecret ?? this.cryptoPrimitives.randomUuid() : undefined\n this.dataById[exchangeData.id!] = {\n exchangeData,\n exchangeKey: keyAndHashesFromSecret?.exchangeKey,\n fakeNonCached: fakeNonCached ?? false,\n accessControlSecret: acSecret,\n }\n if (keyAndHashesFromSecret) {\n for (const hash of keyAndHashesFromSecret.hashes) {\n this.dataByHash[hash] = { exchangeData, exchangeKey: keyAndHashesFromSecret.exchangeKey, accessControlSecret: acSecret! }\n }\n }\n }\n\n giveAccessBackTo(otherDataOwner: string, newDataOwnerPublicKey: string): Promise<void> {\n throw new Error('This method should not be used with this fake exchange data manager: only retrieval decryption data is supported')\n }\n\n getAllDelegationKeys(entityType: EntityWithDelegationTypeName): Promise<string[] | undefined> {\n throw new Error('This method should not be used with this fake exchange data manager: only retrieval decryption data is supported')\n }\n\n get base(): BaseExchangeDataManager {\n throw new Error('This method should not be used with this fake exchange data manager: only retrieval decryption data is supported')\n }\n}\n"]}
|
package/test/utils/TestApi.js
CHANGED
|
@@ -23,6 +23,7 @@ const TestApi = function (host, username, password, crypto = typeof window !== '
|
|
|
23
23
|
}, new TestCryptoStrategies_1.TestCryptoStrategies(initialisedKeys), crypto, typeof window !== 'undefined' ? window.fetch : typeof self !== 'undefined' ? self.fetch : fetch, Object.assign({
|
|
24
24
|
storage: new TestStorage_1.TestStorage(),
|
|
25
25
|
keyStorage: new TestStorage_1.TestKeyStorage(),
|
|
26
|
+
useLiteCompatibilityMode: true
|
|
26
27
|
}, options));
|
|
27
28
|
});
|
|
28
29
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestApi.js","sourceRoot":"","sources":["../../../test/utils/TestApi.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+CAAwG;AACxG,+CAA2D;AAC3D,iEAA6D;AAC7D,4BAAyB;AAElB,MAAM,OAAO,GAAG,UACrB,IAAY,EACZ,QAAgB,EAChB,QAAgB,EAChB,SAAiB,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,EAAa,EAC3H,OAA4B,EAC5B,UAA2B,EAAE;;QAE7B,MAAM,eAAe,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,CAAC,MAAM,IAAI,wBAAY,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAC,CAAA;QACtG,OAAO,oBAAQ,CAAC,UAAU,CACxB,IAAI,EACJ;YACE,QAAQ;YACR,QAAQ;SACT,EACD,IAAI,2CAAoB,CAAC,eAAe,CAAC,EACzC,MAAM,EACN,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,gBAE1F;YACD,OAAO,EAAE,IAAI,yBAAW,EAAE;YAC1B,UAAU,EAAE,IAAI,4BAAc,EAAE;
|
|
1
|
+
{"version":3,"file":"TestApi.js","sourceRoot":"","sources":["../../../test/utils/TestApi.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+CAAwG;AACxG,+CAA2D;AAC3D,iEAA6D;AAC7D,4BAAyB;AAElB,MAAM,OAAO,GAAG,UACrB,IAAY,EACZ,QAAgB,EAChB,QAAgB,EAChB,SAAiB,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,EAAa,EAC3H,OAA4B,EAC5B,UAA2B,EAAE;;QAE7B,MAAM,eAAe,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,CAAC,MAAM,IAAI,wBAAY,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAC,CAAA;QACtG,OAAO,oBAAQ,CAAC,UAAU,CACxB,IAAI,EACJ;YACE,QAAQ;YACR,QAAQ;SACT,EACD,IAAI,2CAAoB,CAAC,eAAe,CAAC,EACzC,MAAM,EACN,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,gBAE1F;YACD,OAAO,EAAE,IAAI,yBAAW,EAAE;YAC1B,UAAU,EAAE,IAAI,4BAAc,EAAE;YAChC,wBAAwB,EAAE,IAAI;SAC/B,EACE,OAAO,EAEb,CAAA;IACH,CAAC;CAAA,CAAA;AA3BY,QAAA,OAAO,WA2BnB","sourcesContent":["import { IcureApi, IcureApiOptions, KeyPair, RSAUtils, RSAUtilsImpl, ShaVersion } from '../../icc-x-api'\nimport { TestKeyStorage, TestStorage } from './TestStorage'\nimport { TestCryptoStrategies } from './TestCryptoStrategies'\nimport 'isomorphic-fetch'\n\nexport const TestApi = async function (\n host: string,\n username: string,\n password: string,\n crypto: Crypto = typeof window !== 'undefined' ? window.crypto : typeof self !== 'undefined' ? self.crypto : ({} as Crypto),\n keyPair?: KeyPair<CryptoKey>,\n options: IcureApiOptions = {}\n): Promise<IcureApi> {\n const initialisedKeys = keyPair ?? (await new RSAUtilsImpl(crypto).generateKeyPair(ShaVersion.Sha256))\n return IcureApi.initialise(\n host,\n {\n username,\n password,\n },\n new TestCryptoStrategies(initialisedKeys),\n crypto,\n typeof window !== 'undefined' ? window.fetch : typeof self !== 'undefined' ? self.fetch : fetch,\n {\n ...{\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n useLiteCompatibilityMode: true\n },\n ...options,\n }\n )\n}\n"]}
|