@serve.zone/interfaces 32.22.0 → 32.24.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.
Files changed (36) hide show
  1. package/changelog.md +76 -0
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/data/corestorelegacyadoption.d.ts +182 -0
  4. package/dist_ts/data/corestorelegacyadoption.js +292 -0
  5. package/dist_ts/data/index.d.ts +2 -0
  6. package/dist_ts/data/index.js +3 -1
  7. package/dist_ts/data/networkprotection.d.ts +13 -0
  8. package/dist_ts/data/networkprotection.js +8 -2
  9. package/dist_ts/data/runtimelocalstorageclaim.d.ts +73 -10
  10. package/dist_ts/data/runtimelocalstorageclaim.js +89 -2
  11. package/dist_ts/data/service.d.ts +15 -1
  12. package/dist_ts/data/service.js +1 -1
  13. package/dist_ts/data/serviceruntime.d.ts +8 -3
  14. package/dist_ts/data/serviceruntime.js +3 -2
  15. package/dist_ts/data/servicevolumeinitialization.d.ts +91 -0
  16. package/dist_ts/data/servicevolumeinitialization.js +93 -0
  17. package/dist_ts/platform/types.d.ts +45 -0
  18. package/dist_ts/platform/types.js +27 -2
  19. package/dist_ts/requests/corestore.d.ts +60 -0
  20. package/dist_ts/requests/corestore.js +1 -1
  21. package/dist_ts/requests/platform.d.ts +6 -1
  22. package/dist_ts/requests/service.d.ts +23 -0
  23. package/package.json +1 -1
  24. package/readme.md +186 -16
  25. package/ts/00_commitinfo_data.ts +1 -1
  26. package/ts/data/corestorelegacyadoption.ts +481 -0
  27. package/ts/data/index.ts +2 -0
  28. package/ts/data/networkprotection.ts +20 -1
  29. package/ts/data/runtimelocalstorageclaim.ts +169 -10
  30. package/ts/data/service.ts +16 -0
  31. package/ts/data/serviceruntime.ts +8 -2
  32. package/ts/data/servicevolumeinitialization.ts +159 -0
  33. package/ts/platform/types.ts +75 -0
  34. package/ts/requests/corestore.ts +79 -0
  35. package/ts/requests/platform.ts +6 -0
  36. package/ts/requests/service.ts +28 -0
