@nlabs/reaktor 1.16.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +186 -0
- package/docs/ASSISTANT.md +138 -0
- package/docs/GENERATION.md +29 -2
- package/docs/NATIVE_PUSH.md +56 -0
- package/lib/actions/alfredFaq.d.ts +80 -0
- package/lib/actions/alfredFaq.js +206 -0
- package/lib/actions/contentGeneration.d.ts +4 -1
- package/lib/actions/contentGeneration.js +83 -27
- package/lib/actions/contentGenerationErrors.js +1 -1
- package/lib/actions/conversations.d.ts +1 -1
- package/lib/actions/conversations.js +19 -9
- package/lib/actions/crud.js +26 -1
- package/lib/actions/index.d.ts +2 -0
- package/lib/actions/index.js +3 -1
- package/lib/actions/messages.js +23 -7
- package/lib/actions/phoneSupport.d.ts +18 -0
- package/lib/actions/phoneSupport.js +170 -0
- package/lib/actions/users.js +57 -4
- package/lib/assistant/core.d.ts +53 -0
- package/lib/assistant/core.js +123 -0
- package/lib/assistant/faq.d.ts +26 -0
- package/lib/assistant/faq.js +238 -0
- package/lib/assistant/faqCore.d.ts +23 -0
- package/lib/assistant/faqCore.js +20 -0
- package/lib/assistant/index.d.ts +7 -0
- package/lib/assistant/index.js +5 -0
- package/lib/assistant/service.d.ts +35 -0
- package/lib/assistant/service.js +201 -0
- package/lib/config.js +3 -2
- package/lib/durableChat/conversations.d.ts +62 -0
- package/lib/durableChat/conversations.js +729 -0
- package/lib/durableChat/errors.d.ts +6 -0
- package/lib/durableChat/errors.js +11 -0
- package/lib/durableChat/events.d.ts +22 -0
- package/lib/durableChat/events.js +50 -0
- package/lib/durableChat/index.d.ts +8 -0
- package/lib/durableChat/index.js +10 -0
- package/lib/durableChat/membership.d.ts +24 -0
- package/lib/durableChat/membership.js +85 -0
- package/lib/durableChat/messageTypes.d.ts +76 -0
- package/lib/durableChat/messageTypes.js +3 -0
- package/lib/durableChat/messages.d.ts +16 -0
- package/lib/durableChat/messages.js +257 -0
- package/lib/durableChat/transaction.d.ts +10 -0
- package/lib/durableChat/transaction.js +53 -0
- package/lib/durableChat/types.d.ts +81 -0
- package/lib/durableChat/types.js +3 -0
- package/lib/index.d.ts +4 -4
- package/lib/index.js +5 -3
- package/lib/lambdas/actions/websockets.js +4 -4
- package/lib/nativePush/graphql.d.ts +14 -0
- package/lib/nativePush/graphql.js +105 -0
- package/lib/nativePush/index.d.ts +7 -0
- package/lib/nativePush/index.js +9 -0
- package/lib/nativePush/migrations.d.ts +2 -0
- package/lib/nativePush/migrations.js +36 -0
- package/lib/nativePush/nativePushContract.fixture.d.ts +22 -0
- package/lib/nativePush/nativePushContract.fixture.js +27 -0
- package/lib/nativePush/payload.d.ts +2 -0
- package/lib/nativePush/payload.js +106 -0
- package/lib/nativePush/repository.d.ts +9 -0
- package/lib/nativePush/repository.js +120 -0
- package/lib/nativePush/service.d.ts +2 -0
- package/lib/nativePush/service.js +110 -0
- package/lib/nativePush/snsProvider.d.ts +17 -0
- package/lib/nativePush/snsProvider.js +165 -0
- package/lib/nativePush/types.d.ts +89 -0
- package/lib/nativePush/types.js +3 -0
- package/lib/organizations/accountLifecycle.d.ts +7 -0
- package/lib/organizations/accountLifecycle.js +106 -0
- package/lib/organizations/authorization.d.ts +9 -0
- package/lib/organizations/authorization.js +40 -0
- package/lib/organizations/billing.d.ts +38 -0
- package/lib/organizations/billing.js +277 -0
- package/lib/organizations/billingProvider.d.ts +4 -0
- package/lib/organizations/billingProvider.js +287 -0
- package/lib/organizations/billingUpdates.d.ts +9 -0
- package/lib/organizations/billingUpdates.js +388 -0
- package/lib/organizations/index.d.ts +10 -0
- package/lib/organizations/index.js +12 -0
- package/lib/organizations/mail.d.ts +10 -0
- package/lib/organizations/mail.js +60 -0
- package/lib/organizations/memberDirectory.d.ts +15 -0
- package/lib/organizations/memberDirectory.js +28 -0
- package/lib/organizations/membership.d.ts +19 -0
- package/lib/organizations/membership.js +248 -0
- package/lib/organizations/passwordRecovery.d.ts +9 -0
- package/lib/organizations/passwordRecovery.js +50 -0
- package/lib/organizations/plans.d.ts +6 -0
- package/lib/organizations/plans.js +40 -0
- package/lib/organizations/providerPagination.d.ts +6 -0
- package/lib/organizations/providerPagination.js +23 -0
- package/lib/organizations/reconciliation.d.ts +11 -0
- package/lib/organizations/reconciliation.js +400 -0
- package/lib/organizations/signup.d.ts +25 -0
- package/lib/organizations/signup.js +169 -0
- package/lib/organizations/store.d.ts +25 -0
- package/lib/organizations/store.js +167 -0
- package/lib/organizations/types.d.ts +138 -0
- package/lib/organizations/types.js +3 -0
- package/lib/organizations/verification.d.ts +3 -0
- package/lib/organizations/verification.js +51 -0
- package/package.json +16 -3
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/* eslint-disable no-await-in-loop, no-underscore-dangle -- Ordered checks and Arango document identities. */ import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { ChatError } from './errors.js';
|
|
3
|
+
import { isChatIdentifier } from './membership.js';
|
|
4
|
+
const defaultHash = (value)=>createHash('sha256').update(JSON.stringify(value)).digest('hex');
|
|
5
|
+
const validText = (content)=>typeof content === 'string' && Array.from(content).length <= 4000 && !/[\u0000\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u.test(content);
|
|
6
|
+
const requireValid = (valid)=>{
|
|
7
|
+
if (!valid) {
|
|
8
|
+
throw new ChatError('invalid_request');
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
export const readDurableMessage = async (read, conversationId, messageId)=>{
|
|
12
|
+
const message = await read('RETURN DOCUMENT("messages", @messageId)', {
|
|
13
|
+
messageId
|
|
14
|
+
});
|
|
15
|
+
if (!message || message.conversationId !== conversationId || message.chatSchemaVersion !== 1) {
|
|
16
|
+
throw new ChatError('forbidden');
|
|
17
|
+
}
|
|
18
|
+
return message;
|
|
19
|
+
};
|
|
20
|
+
export const createDurableMessagePersistence = (hooks)=>{
|
|
21
|
+
const hash = hooks.hash || defaultHash;
|
|
22
|
+
const now = hooks.now || Date.now;
|
|
23
|
+
const uuid = hooks.uuid || randomUUID;
|
|
24
|
+
const authorize = async (read, conversationId, purpose = 'history')=>{
|
|
25
|
+
const membership = await hooks.authorizeMembership(read, hooks.identity, conversationId, purpose);
|
|
26
|
+
const legacy = await read(`RETURN FIRST(FOR message IN messages
|
|
27
|
+
FILTER message.conversationId == @conversationId
|
|
28
|
+
AND (message.chatSchemaVersion != 1 OR !IS_NUMBER(message.sequence) OR message.sequence < 1)
|
|
29
|
+
LIMIT 1 RETURN true)`, {
|
|
30
|
+
conversationId
|
|
31
|
+
});
|
|
32
|
+
if (legacy === true) {
|
|
33
|
+
throw new ChatError('conflict');
|
|
34
|
+
}
|
|
35
|
+
return membership;
|
|
36
|
+
};
|
|
37
|
+
const receipt = async (read, action, conversationId, key, payload)=>{
|
|
38
|
+
const requestId = hash([
|
|
39
|
+
action,
|
|
40
|
+
conversationId,
|
|
41
|
+
hooks.identity.personaId,
|
|
42
|
+
key
|
|
43
|
+
]);
|
|
44
|
+
const payloadHash = hash(payload);
|
|
45
|
+
const record = await read('RETURN DOCUMENT("chatMessageRequests", @key)', {
|
|
46
|
+
key: requestId
|
|
47
|
+
});
|
|
48
|
+
if (record && (record.payloadHash !== payloadHash || record.userId !== hooks.identity.userId)) {
|
|
49
|
+
throw new ChatError('conflict');
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
prior: record?.result,
|
|
53
|
+
save: (result)=>read('INSERT @record IN chatMessageRequests RETURN true', {
|
|
54
|
+
record: {
|
|
55
|
+
_key: requestId,
|
|
56
|
+
added: now(),
|
|
57
|
+
conversationId,
|
|
58
|
+
payloadHash,
|
|
59
|
+
personaId: hooks.identity.personaId,
|
|
60
|
+
result,
|
|
61
|
+
userId: hooks.identity.userId
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
const rateLimit = async (read, action, limit, interval = 60000)=>{
|
|
67
|
+
const key = hash([
|
|
68
|
+
hooks.identity.userId,
|
|
69
|
+
hooks.identity.personaId,
|
|
70
|
+
action,
|
|
71
|
+
Math.floor(now() / interval)
|
|
72
|
+
]);
|
|
73
|
+
const allowed = await read(`LET bucket = DOCUMENT('chatRateLimits', @key)
|
|
74
|
+
FILTER bucket == null OR bucket.count < @limit
|
|
75
|
+
UPSERT {_key: @key} INSERT {_key: @key, count: 1, personaId: @personaId, userId: @userId}
|
|
76
|
+
UPDATE {count: OLD.count + 1, personaId: @personaId, userId: @userId}
|
|
77
|
+
IN chatRateLimits RETURN true`, {
|
|
78
|
+
key,
|
|
79
|
+
limit,
|
|
80
|
+
personaId: hooks.identity.personaId,
|
|
81
|
+
userId: hooks.identity.userId
|
|
82
|
+
});
|
|
83
|
+
if (allowed !== true) {
|
|
84
|
+
throw new ChatError('rate_limited');
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const run = (operation, write = true)=>hooks.run(async (read)=>{
|
|
88
|
+
await hooks.authorizeIdentity(read, hooks.identity);
|
|
89
|
+
return operation(read);
|
|
90
|
+
}, write);
|
|
91
|
+
const sendMessage = (input)=>run(async (read)=>{
|
|
92
|
+
requireValid(Boolean(input) && isChatIdentifier(input.conversationId) && isChatIdentifier(input.clientMessageId) && input.senderPersonaId === hooks.identity.personaId && validText(input.content) && Array.isArray(input.attachmentIds) && input.attachmentIds.length <= 4 && input.attachmentIds.every(isChatIdentifier) && new Set(input.attachmentIds).size === input.attachmentIds.length && (input.content.trim().length > 0 || input.attachmentIds.length > 0) && (input.replyToMessageId === undefined || isChatIdentifier(input.replyToMessageId)));
|
|
93
|
+
const request = await receipt(read, 'send', input.conversationId, input.clientMessageId, input);
|
|
94
|
+
if (request.prior) {
|
|
95
|
+
return request.prior;
|
|
96
|
+
}
|
|
97
|
+
const membership = await authorize(read, input.conversationId, 'send');
|
|
98
|
+
await rateLimit(read, 'send', 60);
|
|
99
|
+
const attachments = [];
|
|
100
|
+
for (const imageId of input.attachmentIds){
|
|
101
|
+
attachments.push(await hooks.authorizeAttachment(read, imageId));
|
|
102
|
+
}
|
|
103
|
+
if (input.replyToMessageId) {
|
|
104
|
+
const quoted = await readDurableMessage(read, input.conversationId, input.replyToMessageId);
|
|
105
|
+
await hooks.authorizeMessageVisible(read, hooks.identity, quoted, membership);
|
|
106
|
+
if (quoted.deleted || quoted.mobilePlatformDisposition !== 'allowed') {
|
|
107
|
+
throw new ChatError('forbidden');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const timestamp = now();
|
|
111
|
+
const sequence = await read(`FOR conversation IN conversations FILTER conversation._key == @id
|
|
112
|
+
AND conversation.chatSchemaVersion == 1 AND conversation.state == 'active'
|
|
113
|
+
AND IS_NUMBER(conversation.lastSequence) AND conversation.lastSequence < 9007199254740991
|
|
114
|
+
UPDATE conversation WITH {lastSequence: conversation.lastSequence + 1, modified: @now}
|
|
115
|
+
IN conversations RETURN NEW.lastSequence`, {
|
|
116
|
+
id: input.conversationId,
|
|
117
|
+
now: timestamp
|
|
118
|
+
});
|
|
119
|
+
if (!Number.isSafeInteger(sequence) || Number(sequence) < 1) {
|
|
120
|
+
throw new ChatError('unavailable');
|
|
121
|
+
}
|
|
122
|
+
const messageId = uuid();
|
|
123
|
+
const contentVersion = hash([
|
|
124
|
+
messageId,
|
|
125
|
+
1,
|
|
126
|
+
input.content
|
|
127
|
+
]);
|
|
128
|
+
const projection = await hooks.classifyContent({
|
|
129
|
+
content: input.content || ' ',
|
|
130
|
+
contentVersion
|
|
131
|
+
});
|
|
132
|
+
const record = {
|
|
133
|
+
_key: messageId,
|
|
134
|
+
added: timestamp,
|
|
135
|
+
attachmentIds: input.attachmentIds,
|
|
136
|
+
attachments,
|
|
137
|
+
chatSchemaVersion: 1,
|
|
138
|
+
clientMessageId: input.clientMessageId,
|
|
139
|
+
content: input.content,
|
|
140
|
+
contentRevision: 1,
|
|
141
|
+
conversationId: input.conversationId,
|
|
142
|
+
deleted: false,
|
|
143
|
+
mobileContentVersion: contentVersion,
|
|
144
|
+
mobileDecision: projection.decision,
|
|
145
|
+
mobilePlatformDisposition: projection.platformDisposition || 'allowed',
|
|
146
|
+
modified: timestamp,
|
|
147
|
+
replyToMessageId: input.replyToMessageId,
|
|
148
|
+
revision: 1,
|
|
149
|
+
senderPersonaId: hooks.identity.personaId,
|
|
150
|
+
sequence: sequence,
|
|
151
|
+
userId: hooks.identity.userId
|
|
152
|
+
};
|
|
153
|
+
if (await read('INSERT @record IN messages RETURN true', {
|
|
154
|
+
record
|
|
155
|
+
}) !== true) {
|
|
156
|
+
throw new ChatError('unavailable');
|
|
157
|
+
}
|
|
158
|
+
await hooks.appendEvent(read, {
|
|
159
|
+
actorPersonaId: hooks.identity.personaId,
|
|
160
|
+
conversationId: input.conversationId,
|
|
161
|
+
kind: 'message.changed',
|
|
162
|
+
membershipEpoch: membership.epoch,
|
|
163
|
+
resourceId: messageId,
|
|
164
|
+
revision: 1
|
|
165
|
+
});
|
|
166
|
+
const result = {
|
|
167
|
+
clientMessageId: input.clientMessageId,
|
|
168
|
+
messageId,
|
|
169
|
+
revision: 1,
|
|
170
|
+
sequence: sequence
|
|
171
|
+
};
|
|
172
|
+
if (await request.save(result) !== true) {
|
|
173
|
+
throw new ChatError('unavailable');
|
|
174
|
+
}
|
|
175
|
+
return result;
|
|
176
|
+
});
|
|
177
|
+
const mutateMessage = (input, remove)=>run(async (read)=>{
|
|
178
|
+
requireValid(Boolean(input) && isChatIdentifier(input.conversationId) && isChatIdentifier(input.messageId) && isChatIdentifier(input.idempotencyKey) && Number.isSafeInteger(input.expectedRevision) && input.expectedRevision >= 1 && (remove || 'content' in input && validText(input.content)));
|
|
179
|
+
const request = await receipt(read, remove ? 'delete' : 'edit', input.conversationId, input.idempotencyKey, input);
|
|
180
|
+
if (request.prior) {
|
|
181
|
+
return request.prior;
|
|
182
|
+
}
|
|
183
|
+
const membership = await authorize(read, input.conversationId, 'send');
|
|
184
|
+
const message = await readDurableMessage(read, input.conversationId, input.messageId);
|
|
185
|
+
if (message.senderPersonaId !== hooks.identity.personaId || message.userId !== hooks.identity.userId || message.sequence < membership.joinSequence || message.deleted || message.mobilePlatformDisposition !== 'allowed') {
|
|
186
|
+
throw new ChatError('forbidden');
|
|
187
|
+
}
|
|
188
|
+
if (message.revision !== input.expectedRevision || !remove && now() - message.added > 15 * 60000) {
|
|
189
|
+
throw new ChatError('conflict');
|
|
190
|
+
}
|
|
191
|
+
await rateLimit(read, remove ? 'delete' : 'edit', 60);
|
|
192
|
+
const content = !remove && 'content' in input ? input.content : '';
|
|
193
|
+
const revision = message.revision + 1;
|
|
194
|
+
const contentRevision = message.contentRevision + 1;
|
|
195
|
+
const contentVersion = hash([
|
|
196
|
+
message._key,
|
|
197
|
+
contentRevision,
|
|
198
|
+
content
|
|
199
|
+
]);
|
|
200
|
+
const projection = await hooks.classifyContent({
|
|
201
|
+
content: content || ' ',
|
|
202
|
+
contentVersion
|
|
203
|
+
});
|
|
204
|
+
const updated = await read(`FOR current IN messages
|
|
205
|
+
FILTER current._key == @id AND current.revision == @expectedRevision
|
|
206
|
+
UPDATE current WITH {content: @content, contentRevision: @contentRevision, deleted: @deleted,
|
|
207
|
+
attachmentIds: @attachmentIds, attachments: @attachments, replyToMessageId: @reply,
|
|
208
|
+
mobileContentVersion: @contentVersion, mobileDecision: @decision,
|
|
209
|
+
mobilePlatformDisposition: @platformDisposition, modified: @now, revision: @revision}
|
|
210
|
+
IN messages RETURN true`, {
|
|
211
|
+
attachmentIds: remove ? [] : message.attachmentIds,
|
|
212
|
+
attachments: remove ? [] : message.attachments,
|
|
213
|
+
content,
|
|
214
|
+
contentRevision,
|
|
215
|
+
contentVersion,
|
|
216
|
+
decision: projection.decision,
|
|
217
|
+
deleted: remove,
|
|
218
|
+
expectedRevision: input.expectedRevision,
|
|
219
|
+
id: message._key,
|
|
220
|
+
now: now(),
|
|
221
|
+
platformDisposition: projection.platformDisposition || 'allowed',
|
|
222
|
+
reply: remove ? null : message.replyToMessageId || null,
|
|
223
|
+
revision
|
|
224
|
+
});
|
|
225
|
+
if (updated !== true) {
|
|
226
|
+
throw new ChatError('conflict');
|
|
227
|
+
}
|
|
228
|
+
await hooks.appendEvent(read, {
|
|
229
|
+
actorPersonaId: hooks.identity.personaId,
|
|
230
|
+
conversationId: input.conversationId,
|
|
231
|
+
kind: 'message.changed',
|
|
232
|
+
membershipEpoch: membership.epoch,
|
|
233
|
+
resourceId: message._key,
|
|
234
|
+
revision
|
|
235
|
+
});
|
|
236
|
+
const result = {
|
|
237
|
+
messageId: message._key,
|
|
238
|
+
revision,
|
|
239
|
+
sequence: message.sequence
|
|
240
|
+
};
|
|
241
|
+
if (await request.save(result) !== true) {
|
|
242
|
+
throw new ChatError('unavailable');
|
|
243
|
+
}
|
|
244
|
+
return result;
|
|
245
|
+
});
|
|
246
|
+
return {
|
|
247
|
+
authorize,
|
|
248
|
+
deleteMessage: (input)=>mutateMessage(input, true),
|
|
249
|
+
editMessage: (input)=>mutateMessage(input, false),
|
|
250
|
+
rateLimit,
|
|
251
|
+
receipt,
|
|
252
|
+
run,
|
|
253
|
+
sendMessage
|
|
254
|
+
};
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvZHVyYWJsZUNoYXQvbWVzc2FnZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCwgbm8tdW5kZXJzY29yZS1kYW5nbGUgLS0gT3JkZXJlZCBjaGVja3MgYW5kIEFyYW5nbyBkb2N1bWVudCBpZGVudGl0aWVzLiAqL1xuaW1wb3J0IHtjcmVhdGVIYXNoLCByYW5kb21VVUlEfSBmcm9tICdub2RlOmNyeXB0byc7XG5cbmltcG9ydCB7Q2hhdEVycm9yfSBmcm9tICcuL2Vycm9ycy5qcyc7XG5pbXBvcnQge2lzQ2hhdElkZW50aWZpZXJ9IGZyb20gJy4vbWVtYmVyc2hpcC5qcyc7XG5cbmltcG9ydCB0eXBlIHtDaGF0UXVlcnl9IGZyb20gJy4vbWVtYmVyc2hpcC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIER1cmFibGVDaGF0QXR0YWNobWVudCwgRHVyYWJsZUNoYXRNZXNzYWdlLCBEdXJhYmxlRGVsZXRlTWVzc2FnZUlucHV0LCBEdXJhYmxlRWRpdE1lc3NhZ2VJbnB1dCxcbiAgRHVyYWJsZU1lc3NhZ2VBY2tub3dsZWRnZW1lbnQsIER1cmFibGVNZXNzYWdlSG9va3MsIER1cmFibGVNZXNzYWdlTXV0YXRpb25SZXN1bHQsIER1cmFibGVTZW5kTWVzc2FnZUlucHV0XG59IGZyb20gJy4vbWVzc2FnZVR5cGVzLmpzJztcblxuY29uc3QgZGVmYXVsdEhhc2ggPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkuZGlnZXN0KCdoZXgnKTtcbmNvbnN0IHZhbGlkVGV4dCA9IChjb250ZW50OiB1bmtub3duKTogY29udGVudCBpcyBzdHJpbmcgPT4gdHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnXG4gICYmIEFycmF5LmZyb20oY29udGVudCkubGVuZ3RoIDw9IDQwMDBcbiAgJiYgIS9bXFx1MDAwMFxcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD88IVtcXHVEODAwLVxcdURCRkZdKVtcXHVEQzAwLVxcdURGRkZdL3UudGVzdChjb250ZW50KTtcbmNvbnN0IHJlcXVpcmVWYWxpZCA9ICh2YWxpZDogYm9vbGVhbik6IHZvaWQgPT4ge1xuICBpZighdmFsaWQpIHtcbiAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCdpbnZhbGlkX3JlcXVlc3QnKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlYWREdXJhYmxlTWVzc2FnZSA9IGFzeW5jIDxURGVjaXNpb24+KFxuICByZWFkOiBDaGF0UXVlcnksIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nXG4pOiBQcm9taXNlPER1cmFibGVDaGF0TWVzc2FnZTxURGVjaXNpb24+PiA9PiB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCByZWFkPER1cmFibGVDaGF0TWVzc2FnZTxURGVjaXNpb24+PignUkVUVVJOIERPQ1VNRU5UKFwibWVzc2FnZXNcIiwgQG1lc3NhZ2VJZCknLCB7bWVzc2FnZUlkfSk7XG4gIGlmKCFtZXNzYWdlIHx8IG1lc3NhZ2UuY29udmVyc2F0aW9uSWQgIT09IGNvbnZlcnNhdGlvbklkIHx8IG1lc3NhZ2UuY2hhdFNjaGVtYVZlcnNpb24gIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCdmb3JiaWRkZW4nKTtcbiAgfVxuICByZXR1cm4gbWVzc2FnZTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVEdXJhYmxlTWVzc2FnZVBlcnNpc3RlbmNlID0gPFREZWNpc2lvbj4oaG9va3M6IER1cmFibGVNZXNzYWdlSG9va3M8VERlY2lzaW9uPikgPT4ge1xuICBjb25zdCBoYXNoID0gaG9va3MuaGFzaCB8fCBkZWZhdWx0SGFzaDtcbiAgY29uc3Qgbm93ID0gaG9va3Mubm93IHx8IERhdGUubm93O1xuICBjb25zdCB1dWlkID0gaG9va3MudXVpZCB8fCByYW5kb21VVUlEO1xuICBjb25zdCBhdXRob3JpemUgPSBhc3luYyAocmVhZDogQ2hhdFF1ZXJ5LCBjb252ZXJzYXRpb25JZDogc3RyaW5nLCBwdXJwb3NlOiAnaGlzdG9yeScgfCAnc2VuZCcgPSAnaGlzdG9yeScpID0+IHtcbiAgICBjb25zdCBtZW1iZXJzaGlwID0gYXdhaXQgaG9va3MuYXV0aG9yaXplTWVtYmVyc2hpcChyZWFkLCBob29rcy5pZGVudGl0eSwgY29udmVyc2F0aW9uSWQsIHB1cnBvc2UpO1xuICAgIGNvbnN0IGxlZ2FjeSA9IGF3YWl0IHJlYWQ8Ym9vbGVhbj4oYFJFVFVSTiBGSVJTVChGT1IgbWVzc2FnZSBJTiBtZXNzYWdlc1xuICAgICAgRklMVEVSIG1lc3NhZ2UuY29udmVyc2F0aW9uSWQgPT0gQGNvbnZlcnNhdGlvbklkXG4gICAgICAgIEFORCAobWVzc2FnZS5jaGF0U2NoZW1hVmVyc2lvbiAhPSAxIE9SICFJU19OVU1CRVIobWVzc2FnZS5zZXF1ZW5jZSkgT1IgbWVzc2FnZS5zZXF1ZW5jZSA8IDEpXG4gICAgICBMSU1JVCAxIFJFVFVSTiB0cnVlKWAsIHtjb252ZXJzYXRpb25JZH0pO1xuICAgIGlmKGxlZ2FjeSA9PT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IENoYXRFcnJvcignY29uZmxpY3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lbWJlcnNoaXA7XG4gIH07XG4gIGNvbnN0IHJlY2VpcHQgPSBhc3luYyA8VD4oXG4gICAgcmVhZDogQ2hhdFF1ZXJ5LCBhY3Rpb246IHN0cmluZywgY29udmVyc2F0aW9uSWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd25cbiAgKSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdElkID0gaGFzaChbYWN0aW9uLCBjb252ZXJzYXRpb25JZCwgaG9va3MuaWRlbnRpdHkucGVyc29uYUlkLCBrZXldKTtcbiAgICBjb25zdCBwYXlsb2FkSGFzaCA9IGhhc2gocGF5bG9hZCk7XG4gICAgY29uc3QgcmVjb3JkID0gYXdhaXQgcmVhZDx7cmVhZG9ubHkgcGF5bG9hZEhhc2g6IHN0cmluZzsgcmVhZG9ubHkgcmVzdWx0OiBUOyByZWFkb25seSB1c2VySWQ6IHN0cmluZ30+KFxuICAgICAgJ1JFVFVSTiBET0NVTUVOVChcImNoYXRNZXNzYWdlUmVxdWVzdHNcIiwgQGtleSknLCB7a2V5OiByZXF1ZXN0SWR9KTtcbiAgICBpZihyZWNvcmQgJiYgKHJlY29yZC5wYXlsb2FkSGFzaCAhPT0gcGF5bG9hZEhhc2ggfHwgcmVjb3JkLnVzZXJJZCAhPT0gaG9va3MuaWRlbnRpdHkudXNlcklkKSkge1xuICAgICAgdGhyb3cgbmV3IENoYXRFcnJvcignY29uZmxpY3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtwcmlvcjogcmVjb3JkPy5yZXN1bHQsIHNhdmU6IChyZXN1bHQ6IFQpID0+IHJlYWQ8Ym9vbGVhbj4oXG4gICAgICAnSU5TRVJUIEByZWNvcmQgSU4gY2hhdE1lc3NhZ2VSZXF1ZXN0cyBSRVRVUk4gdHJ1ZScsIHtyZWNvcmQ6IHtfa2V5OiByZXF1ZXN0SWQsIGFkZGVkOiBub3coKSwgY29udmVyc2F0aW9uSWQsXG4gICAgICAgIHBheWxvYWRIYXNoLCBwZXJzb25hSWQ6IGhvb2tzLmlkZW50aXR5LnBlcnNvbmFJZCwgcmVzdWx0LCB1c2VySWQ6IGhvb2tzLmlkZW50aXR5LnVzZXJJZH19KX07XG4gIH07XG4gIGNvbnN0IHJhdGVMaW1pdCA9IGFzeW5jIChyZWFkOiBDaGF0UXVlcnksIGFjdGlvbjogc3RyaW5nLCBsaW1pdDogbnVtYmVyLCBpbnRlcnZhbCA9IDYwMDAwKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3Qga2V5ID0gaGFzaChbaG9va3MuaWRlbnRpdHkudXNlcklkLCBob29rcy5pZGVudGl0eS5wZXJzb25hSWQsIGFjdGlvbiwgTWF0aC5mbG9vcihub3coKSAvIGludGVydmFsKV0pO1xuICAgIGNvbnN0IGFsbG93ZWQgPSBhd2FpdCByZWFkPGJvb2xlYW4+KGBMRVQgYnVja2V0ID0gRE9DVU1FTlQoJ2NoYXRSYXRlTGltaXRzJywgQGtleSlcbiAgICAgIEZJTFRFUiBidWNrZXQgPT0gbnVsbCBPUiBidWNrZXQuY291bnQgPCBAbGltaXRcbiAgICAgIFVQU0VSVCB7X2tleTogQGtleX0gSU5TRVJUIHtfa2V5OiBAa2V5LCBjb3VudDogMSwgcGVyc29uYUlkOiBAcGVyc29uYUlkLCB1c2VySWQ6IEB1c2VySWR9XG4gICAgICBVUERBVEUge2NvdW50OiBPTEQuY291bnQgKyAxLCBwZXJzb25hSWQ6IEBwZXJzb25hSWQsIHVzZXJJZDogQHVzZXJJZH1cbiAgICAgIElOIGNoYXRSYXRlTGltaXRzIFJFVFVSTiB0cnVlYCwge2tleSwgbGltaXQsIHBlcnNvbmFJZDogaG9va3MuaWRlbnRpdHkucGVyc29uYUlkLCB1c2VySWQ6IGhvb2tzLmlkZW50aXR5LnVzZXJJZH0pO1xuICAgIGlmKGFsbG93ZWQgIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ3JhdGVfbGltaXRlZCcpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcnVuID0gPFQ+KG9wZXJhdGlvbjogKHJlYWQ6IENoYXRRdWVyeSkgPT4gUHJvbWlzZTxUPiwgd3JpdGUgPSB0cnVlKTogUHJvbWlzZTxUPiA9PiBob29rcy5ydW4oYXN5bmMgKHJlYWQpID0+IHtcbiAgICBhd2FpdCBob29rcy5hdXRob3JpemVJZGVudGl0eShyZWFkLCBob29rcy5pZGVudGl0eSk7XG4gICAgcmV0dXJuIG9wZXJhdGlvbihyZWFkKTtcbiAgfSwgd3JpdGUpO1xuICBjb25zdCBzZW5kTWVzc2FnZSA9IChpbnB1dDogRHVyYWJsZVNlbmRNZXNzYWdlSW5wdXQpOiBQcm9taXNlPER1cmFibGVNZXNzYWdlQWNrbm93bGVkZ2VtZW50PiA9PiBydW4oYXN5bmMgKHJlYWQpID0+IHtcbiAgICByZXF1aXJlVmFsaWQoQm9vbGVhbihpbnB1dCkgJiYgaXNDaGF0SWRlbnRpZmllcihpbnB1dC5jb252ZXJzYXRpb25JZCkgJiYgaXNDaGF0SWRlbnRpZmllcihpbnB1dC5jbGllbnRNZXNzYWdlSWQpXG4gICAgICAmJiBpbnB1dC5zZW5kZXJQZXJzb25hSWQgPT09IGhvb2tzLmlkZW50aXR5LnBlcnNvbmFJZCAmJiB2YWxpZFRleHQoaW5wdXQuY29udGVudClcbiAgICAgICYmIEFycmF5LmlzQXJyYXkoaW5wdXQuYXR0YWNobWVudElkcykgJiYgaW5wdXQuYXR0YWNobWVudElkcy5sZW5ndGggPD0gNFxuICAgICAgJiYgaW5wdXQuYXR0YWNobWVudElkcy5ldmVyeShpc0NoYXRJZGVudGlmaWVyKSAmJiBuZXcgU2V0KGlucHV0LmF0dGFjaG1lbnRJZHMpLnNpemUgPT09IGlucHV0LmF0dGFjaG1lbnRJZHMubGVuZ3RoXG4gICAgICAmJiAoaW5wdXQuY29udGVudC50cmltKCkubGVuZ3RoID4gMCB8fCBpbnB1dC5hdHRhY2htZW50SWRzLmxlbmd0aCA+IDApXG4gICAgICAmJiAoaW5wdXQucmVwbHlUb01lc3NhZ2VJZCA9PT0gdW5kZWZpbmVkIHx8IGlzQ2hhdElkZW50aWZpZXIoaW5wdXQucmVwbHlUb01lc3NhZ2VJZCkpKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgcmVjZWlwdDxEdXJhYmxlTWVzc2FnZUFja25vd2xlZGdlbWVudD4oXG4gICAgICByZWFkLCAnc2VuZCcsIGlucHV0LmNvbnZlcnNhdGlvbklkLCBpbnB1dC5jbGllbnRNZXNzYWdlSWQsIGlucHV0KTtcbiAgICBpZihyZXF1ZXN0LnByaW9yKSB7XG4gICAgICByZXR1cm4gcmVxdWVzdC5wcmlvcjtcbiAgICB9XG4gICAgY29uc3QgbWVtYmVyc2hpcCA9IGF3YWl0IGF1dGhvcml6ZShyZWFkLCBpbnB1dC5jb252ZXJzYXRpb25JZCwgJ3NlbmQnKTtcbiAgICBhd2FpdCByYXRlTGltaXQocmVhZCwgJ3NlbmQnLCA2MCk7XG4gICAgY29uc3QgYXR0YWNobWVudHM6IER1cmFibGVDaGF0QXR0YWNobWVudFtdID0gW107XG4gICAgZm9yKGNvbnN0IGltYWdlSWQgb2YgaW5wdXQuYXR0YWNobWVudElkcykge1xuICAgICAgYXR0YWNobWVudHMucHVzaChhd2FpdCBob29rcy5hdXRob3JpemVBdHRhY2htZW50KHJlYWQsIGltYWdlSWQpKTtcbiAgICB9XG4gICAgaWYoaW5wdXQucmVwbHlUb01lc3NhZ2VJZCkge1xuICAgICAgY29uc3QgcXVvdGVkID0gYXdhaXQgcmVhZER1cmFibGVNZXNzYWdlPFREZWNpc2lvbj4ocmVhZCwgaW5wdXQuY29udmVyc2F0aW9uSWQsIGlucHV0LnJlcGx5VG9NZXNzYWdlSWQpO1xuICAgICAgYXdhaXQgaG9va3MuYXV0aG9yaXplTWVzc2FnZVZpc2libGUocmVhZCwgaG9va3MuaWRlbnRpdHksIHF1b3RlZCwgbWVtYmVyc2hpcCk7XG4gICAgICBpZihxdW90ZWQuZGVsZXRlZCB8fCBxdW90ZWQubW9iaWxlUGxhdGZvcm1EaXNwb3NpdGlvbiAhPT0gJ2FsbG93ZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ2ZvcmJpZGRlbicpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgICBjb25zdCBzZXF1ZW5jZSA9IGF3YWl0IHJlYWQ8bnVtYmVyPihgRk9SIGNvbnZlcnNhdGlvbiBJTiBjb252ZXJzYXRpb25zIEZJTFRFUiBjb252ZXJzYXRpb24uX2tleSA9PSBAaWRcbiAgICAgIEFORCBjb252ZXJzYXRpb24uY2hhdFNjaGVtYVZlcnNpb24gPT0gMSBBTkQgY29udmVyc2F0aW9uLnN0YXRlID09ICdhY3RpdmUnXG4gICAgICBBTkQgSVNfTlVNQkVSKGNvbnZlcnNhdGlvbi5sYXN0U2VxdWVuY2UpIEFORCBjb252ZXJzYXRpb24ubGFzdFNlcXVlbmNlIDwgOTAwNzE5OTI1NDc0MDk5MVxuICAgICAgVVBEQVRFIGNvbnZlcnNhdGlvbiBXSVRIIHtsYXN0U2VxdWVuY2U6IGNvbnZlcnNhdGlvbi5sYXN0U2VxdWVuY2UgKyAxLCBtb2RpZmllZDogQG5vd31cbiAgICAgIElOIGNvbnZlcnNhdGlvbnMgUkVUVVJOIE5FVy5sYXN0U2VxdWVuY2VgLCB7aWQ6IGlucHV0LmNvbnZlcnNhdGlvbklkLCBub3c6IHRpbWVzdGFtcH0pO1xuICAgIGlmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihzZXF1ZW5jZSkgfHwgTnVtYmVyKHNlcXVlbmNlKSA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ3VuYXZhaWxhYmxlJyk7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VJZCA9IHV1aWQoKTtcbiAgICBjb25zdCBjb250ZW50VmVyc2lvbiA9IGhhc2goW21lc3NhZ2VJZCwgMSwgaW5wdXQuY29udGVudF0pO1xuICAgIGNvbnN0IHByb2plY3Rpb24gPSBhd2FpdCBob29rcy5jbGFzc2lmeUNvbnRlbnQoe2NvbnRlbnQ6IGlucHV0LmNvbnRlbnQgfHwgJyAnLCBjb250ZW50VmVyc2lvbn0pO1xuICAgIGNvbnN0IHJlY29yZDogRHVyYWJsZUNoYXRNZXNzYWdlPFREZWNpc2lvbj4gPSB7X2tleTogbWVzc2FnZUlkLCBhZGRlZDogdGltZXN0YW1wLFxuICAgICAgYXR0YWNobWVudElkczogaW5wdXQuYXR0YWNobWVudElkcywgYXR0YWNobWVudHMsIGNoYXRTY2hlbWFWZXJzaW9uOiAxLCBjbGllbnRNZXNzYWdlSWQ6IGlucHV0LmNsaWVudE1lc3NhZ2VJZCxcbiAgICAgIGNvbnRlbnQ6IGlucHV0LmNvbnRlbnQsIGNvbnRlbnRSZXZpc2lvbjogMSwgY29udmVyc2F0aW9uSWQ6IGlucHV0LmNvbnZlcnNhdGlvbklkLCBkZWxldGVkOiBmYWxzZSxcbiAgICAgIG1vYmlsZUNvbnRlbnRWZXJzaW9uOiBjb250ZW50VmVyc2lvbiwgbW9iaWxlRGVjaXNpb246IHByb2plY3Rpb24uZGVjaXNpb24sXG4gICAgICBtb2JpbGVQbGF0Zm9ybURpc3Bvc2l0aW9uOiBwcm9qZWN0aW9uLnBsYXRmb3JtRGlzcG9zaXRpb24gfHwgJ2FsbG93ZWQnLCBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgcmVwbHlUb01lc3NhZ2VJZDogaW5wdXQucmVwbHlUb01lc3NhZ2VJZCwgcmV2aXNpb246IDEsIHNlbmRlclBlcnNvbmFJZDogaG9va3MuaWRlbnRpdHkucGVyc29uYUlkLFxuICAgICAgc2VxdWVuY2U6IHNlcXVlbmNlISwgdXNlcklkOiBob29rcy5pZGVudGl0eS51c2VySWR9O1xuICAgIGlmKGF3YWl0IHJlYWQ8Ym9vbGVhbj4oJ0lOU0VSVCBAcmVjb3JkIElOIG1lc3NhZ2VzIFJFVFVSTiB0cnVlJywge3JlY29yZH0pICE9PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCd1bmF2YWlsYWJsZScpO1xuICAgIH1cbiAgICBhd2FpdCBob29rcy5hcHBlbmRFdmVudChyZWFkLCB7YWN0b3JQZXJzb25hSWQ6IGhvb2tzLmlkZW50aXR5LnBlcnNvbmFJZCwgY29udmVyc2F0aW9uSWQ6IGlucHV0LmNvbnZlcnNhdGlvbklkLFxuICAgICAga2luZDogJ21lc3NhZ2UuY2hhbmdlZCcsIG1lbWJlcnNoaXBFcG9jaDogbWVtYmVyc2hpcC5lcG9jaCwgcmVzb3VyY2VJZDogbWVzc2FnZUlkLCByZXZpc2lvbjogMX0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtjbGllbnRNZXNzYWdlSWQ6IGlucHV0LmNsaWVudE1lc3NhZ2VJZCwgbWVzc2FnZUlkLCByZXZpc2lvbjogMSwgc2VxdWVuY2U6IHNlcXVlbmNlIX07XG4gICAgaWYoYXdhaXQgcmVxdWVzdC5zYXZlKHJlc3VsdCkgIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ3VuYXZhaWxhYmxlJyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xuICBjb25zdCBtdXRhdGVNZXNzYWdlID0gKFxuICAgIGlucHV0OiBEdXJhYmxlRWRpdE1lc3NhZ2VJbnB1dCB8IER1cmFibGVEZWxldGVNZXNzYWdlSW5wdXQsIHJlbW92ZTogYm9vbGVhblxuICApOiBQcm9taXNlPER1cmFibGVNZXNzYWdlTXV0YXRpb25SZXN1bHQ+ID0+IHJ1bihhc3luYyAocmVhZCkgPT4ge1xuICAgIHJlcXVpcmVWYWxpZChCb29sZWFuKGlucHV0KSAmJiBpc0NoYXRJZGVudGlmaWVyKGlucHV0LmNvbnZlcnNhdGlvbklkKSAmJiBpc0NoYXRJZGVudGlmaWVyKGlucHV0Lm1lc3NhZ2VJZClcbiAgICAgICYmIGlzQ2hhdElkZW50aWZpZXIoaW5wdXQuaWRlbXBvdGVuY3lLZXkpICYmIE51bWJlci5pc1NhZmVJbnRlZ2VyKGlucHV0LmV4cGVjdGVkUmV2aXNpb24pXG4gICAgICAmJiBpbnB1dC5leHBlY3RlZFJldmlzaW9uID49IDEgJiYgKHJlbW92ZSB8fCAoJ2NvbnRlbnQnIGluIGlucHV0ICYmIHZhbGlkVGV4dChpbnB1dC5jb250ZW50KSkpKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgcmVjZWlwdDxEdXJhYmxlTWVzc2FnZU11dGF0aW9uUmVzdWx0PihyZWFkLCByZW1vdmUgPyAnZGVsZXRlJyA6ICdlZGl0JyxcbiAgICAgIGlucHV0LmNvbnZlcnNhdGlvbklkLCBpbnB1dC5pZGVtcG90ZW5jeUtleSwgaW5wdXQpO1xuICAgIGlmKHJlcXVlc3QucHJpb3IpIHtcbiAgICAgIHJldHVybiByZXF1ZXN0LnByaW9yO1xuICAgIH1cbiAgICBjb25zdCBtZW1iZXJzaGlwID0gYXdhaXQgYXV0aG9yaXplKHJlYWQsIGlucHV0LmNvbnZlcnNhdGlvbklkLCAnc2VuZCcpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCByZWFkRHVyYWJsZU1lc3NhZ2U8VERlY2lzaW9uPihyZWFkLCBpbnB1dC5jb252ZXJzYXRpb25JZCwgaW5wdXQubWVzc2FnZUlkKTtcbiAgICBpZihtZXNzYWdlLnNlbmRlclBlcnNvbmFJZCAhPT0gaG9va3MuaWRlbnRpdHkucGVyc29uYUlkIHx8IG1lc3NhZ2UudXNlcklkICE9PSBob29rcy5pZGVudGl0eS51c2VySWRcbiAgICAgIHx8IG1lc3NhZ2Uuc2VxdWVuY2UgPCBtZW1iZXJzaGlwLmpvaW5TZXF1ZW5jZSB8fCBtZXNzYWdlLmRlbGV0ZWQgfHwgbWVzc2FnZS5tb2JpbGVQbGF0Zm9ybURpc3Bvc2l0aW9uICE9PSAnYWxsb3dlZCcpIHtcbiAgICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ2ZvcmJpZGRlbicpO1xuICAgIH1cbiAgICBpZihtZXNzYWdlLnJldmlzaW9uICE9PSBpbnB1dC5leHBlY3RlZFJldmlzaW9uIHx8ICghcmVtb3ZlICYmIG5vdygpIC0gbWVzc2FnZS5hZGRlZCA+IDE1ICogNjAwMDApKSB7XG4gICAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCdjb25mbGljdCcpO1xuICAgIH1cbiAgICBhd2FpdCByYXRlTGltaXQocmVhZCwgcmVtb3ZlID8gJ2RlbGV0ZScgOiAnZWRpdCcsIDYwKTtcbiAgICBjb25zdCBjb250ZW50ID0gIXJlbW92ZSAmJiAnY29udGVudCcgaW4gaW5wdXQgPyBpbnB1dC5jb250ZW50IDogJyc7XG4gICAgY29uc3QgcmV2aXNpb24gPSBtZXNzYWdlLnJldmlzaW9uICsgMTtcbiAgICBjb25zdCBjb250ZW50UmV2aXNpb24gPSBtZXNzYWdlLmNvbnRlbnRSZXZpc2lvbiArIDE7XG4gICAgY29uc3QgY29udGVudFZlcnNpb24gPSBoYXNoKFttZXNzYWdlLl9rZXksIGNvbnRlbnRSZXZpc2lvbiwgY29udGVudF0pO1xuICAgIGNvbnN0IHByb2plY3Rpb24gPSBhd2FpdCBob29rcy5jbGFzc2lmeUNvbnRlbnQoe2NvbnRlbnQ6IGNvbnRlbnQgfHwgJyAnLCBjb250ZW50VmVyc2lvbn0pO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCByZWFkPGJvb2xlYW4+KGBGT1IgY3VycmVudCBJTiBtZXNzYWdlc1xuICAgICAgRklMVEVSIGN1cnJlbnQuX2tleSA9PSBAaWQgQU5EIGN1cnJlbnQucmV2aXNpb24gPT0gQGV4cGVjdGVkUmV2aXNpb25cbiAgICAgIFVQREFURSBjdXJyZW50IFdJVEgge2NvbnRlbnQ6IEBjb250ZW50LCBjb250ZW50UmV2aXNpb246IEBjb250ZW50UmV2aXNpb24sIGRlbGV0ZWQ6IEBkZWxldGVkLFxuICAgICAgICBhdHRhY2htZW50SWRzOiBAYXR0YWNobWVudElkcywgYXR0YWNobWVudHM6IEBhdHRhY2htZW50cywgcmVwbHlUb01lc3NhZ2VJZDogQHJlcGx5LFxuICAgICAgICBtb2JpbGVDb250ZW50VmVyc2lvbjogQGNvbnRlbnRWZXJzaW9uLCBtb2JpbGVEZWNpc2lvbjogQGRlY2lzaW9uLFxuICAgICAgICBtb2JpbGVQbGF0Zm9ybURpc3Bvc2l0aW9uOiBAcGxhdGZvcm1EaXNwb3NpdGlvbiwgbW9kaWZpZWQ6IEBub3csIHJldmlzaW9uOiBAcmV2aXNpb259XG4gICAgICBJTiBtZXNzYWdlcyBSRVRVUk4gdHJ1ZWAsIHthdHRhY2htZW50SWRzOiByZW1vdmUgPyBbXSA6IG1lc3NhZ2UuYXR0YWNobWVudElkcyxcbiAgICAgIGF0dGFjaG1lbnRzOiByZW1vdmUgPyBbXSA6IG1lc3NhZ2UuYXR0YWNobWVudHMsIGNvbnRlbnQsIGNvbnRlbnRSZXZpc2lvbiwgY29udGVudFZlcnNpb24sXG4gICAgICBkZWNpc2lvbjogcHJvamVjdGlvbi5kZWNpc2lvbiwgZGVsZXRlZDogcmVtb3ZlLCBleHBlY3RlZFJldmlzaW9uOiBpbnB1dC5leHBlY3RlZFJldmlzaW9uLCBpZDogbWVzc2FnZS5fa2V5LFxuICAgICAgbm93OiBub3coKSwgcGxhdGZvcm1EaXNwb3NpdGlvbjogcHJvamVjdGlvbi5wbGF0Zm9ybURpc3Bvc2l0aW9uIHx8ICdhbGxvd2VkJyxcbiAgICAgIHJlcGx5OiByZW1vdmUgPyBudWxsIDogbWVzc2FnZS5yZXBseVRvTWVzc2FnZUlkIHx8IG51bGwsIHJldmlzaW9ufSk7XG4gICAgaWYodXBkYXRlZCAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IENoYXRFcnJvcignY29uZmxpY3QnKTtcbiAgICB9XG4gICAgYXdhaXQgaG9va3MuYXBwZW5kRXZlbnQocmVhZCwge2FjdG9yUGVyc29uYUlkOiBob29rcy5pZGVudGl0eS5wZXJzb25hSWQsIGNvbnZlcnNhdGlvbklkOiBpbnB1dC5jb252ZXJzYXRpb25JZCxcbiAgICAgIGtpbmQ6ICdtZXNzYWdlLmNoYW5nZWQnLCBtZW1iZXJzaGlwRXBvY2g6IG1lbWJlcnNoaXAuZXBvY2gsIHJlc291cmNlSWQ6IG1lc3NhZ2UuX2tleSwgcmV2aXNpb259KTtcbiAgICBjb25zdCByZXN1bHQgPSB7bWVzc2FnZUlkOiBtZXNzYWdlLl9rZXksIHJldmlzaW9uLCBzZXF1ZW5jZTogbWVzc2FnZS5zZXF1ZW5jZX07XG4gICAgaWYoYXdhaXQgcmVxdWVzdC5zYXZlKHJlc3VsdCkgIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ3VuYXZhaWxhYmxlJyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xuICByZXR1cm4ge2F1dGhvcml6ZSwgZGVsZXRlTWVzc2FnZTogKGlucHV0OiBEdXJhYmxlRGVsZXRlTWVzc2FnZUlucHV0KSA9PiBtdXRhdGVNZXNzYWdlKGlucHV0LCB0cnVlKSxcbiAgICBlZGl0TWVzc2FnZTogKGlucHV0OiBEdXJhYmxlRWRpdE1lc3NhZ2VJbnB1dCkgPT4gbXV0YXRlTWVzc2FnZShpbnB1dCwgZmFsc2UpLCByYXRlTGltaXQsIHJlY2VpcHQsIHJ1biwgc2VuZE1lc3NhZ2V9O1xufTtcblxuZXhwb3J0IHR5cGUgRHVyYWJsZU1lc3NhZ2VQZXJzaXN0ZW5jZTxURGVjaXNpb24gPSB1bmtub3duPiA9XG4gIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUR1cmFibGVNZXNzYWdlUGVyc2lzdGVuY2U8VERlY2lzaW9uPj47XG4iXSwibmFtZXMiOlsiY3JlYXRlSGFzaCIsInJhbmRvbVVVSUQiLCJDaGF0RXJyb3IiLCJpc0NoYXRJZGVudGlmaWVyIiwiZGVmYXVsdEhhc2giLCJ2YWx1ZSIsInVwZGF0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkaWdlc3QiLCJ2YWxpZFRleHQiLCJjb250ZW50IiwiQXJyYXkiLCJmcm9tIiwibGVuZ3RoIiwidGVzdCIsInJlcXVpcmVWYWxpZCIsInZhbGlkIiwicmVhZER1cmFibGVNZXNzYWdlIiwicmVhZCIsImNvbnZlcnNhdGlvbklkIiwibWVzc2FnZUlkIiwibWVzc2FnZSIsImNoYXRTY2hlbWFWZXJzaW9uIiwiY3JlYXRlRHVyYWJsZU1lc3NhZ2VQZXJzaXN0ZW5jZSIsImhvb2tzIiwiaGFzaCIsIm5vdyIsIkRhdGUiLCJ1dWlkIiwiYXV0aG9yaXplIiwicHVycG9zZSIsIm1lbWJlcnNoaXAiLCJhdXRob3JpemVNZW1iZXJzaGlwIiwiaWRlbnRpdHkiLCJsZWdhY3kiLCJyZWNlaXB0IiwiYWN0aW9uIiwia2V5IiwicGF5bG9hZCIsInJlcXVlc3RJZCIsInBlcnNvbmFJZCIsInBheWxvYWRIYXNoIiwicmVjb3JkIiwidXNlcklkIiwicHJpb3IiLCJyZXN1bHQiLCJzYXZlIiwiX2tleSIsImFkZGVkIiwicmF0ZUxpbWl0IiwibGltaXQiLCJpbnRlcnZhbCIsIk1hdGgiLCJmbG9vciIsImFsbG93ZWQiLCJydW4iLCJvcGVyYXRpb24iLCJ3cml0ZSIsImF1dGhvcml6ZUlkZW50aXR5Iiwic2VuZE1lc3NhZ2UiLCJpbnB1dCIsIkJvb2xlYW4iLCJjbGllbnRNZXNzYWdlSWQiLCJzZW5kZXJQZXJzb25hSWQiLCJpc0FycmF5IiwiYXR0YWNobWVudElkcyIsImV2ZXJ5IiwiU2V0Iiwic2l6ZSIsInRyaW0iLCJyZXBseVRvTWVzc2FnZUlkIiwidW5kZWZpbmVkIiwicmVxdWVzdCIsImF0dGFjaG1lbnRzIiwiaW1hZ2VJZCIsInB1c2giLCJhdXRob3JpemVBdHRhY2htZW50IiwicXVvdGVkIiwiYXV0aG9yaXplTWVzc2FnZVZpc2libGUiLCJkZWxldGVkIiwibW9iaWxlUGxhdGZvcm1EaXNwb3NpdGlvbiIsInRpbWVzdGFtcCIsInNlcXVlbmNlIiwiaWQiLCJOdW1iZXIiLCJpc1NhZmVJbnRlZ2VyIiwiY29udGVudFZlcnNpb24iLCJwcm9qZWN0aW9uIiwiY2xhc3NpZnlDb250ZW50IiwiY29udGVudFJldmlzaW9uIiwibW9iaWxlQ29udGVudFZlcnNpb24iLCJtb2JpbGVEZWNpc2lvbiIsImRlY2lzaW9uIiwicGxhdGZvcm1EaXNwb3NpdGlvbiIsIm1vZGlmaWVkIiwicmV2aXNpb24iLCJhcHBlbmRFdmVudCIsImFjdG9yUGVyc29uYUlkIiwia2luZCIsIm1lbWJlcnNoaXBFcG9jaCIsImVwb2NoIiwicmVzb3VyY2VJZCIsIm11dGF0ZU1lc3NhZ2UiLCJyZW1vdmUiLCJpZGVtcG90ZW5jeUtleSIsImV4cGVjdGVkUmV2aXNpb24iLCJqb2luU2VxdWVuY2UiLCJ1cGRhdGVkIiwicmVwbHkiLCJkZWxldGVNZXNzYWdlIiwiZWRpdE1lc3NhZ2UiXSwibWFwcGluZ3MiOiJBQUFBLDJHQUEyRyxHQUMzRyxTQUFRQSxVQUFVLEVBQUVDLFVBQVUsUUFBTyxjQUFjO0FBRW5ELFNBQVFDLFNBQVMsUUFBTyxjQUFjO0FBQ3RDLFNBQVFDLGdCQUFnQixRQUFPLGtCQUFrQjtBQVFqRCxNQUFNQyxjQUFjLENBQUNDLFFBQTJCTCxXQUFXLFVBQVVNLE1BQU0sQ0FBQ0MsS0FBS0MsU0FBUyxDQUFDSCxRQUFRSSxNQUFNLENBQUM7QUFDMUcsTUFBTUMsWUFBWSxDQUFDQyxVQUF3QyxPQUFPQSxZQUFZLFlBQ3pFQyxNQUFNQyxJQUFJLENBQUNGLFNBQVNHLE1BQU0sSUFBSSxRQUM5QixDQUFDLGdGQUFnRkMsSUFBSSxDQUFDSjtBQUMzRixNQUFNSyxlQUFlLENBQUNDO0lBQ3BCLElBQUcsQ0FBQ0EsT0FBTztRQUNULE1BQU0sSUFBSWYsVUFBVTtJQUN0QjtBQUNGO0FBRUEsT0FBTyxNQUFNZ0IscUJBQXFCLE9BQ2hDQyxNQUFpQkMsZ0JBQXdCQztJQUV6QyxNQUFNQyxVQUFVLE1BQU1ILEtBQW9DLDJDQUEyQztRQUFDRTtJQUFTO0lBQy9HLElBQUcsQ0FBQ0MsV0FBV0EsUUFBUUYsY0FBYyxLQUFLQSxrQkFBa0JFLFFBQVFDLGlCQUFpQixLQUFLLEdBQUc7UUFDM0YsTUFBTSxJQUFJckIsVUFBVTtJQUN0QjtJQUNBLE9BQU9vQjtBQUNULEVBQUU7QUFFRixPQUFP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
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ApiContext } from '../types/auth.types.js';
|
|
2
|
+
import type { ChatQuery } from './membership.js';
|
|
3
|
+
export interface DurableTransactionCollections {
|
|
4
|
+
readonly exclusive?: readonly string[];
|
|
5
|
+
readonly read?: readonly string[];
|
|
6
|
+
readonly write?: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
export declare const createDurableQuery: (context: ApiContext) => ChatQuery;
|
|
9
|
+
/** Injected queries retain caller-owned transaction lifecycle; never fall back to another connection. */
|
|
10
|
+
export declare const createDurableTransaction: (context: ApiContext, collections: DurableTransactionCollections, query?: ChatQuery) => <T>(operation: (read: ChatQuery) => Promise<T>) => Promise<T>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { useDb } from '../utils/arangodbUtils.js';
|
|
2
|
+
export const createDurableQuery = (context)=>{
|
|
3
|
+
const db = useDb(context.databaseName);
|
|
4
|
+
return async (query, bindVars)=>{
|
|
5
|
+
const cursor = await db.query({
|
|
6
|
+
bindVars,
|
|
7
|
+
query
|
|
8
|
+
});
|
|
9
|
+
return cursor.next();
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
/** Injected queries retain caller-owned transaction lifecycle; never fall back to another connection. */ export const createDurableTransaction = (context, collections, query)=>{
|
|
13
|
+
if (query) {
|
|
14
|
+
return (operation)=>operation(query);
|
|
15
|
+
}
|
|
16
|
+
const db = useDb(context.databaseName);
|
|
17
|
+
return async (operation)=>{
|
|
18
|
+
const transaction = await db.beginTransaction({
|
|
19
|
+
exclusive: [
|
|
20
|
+
...collections.exclusive || []
|
|
21
|
+
],
|
|
22
|
+
read: [
|
|
23
|
+
...collections.read || []
|
|
24
|
+
],
|
|
25
|
+
write: [
|
|
26
|
+
...collections.write || []
|
|
27
|
+
]
|
|
28
|
+
}, {
|
|
29
|
+
allowImplicit: false,
|
|
30
|
+
lockTimeout: 5,
|
|
31
|
+
waitForSync: true
|
|
32
|
+
});
|
|
33
|
+
const read = async (query, bindVars)=>{
|
|
34
|
+
const cursor = await transaction.step(()=>db.query({
|
|
35
|
+
bindVars,
|
|
36
|
+
query
|
|
37
|
+
}));
|
|
38
|
+
return cursor.next();
|
|
39
|
+
};
|
|
40
|
+
try {
|
|
41
|
+
const result = await operation(read);
|
|
42
|
+
await transaction.commit();
|
|
43
|
+
return result;
|
|
44
|
+
} catch (error) {
|
|
45
|
+
try {
|
|
46
|
+
await transaction.abort();
|
|
47
|
+
} catch {}
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvZHVyYWJsZUNoYXQvdHJhbnNhY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtDaGF0UXVlcnl9IGZyb20gJy4vbWVtYmVyc2hpcC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHVyYWJsZVRyYW5zYWN0aW9uQ29sbGVjdGlvbnMge1xuICByZWFkb25seSBleGNsdXNpdmU/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcmVhZD86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSB3cml0ZT86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlRHVyYWJsZVF1ZXJ5ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBDaGF0UXVlcnkgPT4ge1xuICBjb25zdCBkYiA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgcmV0dXJuIGFzeW5jIDxUPihxdWVyeTogc3RyaW5nLCBiaW5kVmFyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICBjb25zdCBjdXJzb3IgPSBhd2FpdCBkYi5xdWVyeTxUPih7YmluZFZhcnMsIHF1ZXJ5fSk7XG4gICAgcmV0dXJuIGN1cnNvci5uZXh0KCk7XG4gIH07XG59O1xuXG4vKiogSW5qZWN0ZWQgcXVlcmllcyByZXRhaW4gY2FsbGVyLW93bmVkIHRyYW5zYWN0aW9uIGxpZmVjeWNsZTsgbmV2ZXIgZmFsbCBiYWNrIHRvIGFub3RoZXIgY29ubmVjdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVEdXJhYmxlVHJhbnNhY3Rpb24gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsIGNvbGxlY3Rpb25zOiBEdXJhYmxlVHJhbnNhY3Rpb25Db2xsZWN0aW9ucywgcXVlcnk/OiBDaGF0UXVlcnlcbikgPT4ge1xuICBpZihxdWVyeSkge1xuICAgIHJldHVybiA8VD4ob3BlcmF0aW9uOiAocmVhZDogQ2hhdFF1ZXJ5KSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiA9PiBvcGVyYXRpb24ocXVlcnkpO1xuICB9XG4gIGNvbnN0IGRiID0gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpO1xuICByZXR1cm4gYXN5bmMgPFQ+KG9wZXJhdGlvbjogKHJlYWQ6IENoYXRRdWVyeSkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4gPT4ge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgZGIuYmVnaW5UcmFuc2FjdGlvbih7XG4gICAgICBleGNsdXNpdmU6IFsuLi4oY29sbGVjdGlvbnMuZXhjbHVzaXZlIHx8IFtdKV0sIHJlYWQ6IFsuLi4oY29sbGVjdGlvbnMucmVhZCB8fCBbXSldLFxuICAgICAgd3JpdGU6IFsuLi4oY29sbGVjdGlvbnMud3JpdGUgfHwgW10pXVxuICAgIH0sIHthbGxvd0ltcGxpY2l0OiBmYWxzZSwgbG9ja1RpbWVvdXQ6IDUsIHdhaXRGb3JTeW5jOiB0cnVlfSk7XG4gICAgY29uc3QgcmVhZDogQ2hhdFF1ZXJ5ID0gYXN5bmMgPFI+KHF1ZXJ5OiBzdHJpbmcsIGJpbmRWYXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgY29uc3QgY3Vyc29yID0gYXdhaXQgdHJhbnNhY3Rpb24uc3RlcCgoKSA9PiBkYi5xdWVyeTxSPih7YmluZFZhcnMsIHF1ZXJ5fSkpO1xuICAgICAgcmV0dXJuIGN1cnNvci5uZXh0KCk7XG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9uKHJlYWQpO1xuICAgICAgYXdhaXQgdHJhbnNhY3Rpb24uY29tbWl0KCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRyYW5zYWN0aW9uLmFib3J0KCk7XG4gICAgICB9IGNhdGNoeyAvKiBQcmVzZXJ2ZSBvcmlnaW5hbC9hbWJpZ3VvdXMgY29tbWl0IGVycm9yOyBuZXZlciByZXRyeSBtdXRhdGlvbnMuICovIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcbn07XG4iXSwibmFtZXMiOlsidXNlRGIiLCJjcmVhdGVEdXJhYmxlUXVlcnkiLCJjb250ZXh0IiwiZGIiLCJkYXRhYmFzZU5hbWUiLCJxdWVyeSIsImJpbmRWYXJzIiwiY3Vyc29yIiwibmV4dCIsImNyZWF0ZUR1cmFibGVUcmFuc2FjdGlvbiIsImNvbGxlY3Rpb25zIiwib3BlcmF0aW9uIiwidHJhbnNhY3Rpb24iLCJiZWdpblRyYW5zYWN0aW9uIiwiZXhjbHVzaXZlIiwicmVhZCIsIndyaXRlIiwiYWxsb3dJbXBsaWNpdCIsImxvY2tUaW1lb3V0Iiwid2FpdEZvclN5bmMiLCJzdGVwIiwicmVzdWx0IiwiY29tbWl0IiwiZXJyb3IiLCJhYm9ydCJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUUEsS0FBSyxRQUFPLDRCQUE0QjtBQVdoRCxPQUFPLE1BQU1DLHFCQUFxQixDQUFDQztJQUNqQyxNQUFNQyxLQUFLSCxNQUFNRSxRQUFRRSxZQUFZO0lBQ3JDLE9BQU8sT0FBVUMsT0FBZUM7UUFDOUIsTUFBTUMsU0FBUyxNQUFNSixHQUFHRSxLQUFLLENBQUk7WUFBQ0M7WUFBVUQ7UUFBSztRQUNqRCxPQUFPRSxPQUFPQyxJQUFJO0lBQ3BCO0FBQ0YsRUFBRTtBQUVGLHVHQUF1RyxHQUN2RyxPQUFPLE1BQU1DLDJCQUEyQixDQUN0Q1AsU0FBcUJRLGFBQTRDTDtJQUVqRSxJQUFHQSxPQUFPO1FBQ1IsT0FBTyxDQUFJTSxZQUEyREEsVUFBVU47SUFDbEY7SUFDQSxNQUFNRixLQUFLSCxNQUFNRSxRQUFRRSxZQUFZO0lBQ3JDLE9BQU8sT0FBVU87UUFDZixNQUFNQyxjQUFjLE1BQU1ULEdBQUdVLGdCQUFnQixDQUFDO1lBQzVDQyxXQUFXO21CQUFLSixZQUFZSSxTQUFTLElBQUksRUFBRTthQUFFO1lBQUVDLE1BQU07bUJBQUtMLFlBQVlLLElBQUksSUFBSSxFQUFFO2FBQUU7WUFDbEZDLE9BQU87bUJBQUtOLFlBQVlNLEtBQUssSUFBSSxFQUFFO2FBQUU7UUFDdkMsR0FBRztZQUFDQyxlQUFlO1lBQU9DLGFBQWE7WUFBR0MsYUFBYTtRQUFJO1FBQzNELE1BQU1KLE9BQWtCLE9BQVVWLE9BQWVDO1lBQy9DLE1BQU1DLFNBQVMsTUFBTUssWUFBWVEsSUFBSSxDQUFDLElBQU1qQixHQUFHRSxLQUFLLENBQUk7b0JBQUNDO29CQUFVRDtnQkFBSztZQUN4RSxPQUFPRSxPQUFPQyxJQUFJO1FBQ3BCO1FBQ0EsSUFBSTtZQUNGLE1BQU1hLFNBQVMsTUFBTVYsVUFBVUk7WUFDL0IsTUFBTUgsWUFBWVUsTUFBTTtZQUN4QixPQUFPRDtRQUNULEVBQUUsT0FBTUUsT0FBTztZQUNiLElBQUk7Z0JBQ0YsTUFBTVgsWUFBWVksS0FBSztZQUN6QixFQUFFLE9BQUssQ0FBeUU7WUFDaEYsTUFBTUQ7UUFDUjtJQUNGO0FBQ0YsRUFBRSJ9
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export type ConversationKind = 'direct' | 'group';
|
|
2
|
+
export type ConversationState = 'active' | 'closed' | 'forming';
|
|
3
|
+
export type MembershipRole = 'admin' | 'member' | 'owner';
|
|
4
|
+
export type MembershipState = 'active' | 'left' | 'removed';
|
|
5
|
+
/** An epoch is a grant for a bounded history interval, never a client-selected identity. */
|
|
6
|
+
export interface ConversationMembership {
|
|
7
|
+
readonly conversationId: string;
|
|
8
|
+
readonly epoch: string;
|
|
9
|
+
readonly joinSequence: number;
|
|
10
|
+
readonly leftSequence?: number;
|
|
11
|
+
readonly personaId: string;
|
|
12
|
+
readonly revision: number;
|
|
13
|
+
readonly role: MembershipRole;
|
|
14
|
+
readonly state: MembershipState;
|
|
15
|
+
}
|
|
16
|
+
/** Names must pass the caller's audience projection before being serialized. */
|
|
17
|
+
export interface ConversationSummary {
|
|
18
|
+
readonly activeMemberCount: number;
|
|
19
|
+
readonly conversationId: string;
|
|
20
|
+
readonly kind: ConversationKind;
|
|
21
|
+
readonly membership: ConversationMembership;
|
|
22
|
+
readonly membershipRevision: number;
|
|
23
|
+
readonly name?: string;
|
|
24
|
+
readonly state: ConversationState;
|
|
25
|
+
}
|
|
26
|
+
export interface ConversationInvite {
|
|
27
|
+
readonly conversationId: string;
|
|
28
|
+
readonly expiresAt: number;
|
|
29
|
+
readonly inviteId: string;
|
|
30
|
+
readonly invitedByPersonaId: string;
|
|
31
|
+
readonly revision: number;
|
|
32
|
+
readonly state: 'accepted' | 'declined' | 'expired' | 'pending' | 'revoked';
|
|
33
|
+
}
|
|
34
|
+
export interface CreateDirectInput {
|
|
35
|
+
readonly participantPersonaId: string;
|
|
36
|
+
}
|
|
37
|
+
export interface CreateGroupInput {
|
|
38
|
+
readonly idempotencyKey: string;
|
|
39
|
+
readonly memberPersonaIds: readonly string[];
|
|
40
|
+
readonly name: string;
|
|
41
|
+
}
|
|
42
|
+
export interface InviteMemberInput {
|
|
43
|
+
readonly conversationId: string;
|
|
44
|
+
readonly expectedRevision: number;
|
|
45
|
+
readonly idempotencyKey: string;
|
|
46
|
+
readonly personaId: string;
|
|
47
|
+
}
|
|
48
|
+
export interface AcceptInviteInput {
|
|
49
|
+
readonly expectedRevision: number;
|
|
50
|
+
readonly idempotencyKey: string;
|
|
51
|
+
readonly inviteId: string;
|
|
52
|
+
}
|
|
53
|
+
export type DeclineInviteInput = AcceptInviteInput;
|
|
54
|
+
export interface ChangeMemberRoleInput {
|
|
55
|
+
readonly conversationId: string;
|
|
56
|
+
readonly expectedRevision: number;
|
|
57
|
+
readonly idempotencyKey: string;
|
|
58
|
+
readonly personaId: string;
|
|
59
|
+
readonly role: Exclude<MembershipRole, 'owner'>;
|
|
60
|
+
}
|
|
61
|
+
export interface RemoveMemberInput {
|
|
62
|
+
readonly conversationId: string;
|
|
63
|
+
readonly expectedRevision: number;
|
|
64
|
+
readonly idempotencyKey: string;
|
|
65
|
+
readonly personaId: string;
|
|
66
|
+
}
|
|
67
|
+
export interface LeaveConversationInput {
|
|
68
|
+
readonly conversationId: string;
|
|
69
|
+
readonly expectedRevision: number;
|
|
70
|
+
readonly idempotencyKey: string;
|
|
71
|
+
}
|
|
72
|
+
export type TransferOwnershipInput = RemoveMemberInput;
|
|
73
|
+
export interface ChatEvent {
|
|
74
|
+
readonly conversationId: string;
|
|
75
|
+
readonly eventId: string;
|
|
76
|
+
readonly eventSequence: number;
|
|
77
|
+
readonly kind: 'membership.changed' | 'message.changed' | 'receipt.changed';
|
|
78
|
+
readonly resourceId: string;
|
|
79
|
+
readonly revision: number;
|
|
80
|
+
}
|
|
81
|
+
export type { AuthorizedMembership, ChatIdentity, ChatQuery, MembershipAccessInput } from './membership.js';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { };
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvZHVyYWJsZUNoYXQvdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQ29udmVyc2F0aW9uS2luZCA9ICdkaXJlY3QnIHwgJ2dyb3VwJztcbmV4cG9ydCB0eXBlIENvbnZlcnNhdGlvblN0YXRlID0gJ2FjdGl2ZScgfCAnY2xvc2VkJyB8ICdmb3JtaW5nJztcbmV4cG9ydCB0eXBlIE1lbWJlcnNoaXBSb2xlID0gJ2FkbWluJyB8ICdtZW1iZXInIHwgJ293bmVyJztcbmV4cG9ydCB0eXBlIE1lbWJlcnNoaXBTdGF0ZSA9ICdhY3RpdmUnIHwgJ2xlZnQnIHwgJ3JlbW92ZWQnO1xuXG4vKiogQW4gZXBvY2ggaXMgYSBncmFudCBmb3IgYSBib3VuZGVkIGhpc3RvcnkgaW50ZXJ2YWwsIG5ldmVyIGEgY2xpZW50LXNlbGVjdGVkIGlkZW50aXR5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb252ZXJzYXRpb25NZW1iZXJzaGlwIHtcbiAgcmVhZG9ubHkgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZXBvY2g6IHN0cmluZztcbiAgcmVhZG9ubHkgam9pblNlcXVlbmNlOiBudW1iZXI7XG4gIHJlYWRvbmx5IGxlZnRTZXF1ZW5jZT86IG51bWJlcjtcbiAgcmVhZG9ubHkgcGVyc29uYUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IHJvbGU6IE1lbWJlcnNoaXBSb2xlO1xuICByZWFkb25seSBzdGF0ZTogTWVtYmVyc2hpcFN0YXRlO1xufVxuXG4vKiogTmFtZXMgbXVzdCBwYXNzIHRoZSBjYWxsZXIncyBhdWRpZW5jZSBwcm9qZWN0aW9uIGJlZm9yZSBiZWluZyBzZXJpYWxpemVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb252ZXJzYXRpb25TdW1tYXJ5IHtcbiAgcmVhZG9ubHkgYWN0aXZlTWVtYmVyQ291bnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkga2luZDogQ29udmVyc2F0aW9uS2luZDtcbiAgcmVhZG9ubHkgbWVtYmVyc2hpcDogQ29udmVyc2F0aW9uTWVtYmVyc2hpcDtcbiAgcmVhZG9ubHkgbWVtYmVyc2hpcFJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YXRlOiBDb252ZXJzYXRpb25TdGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb252ZXJzYXRpb25JbnZpdGUge1xuICByZWFkb25seSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBleHBpcmVzQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgaW52aXRlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgaW52aXRlZEJ5UGVyc29uYUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IHN0YXRlOiAnYWNjZXB0ZWQnIHwgJ2RlY2xpbmVkJyB8ICdleHBpcmVkJyB8ICdwZW5kaW5nJyB8ICdyZXZva2VkJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVEaXJlY3RJbnB1dCB7XG4gIHJlYWRvbmx5IHBhcnRpY2lwYW50UGVyc29uYUlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlR3JvdXBJbnB1dCB7XG4gIHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1lbWJlclBlcnNvbmFJZHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52aXRlTWVtYmVySW5wdXQge1xuICByZWFkb25seSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBleHBlY3RlZFJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBlcnNvbmFJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjY2VwdEludml0ZUlucHV0IHtcbiAgcmVhZG9ubHkgZXhwZWN0ZWRSZXZpc2lvbjogbnVtYmVyO1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleTogc3RyaW5nO1xuICByZWFkb25seSBpbnZpdGVJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBEZWNsaW5lSW52aXRlSW5wdXQgPSBBY2NlcHRJbnZpdGVJbnB1dDtcblxuZXhwb3J0IGludGVyZmFjZSBDaGFuZ2VNZW1iZXJSb2xlSW5wdXQge1xuICByZWFkb25seSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBleHBlY3RlZFJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBlcnNvbmFJZDogc3RyaW5nO1xuICByZWFkb25seSByb2xlOiBFeGNsdWRlPE1lbWJlcnNoaXBSb2xlLCAnb3duZXInPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZW1vdmVNZW1iZXJJbnB1dCB7XG4gIHJlYWRvbmx5IGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV4cGVjdGVkUmV2aXNpb246IG51bWJlcjtcbiAgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgcGVyc29uYUlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGVhdmVDb252ZXJzYXRpb25JbnB1dCB7XG4gIHJlYWRvbmx5IGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV4cGVjdGVkUmV2aXNpb246IG51bWJlcjtcbiAgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgVHJhbnNmZXJPd25lcnNoaXBJbnB1dCA9IFJlbW92ZU1lbWJlcklucHV0O1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRFdmVudCB7XG4gIHJlYWRvbmx5IGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV2ZW50SWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZXZlbnRTZXF1ZW5jZTogbnVtYmVyO1xuICByZWFkb25seSBraW5kOiAnbWVtYmVyc2hpcC5jaGFuZ2VkJyB8ICdtZXNzYWdlLmNoYW5nZWQnIHwgJ3JlY2VpcHQuY2hhbmdlZCc7XG4gIHJlYWRvbmx5IHJlc291cmNlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcmV2aXNpb246IG51bWJlcjtcbn1cblxuXG5leHBvcnQgdHlwZSB7QXV0aG9yaXplZE1lbWJlcnNoaXAsIENoYXRJZGVudGl0eSwgQ2hhdFF1ZXJ5LCBNZW1iZXJzaGlwQWNjZXNzSW5wdXR9IGZyb20gJy4vbWVtYmVyc2hpcC5qcyc7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0ZBLFdBQTBHIn0=
|
package/lib/index.d.ts
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright (c) 2019-Present, Nitrogen Labs, Inc.
|
|
3
|
-
* All rights reserved. Use is subject to the accompanying commercial LICENSE.
|
|
4
|
-
*/
|
|
5
1
|
export { graphql, GraphQLBoolean, GraphQLFloat, GraphQLID, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLString, graphqlSync, printSchema } from 'graphql';
|
|
6
2
|
export type { ExecutionResult } from 'graphql';
|
|
7
3
|
export type { InputTypeComposer, ObjectTypeComposer } from 'graphql-compose';
|
|
@@ -9,6 +5,8 @@ export { schemaComposer } from 'graphql-compose';
|
|
|
9
5
|
export * from './actions/index.js';
|
|
10
6
|
export * from './adapters/index.js';
|
|
11
7
|
export * from './config.js';
|
|
8
|
+
export * from './durableChat/index.js';
|
|
9
|
+
export type { MembershipRole as DurableChatMembershipRole } from './durableChat/types.js';
|
|
12
10
|
export type { DatabaseConnectionMetadata, DatabaseCredentialIdentity, DatabaseCredentialRequest, DatabaseCredentialSecret, DatabaseEnvironment, DatabaseProvisioningLease } from './types/databaseCredentials.types.js';
|
|
13
11
|
export { getAppDatabaseName, getDatabaseCredentialIdentity, parseDatabaseCredentialSecret, toDatabaseConnectionMetadata } from './utils/databaseCredentials.js';
|
|
14
12
|
export { COLLECTIONS, ConnectionType as ConnectionTypes, DEFAULT_DOCUMENT_COLLECTIONS, DEFAULT_EDGE_COLLECTIONS, EDGES, PrivacyLevel, ReactionType } from './constants/collections.js';
|
|
@@ -28,3 +26,5 @@ export declare const reaktorSchema = "";
|
|
|
28
26
|
export declare const reaktorResolvers: import("graphql-compose/lib/SchemaComposer.js").GraphQLToolsResolveMethods<any>;
|
|
29
27
|
export * from './adapters/higgsfieldModelCatalog.js';
|
|
30
28
|
export * from './adapters/higgsfieldModels.js';
|
|
29
|
+
export * from './organizations/index.js';
|
|
30
|
+
export type { MembershipRole } from './organizations/types.js';
|
package/lib/index.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copyright (c) 2019-Present, Nitrogen Labs, Inc.
|
|
3
3
|
* All rights reserved. Use is subject to the accompanying commercial LICENSE.
|
|
4
|
-
*/
|
|
5
|
-
|
|
4
|
+
*/ import { schemaComposer } from 'graphql-compose';
|
|
5
|
+
export { graphql, GraphQLBoolean, GraphQLFloat, GraphQLID, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLString, graphqlSync, printSchema } from 'graphql';
|
|
6
6
|
export { schemaComposer } from 'graphql-compose';
|
|
7
7
|
export * from './actions/index.js';
|
|
8
8
|
export * from './adapters/index.js';
|
|
9
9
|
export * from './config.js';
|
|
10
|
+
export * from './durableChat/index.js';
|
|
10
11
|
export { getAppDatabaseName, getDatabaseCredentialIdentity, parseDatabaseCredentialSecret, toDatabaseConnectionMetadata } from './utils/databaseCredentials.js';
|
|
11
12
|
export { COLLECTIONS, ConnectionType as ConnectionTypes, DEFAULT_DOCUMENT_COLLECTIONS, DEFAULT_EDGE_COLLECTIONS, EDGES, PrivacyLevel, ReactionType } from './constants/collections.js';
|
|
12
13
|
export { notifyUser } from './lambdas/actions/websockets.js';
|
|
@@ -24,5 +25,6 @@ export const reaktorSchema = ''; // printSchema(schemaComposer.buildSchema());
|
|
|
24
25
|
export const reaktorResolvers = schemaComposer.getResolveMethods();
|
|
25
26
|
export * from './adapters/higgsfieldModelCatalog.js';
|
|
26
27
|
export * from './adapters/higgsfieldModels.js';
|
|
28
|
+
export * from './organizations/index.js';
|
|
27
29
|
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzIHN1YmplY3QgdG8gdGhlIGFjY29tcGFueWluZyBjb21tZXJjaWFsIExJQ0VOU0UuXG4gKi9cbmltcG9ydCB7c2NoZW1hQ29tcG9zZXJ9IGZyb20gJ2dyYXBocWwtY29tcG9zZSc7XG5cbmV4cG9ydCB7XG4gIGdyYXBocWwsIEdyYXBoUUxCb29sZWFuLFxuICBHcmFwaFFMRmxvYXQsXG4gIEdyYXBoUUxJRCxcbiAgR3JhcGhRTEludCxcbiAgR3JhcGhRTExpc3QsIEdyYXBoUUxOb25OdWxsLCBHcmFwaFFMT2JqZWN0VHlwZSwgR3JhcGhRTFN0cmluZywgZ3JhcGhxbFN5bmMsXG4gIHByaW50U2NoZW1hXG59IGZyb20gJ2dyYXBocWwnO1xuXG5cbmV4cG9ydCB0eXBlIHtFeGVjdXRpb25SZXN1bHR9IGZyb20gJ2dyYXBocWwnO1xuZXhwb3J0IHR5cGUge0lucHV0VHlwZUNvbXBvc2VyLCBPYmplY3RUeXBlQ29tcG9zZXJ9IGZyb20gJ2dyYXBocWwtY29tcG9zZSc7XG5cbmV4cG9ydCB7c2NoZW1hQ29tcG9zZXJ9IGZyb20gJ2dyYXBocWwtY29tcG9zZSc7XG5leHBvcnQgKiBmcm9tICcuL2FjdGlvbnMvaW5kZXguanMnO1xuZXhwb3J0ICogZnJvbSAnLi9hZGFwdGVycy9pbmRleC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbmZpZy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2R1cmFibGVDaGF0L2luZGV4LmpzJztcbmV4cG9ydCB0eXBlIHtNZW1iZXJzaGlwUm9sZSBhcyBEdXJhYmxlQ2hhdE1lbWJlcnNoaXBSb2xlfSBmcm9tICcuL2R1cmFibGVDaGF0L3R5cGVzLmpzJztcbmV4cG9ydCB0eXBlIHtEYXRhYmFzZUNvbm5lY3Rpb25NZXRhZGF0YSwgRGF0YWJhc2VDcmVkZW50aWFsSWRlbnRpdHksIERhdGFiYXNlQ3JlZGVudGlhbFJlcXVlc3QsIERhdGFiYXNlQ3JlZGVudGlhbFNlY3JldCwgRGF0YWJhc2VFbnZpcm9ubWVudCwgRGF0YWJhc2VQcm92aXNpb25pbmdMZWFzZX0gZnJvbSAnLi90eXBlcy9kYXRhYmFzZUNyZWRlbnRpYWxzLnR5cGVzLmpzJztcbmV4cG9ydCB7Z2V0QXBwRGF0YWJhc2VOYW1lLCBnZXREYXRhYmFzZUNyZWRlbnRpYWxJZGVudGl0eSwgcGFyc2VEYXRhYmFzZUNyZWRlbnRpYWxTZWNyZXQsIHRvRGF0YWJhc2VDb25uZWN0aW9uTWV0YWRhdGF9IGZyb20gJy4vdXRpbHMvZGF0YWJhc2VDcmVkZW50aWFscy5qcyc7XG5leHBvcnQge1xuICBDT0xMRUNUSU9OUyxcbiAgQ29ubmVjdGlvblR5cGUgYXMgQ29ubmVjdGlvblR5cGVzLFxuICBERUZBVUxUX0RPQ1VNRU5UX0NPTExFQ1RJT05TLFxuICBERUZBVUxUX0VER0VfQ09MTEVDVElPTlMsXG4gIEVER0VTLFxuICBQcml2YWN5TGV2ZWwsXG4gIFJlYWN0aW9uVHlwZVxufSBmcm9tICcuL2NvbnN0YW50cy9jb2xsZWN0aW9ucy5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENvbm5lY3Rpb25UeXBlVHlwZSBhcyBDb25uZWN0aW9uVHlwZVZhbHVlLFxuICBQcml2YWN5TGV2ZWxUeXBlLFxuICBSZWFjdGlvblR5cGVUeXBlXG59IGZyb20gJy4vY29uc3RhbnRzL2NvbGxlY3Rpb25zLmpzJztcbmV4cG9ydCB7bm90aWZ5VXNlcn0gZnJvbSAnLi9sYW1iZGFzL2FjdGlvbnMvd2Vic29ja2V0cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2hhbmRsZXJzL2dyYXBocWxIYW5kbGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbGFtYmRhcy9hdXRob3JpemVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbGFtYmRhcy9jb25uZWN0aW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbXV0YXRpb25zL2luZGV4LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vb2JqZWN0VHlwZXMvaW5kZXguanMnO1xuZXhwb3J0ICogZnJvbSAnLi9xdWVyaWVzL2luZGV4LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvaW5kZXguanMnO1xuZXhwb3J0ICogZnJvbSAnLi91cGxvYWQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9pbmRleC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3ZpZGVvUHJvY2Vzc2luZy5qcyc7XG5cbmV4cG9ydCBjb25zdCByZWFrdG9yU2NoZW1hID0gJyc7Ly8gcHJpbnRTY2hlbWEoc2NoZW1hQ29tcG9zZXIuYnVpbGRTY2hlbWEoKSk7XG5leHBvcnQgY29uc3QgcmVha3RvclJlc29sdmVycyA9IHNjaGVtYUNvbXBvc2VyLmdldFJlc29sdmVNZXRob2RzKCk7XG5cbmV4cG9ydCAqIGZyb20gJy4vYWRhcHRlcnMvaGlnZ3NmaWVsZE1vZGVsQ2F0YWxvZy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2FkYXB0ZXJzL2hpZ2dzZmllbGRNb2RlbHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9vcmdhbml6YXRpb25zL2luZGV4LmpzJztcbmV4cG9ydCB0eXBlIHtNZW1iZXJzaGlwUm9sZX0gZnJvbSAnLi9vcmdhbml6YXRpb25zL3R5cGVzLmpzJztcbiJdLCJuYW1lcyI6WyJzY2hlbWFDb21wb3NlciIsImdyYXBocWwiLCJHcmFwaFFMQm9vbGVhbiIsIkdyYXBoUUxGbG9hdCIsIkdyYXBoUUxJRCIsIkdyYXBoUUxJbnQiLCJHcmFwaFFMTGlzdCIsIkdyYXBoUUxOb25OdWxsIiwiR3JhcGhRTE9iamVjdFR5cGUiLCJHcmFwaFFMU3RyaW5nIiwiZ3JhcGhxbFN5bmMiLCJwcmludFNjaGVtYSIsImdldEFwcERhdGFiYXNlTmFtZSIsImdldERhdGFiYXNlQ3JlZGVudGlhbElkZW50aXR5IiwicGFyc2VEYXRhYmFzZUNyZWRlbnRpYWxTZWNyZXQiLCJ0b0RhdGFiYXNlQ29ubmVjdGlvbk1ldGFkYXRhIiwiQ09MTEVDVElPTlMiLCJDb25uZWN0aW9uVHlwZSIsIkNvbm5lY3Rpb25UeXBlcyIsIkRFRkFVTFRfRE9DVU1FTlRfQ09MTEVDVElPTlMiLCJERUZBVUxUX0VER0VfQ09MTEVDVElPTlMiLCJFREdFUyIsIlByaXZhY3lMZXZlbCIsIlJlYWN0aW9uVHlwZSIsIm5vdGlmeVVzZXIiLCJyZWFrdG9yU2NoZW1hIiwicmVha3RvclJlc29sdmVycyIsImdldFJlc29sdmVNZXRob2RzIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxjQUFjLFFBQU8sa0JBQWtCO0FBRS9DLFNBQ0VDLE9BQU8sRUFBRUMsY0FBYyxFQUN2QkMsWUFBWSxFQUNaQyxTQUFTLEVBQ1RDLFVBQVUsRUFDVkMsV0FBVyxFQUFFQyxjQUFjLEVBQUVDLGlCQUFpQixFQUFFQyxhQUFhLEVBQUVDLFdBQVcsRUFDMUVDLFdBQVcsUUFDTixVQUFVO0FBTWpCLFNBQVFYLGNBQWMsUUFBTyxrQkFBa0I7QUFDL0MsY0FBYyxxQkFBcUI7QUFDbkMsY0FBYyxzQkFBc0I7QUFDcEMsY0FBYyxjQUFjO0FBQzVCLGNBQWMseUJBQXlCO0FBR3ZDLFNBQVFZLGtCQUFrQixFQUFFQyw2QkFBNkIsRUFBRUMsNkJBQTZCLEVBQUVDLDRCQUE0QixRQUFPLGlDQUFpQztBQUM5SixTQUNFQyxXQUFXLEVBQ1hDLGtCQUFrQkMsZUFBZSxFQUNqQ0MsNEJBQTRCLEVBQzVCQyx3QkFBd0IsRUFDeEJDLEtBQUssRUFDTEMsWUFBWSxFQUNaQyxZQUFZLFFBQ1AsNkJBQTZCO0FBTXBDLFNBQVFDLFVBQVUsUUFBTyxrQ0FBa0M7QUFDM0QsY0FBYywrQkFBK0I7QUFDN0MsY0FBYywwQkFBMEI7QUFDeEMsY0FBYywwQkFBMEI7QUFDeEMsY0FBYyx1QkFBdUI7QUFDckMsY0FBYyx5QkFBeUI7QUFDdkMsY0FBYyxxQkFBcUI7QUFDbkMsY0FBYyxtQkFBbUI7QUFDakMsY0FBYyxjQUFjO0FBQzVCLGNBQWMsbUJBQW1CO0FBQ2pDLGNBQWMsdUJBQXVCO0FBRXJDLE9BQU8sTUFBTUMsZ0JBQWdCLEdBQUcsQ0FBQSw2Q0FBNkM7QUFDN0UsT0FBTyxNQUFNQyxtQkFBbUIxQixlQUFlMkIsaUJBQWlCLEdBQUc7QUFFbkUsY0FBYyx1Q0FBdUM7QUFDckQsY0FBYyxpQ0FBaUM7QUFDL0MsY0FBYywyQkFBMkIifQ==
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copyright (c) 2021-Present, Nitrogen Labs, Inc.
|
|
3
3
|
* All rights reserved. Use is subject to the accompanying commercial LICENSE.
|
|
4
|
-
*/ import {
|
|
5
|
-
import {
|
|
4
|
+
*/ import { createHash, parseId, parseString } from '@nlabs/utils/parsers/strings';
|
|
5
|
+
import { aql } from 'arangojs';
|
|
6
6
|
import { useDb } from '../../utils/arangodbUtils.js';
|
|
7
7
|
import { wsClient } from '../utils/websocket.js';
|
|
8
8
|
const { ARANGODB_DATABASE: databaseName } = process.env;
|
|
@@ -97,7 +97,7 @@ export const getConnectionByConversation = (context, conversationId)=>{
|
|
|
97
97
|
const conversationDocId = `conversations/${parseId(conversationId)}`;
|
|
98
98
|
const db = useDb(databaseName);
|
|
99
99
|
const aqlQry = aql`FOR c, e IN 1..1 OUTBOUND ${sessionDocId} hasConversation
|
|
100
|
-
FILTER c._id == ${conversationDocId}
|
|
100
|
+
FILTER c._id == ${conversationDocId} AND c.chatSchemaVersion != 1
|
|
101
101
|
LIMIT 1
|
|
102
102
|
LET u = (
|
|
103
103
|
FOR inUser, inEdge IN 1..1 INBOUND ${conversationDocId} hasConversation
|
|
@@ -137,4 +137,4 @@ export const notifyUser = async (_context, { data, event, userId })=>{
|
|
|
137
137
|
});
|
|
138
138
|
};
|
|
139
139
|
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvbGFtYmRhcy9hY3Rpb25zL3dlYnNvY2tldHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzIHN1YmplY3QgdG8gdGhlIGFjY29tcGFueWluZyBjb21tZXJjaWFsIExJQ0VOU0UuXG4gKi9cbmltcG9ydCB7YXFsLCBEYXRhYmFzZX0gZnJvbSAnYXJhbmdvanMnO1xuXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlSWQsIHBhcnNlU3RyaW5nfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7dXNlRGJ9IGZyb20gJy4uLy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuaW1wb3J0IHt3c0NsaWVudH0gZnJvbSAnLi4vdXRpbHMvd2Vic29ja2V0LmpzJztcblxuaW1wb3J0IHR5cGUge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uLy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1dlYnNvY2tldENvbm5lY3Rpb259IGZyb20gJy4uLy4uL3R5cGVzL3dlYnNvY2tldHMudHlwZXMuanMnO1xuXG5jb25zdCB7QVJBTkdPREJfREFUQUJBU0U6IGRhdGFiYXNlTmFtZX0gPSBwcm9jZXNzLmVudjtcblxuZXhwb3J0IGNvbnN0IGFkZENvbm5lY3Rpb24gPSAoXG4gIGNvbm5lY3Rpb25JZDogc3RyaW5nLFxuICB1c2VySWQ6IHN0cmluZyxcbiAgcGVyc29uYUlkID0gJycsXG4gIGNsaWVudElkID0gJydcbik6IFByb21pc2U8V2Vic29ja2V0Q29ubmVjdGlvbj4gPT4ge1xuICBjb25zdCBmb3JtYXRDbGllbnRJZCA9IHBhcnNlU3RyaW5nKGNsaWVudElkLCA2NCk7XG4gIGNvbnN0IGZvcm1hdENvbm5JZCA9IHBhcnNlU3RyaW5nKGNvbm5lY3Rpb25JZCwgMzIpO1xuICBjb25zdCBmb3JtYXRVc2VySWQgPSBwYXJzZUlkKHVzZXJJZCk7XG4gIGNvbnN0IGZvcm1hdFBlcnNvbmFJZCA9IHBhcnNlSWQocGVyc29uYUlkKTtcbiAgY29uc3QgZGI6IERhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgdXBzZXJ0ID0gZm9ybWF0Q2xpZW50SWRcbiAgICA/IHtjbGllbnRJZDogZm9ybWF0Q2xpZW50SWR9XG4gICAgOiB7Y29ubmVjdGlvbklkOiBmb3JtYXRDb25uSWR9O1xuICBjb25zdCBpbnNlcnQgPSB7XG4gICAgX2tleTogY3JlYXRlSGFzaChgY29ubmVjdGlvbi0ke2Zvcm1hdENsaWVudElkIHx8IGZvcm1hdENvbm5JZH1gKSxcbiAgICAuLi4oZm9ybWF0Q2xpZW50SWQgJiYge2NsaWVudElkOiBmb3JtYXRDbGllbnRJZH0pLFxuICAgIGNvbm5lY3Rpb25JZDogZm9ybWF0Q29ubklkLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgLi4uKGZvcm1hdFBlcnNvbmFJZCAmJiB7cGVyc29uYUlkOiBmb3JtYXRQZXJzb25hSWR9KSxcbiAgICB1c2VySWQ6IGZvcm1hdFVzZXJJZFxuICB9O1xuICBjb25zdCB1cGRhdGUgPSB7XG4gICAgLi4uKGZvcm1hdENsaWVudElkICYmIHtjbGllbnRJZDogZm9ybWF0Q2xpZW50SWR9KSxcbiAgICAuLi4oZm9ybWF0UGVyc29uYUlkICYmIHtwZXJzb25hSWQ6IGZvcm1hdFBlcnNvbmFJZH0pLFxuICAgIGNvbm5lY3Rpb25JZDogZm9ybWF0Q29ubklkLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgdXNlcklkOiBmb3JtYXRVc2VySWRcbiAgfTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUFNFUlQgJHt1cHNlcnR9XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX0gSU4gY29ubmVjdGlvbnNcbiAgICBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbm5lY3Rpb25zQnlVc2VyID0gKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxXZWJzb2NrZXRDb25uZWN0aW9uW10+ID0+IHtcbiAgY29uc3QgZm9ybWF0VXNlcklkID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZU5hbWUpO1xuICBjb25zdCBhcWxRcnkgPSBhcWxgRk9SIGMgSU4gY29ubmVjdGlvbnNcbiAgICBGSUxURVIgYy51c2VySWQgPT0gJHtmb3JtYXRVc2VySWR9XG4gICAgUkVUVVJOIGNgO1xuXG4gIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb25uZWN0aW9uc0J5UGVyc29uYSA9IChwZXJzb25hSWQ6IHN0cmluZyk6IFByb21pc2U8V2Vic29ja2V0Q29ubmVjdGlvbltdPiA9PiB7XG4gIGNvbnN0IGZvcm1hdFBlcnNvbmFJZCA9IHBhcnNlSWQocGVyc29uYUlkKTtcbiAgY29uc3QgZGI6IERhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiBjIElOIGNvbm5lY3Rpb25zXG4gICAgRklMVEVSIGMucGVyc29uYUlkID09ICR7Zm9ybWF0UGVyc29uYUlkfVxuICAgIFJFVFVSTiBjYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29ubmVjdGlvbkJ5VXNlcklkID0gKHVzZXJJZCA9ICcnKTogUHJvbWlzZTxXZWJzb2NrZXRDb25uZWN0aW9uIHwgbnVsbD4gPT4ge1xuICBjb25zdCBmb3JtYXRVc2VySWQgPSBwYXJzZUlkKHVzZXJJZCk7XG4gIGNvbnN0IGRiOiBEYXRhYmFzZSA9IHVzZURiKGRhdGFiYXNlTmFtZSk7XG4gIGNvbnN0IGFxbFFyeSA9IGFxbGBGT1IgYyBJTiBjb25uZWN0aW9uc1xuICAgIEZJTFRFUiBjLnVzZXJJZCA9PSAke2Zvcm1hdFVzZXJJZH1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIGNgO1xuXG4gIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29ubmVjdGlvbkJ5SWQgPSAoY29ubmVjdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPFdlYnNvY2tldENvbm5lY3Rpb24gfCBudWxsPiA9PiB7XG4gIGNvbnN0IGZvcm1hdENvbm5JZCA9IHBhcnNlU3RyaW5nKGNvbm5lY3Rpb25JZCwgMzIpO1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZU5hbWUpO1xuICBjb25zdCBhcWxRcnkgPSBhcWxgRk9SIGMgSU4gY29ubmVjdGlvbnNcbiAgICBGSUxURVIgYy5jb25uZWN0aW9uSWQgPT0gJHtmb3JtYXRDb25uSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBjYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbm5lY3Rpb25CeUNvbnZlcnNhdGlvbiA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjb252ZXJzYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXVtdPiA9PiB7XG4gIGNvbnN0IHtzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWQgPSAnJ30gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCBzZXNzaW9uRG9jSWQgPSBgdXNlcnMvJHtwYXJzZUlkKHNlc3Npb25JZCl9YDtcbiAgY29uc3QgY29udmVyc2F0aW9uRG9jSWQgPSBgY29udmVyc2F0aW9ucy8ke3BhcnNlSWQoY29udmVyc2F0aW9uSWQpfWA7XG4gIGNvbnN0IGRiOiBEYXRhYmFzZSA9IHVzZURiKGRhdGFiYXNlTmFtZSk7XG4gIGNvbnN0IGFxbFFyeSA9IGFxbGBGT1IgYywgZSBJTiAxLi4xIE9VVEJPVU5EICR7c2Vzc2lvbkRvY0lkfSBoYXNDb252ZXJzYXRpb25cbiAgICBGSUxURVIgYy5faWQgPT0gJHtjb252ZXJzYXRpb25Eb2NJZH1cbiAgICBMSU1JVCAxXG4gICAgTEVUIHUgPSAoXG4gICAgICBGT1IgaW5Vc2VyLCBpbkVkZ2UgSU4gMS4uMSBJTkJPVU5EICR7Y29udmVyc2F0aW9uRG9jSWR9IGhhc0NvbnZlcnNhdGlvblxuICAgICAgICBGT1IgbiBJTiBjb25uZWN0aW9uc1xuICAgICAgICAgIEZJTFRFUiBpblVzZXIudXNlcklkID09IG4udXNlcklkXG4gICAgICAgICAgUkVUVVJOIG4uY29ubmVjdGlvbklkXG4gICAgKVxuICAgIFJFVFVSTiB1YDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlQ29ubmVjdGlvbiA9IChjb25uZWN0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8V2Vic29ja2V0Q29ubmVjdGlvbiB8IG51bGw+ID0+IHtcbiAgY29uc3QgZm9ybWF0Q29ubklkID0gcGFyc2VTdHJpbmcoY29ubmVjdGlvbklkLCAzMik7XG4gIGNvbnN0IGRiOiBEYXRhYmFzZSA9IHVzZURiKGRhdGFiYXNlTmFtZSk7XG4gIGNvbnN0IGFxbFFyeSA9IGFxbGBGT1IgYyBJTiBjb25uZWN0aW9uc1xuICAgIEZJTFRFUiBjLmNvbm5lY3Rpb25JZCA9PSAke2Zvcm1hdENvbm5JZH1cbiAgICBMSU1JVCAxXG4gICAgUkVNT1ZFIGMgSU4gY29ubmVjdGlvbnNcbiAgICBSRVRVUk4gT0xEYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IG5vdGlmeVVzZXIgPSBhc3luYyAoXG4gIF9jb250ZXh0OiBBcGlDb250ZXh0LCB7ZGF0YSwgZXZlbnQsIHVzZXJJZH06IHtkYXRhPzogdW5rbm93bjsgZXZlbnQ6IHN0cmluZzsgdXNlcklkOiBzdHJpbmd9XG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgY29ubmVjdGlvbnMgPSBhd2FpdCBnZXRDb25uZWN0aW9uc0J5VXNlcih1c2VySWQpO1xuICBjb25zdCBjb25uZWN0aW9uSWRzID0gY29ubmVjdGlvbnNcbiAgICAubWFwKChjb25uZWN0aW9uKSA9PiBjb25uZWN0aW9uLnNvY2tldElkIHx8IGNvbm5lY3Rpb24uY29ubmVjdGlvbklkKVxuICAgIC5maWx0ZXIoKGNvbm5lY3Rpb25JZCk6IGNvbm5lY3Rpb25JZCBpcyBzdHJpbmcgPT4gQm9vbGVhbihjb25uZWN0aW9uSWQpKTtcblxuICBpZighY29ubmVjdGlvbklkcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhd2FpdCB3c0NsaWVudC5zZXR1cENsaWVudCh7cmVxdWVzdENvbnRleHQ6IHt9fSk7XG4gIHJldHVybiB3c0NsaWVudC5zZW5kKGNvbm5lY3Rpb25JZHMsIHthY3Rpb246IGV2ZW50LCBkYXRhfSk7XG59O1xuIl0sIm5hbWVzIjpbImFxbCIsImNyZWF0ZUhhc2giLCJwYXJzZUlkIiwicGFyc2VTdHJpbmciLCJ1c2VEYiIsIndzQ2xpZW50IiwiQVJBTkdPREJfREFUQUJBU0UiLCJkYXRhYmFzZU5hbWUiLCJwcm9jZXNzIiwiZW52IiwiYWRkQ29ubmVjdGlvbiIsImNvbm5lY3Rpb25JZCIsInVzZXJJZCIsInBlcnNvbmFJZCIsImNsaWVudElkIiwiZm9ybWF0Q2xpZW50SWQiLCJmb3JtYXRDb25uSWQiLCJmb3JtYXRVc2VySWQiLCJmb3JtYXRQZXJzb25hSWQiLCJkYiIsInRpbWVzdGFtcCIsIkRhdGUiLCJub3ciLCJ1cHNlcnQiLCJpbnNlcnQiLCJfa2V5IiwibW9kaWZpZWQiLCJ1cGRhdGUiLCJhcWxRcnkiLCJxdWVyeSIsInRoZW4iLCJjdXJzb3IiLCJuZXh0IiwiY2F0Y2giLCJlcnJvciIsImdldENvbm5lY3Rpb25zQnlVc2VyIiwiYWxsIiwiZ2V0Q29ubmVjdGlvbnNCeVBlcnNvbmEiLCJnZXRDb25uZWN0aW9uQnlVc2VySWQiLCJnZXRDb25uZWN0aW9uQnlJZCIsImdldENvbm5lY3Rpb25CeUNvbnZlcnNhdGlvbiIsImNvbnRleHQiLCJjb252ZXJzYXRpb25JZCIsInNlc3Npb24iLCJzZXNzaW9uSWQiLCJzZXNzaW9uRG9jSWQiLCJjb252ZXJzYXRpb25Eb2NJZCIsInJlbW92ZUNvbm5lY3Rpb24iLCJub3RpZnlVc2VyIiwiX2NvbnRleHQiLCJkYXRhIiwiZXZlbnQiLCJjb25uZWN0aW9ucyIsImNvbm5lY3Rpb25JZHMiLCJtYXAiLCJjb25uZWN0aW9uIiwic29ja2V0SWQiLCJmaWx0ZXIiLCJCb29sZWFuIiwibGVuZ3RoIiwic2V0dXBDbGllbnQiLCJyZXF1ZXN0Q29udGV4dCIsInNlbmQiLCJhY3Rpb24iXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLEdBQUcsUUFBaUIsV0FBVztBQUV2QyxTQUFRQyxVQUFVLEVBQUVDLE9BQU8sRUFBRUMsV0FBVyxRQUFPLCtCQUErQjtBQUM5RSxTQUFRQyxLQUFLLFFBQU8sK0JBQStCO0FBQ25ELFNBQVFDLFFBQVEsUUFBTyx3QkFBd0I7QUFNL0MsTUFBTSxFQUFDQyxtQkFBbUJDLFlBQVksRUFBQyxHQUFHQyxRQUFRQyxHQUFHO0FBRXJELE9BQU8sTUFBTUMsZ0JBQWdCLENBQzNCQyxjQUNBQyxRQUNBQyxZQUFZLEVBQUUsRUFDZEMsV0FBVyxFQUFFO0lBRWIsTUFBTUMsaUJBQWlCWixZQUFZVyxVQUFVO0lBQzdDLE1BQU1FLGVBQWViLFlBQVlRLGNBQWM7SUFDL0MsTUFBTU0sZUFBZWYsUUFBUVU7SUFDN0IsTUFBTU0sa0JBQWtCaEIsUUFBUVc7SUFDaEMsTUFBTU0sS0FBZWYsTUFBTUc7SUFDM0IsTUFBTWEsWUFBWUMsS0FBS0MsR0FBRztJQUMxQixNQUFNQyxTQUFTUixpQkFDWDtRQUFDRCxVQUFVQztJQUFjLElBQ3pCO1FBQUNKLGNBQWNLO0lBQVk7SUFDL0IsTUFBTVEsU0FBUztRQUNiQyxNQUFNeEIsV0FBVyxDQUFDLFdBQVcsRUFBRWMsa0JBQWtCQyxjQUFjO1FBQy9ELEdBQUlELGtCQUFrQjtZQUFDRCxVQUFVQztRQUFjLENBQUM7UUFDaERKLGNBQWNLO1FBQ2RVLFVBQVVOO1FBQ1YsR0FBSUYsbUJBQW1CO1lBQUNMLFdBQVdLO1FBQWUsQ0FBQztRQUNuRE4sUUFBUUs7SUFDVjtJQUNBLE1BQU1VLFNBQVM7UUFDYixHQUFJWixrQkFBa0I7WUFBQ0Qs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
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvbGFtYmRhcy9hY3Rpb25zL3dlYnNvY2tldHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzIHN1YmplY3QgdG8gdGhlIGFjY29tcGFueWluZyBjb21tZXJjaWFsIExJQ0VOU0UuXG4gKi9cbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VJZCwgcGFyc2VTdHJpbmd9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL3N0cmluZ3MnO1xuaW1wb3J0IHthcWwsIERhdGFiYXNlfSBmcm9tICdhcmFuZ29qcyc7XG5cbmltcG9ydCB7dXNlRGJ9IGZyb20gJy4uLy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuaW1wb3J0IHt3c0NsaWVudH0gZnJvbSAnLi4vdXRpbHMvd2Vic29ja2V0LmpzJztcblxuaW1wb3J0IHR5cGUge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uLy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1dlYnNvY2tldENvbm5lY3Rpb259IGZyb20gJy4uLy4uL3R5cGVzL3dlYnNvY2tldHMudHlwZXMuanMnO1xuXG5jb25zdCB7QVJBTkdPREJfREFUQUJBU0U6IGRhdGFiYXNlTmFtZX0gPSBwcm9jZXNzLmVudjtcblxuZXhwb3J0IGNvbnN0IGFkZENvbm5lY3Rpb24gPSAoXG4gIGNvbm5lY3Rpb25JZDogc3RyaW5nLFxuICB1c2VySWQ6IHN0cmluZyxcbiAgcGVyc29uYUlkID0gJycsXG4gIGNsaWVudElkID0gJydcbik6IFByb21pc2U8V2Vic29ja2V0Q29ubmVjdGlvbj4gPT4ge1xuICBjb25zdCBmb3JtYXRDbGllbnRJZCA9IHBhcnNlU3RyaW5nKGNsaWVudElkLCA2NCk7XG4gIGNvbnN0IGZvcm1hdENvbm5JZCA9IHBhcnNlU3RyaW5nKGNvbm5lY3Rpb25JZCwgMzIpO1xuICBjb25zdCBmb3JtYXRVc2VySWQgPSBwYXJzZUlkKHVzZXJJZCk7XG4gIGNvbnN0IGZvcm1hdFBlcnNvbmFJZCA9IHBhcnNlSWQocGVyc29uYUlkKTtcbiAgY29uc3QgZGI6IERhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgdXBzZXJ0ID0gZm9ybWF0Q2xpZW50SWRcbiAgICA/IHtjbGllbnRJZDogZm9ybWF0Q2xpZW50SWR9XG4gICAgOiB7Y29ubmVjdGlvbklkOiBmb3JtYXRDb25uSWR9O1xuICBjb25zdCBpbnNlcnQgPSB7XG4gICAgX2tleTogY3JlYXRlSGFzaChgY29ubmVjdGlvbi0ke2Zvcm1hdENsaWVudElkIHx8IGZvcm1hdENvbm5JZH1gKSxcbiAgICAuLi4oZm9ybWF0Q2xpZW50SWQgJiYge2NsaWVudElkOiBmb3JtYXRDbGllbnRJZH0pLFxuICAgIGNvbm5lY3Rpb25JZDogZm9ybWF0Q29ubklkLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgLi4uKGZvcm1hdFBlcnNvbmFJZCAmJiB7cGVyc29uYUlkOiBmb3JtYXRQZXJzb25hSWR9KSxcbiAgICB1c2VySWQ6IGZvcm1hdFVzZXJJZFxuICB9O1xuICBjb25zdCB1cGRhdGUgPSB7XG4gICAgLi4uKGZvcm1hdENsaWVudElkICYmIHtjbGllbnRJZDogZm9ybWF0Q2xpZW50SWR9KSxcbiAgICAuLi4oZm9ybWF0UGVyc29uYUlkICYmIHtwZXJzb25hSWQ6IGZvcm1hdFBlcnNvbmFJZH0pLFxuICAgIGNvbm5lY3Rpb25JZDogZm9ybWF0Q29ubklkLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgdXNlcklkOiBmb3JtYXRVc2VySWRcbiAgfTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUFNFUlQgJHt1cHNlcnR9XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX0gSU4gY29ubmVjdGlvbnNcbiAgICBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbm5lY3Rpb25zQnlVc2VyID0gKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxXZWJzb2NrZXRDb25uZWN0aW9uW10+ID0+IHtcbiAgY29uc3QgZm9ybWF0VXNlcklkID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZU5hbWUpO1xuICBjb25zdCBhcWxRcnkgPSBhcWxgRk9SIGMgSU4gY29ubmVjdGlvbnNcbiAgICBGSUxURVIgYy51c2VySWQgPT0gJHtmb3JtYXRVc2VySWR9XG4gICAgUkVUVVJOIGNgO1xuXG4gIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb25uZWN0aW9uc0J5UGVyc29uYSA9IChwZXJzb25hSWQ6IHN0cmluZyk6IFByb21pc2U8V2Vic29ja2V0Q29ubmVjdGlvbltdPiA9PiB7XG4gIGNvbnN0IGZvcm1hdFBlcnNvbmFJZCA9IHBhcnNlSWQocGVyc29uYUlkKTtcbiAgY29uc3QgZGI6IERhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiBjIElOIGNvbm5lY3Rpb25zXG4gICAgRklMVEVSIGMucGVyc29uYUlkID09ICR7Zm9ybWF0UGVyc29uYUlkfVxuICAgIFJFVFVSTiBjYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29ubmVjdGlvbkJ5VXNlcklkID0gKHVzZXJJZCA9ICcnKTogUHJvbWlzZTxXZWJzb2NrZXRDb25uZWN0aW9uIHwgbnVsbD4gPT4ge1xuICBjb25zdCBmb3JtYXRVc2VySWQgPSBwYXJzZUlkKHVzZXJJZCk7XG4gIGNvbnN0IGRiOiBEYXRhYmFzZSA9IHVzZURiKGRhdGFiYXNlTmFtZSk7XG4gIGNvbnN0IGFxbFFyeSA9IGFxbGBGT1IgYyBJTiBjb25uZWN0aW9uc1xuICAgIEZJTFRFUiBjLnVzZXJJZCA9PSAke2Zvcm1hdFVzZXJJZH1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIGNgO1xuXG4gIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29ubmVjdGlvbkJ5SWQgPSAoY29ubmVjdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPFdlYnNvY2tldENvbm5lY3Rpb24gfCBudWxsPiA9PiB7XG4gIGNvbnN0IGZvcm1hdENvbm5JZCA9IHBhcnNlU3RyaW5nKGNvbm5lY3Rpb25JZCwgMzIpO1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZU5hbWUpO1xuICBjb25zdCBhcWxRcnkgPSBhcWxgRk9SIGMgSU4gY29ubmVjdGlvbnNcbiAgICBGSUxURVIgYy5jb25uZWN0aW9uSWQgPT0gJHtmb3JtYXRDb25uSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBjYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbm5lY3Rpb25CeUNvbnZlcnNhdGlvbiA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjb252ZXJzYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXVtdPiA9PiB7XG4gIGNvbnN0IHtzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWQgPSAnJ30gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCBzZXNzaW9uRG9jSWQgPSBgdXNlcnMvJHtwYXJzZUlkKHNlc3Npb25JZCl9YDtcbiAgY29uc3QgY29udmVyc2F0aW9uRG9jSWQgPSBgY29udmVyc2F0aW9ucy8ke3BhcnNlSWQoY29udmVyc2F0aW9uSWQpfWA7XG4gIGNvbnN0IGRiOiBEYXRhYmFzZSA9IHVzZURiKGRhdGFiYXNlTmFtZSk7XG4gIGNvbnN0IGFxbFFyeSA9IGFxbGBGT1IgYywgZSBJTiAxLi4xIE9VVEJPVU5EICR7c2Vzc2lvbkRvY0lkfSBoYXNDb252ZXJzYXRpb25cbiAgICBGSUxURVIgYy5faWQgPT0gJHtjb252ZXJzYXRpb25Eb2NJZH0gQU5EIGMuY2hhdFNjaGVtYVZlcnNpb24gIT0gMVxuICAgIExJTUlUIDFcbiAgICBMRVQgdSA9IChcbiAgICAgIEZPUiBpblVzZXIsIGluRWRnZSBJTiAxLi4xIElOQk9VTkQgJHtjb252ZXJzYXRpb25Eb2NJZH0gaGFzQ29udmVyc2F0aW9uXG4gICAgICAgIEZPUiBuIElOIGNvbm5lY3Rpb25zXG4gICAgICAgICAgRklMVEVSIGluVXNlci51c2VySWQgPT0gbi51c2VySWRcbiAgICAgICAgICBSRVRVUk4gbi5jb25uZWN0aW9uSWRcbiAgICApXG4gICAgUkVUVVJOIHVgO1xuXG4gIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVDb25uZWN0aW9uID0gKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTxXZWJzb2NrZXRDb25uZWN0aW9uIHwgbnVsbD4gPT4ge1xuICBjb25zdCBmb3JtYXRDb25uSWQgPSBwYXJzZVN0cmluZyhjb25uZWN0aW9uSWQsIDMyKTtcbiAgY29uc3QgZGI6IERhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiBjIElOIGNvbm5lY3Rpb25zXG4gICAgRklMVEVSIGMuY29ubmVjdGlvbklkID09ICR7Zm9ybWF0Q29ubklkfVxuICAgIExJTUlUIDFcbiAgICBSRU1PVkUgYyBJTiBjb25uZWN0aW9uc1xuICAgIFJFVFVSTiBPTERgO1xuXG4gIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgbm90aWZ5VXNlciA9IGFzeW5jIChcbiAgX2NvbnRleHQ6IEFwaUNvbnRleHQsIHtkYXRhLCBldmVudCwgdXNlcklkfToge2RhdGE/OiB1bmtub3duOyBldmVudDogc3RyaW5nOyB1c2VySWQ6IHN0cmluZ31cbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBjb25uZWN0aW9ucyA9IGF3YWl0IGdldENvbm5lY3Rpb25zQnlVc2VyKHVzZXJJZCk7XG4gIGNvbnN0IGNvbm5lY3Rpb25JZHMgPSBjb25uZWN0aW9uc1xuICAgIC5tYXAoKGNvbm5lY3Rpb24pID0+IGNvbm5lY3Rpb24uc29ja2V0SWQgfHwgY29ubmVjdGlvbi5jb25uZWN0aW9uSWQpXG4gICAgLmZpbHRlcigoY29ubmVjdGlvbklkKTogY29ubmVjdGlvbklkIGlzIHN0cmluZyA9PiBCb29sZWFuKGNvbm5lY3Rpb25JZCkpO1xuXG4gIGlmKCFjb25uZWN0aW9uSWRzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGF3YWl0IHdzQ2xpZW50LnNldHVwQ2xpZW50KHtyZXF1ZXN0Q29udGV4dDoge319KTtcbiAgcmV0dXJuIHdzQ2xpZW50LnNlbmQoY29ubmVjdGlvbklkcywge2FjdGlvbjogZXZlbnQsIGRhdGF9KTtcbn07XG4iXSwibmFtZXMiOlsiY3JlYXRlSGFzaCIsInBhcnNlSWQiLCJwYXJzZVN0cmluZyIsImFxbCIsInVzZURiIiwid3NDbGllbnQiLCJBUkFOR09EQl9EQVRBQkFTRSIsImRhdGFiYXNlTmFtZSIsInByb2Nlc3MiLCJlbnYiLCJhZGRDb25uZWN0aW9uIiwiY29ubmVjdGlvbklkIiwidXNlcklkIiwicGVyc29uYUlkIiwiY2xpZW50SWQiLCJmb3JtYXRDbGllbnRJZCIsImZvcm1hdENvbm5JZCIsImZvcm1hdFVzZXJJZCIsImZvcm1hdFBlcnNvbmFJZCIsImRiIiwidGltZXN0YW1wIiwiRGF0ZSIsIm5vdyIsInVwc2VydCIsImluc2VydCIsIl9rZXkiLCJtb2RpZmllZCIsInVwZGF0ZSIsImFxbFFyeSIsInF1ZXJ5IiwidGhlbiIsImN1cnNvciIsIm5leHQiLCJjYXRjaCIsImVycm9yIiwiZ2V0Q29ubmVjdGlvbnNCeVVzZXIiLCJhbGwiLCJnZXRDb25uZWN0aW9uc0J5UGVyc29uYSIsImdldENvbm5lY3Rpb25CeVVzZXJJZCIsImdldENvbm5lY3Rpb25CeUlkIiwiZ2V0Q29ubmVjdGlvbkJ5Q29udmVyc2F0aW9uIiwiY29udGV4dCIsImNvbnZlcnNhdGlvbklkIiwic2Vzc2lvbiIsInNlc3Npb25JZCIsInNlc3Npb25Eb2NJZCIsImNvbnZlcnNhdGlvbkRvY0lkIiwicmVtb3ZlQ29ubmVjdGlvbiIsIm5vdGlmeVVzZXIiLCJfY29udGV4dCIsImRhdGEiLCJldmVudCIsImNvbm5lY3Rpb25zIiwiY29ubmVjdGlvbklkcyIsIm1hcCIsImNvbm5lY3Rpb24iLCJzb2NrZXRJZCIsImZpbHRlciIsIkJvb2xlYW4iLCJsZW5ndGgiLCJzZXR1cENsaWVudCIsInJlcXVlc3RDb250ZXh0Iiwic2VuZCIsImFjdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsVUFBVSxFQUFFQyxPQUFPLEVBQUVDLFdBQVcsUUFBTywrQkFBK0I7QUFDOUUsU0FBUUMsR0FBRyxRQUFpQixXQUFXO0FBRXZDLFNBQVFDLEtBQUssUUFBTywrQkFBK0I7QUFDbkQsU0FBUUMsUUFBUSxRQUFPLHdCQUF3QjtBQU0vQyxNQUFNLEVBQUNDLG1CQUFtQkMsWUFBWSxFQUFDLEdBQUdDLFFBQVFDLEdBQUc7QUFFckQsT0FBTyxNQUFNQyxnQkFBZ0IsQ0FDM0JDLGNBQ0FDLFFBQ0FDLFlBQVksRUFBRSxFQUNkQyxXQUFXLEVBQUU7SUFFYixNQUFNQyxpQkFBaUJiLFlBQVlZLFVBQVU7SUFDN0MsTUFBTUUsZUFBZWQsWUFBWVMsY0FBYztJQUMvQyxNQUFNTSxlQUFlaEIsUUFBUVc7SUFDN0IsTUFBTU0sa0JBQWtCakIsUUFBUVk7SUFDaEMsTUFBTU0sS0FBZWYsTUFBTUc7SUFDM0IsTUFBTWEsWUFBWUMsS0FBS0MsR0FBRztJQUMxQixNQUFNQyxTQUFTUixpQkFDWDtRQUFDRCxVQUFVQztJQUFjLElBQ3pCO1FBQUNKLGNBQWNLO0lBQVk7SUFDL0IsTUFBTVEsU0FBUztRQUNiQyxNQUFNekIsV0FBVyxDQUFDLFdBQVcsRUFBRWUsa0JBQWtCQyxjQUFjO1FBQy9ELEdBQUlELGtCQUFrQjtZQUFDRCxVQUFVQztRQUFjLENBQUM7UUFDaERKLGNBQWNLO1FBQ2RVLFVBQVVOO1FBQ1YsR0FBSUYsbUJBQW1CO1lBQUNMLFdBQVdLO1FBQWUsQ0FBQztRQUNuRE4sUUFBUUs7SUFDVjtJQUNBLE1BQU1V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
|