@lifeready/core 0.6.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -0
- package/bundles/lifeready-core.umd.js +15939 -0
- package/bundles/lifeready-core.umd.js.map +1 -0
- package/bundles/lifeready-core.umd.min.js +2 -0
- package/bundles/lifeready-core.umd.min.js.map +1 -0
- package/esm2015/lib/_common/ast.js +40 -0
- package/esm2015/lib/_common/deferred-promise.js +24 -0
- package/esm2015/lib/_common/exceptions.js +157 -0
- package/esm2015/lib/_common/queries.gql.js +190 -0
- package/esm2015/lib/_common/run-outside-angular.js +79 -0
- package/esm2015/lib/_common/types.js +1 -0
- package/esm2015/lib/_common/utils.js +44 -0
- package/esm2015/lib/api/contact-card.gql.js +79 -0
- package/esm2015/lib/api/contact-card.service.js +154 -0
- package/esm2015/lib/api/contact-card2.gql.js +60 -0
- package/esm2015/lib/api/contact-card2.service.js +103 -0
- package/esm2015/lib/api/file.service.js +74 -0
- package/esm2015/lib/api/item2.gql.js +110 -0
- package/esm2015/lib/api/item2.service.js +311 -0
- package/esm2015/lib/api/key-exchange.gql.js +188 -0
- package/esm2015/lib/api/key-exchange.service.js +442 -0
- package/esm2015/lib/api/key-exchange.types.js +18 -0
- package/esm2015/lib/api/key-exchange2.gql.js +171 -0
- package/esm2015/lib/api/key-exchange2.service.js +479 -0
- package/esm2015/lib/api/lock.gql.js +40 -0
- package/esm2015/lib/api/lock.service.js +64 -0
- package/esm2015/lib/api/lr-apollo.service.js +46 -0
- package/esm2015/lib/api/lr-graphql/index.js +6 -0
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +155 -0
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +213 -0
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +51 -0
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +48 -0
- package/esm2015/lib/api/lr-graphql/lr.service.js +18 -0
- package/esm2015/lib/api/message.service.js +138 -0
- package/esm2015/lib/api/persist.service.js +181 -0
- package/esm2015/lib/api/query-processor/common-processors.service.js +93 -0
- package/esm2015/lib/api/query-processor/index.js +3 -0
- package/esm2015/lib/api/query-processor/query-processor.service.js +192 -0
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +109 -0
- package/esm2015/lib/api/shared-contact-card.service.js +119 -0
- package/esm2015/lib/api/shared-contact-card2.gql.js +41 -0
- package/esm2015/lib/api/shared-contact-card2.service.js +117 -0
- package/esm2015/lib/api/time.service.js +146 -0
- package/esm2015/lib/api/types/graphql.types.js +7 -0
- package/esm2015/lib/api/types/index.js +3 -0
- package/esm2015/lib/api/types/lr-graphql.types.js +71 -0
- package/esm2015/lib/auth/auth.config.js +57 -0
- package/esm2015/lib/auth/auth.gql.js +48 -0
- package/esm2015/lib/auth/auth.types.js +27 -0
- package/esm2015/lib/auth/idle.service.js +168 -0
- package/esm2015/lib/auth/idle.types.js +7 -0
- package/esm2015/lib/auth/lbop.service.js +355 -0
- package/esm2015/lib/auth/life-ready-auth.service.js +333 -0
- package/esm2015/lib/auth/password.service.js +320 -0
- package/esm2015/lib/auth/register.service.js +172 -0
- package/esm2015/lib/auth/two-factor.service.js +74 -0
- package/esm2015/lib/category/category-meta.service.js +99 -0
- package/esm2015/lib/category/category.gql.js +406 -0
- package/esm2015/lib/category/category.service.js +390 -0
- package/esm2015/lib/category/category.types.js +29 -0
- package/esm2015/lib/cryptography/cryptography.types.js +11 -0
- package/esm2015/lib/cryptography/encryption.service.js +189 -0
- package/esm2015/lib/cryptography/key-factory.service.js +237 -0
- package/esm2015/lib/cryptography/key-graph.service.js +280 -0
- package/esm2015/lib/cryptography/key-meta.service.js +200 -0
- package/esm2015/lib/cryptography/key.service.js +124 -0
- package/esm2015/lib/cryptography/slip39.service.js +169 -0
- package/esm2015/lib/cryptography/web-crypto.service.js +29 -0
- package/esm2015/lib/life-ready.config.js +84 -0
- package/esm2015/lib/life-ready.module.js +74 -0
- package/esm2015/lib/plan/plan.gql.js +123 -0
- package/esm2015/lib/plan/plan.service.js +149 -0
- package/esm2015/lib/plan/plan.types.js +11 -0
- package/esm2015/lib/record/record-attachment.service.js +101 -0
- package/esm2015/lib/record/record.gql.js +179 -0
- package/esm2015/lib/record/record.service.js +206 -0
- package/esm2015/lib/record/record.types.js +15 -0
- package/esm2015/lib/record-type/record-type.service.js +75 -0
- package/esm2015/lib/record-type/record-type.types.js +28 -0
- package/esm2015/lib/scenario/approvals/scenario-approval.gql.js +105 -0
- package/esm2015/lib/scenario/approvals/scenario-approval.types.js +1 -0
- package/esm2015/lib/scenario/approvals/scenario-approver.service.js +300 -0
- package/esm2015/lib/scenario/claimants/scenario-claimant.gql.js +52 -0
- package/esm2015/lib/scenario/claimants/scenario-claimant.service.js +97 -0
- package/esm2015/lib/scenario/claimants/scenario-claimant.types.js +1 -0
- package/esm2015/lib/scenario/receivers/scenario-receiver.gql.js +150 -0
- package/esm2015/lib/scenario/receivers/scenario-receiver.service.js +229 -0
- package/esm2015/lib/scenario/receivers/scenario-receiver.types.js +1 -0
- package/esm2015/lib/scenario/scenario-setup.service.js +269 -0
- package/esm2015/lib/scenario/scenario.gql.js +368 -0
- package/esm2015/lib/scenario/scenario.service.js +611 -0
- package/esm2015/lib/scenario/scenario.types.js +64 -0
- package/esm2015/lib/search/search.gql.js +62 -0
- package/esm2015/lib/search/search.service.js +156 -0
- package/esm2015/lib/search/search.types.js +6 -0
- package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +112 -0
- package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +266 -0
- package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +232 -0
- package/esm2015/lib/trusted-parties/tp-password-reset.service.js +300 -0
- package/esm2015/lib/trusted-parties/trusted-party.gql.js +148 -0
- package/esm2015/lib/trusted-parties/trusted-party.service.js +326 -0
- package/esm2015/lib/trusted-parties/trusted-party.types.js +41 -0
- package/esm2015/lib/trusted-parties/trusted-party2.gql.js +87 -0
- package/esm2015/lib/trusted-parties/trusted-party2.service.js +215 -0
- package/esm2015/lib/users/profile-details.service.js +214 -0
- package/esm2015/lib/users/profile.gql.js +97 -0
- package/esm2015/lib/users/profile.service.js +169 -0
- package/esm2015/lib/users/profile.types.js +34 -0
- package/esm2015/lib/users/user.gql.js +60 -0
- package/esm2015/lib/users/user.service.js +79 -0
- package/esm2015/lib/users/user.types.js +5 -0
- package/esm2015/lifeready-core.js +10 -0
- package/esm2015/public-api.js +81 -0
- package/fesm2015/lifeready-core.js +13290 -0
- package/fesm2015/lifeready-core.js.map +1 -0
- package/lib/_common/ast.d.ts +11 -0
- package/lib/_common/deferred-promise.d.ts +12 -0
- package/lib/_common/exceptions.d.ts +109 -0
- package/lib/_common/queries.gql.d.ts +10 -0
- package/lib/_common/run-outside-angular.d.ts +14 -0
- package/lib/_common/types.d.ts +10 -0
- package/lib/_common/utils.d.ts +3 -0
- package/lib/api/contact-card.gql.d.ts +7 -0
- package/lib/api/contact-card.service.d.ts +52 -0
- package/lib/api/contact-card2.gql.d.ts +34 -0
- package/lib/api/contact-card2.service.d.ts +49 -0
- package/lib/api/file.service.d.ts +18 -0
- package/lib/api/item2.gql.d.ts +96 -0
- package/lib/api/item2.service.d.ts +177 -0
- package/lib/api/key-exchange.gql.d.ts +9 -0
- package/lib/api/key-exchange.service.d.ts +39 -0
- package/lib/api/key-exchange.types.d.ts +196 -0
- package/lib/api/key-exchange2.gql.d.ts +125 -0
- package/lib/api/key-exchange2.service.d.ts +187 -0
- package/lib/api/lock.gql.d.ts +27 -0
- package/lib/api/lock.service.d.ts +25 -0
- package/lib/api/lr-apollo.service.d.ts +15 -0
- package/lib/api/lr-graphql/index.d.ts +5 -0
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +60 -0
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +27 -0
- package/lib/api/lr-graphql/lr-mutation-base.d.ts +28 -0
- package/lib/api/lr-graphql/lr-mutation.d.ts +8 -0
- package/lib/api/lr-graphql/lr.service.d.ts +9 -0
- package/lib/api/message.service.d.ts +58 -0
- package/lib/api/persist.service.d.ts +31 -0
- package/lib/api/query-processor/common-processors.service.d.ts +36 -0
- package/lib/api/query-processor/index.d.ts +2 -0
- package/lib/api/query-processor/query-processor.service.d.ts +18 -0
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +15 -0
- package/lib/api/shared-contact-card.service.d.ts +33 -0
- package/lib/api/shared-contact-card2.gql.d.ts +36 -0
- package/lib/api/shared-contact-card2.service.d.ts +45 -0
- package/lib/api/time.service.d.ts +16 -0
- package/lib/api/types/graphql.types.d.ts +29 -0
- package/lib/api/types/index.d.ts +2 -0
- package/lib/api/types/lr-graphql.types.d.ts +385 -0
- package/lib/auth/auth.config.d.ts +5 -0
- package/lib/auth/auth.gql.d.ts +15 -0
- package/lib/auth/auth.types.d.ts +66 -0
- package/lib/auth/idle.service.d.ts +40 -0
- package/lib/auth/idle.types.d.ts +10 -0
- package/lib/auth/lbop.service.d.ts +91 -0
- package/lib/auth/life-ready-auth.service.d.ts +46 -0
- package/lib/auth/password.service.d.ts +78 -0
- package/lib/auth/register.service.d.ts +25 -0
- package/lib/auth/two-factor.service.d.ts +15 -0
- package/lib/category/category-meta.service.d.ts +23 -0
- package/lib/category/category.gql.d.ts +45 -0
- package/lib/category/category.service.d.ts +67 -0
- package/lib/category/category.types.d.ts +79 -0
- package/lib/cryptography/cryptography.types.d.ts +83 -0
- package/lib/cryptography/encryption.service.d.ts +41 -0
- package/lib/cryptography/key-factory.service.d.ts +38 -0
- package/lib/cryptography/key-graph.service.d.ts +33 -0
- package/lib/cryptography/key-meta.service.d.ts +44 -0
- package/lib/cryptography/key.service.d.ts +36 -0
- package/lib/cryptography/slip39.service.d.ts +43 -0
- package/lib/cryptography/web-crypto.service.d.ts +5 -0
- package/lib/life-ready.config.d.ts +14 -0
- package/lib/life-ready.module.d.ts +5 -0
- package/lib/plan/plan.gql.d.ts +11 -0
- package/lib/plan/plan.service.d.ts +33 -0
- package/lib/plan/plan.types.d.ts +31 -0
- package/lib/record/record-attachment.service.d.ts +16 -0
- package/lib/record/record.gql.d.ts +14 -0
- package/lib/record/record.service.d.ts +25 -0
- package/lib/record/record.types.d.ts +57 -0
- package/lib/record-type/record-type.service.d.ts +11 -0
- package/lib/record-type/record-type.types.d.ts +50 -0
- package/lib/scenario/approvals/scenario-approval.gql.d.ts +7 -0
- package/lib/scenario/approvals/scenario-approval.types.d.ts +63 -0
- package/lib/scenario/approvals/scenario-approver.service.d.ts +32 -0
- package/lib/scenario/claimants/scenario-claimant.gql.d.ts +5 -0
- package/lib/scenario/claimants/scenario-claimant.service.d.ts +17 -0
- package/lib/scenario/claimants/scenario-claimant.types.d.ts +18 -0
- package/lib/scenario/receivers/scenario-receiver.gql.d.ts +8 -0
- package/lib/scenario/receivers/scenario-receiver.service.d.ts +30 -0
- package/lib/scenario/receivers/scenario-receiver.types.d.ts +54 -0
- package/lib/scenario/scenario-setup.service.d.ts +22 -0
- package/lib/scenario/scenario.gql.d.ts +34 -0
- package/lib/scenario/scenario.service.d.ts +58 -0
- package/lib/scenario/scenario.types.d.ts +217 -0
- package/lib/search/search.gql.d.ts +1 -0
- package/lib/search/search.service.d.ts +25 -0
- package/lib/search/search.types.d.ts +20 -0
- package/lib/trusted-parties/tp-password-reset-request.service.d.ts +20 -0
- package/lib/trusted-parties/tp-password-reset-user.service.d.ts +41 -0
- package/lib/trusted-parties/tp-password-reset.gql.d.ts +218 -0
- package/lib/trusted-parties/tp-password-reset.service.d.ts +131 -0
- package/lib/trusted-parties/trusted-party.gql.d.ts +9 -0
- package/lib/trusted-parties/trusted-party.service.d.ts +44 -0
- package/lib/trusted-parties/trusted-party.types.d.ts +102 -0
- package/lib/trusted-parties/trusted-party2.gql.d.ts +79 -0
- package/lib/trusted-parties/trusted-party2.service.d.ts +114 -0
- package/lib/users/profile-details.service.d.ts +21 -0
- package/lib/users/profile.gql.d.ts +11 -0
- package/lib/users/profile.service.d.ts +35 -0
- package/lib/users/profile.types.d.ts +96 -0
- package/lib/users/user.gql.d.ts +9 -0
- package/lib/users/user.service.d.ts +12 -0
- package/lib/users/user.types.d.ts +23 -0
- package/lifeready-core.d.ts +9 -0
- package/lifeready-core.metadata.json +1 -0
- package/package.json +29 -0
- package/public-api.d.ts +77 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import { ScenarioApproverService } from './approvals/scenario-approver.service';
|
|
4
|
+
import { ScenarioClaimantService } from './claimants/scenario-claimant.service';
|
|
5
|
+
import { ScenarioReceiverService } from './receivers/scenario-receiver.service';
|
|
6
|
+
import { ScenarioService } from './scenario.service';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "./scenario.service";
|
|
9
|
+
import * as i2 from "./claimants/scenario-claimant.service";
|
|
10
|
+
import * as i3 from "./approvals/scenario-approver.service";
|
|
11
|
+
import * as i4 from "./receivers/scenario-receiver.service";
|
|
12
|
+
export class ScenarioSetupService {
|
|
13
|
+
constructor(scenarioService, scenarioClaimantService, scenarioApproverService, scenarioReceiverService) {
|
|
14
|
+
this.scenarioService = scenarioService;
|
|
15
|
+
this.scenarioClaimantService = scenarioClaimantService;
|
|
16
|
+
this.scenarioApproverService = scenarioApproverService;
|
|
17
|
+
this.scenarioReceiverService = scenarioReceiverService;
|
|
18
|
+
}
|
|
19
|
+
setupScenario(newScenario) {
|
|
20
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
+
const scenarioId = yield this.scenarioService.createScenario({
|
|
22
|
+
plainSubjectCipherData: {
|
|
23
|
+
event: newScenario.event,
|
|
24
|
+
name: newScenario.name,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
try {
|
|
28
|
+
yield Promise.all(newScenario.claimants.map((x) => this.updateClaimant(scenarioId, newScenario.event, x)));
|
|
29
|
+
const scenario = yield this.scenarioService.getScenario(scenarioId);
|
|
30
|
+
if (newScenario.approvalGroups.length) {
|
|
31
|
+
const approvalGroups = {
|
|
32
|
+
scenarioId,
|
|
33
|
+
keyId: scenario.keyId,
|
|
34
|
+
event: scenario.event,
|
|
35
|
+
singleReject: false,
|
|
36
|
+
quorum: 1,
|
|
37
|
+
plainAssemblyCipherData: null,
|
|
38
|
+
approvalGroups: newScenario.approvalGroups.map((x) => ({
|
|
39
|
+
quorum: x.quorum,
|
|
40
|
+
singleReject: x.singleReject,
|
|
41
|
+
plainSubAssemblyCipherData: { name: x.name },
|
|
42
|
+
approvers: x.approvers.map((y) => ({
|
|
43
|
+
trustedPartyId: y.trustedPartyId,
|
|
44
|
+
trustedPartySharedKeyId: y.trustedPartySharedKeyId,
|
|
45
|
+
plainSharedCipherData: {
|
|
46
|
+
message: y.message,
|
|
47
|
+
event: newScenario.event,
|
|
48
|
+
},
|
|
49
|
+
})),
|
|
50
|
+
})),
|
|
51
|
+
};
|
|
52
|
+
scenario.assemblyKeyId = yield this.scenarioApproverService.createScenarioApproverAssembly(approvalGroups);
|
|
53
|
+
}
|
|
54
|
+
yield Promise.all(newScenario.receivers.map((x) => this.updateReceiver(scenarioId, scenario.assemblyKeyId, newScenario.event, x)));
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
return { scenarioId, error: e };
|
|
58
|
+
}
|
|
59
|
+
return { scenarioId };
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
updateScenario(updateScenario) {
|
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
const params = {
|
|
65
|
+
scenarioId: updateScenario.scenarioId,
|
|
66
|
+
keyId: updateScenario.keyId,
|
|
67
|
+
plainSubjectCipherData: {
|
|
68
|
+
event: updateScenario.event,
|
|
69
|
+
name: updateScenario.name,
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
yield this.scenarioService.updateScenario(params);
|
|
73
|
+
yield Promise.all(updateScenario.claimants.map((x) => this.updateClaimant(updateScenario.scenarioId, updateScenario.event, x)));
|
|
74
|
+
yield Promise.all(updateScenario.deletedClaimantIds.map((x) => this.scenarioClaimantService.deleteClaimant(x)));
|
|
75
|
+
const assemblyKeyId = yield this.updateApprovalGroups(updateScenario);
|
|
76
|
+
yield Promise.all(updateScenario.receivers.map((x) => this.updateReceiver(updateScenario.scenarioId, assemblyKeyId, updateScenario.event, x)));
|
|
77
|
+
yield Promise.all(updateScenario.deletedReceiverIds.map((x) => this.scenarioReceiverService.deleteReceiver(x)));
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
updateClaimant(scenarioId, event, claimant) {
|
|
81
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
82
|
+
if (claimant.claimantId) {
|
|
83
|
+
yield this.scenarioClaimantService.updateClaimant({
|
|
84
|
+
id: claimant.claimantId,
|
|
85
|
+
keyId: claimant.keyId,
|
|
86
|
+
plainSharedCipherData: { message: claimant.message, event },
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
yield this.scenarioClaimantService.addClaimant({
|
|
91
|
+
scenarioId,
|
|
92
|
+
trustedPartyId: claimant.trustedPartyId,
|
|
93
|
+
trustedPartySharedKeyId: claimant.trustedPartySharedKeyId,
|
|
94
|
+
plainSharedCipherData: { message: claimant.message, event },
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
updateApprovalGroups(updateScenario) {
|
|
100
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
101
|
+
if (updateScenario.assemblyKeyId) {
|
|
102
|
+
if (updateScenario.approvalGroups.length) {
|
|
103
|
+
const approvalGroups = {
|
|
104
|
+
scenarioId: updateScenario.scenarioId,
|
|
105
|
+
assemblyKeyId: updateScenario.assemblyKeyId,
|
|
106
|
+
singleReject: false,
|
|
107
|
+
quorum: 1,
|
|
108
|
+
approvalGroups: updateScenario.approvalGroups.map((x) => ({
|
|
109
|
+
subAssemblyId: x.subAssemblyId,
|
|
110
|
+
quorum: x.quorum,
|
|
111
|
+
singleReject: x.singleReject,
|
|
112
|
+
plainSubAssemblyCipherData: { name: x.name },
|
|
113
|
+
approvers: x.approvers.map((y) => ({
|
|
114
|
+
approverId: y.approverId,
|
|
115
|
+
keyId: y.keyId,
|
|
116
|
+
trustedPartyId: y.trustedPartyId,
|
|
117
|
+
trustedPartySharedKeyId: y.trustedPartySharedKeyId,
|
|
118
|
+
plainSharedCipherData: {
|
|
119
|
+
message: y.message,
|
|
120
|
+
event: updateScenario.event,
|
|
121
|
+
},
|
|
122
|
+
})),
|
|
123
|
+
deletedApproverIds: x.deletedApproverIds,
|
|
124
|
+
})),
|
|
125
|
+
deletedGroupIds: updateScenario.deletedGroupIds,
|
|
126
|
+
};
|
|
127
|
+
yield this.scenarioApproverService.updateScenarioApproverAssembly(approvalGroups);
|
|
128
|
+
return updateScenario.assemblyKeyId;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
const { receivers } = yield this.scenarioService.getScenario(updateScenario.scenarioId);
|
|
132
|
+
yield this.scenarioApproverService.deleteScenarioApproverAssembly(updateScenario.scenarioId, updateScenario.event, receivers);
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
// update or delete
|
|
136
|
+
}
|
|
137
|
+
else if (updateScenario.approvalGroups.length) {
|
|
138
|
+
const { receivers } = yield this.scenarioService.getScenario(updateScenario.scenarioId);
|
|
139
|
+
const approvalGroups = {
|
|
140
|
+
scenarioId: updateScenario.scenarioId,
|
|
141
|
+
keyId: updateScenario.keyId,
|
|
142
|
+
event: updateScenario.event,
|
|
143
|
+
singleReject: false,
|
|
144
|
+
quorum: 1,
|
|
145
|
+
approvalGroups: updateScenario.approvalGroups.map((x) => ({
|
|
146
|
+
quorum: x.quorum,
|
|
147
|
+
singleReject: x.singleReject,
|
|
148
|
+
plainSubAssemblyCipherData: { name: x.name },
|
|
149
|
+
approvers: x.approvers.map((y) => ({
|
|
150
|
+
trustedPartyId: y.trustedPartyId,
|
|
151
|
+
trustedPartySharedKeyId: y.trustedPartySharedKeyId,
|
|
152
|
+
plainSharedCipherData: {
|
|
153
|
+
message: y.message,
|
|
154
|
+
event: updateScenario.event,
|
|
155
|
+
},
|
|
156
|
+
})),
|
|
157
|
+
})),
|
|
158
|
+
receivers,
|
|
159
|
+
};
|
|
160
|
+
return yield this.scenarioApproverService.createScenarioApproverAssembly(approvalGroups);
|
|
161
|
+
}
|
|
162
|
+
return null;
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
updateReceiver(scenarioId, assemblyKeyId, event, receiver) {
|
|
166
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
167
|
+
let receiverId = receiver.receiverId;
|
|
168
|
+
// Currently deleting all receivers below assembly logic.
|
|
169
|
+
if (receiverId) {
|
|
170
|
+
yield this.scenarioReceiverService.updateReceiver({
|
|
171
|
+
id: receiver.receiverId,
|
|
172
|
+
keyId: receiver.keyId,
|
|
173
|
+
plainSharedCipherData: { message: receiver.message, event },
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
const newReceiver = {
|
|
178
|
+
scenarioId,
|
|
179
|
+
trustedPartyId: receiver.trustedPartyId,
|
|
180
|
+
trustedPartySharedKeyId: receiver.trustedPartySharedKeyId,
|
|
181
|
+
plainSharedCipherData: { message: receiver.message, event },
|
|
182
|
+
};
|
|
183
|
+
receiverId = yield this.scenarioReceiverService.addReceiver(newReceiver);
|
|
184
|
+
}
|
|
185
|
+
const loadedReceiver = yield this.scenarioReceiverService.getReceiver(receiverId);
|
|
186
|
+
yield this.updateReceiverItems(scenarioId, assemblyKeyId, loadedReceiver, receiver.permissions);
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
updateReceiverItems(scenarioId, assemblyKeyId, receiver, permissions) {
|
|
190
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
191
|
+
permissions = permissions || {};
|
|
192
|
+
permissions.categories = permissions.categories || [];
|
|
193
|
+
permissions.records = permissions.records || [];
|
|
194
|
+
yield Promise.all(permissions.categories
|
|
195
|
+
.filter((x) => !receiver.categories.some((y) => y.category.id === x.categoryId))
|
|
196
|
+
.map((x) => __awaiter(this, void 0, void 0, function* () {
|
|
197
|
+
const params = {
|
|
198
|
+
scenarioId,
|
|
199
|
+
assemblyKeyId,
|
|
200
|
+
receiverId: receiver.id,
|
|
201
|
+
receiverKeyId: receiver.keyId,
|
|
202
|
+
accessRole: x.accessLevel,
|
|
203
|
+
categoryId: x.categoryId,
|
|
204
|
+
};
|
|
205
|
+
yield this.scenarioReceiverService.addReceiverCategory(params);
|
|
206
|
+
})));
|
|
207
|
+
yield Promise.all(permissions.records
|
|
208
|
+
.filter((x) => !receiver.records.some((y) => y.record.id === x.recordId))
|
|
209
|
+
.map((x) => __awaiter(this, void 0, void 0, function* () {
|
|
210
|
+
const params = {
|
|
211
|
+
scenarioId,
|
|
212
|
+
assemblyKeyId,
|
|
213
|
+
receiverId: receiver.id,
|
|
214
|
+
receiverKeyId: receiver.keyId,
|
|
215
|
+
accessRole: x.accessLevel,
|
|
216
|
+
recordId: x.recordId,
|
|
217
|
+
};
|
|
218
|
+
yield this.scenarioReceiverService.addReceiverRecord(params);
|
|
219
|
+
})));
|
|
220
|
+
yield Promise.all(permissions.categories
|
|
221
|
+
.map((x) => ({
|
|
222
|
+
accessLevel: x.accessLevel,
|
|
223
|
+
category: receiver.categories.find((y) => y.category.id === x.categoryId),
|
|
224
|
+
}))
|
|
225
|
+
.filter((x) => x.category)
|
|
226
|
+
.map((x) => __awaiter(this, void 0, void 0, function* () {
|
|
227
|
+
const params = {
|
|
228
|
+
id: x.category.id,
|
|
229
|
+
keyId: x.category.keyId,
|
|
230
|
+
accessRole: x.accessLevel,
|
|
231
|
+
};
|
|
232
|
+
yield this.scenarioReceiverService.updateReceiverItem(params);
|
|
233
|
+
})));
|
|
234
|
+
yield Promise.all(permissions.records
|
|
235
|
+
.map((x) => ({
|
|
236
|
+
accessLevel: x.accessLevel,
|
|
237
|
+
record: receiver.records.find((y) => y.record.id === x.recordId),
|
|
238
|
+
}))
|
|
239
|
+
.filter((x) => x.record)
|
|
240
|
+
.map((x) => __awaiter(this, void 0, void 0, function* () {
|
|
241
|
+
const params = {
|
|
242
|
+
id: x.record.id,
|
|
243
|
+
keyId: x.record.keyId,
|
|
244
|
+
accessRole: x.accessLevel,
|
|
245
|
+
};
|
|
246
|
+
yield this.scenarioReceiverService.updateReceiverItem(params);
|
|
247
|
+
})));
|
|
248
|
+
yield Promise.all(receiver.categories
|
|
249
|
+
.filter((x) => !permissions.categories.some((y) => y.categoryId === x.category.id))
|
|
250
|
+
.map((x) => this.scenarioReceiverService.deleteReceiverItem(x.id)));
|
|
251
|
+
yield Promise.all(receiver.records
|
|
252
|
+
.filter((x) => !permissions.records.some((y) => y.recordId === x.record.id))
|
|
253
|
+
.map((x) => this.scenarioReceiverService.deleteReceiverItem(x.id)));
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
ScenarioSetupService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ScenarioSetupService_Factory() { return new ScenarioSetupService(i0.ɵɵinject(i1.ScenarioService), i0.ɵɵinject(i2.ScenarioClaimantService), i0.ɵɵinject(i3.ScenarioApproverService), i0.ɵɵinject(i4.ScenarioReceiverService)); }, token: ScenarioSetupService, providedIn: "root" });
|
|
258
|
+
ScenarioSetupService.decorators = [
|
|
259
|
+
{ type: Injectable, args: [{
|
|
260
|
+
providedIn: 'root',
|
|
261
|
+
},] }
|
|
262
|
+
];
|
|
263
|
+
ScenarioSetupService.ctorParameters = () => [
|
|
264
|
+
{ type: ScenarioService },
|
|
265
|
+
{ type: ScenarioClaimantService },
|
|
266
|
+
{ type: ScenarioApproverService },
|
|
267
|
+
{ type: ScenarioReceiverService }
|
|
268
|
+
];
|
|
269
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmFyaW8tc2V0dXAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJDOi9Qcm9qZWN0cy90ZXN0L3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL3NjZW5hcmlvL3NjZW5hcmlvLXNldHVwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFNM0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFLaEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7QUFXckQsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQixZQUNVLGVBQWdDLEVBQ2hDLHVCQUFnRCxFQUNoRCx1QkFBZ0QsRUFDaEQsdUJBQWdEO1FBSGhELG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXlCO1FBQ2hELDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBeUI7UUFDaEQsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtJQUN2RCxDQUFDO0lBRVMsYUFBYSxDQUN4QixXQUF3Qjs7WUFFeEIsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQztnQkFDM0Qsc0JBQXNCLEVBQUU7b0JBQ3RCLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSztvQkFDeEIsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJO2lCQUN2QjthQUNGLENBQUMsQ0FBQztZQUVILElBQUk7Z0JBQ0YsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLFdBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDOUIsSUFBSSxD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QUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQ3RFO2lCQUNBLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUNyRSxDQUFDO1lBQ0YsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLFFBQVEsQ0FBQyxPQUFPO2lCQUNiLE1BQU0sQ0FDTCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUNwRTtpQkFDQSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDckUsQ0FBQztRQUNKLENBQUM7S0FBQTs7OztZQXpWRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQVZRLGVBQWU7WUFOZix1QkFBdUI7WUFEdkIsdUJBQXVCO1lBRXZCLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExyRXhjZXB0aW9uIH0gZnJvbSAnLi8uLi9fY29tbW9uL2V4Y2VwdGlvbnMnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFByZXBhcmVkUGVybWlzc2lvbnMgfSBmcm9tICcuLy4uL2FwaS9rZXktZXhjaGFuZ2UudHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIENyZWF0ZVNjZW5hcmlvQXBwcm92YWxHcm91cHMsXHJcbiAgVXBkYXRlU2NlbmFyaW9BcHByb3ZhbEdyb3VwcyxcclxufSBmcm9tICcuL2FwcHJvdmFscy9zY2VuYXJpby1hcHByb3ZhbC50eXBlcyc7XHJcbmltcG9ydCB7IFNjZW5hcmlvQXBwcm92ZXJTZXJ2aWNlIH0gZnJvbSAnLi9hcHByb3ZhbHMvc2NlbmFyaW8tYXBwcm92ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFNjZW5hcmlvQ2xhaW1hbnRTZXJ2aWNlIH0gZnJvbSAnLi9jbGFpbWFudHMvc2NlbmFyaW8tY2xhaW1hbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFNjZW5hcmlvUmVjZWl2ZXJTZXJ2aWNlIH0gZnJvbSAnLi9yZWNlaXZlcnMvc2NlbmFyaW8tcmVjZWl2ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgUmVjZWl2ZXIsXHJcbiAgVXBkYXRlU2NlbmFyaW9SZWNlaXZlckl0ZW1JbnB1dCxcclxufSBmcm9tICcuL3JlY2VpdmVycy9zY2VuYXJpby1yZWNlaXZlci50eXBlcyc7XHJcbmltcG9ydCB7IFNjZW5hcmlvU2VydmljZSB9IGZyb20gJy4vc2NlbmFyaW8uc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgTmV3U2NlbmFyaW8sXHJcbiAgVXBkYXRlZFNjZW5hcmlvQ2xhaW1hbnQsXHJcbiAgVXBkYXRlZFNjZW5hcmlvUmVjZWl2ZXIsXHJcbiAgVXBkYXRlU2NlbmFyaW8sXHJcbn0gZnJvbSAnLi9zY2VuYXJpby50eXBlcyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2NlbmFyaW9TZXR1cFNlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzY2VuYXJpb1NlcnZpY2U6IFNjZW5hcmlvU2VydmljZSxcclxuICAgIHByaXZhdGUgc2NlbmFyaW9DbGFpbWFudFNlcnZpY2U6IFNjZW5hcmlvQ2xhaW1hbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzY2VuYXJpb0FwcHJvdmVyU2VydmljZTogU2NlbmFyaW9BcHByb3ZlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNjZW5hcmlvUmVjZWl2ZXJTZXJ2aWNlOiBTY2VuYXJpb1JlY2VpdmVyU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgcHVibGljIGFzeW5jIHNldHVwU2NlbmFyaW8oXHJcbiAgICBuZXdTY2VuYXJpbzogTmV3U2NlbmFyaW9cclxuICApOiBQcm9taXNlPHsgc2NlbmFyaW9JZDogc3RyaW5nOyBlcnJvcj86IExyRXhjZXB0aW9uIH0+IHtcclxuICAgIGNvbnN0IHNjZW5hcmlvSWQgPSBhd2FpdCB0aGlzLnNjZW5hcmlvU2VydmljZS5jcmVhdGVTY2VuYXJpbyh7XHJcbiAgICAgIHBsYWluU3ViamVjdENpcGhlckRhdGE6IHtcclxuICAgICAgICBldmVudDogbmV3U2NlbmFyaW8uZXZlbnQsXHJcbiAgICAgICAgbmFtZTogbmV3U2NlbmFyaW8ubmFtZSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgIG5ld1NjZW5hcmlvLmNsYWltYW50cy5tYXAoKHgpID0+XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNsYWltYW50KHNjZW5hcmlvSWQsIG5ld1NjZW5hcmlvLmV2ZW50LCB4KVxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IHNjZW5hcmlvID0gYXdhaXQgdGhpcy5zY2VuYXJpb1NlcnZpY2UuZ2V0U2NlbmFyaW8oc2NlbmFyaW9JZCk7XHJcbiAgICAgIGlmIChuZXdTY2VuYXJpby5hcHByb3ZhbEdyb3Vwcy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBhcHByb3ZhbEdyb3VwczogQ3JlYXRlU2NlbmFyaW9BcHByb3ZhbEdyb3VwcyA9IHtcclxuICAgICAgICAgIHNjZW5hcmlvSWQsXHJcbiAgICAgICAgICBrZXlJZDogc2NlbmFyaW8ua2V5SWQsXHJcbiAgICAgICAgICBldmVudDogc2NlbmFyaW8uZXZlbnQsXHJcbiAgICAgICAgICBzaW5nbGVSZWplY3Q6IGZhbHNlLFxyXG4gICAgICAgICAgcXVvcnVtOiAxLFxyXG4gICAgICAgICAgcGxhaW5Bc3NlbWJseUNpcGhlckRhdGE6IG51bGwsXHJcblxyXG4gICAgICAgICAgYXBwcm92YWxHcm91cHM6IG5ld1NjZW5hcmlvLmFwcHJvdmFsR3JvdXBzLm1hcCgoeCkgPT4gKHtcclxuICAgICAgICAgICAgcXVvcnVtOiB4LnF1b3J1bSxcclxuICAgICAgICAgICAgc2luZ2xlUmVqZWN0OiB4LnNpbmdsZVJlamVjdCxcclxuICAgICAgICAgICAgcGxhaW5TdWJBc3NlbWJseUNpcGhlckRhdGE6IHsgbmFtZTogeC5uYW1lIH0sXHJcbiAgICAgICAgICAgIGFwcHJvdmVyczogeC5hcHByb3ZlcnMubWFwKCh5KSA9PiAoe1xyXG4gICAgICAgICAgICAgIHRydXN0ZWRQYXJ0eUlkOiB5LnRydXN0ZWRQYXJ0eUlkLFxyXG4gICAgICAgICAgICAgIHRydXN0ZWRQYXJ0eVNoYXJlZEtleUlkOiB5LnRydXN0ZWRQYXJ0eVNoYXJlZEtleUlkLFxyXG4gICAgICAgICAgICAgIHBsYWluU2hhcmVkQ2lwaGVyRGF0YToge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogeS5tZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgZXZlbnQ6IG5ld1NjZW5hcmlvLmV2ZW50LFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pKSxcclxuICAgICAgICAgIH0pKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHNjZW5hcmlvLmFzc2VtYmx5S2V5SWQgPSBhd2FpdCB0aGlzLnNjZW5hcmlvQXBwcm92ZXJTZXJ2aWNlLmNyZWF0ZVNjZW5hcmlvQXBwcm92ZXJBc3NlbWJseShcclxuICAgICAgICAgIGFwcHJvdmFsR3JvdXBzXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICBuZXdTY2VuYXJpby5yZWNlaXZlcnMubWFwKCh4KSA9PlxyXG4gICAgICAgICAgdGhpcy51cGRhdGVSZWNlaXZlcihcclxuICAgICAgICAgICAgc2NlbmFyaW9JZCxcclxuICAgICAgICAgICAgc2NlbmFyaW8uYXNzZW1ibHlLZXlJZCxcclxuICAgICAgICAgICAgbmV3U2NlbmFyaW8uZXZlbnQsXHJcbiAgICAgICAgICAgIHhcclxuICAgICAgICAgIClcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHJldHVybiB7IHNjZW5hcmlvSWQsIGVycm9yOiBlIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBzY2VuYXJpb0lkIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdXBkYXRlU2NlbmFyaW8odXBkYXRlU2NlbmFyaW86IFVwZGF0ZVNjZW5hcmlvKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgIHNjZW5hcmlvSWQ6IHVwZGF0ZVNjZW5hcmlvLnNjZW5hcmlvSWQsXHJcbiAgICAgIGtleUlkOiB1cGRhdGVTY2VuYXJpby5rZXlJZCxcclxuICAgICAgcGxhaW5TdWJqZWN0Q2lwaGVyRGF0YToge1xyXG4gICAgICAgIGV2ZW50OiB1cGRhdGVTY2VuYXJpby5ldmVudCxcclxuICAgICAgICBuYW1lOiB1cGRhdGVTY2VuYXJpby5uYW1lLFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIGF3YWl0IHRoaXMuc2NlbmFyaW9TZXJ2aWNlLnVwZGF0ZVNjZW5hcmlvKHBhcmFtcyk7XHJcblxyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIHVwZGF0ZVNjZW5hcmlvLmNsYWltYW50cy5tYXAoKHgpID0+XHJcbiAgICAgICAgdGhpcy51cGRhdGVDbGFpbWFudCh1cGRhdGVTY2VuYXJpby5zY2VuYXJpb0lkLCB1cGRhdGVTY2VuYXJpby5ldmVudCwgeClcclxuICAgICAgKVxyXG4gICAgKTtcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICB1cGRhdGVTY2VuYXJpby5kZWxldGVkQ2xhaW1hbnRJZHMubWFwKCh4KSA9PlxyXG4gICAgICAgIHRoaXMuc2NlbmFyaW9DbGFpbWFudFNlcnZpY2UuZGVsZXRlQ2xhaW1hbnQoeClcclxuICAgICAgKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBhc3NlbWJseUtleUlkID0gYXdhaXQgdGhpcy51cGRhdGVBcHByb3ZhbEdyb3Vwcyh1cGRhdGVTY2VuYXJpbyk7XHJcblxyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIHVwZGF0ZVNjZW5hcmlvLnJlY2VpdmVycy5tYXAoKHgpID0+XHJcbiAgICAgICAgdGhpcy51cGRhdGVSZWNlaXZlcihcclxuICAgICAgICAgIHVwZGF0ZVNjZW5hcmlvLnNjZW5hcmlvSWQsXHJcbiAgICAgICAgICBhc3NlbWJseUtleUlkLFxyXG4gICAgICAgICAgdXBkYXRlU2NlbmFyaW8uZXZlbnQsXHJcbiAgICAgICAgICB4XHJcbiAgICAgICAgKVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIHVwZGF0ZVNjZW5hcmlvLmRlbGV0ZWRSZWNlaXZlcklkcy5tYXAoKHgpID0+XHJcbiAgICAgICAgdGhpcy5zY2VuYXJpb1JlY2VpdmVyU2VydmljZS5kZWxldGVSZWNlaXZlcih4KVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVDbGFpbWFudChcclxuICAgIHNjZW5hcmlvSWQ6IHN0cmluZyxcclxuICAgIGV2ZW50OiBzdHJpbmcsXHJcbiAgICBjbGFpbWFudDogVXBkYXRlZFNjZW5hcmlvQ2xhaW1hbnRcclxuICApIHtcclxuICAgIGlmIChjbGFpbWFudC5jbGFpbWFudElkKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2NlbmFyaW9DbGFpbWFudFNlcnZpY2UudXBkYXRlQ2xhaW1hbnQoe1xyXG4gICAgICAgIGlkOiBjbGFpbWFudC5jbGFpbWFudElkLFxyXG4gICAgICAgIGtleUlkOiBjbGFpbWFudC5rZXlJZCxcclxuICAgICAgICBwbGFpblNoYXJlZENpcGhlckRhdGE6IHsgbWVzc2FnZTogY2xhaW1hbnQubWVzc2FnZSwgZXZlbnQgfSxcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhd2FpdCB0aGlzLnNjZW5hcmlvQ2xhaW1hbnRTZXJ2aWNlLmFkZENsYWltYW50KHtcclxuICAgICAgICBzY2VuYXJpb0lkLFxyXG4gICAgICAgIHRydXN0ZWRQYXJ0eUlkOiBjbGFpbWFudC50cnVzdGVkUGFydHlJZCxcclxuICAgICAgICB0cnVzdGVkUGFydHlTaGFyZWRLZXlJZDogY2xhaW1hbnQudHJ1c3RlZFBhcnR5U2hhcmVkS2V5SWQsXHJcbiAgICAgICAgcGxhaW5TaGFyZWRDaXBoZXJEYXRhOiB7IG1lc3NhZ2U6IGNsYWltYW50Lm1lc3NhZ2UsIGV2ZW50IH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVBcHByb3ZhbEdyb3VwcyhcclxuICAgIHVwZGF0ZVNjZW5hcmlvOiBVcGRhdGVTY2VuYXJpb1xyXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBpZiAodXBkYXRlU2NlbmFyaW8uYXNzZW1ibHlLZXlJZCkge1xyXG4gICAgICBpZiAodXBkYXRlU2NlbmFyaW8uYXBwcm92YWxHcm91cHMubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgYXBwcm92YWxHcm91cHM6IFVwZGF0ZVNjZW5hcmlvQXBwcm92YWxHcm91cHMgPSB7XHJcbiAgICAgICAgICBzY2VuYXJpb0lkOiB1cGRhdGVTY2VuYXJpby5zY2VuYXJpb0lkLFxyXG4gICAgICAgICAgYXNzZW1ibHlLZXlJZDogdXBkYXRlU2NlbmFyaW8uYXNzZW1ibHlLZXlJZCxcclxuXHJcbiAgICAgICAgICBzaW5nbGVSZWplY3Q6IGZhbHNlLFxyXG4gICAgICAgICAgcXVvcnVtOiAxLFxyXG5cclxuICAgICAgICAgIGFwcHJvdmFsR3JvdXBzOiB1cGRhdGVTY2VuYXJpby5hcHByb3ZhbEdyb3Vwcy5tYXAoKHgpID0+ICh7XHJcbiAgICAgICAgICAgIHN1YkFzc2VtYmx5SWQ6IHguc3ViQXNzZW1ibHlJZCxcclxuICAgICAgICAgICAgcXVvcnVtOiB4LnF1b3J1bSxcclxuICAgICAgICAgICAgc2luZ2xlUmVqZWN0OiB4LnNpbmdsZVJlamVjdCxcclxuICAgICAgICAgICAgcGxhaW5TdWJBc3NlbWJseUNpcGhlckRhdGE6IHsgbmFtZTogeC5uYW1lIH0sXHJcbiAgICAgICAgICAgIGFwcHJvdmVyczogeC5hcHByb3ZlcnMubWFwKCh5KSA9PiAoe1xyXG4gICAgICAgICAgICAgIGFwcHJvdmVySWQ6IHkuYXBwcm92ZXJJZCxcclxuICAgICAgICAgICAgICBrZXlJZDogeS5rZXlJZCxcclxuICAgICAgICAgICAgICB0cnVzdGVkUGFydHlJZDogeS50cnVzdGVkUGFydHlJZCxcclxuICAgICAgICAgICAgICB0cnVzdGVkUGFydHlTaGFyZWRLZXlJZDogeS50cnVzdGVkUGFydHlTaGFyZWRLZXlJZCxcclxuICAgICAgICAgICAgICBwbGFpblNoYXJlZENpcGhlckRhdGE6IHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHkubWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIGV2ZW50OiB1cGRhdGVTY2VuYXJpby5ldmVudCxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgIGRlbGV0ZWRBcHByb3ZlcklkczogeC5kZWxldGVkQXBwcm92ZXJJZHMsXHJcbiAgICAgICAgICB9KSksXHJcbiAgICAgICAgICBkZWxldGVkR3JvdXBJZHM6IHVwZGF0ZVNjZW5hcmlvLmRlbGV0ZWRHcm91cElkcyxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2NlbmFyaW9BcHByb3ZlclNlcnZpY2UudXBkYXRlU2NlbmFyaW9BcHByb3ZlckFzc2VtYmx5KFxyXG4gICAgICAgICAgYXBwcm92YWxHcm91cHNcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybiB1cGRhdGVTY2VuYXJpby5hc3NlbWJseUtleUlkO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHsgcmVjZWl2ZXJzIH0gPSBhd2FpdCB0aGlzLnNjZW5hcmlvU2VydmljZS5nZXRTY2VuYXJpbyhcclxuICAgICAgICAgIHVwZGF0ZVNjZW5hcmlvLnNjZW5hcmlvSWRcclxuICAgICAgICApO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2NlbmFyaW9BcHByb3ZlclNlcnZpY2UuZGVsZXRlU2NlbmFyaW9BcHByb3ZlckFzc2VtYmx5KFxyXG4gICAgICAgICAgdXBkYXRlU2NlbmFyaW8uc2NlbmFyaW9JZCxcclxuICAgICAgICAgIHVwZGF0ZVNjZW5hcmlvLmV2ZW50LFxyXG4gICAgICAgICAgcmVjZWl2ZXJzXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICAvLyB1cGRhdGUgb3IgZGVsZXRlXHJcbiAgICB9IGVsc2UgaWYgKHVwZGF0ZVNjZW5hcmlvLmFwcHJvdmFsR3JvdXBzLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCB7IHJlY2VpdmVycyB9ID0gYXdhaXQgdGhpcy5zY2VuYXJpb1NlcnZpY2UuZ2V0U2NlbmFyaW8oXHJcbiAgICAgICAgdXBkYXRlU2NlbmFyaW8uc2NlbmFyaW9JZFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgYXBwcm92YWxHcm91cHM6IENyZWF0ZVNjZW5hcmlvQXBwcm92YWxHcm91cHMgPSB7XHJcbiAgICAgICAgc2NlbmFyaW9JZDogdXBkYXRlU2NlbmFyaW8uc2NlbmFyaW9JZCxcclxuICAgICAgICBrZXlJZDogdXBkYXRlU2NlbmFyaW8ua2V5SWQsXHJcbiAgICAgICAgZXZlbnQ6IHVwZGF0ZVNjZW5hcmlvLmV2ZW50LFxyXG4gICAgICAgIHNpbmdsZVJlamVjdDogZmFsc2UsXHJcbiAgICAgICAgcXVvcnVtOiAxLFxyXG4gICAgICAgIGFwcHJvdmFsR3JvdXBzOiB1cGRhdGVTY2VuYXJpby5hcHByb3ZhbEdyb3Vwcy5tYXAoKHgpID0+ICh7XHJcbiAgICAgICAgICBxdW9ydW06IHgucXVvcnVtLFxyXG4gICAgICAgICAgc2luZ2xlUmVqZWN0OiB4LnNpbmdsZVJlamVjdCxcclxuICAgICAgICAgIHBsYWluU3ViQXNzZW1ibHlDaXBoZXJEYXRhOiB7IG5hbWU6IHgubmFtZSB9LFxyXG4gICAgICAgICAgYXBwcm92ZXJzOiB4LmFwcHJvdmVycy5tYXAoKHkpID0+ICh7XHJcbiAgICAgICAgICAgIHRydXN0ZWRQYXJ0eUlkOiB5LnRydXN0ZWRQYXJ0eUlkLFxyXG4gICAgICAgICAgICB0cnVzdGVkUGFydHlTaGFyZWRLZXlJZDogeS50cnVzdGVkUGFydHlTaGFyZWRLZXlJZCxcclxuICAgICAgICAgICAgcGxhaW5TaGFyZWRDaXBoZXJEYXRhOiB7XHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogeS5tZXNzYWdlLFxyXG4gICAgICAgICAgICAgIGV2ZW50OiB1cGRhdGVTY2VuYXJpby5ldmVudCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0pKSxcclxuICAgICAgICB9KSksXHJcbiAgICAgICAgcmVjZWl2ZXJzLFxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zY2VuYXJpb0FwcHJvdmVyU2VydmljZS5jcmVhdGVTY2VuYXJpb0FwcHJvdmVyQXNzZW1ibHkoXHJcbiAgICAgICAgYXBwcm92YWxHcm91cHNcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVSZWNlaXZlcihcclxuICAgIHNjZW5hcmlvSWQ6IHN0cmluZyxcclxuICAgIGFzc2VtYmx5S2V5SWQ6IHN0cmluZyxcclxuICAgIGV2ZW50OiBzdHJpbmcsXHJcbiAgICByZWNlaXZlcjogVXBkYXRlZFNjZW5hcmlvUmVjZWl2ZXJcclxuICApIHtcclxuICAgIGxldCByZWNlaXZlcklkID0gcmVjZWl2ZXIucmVjZWl2ZXJJZDtcclxuXHJcbiAgICAvLyBDdXJyZW50bHkgZGVsZXRpbmcgYWxsIHJlY2VpdmVycyBiZWxvdyBhc3NlbWJseSBsb2dpYy5cclxuICAgIGlmIChyZWNlaXZlcklkKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2NlbmFyaW9SZWNlaXZlclNlcnZpY2UudXBkYXRlUmVjZWl2ZXIoe1xyXG4gICAgICAgIGlkOiByZWNlaXZlci5yZWNlaXZlcklkLFxyXG4gICAgICAgIGtleUlkOiByZWNlaXZlci5rZXlJZCxcclxuICAgICAgICBwbGFpblNoYXJlZENpcGhlckRhdGE6IHsgbWVzc2FnZTogcmVjZWl2ZXIubWVzc2FnZSwgZXZlbnQgfSxcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBuZXdSZWNlaXZlciA9IHtcclxuICAgICAgICBzY2VuYXJpb0lkLFxyXG4gICAgICAgIHRydXN0ZWRQYXJ0eUlkOiByZWNlaXZlci50cnVzdGVkUGFydHlJZCxcclxuICAgICAgICB0cnVzdGVkUGFydHlTaGFyZWRLZXlJZDogcmVjZWl2ZXIudHJ1c3RlZFBhcnR5U2hhcmVkS2V5SWQsXHJcbiAgICAgICAgcGxhaW5TaGFyZWRDaXBoZXJEYXRhOiB7IG1lc3NhZ2U6IHJlY2VpdmVyLm1lc3NhZ2UsIGV2ZW50IH0sXHJcbiAgICAgIH07XHJcbiAgICAgIHJlY2VpdmVySWQgPSBhd2FpdCB0aGlzLnNjZW5hcmlvUmVjZWl2ZXJTZXJ2aWNlLmFkZFJlY2VpdmVyKG5ld1JlY2VpdmVyKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGxvYWRlZFJlY2VpdmVyID0gYXdhaXQgdGhpcy5zY2VuYXJpb1JlY2VpdmVyU2VydmljZS5nZXRSZWNlaXZlcihcclxuICAgICAgcmVjZWl2ZXJJZFxyXG4gICAgKTtcclxuICAgIGF3YWl0IHRoaXMudXBkYXRlUmVjZWl2ZXJJdGVtcyhcclxuICAgICAgc2NlbmFyaW9JZCxcclxuICAgICAgYXNzZW1ibHlLZXlJZCxcclxuICAgICAgbG9hZGVkUmVjZWl2ZXIsXHJcbiAgICAgIHJlY2VpdmVyLnBlcm1pc3Npb25zXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVSZWNlaXZlckl0ZW1zKFxyXG4gICAgc2NlbmFyaW9JZDogc3RyaW5nLFxyXG4gICAgYXNzZW1ibHlLZXlJZDogc3RyaW5nLFxyXG4gICAgcmVjZWl2ZXI6IFJlY2VpdmVyLFxyXG4gICAgcGVybWlzc2lvbnM6IFByZXBhcmVkUGVybWlzc2lvbnNcclxuICApIHtcclxuICAgIHBlcm1pc3Npb25zID0gcGVybWlzc2lvbnMgfHwge307XHJcbiAgICBwZXJtaXNzaW9ucy5jYXRlZ29yaWVzID0gcGVybWlzc2lvbnMuY2F0ZWdvcmllcyB8fCBbXTtcclxuICAgIHBlcm1pc3Npb25zLnJlY29yZHMgPSBwZXJtaXNzaW9ucy5yZWNvcmRzIHx8IFtdO1xyXG5cclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICBwZXJtaXNzaW9ucy5jYXRlZ29yaWVzXHJcbiAgICAgICAgLmZpbHRlcihcclxuICAgICAgICAgICh4KSA9PlxyXG4gICAgICAgICAgICAhcmVjZWl2ZXIuY2F0ZWdvcmllcy5zb21lKCh5KSA9PiB5LmNhdGVnb3J5LmlkID09PSB4LmNhdGVnb3J5SWQpXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5tYXAoYXN5bmMgKHgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgc2NlbmFyaW9JZCxcclxuICAgICAgICAgICAgYXNzZW1ibHlLZXlJZCxcclxuICAgICAgICAgICAgcmVjZWl2ZXJJZDogcmVjZWl2ZXIuaWQsXHJcbiAgICAgICAgICAgIHJlY2VpdmVyS2V5SWQ6IHJlY2VpdmVyLmtleUlkLFxyXG4gICAgICAgICAgICBhY2Nlc3NSb2xlOiB4LmFjY2Vzc0xldmVsLFxyXG4gICAgICAgICAgICBjYXRlZ29yeUlkOiB4LmNhdGVnb3J5SWQsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zY2VuYXJpb1JlY2VpdmVyU2VydmljZS5hZGRSZWNlaXZlckNhdGVnb3J5KHBhcmFtcyk7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgcGVybWlzc2lvbnMucmVjb3Jkc1xyXG4gICAgICAgIC5maWx0ZXIoXHJcbiAgICAgICAgICAoeCkgPT4gIXJlY2VpdmVyLnJlY29yZHMuc29tZSgoeSkgPT4geS5yZWNvcmQuaWQgPT09IHgucmVjb3JkSWQpXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5tYXAoYXN5bmMgKHgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgc2NlbmFyaW9JZCxcclxuICAgICAgICAgICAgYXNzZW1ibHlLZXlJZCxcclxuICAgICAgICAgICAgcmVjZWl2ZXJJZDogcmVjZWl2ZXIuaWQsXHJcbiAgICAgICAgICAgIHJlY2VpdmVyS2V5SWQ6IHJlY2VpdmVyLmtleUlkLFxyXG4gICAgICAgICAgICBhY2Nlc3NSb2xlOiB4LmFjY2Vzc0xldmVsLFxyXG4gICAgICAgICAgICByZWNvcmRJZDogeC5yZWNvcmRJZCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnNjZW5hcmlvUmVjZWl2ZXJTZXJ2aWNlLmFkZFJlY2VpdmVyUmVjb3JkKHBhcmFtcyk7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIHBlcm1pc3Npb25zLmNhdGVnb3JpZXNcclxuICAgICAgICAubWFwKCh4KSA9PiAoe1xyXG4gICAgICAgICAgYWNjZXNzTGV2ZWw6IHguYWNjZXNzTGV2ZWwsXHJcbiAgICAgICAgICBjYXRlZ29yeTogcmVjZWl2ZXIuY2F0ZWdvcmllcy5maW5kKFxyXG4gICAgICAgICAgICAoeSkgPT4geS5jYXRlZ29yeS5pZCA9PT0geC5jYXRlZ29yeUlkXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgIH0pKVxyXG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHguY2F0ZWdvcnkpXHJcbiAgICAgICAgLm1hcChhc3luYyAoeCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgcGFyYW1zOiBVcGRhdGVTY2VuYXJpb1JlY2VpdmVySXRlbUlucHV0ID0ge1xyXG4gICAgICAgICAgICBpZDogeC5jYXRlZ29yeS5pZCxcclxuICAgICAgICAgICAga2V5SWQ6IHguY2F0ZWdvcnkua2V5SWQsXHJcbiAgICAgICAgICAgIGFjY2Vzc1JvbGU6IHguYWNjZXNzTGV2ZWwsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zY2VuYXJpb1JlY2VpdmVyU2VydmljZS51cGRhdGVSZWNlaXZlckl0ZW0ocGFyYW1zKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICBwZXJtaXNzaW9ucy5yZWNvcmRzXHJcbiAgICAgICAgLm1hcCgoeCkgPT4gKHtcclxuICAgICAgICAgIGFjY2Vzc0xldmVsOiB4LmFjY2Vzc0xldmVsLFxyXG4gICAgICAgICAgcmVjb3JkOiByZWNlaXZlci5yZWNvcmRzLmZpbmQoKHkpID0+IHkucmVjb3JkLmlkID09PSB4LnJlY29yZElkKSxcclxuICAgICAgICB9KSlcclxuICAgICAgICAuZmlsdGVyKCh4KSA9PiB4LnJlY29yZClcclxuICAgICAgICAubWFwKGFzeW5jICh4KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBwYXJhbXM6IFVwZGF0ZVNjZW5hcmlvUmVjZWl2ZXJJdGVtSW5wdXQgPSB7XHJcbiAgICAgICAgICAgIGlkOiB4LnJlY29yZC5pZCxcclxuICAgICAgICAgICAga2V5SWQ6IHgucmVjb3JkLmtleUlkLFxyXG4gICAgICAgICAgICBhY2Nlc3NSb2xlOiB4LmFjY2Vzc0xldmVsLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuc2NlbmFyaW9SZWNlaXZlclNlcnZpY2UudXBkYXRlUmVjZWl2ZXJJdGVtKHBhcmFtcyk7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIHJlY2VpdmVyLmNhdGVnb3JpZXNcclxuICAgICAgICAuZmlsdGVyKFxyXG4gICAgICAgICAgKHgpID0+XHJcbiAgICAgICAgICAgICFwZXJtaXNzaW9ucy5jYXRlZ29yaWVzLnNvbWUoKHkpID0+IHkuY2F0ZWdvcnlJZCA9PT0geC5jYXRlZ29yeS5pZClcclxuICAgICAgICApXHJcbiAgICAgICAgLm1hcCgoeCkgPT4gdGhpcy5zY2VuYXJpb1JlY2VpdmVyU2VydmljZS5kZWxldGVSZWNlaXZlckl0ZW0oeC5pZCkpXHJcbiAgICApO1xyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIHJlY2VpdmVyLnJlY29yZHNcclxuICAgICAgICAuZmlsdGVyKFxyXG4gICAgICAgICAgKHgpID0+ICFwZXJtaXNzaW9ucy5yZWNvcmRzLnNvbWUoKHkpID0+IHkucmVjb3JkSWQgPT09IHgucmVjb3JkLmlkKVxyXG4gICAgICAgIClcclxuICAgICAgICAubWFwKCh4KSA9PiB0aGlzLnNjZW5hcmlvUmVjZWl2ZXJTZXJ2aWNlLmRlbGV0ZVJlY2VpdmVySXRlbSh4LmlkKSlcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|