package/changelog.md CHANGED
@@ -1,5 +1,81 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026-09-25 - 32.24.0
4
+
5
+ ### Features
6
+
7
+ - Add NFS and SMB sources to runtime local storage claims.
8
+ - `TRuntimeLocalStorageSource` gains `{ kind: 'nfs', server, export, subPath, version }`
9
+ (`TRuntimeLocalStorageNfsSource`) and `{ kind: 'smb', server, share, subPath, version, credential }`
10
+ (`TRuntimeLocalStorageSmbSource`); `{ kind: 'directory' }` is unchanged and now also named
11
+ `TRuntimeLocalStorageDirectorySource`. `credential` is an `IRuntimeAuthorityReference`, never a
12
+ value, and neither source carries a mount option or a port.
13
+ - `server` is a lowercase fully qualified hostname or a canonical IP literal; `export` a canonical
14
+ absolute path; `share` one segment; `subPath` `.` or canonical relative segments. Every segment is
15
+ printable ASCII without a space, a comma, `=` or a character a mount source or SMB name gives
16
+ meaning to, and never exactly `.` or `..`. `version` pins one kernel `vers=` value: `3`, `4.0`, `4.1` or `4.2` for NFS,
17
+ `3.0`, `3.02` or `3.1.1` for SMB (`runtimeLocalStorageClaimContract.nfsVersions`, `smbVersions`).
18
+ - An `smb` claim is always `initialization: 'empty'`, because SMB carries no POSIX ownership an
19
+ imported tree could keep.
20
+ - Add the Corestore legacy resource blocker `fence-lineage-conflict`: a bucket whose object-storage
21
+ fence lineage is duplicated, does not validate, belongs to another authority or has an unfinished
22
+ mutation, which Corestore's offline adoption refuses. `validateCorestoreLegacyResourceInventory` admits it on a
23
+ bucket only.
24
+
25
+ ### Maintenance
26
+
27
+ - Replace real infrastructure addresses in test fixtures with documentation and synthetic addresses.
28
+ Protected-authority resolvers, platform endpoints and hubs use the synthetic private range
29
+ `192.168.255.0/24`, which keeps them outside `10.0.0.0/8` as the range-coverage test requires.
30
+ Host bind addresses and addresses that only need to be valid use RFC 5737 ranges. Tests only; no
31
+ contract change.
32
+
33
+ ## 2026-09-25 - 32.23.0
34
+
35
+ ### Features
36
+
37
+ - Add service volume initialization for node-local storage claims.
38
+ - `IServiceVolume.initialization` (`TServiceVolumeInitialization`) states how a volume's claim
39
+ starts: `{ kind: 'empty', ownership }` or
40
+ `{ kind: 'import', source: { kind: 'docker-volume', volumeName } }`. `ownership` is either
41
+ `{ kind: 'explicit', uid, gid, mode }` or `{ kind: 'run-as', mode }`, which takes the owner from
42
+ the runtime spec's `runAs`. The field is server-managed: `createService` and `updateService` take
43
+ volumes as `TServiceWritableVolume`, which has no `initialization`.
44
+ - Add the fenced write `IRequest_Any_Cloudly_SetServiceVolumeInitialization`
45
+ (`setServiceVolumeInitialization { identity, serviceId, mountPath, expected, initialization }`).
46
+ It refuses with `IServiceVolumeInitializationErrorData` (`volume-not-found`, `conflict`,
47
+ `volume-initialization-invalid`, `volume-initialization-bound`).
48
+ - Add `validateServiceVolumeInitialization` and `deriveServiceVolumeClaimInitialization`. Nothing
49
+ is defaulted: an absent initialization is refused as `volume-initialization-unknown`, and a
50
+ `run-as` ownership under `runAs: null` as `volume-ownership-unknown`. Both are new service runtime
51
+ refusals.
52
+ - Add contracts for adopting legacy Corestore resources.
53
+ - Corestore's inventory `ICorestoreLegacyResourceInventory` (served at
54
+ `GET /control/legacy-resources`) lists each service's legacy database or bucket with its
55
+ retention intent and its adoption state (`unadopted` with a named blocker or `null`, or
56
+ `authorized` with a binding id). The relay report is `TClusterCorestoreLegacyResourceInventory`.
57
+ Add validators for both and `computeClusterCorestoreLegacyResourceInventorySha256`.
58
+ - Add the requests `getClusterCorestoreLegacyResources` (Cloudly to relay),
59
+ `getCorestoreLegacyResources` (admin read) and `adoptCorestoreLegacyResources`. The last is the
60
+ only path that creates a binding carrying a legacy bucket name and retention intent, checked
61
+ against the inventory at an expected digest. It answers the bindings and the plan, and refuses
62
+ with `ICorestoreLegacyAdoptionErrorData`.
63
+ - `ICorestoreLegacyResourceAdoptionPlanEntry` is exactly the `{ serviceId, capability, bindingId }`
64
+ entry Corestore's `legacy-resource-adoption` migration reads. Add
65
+ `validateCorestoreLegacyResourceAdoptionPlan`, which applies that migration's rules, and
66
+ `createCorestoreLegacyResourceAdoptionPlan`.
67
+ - `IPlatformBinding` gains the server-managed `corestoreLegacyAdoption { nodeId, resourceName,
68
+ inventorySha256 }`, checked by `validatePlatformBindingCorestoreLegacyAdoption`.
69
+ - Add platform binding status reasons: `legacy-adoption-pending` (reported with `provisioning`),
70
+ and `legacy-adoption-conflict` and `legacy-adoption-mismatch` (both reported with `failed`).
71
+ `IPlatformBinding.statusReason` holds the reason and `updatePlatformBindingStatus` reports it.
72
+ `readCorestoreLegacyAdoptionRefusal` reads the reason from the `code` of a Corestore 409, and
73
+ `validatePlatformBindingStatusReason` checks each reason against its status. The service runtime
74
+ gains the waiting reason `legacy-adoption-pending`.
75
+ - `IReportRuntimeNetworkProtectionRequest` gains the optional `hostAddresses`: the addresses a node's
76
+ host carries outside the interfaces the node manages itself, at most 32. Cloudly uses them to name
77
+ the host-local platform endpoints of hosts without a relay.
78
+
3
79
  ## 2026-09-25 - 32.22.0
4
80
 
5
81
  ### Features
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/interfaces',
6
- version: '32.22.0',
6
+ version: '32.24.0',
7
7
  description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsV0FBVyxFQUFFLHVGQUF1RjtDQUNyRyxDQUFBIn0=
