@serve.zone/interfaces 16.1.0 → 16.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 CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026-07-20 - 16.2.0
4
+
5
+ ### Security
6
+
7
+ - add least-privilege adoption image tag bootstrap (deployment)
8
+ - Promote only the exact healthy live service digest from its server-derived mutable registry target to a canonical bare semantic-version tag.
9
+ - Return complete OCI index, platform, release, and digest-pinned evidence without granting general registry manifest writes.
10
+ - Add an explicit rollout-adoption bootstrap for legacy services whose immutable target differs from the retained runtime, with a generation-one digest-pinned plan and pollable rollout status.
11
+
3
12
  ## 2026-07-20 - 16.1.0
4
13
 
5
14
  ### Security
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/interfaces',
6
- version: '16.1.0',
6
+ version: '16.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=
@@ -1,6 +1,6 @@
1
1
  import type { IDeploymentPreflightRuntimeTask, IOciPlatformDescriptorSummary } from './deploymentpreflight.js';
2
2
  import type { IDeployment } from './deployment.js';
3
- import type { IImmutableImageDeploymentPlan, IImmutableRolloutReportEnvelope, IImmutableImageTargetScope, TOciManifestMediaType, TSha256Digest } from './immutableimage.js';
3
+ import type { IImageRolloutStatus, IImmutableImageDeploymentPlan, IImmutableRolloutReportEnvelope, IImmutableImageTargetScope, TOciManifestMediaType, TSha256Digest } from './immutableimage.js';
4
4
  import type { IRegistryTarget } from './registry.js';
5
5
  export type TServiceDeploymentAdoptionDecision = 'GO' | 'NO-GO';
