@serve.zone/interfaces 20.0.0 → 20.2.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/changelog.md +24 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/data/coremail.d.ts +216 -0
- package/dist_ts/data/coremail.js +24 -0
- package/dist_ts/data/index.d.ts +1 -0
- package/dist_ts/data/index.js +2 -1
- package/dist_ts/data/isolatedrestore.js +7 -82
- package/dist_ts/platform/index.d.ts +3 -1
- package/dist_ts/platform/index.js +4 -2
- package/dist_ts/platform/storagemigration.d.ts +346 -0
- package/dist_ts/platform/storagemigration.golden.d.ts +49 -0
- package/dist_ts/platform/storagemigration.golden.js +207 -0
- package/dist_ts/platform/storagemigration.js +1554 -0
- package/dist_ts/private/canonicaljson.d.ts +14 -0
- package/dist_ts/private/canonicaljson.js +154 -0
- package/dist_ts/requests/coremail.d.ts +248 -0
- package/dist_ts/requests/coremail.js +2 -0
- package/dist_ts/requests/index.d.ts +2 -1
- package/dist_ts/requests/index.js +3 -2
- package/package.json +2 -2
- package/readme.md +156 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/coremail.ts +277 -0
- package/ts/data/index.ts +1 -0
- package/ts/data/isolatedrestore.ts +12 -93
- package/ts/platform/index.ts +3 -0
- package/ts/platform/storagemigration.golden.ts +241 -0
- package/ts/platform/storagemigration.ts +3082 -0
- package/ts/private/canonicaljson.ts +221 -0
- package/ts/requests/coremail.ts +346 -0
- package/ts/requests/index.ts +2 -0
package/changelog.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-07-29 - 20.2.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- add CoreMail data and request contracts (coremail)
|
|
8
|
+
- Export CoreMail shared data models, transfer grants, desired-state structures, reconciliation status, and limits
|
|
9
|
+
- Add CoreMail TypedRequest interfaces for workload authentication, outbound submissions, inbound delivery handling, reconciliation, and gateway handoffs
|
|
10
|
+
- Document CoreMail authority, transfer, and desired-state constraints with contract coverage
|
|
11
|
+
- Bump @api.global/typedrequest-interfaces to ^4.0.0
|
|
12
|
+
|
|
13
|
+
## 2026-07-29 - 20.1.0
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
- add fenced object-storage migration control contracts (platform.storagemigration)
|
|
18
|
+
- Export platform.storagemigration with versioned migration intent, status, and consumer acknowledgement contracts.
|
|
19
|
+
- Add strict normalizers, mutation fences, canonical SHA-256 digest helpers, and portable golden vectors for migration payloads.
|
|
20
|
+
- Introduce shared strict canonical JSON utilities and reuse them for isolated restore digests.
|
|
21
|
+
|
|
22
|
+
### Fixes
|
|
23
|
+
|
|
24
|
+
- deduplicate storage migration changelog entry (changelog)
|
|
25
|
+
- Consolidates the pending fenced object-storage migration notes under the platform.storagemigration entry.
|
|
26
|
+
|
|
3
27
|
## 2026-07-29 - 20.0.0
|
|
4
28
|
|
|
5
29
|
### Breaking Changes
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/interfaces',
|
|
6
|
-
version: '20.
|
|
6
|
+
version: '20.2.0',
|
|
7
7
|
description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLHVGQUF1RjtDQUNyRyxDQUFBIn0=
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared CoreMail contracts.
|
|
3
|
+
*
|
|
4
|
+
* Workload authority is always derived from an authenticated transport
|
|
5
|
+
* session. Application-facing request DTOs therefore carry message or
|
|
6
|
+
* delivery identifiers only and never caller-selected tenant, service, or
|
|
7
|
+
* binding authority.
|
|
8
|
+
*/
|
|
9
|
+
export type TCoreMailSha256 = `sha256:${string}`;
|
|
10
|
+
export type TCoreMailCapability = 'outbound' | 'inbound';
|
|
11
|
+
export type TCoreMailBindingState = 'active' | 'disabled';
|
|
12
|
+
export type TCoreMailCredentialState = 'current' | 'retiring';
|
|
13
|
+
export type TCoreMailPartKind = 'text' | 'html' | 'attachment';
|
|
14
|
+
export type TCoreMailTransferMethod = 'PUT' | 'GET';
|
|
15
|
+
export type TCoreMailSubmissionState = 'preparing' | 'uploading' | 'ready' | 'accepted' | 'queued' | 'delivering' | 'delivered' | 'deferred' | 'failed' | 'deadLettered';
|
|
16
|
+
export type TCoreMailInboundDeliveryState = 'pending' | 'fetching' | 'fetched' | 'acknowledged';
|
|
17
|
+
export type TCoreMailInboundAckOutcome = 'processed' | 'discarded';
|
|
18
|
+
export type TCoreMailRecipientAction = 'accept' | 'reject' | 'defer';
|
|
19
|
+
export type TCoreMailReconciliationState = 'applying' | 'ready' | 'failed';
|
|
20
|
+
export type TCoreMailErrorCode = 'AUTHENTICATION_FAILED' | 'AUTHENTICATION_EXPIRED' | 'AUTHORITY_REVOKED' | 'CAPABILITY_DENIED' | 'NOT_FOUND' | 'INVALID_REQUEST' | 'INVALID_MAILBOX' | 'INVALID_SENDER' | 'INVALID_RECIPIENT' | 'INVALID_HEADER' | 'PAYLOAD_LIMIT_EXCEEDED' | 'IDEMPOTENCY_CONFLICT' | 'STATE_CONFLICT' | 'TRANSFER_GRANT_EXPIRED' | 'TRANSFER_GRANT_REPLAYED' | 'TRANSFER_LENGTH_MISMATCH' | 'TRANSFER_DIGEST_MISMATCH' | 'TRANSFER_ENCODING_UNSUPPORTED' | 'OBJECT_INTEGRITY_CONFLICT' | 'DELIVERY_NOT_FETCHED' | 'GATEWAY_UNAVAILABLE' | 'RECONCILIATION_FENCE_MISMATCH';
|
|
21
|
+
export interface ICoreMailErrorData {
|
|
22
|
+
code: TCoreMailErrorCode;
|
|
23
|
+
retryable: boolean;
|
|
24
|
+
retryAfterMs?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface ICoreMailMailbox {
|
|
27
|
+
address: string;
|
|
28
|
+
displayName?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface ICoreMailEnvelope {
|
|
31
|
+
mailFrom: string;
|
|
32
|
+
rcptTo: string[];
|
|
33
|
+
}
|
|
34
|
+
export interface ICoreMailHeader {
|
|
35
|
+
name: string;
|
|
36
|
+
value: string;
|
|
37
|
+
}
|
|
38
|
+
export interface ICoreMailContentDescriptor {
|
|
39
|
+
partId: string;
|
|
40
|
+
kind: TCoreMailPartKind;
|
|
41
|
+
contentType: string;
|
|
42
|
+
filename?: string;
|
|
43
|
+
contentId?: string;
|
|
44
|
+
sha256: TCoreMailSha256;
|
|
45
|
+
lengthBytes: number;
|
|
46
|
+
}
|
|
47
|
+
export interface ICoreMailOutboundMessageDescriptor {
|
|
48
|
+
sender: ICoreMailMailbox;
|
|
49
|
+
recipients: {
|
|
50
|
+
to: ICoreMailMailbox[];
|
|
51
|
+
cc?: ICoreMailMailbox[];
|
|
52
|
+
bcc?: ICoreMailMailbox[];
|
|
53
|
+
};
|
|
54
|
+
replyTo?: ICoreMailMailbox;
|
|
55
|
+
subject: string;
|
|
56
|
+
/** Ordered headers. Transport-owned MIME headers are not accepted here. */
|
|
57
|
+
headers?: ICoreMailHeader[];
|
|
58
|
+
/** Ordered body and attachment descriptors. Bytes move through bounded HTTP transfers. */
|
|
59
|
+
parts: ICoreMailContentDescriptor[];
|
|
60
|
+
}
|
|
61
|
+
export interface ICoreMailTransferGrant {
|
|
62
|
+
grantId: string;
|
|
63
|
+
method: TCoreMailTransferMethod;
|
|
64
|
+
/** Same-origin path. Callers use the authenticated CoreMail or gateway endpoint they already hold. */
|
|
65
|
+
path: string;
|
|
66
|
+
/** One-time bearer capability. It must never be logged or persisted by a consumer. */
|
|
67
|
+
bearerToken: string;
|
|
68
|
+
sha256: TCoreMailSha256;
|
|
69
|
+
lengthBytes: number;
|
|
70
|
+
contentType: string;
|
|
71
|
+
expiresAt: number;
|
|
72
|
+
}
|
|
73
|
+
export interface ICoreMailUploadGrant extends ICoreMailTransferGrant {
|
|
74
|
+
method: 'PUT';
|
|
75
|
+
}
|
|
76
|
+
export interface ICoreMailDownloadGrant extends ICoreMailTransferGrant {
|
|
77
|
+
method: 'GET';
|
|
78
|
+
}
|
|
79
|
+
export interface ICoreMailPartStatus {
|
|
80
|
+
partId: string;
|
|
81
|
+
state: 'missing' | 'uploading' | 'complete' | 'failed';
|
|
82
|
+
sha256: TCoreMailSha256;
|
|
83
|
+
lengthBytes: number;
|
|
84
|
+
}
|
|
85
|
+
export interface ICoreMailSubmission {
|
|
86
|
+
submissionId: string;
|
|
87
|
+
idempotencyKey: string;
|
|
88
|
+
submissionDigest: TCoreMailSha256;
|
|
89
|
+
state: TCoreMailSubmissionState;
|
|
90
|
+
parts: ICoreMailPartStatus[];
|
|
91
|
+
transportMessageId?: string;
|
|
92
|
+
attempts: number;
|
|
93
|
+
nextAttemptAt?: number;
|
|
94
|
+
acceptedAt?: number;
|
|
95
|
+
deliveredAt?: number;
|
|
96
|
+
createdAt: number;
|
|
97
|
+
updatedAt: number;
|
|
98
|
+
}
|
|
99
|
+
export interface ICoreMailInboundDelivery {
|
|
100
|
+
deliveryId: string;
|
|
101
|
+
transportDeliveryId: string;
|
|
102
|
+
state: TCoreMailInboundDeliveryState;
|
|
103
|
+
envelope: ICoreMailEnvelope;
|
|
104
|
+
rawMime: {
|
|
105
|
+
sha256: TCoreMailSha256;
|
|
106
|
+
lengthBytes: number;
|
|
107
|
+
contentType: 'message/rfc822';
|
|
108
|
+
};
|
|
109
|
+
messageId?: string;
|
|
110
|
+
subject?: string;
|
|
111
|
+
receivedAt: number;
|
|
112
|
+
updatedAt: number;
|
|
113
|
+
}
|
|
114
|
+
export interface ICoreMailBindingCredentialVerifier {
|
|
115
|
+
credentialId: string;
|
|
116
|
+
version: number;
|
|
117
|
+
state: TCoreMailCredentialState;
|
|
118
|
+
/** Password-verifier string only. Plaintext credential material is never part of desired state. */
|
|
119
|
+
verificationHash: string;
|
|
120
|
+
acceptUntil?: number;
|
|
121
|
+
}
|
|
122
|
+
export interface ICoreMailBindingDesiredState {
|
|
123
|
+
schemaVersion: 1;
|
|
124
|
+
bindingId: string;
|
|
125
|
+
serviceId: string;
|
|
126
|
+
tenantId: string;
|
|
127
|
+
revision: number;
|
|
128
|
+
state: TCoreMailBindingState;
|
|
129
|
+
capabilities: TCoreMailCapability[];
|
|
130
|
+
credentials: ICoreMailBindingCredentialVerifier[];
|
|
131
|
+
allowedSenders: string[];
|
|
132
|
+
inboundRecipients: string[];
|
|
133
|
+
defaultSender?: string;
|
|
134
|
+
limits?: {
|
|
135
|
+
messagesPerMinute?: number;
|
|
136
|
+
messagesPerDay?: number;
|
|
137
|
+
maxPendingInbound?: number;
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
export interface ICoreMailGatewayDesiredState {
|
|
141
|
+
endpointUrl: string;
|
|
142
|
+
credentialId: string;
|
|
143
|
+
credentialVersion: number;
|
|
144
|
+
/** Key in CoreMail's resolved runtime secret material, never a plaintext value. */
|
|
145
|
+
credentialSecretKey: string;
|
|
146
|
+
}
|
|
147
|
+
export interface ICoreMailDesiredState {
|
|
148
|
+
schemaVersion: 1;
|
|
149
|
+
configEpoch: number;
|
|
150
|
+
bindings: ICoreMailBindingDesiredState[];
|
|
151
|
+
gateway: ICoreMailGatewayDesiredState;
|
|
152
|
+
}
|
|
153
|
+
export interface ICoreMailReplicaIdentity {
|
|
154
|
+
taskId: string;
|
|
155
|
+
serviceId: string;
|
|
156
|
+
rolloutId: string;
|
|
157
|
+
rolloutGeneration: number;
|
|
158
|
+
imageDigest: TCoreMailSha256;
|
|
159
|
+
}
|
|
160
|
+
export interface ICoreMailBindingReconciliationStatus {
|
|
161
|
+
bindingId: string;
|
|
162
|
+
revision: number;
|
|
163
|
+
state: TCoreMailBindingState;
|
|
164
|
+
activeSessionsByCredentialVersion: Array<{
|
|
165
|
+
version: number;
|
|
166
|
+
count: number;
|
|
167
|
+
}>;
|
|
168
|
+
}
|
|
169
|
+
export interface ICoreMailReconciliationStatus {
|
|
170
|
+
replica: ICoreMailReplicaIdentity;
|
|
171
|
+
state: TCoreMailReconciliationState;
|
|
172
|
+
appliedConfigEpoch: number;
|
|
173
|
+
appliedDesiredStateDigest: TCoreMailSha256;
|
|
174
|
+
bindings: ICoreMailBindingReconciliationStatus[];
|
|
175
|
+
updatedAt: number;
|
|
176
|
+
errorCode?: TCoreMailErrorCode;
|
|
177
|
+
}
|
|
178
|
+
export interface ICoreMailRecipientResolution {
|
|
179
|
+
recipient: string;
|
|
180
|
+
action: TCoreMailRecipientAction;
|
|
181
|
+
/** Opaque, short-lived handle returned only for accepted recipients. */
|
|
182
|
+
routingHandle?: string;
|
|
183
|
+
smtpCode?: number;
|
|
184
|
+
message?: string;
|
|
185
|
+
}
|
|
186
|
+
export interface ICoreMailGatewayMessageDescriptor {
|
|
187
|
+
envelope: ICoreMailEnvelope;
|
|
188
|
+
rawMime: {
|
|
189
|
+
sha256: TCoreMailSha256;
|
|
190
|
+
lengthBytes: number;
|
|
191
|
+
contentType: 'message/rfc822';
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
export interface ICoreMailGatewayOutboundStatus {
|
|
195
|
+
transportMessageId: string;
|
|
196
|
+
state: Extract<TCoreMailSubmissionState, 'accepted' | 'queued' | 'delivering' | 'delivered' | 'deferred' | 'failed' | 'deadLettered'>;
|
|
197
|
+
attempts: number;
|
|
198
|
+
nextAttemptAt?: number;
|
|
199
|
+
smtpCode?: number;
|
|
200
|
+
updatedAt: number;
|
|
201
|
+
}
|
|
202
|
+
export declare const coreMailLimits: Readonly<{
|
|
203
|
+
readonly controlMessageBytes: number;
|
|
204
|
+
readonly desiredStateBytes: number;
|
|
205
|
+
readonly textPartBytes: number;
|
|
206
|
+
readonly htmlPartBytes: number;
|
|
207
|
+
readonly attachmentCount: 16;
|
|
208
|
+
readonly attachmentBytes: number;
|
|
209
|
+
readonly aggregateAttachmentBytes: number;
|
|
210
|
+
readonly mimeFramingBytes: number;
|
|
211
|
+
readonly serializedMimeBytes: number;
|
|
212
|
+
readonly transferGrantTtlMs: number;
|
|
213
|
+
readonly transferHeaderTimeoutMs: number;
|
|
214
|
+
readonly transferIdleTimeoutMs: number;
|
|
215
|
+
readonly transferOverallTimeoutMs: number;
|
|
216
|
+
}>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared CoreMail contracts.
|
|
3
|
+
*
|
|
4
|
+
* Workload authority is always derived from an authenticated transport
|
|
5
|
+
* session. Application-facing request DTOs therefore carry message or
|
|
6
|
+
* delivery identifiers only and never caller-selected tenant, service, or
|
|
7
|
+
* binding authority.
|
|
8
|
+
*/
|
|
9
|
+
export const coreMailLimits = Object.freeze({
|
|
10
|
+
controlMessageBytes: 64 * 1024,
|
|
11
|
+
desiredStateBytes: 8 * 1024 * 1024,
|
|
12
|
+
textPartBytes: 1 * 1024 * 1024,
|
|
13
|
+
htmlPartBytes: 2 * 1024 * 1024,
|
|
14
|
+
attachmentCount: 16,
|
|
15
|
+
attachmentBytes: 10 * 1024 * 1024,
|
|
16
|
+
aggregateAttachmentBytes: 17 * 1024 * 1024,
|
|
17
|
+
mimeFramingBytes: 512 * 1024,
|
|
18
|
+
serializedMimeBytes: 30 * 1024 * 1024,
|
|
19
|
+
transferGrantTtlMs: 5 * 60 * 1000,
|
|
20
|
+
transferHeaderTimeoutMs: 10 * 1000,
|
|
21
|
+
transferIdleTimeoutMs: 15 * 1000,
|
|
22
|
+
transferOverallTimeoutMs: 2 * 60 * 1000,
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZW1haWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2NvcmVtYWlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUErUEgsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDMUMsbUJBQW1CLEVBQUUsRUFBRSxHQUFHLElBQUk7SUFDOUIsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJO0lBQ2xDLGFBQWEsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUk7SUFDOUIsYUFBYSxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSTtJQUM5QixlQUFlLEVBQUUsRUFBRTtJQUNuQixlQUFlLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJO0lBQ2pDLHdCQUF3QixFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSTtJQUMxQyxnQkFBZ0IsRUFBRSxHQUFHLEdBQUcsSUFBSTtJQUM1QixtQkFBbUIsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUk7SUFDckMsa0JBQWtCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBQ2pDLHVCQUF1QixFQUFFLEVBQUUsR0FBRyxJQUFJO0lBQ2xDLHFCQUFxQixFQUFFLEVBQUUsR0FBRyxJQUFJO0lBQ2hDLHdCQUF3QixFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSTtDQUMvQixDQUFDLENBQUMifQ==
|
package/dist_ts/data/index.d.ts
CHANGED
package/dist_ts/data/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './cloudlyconfig.js';
|
|
2
2
|
export * from './cluster.js';
|
|
3
3
|
export * from './config.js';
|
|
4
|
+
export * from './coremail.js';
|
|
4
5
|
export * from './deployment.js';
|
|
5
6
|
export * from './deploymentadoption.js';
|
|
6
7
|
export * from './deploymentoperation.js';
|
|
@@ -35,4 +36,4 @@ export * from './traffic.js';
|
|
|
35
36
|
export * from './user.js';
|
|
36
37
|
export * from './version.js';
|
|
37
38
|
export * from './webpush.js';
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGNBQWMsQ0FBQyJ9
|