@@ -0,0 +1,182 @@
1
+ import type { IObjectStorageRetentionIntent } from '../platform/objectstorageretention.js';
2
+ import type { TPlatformBindingStatusReason } from '../platform/types.js';
3
+ /**
4
+ * Moving a service's legacy Corestore resources into credential bindings.
5
+ *
6
+ * A Corestore root converted from a release before 32 still holds the databases and buckets
7
+ * `/resources/provision` created, one per service and capability, in its manifest. Corestore
8
+ * refuses a credential binding beside such a resource until an operator authorizes that exact
9
+ * binding to adopt it, offline, with a plan file. The flow across the three owners:
10
+ *
11
+ * 1. Corestore answers `GET /control/legacy-resources` with its `ICorestoreLegacyResourceInventory`;
12
+ * the cluster relay reads it for Cloudly (`getClusterCorestoreLegacyResources`).
13
+ * 2. `adoptCorestoreLegacyResources` checks the admin's selection against that inventory at an
14
+ * exact digest, creates each adopting binding with the legacy bucket and retention intent, and
15
+ * answers the plan (`ICorestoreLegacyResourceAdoptionPlanEntry[]`).
16
+ * 3. The operator stops Corestore and runs its `legacy-resource-adoption` migration with that plan.
17
+ * Until then Corestore refuses the binding, which reports `legacy-adoption-pending`.
18
+ */
19
+ export type TCorestoreLegacyCapability = 'database' | 'objectstorage';
20
+ /**
21
+ * Why Corestore's offline adoption would refuse an unadopted resource:
22
+ *
23
+ * - `not-adoptable`: its identity is not what a credential binding can adopt (an
24
+ * allocation-managed database, another provider, a resource name that differs from its database
25
+ * or bucket name, or a bucket name that is not a canonical S3 name);
26
+ * - `ordinary-credentials-rotated`: its credentials were rotated, so the delivered ones are no
27
+ * longer the generation a binding adopts;
28
+ * - `owned-by-binding`: a credential binding or a named storage binding already owns the service
29
+ * capability, the resource or the bucket;
30
+ * - `fence-lineage-conflict`: the bucket's object-storage fence lineage cannot move to the adopting
31
+ * binding, because the bucket has more than one lineage, or its lineage does not validate,
32
+ * belongs to another authority or has an unfinished mutation. Only a bucket has a fence lineage,
33
+ * so a database never names it.
34
+ */
35
+ export type TCorestoreLegacyResourceBlocker = 'not-adoptable' | 'ordinary-credentials-rotated' | 'owned-by-binding' | 'fence-lineage-conflict';
36
+ /**
37
+ * `unadopted` names what would stop the offline adoption, or `null` when nothing would;
38
+ * `authorized` names the binding the operator authorized, which is the only binding Corestore will
39
+ * let take the resource. A consumed adoption leaves no legacy resource behind, so it never appears.
40
+ */
41
+ export type TCorestoreLegacyResourceAdoption = {
42
+ state: 'unadopted';
43
+ blocker: TCorestoreLegacyResourceBlocker | null;
44
+ } | {
45
+ state: 'authorized';
46
+ bindingId: string;
47
+ };
48
+ /**
49
+ * One legacy resource, by the identity Corestore's manifest states. A database is named by its
50
+ * database name, a bucket by its bucket name and its retention intent, `null` when it has none.
51
+ */
52
+ export type TCorestoreLegacyResource = {
53
+ capability: 'database';
54
+ databaseName: string;
55
+ adoption: TCorestoreLegacyResourceAdoption;
56
+ } | {
57
+ capability: 'objectstorage';
58
+ bucketName: string;
59
+ retention: IObjectStorageRetentionIntent | null;
60
+ adoption: TCorestoreLegacyResourceAdoption;
61
+ };
62
+ /** One service's legacy resources, at most one per capability, `database` first. */
63
+ export interface ICorestoreLegacyServiceResources {
64
+ serviceId: string;
65
+ resources: TCorestoreLegacyResource[];
66
+ }
67
+ /** What Corestore answers on `GET /control/legacy-resources`: every service, sorted by id. */
68
+ export interface ICorestoreLegacyResourceInventory {
69
+ services: ICorestoreLegacyServiceResources[];
70
+ }
71
+ /**
72
+ * One node's legacy resources as the cluster relay read them. An unreachable node names why and
73
+ * lists nothing, because a silent empty list would read as a node with nothing to adopt.
74
+ */
75
+ export type TClusterCorestoreLegacyResourceInventory = {
76
+ nodeId: string;
77
+ checkedAt: number;
78
+ reachable: true;
79
+ services: ICorestoreLegacyServiceResources[];
80
+ } | {
81
+ nodeId: string;
82
+ checkedAt: number;
83
+ reachable: false;
84
+ errorCode: 'CORESTORE_ENDPOINT_UNKNOWN' | 'CORESTORE_UNREACHABLE';
85
+ };
86
+ /** One resource an administrator selects for adoption. */
87
+ export interface ICorestoreLegacyResourceSelection {
88
+ serviceId: string;
89
+ capability: TCorestoreLegacyCapability;
90
+ }
91
+ /**
92
+ * One entry of Corestore's offline adoption plan, exactly the object its
93
+ * `legacy-resource-adoption` migration reads: the service, the capability and the binding that may
94
+ * adopt its legacy resource. The legacy identity is Corestore's own and is not restated here.
95
+ */
96
+ export interface ICorestoreLegacyResourceAdoptionPlanEntry {
97
+ serviceId: string;
98
+ capability: TCorestoreLegacyCapability;
99
+ bindingId: string;
100
+ }
101
+ /**
102
+ * Why `adoptCorestoreLegacyResources` wrote nothing:
103
+ *
104
+ * - `legacy-inventory-unreachable`: the relay could not read the node's Corestore (retryable);
105
+ * - `legacy-inventory-changed`: the inventory no longer has `expectedInventorySha256`;
106
+ * - `legacy-resource-absent`: a selected service has no legacy resource of that capability;
107
+ * - `legacy-resource-blocked`: a selected resource is unadopted with a blocker;
108
+ * - `legacy-resource-authorized-elsewhere`: a selected resource is authorized for a binding Cloudly
109
+ * does not hold as that resource's adoption;
110
+ * - `service-absent`: Cloudly has no such service;
111
+ * - `binding-exists`: the service already has a binding of that capability that adopts nothing,
112
+ * or adopts another resource.
113
+ */
114
+ export type TCorestoreLegacyAdoptionRefusal = 'legacy-inventory-unreachable' | 'legacy-inventory-changed' | 'legacy-resource-absent' | 'legacy-resource-blocked' | 'legacy-resource-authorized-elsewhere' | 'service-absent' | 'binding-exists';
115
+ /** The named refusal of `adoptCorestoreLegacyResources`, sent as `TypedResponseError.errorData`. */
116
+ export interface ICorestoreLegacyAdoptionErrorData {
117
+ code: TCorestoreLegacyAdoptionRefusal;
118
+ /** True for `legacy-inventory-unreachable` only; every other refusal needs a new read first. */
119
+ retryable: boolean;
120
+ }
121
+ export declare const corestoreLegacyAdoptionContract: Readonly<{
122
+ /** Corestore's control path for its legacy inventory, bearer-authenticated like every other. */
123
+ readonly inventoryPath: "/control/legacy-resources";
124
+ /** Corestore's own plan bound, which also bounds a selection and an inventory. */
125
+ readonly maximumPlanEntries: 4096;
126
+ readonly maximumServices: 4096;
127
+ readonly maximumNameLength: 255;
128
+ readonly digestDomain: "serve.zone/corestore-legacy-resources";
129
+ }>;
130
+ /** Validates Corestore's answer on its legacy inventory path and names every reason it is refused. */
131
+ export declare const validateCorestoreLegacyResourceInventory: (valueArg: unknown, pathArg?: string) => string[];
132
+ /** Validates one node's legacy inventory as the relay reports it. Shape only. */
133
+ export declare const validateClusterCorestoreLegacyResourceInventory: (valueArg: unknown, pathArg?: string) => string[];
134
+ /**
135
+ * The digest an adoption is checked against: the node and its services, not the read time, so two
136
+ * reads of an unchanged Corestore agree. Throws for an invalid or unreachable inventory.
137
+ */
138
+ export declare const computeClusterCorestoreLegacyResourceInventorySha256: (inventoryArg: TClusterCorestoreLegacyResourceInventory) => Promise<string>;
139
+ /** Validates an administrator's selection: 1..4096 exact entries, sorted by service then capability. */
140
+ export declare const validateCorestoreLegacyResourceSelections: (valueArg: unknown, pathArg?: string) => string[];
141
+ /**
142
+ * Validates an adoption plan by the rules Corestore's migration applies: a non-empty array of at
143
+ * most 4096 exact `{ serviceId, capability, bindingId }` entries, canonical identifiers, and no
144
+ * service capability or binding id twice. Order is free.
145
+ */
146
+ export declare const validateCorestoreLegacyResourceAdoptionPlan: (valueArg: unknown, pathArg?: string) => string[];
147
+ /** The binding fields an adoption judges; a full `IPlatformBinding` satisfies it. */
148
+ export interface ICorestoreLegacyAdoptionBindingView {
149
+ id: string;
150
+ serviceId: string;
151
+ capability: string;
152
+ objectstorageBucketName?: string;
153
+ objectstorageRetention?: {
154
+ intent: IObjectStorageRetentionIntent;
155
+ };
156
+ corestoreLegacyAdoption?: {
157
+ nodeId: string;
158
+ resourceName: string;
159
+ inventorySha256: string;
160
+ };
161
+ }
162
+ /**
163
+ * Content check of one adopting binding against the inventory it was adopted at, and the one rule
164
+ * that lets a binding carry a legacy bucket name: the binding names this node, this inventory
165
+ * digest and the legacy resource's name; the resource is unadopted without a blocker or authorized
166
+ * for exactly this binding; an adopted bucket's `objectstorageBucketName` is the legacy bucket and
167
+ * its retention intent the legacy intent exactly, absent when the legacy bucket has none; a
168
+ * database binding carries neither. Whether the digest is current is the caller's to check.
169
+ */
170
+ export declare const validatePlatformBindingCorestoreLegacyAdoption: (bindingArg: ICorestoreLegacyAdoptionBindingView, inventoryArg: TClusterCorestoreLegacyResourceInventory, inventorySha256Arg: string, pathArg?: string) => string[];
171
+ /**
172
+ * The plan for every adopting binding, sorted by service then capability, in the exact entry shape
173
+ * Corestore's migration reads. Throws unless every binding adopts a legacy resource and the result
174
+ * is a valid plan.
175
+ */
176
+ export declare const createCorestoreLegacyResourceAdoptionPlan: (bindingsArg: readonly ICorestoreLegacyAdoptionBindingView[]) => ICorestoreLegacyResourceAdoptionPlanEntry[];
177
+ /**
178
+ * The binding status reason a Corestore control answer names: a 409 whose body is
179
+ * `{ ok: false, error, code }` with `code` one of the legacy adoption reasons. Every other answer,
180
+ * including a 409 with another code, names none and keeps its ordinary failure handling.
181
+ */
182
+ export declare const readCorestoreLegacyAdoptionRefusal: (statusCodeArg: number, bodyArg: unknown) => TPlatformBindingStatusReason | null;
@@ -0,0 +1,292 @@
1
+ import { objectStorageRetentionIntentsEqual, validateObjectStorageRetentionIntent, } from '../platform/objectstorageretention.js';
2
+ import { validatePlatformObjectStorageBucketName } from '../platform/objectstorage.js';
3
+ import { platformBindingStatusReasons } from '../platform/types.js';
4
+ import { canonicalizeStrictJson, compareWireTokens, createCanonicalJsonSha256Hex, } from '../private/canonicaljson.js';
5
+ import { hasExactKeys, isPlainRecord } from '../private/dataproperties.js';
6
+ import { isClusterNodeId } from '../private/nodeidentifier.js';
7
+ export const corestoreLegacyAdoptionContract = Object.freeze({
8
+ /** Corestore's control path for its legacy inventory, bearer-authenticated like every other. */
9
+ inventoryPath: '/control/legacy-resources',
10
+ /** Corestore's own plan bound, which also bounds a selection and an inventory. */
11
+ maximumPlanEntries: 4096,
12
+ maximumServices: 4096,
13
+ maximumNameLength: 255,
14
+ digestDomain: 'serve.zone/corestore-legacy-resources',
15
+ });
16
+ const identifierPattern = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/;
17
+ const printableNamePattern = /^[\x21-\x7e]+$/;
18
+ const bareSha256Pattern = /^[a-f0-9]{64}$/;
19
+ const blockers = [
20
+ 'not-adoptable', 'ordinary-credentials-rotated', 'owned-by-binding', 'fence-lineage-conflict',
21
+ ];
22
+ const isIdentifier = (valueArg) => (typeof valueArg === 'string' && identifierPattern.test(valueArg));
23
+ const isLegacyName = (valueArg) => (typeof valueArg === 'string'
24
+ && valueArg.length <= corestoreLegacyAdoptionContract.maximumNameLength
25
+ && printableNamePattern.test(valueArg));
26
+ const isCapability = (valueArg) => (valueArg === 'database' || valueArg === 'objectstorage');
27
+ const validateAdoption = (valueArg, capabilityArg, pathArg) => {
28
+ if (!isPlainRecord(valueArg))
29
+ return [`${pathArg} must use its exact schema`];
30
+ if (valueArg.state === 'unadopted') {
31
+ if (!hasExactKeys(valueArg, ['state', 'blocker']))
32
+ return [`${pathArg} must use its exact schema`];
33
+ if (valueArg.blocker !== null && !blockers.includes(valueArg.blocker)) {
34
+ return [`${pathArg} blocker must be null or a named blocker`];
35
+ }
36
+ return valueArg.blocker === 'fence-lineage-conflict' && capabilityArg !== 'objectstorage'
37
+ ? [`${pathArg} blocker fence-lineage-conflict must name a bucket`]
38
+ : [];
39
+ }
40
+ if (valueArg.state === 'authorized') {
41
+ if (!hasExactKeys(valueArg, ['state', 'bindingId']))
42
+ return [`${pathArg} must use its exact schema`];
43
+ return isIdentifier(valueArg.bindingId) ? [] : [`${pathArg} bindingId must be a canonical identifier`];
44
+ }
45
+ return [`${pathArg} state must be unadopted or authorized`];
46
+ };
47
+ /** An adoptable resource is one the offline adoption could authorize or already did. */
48
+ const isAdoptable = (adoptionArg) => (isPlainRecord(adoptionArg) && (adoptionArg.state === 'authorized' || adoptionArg.blocker === null));
49
+ const validateResource = (valueArg, pathArg) => {
50
+ if (!isPlainRecord(valueArg))
51
+ return [`${pathArg} must use its exact schema`];
52
+ if (valueArg.capability === 'database') {
53
+ if (!hasExactKeys(valueArg, ['capability', 'databaseName', 'adoption'])) {
54
+ return [`${pathArg} must use its exact schema`];
55
+ }
56
+ const errors = validateAdoption(valueArg.adoption, 'database', `${pathArg} adoption`);
57
+ if (!isLegacyName(valueArg.databaseName))
58
+ errors.push(`${pathArg} databaseName must be a bounded printable name`);
59
+ return errors;
60
+ }
61
+ if (valueArg.capability === 'objectstorage') {
62
+ if (!hasExactKeys(valueArg, ['capability', 'bucketName', 'retention', 'adoption'])) {
63
+ return [`${pathArg} must use its exact schema`];
64
+ }
65
+ const errors = validateAdoption(valueArg.adoption, 'objectstorage', `${pathArg} adoption`);
66
+ if (!isLegacyName(valueArg.bucketName)) {
67
+ errors.push(`${pathArg} bucketName must be a bounded printable name`);
68
+ }
69
+ else if (errors.length === 0 && isAdoptable(valueArg.adoption)) {
70
+ // A binding request carries only a canonical bucket, so an adoptable bucket has to be one.
71
+ errors.push(...validatePlatformObjectStorageBucketName(valueArg.bucketName, `${pathArg} bucketName`));
72
+ }
73
+ if (valueArg.retention !== null) {
74
+ errors.push(...validateObjectStorageRetentionIntent(valueArg.retention, `${pathArg} retention`));
75
+ }
76
+ return errors;
77
+ }
78
+ return [`${pathArg} capability must be database or objectstorage`];
79
+ };
80
+ const validateServices = (valueArg, pathArg) => {
81
+ if (!Array.isArray(valueArg) || valueArg.length > corestoreLegacyAdoptionContract.maximumServices) {
82
+ return [`${pathArg} must be a bounded array`];
83
+ }
84
+ const errors = [];
85
+ let previousServiceId;
86
+ for (const [index, service] of valueArg.entries()) {
87
+ const servicePath = `${pathArg}[${index}]`;
88
+ if (!isPlainRecord(service) || !hasExactKeys(service, ['serviceId', 'resources'])) {
89
+ errors.push(`${servicePath} must use its exact schema`);
90
+ continue;
91
+ }
92
+ if (!isIdentifier(service.serviceId)) {
93
+ errors.push(`${servicePath} serviceId must be a canonical identifier`);
94
+ }
95
+ else {
96
+ if (previousServiceId !== undefined && compareWireTokens(previousServiceId, service.serviceId) >= 0) {
97
+ errors.push(`${pathArg} must be sorted by serviceId without repeats`);
98
+ }
99
+ previousServiceId = service.serviceId;
100
+ }
101
+ if (!Array.isArray(service.resources) || service.resources.length < 1 || service.resources.length > 2) {
102
+ errors.push(`${servicePath} resources must list one or two resources`);
103
+ continue;
104
+ }
105
+ for (const [resourceIndex, resource] of service.resources.entries()) {
106
+ errors.push(...validateResource(resource, `${servicePath} resources[${resourceIndex}]`));
107
+ }
108
+ if (service.resources.length === 2
109
+ && !(isPlainRecord(service.resources[0]) && service.resources[0].capability === 'database'
110
+ && isPlainRecord(service.resources[1]) && service.resources[1].capability === 'objectstorage')) {
111
+ errors.push(`${servicePath} resources must hold one database before one objectstorage resource`);
112
+ }
113
+ }
114
+ return errors;
115
+ };
116
+ /** Validates Corestore's answer on its legacy inventory path and names every reason it is refused. */
117
+ export const validateCorestoreLegacyResourceInventory = (valueArg, pathArg = 'corestore legacy resource inventory') => {
118
+ if (!isPlainRecord(valueArg) || !hasExactKeys(valueArg, ['services'])) {
119
+ return [`${pathArg} must use its exact schema`];
120
+ }
121
+ return validateServices(valueArg.services, `${pathArg} services`);
122
+ };
123
+ /** Validates one node's legacy inventory as the relay reports it. Shape only. */
124
+ export const validateClusterCorestoreLegacyResourceInventory = (valueArg, pathArg = 'cluster corestore legacy resource inventory') => {
125
+ if (!isPlainRecord(valueArg))
126
+ return [`${pathArg} must use its exact schema`];
127
+ const reachable = valueArg.reachable;
128
+ if (reachable === true
129
+ ? !hasExactKeys(valueArg, ['nodeId', 'checkedAt', 'reachable', 'services'])
130
+ : reachable !== false || !hasExactKeys(valueArg, ['nodeId', 'checkedAt', 'reachable', 'errorCode'])) {
131
+ return [`${pathArg} must use its exact schema`];
132
+ }
133
+ const errors = [];
134
+ if (!isClusterNodeId(valueArg.nodeId))
135
+ errors.push(`${pathArg} nodeId must be a node id`);
136
+ if (!Number.isSafeInteger(valueArg.checkedAt) || valueArg.checkedAt < 0) {
137
+ errors.push(`${pathArg} checkedAt must be a non-negative safe integer`);
138
+ }
139
+ if (reachable === true) {
140
+ errors.push(...validateServices(valueArg.services, `${pathArg} services`));
141
+ }
142
+ else if (valueArg.errorCode !== 'CORESTORE_ENDPOINT_UNKNOWN' && valueArg.errorCode !== 'CORESTORE_UNREACHABLE') {
143
+ errors.push(`${pathArg} errorCode must name why the node could not be read`);
144
+ }
145
+ return errors;
146
+ };
147
+ const failDigest = (reasonArg) => {
148
+ throw new Error(reasonArg);
149
+ };
150
+ /**
151
+ * The digest an adoption is checked against: the node and its services, not the read time, so two
152
+ * reads of an unchanged Corestore agree. Throws for an invalid or unreachable inventory.
153
+ */
154
+ export const computeClusterCorestoreLegacyResourceInventorySha256 = async (inventoryArg) => {
155
+ const errors = validateClusterCorestoreLegacyResourceInventory(inventoryArg);
156
+ if (errors.length > 0)
157
+ throw new Error(errors[0]);
158
+ if (inventoryArg.reachable !== true)
159
+ throw new Error('an unreachable legacy inventory has no digest');
160
+ return createCanonicalJsonSha256Hex(canonicalizeStrictJson({
161
+ domain: corestoreLegacyAdoptionContract.digestDomain,
162
+ nodeId: inventoryArg.nodeId,
163
+ services: inventoryArg.services,
164
+ }, failDigest, 'corestore legacy resource inventory'), failDigest);
165
+ };
166
+ const selectionKey = (entryArg) => `${entryArg.serviceId}\u0000${entryArg.capability}`;
167
+ /** Validates an administrator's selection: 1..4096 exact entries, sorted by service then capability. */
168
+ export const validateCorestoreLegacyResourceSelections = (valueArg, pathArg = 'corestore legacy resource selection') => {
169
+ if (!Array.isArray(valueArg) || valueArg.length < 1
170
+ || valueArg.length > corestoreLegacyAdoptionContract.maximumPlanEntries) {
171
+ return [`${pathArg} must be a non-empty bounded array`];
172
+ }
173
+ const errors = [];
174
+ let previous;
175
+ for (const [index, entry] of valueArg.entries()) {
176
+ if (!isPlainRecord(entry) || !hasExactKeys(entry, ['serviceId', 'capability'])
177
+ || !isIdentifier(entry.serviceId) || !isCapability(entry.capability)) {
178
+ errors.push(`${pathArg}[${index}] must be an exact { serviceId, capability }`);
179
+ continue;
180
+ }
181
+ const key = selectionKey(entry);
182
+ if (previous !== undefined && compareWireTokens(previous, key) >= 0) {
183
+ errors.push(`${pathArg} must be sorted by serviceId then capability without repeats`);
184
+ }
185
+ previous = key;
186
+ }
187
+ return errors;
188
+ };
189
+ /**
190
+ * Validates an adoption plan by the rules Corestore's migration applies: a non-empty array of at
191
+ * most 4096 exact `{ serviceId, capability, bindingId }` entries, canonical identifiers, and no
192
+ * service capability or binding id twice. Order is free.
193
+ */
194
+ export const validateCorestoreLegacyResourceAdoptionPlan = (valueArg, pathArg = 'adoption plan') => {
195
+ if (!Array.isArray(valueArg) || valueArg.length === 0
196
+ || valueArg.length > corestoreLegacyAdoptionContract.maximumPlanEntries) {
197
+ return [`${pathArg} must be a non-empty bounded array`];
198
+ }
199
+ const errors = [];
200
+ const serviceCapabilities = new Set();
201
+ const bindingIds = new Set();
202
+ for (const [index, entry] of valueArg.entries()) {
203
+ if (!isPlainRecord(entry) || !hasExactKeys(entry, ['serviceId', 'capability', 'bindingId'])
204
+ || !isIdentifier(entry.serviceId) || !isIdentifier(entry.bindingId) || !isCapability(entry.capability)) {
205
+ errors.push(`${pathArg} entry ${index} must be an exact { serviceId, capability, bindingId }`);
206
+ continue;
207
+ }
208
+ const serviceCapability = selectionKey(entry);
209
+ if (serviceCapabilities.has(serviceCapability) || bindingIds.has(entry.bindingId)) {
210
+ errors.push(`${pathArg} entry ${index} repeats a service capability or binding id`);
211
+ }
212
+ serviceCapabilities.add(serviceCapability);
213
+ bindingIds.add(entry.bindingId);
214
+ }
215
+ return errors;
216
+ };
217
+ /**
218
+ * Content check of one adopting binding against the inventory it was adopted at, and the one rule
219
+ * that lets a binding carry a legacy bucket name: the binding names this node, this inventory
220
+ * digest and the legacy resource's name; the resource is unadopted without a blocker or authorized
221
+ * for exactly this binding; an adopted bucket's `objectstorageBucketName` is the legacy bucket and
222
+ * its retention intent the legacy intent exactly, absent when the legacy bucket has none; a
223
+ * database binding carries neither. Whether the digest is current is the caller's to check.
224
+ */
225
+ export const validatePlatformBindingCorestoreLegacyAdoption = (bindingArg, inventoryArg, inventorySha256Arg, pathArg = 'platform binding corestoreLegacyAdoption') => {
226
+ if (validateClusterCorestoreLegacyResourceInventory(inventoryArg).length > 0 || inventoryArg.reachable !== true
227
+ || typeof inventorySha256Arg !== 'string' || !bareSha256Pattern.test(inventorySha256Arg)) {
228
+ return [`${pathArg} needs a valid reachable inventory and its digest`];
229
+ }
230
+ const adoption = bindingArg.corestoreLegacyAdoption;
231
+ if (!isPlainRecord(adoption) || !hasExactKeys(adoption, ['nodeId', 'resourceName', 'inventorySha256'])) {
232
+ return [`${pathArg} must use its exact schema`];
233
+ }
234
+ if (adoption.nodeId !== inventoryArg.nodeId || adoption.inventorySha256 !== inventorySha256Arg) {
235
+ return [`${pathArg} must name the inventory's node and digest`];
236
+ }
237
+ if (!isCapability(bindingArg.capability))
238
+ return [`${pathArg} needs a database or objectstorage binding`];
239
+ const resource = inventoryArg.services.find((serviceArg) => serviceArg.serviceId === bindingArg.serviceId)
240
+ ?.resources.find((resourceArg) => resourceArg.capability === bindingArg.capability);
241
+ if (!resource)
242
+ return [`${pathArg} names no legacy resource of the service and capability`];
243
+ const errors = [];
244
+ const legacyName = resource.capability === 'database' ? resource.databaseName : resource.bucketName;
245
+ if (adoption.resourceName !== legacyName)
246
+ errors.push(`${pathArg} resourceName must be the legacy resource's name`);
247
+ if (resource.adoption.state === 'unadopted' ? resource.adoption.blocker !== null
248
+ : resource.adoption.bindingId !== bindingArg.id) {
249
+ errors.push(`${pathArg} names a resource that is blocked or authorized for another binding`);
250
+ }
251
+ if (resource.capability === 'objectstorage') {
252
+ if (bindingArg.objectstorageBucketName !== resource.bucketName) {
253
+ errors.push(`${pathArg} objectstorageBucketName must be the legacy bucket`);
254
+ }
255
+ if (resource.retention === null
256
+ ? bindingArg.objectstorageRetention !== undefined
257
+ : !objectStorageRetentionIntentsEqual(bindingArg.objectstorageRetention?.intent, resource.retention)) {
258
+ errors.push(`${pathArg} retention intent must be the legacy bucket's exactly`);
259
+ }
260
+ }
261
+ else if (bindingArg.objectstorageBucketName !== undefined || bindingArg.objectstorageRetention !== undefined) {
262
+ errors.push(`${pathArg} database binding must carry no bucket or retention`);
263
+ }
264
+ return errors;
265
+ };
266
+ /**
267
+ * The plan for every adopting binding, sorted by service then capability, in the exact entry shape
268
+ * Corestore's migration reads. Throws unless every binding adopts a legacy resource and the result
269
+ * is a valid plan.
270
+ */
271
+ export const createCorestoreLegacyResourceAdoptionPlan = (bindingsArg) => {
272
+ const plan = bindingsArg.map((bindingArg) => {
273
+ if (bindingArg.corestoreLegacyAdoption === undefined || !isCapability(bindingArg.capability)) {
274
+ throw new Error(`binding ${bindingArg.id} adopts no legacy Corestore resource`);
275
+ }
276
+ return { serviceId: bindingArg.serviceId, capability: bindingArg.capability, bindingId: bindingArg.id };
277
+ }).sort((leftArg, rightArg) => compareWireTokens(selectionKey(leftArg), selectionKey(rightArg)));
278
+ const errors = validateCorestoreLegacyResourceAdoptionPlan(plan);
279
+ if (errors.length > 0)
280
+ throw new Error(errors[0]);
281
+ return plan;
282
+ };
283
+ /**
284
+ * The binding status reason a Corestore control answer names: a 409 whose body is
285
+ * `{ ok: false, error, code }` with `code` one of the legacy adoption reasons. Every other answer,
286
+ * including a 409 with another code, names none and keeps its ordinary failure handling.
287
+ */
288
+ export const readCorestoreLegacyAdoptionRefusal = (statusCodeArg, bodyArg) => (statusCodeArg === 409 && isPlainRecord(bodyArg) && bodyArg.ok === false
289
+ && platformBindingStatusReasons.includes(bodyArg.code)
290
+ ? bodyArg.code
291
+ : null);
292
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZXN0b3JlbGVnYWN5YWRvcHRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2NvcmVzdG9yZWxlZ2FjeWFkb3B0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxrQ0FBa0MsRUFDbEMsb0NBQW9DLEdBQ3JDLE1BQU0sdUNBQXVDLENBQUM7QUFDL0MsT0FBTyxFQUFFLHVDQUF1QyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFdkYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEUsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixpQkFBaUIsRUFDakIsNEJBQTRCLEdBQzdCLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFzSS9ELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDM0QsZ0dBQWdHO0lBQ2hHLGFBQWEsRUFBRSwyQkFBMkI7SUFDMUMsa0ZBQWtGO0lBQ2xGLGtCQUFrQixFQUFFLElBQUk7SUFDeEIsZUFBZSxFQUFFLElBQUk7SUFDckIsaUJBQWlCLEVBQUUsR0FBRztJQUN0QixZQUFZLEVBQUUsdUNBQXVDO0NBQzdDLENBQUMsQ0FBQztBQUVaLE1BQU0saUJBQWlCLEdBQUcscUNBQXFDLENBQUM7QUFDaEUsTUFBTSxvQkFBb0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUM5QyxNQUFNLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDO0FBQzNDLE1BQU0sUUFBUSxHQUErQztJQUMzRCxlQUFlLEVBQUUsOEJBQThCLEVBQUUsa0JBQWtCLEVBQUUsd0JBQXdCO0NBQzlGLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxDQUFDLFFBQWlCLEVBQXNCLEVBQUUsQ0FBQyxD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
@@ -7,6 +7,7 @@ export * from './clusteringressdesignation.js';
7
7
  export * from './clusterrelaycredential.js';