6
6
  /**
@@ -24,6 +24,44 @@ export interface IServiceDeploymentAdoptionInput extends IServiceDeploymentAdopt
24
24
  idempotencyKey: string;
25
25
  expectedAdoptionDigest: TServiceDeploymentAdoptionDigest;
26
26
  }
27
+ export interface IServiceDeploymentAdoptionImagePromotionInput extends IServiceDeploymentAdoptionPreflightInput {
28
+ targetReleaseTag: string;
29
+ expectedSourceImageDigest?: TSha256Digest;
30
+ idempotencyKey: string;
31
+ }
32
+ export interface IServiceDeploymentAdoptionImagePromotionResult {
33
+ status: 'promoted' | 'already-promoted';
34
+ organizationId: string;
35
+ serviceId: string;
36
+ sourceTag: string;
37
+ releaseTag: string;
38
+ registryHost: string;
39
+ repository: string;
40
+ digest: TSha256Digest;
41
+ mediaType: 'application/vnd.oci.image.index.v1+json' | 'application/vnd.docker.distribution.manifest.list.v2+json';
42
+ platforms: IOciPlatformDescriptorSummary[];
43
+ releaseId: string;
44
+ digestPinnedImageReference: string;
45
+ }
46
+ export interface IServiceDeploymentAdoptionRolloutInput extends IServiceDeploymentAdoptionPreflightInput {
47
+ releaseTag: string;
48
+ expectedTargetImageDigest: TSha256Digest;
49
+ idempotencyKey: string;
50
+ }
51
+ export interface IServiceDeploymentAdoptionRolloutResult {
52
+ status: 'rollout-started' | 'rollout-in-progress' | 'rollout-succeeded' | 'rollout-failed';
53
+ idempotentReplay: boolean;
54
+ operationId: string;
55
+ organizationId: string;
56
+ serviceId: string;
57
+ registryHost: string;
58
+ repository: string;
59
+ releaseTag: string;
60
+ digest: TSha256Digest;
61
+ releaseId: string;
62
+ plan: IImmutableImageDeploymentPlan;
63
+ rolloutStatus: IImageRolloutStatus;
64
+ }
27
65
  interface IServiceDeploymentAdoptionReportBase {
28
66
  schemaVersion: 1;
29
67
  mutationPerformed: false;
@@ -109,7 +147,12 @@ export interface IServiceDeploymentAdoptionRetentionAttestation {
109
147
  attestedAt: number;
110
148
  }
111
149
  export declare const validateServiceDeploymentAdoptionRetentionAttestation: (attestationArg: unknown) => string[];
150
+ export declare const normalizeServiceDeploymentAdoptionReleaseTag: (tagArg: unknown) => string | undefined;
112
151
  export declare const validateServiceDeploymentAdoptionPreflightInput: (inputArg: unknown) => string[];
113
152
  export declare const validateServiceDeploymentAdoptionInput: (inputArg: unknown) => string[];
153
+ export declare const validateServiceDeploymentAdoptionImagePromotionInput: (inputArg: unknown) => string[];
154
+ export declare const validateServiceDeploymentAdoptionImagePromotionResult: (resultArg: unknown) => string[];
155
+ export declare const validateServiceDeploymentAdoptionRolloutInput: (inputArg: unknown) => string[];
156
+ export declare const validateServiceDeploymentAdoptionRolloutResult: (resultArg: unknown) => string[];
114
157
  export declare const validateServiceDeploymentAdoptionReport: (reportArg: unknown) => string[];
115
158
  export {};
@@ -1,4 +1,4 @@
1
- import { normalizeImmutableReleaseTag, normalizeSha256Digest } from './immutableimage.js';
1
+ import { normalizeImmutableReleaseTag, normalizeSha256Digest, validateImageRolloutStatus, validateImmutableImageDeploymentPlan, } from './immutableimage.js';
2
2
  export const validateServiceDeploymentAdoptionRetentionAttestation = (attestationArg) => {
3
3
  if (!isRecord(attestationArg))
4
4
  return ['retention attestation must be an object'];
@@ -34,6 +34,7 @@ export const validateServiceDeploymentAdoptionRetentionAttestation = (attestatio
34
34
  return errors;
35
35
  };
36
36
  const boundaryIdentifierRegex = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/;
37
+ const immutableSemverReleaseTagRegex = /^(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)(?:-(?:0|[1-9][0-9]*|[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9][0-9]*|[A-Za-z-][0-9A-Za-z-]*))*)?$/;
37
38
  const indexMediaTypes = new Set([
38
39
  'application/vnd.oci.image.index.v1+json',
39
40
  'application/vnd.docker.distribution.manifest.list.v2+json',
@@ -60,6 +61,12 @@ const isRecord = (valueArg) => Boolean(valueArg) && typeof valueArg === 'object'
60
61
  const isBoundedIdentifier = (valueArg) => typeof valueArg === 'string' && boundaryIdentifierRegex.test(valueArg);
61
62
  const isCanonicalDigest = (valueArg) => Boolean(normalizeSha256Digest(valueArg)) && normalizeSha256Digest(valueArg) === valueArg;
62
63
  const isNonNegativeInteger = (valueArg) => Number.isSafeInteger(valueArg) && valueArg >= 0;
64
+ export const normalizeServiceDeploymentAdoptionReleaseTag = (tagArg) => {
65
+ const normalizedTag = normalizeImmutableReleaseTag(tagArg);
66
+ return normalizedTag && immutableSemverReleaseTagRegex.test(normalizedTag)
67
+ ? normalizedTag
68
+ : undefined;
69
+ };
63
70
  export const validateServiceDeploymentAdoptionPreflightInput = (inputArg) => {
64
71
  if (!isRecord(inputArg))
65
72
  return ['adoption preflight input must be an object'];
@@ -86,6 +93,175 @@ export const validateServiceDeploymentAdoptionInput = (inputArg) => {
86
93
  }
87
94
  return errors;
88
95
  };
96
+ export const validateServiceDeploymentAdoptionImagePromotionInput = (inputArg) => {
97
+ const errors = validateServiceDeploymentAdoptionPreflightInput(inputArg);
98
+ if (!isRecord(inputArg))
99
+ return errors;
100
+ if (!normalizeServiceDeploymentAdoptionReleaseTag(inputArg.targetReleaseTag)) {
101
+ errors.push('targetReleaseTag must be a canonical OCI-safe semantic version tag');
102
+ }
103
+ if (!isBoundedIdentifier(inputArg.idempotencyKey)) {
104
+ errors.push('idempotencyKey must be a bounded canonical identifier');
105
+ }
106
+ if (inputArg.expectedSourceImageDigest !== undefined
107
+ && !isCanonicalDigest(inputArg.expectedSourceImageDigest)) {
108
+ errors.push('expectedSourceImageDigest must be a canonical sha256 digest when provided');
109
+ }
110
+ return errors;
111
+ };
112
+ export const validateServiceDeploymentAdoptionImagePromotionResult = (resultArg) => {
113
+ if (!isRecord(resultArg))
114
+ return ['adoption image promotion result must be an object'];
115
+ const errors = [];
116
+ if (resultArg.status !== 'promoted' && resultArg.status !== 'already-promoted') {
117
+ errors.push('status must identify a promoted or already-promoted result');
118
+ }
119
+ for (const key of ['organizationId', 'serviceId', 'releaseId']) {
120
+ if (!isBoundedIdentifier(resultArg[key])) {
121
+ errors.push(`${key} must be a bounded canonical identifier`);
122
+ }
123
+ }
124
+ if (typeof resultArg.sourceTag !== 'string'
125
+ || resultArg.sourceTag.trim() !== resultArg.sourceTag
126
+ || resultArg.sourceTag.length < 1
127
+ || resultArg.sourceTag.length > 128) {
128
+ errors.push('sourceTag must be a bounded canonical registry tag');
129
+ }
130
+ if (!normalizeServiceDeploymentAdoptionReleaseTag(resultArg.releaseTag)) {
131
+ errors.push('releaseTag must be a canonical OCI-safe semantic version tag');
132
+ }
133
+ if (typeof resultArg.registryHost !== 'string'
134
+ || resultArg.registryHost.trim() !== resultArg.registryHost
135
+ || !resultArg.registryHost) {
136
+ errors.push('registryHost must be a non-empty canonical string');
137
+ }
138
+ if (typeof resultArg.repository !== 'string'
139
+ || resultArg.repository.trim() !== resultArg.repository
140
+ || !resultArg.repository) {
141
+ errors.push('repository must be a non-empty canonical string');
142
+ }
143
+ if (!isCanonicalDigest(resultArg.digest)) {
144
+ errors.push('digest must be a canonical sha256 digest');
145
+ }
146
+ if (!indexMediaTypes.has(resultArg.mediaType)) {
147
+ errors.push('mediaType must identify an OCI image index');
148
+ }
149
+ if (!Array.isArray(resultArg.platforms)) {
150
+ errors.push('platforms must contain OCI platform evidence');
151
+ }
152
+ else {
153
+ for (const architecture of ['amd64', 'arm64']) {
154
+ if (!resultArg.platforms.some((platformArg) => isRecord(platformArg)
155
+ && platformArg.os === 'linux'
156
+ && platformArg.architecture === architecture
157
+ && platformArg.runnable === true
158
+ && platformArg.manifestPresent === true
159
+ && isCanonicalDigest(platformArg.digest))) {
160
+ errors.push(`platforms must contain runnable linux/${architecture} evidence`);
161
+ }
162
+ }
163
+ }
164
+ if (isCanonicalDigest(resultArg.digest)
165
+ && typeof resultArg.registryHost === 'string'
166
+ && typeof resultArg.repository === 'string'
167
+ && resultArg.digestPinnedImageReference
168
+ !== `${resultArg.registryHost}/${resultArg.repository}@${resultArg.digest}`) {
169
+ errors.push('digestPinnedImageReference must bind the exact registry digest');
170
+ }
171
+ return errors;
172
+ };
173
+ export const validateServiceDeploymentAdoptionRolloutInput = (inputArg) => {
174
+ const errors = validateServiceDeploymentAdoptionPreflightInput(inputArg);
175
+ if (!isRecord(inputArg))
176
+ return errors;
177
+ if (!normalizeServiceDeploymentAdoptionReleaseTag(inputArg.releaseTag)) {
178
+ errors.push('releaseTag must be a canonical OCI-safe semantic version tag');
179
+ }
180
+ if (!isCanonicalDigest(inputArg.expectedTargetImageDigest)) {
181
+ errors.push('expectedTargetImageDigest must be a canonical sha256 digest');
182
+ }
183
+ if (!isBoundedIdentifier(inputArg.idempotencyKey)) {
184
+ errors.push('idempotencyKey must be a bounded canonical identifier');
185
+ }
186
+ return errors;
187
+ };
188
+ export const validateServiceDeploymentAdoptionRolloutResult = (resultArg) => {
189
+ if (!isRecord(resultArg))
190
+ return ['adoption rollout result must be an object'];
191
+ const errors = [];
192
+ if (![
193
+ 'rollout-started',
194
+ 'rollout-in-progress',
195
+ 'rollout-succeeded',
196
+ 'rollout-failed',
197
+ ].includes(resultArg.status)) {
198
+ errors.push('status must identify a supported adoption rollout state');
199
+ }
200
+ if (typeof resultArg.idempotentReplay !== 'boolean') {
201
+ errors.push('idempotentReplay must be boolean');
202
+ }
203
+ for (const key of ['operationId', 'organizationId', 'serviceId', 'releaseId']) {
204
+ if (!isBoundedIdentifier(resultArg[key]))
205
+ errors.push(`${key} must be a bounded identifier`);
206
+ }
207
+ if (!normalizeServiceDeploymentAdoptionReleaseTag(resultArg.releaseTag)) {
208
+ errors.push('releaseTag must be a canonical OCI-safe semantic version tag');
209
+ }
210
+ if (!isCanonicalDigest(resultArg.digest)) {
211
+ errors.push('digest must be a canonical sha256 digest');
212
+ }
213
+ if (!isRecord(resultArg.plan)) {
214
+ errors.push('plan must be present');
215
+ }
216
+ else {
217
+ errors.push(...validateImmutableImageDeploymentPlan(resultArg.plan).map((errorArg) => `plan: ${errorArg}`));
218
+ if (resultArg.plan.operationId !== resultArg.operationId
219
+ || resultArg.plan.releaseId !== resultArg.releaseId
220
+ || resultArg.plan.releaseTag !== resultArg.releaseTag
221
+ || resultArg.plan.requestedDigest !== resultArg.digest
222
+ || resultArg.plan.registryHost !== resultArg.registryHost
223
+ || resultArg.plan.repository !== resultArg.repository
224
+ || resultArg.plan.mode !== 'promotion'
225
+ || resultArg.plan.rolloutGeneration !== 1) {
226
+ errors.push('plan must bind the exact generation-one adoption rollout result');
227
+ }
228
+ }
229
+ if (!isRecord(resultArg.rolloutStatus)) {
230
+ errors.push('rolloutStatus must be present');
231
+ }
232
+ else {
233
+ errors.push(...validateImageRolloutStatus(resultArg.rolloutStatus).map((errorArg) => `rolloutStatus: ${errorArg}`));
234
+ if (isRecord(resultArg.plan)
235
+ && (resultArg.rolloutStatus.rolloutId !== resultArg.plan.rolloutId
236
+ || resultArg.rolloutStatus.rolloutGeneration !== resultArg.plan.rolloutGeneration
237
+ || resultArg.rolloutStatus.expectedDigest !== resultArg.digest)) {
238
+ errors.push('rolloutStatus must bind the exact adoption rollout plan');
239
+ }
240
+ }
241
+ if (isRecord(resultArg.rolloutStatus)) {
242
+ const rolloutStatus = resultArg.rolloutStatus.status;
243
+ const successful = rolloutStatus === 'succeeded';
244
+ const failed = rolloutStatus === 'failed'
245
+ || rolloutStatus === 'mismatched'
246
+ || rolloutStatus === 'rolling-back'
247
+ || rolloutStatus === 'rolled-back';
248
+ if ((resultArg.status === 'rollout-succeeded') !== successful) {
249
+ errors.push('rollout-succeeded must exactly match a succeeded rolloutStatus');
250
+ }
251
+ if ((resultArg.status === 'rollout-failed') !== failed) {
252
+ errors.push('rollout-failed must exactly match a failed or mismatched rolloutStatus');
253
+ }
254
+ if ((resultArg.status === 'rollout-started' || resultArg.status === 'rollout-in-progress')
255
+ && (successful || failed)) {
256
+ errors.push('an active rollout result must not contain a terminal rolloutStatus');
257
+ }
258
+ }
259
+ if (typeof resultArg.registryHost !== 'string' || !resultArg.registryHost
260
+ || typeof resultArg.repository !== 'string' || !resultArg.repository) {
261
+ errors.push('registryHost and repository must be non-empty strings');
262
+ }
263
+ return errors;
264
+ };
89
265
  export const validateServiceDeploymentAdoptionReport = (reportArg) => {
90
266
  if (!isRecord(reportArg))
91
267
  return ['adoption report must be an object'];
@@ -337,4 +513,4 @@ export const validateServiceDeploymentAdoptionReport = (reportArg) => {
337
513
  }
338
514
  return errors;
339
515
  };
340
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudGFkb3B0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9kZXBsb3ltZW50YWRvcHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBWUEsT0FBTyxFQUFFLDRCQUE0QixFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFtSjFGLE1BQU0sQ0FBQyxNQUFNLHFEQUFxRCxHQUFHLENBQ25FLGNBQXVCLEVBQ2IsRUFBRTtJQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO1FBQUUsT0FBTyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDbEYsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLElBQUksY0FBYyxDQUFDLGFBQWEsS0FBSyxDQUFDO1FBQUUsTUFBTSxDQUFDLElBQUksQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0lBQ3JHLElBQUksY0FBYyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksY0FBYyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1RSxNQUFNLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUNELElBQUksY0FBYyxDQUFDLHVCQUF1QixLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsMkRBQTJELENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7V0FDN0MsQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUN0RCxNQUFNLENBQUMsSUFBSSxDQUFDLDZFQUE2RSxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsMkJBQTJCLENBQUMsRUFBRSxDQUFDO1FBQ25FLE1BQU0sQ0FBQyxJQUFJLENBQUMsOERBQThELENB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
516
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudGFkb3B0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9kZXBsb3ltZW50YWRvcHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBYUEsT0FBTyxFQUNMLDRCQUE0QixFQUM1QixxQkFBcUIsRUFDckIsMEJBQTBCLEVBQzFCLG9DQUFvQyxHQUNyQyxNQUFNLHFCQUFxQixDQUFDO0FBcU03QixNQUFNLENBQUMsTUFBTSxxREFBcUQsR0FBRyxDQUNuRSxjQUF1QixFQUNiLEVBQUU7SUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUFFLE9BQU8sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixJQUFJLGNBQWMsQ0FBQyxhQUFhLEtBQUssQ0FBQztRQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUNyRyxJQUFJLGNBQWMsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLGNBQWMsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUUsTUFBTSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDRCxJQUFJLGNBQWMsQ0FBQyx1QkFBdUIsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNwRCxNQUFNLENBQUMsSUFBSSxDQUFDLDJEQUEyRCxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDO1dBQzdDLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDdEQsTUFBTSxDQUFDLElBQUksQ0FBQyw2RUFBNkUsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQztRQUNuRSxNQUFNLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSyxjQUFjLENBQUMsVUFBcUIsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsRyxNQUFNLENBQUMsSUFBSSxDQUFDLDREQUE0RCxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUNELElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7UUFDOUMsTUFBTSxDQUFDLElBQUksQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksY0FBYyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDeEYsTUFBTSxDQUFDLElBQUksQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7U0FBTSxJQUFJLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUM1RCxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7V0FDckIsYUFBYSxDQUFDLFNBQVMsS0FBSyxjQUFjLENBQUMsU0FBUyxDQUN4RCxDQUFDLEVBQUUsQ0FBQztRQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsb0VBQW9FLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRyxxQ0FBcUMsQ0FBQztBQUN0RSxNQUFNLDhCQUE4QixHQUFHLHdKQUF3SixDQUFDO0FBQ2hNLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxDQUF3QjtJQUNyRCx5Q0FBeUM7SUFDekMsMkRBQTJEO0NBQzVELENBQUMsQ0FBQztBQUNILE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLENBQXdDO0lBQzFFLGlCQUFpQjtJQUNqQix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLDRCQUE0QjtJQUM1QiwyQkFBMkI7SUFDM0Isd0JBQXdCO0lBQ3hCLHlCQUF5QjtJQUN6Qiw0QkFBNEI7SUFDNUIseUJBQXlCO0lBQ3pCLG9CQUFvQjtJQUNwQixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2QiwwQkFBMEI7SUFDMUIsZ0NBQWdDO0lBQ2hDLHlCQUF5QjtDQUMxQixDQUFDLENBQUM7QUFFSCxNQUFNLFFBQVEsR0FBRyxDQUFDLFFBQWlCLEVBQXVDLEVBQUUsQ0FDMUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFaEYsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLFFBQWlCLEVBQXNCLEVBQUUsQ0FDcEUsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLHVCQUF1QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUV6RSxNQUFNLGlCQUFpQixHQUFHLENBQUMsUUFBaUIsRUFBNkIsRUFBRSxDQUN6RSxPQUFPLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxRQUFRLENBQUM7QUFFM0YsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFFBQWlCLEVBQXNCLEVBQUUsQ0FDckUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSyxRQUFtQixJQUFJLENBQUMsQ0FBQztBQUU5RCxNQUFNLENBQUMsTUFBTSw0Q0FBNEMsR0FBRyxDQUMxRCxNQUFlLEVBQ0ssRUFBRTtJQUN0QixNQUFNLGFBQWEsR0FBRyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRCxPQUFPLGFBQWEsSUFBSSw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3hFLENBQUMsQ0FBQyxhQUFhO1FBQ2YsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNoQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwrQ0FBK0MsR0FBRyxDQUM3RCxRQUFpQixFQUNQLEVBQUU7SUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUFFLE9BQU8sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQy9FLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDN0MsTUFBTSxDQUFDLElBQUksQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFVLEVBQUUsQ0FBQztRQUMzRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sc0NBQXNDLEdBQUcsQ0FBQyxRQUFpQixFQUFZLEVBQUU7SUFDcEYsTUFBTSxNQUFNLEdBQUcsK0NBQStDLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUN2QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7UUFDbEQsTUFBTSxDQUFDLElBQUksQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQztRQUN4RCxNQUFNLENBQUMsSUFBSSxDQUFDLDBEQUEwRCxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG9EQUFvRCxHQUFHLENBQ2xFLFFBQWlCLEVBQ1AsRUFBRTtJQUNaLE1BQU0sTUFBTSxHQUFHLCtDQUErQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDdkMsSUFBSSxDQUFDLDRDQUE0QyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7UUFDN0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7UUFDbEQsTUFBTSxDQUFDLElBQUksQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyx5QkFBeUIsS0FBSyxTQUFTO1dBQy9DLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQztRQUM1RCxNQUFNLENBQUMsSUFBSSxDQUFDLDJFQUEyRSxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFEQUFxRCxHQUFHLENBQ25FLFNBQWtCLEVBQ1IsRUFBRTtJQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQUUsT0FBTyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDdkYsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxVQUFVLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9FLE1BQU0sQ0FBQyxJQUFJLENBQUMsNERBQTRELENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxXQUFXLENBQVUsRUFBRSxDQUFDO1FBQ3hFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLHlDQUF5QyxDQUFDLENBQUM7UUFDL0QsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLE9BQU8sU0FBUyxDQUFDLFNBQVMsS0FBSyxRQUFRO1dBQ3RDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssU0FBUyxDQUFDLFNBQVM7V0FDbEQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztXQUM5QixTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNELElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN4RSxNQUFNLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELElBQUksT0FBTyxTQUFTLENBQUMsWUFBWSxLQUFLLFFBQVE7V0FDekMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSyxTQUFTLENBQUMsWUFBWTtXQUN4RCxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELElBQUksT0FBTyxTQUFTLENBQUMsVUFBVSxLQUFLLFFBQVE7V0FDdkMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxTQUFTLENBQUMsVUFBVTtXQUNwRCxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzQixNQUFNLENBQUMsSUFBSSxDQUFDLGlEQUFpRCxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUN6QyxNQUFNLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUNELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxTQUFrQyxDQUFDLEVBQUUsQ0FBQztRQUN2RSxNQUFNLENBQUMsSUFBSSxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsOENBQThDLENBQUMsQ0FBQztJQUM5RCxDQUFDO1NBQU0sQ0FBQztRQUNOLEtBQUssTUFBTSxZQUFZLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7bUJBQy9ELFdBQVcsQ0FBQyxFQUFFLEtBQUssT0FBTzttQkFDMUIsV0FBVyxDQUFDLFlBQVksS0FBSyxZQUFZO21CQUN6QyxXQUFXLENBQUMsUUFBUSxLQUFLLElBQUk7bUJBQzdCLFdBQVcsQ0FBQyxlQUFlLEtBQUssSUFBSTttQkFDcEMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsWUFBWSxXQUFXLENBQUMsQ0FBQztZQUNoRixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7V0FDbEMsT0FBTyxTQUFTLENBQUMsWUFBWSxLQUFLLFFBQVE7V0FDMUMsT0FBTyxTQUFTLENBQUMsVUFBVSxLQUFLLFFBQVE7V0FDeEMsU0FBUyxDQUFDLDBCQUEwQjtnQkFDakMsR0FBRyxTQUFTLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQyxVQUFVLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDaEYsTUFBTSxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSw2Q0FBNkMsR0FBRyxDQUMzRCxRQUFpQixFQUNQLEVBQUU7SUFDWixNQUFNLE1BQU0sR0FBRywrQ0FBK0MsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN6RSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3ZDLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN2RSxNQUFNLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDO1FBQzNELE1BQU0sQ0FBQyxJQUFJLENBQUMsNkRBQTZELENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxJQUFJLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sOENBQThDLEdBQUcsQ0FDNUQsU0FBa0IsRUFDUixFQUFFO0lBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFBRSxPQUFPLENBQUMsMkNBQTJDLENBQUMsQ0FBQztJQUMvRSxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsSUFBSSxDQUFDO1FBQ0gsaUJBQWlCO1FBQ2pCLHFCQUFxQjtRQUNyQixtQkFBbUI7UUFDbkIsZ0JBQWdCO0tBQ2pCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFnQixDQUFDLEVBQUUsQ0FBQztRQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLHlEQUF5RCxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUNELElBQUksT0FBTyxTQUFTLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxXQUFXLENBQVUsRUFBRSxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRywrQkFBK0IsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFDRCxJQUFJLENBQUMsNENBQTRDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDeEUsTUFBTSxDQUFDLElBQUksQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDekMsTUFBTSxDQUFDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN0QyxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxvQ0FBb0MsQ0FDakQsU0FBUyxDQUFDLElBQWdELENBQzNELENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxTQUFTLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQyxXQUFXO2VBQ25ELFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxTQUFTO2VBQ2hELFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxVQUFVO2VBQ2xELFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQyxNQUFNO2VBQ25ELFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQyxZQUFZO2VBQ3RELFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxVQUFVO2VBQ2xELFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVc7ZUFDbkMsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDakYsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUMvQyxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRywwQkFBMEIsQ0FDdkMsU0FBUyxDQUFDLGFBQStDLENBQzFELENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25ELElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7ZUFDdkIsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVM7bUJBQzdELFNBQVMsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUI7bUJBQzlFLFNBQVMsQ0FBQyxhQUFhLENBQUMsY0FBYyxLQUFLLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3BFLE1BQU0sQ0FBQyxJQUFJLENBQUMseURBQXlELENBQUMsQ0FBQztRQUN6RSxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQ3JELE1BQU0sVUFBVSxHQUFHLGFBQWEsS0FBSyxXQUFXLENBQUM7UUFDakQsTUFBTSxNQUFNLEdBQUcsYUFBYSxLQUFLLFFBQVE7ZUFDcEMsYUFBYSxLQUFLLFlBQVk7ZUFDOUIsYUFBYSxLQUFLLGNBQWM7ZUFDaEMsYUFBYSxLQUFLLGFBQWEsQ0FBQztRQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxtQkFBbUIsQ0FBQyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzlELE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztRQUNoRixDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssZ0JBQWdCLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLHdFQUF3RSxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLGlCQUFpQixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUsscUJBQXFCLENBQUM7ZUFDckYsQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLG9FQUFvRSxDQUFDLENBQUM7UUFDcEYsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLE9BQU8sU0FBUyxDQUFDLFlBQVksS0FBSyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWTtXQUNwRSxPQUFPLFNBQVMsQ0FBQyxVQUFVLEtBQUssUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sQ0FBQyxJQUFJLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUNBQXVDLEdBQUcsQ0FBQyxTQUFrQixFQUFZLEVBQUU7SUFDdEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFBRSxPQUFPLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUN2RSxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsSUFBSSxTQUFTLENBQUMsYUFBYSxLQUFLLENBQUM7UUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDMUUsSUFBSSxTQUFTLENBQUMsaUJBQWlCLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDOUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDakQsTUFBTSxDQUFDLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFDRCxJQUFJLFNBQVMsQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLFNBQVMsQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDbEUsTUFBTSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUM7SUFDakQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUN0RCxDQUFDO1NBQU0sQ0FBQztRQUNOLEtBQUssTUFBTSxHQUFHLElBQUk7WUFDaEIsc0JBQXNCO1lBQ3RCLHNCQUFzQjtZQUN0QixxQkFBcUI7WUFDckIsNEJBQTRCO1NBQ3BCLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLGlDQUFpQyxDQUFDLENBQUM7WUFDMUUsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLE9BQU8sV0FBVyxDQUFDLHdCQUF3QixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzlELE1BQU0sQ0FBQyxJQUFJLENBQUMsNkRBQTZELENBQUMsQ0FBQztRQUM3RSxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDM0MsQ0FBQztTQUFNLENBQUM7UUFDTixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO21CQUNqQixDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBNkMsQ0FBQzttQkFDaEYsT0FBTyxPQUFPLENBQUMsT0FBTyxLQUFLLFFBQVE7bUJBQ25DLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLGtFQUFrRSxDQUFDLENBQUM7Z0JBQ2hGLE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLFNBQVMsQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDbkMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckQsTUFBTSxDQUFDLElBQUksQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsUUFBUSxLQUFLLElBQUk7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUUvQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNyRCxNQUFNLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxNQUFNLENBQUMsSUFBSSxDQUFDLGtEQUFrRCxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDbEMsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUNwQyxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDO0lBQzFDLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUM7SUFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUN6RCxDQUFDO1NBQU0sQ0FBQztRQUNOLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFNBQVMsQ0FBVSxFQUFFLENBQUM7WUFDckYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsWUFBWSxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsc0JBQXNCLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDOUUsTUFBTSxDQUFDLElBQUksQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFDRCxJQUFJLE9BQU8sT0FBTyxDQUFDLG1CQUFtQixLQUFLLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7WUFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUN4RCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksY0FBeUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQzFELENBQUM7U0FBTSxDQUFDO1FBQ04sSUFBSSxDQUFDLDRCQUE0QixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4RixNQUFNLENBQUMsSUFBSSxDQUFDLDREQUE0RCxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxDQUFDLENBQUM7UUFDbkUsQ0FBQzthQUFNLENBQUM7WUFDTixjQUFjLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUNqQyxJQUFJLFNBQVMsQ0FBQyxjQUFjLEtBQUssUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNqRCxNQUFNLENBQUMsSUFBSSxDQUFDLDJFQUEyRSxDQUFDLENBQUM7WUFDM0YsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBa0MsQ0FBQyxFQUFFLENBQUM7WUFDdEUsTUFBTSxDQUFDLElBQUksQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxDQUFDLElBQUksQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUUsTUFBTSxDQUFDLElBQUksQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxNQUFNLFlBQVksSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7dUJBQzlELFdBQVcsQ0FBQyxFQUFFLEtBQUssT0FBTzt1QkFDMUIsV0FBVyxDQUFDLFlBQVksS0FBSyxZQUFZO3VCQUN6QyxXQUFXLENBQUMsUUFBUSxLQUFLLElBQUk7dUJBQzdCLFdBQVcsQ0FBQyxlQUFlLEtBQUssSUFBSTt1QkFDcEMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrREFBa0QsWUFBWSxXQUFXLENBQUMsQ0FBQztnQkFDekYsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksb0JBQXdDLENBQUM7SUFDN0MsSUFBSSxlQUFlLEdBQWEsRUFBRSxDQUFDO0lBQ25DLElBQUksZUFBbUMsQ0FBQztJQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDO1FBQ2hELE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUM7UUFDOUMsZUFBZSxHQUFHLFdBQVcsQ0FBQyxlQUF5QixDQUFDO1FBQ3hELG9CQUFvQixHQUFHLFdBQVcsQ0FBQyxvQkFBOEIsQ0FBQztRQUNsRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUM7ZUFDcEQsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztlQUM3RCxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMseUVBQXlFLENBQUMsQ0FBQztRQUN6RixDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO2VBQ2xELFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7ZUFDNUQsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsRCxNQUFNLENBQUMsSUFBSSxDQUFDLDBEQUEwRCxDQUFDLENBQUM7UUFDMUUsQ0FBQzthQUFNLENBQUM7WUFDTixlQUFlLEdBQUcsU0FBcUIsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLElBQUksZUFBZSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsSUFBSSxvQkFBb0IsR0FBRyxDQUFDO2VBQ3RFLG9CQUFvQixLQUFLLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5RSxNQUFNLENBQUMsSUFBSSxDQUFDLGtFQUFrRSxDQUFDLENBQUM7UUFDbEYsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzlELE1BQU0sQ0FBQyxJQUFJLENBQUMsNENBQTRDLENBQUMsQ0FBQztJQUM1RCxDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUksb0JBQW9CLEtBQUssU0FBUyxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztZQUN2RixNQUFNLENBQUMsSUFBSSxDQUFDLDBEQUEwRCxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUNELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDeEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUNuRCxLQUFLLE1BQU0sSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO21CQUNkLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQzttQkFDdkMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBc0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsc0RBQXNELENBQUMsQ0FBQztnQkFDcEUsU0FBUztZQUNYLENBQUM7WUFDRCxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFzQixDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BGLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0RBQStELENBQUMsQ0FBQztZQUMvRSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RGLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0RBQWdELENBQUMsQ0FBQztZQUNoRSxDQUFDO1lBQ0QsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLGNBQWMsRUFBRSxDQUFDO2dCQUM5RCxNQUFNLENBQUMsSUFBSSxDQUFDLDBEQUEwRCxDQUFDLENBQUM7WUFDMUUsQ0FBQztZQUNELElBQUksT0FBTyxJQUFJLENBQUMsY0FBYyxLQUFLLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDM0UsTUFBTSxDQUFDLElBQUksQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1lBQ3RFLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxlQUFlLEtBQUssU0FBUztlQUM1QixlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUNsRyxNQUFNLENBQUMsSUFBSSxDQUFDLGdFQUFnRSxDQUFDLENBQUM7UUFDaEYsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxvQkFBb0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNoRSxJQUFJLFdBQVcsQ0FBQyxvQkFBb0IsS0FBSyxvQkFBb0I7ZUFDeEQsV0FBVyxDQUFDLG9CQUFvQixLQUFLLG9CQUFvQjtlQUN6RCxXQUFXLENBQUMsbUJBQW1CLEtBQUssb0JBQW9CO2VBQ3hELFdBQVcsQ0FBQywwQkFBMEIsS0FBSyxvQkFBb0I7ZUFDL0QsV0FBVyxDQUFDLHdCQUF3QixLQUFLLElBQUksRUFBRSxDQUFDO1lBQ25ELE1BQU0sQ0FBQyxJQUFJLENBQUMsb0VBQW9FLENBQUMsQ0FBQztRQUNwRixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDaEYsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUN0QyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssS0FBSztlQUN4QixNQUFNLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQyxHQUFHO2VBQzNCLE1BQU0sQ0FBQyxTQUFTLEtBQUssT0FBTyxDQUFDLFNBQVM7ZUFDdEMsTUFBTSxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsT0FBTztlQUNsQyxPQUFPLE1BQU0sQ0FBQyxZQUFZLEtBQUssUUFBUTtlQUN2QyxDQUFDLE1BQU0sQ0FBQyxZQUFZO2VBQ3BCLE9BQU8sTUFBTSxDQUFDLFVBQVUsS0FBSyxRQUFRO2VBQ3JDLENBQUMsTUFBTSxDQUFDLFVBQVU7ZUFDbEIsTUFBTSxDQUFDLFFBQVEsS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNyRixNQUFNLENBQUMsSUFBSSxDQUFDLCtFQUErRSxDQUFDLENBQUM7UUFDL0YsQ0FBQztRQUNELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLFVBQVUsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUM5RixNQUFNLHFCQUFxQixHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNyRSxNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxDQUFDO2dCQUNuQyxNQUFNLENBQUMsR0FBRztnQkFDVixNQUFNLENBQUMsUUFBUTtnQkFDZixxQkFBcUI7Z0JBQ3JCLHFCQUFxQjthQUN0QixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBNkIsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JFLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEVBQTRFLENBQUMsQ0FBQztZQUM1RixDQUFDO1lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztnQkFDaEMsTUFBTSxDQUFDLFFBQVE7Z0JBQ2YscUJBQXFCO2dCQUNyQixxQkFBcUI7YUFDdEIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQzttQkFDMUIsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO3VCQUMvQyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBd0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDakUsTUFBTSxDQUFDLElBQUksQ0FBQyxrRkFBa0YsQ0FBQyxDQUFDO1lBQ2xHLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQyJ9
@@ -7,7 +7,25 @@ import type { IImageRelease } from '../data/immutableimage.js';
7
7
  import type { IDeploymentPreflightReport, IDeploymentPreflightRequestData } from '../data/deploymentpreflight.js';
8
8
  import type { IDeploymentReservationInput, IServiceDeploymentOperation, IServiceDeploymentStatus } from '../data/deploymentoperation.js';
9
9
  import type { TSha256Digest } from '../data/immutableimage.js';
10
- import type { IServiceDeploymentAdoptionInput, IServiceDeploymentAdoptionPreflightInput, IServiceDeploymentAdoptionReport, IServiceDeploymentAdoptionResult } from '../data/deploymentadoption.js';
10
+ import type { IServiceDeploymentAdoptionInput, IServiceDeploymentAdoptionImagePromotionInput, IServiceDeploymentAdoptionImagePromotionResult, IServiceDeploymentAdoptionRolloutInput, IServiceDeploymentAdoptionRolloutResult, IServiceDeploymentAdoptionPreflightInput, IServiceDeploymentAdoptionReport, IServiceDeploymentAdoptionResult } from '../data/deploymentadoption.js';
11
+ export interface IRequest_Any_Cloudly_BootstrapServiceDeploymentAdoptionRollout extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_BootstrapServiceDeploymentAdoptionRollout> {
12
+ method: 'bootstrapServiceDeploymentAdoptionRollout';
13
+ request: IServiceDeploymentAdoptionRolloutInput & {
14
+ identity: IIdentityCredential;
15
+ };
16
+ response: {
17
+ result: IServiceDeploymentAdoptionRolloutResult;
18
+ };
19
+ }
20
+ export interface IRequest_Any_Cloudly_PromoteServiceDeploymentAdoptionImage extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_PromoteServiceDeploymentAdoptionImage> {
21
+ method: 'promoteServiceDeploymentAdoptionImage';
22
+ request: IServiceDeploymentAdoptionImagePromotionInput & {
23
+ identity: IIdentityCredential;
24
+ };
25
+ response: {
26
+ result: IServiceDeploymentAdoptionImagePromotionResult;
27
+ };
28
+ }
11
29
  export interface IRequest_Any_Cloudly_GetServiceDeploymentAdoptionPreflight extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_GetServiceDeploymentAdoptionPreflight> {
12
30
  method: 'getServiceDeploymentAdoptionPreflight';
13
31
  request: IServiceDeploymentAdoptionPreflightInput & {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serve.zone/interfaces",
3
- "version": "16.1.0",
3
+ "version": "16.2.0",
4
4
  "private": false,
5
5
  "description": "Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.",
6
6
  "exports": {
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/interfaces',
6
- version: '16.1.0',
6
+ version: '16.2.0',
7
7
  description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
8
8
  }
@@ -4,13 +4,19 @@ import type {
4
4
  } from './deploymentpreflight.js';
5
5
  import type { IDeployment } from './deployment.js';
6
6
  import type {
7
+ IImageRolloutStatus,
7
8
  IImmutableImageDeploymentPlan,
8
9
  IImmutableRolloutReportEnvelope,
9
10
  IImmutableImageTargetScope,
10
11
  TOciManifestMediaType,
11
12
  TSha256Digest,
12
13
  } from './immutableimage.js';
13
- import { normalizeImmutableReleaseTag, normalizeSha256Digest } from './immutableimage.js';
14
+ import {
15
+ normalizeImmutableReleaseTag,
16
+ normalizeSha256Digest,
17
+ validateImageRolloutStatus,
18
+ validateImmutableImageDeploymentPlan,
19
+ } from './immutableimage.js';
14
20
  import type { IRegistryTarget } from './registry.js';
15
21
 
16
22
  export type TServiceDeploymentAdoptionDecision = 'GO' | 'NO-GO';
@@ -58,6 +64,56 @@ extends IServiceDeploymentAdoptionPreflightInput {
58
64
  expectedAdoptionDigest: TServiceDeploymentAdoptionDigest;
59
65
  }
60
66
 
67
+ export interface IServiceDeploymentAdoptionImagePromotionInput
68
+ extends IServiceDeploymentAdoptionPreflightInput {
69
+ targetReleaseTag: string;
70
+ expectedSourceImageDigest?: TSha256Digest;
71
+ idempotencyKey: string;
72
+ }
73
+
74
+ export interface IServiceDeploymentAdoptionImagePromotionResult {
75
+ status: 'promoted' | 'already-promoted';
76
+ organizationId: string;
77
+ serviceId: string;
78
+ sourceTag: string;
79
+ releaseTag: string;
80
+ registryHost: string;
81
+ repository: string;
82
+ digest: TSha256Digest;
83
+ mediaType:
84
+ | 'application/vnd.oci.image.index.v1+json'
85
+ | 'application/vnd.docker.distribution.manifest.list.v2+json';
86
+ platforms: IOciPlatformDescriptorSummary[];
87
+ releaseId: string;
88
+ digestPinnedImageReference: string;
89
+ }
90
+
91
+ export interface IServiceDeploymentAdoptionRolloutInput
92
+ extends IServiceDeploymentAdoptionPreflightInput {
93
+ releaseTag: string;
94
+ expectedTargetImageDigest: TSha256Digest;
95
+ idempotencyKey: string;
96
+ }
97
+
98
+ export interface IServiceDeploymentAdoptionRolloutResult {
99
+ status:
100
+ | 'rollout-started'
101
+ | 'rollout-in-progress'
102
+ | 'rollout-succeeded'
103
+ | 'rollout-failed';
104
+ idempotentReplay: boolean;
105
+ operationId: string;
106
+ organizationId: string;
107
+ serviceId: string;
108
+ registryHost: string;
109
+ repository: string;
110
+ releaseTag: string;
111
+ digest: TSha256Digest;
112
+ releaseId: string;
113
+ plan: IImmutableImageDeploymentPlan;
114
+ rolloutStatus: IImageRolloutStatus;
115
+ }
116
+
61
117
  interface IServiceDeploymentAdoptionReportBase {
62
118
  schemaVersion: 1;
63
119
  mutationPerformed: false;
@@ -194,6 +250,7 @@ export const validateServiceDeploymentAdoptionRetentionAttestation = (
194
250
  };
195
251
 
196
252
  const boundaryIdentifierRegex = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/;
253
+ const immutableSemverReleaseTagRegex = /^(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)(?:-(?:0|[1-9][0-9]*|[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9][0-9]*|[A-Za-z-][0-9A-Za-z-]*))*)?$/;
197
254
  const indexMediaTypes = new Set<TOciManifestMediaType>([
198
255
  'application/vnd.oci.image.index.v1+json',
199
256
  'application/vnd.docker.distribution.manifest.list.v2+json',
@@ -229,6 +286,15 @@ const isCanonicalDigest = (valueArg: unknown): valueArg is TSha256Digest =>
229
286
  const isNonNegativeInteger = (valueArg: unknown): valueArg is number =>
230
287
  Number.isSafeInteger(valueArg) && (valueArg as number) >= 0;
231
288
 
289
+ export const normalizeServiceDeploymentAdoptionReleaseTag = (
290
+ tagArg: unknown,
291
+ ): string | undefined => {
292
+ const normalizedTag = normalizeImmutableReleaseTag(tagArg);
293
+ return normalizedTag && immutableSemverReleaseTagRegex.test(normalizedTag)
294
+ ? normalizedTag
295
+ : undefined;
296
+ };
297
+
232
298
  export const validateServiceDeploymentAdoptionPreflightInput = (
233
299
  inputArg: unknown,
234
300
  ): string[] => {
@@ -257,6 +323,183 @@ export const validateServiceDeploymentAdoptionInput = (inputArg: unknown): strin
257
323
  return errors;
258
324
  };
259
325
 
326
+ export const validateServiceDeploymentAdoptionImagePromotionInput = (
327
+ inputArg: unknown,
328
+ ): string[] => {
329
+ const errors = validateServiceDeploymentAdoptionPreflightInput(inputArg);
330
+ if (!isRecord(inputArg)) return errors;
331
+ if (!normalizeServiceDeploymentAdoptionReleaseTag(inputArg.targetReleaseTag)) {
332
+ errors.push('targetReleaseTag must be a canonical OCI-safe semantic version tag');
333
+ }
334
+ if (!isBoundedIdentifier(inputArg.idempotencyKey)) {
335
+ errors.push('idempotencyKey must be a bounded canonical identifier');
336
+ }
337
+ if (inputArg.expectedSourceImageDigest !== undefined
338
+ && !isCanonicalDigest(inputArg.expectedSourceImageDigest)) {
339
+ errors.push('expectedSourceImageDigest must be a canonical sha256 digest when provided');
340
+ }
341
+ return errors;
342
+ };
343
+
344
+ export const validateServiceDeploymentAdoptionImagePromotionResult = (
345
+ resultArg: unknown,
346
+ ): string[] => {
347
+ if (!isRecord(resultArg)) return ['adoption image promotion result must be an object'];
348
+ const errors: string[] = [];
349
+ if (resultArg.status !== 'promoted' && resultArg.status !== 'already-promoted') {
350
+ errors.push('status must identify a promoted or already-promoted result');
351
+ }
352
+ for (const key of ['organizationId', 'serviceId', 'releaseId'] as const) {
353
+ if (!isBoundedIdentifier(resultArg[key])) {
354
+ errors.push(`${key} must be a bounded canonical identifier`);
355
+ }
356
+ }
357
+ if (typeof resultArg.sourceTag !== 'string'
358
+ || resultArg.sourceTag.trim() !== resultArg.sourceTag
359
+ || resultArg.sourceTag.length < 1
360
+ || resultArg.sourceTag.length > 128) {
361
+ errors.push('sourceTag must be a bounded canonical registry tag');
362
+ }
363
+ if (!normalizeServiceDeploymentAdoptionReleaseTag(resultArg.releaseTag)) {
364
+ errors.push('releaseTag must be a canonical OCI-safe semantic version tag');
365
+ }
366
+ if (typeof resultArg.registryHost !== 'string'
367
+ || resultArg.registryHost.trim() !== resultArg.registryHost
368
+ || !resultArg.registryHost) {
369
+ errors.push('registryHost must be a non-empty canonical string');
370
+ }
371
+ if (typeof resultArg.repository !== 'string'
372
+ || resultArg.repository.trim() !== resultArg.repository
373
+ || !resultArg.repository) {
374
+ errors.push('repository must be a non-empty canonical string');
375
+ }
376
+ if (!isCanonicalDigest(resultArg.digest)) {
377
+ errors.push('digest must be a canonical sha256 digest');
378
+ }
379
+ if (!indexMediaTypes.has(resultArg.mediaType as TOciManifestMediaType)) {
380
+ errors.push('mediaType must identify an OCI image index');
381
+ }
382
+ if (!Array.isArray(resultArg.platforms)) {
383
+ errors.push('platforms must contain OCI platform evidence');
384
+ } else {
385
+ for (const architecture of ['amd64', 'arm64']) {
386
+ if (!resultArg.platforms.some((platformArg) => isRecord(platformArg)
387
+ && platformArg.os === 'linux'
388
+ && platformArg.architecture === architecture
389
+ && platformArg.runnable === true
390
+ && platformArg.manifestPresent === true
391
+ && isCanonicalDigest(platformArg.digest))) {
392
+ errors.push(`platforms must contain runnable linux/${architecture} evidence`);
393
+ }
394
+ }
395
+ }
396
+ if (isCanonicalDigest(resultArg.digest)
397
+ && typeof resultArg.registryHost === 'string'
398
+ && typeof resultArg.repository === 'string'
399
+ && resultArg.digestPinnedImageReference
400
+ !== `${resultArg.registryHost}/${resultArg.repository}@${resultArg.digest}`) {
401
+ errors.push('digestPinnedImageReference must bind the exact registry digest');
402
+ }
403
+ return errors;
404
+ };
405
+
406
+ export const validateServiceDeploymentAdoptionRolloutInput = (
407
+ inputArg: unknown,
408
+ ): string[] => {
409
+ const errors = validateServiceDeploymentAdoptionPreflightInput(inputArg);
410
+ if (!isRecord(inputArg)) return errors;
411
+ if (!normalizeServiceDeploymentAdoptionReleaseTag(inputArg.releaseTag)) {
412
+ errors.push('releaseTag must be a canonical OCI-safe semantic version tag');
413
+ }
414
+ if (!isCanonicalDigest(inputArg.expectedTargetImageDigest)) {
415
+ errors.push('expectedTargetImageDigest must be a canonical sha256 digest');
416
+ }
417
+ if (!isBoundedIdentifier(inputArg.idempotencyKey)) {
418
+ errors.push('idempotencyKey must be a bounded canonical identifier');
419
+ }
420
+ return errors;
421
+ };
422
+
423
+ export const validateServiceDeploymentAdoptionRolloutResult = (
424
+ resultArg: unknown,
425
+ ): string[] => {
426
+ if (!isRecord(resultArg)) return ['adoption rollout result must be an object'];
427
+ const errors: string[] = [];
428
+ if (![
429
+ 'rollout-started',
430
+ 'rollout-in-progress',
431
+ 'rollout-succeeded',
432
+ 'rollout-failed',
433
+ ].includes(resultArg.status as string)) {
434
+ errors.push('status must identify a supported adoption rollout state');
435
+ }
436
+ if (typeof resultArg.idempotentReplay !== 'boolean') {
437
+ errors.push('idempotentReplay must be boolean');
438
+ }
439
+ for (const key of ['operationId', 'organizationId', 'serviceId', 'releaseId'] as const) {
440
+ if (!isBoundedIdentifier(resultArg[key])) errors.push(`${key} must be a bounded identifier`);
441
+ }
442
+ if (!normalizeServiceDeploymentAdoptionReleaseTag(resultArg.releaseTag)) {
443
+ errors.push('releaseTag must be a canonical OCI-safe semantic version tag');
444
+ }
445
+ if (!isCanonicalDigest(resultArg.digest)) {
446
+ errors.push('digest must be a canonical sha256 digest');
447
+ }
448
+ if (!isRecord(resultArg.plan)) {
449
+ errors.push('plan must be present');
450
+ } else {
451
+ errors.push(...validateImmutableImageDeploymentPlan(
452
+ resultArg.plan as unknown as IImmutableImageDeploymentPlan,
453
+ ).map((errorArg) => `plan: ${errorArg}`));
454
+ if (resultArg.plan.operationId !== resultArg.operationId
455
+ || resultArg.plan.releaseId !== resultArg.releaseId
456
+ || resultArg.plan.releaseTag !== resultArg.releaseTag
457
+ || resultArg.plan.requestedDigest !== resultArg.digest
458
+ || resultArg.plan.registryHost !== resultArg.registryHost
459
+ || resultArg.plan.repository !== resultArg.repository
460
+ || resultArg.plan.mode !== 'promotion'
461
+ || resultArg.plan.rolloutGeneration !== 1) {
462
+ errors.push('plan must bind the exact generation-one adoption rollout result');
463
+ }
464
+ }
465
+ if (!isRecord(resultArg.rolloutStatus)) {
466
+ errors.push('rolloutStatus must be present');
467
+ } else {
468
+ errors.push(...validateImageRolloutStatus(
469
+ resultArg.rolloutStatus as unknown as IImageRolloutStatus,
470
+ ).map((errorArg) => `rolloutStatus: ${errorArg}`));
471
+ if (isRecord(resultArg.plan)
472
+ && (resultArg.rolloutStatus.rolloutId !== resultArg.plan.rolloutId
473
+ || resultArg.rolloutStatus.rolloutGeneration !== resultArg.plan.rolloutGeneration
474
+ || resultArg.rolloutStatus.expectedDigest !== resultArg.digest)) {
475
+ errors.push('rolloutStatus must bind the exact adoption rollout plan');
476
+ }
477
+ }
478
+ if (isRecord(resultArg.rolloutStatus)) {
479
+ const rolloutStatus = resultArg.rolloutStatus.status;
480
+ const successful = rolloutStatus === 'succeeded';
481
+ const failed = rolloutStatus === 'failed'
482
+ || rolloutStatus === 'mismatched'
483
+ || rolloutStatus === 'rolling-back'
484
+ || rolloutStatus === 'rolled-back';
485
+ if ((resultArg.status === 'rollout-succeeded') !== successful) {
486
+ errors.push('rollout-succeeded must exactly match a succeeded rolloutStatus');
487
+ }
488
+ if ((resultArg.status === 'rollout-failed') !== failed) {
489
+ errors.push('rollout-failed must exactly match a failed or mismatched rolloutStatus');
490
+ }
491
+ if ((resultArg.status === 'rollout-started' || resultArg.status === 'rollout-in-progress')
492
+ && (successful || failed)) {
493
+ errors.push('an active rollout result must not contain a terminal rolloutStatus');
494
+ }
495
+ }
496
+ if (typeof resultArg.registryHost !== 'string' || !resultArg.registryHost
497
+ || typeof resultArg.repository !== 'string' || !resultArg.repository) {
498
+ errors.push('registryHost and repository must be non-empty strings');
499
+ }
500
+ return errors;
501
+ };
502
+
260
503
  export const validateServiceDeploymentAdoptionReport = (reportArg: unknown): string[] => {
261
504
  if (!isRecord(reportArg)) return ['adoption report must be an object'];
262
505
  const errors: string[] = [];
@@ -17,11 +17,43 @@ import type {
17
17
  import type { TSha256Digest } from '../data/immutableimage.js';
18
18
  import type {
19
19
  IServiceDeploymentAdoptionInput,
20
+ IServiceDeploymentAdoptionImagePromotionInput,
21
+ IServiceDeploymentAdoptionImagePromotionResult,
22
+ IServiceDeploymentAdoptionRolloutInput,
23
+ IServiceDeploymentAdoptionRolloutResult,
20
24
  IServiceDeploymentAdoptionPreflightInput,
21
25
  IServiceDeploymentAdoptionReport,
22
26
  IServiceDeploymentAdoptionResult,
23
27
  } from '../data/deploymentadoption.js';
24
28
 
29
+ export interface IRequest_Any_Cloudly_BootstrapServiceDeploymentAdoptionRollout
30
+ extends plugins.typedrequestInterfaces.implementsTR<
31
+ plugins.typedrequestInterfaces.ITypedRequest,
32
+ IRequest_Any_Cloudly_BootstrapServiceDeploymentAdoptionRollout
33
+ > {
34
+ method: 'bootstrapServiceDeploymentAdoptionRollout';
35
+ request: IServiceDeploymentAdoptionRolloutInput & {
36
+ identity: IIdentityCredential;
37
+ };
38
+ response: {
39
+ result: IServiceDeploymentAdoptionRolloutResult;
40
+ };
41
+ }
42
+
43
+ export interface IRequest_Any_Cloudly_PromoteServiceDeploymentAdoptionImage
44
+ extends plugins.typedrequestInterfaces.implementsTR<
45
+ plugins.typedrequestInterfaces.ITypedRequest,
46
+ IRequest_Any_Cloudly_PromoteServiceDeploymentAdoptionImage
47
+ > {
48
+ method: 'promoteServiceDeploymentAdoptionImage';
49
+ request: IServiceDeploymentAdoptionImagePromotionInput & {
50
+ identity: IIdentityCredential;
51
+ };
52
+ response: {
53
+ result: IServiceDeploymentAdoptionImagePromotionResult;
54
+ };
55
+ }
56
+
25
57
  export interface IRequest_Any_Cloudly_GetServiceDeploymentAdoptionPreflight
26
58
  extends plugins.typedrequestInterfaces.implementsTR<
27
59
  plugins.typedrequestInterfaces.ITypedRequest,