8
8
  export * from './config.js';
9
9
  export * from './corestore.js';
10
+ export * from './corestorelegacyadoption.js';
10
11
  export * from './coremail.js';
11
12
  export * from './coremail.runtime.js';
12
13
  export * from './deployment.js';
@@ -66,6 +67,7 @@ export * from './service.js';
66
67
  export * from './servicecredential.js';
67
68
  export * from './serviceports.js';
68
69
  export * from './serviceruntime.js';
70
+ export * from './servicevolumeinitialization.js';
69
71
  export * from './status.js';
70
72
  export * from './taskexecution.js';
71
73
  export * from './traffic.js';
@@ -7,6 +7,7 @@ export * from './clusteringressdesignation.js';
7
7
  export * from './clusterrelaycredential.js';
8
8
  export * from './config.js';
9
9
  export * from './corestore.js';
10
+ export * from './corestorelegacyadoption.js';
10
11
  export * from './coremail.js';
11
12
  export * from './coremail.runtime.js';
12
13
  export * from './deployment.js';
@@ -63,10 +64,11 @@ export * from './service.js';
63
64
  export * from './servicecredential.js';
64
65
  export * from './serviceports.js';
65
66
  export * from './serviceruntime.js';
67
+ export * from './servicevolumeinitialization.js';
66
68
  export * from './status.js';
67
69
  export * from './taskexecution.js';
68
70
  export * from './traffic.js';
69
71
  export * from './user.js';
70
72
  export * from './version.js';
71
73
  export * from './webpush.js';
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLHdCQUF3QixDQUFDO0FBR3ZDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRzlELE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BGLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsY0FBYyxDQUFDIn0=
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsd0JBQXdCLENBQUM7QUFHdkMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHOUQsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDcEYsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGNBQWMsQ0FBQyJ9