@go-to-k/cdkd 0.299.3 → 0.299.4

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.
@@ -2,7 +2,7 @@ import { r as getAwsClients, s as __exportAll } from "./aws-clients-Bj7qH5Ph.js"
2
2
  import { A as UNRENDERABLE, C as looksLikeCdkdGeneratedName, E as withoutGeneratedFallbackName, F as displayStackName, H as truncateCodePoints, I as isPasteableIdent, M as displayAwsMessage, N as displayIdent, O as SECRET_REF_MAX_CODE_POINTS, P as displaySafe, R as plainIdentOr, S as getCurrentStackName, T as withStackName, V as terminalSafe, a as getLogger, b as generateResourceNameWithFallback, d as installLogLineMaskerSource, f as getLiveRenderer, g as applyDefaultNameForFallback, k as STACK_REF_MAX_CODE_POINTS, o as isStdoutReservedForPayload, r as safeStringify$1, t as describeAwsFailure, u as currentLogLineMasker, v as explicitNamePropertyFor, w as withSkipPrefix, x as getCurrentSkipPrefix, y as generateResourceName, z as safeMsg } from "./aws-failure-text-DtvlUugx.js";
3
3
  import { $ as protectedReplacementAdvice, $n as isAmbiguousOutcomeError, $t as credentialFingerprint, A as isQuotableImportValue, An as UNSHOWABLE_VALUE, At as isAuxiliaryMarkOf, B as isTerminalDeleteFailure, Bn as withheldTargetClause, Bt as recoveryCommandFlags, Ct as RETRY_AUXILIARY_OWNER, Dt as createdResourceIdentityBeforeFailure, E as assertRegionMatch, Et as createdBeforeFailure, F as resolveExplicitPhysicalId, Fn as physicalIdShownBesideCommand, G as runDeleteAttempt, Gn as isNameCollisionErrorFrom, H as observeThenDisableProtection, Ht as CUSTOM_RESOURCE_RESPONSE_PREFIX, In as plainOrDescribed, J as DELETION_PROTECTION_DOC_POINTER, Jn as isReplayedNameCollisionFrom, Kn as isNameCooldownError, L as ProtectionFlipRegistry, Ln as quotedOrDescribed, Lt as formatLockExpiry, M as quotedRemedyLogicalId, Mt as markCreatedBeforeFailure, N as refusalTypeShown, Nn as isInertUnquoted, Nt as UNREPRODUCIBLE_LOCK_CLAUSE, On as SHELL_ACTIVE, Ot as hasCreatedBeforeFailure, Pn as pasteableCommand, Pt as buildForceUnlockCommand, Q as pasteableAwsCommand, Qn as isAmbiguousCcHandlerErrorCode, Qt as clientDefaultsFor, R as compensateProtectionFlip, Rn as shellBoundedDisplay, Rt as formatLockOperation, Sn as SynthesisError, St as withDerivedNameMasks, T as RESOURCE_NOT_FOUND, Tn as normalizeAwsError, U as protectionFlipKey, Un as isUpdateUnsupportedError, Ut as DEFAULT_STATE_PREFIX, Vt as sanitizeRecoveryValue, Wn as hasReplayMayCollide, Wt as injectiveKey, Xn as markReplayMayCollide, Xt as ambientClientDefaults, Yt as withPasteableAwsProfile, Zn as formatRetryClassificationSignals, Zt as ambientCredentialConfig, _n as ResourceTimeoutError, _t as createMaskedLogSinks, an as DependencyError, ar as isMarkedNonRetryable, at as startInterruptWatch, bt as maskDeep, cn as IntrinsicResolutionRefusalError, cr as markRedactedCause, ct as canonicalizeRoute53QueryName, d as prepareRemovalForUpdate, dn as LockError, en as AccountIdUnavailableError, er as isIamPropagationError, f as removalWarning, fn as MacroExpansionError, ft as logicalIdShown, gn as ProvisioningError, gt as stateOrphanRecordRemedy, ht as segmentAfterAnchor, i as holdsSecretDerivedEntry, in as CrossAccountSecretRefusalError, it as isInterruptedWaitError, j as normalizeAwsTagsToCfn, jn as commandHole, jt as markAuxiliaryFailure, kn as SHELL_ACTIVE_WHY, kt as isAuxiliaryFailure, l as withUnchangedSecretPrincipalLists, lr as wrapMaskedAwsError, m as withoutInjectedRemovals, mt as resourceTypeShown, nn as CdkdError, nr as isTransientServerError, or as isThrottlingError, ot as ElapsedBudgetRegistry, pn as MalformedProducerRecordRefusalError, qn as isRecreateRetryableError, qt as producerRecordKey, rr as retryClassificationText, sn as DynamicReferenceRegionAmbiguousError, sr as markNonRetryable, st as monotonicNowMs, tn as AssetError, tr as isRetryableTransientError, ut as compositeIdSeparatorRefusal, vn as ResourceUpdateNotSupportedError, vt as createMaskedRetryLogger, w as withoutServerErrorRetries, wt as carryCreatedBeforeFailure, xn as StateError, xt as maskerOrIdentity, yt as isSecretDerivedValue, z as deleteWithProtectionCompensation, zn as shellQuote, zt as formatLockOwner } from "./iam-policy-targets-Pn2m0R67.js";
4
4
  import { a as setAssumedRoleCredentials, i as getPreAssumeEnvCredentials, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, s as ambientRegion, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-DBXBcg0J.js";
5
- import { t as getCdkdVersion } from "./version-B7Gzz6TR.js";
5
+ import { t as getCdkdVersion } from "./version-B-AQELPJ.js";
6
6
  import { createHash, randomUUID } from "node:crypto";
7
7
  import { AsyncLocalStorage } from "node:async_hooks";
8
8
  import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketLifecycleConfigurationCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
@@ -5427,6 +5427,46 @@ async function readEarlierStateResources(s3, bucket, owner, key, max) {
5427
5427
  }
5428
5428
  }))).filter((r) => r !== void 0);
5429
5429
  }
5430
+ async function keyMayHaveVersions(s3, bucket, owner, key) {
5431
+ try {
5432
+ const listed = await s3.send(new ListObjectVersionsCommand({
5433
+ Bucket: bucket,
5434
+ ...await owner(),
5435
+ Prefix: key,
5436
+ EncodingType: "url",
5437
+ MaxKeys: 1
5438
+ }));
5439
+ return (listed.Versions ?? []).length + (listed.DeleteMarkers ?? []).length > 0 || listed.IsTruncated === true;
5440
+ } catch {
5441
+ return true;
5442
+ }
5443
+ }
5444
+ async function listVersionedSubdirectories(s3, bucket, owner, prefix) {
5445
+ const out = [];
5446
+ let keyMarker;
5447
+ let versionIdMarker;
5448
+ for (;;) {
5449
+ const listed = await s3.send(new ListObjectVersionsCommand({
5450
+ Bucket: bucket,
5451
+ ...await owner(),
5452
+ Prefix: prefix,
5453
+ Delimiter: "/",
5454
+ EncodingType: "url",
5455
+ ...keyMarker !== void 0 && { KeyMarker: keyMarker },
5456
+ ...versionIdMarker !== void 0 && { VersionIdMarker: versionIdMarker }
5457
+ }));
5458
+ for (const cp of listed.CommonPrefixes ?? []) {
5459
+ const decoded = decodeListingKey(cp.Prefix);
5460
+ if (decoded === void 0 || !decoded.startsWith(prefix)) continue;
5461
+ const segment = decoded.slice(prefix.length).replace(/\/$/, "");
5462
+ if (segment !== "") out.push(segment);
5463
+ }
5464
+ if (listed.IsTruncated !== true) return out;
5465
+ if (listed.NextKeyMarker === void 0) throw new Error("a truncated version listing returned no NextKeyMarker");
5466
+ keyMarker = decodeListingKey(listed.NextKeyMarker);
5467
+ versionIdMarker = listed.NextVersionIdMarker;
5468
+ }
5469
+ }
5430
5470
 
5431
5471
  //#endregion
5432
5472
  //#region src/state/retained-time.ts
@@ -5513,6 +5553,7 @@ function legacyProbeBelongsTo(probe, region) {
5513
5553
  }
5514
5554
  const KEPT_AT_CLOCK_TOLERANCE_MS = 2e3;
5515
5555
  const ROLLBACK_JOURNAL_OBJECT_DESCRIPTION = "the rollback journal, whose `failedOperations[].attemptedProperties` records the properties of the failed write verbatim";
5556
+ const STATE_RECORD_OBJECT_DESCRIPTION = "the stack's state record, which carries every resource's recorded properties and attributes";
5516
5557
  var S3StateBackend = class S3StateBackend {
5517
5558
  logger = getLogger().child("S3StateBackend");
5518
5559
  s3Client;
@@ -5767,6 +5808,49 @@ var S3StateBackend = class S3StateBackend {
5767
5808
  await this.deleteRollbackJournal(stackName, region);
5768
5809
  }
5769
5810
  }
5811
+ async purgeDeletedStateHistory(stackName, region) {
5812
+ try {
5813
+ await this.ensureClientForBucket();
5814
+ const stateKey = this.getStateKey(stackName, region);
5815
+ const shown = displayStackName(stackName);
5816
+ let recordBack;
5817
+ try {
5818
+ recordBack = await this.headObject(stateKey);
5819
+ } catch {
5820
+ recordBack = true;
5821
+ }
5822
+ if (recordBack) {
5823
+ this.logger.warn(safeMsg`Kept the earlier versions of the state record for ${shown}: the record exists again, or its absence could not be confirmed, so they may belong to a live record.`);
5824
+ return;
5825
+ }
5826
+ const keys = [stateKey];
5827
+ const legacyKey = this.getLegacyStateKey(stackName);
5828
+ const mayHave = (key) => keyMayHaveVersions(this.s3Client, this.config.bucket, () => this.ownerParam(), key);
5829
+ if (await mayHave(legacyKey)) {
5830
+ const legacyProbe = await this.probeLegacyState(stackName);
5831
+ const keptBecause = legacyProbe.kind === "unreadable" ? `the legacy record could not be read (${legacyProbe.reason})` : legacyProbe.kind !== "absent" ? "its current body belongs to another record of the stack" : await this.otherRegionHistoryState(stackName, region, mayHave);
5832
+ if (keptBecause === "none") keys.push(legacyKey);
5833
+ else {
5834
+ const why = keptBecause === "exists" ? "another region of the stack still has state record versions, current or earlier, and the legacy versions may be that region's" : keptBecause === "unknown" ? "could not list the stack's other regions to confirm none of them still owns that history" : keptBecause;
5835
+ this.logger.warn(safeMsg`Kept the earlier versions of the legacy state record for ${shown}: ${why}. cdkd state destroy purges them only once no other region of the stack has state record versions and the legacy record can be read; otherwise delete them by hand.`);
5836
+ }
5837
+ }
5838
+ await this.purgeNoncurrentVersions(keys, { objectDescription: STATE_RECORD_OBJECT_DESCRIPTION });
5839
+ } catch (error) {
5840
+ this.logger.warn(safeMsg`Could not purge the earlier versions of the state record for ${displayStackName(stackName)}: ${describeAwsFailure(error).summary}. They remain readable via GetObject with a VersionId.`);
5841
+ }
5842
+ }
5843
+ async otherRegionHistoryState(stackName, region, mayHave) {
5844
+ const stackPrefix = `${this.config.prefix}/${stackName}/`;
5845
+ try {
5846
+ const regions = (await listVersionedSubdirectories(this.s3Client, this.config.bucket, () => this.ownerParam(), stackPrefix)).filter((segment) => segment !== region);
5847
+ for (const other of regions) if (await mayHave(this.getStateKey(stackName, other))) return "exists";
5848
+ return "none";
5849
+ } catch (error) {
5850
+ this.logger.debug(safeMsg`Could not list the other regions of ${displayStackName(stackName)}: ${displaySafe(describeAwsFailure(error).detail, { asciiOnly: true }) || "<unrenderable>"}`);
5851
+ return "unknown";
5852
+ }
5853
+ }
5770
5854
  async deleteLegacyState(stackName) {
5771
5855
  await this.ensureClientForBucket();
5772
5856
  const key = this.getLegacyStateKey(stackName);
@@ -7189,7 +7273,7 @@ const WHOLE_DYNAMIC_REFERENCE_PATTERN = new RegExp(`^\\{\\{resolve:${DYNAMIC_REF
7189
7273
  function isSingleDynamicReferenceToken(value) {
7190
7274
  return WHOLE_DYNAMIC_REFERENCE_PATTERN.test(value);
7191
7275
  }
7192
- function isPlainObject$5(value) {
7276
+ function isPlainObject$7(value) {
7193
7277
  return value !== null && typeof value === "object" && !Array.isArray(value);
7194
7278
  }
7195
7279
 
@@ -7438,7 +7522,7 @@ function crossStackSourceKey(source) {
7438
7522
  }
7439
7523
  if (key === "Fn::GetStackOutput") {
7440
7524
  const args = source[key];
7441
- if (!isPlainObject$5(args)) return void 0;
7525
+ if (!isPlainObject$7(args)) return void 0;
7442
7526
  const stackName = Object.hasOwn(args, "StackName") ? literalStringOrUndefined(args["StackName"]) : void 0;
7443
7527
  const outputName = Object.hasOwn(args, "OutputName") ? literalStringOrUndefined(args["OutputName"]) : void 0;
7444
7528
  if (stackName === void 0 || outputName === void 0) return void 0;
@@ -7484,7 +7568,7 @@ function crossStackSourceKey(source) {
7484
7568
  let template;
7485
7569
  let variables;
7486
7570
  if (typeof raw === "string") template = raw;
7487
- else if (Array.isArray(raw) && raw.length === 2 && isPlainObject$5(raw[1])) {
7571
+ else if (Array.isArray(raw) && raw.length === 2 && isPlainObject$7(raw[1])) {
7488
7572
  if (typeof raw[0] !== "string") return void 0;
7489
7573
  template = raw[0];
7490
7574
  variables = raw[1];
@@ -7727,12 +7811,12 @@ const UNFRAMED_SPELLING = Symbol("cdkd.nested-parameter.unframed-spelling");
7727
7811
  function recordNestedStackParameterExpressions(secrets, resourceType, resolvedProperties, sourceProperties, rules = TEMPLATE_DERIVED_RULES) {
7728
7812
  if (resourceType !== NESTED_STACK_RESOURCE_TYPE$4) return;
7729
7813
  if (secrets.size === 0) return;
7730
- if (!isPlainObject$5(resolvedProperties) || !isPlainObject$5(sourceProperties)) return;
7814
+ if (!isPlainObject$7(resolvedProperties) || !isPlainObject$7(sourceProperties)) return;
7731
7815
  if (!Object.hasOwn(resolvedProperties, "Parameters")) return;
7732
7816
  if (!Object.hasOwn(sourceProperties, "Parameters")) return;
7733
7817
  const resolvedParameters = resolvedProperties["Parameters"];
7734
7818
  const sourceParameters = sourceProperties["Parameters"];
7735
- if (!isPlainObject$5(resolvedParameters) || !isPlainObject$5(sourceParameters)) return;
7819
+ if (!isPlainObject$7(resolvedParameters) || !isPlainObject$7(sourceParameters)) return;
7736
7820
  const positioned = redactSecretsForState(markSameGenerationBag({ ...resolvedParameters }), secrets, sourceParameters, rules);
7737
7821
  let table = nestedStackParameterExpressions.get(secrets);
7738
7822
  for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
@@ -7781,7 +7865,7 @@ function recordNestedStackParameterExpressions(secrets, resourceType, resolvedPr
7781
7865
  if (typeof resolvedValue !== "string") return void 0;
7782
7866
  const sourceLeaf = sourceParameters[name];
7783
7867
  if (typeof sourceLeaf === "string") return sourceLeaf;
7784
- if (!isPlainObject$5(sourceLeaf)) return void 0;
7868
+ if (!isPlainObject$7(sourceLeaf)) return void 0;
7785
7869
  const written = positioned[name];
7786
7870
  if (typeof written !== "string") return void 0;
7787
7871
  const rendered = intrinsicSkeletonSegments(sourceLeaf)?.map((s) => s === UNKNOWN_PART ? "\0" : s).join("");
@@ -7992,7 +8076,7 @@ function appendValuePlaceholderParts(value, out, budget, depth) {
7992
8076
  if (budget.exhausted) return;
7993
8077
  const literal = joinPartLiteralText(value);
7994
8078
  if (literal !== void 0) return pushPlaceholderPart(out, literal, budget);
7995
- if (isPlainObject$5(value) && Object.keys(value).length === 1) {
8079
+ if (isPlainObject$7(value) && Object.keys(value).length === 1) {
7996
8080
  const ref = value["Ref"];
7997
8081
  if (typeof ref === "string" && ref !== "") return pushPlaceholderPart(out, keyedPart({ Ref: ref }), budget);
7998
8082
  if (depth >= MAX_PLACEHOLDER_DEPTH) {
@@ -8024,7 +8108,7 @@ function appendParameterPlaceholderParts(source, out, budget, depth) {
8024
8108
  let template;
8025
8109
  let variables = {};
8026
8110
  if (typeof args === "string") template = args;
8027
- else if (Array.isArray(args) && args.length === 2 && isPlainObject$5(args[1])) {
8111
+ else if (Array.isArray(args) && args.length === 2 && isPlainObject$7(args[1])) {
8028
8112
  template = args[0];
8029
8113
  variables = args[1];
8030
8114
  } else return false;
@@ -8172,7 +8256,7 @@ function isUniquelyKeyedBy(items, key) {
8172
8256
  if (items.length === 0) return false;
8173
8257
  const seen = /* @__PURE__ */ new Set();
8174
8258
  for (const item of items) {
8175
- if (!isPlainObject$5(item) || !Object.hasOwn(item, key)) return false;
8259
+ if (!isPlainObject$7(item) || !Object.hasOwn(item, key)) return false;
8176
8260
  const id = item[key];
8177
8261
  if (typeof id !== "string" || id === "") return false;
8178
8262
  if (seen.has(id)) return false;
@@ -8202,11 +8286,11 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
8202
8286
  }
8203
8287
  return positionByEmbeddedSpan(bag, source, secrets, bagIsSameGeneration);
8204
8288
  }
8205
- if ((typeof bag === "string" || Array.isArray(bag)) && isPlainObject$5(source)) {
8289
+ if ((typeof bag === "string" || Array.isArray(bag)) && isPlainObject$7(source)) {
8206
8290
  const inherited = positionByInheritedParameter(bag, source, secrets);
8207
8291
  if (inherited !== void 0) return inherited;
8208
8292
  }
8209
- if (typeof bag === "string" && isPlainObject$5(source)) {
8293
+ if (typeof bag === "string" && isPlainObject$7(source)) {
8210
8294
  const certified = positionByCrossStackSource(bag, source, secrets);
8211
8295
  if (certified !== void 0) return certified;
8212
8296
  const placeheld = positionByParameterPlaceholders(bag, source, secrets);
@@ -8216,7 +8300,7 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
8216
8300
  const framed = positionByIntrinsicFrame(bag, source, secrets, secretExpressions, bagIsSameGeneration);
8217
8301
  if (framed !== void 0) return framed;
8218
8302
  }
8219
- if (Array.isArray(bag) && isPlainObject$5(source)) {
8303
+ if (Array.isArray(bag) && isPlainObject$7(source)) {
8220
8304
  const positionedList = positionListByCrossStackSource(bag, source, secrets);
8221
8305
  if (positionedList !== void 0) return positionedList;
8222
8306
  }
@@ -8244,7 +8328,7 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
8244
8328
  }
8245
8329
  if (rules.descendArrays && bag.length === source.length) return bag.map((item, i) => redactByPath(item, source[i], secrets, rules, secretExpressions, bagIsSameGeneration));
8246
8330
  }
8247
- if (isPlainObject$5(bag) && hasPlainPrototype(bag) && isPlainObject$5(source)) {
8331
+ if (isPlainObject$7(bag) && hasPlainPrototype(bag) && isPlainObject$7(source)) {
8248
8332
  const out = Object.create(null);
8249
8333
  for (const [k, v] of Object.entries(bag)) out[k] = Object.hasOwn(source, k) ? redactByPath(v, source[k], secrets, rules, secretExpressions, bagIsSameGeneration) : redactSecretsForState(v, secrets);
8250
8334
  return out;
@@ -8257,7 +8341,7 @@ function isReadbackProjectedFromState(rules) {
8257
8341
  function subtreeHasDynamicReference(value) {
8258
8342
  if (isDynamicReferenceString(value)) return true;
8259
8343
  if (Array.isArray(value)) return value.some(subtreeHasDynamicReference);
8260
- if (isPlainObject$5(value)) return Object.values(value).some(subtreeHasDynamicReference);
8344
+ if (isPlainObject$7(value)) return Object.values(value).some(subtreeHasDynamicReference);
8261
8345
  return false;
8262
8346
  }
8263
8347
  function pathCrossesDottedKey(bag, path) {
@@ -8332,8 +8416,8 @@ function deepEqualJsonValue(a, b) {
8332
8416
  if (!Array.isArray(b) || a.length !== b.length) return false;
8333
8417
  return a.every((item, i) => deepEqualJsonValue(item, b[i]));
8334
8418
  }
8335
- if (isPlainObject$5(a)) {
8336
- if (!isPlainObject$5(b)) return false;
8419
+ if (isPlainObject$7(a)) {
8420
+ if (!isPlainObject$7(b)) return false;
8337
8421
  if (!hasPlainPrototype(a) || !hasPlainPrototype(b)) return false;
8338
8422
  const keys = Object.keys(a);
8339
8423
  if (keys.length !== Object.keys(b).length) return false;
@@ -8359,7 +8443,7 @@ function refuseUncertifiedSubtree(value, sourceLiterals, mark, seen = /* @__PURE
8359
8443
  for (const item of value) out.push(refuseUncertifiedSubtree(item, sourceLiterals, mark, seen));
8360
8444
  return out;
8361
8445
  }
8362
- if (isPlainObject$5(value) && hasPlainPrototype(value)) {
8446
+ if (isPlainObject$7(value) && hasPlainPrototype(value)) {
8363
8447
  const out = Object.create(null);
8364
8448
  seen.set(value, out);
8365
8449
  for (const [k, v] of Object.entries(value)) out[k] = refuseUncertifiedSubtree(v, sourceLiterals, mark, seen);
@@ -8387,7 +8471,7 @@ function refuseUncertifiedReadbackPositions(bag, source, secrets, failClosed, le
8387
8471
  return mark ? POSITION_DECIDED : source;
8388
8472
  }
8389
8473
  if (!subtreeHasDynamicReference(source)) return bag;
8390
- if (isPlainObject$5(bag) && hasPlainPrototype(bag) && isPlainObject$5(source)) {
8474
+ if (isPlainObject$7(bag) && hasPlainPrototype(bag) && isPlainObject$7(source)) {
8391
8475
  const out = Object.create(null);
8392
8476
  for (const [k, v] of Object.entries(bag)) out[k] = Object.hasOwn(source, k) ? refuseUncertifiedReadbackPositions(v, source[k], secrets, failClosed, learn, mark) : v;
8393
8477
  return out;
@@ -8414,14 +8498,14 @@ function refuseUncertifiedReadbackPositions(bag, source, secrets, failClosed, le
8414
8498
  function isDistinguishingAnchor(value) {
8415
8499
  if (typeof value === "string") return value !== "";
8416
8500
  if (Array.isArray(value)) return value.some(isDistinguishingAnchor);
8417
- if (isPlainObject$5(value)) return Object.values(value).some(isDistinguishingAnchor);
8501
+ if (isPlainObject$7(value)) return Object.values(value).some(isDistinguishingAnchor);
8418
8502
  return false;
8419
8503
  }
8420
8504
  const ANCHOR_REFERENCE_MASK = "<ref>";
8421
8505
  function anchorSignature(source) {
8422
8506
  if (isDynamicReferenceString(source)) return ANCHOR_REFERENCE_MASK;
8423
8507
  if (Array.isArray(source)) return `[${source.map(anchorSignature).sort().join(",")}]`;
8424
- if (isPlainObject$5(source)) return `{${Object.keys(source).sort().map((k) => `${JSON.stringify(k)}:${anchorSignature(source[k])}`).join(",")}}`;
8508
+ if (isPlainObject$7(source)) return `{${Object.keys(source).sort().map((k) => `${JSON.stringify(k)}:${anchorSignature(source[k])}`).join(",")}}`;
8425
8509
  return JSON.stringify(source) ?? "undefined";
8426
8510
  }
8427
8511
  function anchorsCorroboratePairing(bag, source, anchors) {
@@ -8431,8 +8515,8 @@ function anchorsCorroboratePairing(bag, source, anchors) {
8431
8515
  return true;
8432
8516
  }
8433
8517
  if (isDynamicReferenceString(source)) return typeof bag === "string";
8434
- if (isPlainObject$5(source)) {
8435
- if (!isPlainObject$5(bag)) return false;
8518
+ if (isPlainObject$7(source)) {
8519
+ if (!isPlainObject$7(bag)) return false;
8436
8520
  return Object.keys(source).every((k) => Object.hasOwn(bag, k) && anchorsCorroboratePairing(bag[k], source[k], anchors));
8437
8521
  }
8438
8522
  if (Array.isArray(source)) {
@@ -8523,13 +8607,13 @@ function learnMixedLeafNeedle(collector, bag, source) {
8523
8607
  learnNeedle(collector, plaintext, token);
8524
8608
  }
8525
8609
  function asChild(marks, key) {
8526
- return isPlainObject$5(marks) && hasPlainPrototype(marks) ? marks[key] : void 0;
8610
+ return isPlainObject$7(marks) && hasPlainPrototype(marks) ? marks[key] : void 0;
8527
8611
  }
8528
8612
  function asIndex(marks, index) {
8529
8613
  return Array.isArray(marks) ? marks[index] : void 0;
8530
8614
  }
8531
8615
  function preferPositionDecisions(scanned, refused, bag, marks, inferred) {
8532
- if (isPlainObject$5(bag) && hasPlainPrototype(bag) && isPlainObject$5(refused) && isPlainObject$5(scanned)) {
8616
+ if (isPlainObject$7(bag) && hasPlainPrototype(bag) && isPlainObject$7(refused) && isPlainObject$7(scanned)) {
8533
8617
  const out = Object.create(null);
8534
8618
  for (const [k, v] of Object.entries(refused)) out[k] = preferPositionDecisions(scanned[k], v, bag[k], asChild(marks, k), inferred);
8535
8619
  return out;
@@ -9039,6 +9123,11 @@ function passProvenanceFor(secrets, token) {
9039
9123
  if (entry === void 0) return void 0;
9040
9124
  return finalize(entry);
9041
9125
  }
9126
+ function passReadVersionsFor(secrets, token) {
9127
+ if (secrets === void 0) return void 0;
9128
+ const read = passProvenanceOf.get(secrets)?.get(token)?.readVersions;
9129
+ return read === void 0 || read.size === 0 ? void 0 : read;
9130
+ }
9042
9131
  function finalize(entry) {
9043
9132
  const out = {};
9044
9133
  if (!entry.regionUnknown && entry.regions.size === 1) out.region = [...entry.regions][0];
@@ -9648,7 +9737,7 @@ function readsNoEchoSource(node, sources) {
9648
9737
  if (typeof argument === "string") return subStringReadsNoEcho(argument, void 0, sources);
9649
9738
  if (Array.isArray(argument)) {
9650
9739
  const [text, variables] = argument;
9651
- const vars = isPlainObject$5(variables) ? variables : void 0;
9740
+ const vars = isPlainObject$7(variables) ? variables : void 0;
9652
9741
  if (typeof text === "string" && subStringReadsNoEcho(text, vars, sources)) return true;
9653
9742
  return vars !== void 0 && Object.values(vars).some(walk);
9654
9743
  }
@@ -9682,7 +9771,7 @@ function noEchoCoordinatesOf(template, resolved, sources, onCoordinate) {
9682
9771
  parameters: sources.parameters,
9683
9772
  ...sources.conditions !== void 0 && { conditions: sources.conditions }
9684
9773
  };
9685
- const isBareDeclaredGetAtt = (node) => isPlainObject$5(node) && intrinsicKeyOf(node) === "Fn::GetAtt" && getAttReadsNoEcho(node["Fn::GetAtt"], sources);
9774
+ const isBareDeclaredGetAtt = (node) => isPlainObject$7(node) && intrinsicKeyOf(node) === "Fn::GetAtt" && getAttReadsNoEcho(node["Fn::GetAtt"], sources);
9686
9775
  const walk = (source, value, path) => {
9687
9776
  if (value === void 0) return;
9688
9777
  if (source === null || typeof source !== "object") return;
@@ -9698,7 +9787,7 @@ function noEchoCoordinatesOf(template, resolved, sources, onCoordinate) {
9698
9787
  const record = source;
9699
9788
  const intrinsic = intrinsicKeyOf(record);
9700
9789
  if (intrinsic === void 0) {
9701
- if (!isPlainObject$5(value)) {
9790
+ if (!isPlainObject$7(value)) {
9702
9791
  if (readsNoEchoSource(record, parametersOnly)) push(path, source);
9703
9792
  return;
9704
9793
  }
@@ -9746,7 +9835,7 @@ function maskWholeValue(value) {
9746
9835
  if (value === null || value === void 0) return value;
9747
9836
  if (typeof value === "string" && isSingleDynamicReferenceToken(value)) return value;
9748
9837
  if (Array.isArray(value)) return value.map(maskWholeValue);
9749
- if (isPlainObject$5(value)) {
9838
+ if (isPlainObject$7(value)) {
9750
9839
  const out = {};
9751
9840
  for (const [key, child] of Object.entries(value)) Object.defineProperty(out, key, {
9752
9841
  value: maskWholeValue(child),
@@ -9769,7 +9858,7 @@ function readAt(bag, coordinate) {
9769
9858
  node = node[segment];
9770
9859
  continue;
9771
9860
  }
9772
- if (!isPlainObject$5(node) || !Object.hasOwn(node, segment)) return {
9861
+ if (!isPlainObject$7(node) || !Object.hasOwn(node, segment)) return {
9773
9862
  found: false,
9774
9863
  value: void 0
9775
9864
  };
@@ -9785,7 +9874,7 @@ function valueAtCoordinate(bag, coordinate) {
9785
9874
  }
9786
9875
  function cloneContainer(node) {
9787
9876
  if (Array.isArray(node)) return [...node];
9788
- if (isPlainObject$5(node)) return { ...node };
9877
+ if (isPlainObject$7(node)) return { ...node };
9789
9878
  return node;
9790
9879
  }
9791
9880
  function maskAtCoordinates(bag, coordinates) {
@@ -9852,20 +9941,20 @@ function readbackPathFor(readback, properties, coordinate) {
9852
9941
  if (!Array.isArray(live)) return path.length === 0 ? void 0 : path;
9853
9942
  const key = Array.isArray(desired) ? identityKeyFor(live, desired) : void 0;
9854
9943
  const element = Array.isArray(desired) ? desired[segment] : void 0;
9855
- if (key === void 0 || !isPlainObject$5(element)) return path;
9944
+ if (key === void 0 || !isPlainObject$7(element)) return path;
9856
9945
  const identity = element[key];
9857
- const index = live.findIndex((item) => isPlainObject$5(item) && item[key] === identity);
9946
+ const index = live.findIndex((item) => isPlainObject$7(item) && item[key] === identity);
9858
9947
  if (index < 0) return path;
9859
9948
  path.push(index);
9860
9949
  live = live[index];
9861
9950
  desired = element;
9862
9951
  continue;
9863
9952
  }
9864
- if (!isPlainObject$5(live)) return path.length === 0 ? void 0 : path;
9953
+ if (!isPlainObject$7(live)) return path.length === 0 ? void 0 : path;
9865
9954
  if (!Object.hasOwn(live, segment)) return void 0;
9866
9955
  path.push(segment);
9867
9956
  live = live[segment];
9868
- desired = isPlainObject$5(desired) ? desired[segment] : void 0;
9957
+ desired = isPlainObject$7(desired) ? desired[segment] : void 0;
9869
9958
  }
9870
9959
  return path;
9871
9960
  }
@@ -9894,7 +9983,7 @@ function witnessNormalize(stored, today, v11) {
9894
9983
  const confirmed = [];
9895
9984
  const differing = [];
9896
9985
  const walk = (s, t, v, path) => {
9897
- if (v !== "***" && containsMask(v) && (Array.isArray(v) ? !Array.isArray(s) || s.length !== v.length : isPlainObject$5(v) ? !isPlainObject$5(s) : false)) {
9986
+ if (v !== "***" && containsMask(v) && (Array.isArray(v) ? !Array.isArray(s) || s.length !== v.length : isPlainObject$7(v) ? !isPlainObject$7(s) : false)) {
9898
9987
  if (s === void 0 || containsMask(s)) return s;
9899
9988
  if (jsonEqual(s, t)) {
9900
9989
  confirmed.push(path);
@@ -9923,8 +10012,8 @@ function witnessNormalize(stored, today, v11) {
9923
10012
  });
9924
10013
  return changed ? out : s;
9925
10014
  }
9926
- if (isPlainObject$5(v) && isPlainObject$5(s)) {
9927
- const tt = isPlainObject$5(t) ? t : {};
10015
+ if (isPlainObject$7(v) && isPlainObject$7(s)) {
10016
+ const tt = isPlainObject$7(t) ? t : {};
9928
10017
  let out;
9929
10018
  for (const key of Object.keys(v)) {
9930
10019
  if (!Object.hasOwn(s, key)) continue;
@@ -9947,7 +10036,7 @@ function witnessNormalize(stored, today, v11) {
9947
10036
  function containsMask(value) {
9948
10037
  if (value === "***") return true;
9949
10038
  if (Array.isArray(value)) return value.some(containsMask);
9950
- if (isPlainObject$5(value)) return Object.values(value).some(containsMask);
10039
+ if (isPlainObject$7(value)) return Object.values(value).some(containsMask);
9951
10040
  return false;
9952
10041
  }
9953
10042
  function jsonEqual(a, b) {
@@ -9991,7 +10080,7 @@ function noEchoComparison(options) {
9991
10080
  const out = node.map(walk);
9992
10081
  return out.some((item, i) => item !== node[i]) ? out : node;
9993
10082
  }
9994
- if (isPlainObject$5(node)) {
10083
+ if (isPlainObject$7(node)) {
9995
10084
  let out;
9996
10085
  for (const [key, child] of Object.entries(node)) {
9997
10086
  const next = walk(child);
@@ -12878,7 +12967,7 @@ function probeFoundSameId(resourceType, a, b) {
12878
12967
  //#region src/provisioning/config-shape.ts
12879
12968
  function readConfigString(container, key, fallback, containerPath, options) {
12880
12969
  if (container === void 0 || container === null) return fallback;
12881
- if (!isPlainObject$4(container) || isUnresolvedIntrinsicContainer(container)) {
12970
+ if (!isPlainObject$6(container) || isUnresolvedIntrinsicContainer(container)) {
12882
12971
  const detail = malformedShapeDetail(container);
12883
12972
  if (options?.onUnusable) {
12884
12973
  const named = fallback === "" ? "" : ` (${fallback})`;
@@ -12918,7 +13007,7 @@ function requireConfigArray(value, path, options) {
12918
13007
  return value;
12919
13008
  }
12920
13009
  function requireConfigObject(value, path, options) {
12921
- if (!isPlainObject$4(value) || isUnresolvedIntrinsicContainer(value)) {
13010
+ if (!isPlainObject$6(value) || isUnresolvedIntrinsicContainer(value)) {
12922
13011
  const detail = malformedShapeDetail(value);
12923
13012
  if (options?.onUnusable) {
12924
13013
  options.onUnusable(`${path} must be an object ${detail}. Leaving this configuration unapplied here; the same value is REFUSED on a template-path create.`);
@@ -12930,7 +13019,7 @@ function requireConfigObject(value, path, options) {
12930
13019
  }
12931
13020
  function configStringRefusal(container, key, fallback, containerPath, options) {
12932
13021
  if (container === void 0 || container === null) return void 0;
12933
- if (!isPlainObject$4(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
13022
+ if (!isPlainObject$6(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
12934
13023
  return configValueRefusal(container[key], fallback, `${containerPath}.${key}`, options);
12935
13024
  }
12936
13025
  function coerceCfnBoolean(value) {
@@ -12943,7 +13032,7 @@ function coerceCfnBoolean(value) {
12943
13032
  }
12944
13033
  function configBooleanRefusal(container, key, containerPath) {
12945
13034
  if (container === void 0 || container === null) return void 0;
12946
- if (!isPlainObject$4(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
13035
+ if (!isPlainObject$6(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
12947
13036
  const value = container[key];
12948
13037
  if (value === void 0) return void 0;
12949
13038
  if (coerceCfnBoolean(value) !== void 0) return void 0;
@@ -12957,7 +13046,7 @@ function coerceCfnInteger(value) {
12957
13046
  }
12958
13047
  function configIntegerRefusal(container, key, containerPath, min, max) {
12959
13048
  if (container === void 0 || container === null) return void 0;
12960
- if (!isPlainObject$4(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
13049
+ if (!isPlainObject$6(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
12961
13050
  const value = container[key];
12962
13051
  if (value === void 0) return void 0;
12963
13052
  const n = coerceCfnInteger(value);
@@ -12971,10 +13060,10 @@ function configValueRefusal(value, fallback, path, options) {
12971
13060
  if (typeof value !== "string" || value.trim() === "") return `${path} must be a non-empty string ${malformedShapeDetail(value)}`;
12972
13061
  }
12973
13062
  function malformedShapeDetail(value) {
12974
- if (isPlainObject$4(value) && isUnresolvedIntrinsicContainer(value)) return `(got ${describe(value)} — nothing substituted it before this call)`;
13063
+ if (isPlainObject$6(value) && isUnresolvedIntrinsicContainer(value)) return `(got ${describe(value)} — nothing substituted it before this call)`;
12975
13064
  return `(got ${describe(value)}) — check for an unresolved intrinsic or a mis-nested template value`;
12976
13065
  }
12977
- function isPlainObject$4(value) {
13066
+ function isPlainObject$6(value) {
12978
13067
  return typeof value === "object" && value !== null && !Array.isArray(value);
12979
13068
  }
12980
13069
  const NAMEABLE_INTRINSIC_KEYS = /* @__PURE__ */ new Set([
@@ -13001,7 +13090,7 @@ function describe(value) {
13001
13090
  if (value === null) return "null";
13002
13091
  if (Array.isArray(value)) return "an array";
13003
13092
  if (typeof value === "string") return value.trim() === "" ? "a blank string" : "a string";
13004
- if (isPlainObject$4(value) && isUnresolvedIntrinsicContainer(value)) {
13093
+ if (isPlainObject$6(value) && isUnresolvedIntrinsicContainer(value)) {
13005
13094
  const key = Object.keys(value)[0];
13006
13095
  return NAMEABLE_INTRINSIC_KEYS.has(key) ? `an unresolved ${key} intrinsic` : "an unresolved intrinsic";
13007
13096
  }
@@ -17891,7 +17980,7 @@ function maskedPropertyFingerprint(templateValue) {
17891
17980
  return `${FINGERPRINT_PREFIX}${digest}`;
17892
17981
  }
17893
17982
  var UnknownInput = class extends Error {};
17894
- function isPlainObject$3(value) {
17983
+ function isPlainObject$5(value) {
17895
17984
  return value !== null && typeof value === "object" && !Array.isArray(value);
17896
17985
  }
17897
17986
  const DYNAMIC_REFERENCE_OPEN = "{{resolve:";
@@ -17911,7 +18000,7 @@ function carriesSecretValue(value, corpora) {
17911
18000
  return false;
17912
18001
  }
17913
18002
  function parameterInputsFor(args) {
17914
- const declared = isPlainObject$3(args.template.Parameters) ? args.template.Parameters : {};
18003
+ const declared = isPlainObject$5(args.template.Parameters) ? args.template.Parameters : {};
17915
18004
  const values = args.values ?? {};
17916
18005
  const inputs = /* @__PURE__ */ new Map();
17917
18006
  const bound = {};
@@ -17922,7 +18011,7 @@ function parameterInputsFor(args) {
17922
18011
  continue;
17923
18012
  }
17924
18013
  const value = values[name];
17925
- let secret = isPlainObject$3(definition) && declaresNoEcho(definition) || carriesSecretValue(value, []);
18014
+ let secret = isPlainObject$5(definition) && declaresNoEcho(definition) || carriesSecretValue(value, []);
17926
18015
  if (!secret && args.nestedChild === true && args.supplied !== void 0) {
17927
18016
  if (Object.hasOwn(args.supplied, name)) {
17928
18017
  const passed = args.passedClasses?.get(name);
@@ -17973,7 +18062,7 @@ function intrinsicKey(value) {
17973
18062
  const OPAQUE_ATTRIBUTE_TYPES = /* @__PURE__ */ new Set(["AWS::CloudFormation::CustomResource", NESTED_STACK_TYPE$4]);
17974
18063
  function hasOpaqueAttributes(logicalId, walk) {
17975
18064
  const definition = walk.resources[logicalId];
17976
- const type = isPlainObject$3(definition) ? definition["Type"] : void 0;
18065
+ const type = isPlainObject$5(definition) ? definition["Type"] : void 0;
17977
18066
  return typeof type === "string" && (type.startsWith("Custom::") || OPAQUE_ATTRIBUTE_TYPES.has(type));
17978
18067
  }
17979
18068
  function getAttTarget(operand) {
@@ -17998,7 +18087,7 @@ function taintOf(logicalId, walk) {
17998
18087
  const visit = (value) => {
17999
18088
  if (typeof value === "string") return value.includes(DYNAMIC_REFERENCE_OPEN);
18000
18089
  if (Array.isArray(value)) return value.some(visit);
18001
- if (!isPlainObject$3(value)) return false;
18090
+ if (!isPlainObject$5(value)) return false;
18002
18091
  const key = intrinsicKey(value);
18003
18092
  const operand = key === void 0 ? void 0 : value[key];
18004
18093
  let verdict = "clean";
@@ -18010,7 +18099,7 @@ function taintOf(logicalId, walk) {
18010
18099
  else if (key === "Fn::FindInMap" && mapReadClass(operand, walk.sources.template) !== "clean") verdict = "tainted";
18011
18100
  else if (key === "Fn::Sub") {
18012
18101
  const text = Array.isArray(operand) ? operand[0] : operand;
18013
- const vars = Array.isArray(operand) && isPlainObject$3(operand[1]) ? operand[1] : {};
18102
+ const vars = Array.isArray(operand) && isPlainObject$5(operand[1]) ? operand[1] : {};
18014
18103
  if (typeof text === "string") for (const name of subPlaceholders(text)) {
18015
18104
  if (Object.hasOwn(vars, name)) continue;
18016
18105
  const owner = name.includes(".") ? name.split(".")[0] : name;
@@ -18024,7 +18113,7 @@ function taintOf(logicalId, walk) {
18024
18113
  return Object.values(value).some(visit);
18025
18114
  };
18026
18115
  const definition = walk.resources[logicalId];
18027
- const result = visit(isPlainObject$3(definition) ? definition["Properties"] : void 0) ? "tainted" : unknown ? "unknown" : "clean";
18116
+ const result = visit(isPlainObject$5(definition) ? definition["Properties"] : void 0) ? "tainted" : unknown ? "unknown" : "clean";
18028
18117
  walk.inProgress.delete(logicalId);
18029
18118
  walk.taint.set(logicalId, result);
18030
18119
  return result;
@@ -18040,7 +18129,7 @@ function conditionInput(name, walk) {
18040
18129
  return typeof verdict === "boolean" ? verdict : "unknown";
18041
18130
  }
18042
18131
  function conditionClosure(name, walk) {
18043
- const definitions = isPlainObject$3(walk.sources.template.Conditions) ? walk.sources.template.Conditions : {};
18132
+ const definitions = isPlainObject$5(walk.sources.template.Conditions) ? walk.sources.template.Conditions : {};
18044
18133
  let secret = false;
18045
18134
  let unknown = false;
18046
18135
  let unread = false;
@@ -18055,7 +18144,7 @@ function conditionClosure(name, walk) {
18055
18144
  value.forEach(visit);
18056
18145
  return;
18057
18146
  }
18058
- if (!isPlainObject$3(value)) return;
18147
+ if (!isPlainObject$5(value)) return;
18059
18148
  const keys = Object.keys(value);
18060
18149
  if (keys.length === 1 && keys[0] === "Condition" && typeof value["Condition"] === "string") {
18061
18150
  pending.push(value["Condition"]);
@@ -18088,7 +18177,7 @@ function conditionClosure(name, walk) {
18088
18177
  if (key === "Fn::Sub") {
18089
18178
  const operand = value["Fn::Sub"];
18090
18179
  const text = Array.isArray(operand) ? operand[0] : operand;
18091
- const vars = Array.isArray(operand) && isPlainObject$3(operand[1]) ? operand[1] : {};
18180
+ const vars = Array.isArray(operand) && isPlainObject$5(operand[1]) ? operand[1] : {};
18092
18181
  if (typeof text === "string") for (const name of subPlaceholders(text)) {
18093
18182
  if (Object.hasOwn(vars, name)) continue;
18094
18183
  if (name.includes(".") && !name.startsWith("AWS::")) secret = true;
@@ -18117,8 +18206,8 @@ function mapReadClass(operand, template) {
18117
18206
  const mapName = Array.isArray(operand) ? operand[0] : void 0;
18118
18207
  if (typeof mapName !== "string") return "unknown";
18119
18208
  const mappings = template.Mappings;
18120
- const map = isPlainObject$3(mappings) && Object.hasOwn(mappings, mapName) ? mappings[mapName] : void 0;
18121
- if (!isPlainObject$3(map)) return "unknown";
18209
+ const map = isPlainObject$5(mappings) && Object.hasOwn(mappings, mapName) ? mappings[mapName] : void 0;
18210
+ if (!isPlainObject$5(map)) return "unknown";
18122
18211
  return carriesSecretValue(map, []) ? "secret" : "clean";
18123
18212
  }
18124
18213
  async function resolvedInput(node, walk) {
@@ -18186,7 +18275,7 @@ async function inputForm(value, walk) {
18186
18275
  concrete: parts.every((p) => p.concrete)
18187
18276
  };
18188
18277
  }
18189
- if (!isPlainObject$3(value)) return {
18278
+ if (!isPlainObject$5(value)) return {
18190
18279
  form: value,
18191
18280
  concrete: true
18192
18281
  };
@@ -18249,7 +18338,7 @@ async function inputForm(value, walk) {
18249
18338
  concrete: false
18250
18339
  };
18251
18340
  }
18252
- const explicit = Array.isArray(operand) && isPlainObject$3(operand[1]) ? operand[1] : {};
18341
+ const explicit = Array.isArray(operand) && isPlainObject$5(operand[1]) ? operand[1] : {};
18253
18342
  const vars = await inputForm(explicit, walk);
18254
18343
  const placeholders = [];
18255
18344
  let concrete = vars.concrete && !text.includes(DYNAMIC_REFERENCE_OPEN);
@@ -18302,8 +18391,8 @@ function newWalk(sources, nested = {
18302
18391
  }) {
18303
18392
  return {
18304
18393
  sources,
18305
- resources: isPlainObject$3(sources.template.Resources) ? sources.template.Resources : {},
18306
- parameters: isPlainObject$3(sources.template.Parameters) ? sources.template.Parameters : {},
18394
+ resources: isPlainObject$5(sources.template.Resources) ? sources.template.Resources : {},
18395
+ parameters: isPlainObject$5(sources.template.Parameters) ? sources.template.Parameters : {},
18307
18396
  taint: /* @__PURE__ */ new Map(),
18308
18397
  inProgress: /* @__PURE__ */ new Set(),
18309
18398
  stackChain: nested.stackChain,
@@ -18327,34 +18416,34 @@ function passedKey(passed) {
18327
18416
  function isNestedStackRow(logicalId, walk) {
18328
18417
  if (!Object.hasOwn(walk.resources, logicalId)) return false;
18329
18418
  const definition = walk.resources[logicalId];
18330
- return isPlainObject$3(definition) && definition["Type"] === NESTED_STACK_TYPE$4;
18419
+ return isPlainObject$5(definition) && definition["Type"] === NESTED_STACK_TYPE$4;
18331
18420
  }
18332
18421
  function getAttAttribute(operand, target) {
18333
18422
  if (Array.isArray(operand)) return operand.length === 2 && typeof operand[1] === "string" ? operand[1] : void 0;
18334
18423
  return typeof operand === "string" ? operand.slice(target.length + 1) : void 0;
18335
18424
  }
18336
18425
  function rowParameters(definition) {
18337
- const properties = isPlainObject$3(definition) ? definition["Properties"] : void 0;
18426
+ const properties = isPlainObject$5(definition) ? definition["Properties"] : void 0;
18338
18427
  if (properties === void 0) return {};
18339
- if (!isPlainObject$3(properties)) return "unknown";
18428
+ if (!isPlainObject$5(properties)) return "unknown";
18340
18429
  const parameters = properties["Parameters"];
18341
18430
  if (parameters === void 0) return {};
18342
- if (!isPlainObject$3(parameters) || intrinsicKey(parameters) !== void 0) return "unknown";
18431
+ if (!isPlainObject$5(parameters) || intrinsicKey(parameters) !== void 0) return "unknown";
18343
18432
  return parameters;
18344
18433
  }
18345
18434
  function childParameterInputs(template, passed) {
18346
- const declared = isPlainObject$3(template.Parameters) ? template.Parameters : {};
18435
+ const declared = isPlainObject$5(template.Parameters) ? template.Parameters : {};
18347
18436
  const inputs = /* @__PURE__ */ new Map();
18348
18437
  for (const name of Object.keys(declared)) {
18349
18438
  const definition = declared[name];
18350
- if (isPlainObject$3(definition) && declaresNoEcho(definition)) inputs.set(name, { kind: "secret" });
18439
+ if (isPlainObject$5(definition) && declaresNoEcho(definition)) inputs.set(name, { kind: "secret" });
18351
18440
  else if (passed.has(name)) {
18352
18441
  const passedClass = passed.get(name);
18353
18442
  inputs.set(name, passedClass === "clean" ? {
18354
18443
  kind: "value",
18355
18444
  value: void 0
18356
18445
  } : passedClass === "unknown" ? { kind: "unknown" } : { kind: "secret" });
18357
- } else if (isPlainObject$3(definition) && Object.hasOwn(definition, "Default") && !carriesSecretValue(definition["Default"], [])) inputs.set(name, {
18446
+ } else if (isPlainObject$5(definition) && Object.hasOwn(definition, "Default") && !carriesSecretValue(definition["Default"], [])) inputs.set(name, {
18358
18447
  kind: "value",
18359
18448
  value: definition["Default"]
18360
18449
  });
@@ -18371,7 +18460,7 @@ function closureClass(closure) {
18371
18460
  return closure.unread ? "unread" : "clean";
18372
18461
  }
18373
18462
  async function childOutputClass(loaded, outputName, passed, chain, shared) {
18374
- if (loaded === void 0 || !isPlainObject$3(loaded.template)) return "unknown";
18463
+ if (loaded === void 0 || !isPlainObject$5(loaded.template)) return "unknown";
18375
18464
  const scopeKey = JSON.stringify([loaded.identity, passedKey(passed)]);
18376
18465
  const memoKey = JSON.stringify([scopeKey, outputName]);
18377
18466
  const memo = shared.outputs.get(memoKey);
@@ -18384,8 +18473,8 @@ async function classifyChildOutput(loaded, outputName, passed, chain, shared, sc
18384
18473
  if (++shared.steps > MAX_NESTED_OUTPUT_STEPS) return "unknown";
18385
18474
  if (chain.includes(loaded.identity) || chain.length >= MAX_NESTED_OUTPUT_DEPTH) return "unknown";
18386
18475
  const template = loaded.template;
18387
- const output = (isPlainObject$3(template.Outputs) ? template.Outputs : {})[outputName];
18388
- if (!isPlainObject$3(output) || !Object.hasOwn(output, "Value")) return "unknown";
18476
+ const output = (isPlainObject$5(template.Outputs) ? template.Outputs : {})[outputName];
18477
+ if (!isPlainObject$5(output) || !Object.hasOwn(output, "Value")) return "unknown";
18389
18478
  const scope = {
18390
18479
  walk: newWalk({
18391
18480
  template,
@@ -18457,7 +18546,7 @@ async function expressionClass(value, scope) {
18457
18546
  return result;
18458
18547
  };
18459
18548
  if (Array.isArray(value)) return all(value);
18460
- if (!isPlainObject$3(value)) return "clean";
18549
+ if (!isPlainObject$5(value)) return "clean";
18461
18550
  const key = intrinsicKey(value);
18462
18551
  if (key === void 0) return all(Object.values(value));
18463
18552
  const operand = value[key];
@@ -18472,7 +18561,7 @@ async function expressionClass(value, scope) {
18472
18561
  case "Fn::Sub": {
18473
18562
  const text = Array.isArray(operand) ? operand[0] : operand;
18474
18563
  if (typeof text !== "string") return worseOf("unknown", await expressionClass(operand, scope));
18475
- const vars = Array.isArray(operand) && isPlainObject$3(operand[1]) ? operand[1] : {};
18564
+ const vars = Array.isArray(operand) && isPlainObject$5(operand[1]) ? operand[1] : {};
18476
18565
  let result = text.includes(DYNAMIC_REFERENCE_OPEN) ? "secret" : "clean";
18477
18566
  result = worseOf(result, await all(Object.values(vars)));
18478
18567
  for (const name of subPlaceholders(text)) {
@@ -18550,7 +18639,7 @@ async function classifyPassedParameters(parameters, sources) {
18550
18639
  }
18551
18640
  async function classifyPassed(parameters, sources, nested) {
18552
18641
  const classes = /* @__PURE__ */ new Map();
18553
- if (!isPlainObject$3(parameters)) return classes;
18642
+ if (!isPlainObject$5(parameters)) return classes;
18554
18643
  for (const [name, expression] of Object.entries(parameters)) {
18555
18644
  let passedClass;
18556
18645
  try {
@@ -18591,7 +18680,7 @@ function possiblyMaskedKeys(resolvedProps, corpora) {
18591
18680
  const wholeShortLeaf = (value) => {
18592
18681
  if (typeof value === "string") return short.includes(value);
18593
18682
  if (Array.isArray(value)) return value.some(wholeShortLeaf);
18594
- if (isPlainObject$3(value)) return Object.values(value).some(wholeShortLeaf);
18683
+ if (isPlainObject$5(value)) return Object.values(value).some(wholeShortLeaf);
18595
18684
  return false;
18596
18685
  };
18597
18686
  return Object.keys(resolvedProps).filter((key) => {
@@ -18622,7 +18711,7 @@ function maskedPropertyFingerprintsOf(record) {
18622
18711
  const read = /* @__PURE__ */ new Map();
18623
18712
  if (record === null || typeof record !== "object") return read;
18624
18713
  const field = record.maskedPropertyFingerprints;
18625
- if (!isPlainObject$3(field)) return read;
18714
+ if (!isPlainObject$5(field)) return read;
18626
18715
  for (const [key, value] of Object.entries(field)) if (typeof value === "string" && value.startsWith(FINGERPRINT_PREFIX)) read.set(key, value);
18627
18716
  return read;
18628
18717
  }
@@ -18630,7 +18719,7 @@ function maskedPropertyInputFingerprintsOf(record) {
18630
18719
  const read = /* @__PURE__ */ new Map();
18631
18720
  if (record === null || typeof record !== "object") return read;
18632
18721
  const field = record.maskedPropertyInputFingerprints;
18633
- if (!isPlainObject$3(field)) return read;
18722
+ if (!isPlainObject$5(field)) return read;
18634
18723
  const text = maskedPropertyFingerprintsOf(record);
18635
18724
  for (const [key, value] of Object.entries(field)) {
18636
18725
  if (typeof value !== "string" || !value.startsWith(INPUT_FINGERPRINT_PREFIX)) continue;
@@ -18677,7 +18766,7 @@ async function movedMaskedProperties(record, templateProps, fingerprinter, onReb
18677
18766
  function withRebaselinedFingerprints(record, fingerprints) {
18678
18767
  const text = maskedPropertyFingerprintsOf(record);
18679
18768
  const field = record.maskedPropertyInputFingerprints;
18680
- const next = isPlainObject$3(field) ? Object.entries(field) : [];
18769
+ const next = isPlainObject$5(field) ? Object.entries(field) : [];
18681
18770
  let changed = false;
18682
18771
  for (const [key, value] of Object.entries(fingerprints)) {
18683
18772
  if (text.get(key) !== splitInputFingerprint(value).text) continue;
@@ -18710,10 +18799,10 @@ function withMaskedPropertyFingerprints(scrubbed, writtenBag, templateProps, sec
18710
18799
  fingerprints = maskedPropertyFingerprintsFor(scrubbed.properties, templateProps);
18711
18800
  inputs = boundInputFingerprints(fingerprints, inputFingerprints);
18712
18801
  } else {
18713
- if (!isPlainObject$3(previous)) return scrubbed;
18802
+ if (!isPlainObject$5(previous)) return scrubbed;
18714
18803
  if (corpora.length === 0) return scrubbed;
18715
18804
  fingerprints = { ...previous };
18716
- inputs = isPlainObject$3(previousInputs) ? { ...previousInputs } : void 0;
18805
+ inputs = isPlainObject$5(previousInputs) ? { ...previousInputs } : void 0;
18717
18806
  }
18718
18807
  if (fingerprints !== void 0 && corpora.length > 0) {
18719
18808
  const refused = Object.keys(fingerprints).filter((key) => Object.hasOwn(templateProps, key) && corpora.some((corpus) => templateCarriesNeedle(templateProps[key], corpus)));
@@ -19697,11 +19786,11 @@ function validReferenceRegion(region) {
19697
19786
  if (typeof region !== "string") return void 0;
19698
19787
  return canonicalizeRegion(region) === region && isClientSafeRegion(region) ? region : void 0;
19699
19788
  }
19700
- function isPlainObject$2(value) {
19789
+ function isPlainObject$4(value) {
19701
19790
  return value !== null && typeof value === "object" && !Array.isArray(value);
19702
19791
  }
19703
19792
  function validateReferenceProvenance(token, raw) {
19704
- if (!isSingleDynamicReferenceToken(token) || !isPlainObject$2(raw)) return void 0;
19793
+ if (!isSingleDynamicReferenceToken(token) || !isPlainObject$4(raw)) return void 0;
19705
19794
  const versionsRaw = Object.hasOwn(raw, "versions") ? raw["versions"] : void 0;
19706
19795
  const readRaw = Object.hasOwn(raw, "readVersions") ? raw["readVersions"] : void 0;
19707
19796
  if (readRaw !== void 0) {
@@ -19719,11 +19808,11 @@ function validateReferenceProvenance(token, raw) {
19719
19808
  return out;
19720
19809
  }
19721
19810
  function referenceProvenanceOf(record) {
19722
- if (!isPlainObject$2(record) || !Object.hasOwn(record, "referenceProvenance")) return void 0;
19811
+ if (!isPlainObject$4(record) || !Object.hasOwn(record, "referenceProvenance")) return void 0;
19723
19812
  return validatedBag(record["referenceProvenance"]);
19724
19813
  }
19725
19814
  function validatedBag(field) {
19726
- if (!isPlainObject$2(field)) return void 0;
19815
+ if (!isPlainObject$4(field)) return void 0;
19727
19816
  const out = Object.create(null);
19728
19817
  for (const [token, raw] of Object.entries(field)) {
19729
19818
  const entry = validateReferenceProvenance(token, raw);
@@ -19732,9 +19821,9 @@ function validatedBag(field) {
19732
19821
  return { ...out };
19733
19822
  }
19734
19823
  function recordedProvenanceOf(record, token) {
19735
- if (!isPlainObject$2(record) || !Object.hasOwn(record, "referenceProvenance")) return void 0;
19824
+ if (!isPlainObject$4(record) || !Object.hasOwn(record, "referenceProvenance")) return void 0;
19736
19825
  const field = record["referenceProvenance"];
19737
- if (!isPlainObject$2(field) || !Object.hasOwn(field, token)) return void 0;
19826
+ if (!isPlainObject$4(field) || !Object.hasOwn(field, token)) return void 0;
19738
19827
  return validateReferenceProvenance(token, field[token]);
19739
19828
  }
19740
19829
  function recordedReferenceRegions(record) {
@@ -19756,7 +19845,7 @@ function regionsOf(field) {
19756
19845
  function keepHeldTokenProvenance(record) {
19757
19846
  if (!hasReferenceProvenanceField(record)) return record;
19758
19847
  const field = record.referenceProvenance;
19759
- if (!isPlainObject$2(field)) return record;
19848
+ if (!isPlainObject$4(field)) return record;
19760
19849
  const held = recordReferenceTokens(record);
19761
19850
  const keys = Object.keys(field);
19762
19851
  if (keys.every((token) => held.has(token))) return record;
@@ -19768,12 +19857,12 @@ function keepHeldTokenProvenance(record) {
19768
19857
  };
19769
19858
  }
19770
19859
  function hasReferenceProvenanceField(record) {
19771
- return isPlainObject$2(record) && Object.hasOwn(record, "referenceProvenance") && record["referenceProvenance"] !== void 0;
19860
+ return isPlainObject$4(record) && Object.hasOwn(record, "referenceProvenance") && record["referenceProvenance"] !== void 0;
19772
19861
  }
19773
19862
  function outputReferenceProvenanceOf(state, outputKey) {
19774
- if (!isPlainObject$2(state) || !Object.hasOwn(state, "outputReferenceProvenance")) return;
19863
+ if (!isPlainObject$4(state) || !Object.hasOwn(state, "outputReferenceProvenance")) return;
19775
19864
  const field = state["outputReferenceProvenance"];
19776
- if (!isPlainObject$2(field) || !Object.hasOwn(field, outputKey)) return void 0;
19865
+ if (!isPlainObject$4(field) || !Object.hasOwn(field, outputKey)) return void 0;
19777
19866
  return validatedBag(field[outputKey]);
19778
19867
  }
19779
19868
  function persistable(token, entry) {
@@ -19791,7 +19880,7 @@ function tokensUnderPaths(properties, paths) {
19791
19880
  for (const item of value) descend(item, path, next);
19792
19881
  return;
19793
19882
  }
19794
- if (isPlainObject$2(value) && Object.hasOwn(value, path[at])) descend(value[path[at]], path, at + 1);
19883
+ if (isPlainObject$4(value) && Object.hasOwn(value, path[at])) descend(value[path[at]], path, at + 1);
19795
19884
  };
19796
19885
  for (const path of paths) descend(properties, path, 0);
19797
19886
  return out;
@@ -19834,7 +19923,7 @@ function unionWithPrevious(pass, before) {
19834
19923
  }
19835
19924
  function outputProvenanceForPersist(args) {
19836
19925
  const { outputs, resolvedThisRun, carriedFrom, sinkOf } = args;
19837
- if (!resolvedThisRun) return carriedFrom !== void 0 && isPlainObject$2(carriedFrom.outputReferenceProvenance) ? carriedFrom.outputReferenceProvenance : void 0;
19926
+ if (!resolvedThisRun) return carriedFrom !== void 0 && isPlainObject$4(carriedFrom.outputReferenceProvenance) ? carriedFrom.outputReferenceProvenance : void 0;
19838
19927
  let out;
19839
19928
  for (const [outputKey, value] of Object.entries(outputs)) {
19840
19929
  const sink = sinkOf(outputKey);
@@ -19868,20 +19957,37 @@ function tokensOf(value) {
19868
19957
  }
19869
19958
  function recordedTokenRoutes(value, record) {
19870
19959
  if (!hasReferenceProvenanceField(record)) return void 0;
19960
+ return routesOf(tokensOf(value), (token) => recordedProvenanceOf(record, token));
19961
+ }
19962
+ function provenanceTokenRoutes(value, bag) {
19963
+ if (bag === void 0) return void 0;
19964
+ return routesOf(tokensOf(value), (token) => Object.hasOwn(bag, token) ? bag[token] : void 0);
19965
+ }
19966
+ function routesOf(tokens, entryOf) {
19871
19967
  const routes = /* @__PURE__ */ new Map();
19872
19968
  let recorded = false;
19873
- for (const token of tokensOf(value)) {
19874
- const entry = recordedProvenanceOf(record, token);
19969
+ for (const token of tokens) {
19970
+ const entry = entryOf(token);
19875
19971
  const region = entry?.region;
19876
19972
  const pin = entry?.versions?.length === 1 ? entry.versions[0] : void 0;
19877
19973
  if (region !== void 0 || pin !== void 0) recorded = true;
19878
19974
  routes.set(token, {
19879
19975
  region,
19880
- pin
19976
+ pin,
19977
+ ...entry?.versions !== void 0 && { versions: entry.versions }
19881
19978
  });
19882
19979
  }
19883
19980
  return recorded ? routes : void 0;
19884
19981
  }
19982
+ function recordedTokenVersions(value, record) {
19983
+ if (!hasReferenceProvenanceField(record)) return void 0;
19984
+ let out;
19985
+ for (const token of tokensOf(value)) {
19986
+ const versions = recordedProvenanceOf(record, token)?.versions;
19987
+ if (versions !== void 0 && versions.length > 0) (out ??= /* @__PURE__ */ new Map()).set(token, versions);
19988
+ }
19989
+ return out;
19990
+ }
19885
19991
  async function reresolveByRecordedRoutes(resolver, value, logicalId, context, origin, sourceKey, routes, defaults) {
19886
19992
  const tokens = [...routes.keys()];
19887
19993
  const regionOf = (token) => routes.get(token)?.region ?? defaults.region;
@@ -19918,9 +20024,12 @@ async function reresolveByRecordedRoutes(resolver, value, logicalId, context, or
19918
20024
  return value;
19919
20025
  }
19920
20026
  }
19921
- const walkContext = pins.size > 0 ? {
20027
+ const readVersions = /* @__PURE__ */ new Map();
20028
+ for (const [token, route] of routes) if (route.versions !== void 0 && route.versions.length > 0) readVersions.set(token, route.versions);
20029
+ const walkContext = pins.size > 0 || readVersions.size > 0 ? {
19922
20030
  ...context,
19923
- referencePins: pins
20031
+ ...pins.size > 0 && { referencePins: pins },
20032
+ ...readVersions.size > 0 && { recordedReadVersions: readVersions }
19924
20033
  } : context;
19925
20034
  const regions = new Set(tokens.map((token) => regionOf(token) ?? ""));
19926
20035
  if (regions.size <= 1) {
@@ -20545,7 +20654,11 @@ async function reresolveRecordedReferences(value, logicalId, context, origin, so
20545
20654
  servingAsRecordedLine();
20546
20655
  return value;
20547
20656
  }
20548
- return await this.reresolveCrossStackValue(value, void 0, context, origin, sourceKey);
20657
+ const readVersions = recordedTokenVersions(value, record);
20658
+ return await this.reresolveCrossStackValue(value, void 0, readVersions === void 0 ? context : {
20659
+ ...context,
20660
+ recordedReadVersions: readVersions
20661
+ }, origin, sourceKey);
20549
20662
  }
20550
20663
  async function referencesMatchPhysicalId(value, logicalId, context, routeOf) {
20551
20664
  const record = Object.hasOwn(context.resources, logicalId) ? context.resources[logicalId] : void 0;
@@ -20800,6 +20913,13 @@ function healMaskedOwnIdAttribute(logicalId, resource, attributeName, stored, co
20800
20913
  //#endregion
20801
20914
  //#region src/deployment/intrinsic-resolver/cross-stack.ts
20802
20915
  async function reresolveCrossStackValue(value, producerRegion, context, origin, sourceKey, producerOutput, producerRegionLogText) {
20916
+ if (context.crossStackReads !== void 0 && producerOutput !== void 0 && producerOutput.crossAccount !== true && sourceKey !== void 0) context.crossStackReads.set(sourceKey, {
20917
+ stackName: producerOutput.stackName,
20918
+ region: producerOutput.region || this.resolverRegion || "",
20919
+ outputKey: producerOutput.outputKey,
20920
+ carriesToken: carriesDynamicReference(value),
20921
+ ...producerOutput.state !== void 0 && { state: producerOutput.state }
20922
+ });
20803
20923
  if (carriesSecretMask(value)) {
20804
20924
  const recovered = producerOutput === void 0 || producerOutput.crossAccount === true ? void 0 : recoverMaskedOutput(credentialFingerprint(ambientCredentialConfig()), producerOutput.stackName, producerOutput.region, producerOutput.outputKey);
20805
20925
  if (recovered !== void 0) {
@@ -20824,11 +20944,16 @@ async function reresolveCrossStackValue(value, producerRegion, context, origin,
20824
20944
  if (context.recordedSecretValues !== void 0 && producerOutput !== void 0 && producerOutput.crossAccount !== true && context.stateBackend !== void 0 && context.skipDynamicReferences !== true) {
20825
20945
  const plain = [...wholeStringLeavesOf(value)].filter((leaf) => !leaf.includes("{{resolve:") && !carriesSecretMask(leaf));
20826
20946
  if (plain.length > 0) {
20827
- const ids = await producerPhysicalIds(context.recordedImports ?? context.recordedSecretValues, context.stateBackend, producerOutput.stackName, producerOutput.region || this.resolverRegion, () => this.logger.debug(safeMsg`Could not read the state of producer ${this.displayMasked(producerOutput.stackName, context)} for its physical ids; no cross-stack copy of one is kept (go-to-k/cdkd#4819)`));
20947
+ const ids = physicalIdsOf(await producerStateOnce(this.resolverRegion, context, producerOutput, () => this.logger.debug(safeMsg`Could not read the state of producer ${this.displayMasked(producerOutput.stackName, context)} for its physical ids; no cross-stack copy of one is kept (go-to-k/cdkd#4819)`)));
20828
20948
  for (const leaf of plain) if (ids.has(leaf)) recordPhysicalNameCopy(context.recordedSecretValues, leaf);
20829
20949
  }
20830
20950
  }
20831
20951
  if (!carriesDynamicReference(value)) return value;
20952
+ if (producerOutput !== void 0 && producerOutput.crossAccount !== true && context.recordedSecretValues !== void 0 && context.skipDynamicReferences !== true && context.provenanceCapture !== true) {
20953
+ const state = await producerStateOnce(this.resolverRegion, context, producerOutput, () => this.logger.debug(safeMsg`Could not read the state of producer ${this.displayMasked(producerOutput.stackName, context)} for its recorded secret versions; its output is resolved at the current version`));
20954
+ const routes = provenanceTokenRoutes(value, outputReferenceProvenanceOf(state, producerOutput.outputKey));
20955
+ if (routes !== void 0) return await reresolveByRecordedRoutes(this, value, producerOutput.stackName, context, origin, sourceKey, routes, { region: producerRegion || void 0 });
20956
+ }
20832
20957
  const resolver = this.resolverForProducerRegion(producerRegion, context, producerRegionLogText);
20833
20958
  const pinnedContext = {
20834
20959
  ...producerRegion ? withoutProducerRegions(context) : context,
@@ -20917,7 +21042,8 @@ async function resolveImportValue(importValueArg, context) {
20917
21042
  found = {
20918
21043
  value,
20919
21044
  refStack,
20920
- lookupRegion
21045
+ lookupRegion,
21046
+ state
20921
21047
  };
20922
21048
  break;
20923
21049
  }
@@ -20929,7 +21055,8 @@ async function resolveImportValue(importValueArg, context) {
20929
21055
  if (found) return await this.reresolveCrossStackValue(found.value, found.lookupRegion, context, `Fn::ImportValue ${quotedRender(this.displayLeaf(exportName, context), "'")} (producer ${this.displayLeaf(found.refStack, context)} / ${this.displayLeaf(found.lookupRegion, context)})`, sourceKey, {
20930
21056
  stackName: found.refStack,
20931
21057
  region: found.lookupRegion,
20932
- outputKey: exportName
21058
+ outputKey: exportName,
21059
+ state: found.state
20933
21060
  });
20934
21061
  if (this.cfnFallback) {
20935
21062
  const cfnExport = await this.lookupCfnExport(exportName, context);
@@ -20949,32 +21076,60 @@ function recordImport(context, exportName, producerStack, producerRegion) {
20949
21076
  sourceRegion: producerRegion
20950
21077
  });
20951
21078
  }
20952
- const producerPhysicalIdReads = /* @__PURE__ */ new WeakMap();
20953
- function producerPhysicalIds(scope, stateBackend, stackName, region, onFailure) {
20954
- let reads = producerPhysicalIdReads.get(scope);
21079
+ const producerStateReads = /* @__PURE__ */ new WeakMap();
21080
+ async function readProducerStateOnce(scope, stateBackend, stackName, region, onFailure, inHand) {
21081
+ let reads = producerStateReads.get(scope);
20955
21082
  if (reads === void 0) {
20956
21083
  reads = /* @__PURE__ */ new Map();
20957
- producerPhysicalIdReads.set(scope, reads);
21084
+ producerStateReads.set(scope, reads);
20958
21085
  }
20959
21086
  const key = JSON.stringify([stackName, region]);
20960
21087
  let read = reads.get(key);
20961
21088
  if (read === void 0) {
20962
- read = (async () => {
20963
- const ids = /* @__PURE__ */ new Set();
21089
+ read = inHand !== void 0 ? Promise.resolve({
21090
+ state: inHand,
21091
+ failed: false
21092
+ }) : (async () => {
21093
+ if (stateBackend === void 0) return {
21094
+ state: void 0,
21095
+ failed: false
21096
+ };
20964
21097
  try {
20965
- const data = await stateBackend.getState(stackName, region);
20966
- for (const record of Object.values(data?.state.resources ?? {})) {
20967
- const id = record?.physicalId;
20968
- if (typeof id === "string" && id !== "") ids.add(id);
20969
- }
21098
+ return {
21099
+ state: (await stateBackend.getState(stackName, region))?.state ?? void 0,
21100
+ failed: false
21101
+ };
20970
21102
  } catch {
20971
- onFailure();
21103
+ return {
21104
+ state: void 0,
21105
+ failed: true
21106
+ };
20972
21107
  }
20973
- return ids;
20974
21108
  })();
20975
21109
  reads.set(key, read);
20976
21110
  }
20977
- return read;
21111
+ const { state, failed } = await read;
21112
+ if (failed) onFailure();
21113
+ return state;
21114
+ }
21115
+ function producerStateOnce(resolverRegion, context, producerOutput, onFailure) {
21116
+ return readProducerStateOnce(context.recordedImports ?? context.recordedSecretValues ?? context, context.stateBackend, producerOutput.stackName, producerOutput.region || resolverRegion || "", onFailure, producerOutput.state);
21117
+ }
21118
+ const physicalIdsByState = /* @__PURE__ */ new WeakMap();
21119
+ function physicalIdsOf(state) {
21120
+ if (state === void 0) return /* @__PURE__ */ new Set();
21121
+ let ids = physicalIdsByState.get(state);
21122
+ if (ids === void 0) {
21123
+ const out = /* @__PURE__ */ new Set();
21124
+ const resources = state.resources;
21125
+ if (resources !== null && typeof resources === "object") for (const record of Object.values(resources)) {
21126
+ const id = record?.physicalId;
21127
+ if (typeof id === "string" && id !== "") out.add(id);
21128
+ }
21129
+ ids = out;
21130
+ physicalIdsByState.set(state, ids);
21131
+ }
21132
+ return ids;
20978
21133
  }
20979
21134
 
20980
21135
  //#endregion
@@ -21517,7 +21672,7 @@ async function resolveGetStackOutput(arg, context) {
21517
21672
  stackName,
21518
21673
  region,
21519
21674
  outputKey: outputName,
21520
- ...roleArn ? { crossAccount: true } : {}
21675
+ ...roleArn ? { crossAccount: true } : { state: stateData.state }
21521
21676
  }, loggedRegionText);
21522
21677
  }
21523
21678
  function recordOutputRead(context, producerStack, producerRegion, outputName) {
@@ -21637,13 +21792,19 @@ function secretVerdictScope(resolver) {
21637
21792
  }
21638
21793
  function recordProvenanceOfResolution(resolver, context, token, version) {
21639
21794
  if (context === void 0 || context.provenanceSuppressed === true) return;
21640
- const resolution = {
21641
- region: canonicalizeRegion(resolver.explicitRegion),
21642
- version,
21643
- route: context.provenanceRoute ?? "literal"
21644
- };
21645
- if (context.recordedSecretValues !== void 0) recordReferenceResolution(context.recordedSecretValues, token, resolution);
21646
- if (context.provenanceSink !== void 0) recordReferenceResolution(context.provenanceSink, token, resolution);
21795
+ const route = context.provenanceRoute ?? "literal";
21796
+ const region = canonicalizeRegion(resolver.explicitRegion);
21797
+ const recorded = route === "read" ? context.recordedReadVersions?.get(token) : void 0;
21798
+ const versions = recorded !== void 0 && recorded.length > 0 ? recorded : [version];
21799
+ for (const one of versions) {
21800
+ const resolution = {
21801
+ region,
21802
+ version: one,
21803
+ route
21804
+ };
21805
+ if (context.recordedSecretValues !== void 0) recordReferenceResolution(context.recordedSecretValues, token, resolution);
21806
+ if (context.provenanceSink !== void 0) recordReferenceResolution(context.provenanceSink, token, resolution);
21807
+ }
21647
21808
  }
21648
21809
  async function resolveDynamicReferences(value, context) {
21649
21810
  return (await this.resolveDynamicReferencesWithLogTwin(value, value, context, void 0, true)).result;
@@ -23426,6 +23587,101 @@ IntrinsicFunctionResolver.prototype.noteRefStateMask = noteRefStateMask;
23426
23587
  IntrinsicFunctionResolver.prototype.clientsForRegion = clientsForRegion;
23427
23588
  IntrinsicFunctionResolver.prototype.serviceDiscoveryClient = serviceDiscoveryClient;
23428
23589
 
23590
+ //#endregion
23591
+ //#region src/analyzer/read-provenance-promotion.ts
23592
+ function isPlainObject$3(value) {
23593
+ return value !== null && typeof value === "object" && !Array.isArray(value);
23594
+ }
23595
+ function readsAcrossStacks(value) {
23596
+ if (Array.isArray(value)) return value.some(readsAcrossStacks);
23597
+ if (!isPlainObject$3(value)) return false;
23598
+ if (Object.hasOwn(value, "Fn::ImportValue") || Object.hasOwn(value, "Fn::GetStackOutput")) return true;
23599
+ return Object.values(value).some(readsAcrossStacks);
23600
+ }
23601
+ function recordedReadVersions(record) {
23602
+ if (!isPlainObject$3(record) || !Object.hasOwn(record, "referenceProvenance")) return void 0;
23603
+ const field = referenceProvenanceOf(record);
23604
+ if (field === void 0) return void 0;
23605
+ let out;
23606
+ for (const [token, entry] of Object.entries(field)) if (entry.readVersions !== void 0 && entry.readVersions.length > 0) (out ??= /* @__PURE__ */ new Map()).set(token, entry.readVersions);
23607
+ return out;
23608
+ }
23609
+ async function readProvenancePromotions(args) {
23610
+ const { currentState, desiredTemplate, sources } = args;
23611
+ const parser = args.parser ?? new TemplateParser();
23612
+ const records = currentState.resources;
23613
+ const parameters = isPlainObject$3(desiredTemplate.Parameters) ? desiredTemplate.Parameters : void 0;
23614
+ const out = [];
23615
+ for (const { logicalId, changeType } of args.rows) {
23616
+ if (changeType !== "NO_CHANGE" && changeType !== "UPDATE") continue;
23617
+ const record = Object.hasOwn(records, logicalId) ? records[logicalId] : void 0;
23618
+ const readVersions = recordedReadVersions(record);
23619
+ if (readVersions === void 0) continue;
23620
+ const resource = Object.hasOwn(desiredTemplate.Resources, logicalId) ? desiredTemplate.Resources[logicalId] : void 0;
23621
+ const properties = isPlainObject$3(resource?.Properties) ? resource.Properties : {};
23622
+ const reads = [];
23623
+ for (const [key, value] of Object.entries(properties)) {
23624
+ const referenced = [...parser.extractReferences(value)].filter((id) => id !== logicalId);
23625
+ const resourceIds = referenced.filter((id) => Object.hasOwn(desiredTemplate.Resources, id));
23626
+ const readsParameter = parameters !== void 0 && referenced.some((id) => Object.hasOwn(parameters, id));
23627
+ const crossStack = readsAcrossStacks(value);
23628
+ if (resourceIds.length === 0 && !readsParameter && !crossStack) continue;
23629
+ reads.push({
23630
+ key,
23631
+ value,
23632
+ resources: resourceIds,
23633
+ parameters: readsParameter,
23634
+ crossStack
23635
+ });
23636
+ }
23637
+ if (reads.length === 0) continue;
23638
+ let crossStackBags = [];
23639
+ if (sources?.crossStackOutputs !== void 0) {
23640
+ const crossValues = reads.filter((r) => r.crossStack).map((r) => r.value);
23641
+ if (crossValues.length > 0) crossStackBags = await sources.crossStackOutputs(crossValues);
23642
+ }
23643
+ const upstreamIds = new Set(reads.flatMap((r) => r.resources));
23644
+ const readsAnyParameter = reads.some((r) => r.parameters);
23645
+ const moved = [];
23646
+ for (const [token, recorded] of readVersions) {
23647
+ const domain = /* @__PURE__ */ new Set();
23648
+ let member = false;
23649
+ const join = (versions) => {
23650
+ if (versions === void 0 || versions.length === 0) return;
23651
+ member = true;
23652
+ for (const version of versions) domain.add(version);
23653
+ };
23654
+ for (const id of upstreamIds) {
23655
+ const upstream = Object.hasOwn(records, id) ? records[id] : void 0;
23656
+ join(recordedProvenanceOf(upstream, token)?.versions);
23657
+ }
23658
+ if (readsAnyParameter && sources?.inherited !== void 0) join(sources.inherited.get(token)?.versions);
23659
+ for (const bag of crossStackBags) if (Object.hasOwn(bag, token)) join(bag[token]?.versions);
23660
+ if (!member) continue;
23661
+ if (recorded.some((version) => !domain.has(version))) moved.push(token);
23662
+ }
23663
+ if (moved.length === 0) continue;
23664
+ const recordProperties = isPlainObject$3(record?.properties) ? record.properties : {};
23665
+ const keys = [];
23666
+ for (const r of reads) {
23667
+ if (!Object.hasOwn(recordProperties, r.key)) continue;
23668
+ const held = referenceTokensIn(recordProperties[r.key]);
23669
+ if (!moved.some((token) => held.has(token))) continue;
23670
+ keys.push({
23671
+ key: r.key,
23672
+ upstreams: r.resources
23673
+ });
23674
+ }
23675
+ if (keys.length === 0) continue;
23676
+ out.push({
23677
+ logicalId,
23678
+ keys,
23679
+ tokens: moved
23680
+ });
23681
+ }
23682
+ return out;
23683
+ }
23684
+
23429
23685
  //#endregion
23430
23686
  //#region src/analyzer/diff-calculator.ts
23431
23687
  const INTRINSIC_KEYS = /* @__PURE__ */ new Set([
@@ -23470,7 +23726,7 @@ var DiffCalculator = class DiffCalculator {
23470
23726
  conditionalReplacementVerdict(resourceType, propertyPath, oldValue, newValue) {
23471
23727
  return this.replacementRules.conditionalReplacementVerdict(resourceType, propertyPath, oldValue, newValue);
23472
23728
  }
23473
- async calculateDiff(currentState, desiredTemplate, resolveFn, canonicalizeProperties, allowedUnsupportedProperties, freshParameters, maskForLog, recreateTargets, maskedInputs, refusalRecovery, noEchoCompare) {
23729
+ async calculateDiff(currentState, desiredTemplate, resolveFn, canonicalizeProperties, allowedUnsupportedProperties, freshParameters, maskForLog, recreateTargets, maskedInputs, refusalRecovery, noEchoCompare, readProvenance) {
23474
23730
  const changes = /* @__PURE__ */ new Map();
23475
23731
  refuseMalformedResourceEntriesForDeploy(currentState, void 0, void 0, refusalRecovery);
23476
23732
  refuseMalformedResourceProperties(currentState, void 0, void 0, refusalRecovery);
@@ -23600,7 +23856,12 @@ var DiffCalculator = class DiffCalculator {
23600
23856
  const changeType = changes.get(logicalId)?.changeType;
23601
23857
  if (changeType === "NO_CHANGE" || changeType === "UPDATE") forcedReplacements.add(logicalId);
23602
23858
  }
23859
+ const provenanceChanges = await this.promoteReadProvenanceDependents(changes, currentState, desiredTemplate, readProvenance);
23603
23860
  const syntheticCreateOnlyPaths = await this.loadSyntheticCreateOnlyPaths(changes, desiredTemplate, rawGetAttRefs, freshParameters, forcedReplacements);
23861
+ for (const { change, pc, upstreams } of provenanceChanges) {
23862
+ const templateValue = desiredTemplate.Resources[change.logicalId]?.Properties?.[pc.path];
23863
+ pc.requiresReplacement = this.syntheticRequiresReplacement(change.resourceType, pc.path, syntheticCreateOnlyPaths, upstreams.some((id) => isPlainReferenceTo(templateValue, id, desiredTemplate.Resources[id]?.Type)));
23864
+ }
23604
23865
  do
23605
23866
  this.promoteReplacementDependents(changes, desiredTemplate, syntheticCreateOnlyPaths, forcedReplacements);
23606
23867
  while (this.promoteInPlaceAttributeDependents(changes, desiredTemplate, rawGetAttRefs, syntheticCreateOnlyPaths, freshParameters));
@@ -23608,6 +23869,47 @@ var DiffCalculator = class DiffCalculator {
23608
23869
  this.logger.debug(`Diff calculated: ${summary.create} CREATE, ${summary.update} UPDATE, ${summary.delete} DELETE, ${summary.noChange} NO_CHANGE`);
23609
23870
  return changes;
23610
23871
  }
23872
+ async promoteReadProvenanceDependents(changes, currentState, desiredTemplate, sources) {
23873
+ if (isKnownTokenFreeState(currentState)) return [];
23874
+ const promotions = await readProvenancePromotions({
23875
+ rows: changes.values(),
23876
+ currentState,
23877
+ desiredTemplate,
23878
+ sources,
23879
+ parser: this.parser
23880
+ });
23881
+ const out = [];
23882
+ for (const promotion of promotions) {
23883
+ const change = changes.get(promotion.logicalId);
23884
+ if (change === void 0) continue;
23885
+ const existingPaths = new Set((change.propertyChanges ?? []).map((pc) => pc.path));
23886
+ const synthetic = [];
23887
+ for (const { key, upstreams } of promotion.keys) {
23888
+ if (existingPaths.has(key)) continue;
23889
+ const pc = {
23890
+ path: key,
23891
+ oldValue: change.currentProperties?.[key],
23892
+ newValue: change.desiredProperties?.[key],
23893
+ requiresReplacement: false,
23894
+ inPlacePropagated: true,
23895
+ readProvenancePromoted: true
23896
+ };
23897
+ synthetic.push(pc);
23898
+ out.push({
23899
+ change,
23900
+ pc,
23901
+ upstreams
23902
+ });
23903
+ }
23904
+ if (synthetic.length === 0) continue;
23905
+ if (change.changeType === "NO_CHANGE") {
23906
+ change.changeType = "UPDATE";
23907
+ change.propertyChanges = synthetic;
23908
+ } else change.propertyChanges = [...change.propertyChanges ?? [], ...synthetic];
23909
+ this.logger.debug(safeMsg`UPDATE (promoted): ${promotion.logicalId} holds a secret reference read at a version its upstream no longer records (${synthetic.map((pc) => pc.path).join(", ")})`);
23910
+ }
23911
+ return out;
23912
+ }
23611
23913
  async loadSyntheticCreateOnlyPaths(changes, desiredTemplate, rawGetAttRefs, freshParameters, forcedReplacements) {
23612
23914
  const loaded = /* @__PURE__ */ new Map();
23613
23915
  const queue = [...freshParameters ?? []];
@@ -24809,8 +25111,8 @@ function compare(desired, previous, mask) {
24809
25111
  if (!Array.isArray(desired) || desired.length !== previous.length) return "differs";
24810
25112
  return combine(previous.map((item, i) => compare(desired[i], item, mask)));
24811
25113
  }
24812
- if (isPlainObject$1(previous)) {
24813
- if (!isPlainObject$1(desired)) return "differs";
25114
+ if (isPlainObject$2(previous)) {
25115
+ if (!isPlainObject$2(desired)) return "differs";
24814
25116
  if (!Object.keys(desired).every((k) => Object.prototype.hasOwnProperty.call(previous, k))) return "differs";
24815
25117
  return combine(Object.keys(previous).map((k) => compare(desired[k], previous[k], mask)));
24816
25118
  }
@@ -24836,7 +25138,7 @@ function resolvesReference(desired, previous, mask) {
24836
25138
  const pattern = literals.map(escapeRegExp$1).join("[\\s\\S]*");
24837
25139
  return new RegExp(`^${pattern}$`).test(desired);
24838
25140
  }
24839
- function isPlainObject$1(value) {
25141
+ function isPlainObject$2(value) {
24840
25142
  return typeof value === "object" && value !== null && !Array.isArray(value);
24841
25143
  }
24842
25144
  function escapeRegExp$1(text) {
@@ -25627,7 +25929,7 @@ var CloudControlProvider = class {
25627
25929
  const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
25628
25930
  if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
25629
25931
  this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
25630
- const { ASGProvider } = await import("./asg-provider-CsBxbRlH.js");
25932
+ const { ASGProvider } = await import("./asg-provider-BtUUjRnI.js");
25631
25933
  const delegateRegion = ambientRegion();
25632
25934
  let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
25633
25935
  if (asgProvider === void 0) {
@@ -25733,7 +26035,7 @@ var CloudControlProvider = class {
25733
26035
  const family = SDK_DELETE_FAMILIES.get(resourceType);
25734
26036
  const cached = this.sdkDeleteDelegates.get(family);
25735
26037
  if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
25736
- const provider = family === "rds" ? new (await (import("./rds-provider-d15q7Rp5.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-C81KkPPG.js"))).NeptuneProvider({ region: ccRegion });
26038
+ const provider = family === "rds" ? new (await (import("./rds-provider-B9gz-giS.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-Bkrw65eO.js"))).NeptuneProvider({ region: ccRegion });
25737
26039
  this.sdkDeleteDelegates.set(family, {
25738
26040
  region: ccRegion,
25739
26041
  provider
@@ -33556,11 +33858,16 @@ async function resolveReplayProps(props, resolvers, secrets, execCtx, logicalId,
33556
33858
  resources: {},
33557
33859
  recordedSecretValues: secrets
33558
33860
  };
33861
+ const pins = new ReplayPins(record, resolvers, execCtx, logicalId);
33559
33862
  const walk = async (v, path) => {
33560
33863
  if (typeof v === "string") {
33561
33864
  if (!v.includes("{{resolve:")) return v;
33562
33865
  refuseUnprovenReplaySecret(v, path, logicalId, execCtx, recordedRegions);
33563
- return await resolveLeafByRegion(v, path, logicalId, execCtx, resolvers, resolverContext, recordedRegions);
33866
+ const leafPins = await pins.forLeaf(v, recordedRegions);
33867
+ return await resolveLeafByRegion(v, path, logicalId, execCtx, resolvers, leafPins === void 0 ? resolverContext : {
33868
+ ...resolverContext,
33869
+ referencePins: leafPins
33870
+ }, recordedRegions);
33564
33871
  }
33565
33872
  if (Array.isArray(v)) {
33566
33873
  const out = new Array(v.length);
@@ -33576,6 +33883,66 @@ async function resolveReplayProps(props, resolvers, secrets, execCtx, logicalId,
33576
33883
  };
33577
33884
  return await walk(props, "");
33578
33885
  }
33886
+ var ReplayPins = class {
33887
+ recorded = /* @__PURE__ */ new Map();
33888
+ verdicts = /* @__PURE__ */ new Map();
33889
+ resolvers;
33890
+ execCtx;
33891
+ logicalId;
33892
+ constructor(record, resolvers, execCtx, logicalId) {
33893
+ this.resolvers = resolvers;
33894
+ this.execCtx = execCtx;
33895
+ this.logicalId = logicalId;
33896
+ const field = referenceProvenanceOf(record);
33897
+ for (const [token, entry] of Object.entries(field ?? {})) if (entry.versions?.length === 1) this.recorded.set(token, entry.versions[0]);
33898
+ }
33899
+ async forLeaf(leaf, recordedRegions) {
33900
+ if (this.recorded.size === 0) return void 0;
33901
+ let out;
33902
+ for (const token of dynamicReferenceTokens(leaf)) {
33903
+ const pin = this.recorded.get(token);
33904
+ if (pin === void 0) continue;
33905
+ if (!await this.usable(token, pin, recordedRegions)) continue;
33906
+ (out ??= /* @__PURE__ */ new Map()).set(token, pin);
33907
+ }
33908
+ return out;
33909
+ }
33910
+ async usable(token, pin, recordedRegions) {
33911
+ const known = this.verdicts.get(token);
33912
+ if (known !== void 0) return known;
33913
+ const verdict = classifyRecordedSecretRegion(token, this.execCtx.region, this.execCtx.importedProducerRegions, recordedRegions);
33914
+ if (verdict.kind === "ambiguous") return false;
33915
+ const resolver = verdict.kind === "named-region" ? this.resolvers.forRegion(verdict.region) : verdict.kind === "recorded-region" ? this.resolvers.forRecordedRegion(verdict.region) : this.resolvers.primary;
33916
+ let ok;
33917
+ try {
33918
+ await resolver.resolveDynamicReferences(token, {
33919
+ template: { Resources: {} },
33920
+ resources: {},
33921
+ recordedSecretValues: /* @__PURE__ */ new Map(),
33922
+ provenanceSuppressed: true
33923
+ });
33924
+ } catch (err) {
33925
+ if (isDeliberateResolutionRefusal(err)) throw err;
33926
+ }
33927
+ try {
33928
+ const served = await resolver.resolveDynamicReferences(token, {
33929
+ template: { Resources: {} },
33930
+ resources: {},
33931
+ recordedSecretValues: /* @__PURE__ */ new Map(),
33932
+ provenanceSuppressed: true,
33933
+ referencePins: /* @__PURE__ */ new Map([[token, pin]])
33934
+ });
33935
+ ok = served.includes("{{resolve:") || served.length >= 4;
33936
+ if (!ok) getLogger().warn(safeMsg`Rollback of ${this.logicalId} restores a secret reference at its current version, not the version its record names: that value is shorter than four characters, so cdkd could not keep it out of state.`);
33937
+ } catch (err) {
33938
+ if (isDeliberateResolutionRefusal(err)) throw err;
33939
+ getLogger().warn(safeMsg`Rollback of ${this.logicalId} could not read a secret at the version its record names (it may have been deprecated or deleted); restoring the current value instead.`);
33940
+ ok = false;
33941
+ }
33942
+ this.verdicts.set(token, ok);
33943
+ return ok;
33944
+ }
33945
+ };
33579
33946
  function refuseMaskedReplayBaseline(props, logicalId, inert = []) {
33580
33947
  if (props === void 0 || !carriesSecretMask(props)) return;
33581
33948
  if (inert.length > 0 && masksOnlyAt(props, inert)) return;
@@ -40235,6 +40602,118 @@ function recordedProtectionNote(evidence, flags) {
40235
40602
  return `${evidence}. AWS refuses to delete the resource while that protection is on, and cdkd deploy has no --remove-protection flag to clear it (only cdkd destroy and cdkd state destroy act on one), so ${flags} alone does not remove the old resource: depending on the replacement order, the deploy either fails at that delete or completes leaving the old resource, and its data, in AWS and no longer tracked by cdkd. Read ${DELETION_PROTECTION_DOC_POINTER} before you disable anything, then turn the protection off out of band (the console, or the service's own API) and re-run with ${flags}.`;
40236
40603
  }
40237
40604
 
40605
+ //#endregion
40606
+ //#region src/deployment/deploy-engine/read-provenance-moved.ts
40607
+ function occurrences(value, token) {
40608
+ if (typeof value === "string") return value.includes(token) ? value.split(token).length - 1 : 0;
40609
+ if (Array.isArray(value)) {
40610
+ let n = 0;
40611
+ for (const item of value) n += occurrences(item, token);
40612
+ return n;
40613
+ }
40614
+ if (value !== null && typeof value === "object") {
40615
+ let n = 0;
40616
+ for (const item of Object.values(value)) n += occurrences(item, token);
40617
+ return n;
40618
+ }
40619
+ return 0;
40620
+ }
40621
+ function readProvenanceMovedPaths(args) {
40622
+ const paths = /* @__PURE__ */ new Set();
40623
+ const tokens = [];
40624
+ const field = referenceProvenanceOf(args.record);
40625
+ if (field === void 0) return {
40626
+ paths,
40627
+ tokens
40628
+ };
40629
+ for (const [token, entry] of Object.entries(field)) {
40630
+ const recorded = entry.readVersions;
40631
+ if (recorded === void 0 || recorded.length === 0) continue;
40632
+ const served = passReadVersionsFor(args.secrets, token);
40633
+ if (served === void 0) continue;
40634
+ if ([...served].every((version) => recorded.includes(version))) continue;
40635
+ const held = /* @__PURE__ */ new Set();
40636
+ for (const key of Object.keys(args.desiredRedacted)) {
40637
+ const count = occurrences(args.desiredRedacted[key], token);
40638
+ if (count === 0) continue;
40639
+ if (count > (Object.hasOwn(args.templateProperties, key) ? occurrences(args.templateProperties[key], token) : 0)) held.add(key);
40640
+ }
40641
+ if (held.size === 0) continue;
40642
+ for (const key of held) paths.add(key);
40643
+ tokens.push({
40644
+ token,
40645
+ paths: held,
40646
+ recorded,
40647
+ served,
40648
+ region: entry.region
40649
+ });
40650
+ }
40651
+ return {
40652
+ paths,
40653
+ tokens
40654
+ };
40655
+ }
40656
+ async function confirmValueMoves(moved, sameValue) {
40657
+ const kept = [];
40658
+ const unchanged = [];
40659
+ for (const entry of moved.tokens) {
40660
+ let equal = entry.recorded.length === 1 ? true : void 0;
40661
+ for (const served of entry.served) {
40662
+ if (equal !== true) break;
40663
+ equal = await sameValue(entry, entry.recorded[0], served);
40664
+ }
40665
+ if (equal === true) unchanged.push(entry);
40666
+ else kept.push(entry);
40667
+ }
40668
+ const paths = /* @__PURE__ */ new Set();
40669
+ for (const entry of kept) for (const key of entry.paths) paths.add(key);
40670
+ return {
40671
+ moved: {
40672
+ paths,
40673
+ tokens: kept
40674
+ },
40675
+ unchanged
40676
+ };
40677
+ }
40678
+ async function sameValueAtVersions(resolver, entry, recorded, served, base) {
40679
+ const context = (pin) => ({
40680
+ template: base.template,
40681
+ resources: base.resources,
40682
+ recordedSecretValues: /* @__PURE__ */ new Map(),
40683
+ provenanceSuppressed: true,
40684
+ referencePins: /* @__PURE__ */ new Map([[entry.token, pin]])
40685
+ });
40686
+ if (entry.region === void 0) return void 0;
40687
+ const reader = resolver.resolverForRecordedRegion(entry.region);
40688
+ try {
40689
+ const now = await reader.resolveDynamicReferences(entry.token, context(served));
40690
+ const then = await reader.resolveDynamicReferences(entry.token, context(recorded));
40691
+ if (now.includes("{{resolve:") || then.includes("{{resolve:")) return void 0;
40692
+ return now === then;
40693
+ } catch (err) {
40694
+ if (isDeliberateResolutionRefusal(err)) throw err;
40695
+ return;
40696
+ }
40697
+ }
40698
+ function withRefreshedReadVersions(record, unchanged) {
40699
+ const field = referenceProvenanceOf(record);
40700
+ if (field === void 0) return record;
40701
+ const out = { ...field };
40702
+ for (const { token, served } of unchanged) {
40703
+ const before = Object.hasOwn(field, token) ? field[token] : void 0;
40704
+ const previousRead = new Set(before?.readVersions ?? []);
40705
+ const versions = [.../* @__PURE__ */ new Set([...(before?.versions ?? []).filter((version) => !previousRead.has(version)), ...served])].sort();
40706
+ if (versions.length > 8) continue;
40707
+ const next = validateReferenceProvenance(token, {
40708
+ ...before?.region !== void 0 && { region: before.region },
40709
+ versions,
40710
+ readVersions: [...served].sort()
40711
+ });
40712
+ if (next !== void 0) out[token] = next;
40713
+ }
40714
+ return withReferenceProvenance(record, out);
40715
+ }
40716
+
40238
40717
  //#endregion
40239
40718
  //#region src/deployment/deploy-engine/noecho.ts
40240
40719
  function noEchoExactEchoLeavesOf(record) {
@@ -42191,12 +42670,23 @@ async function provisionUpdate(logicalId, change, stateResources, stackName, tem
42191
42670
  };
42192
42671
  const suppliesFreshMaskOnlyValue = pendingParameterLeaves.size > 0 || Object.keys(resolvedProps).some((key) => otherFreshAt(key).length > 0);
42193
42672
  const rewrittenPaths = readsProducerReplacedThisRun.call(this, template, logicalId, stateResources) ? redactionRewrittenPaths(resolvedProps, desiredForSkipCheck, comparisonCoordinates) : /* @__PURE__ */ new Set();
42673
+ const { moved: provenanceMoved, unchanged: provenanceUnchanged } = await confirmValueMoves(readProvenanceMovedPaths({
42674
+ record: currentResource,
42675
+ templateProperties: desiredProps,
42676
+ desiredRedacted: desiredForSkipCheck,
42677
+ secrets: updateSecrets
42678
+ }), (entry, recordedVersion, servedVersion) => sameValueAtVersions(this.resolver, entry, recordedVersion, servedVersion, {
42679
+ template,
42680
+ resources: stateResources
42681
+ }));
42682
+ for (const path of provenanceMoved.paths) rewrittenPaths.add(path);
42683
+ if (provenanceMoved.paths.size > 0) this.logger.info(safeMsg`${logicalId} is sent: ${[...provenanceMoved.paths].sort().join(", ")} read a secret-derived value at a newer version than ${logicalId} was deployed with (its upstream changed since then)`);
42194
42684
  const recordMatchesDesired = movedMasked.size === 0 && rewrittenPaths.size === 0 && keyOrderFreeJson(desiredForSkipCheckAsWritten) === keyOrderFreeJson(currentPropsAsWritten);
42195
42685
  const applyAttributeOnlyUpdate = (attributeChanges) => {
42196
42686
  const attrSummary = attributeChanges.map((a) => `${a.attribute}: ${a.oldValue ?? "(unset)"} → ${a.newValue ?? "(unset)"}`).join(", ");
42197
42687
  this.logger.info(safeMsg` ↻ ${logicalId} (${resourceType}) attribute update: ${attrSummary}`);
42198
42688
  stateResources[logicalId] = {
42199
- ...currentResource,
42689
+ ...stateResources[logicalId] ?? currentResource,
42200
42690
  ...this.extractTemplateAttributes(template, logicalId)
42201
42691
  };
42202
42692
  if (counts) counts.updated++;
@@ -42266,6 +42756,7 @@ async function provisionUpdate(logicalId, change, stateResources, stackName, tem
42266
42756
  const differsWhy = (key) => !lateReplacementDeclined.has(key) ? "differs; the provider is not known to report this property exactly, so the difference may be its normalization" : lateCrossPrefixRefused ? "differs; the replacement was refused: see the state-prefix warning above" : `differs; the replacement was not approved (--require-approval=${this.options.requireApproval ?? "never"})`;
42267
42757
  if (witnessMigrates && !typeChanged && echoCandidates.length > 0 && hasAddressablePhysicalId(currentResource)) await readOnce();
42268
42758
  if (!typeChanged && !suppliesFreshMaskOnlyValue && lostChild === void 0 && this.recreateDirectionFor(stackName, logicalId) === void 0 && recordMatchesDesired) {
42759
+ if (provenanceUnchanged.length > 0) stateResources[logicalId] = withRefreshedReadVersions(stateResources[logicalId] ?? currentResource, provenanceUnchanged);
42269
42760
  if (change.attributeChanges && change.attributeChanges.length > 0) {
42270
42761
  applyAttributeOnlyUpdate(change.attributeChanges);
42271
42762
  return;
@@ -42411,6 +42902,7 @@ async function provisionUpdate(logicalId, change, stateResources, stackName, tem
42411
42902
  ...remaining.length > 0 && { noEchoLeaves: remaining.map((c) => [...c]) }
42412
42903
  };
42413
42904
  }
42905
+ if (provenanceUnchanged.length > 0) stateResources[logicalId] = withRefreshedReadVersions(stateResources[logicalId] ?? currentResource, provenanceUnchanged);
42414
42906
  this.attemptedResolvedProps.delete(logicalId);
42415
42907
  if (change.attributeChanges && change.attributeChanges.length > 0) {
42416
42908
  applyAttributeOnlyUpdate(change.attributeChanges);
@@ -44924,18 +45416,18 @@ function conditionInputsFrom(args) {
44924
45416
  };
44925
45417
  }
44926
45418
  const FINGERPRINT_LAYOUT = 1;
44927
- function isPlainObject(value) {
45419
+ function isPlainObject$1(value) {
44928
45420
  return value !== null && typeof value === "object" && !Array.isArray(value);
44929
45421
  }
44930
45422
  function canonicalJson(value) {
44931
45423
  if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
44932
- if (isPlainObject(value)) return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key])}`).join(",")}}`;
45424
+ if (isPlainObject$1(value)) return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key])}`).join(",")}}`;
44933
45425
  const encoded = JSON.stringify(value);
44934
45426
  return encoded === void 0 ? "undefined" : encoded;
44935
45427
  }
44936
45428
  function walkModelledDefinition(value, declaredParameters, parameters, conditions) {
44937
45429
  if (typeof value === "string") return !carriesDynamicReference(value);
44938
- if (!isPlainObject(value)) return false;
45430
+ if (!isPlainObject$1(value)) return false;
44939
45431
  const keys = Object.keys(value);
44940
45432
  if (keys.length !== 1) return false;
44941
45433
  const [key] = keys;
@@ -44958,8 +45450,8 @@ function walkModelledDefinition(value, declaredParameters, parameters, condition
44958
45450
  }
44959
45451
  function conditionFingerprint(template, name, inputOf) {
44960
45452
  const definitions = template.Conditions;
44961
- if (!isPlainObject(definitions)) return void 0;
44962
- const declared = isPlainObject(template.Parameters) ? template.Parameters : {};
45453
+ if (!isPlainObject$1(definitions)) return void 0;
45454
+ const declared = isPlainObject$1(template.Parameters) ? template.Parameters : {};
44963
45455
  const declaredNames = new Set(Object.keys(declared));
44964
45456
  const closure = nullPrototypeRecord();
44965
45457
  const parameters = /* @__PURE__ */ new Set();
@@ -44981,7 +45473,7 @@ function conditionFingerprint(template, name, inputOf) {
44981
45473
  let hasToken = false;
44982
45474
  for (const parameter of parameters) {
44983
45475
  const definition = declared[parameter];
44984
- const type = isPlainObject(definition) ? definition["Type"] : void 0;
45476
+ const type = isPlainObject$1(definition) ? definition["Type"] : void 0;
44985
45477
  if (typeof type !== "string") return void 0;
44986
45478
  const input = inputOf(parameter);
44987
45479
  if (input === void 0) return void 0;
@@ -45012,7 +45504,7 @@ function collectIfConditionNames(value, names, conditions) {
45012
45504
  for (const element of value) collectIfConditionNames(element, names, conditions);
45013
45505
  return;
45014
45506
  }
45015
- if (!isPlainObject(value)) return;
45507
+ if (!isPlainObject$1(value)) return;
45016
45508
  const ifArgs = value["Fn::If"];
45017
45509
  if (Array.isArray(ifArgs) && typeof ifArgs[0] === "string") {
45018
45510
  names.add(ifArgs[0]);
@@ -45026,9 +45518,9 @@ function collectIfConditionNames(value, names, conditions) {
45026
45518
  function conditionsReadByDiff(template, conditions) {
45027
45519
  const names = /* @__PURE__ */ new Set();
45028
45520
  for (const section of [template.Resources, template.Outputs]) {
45029
- if (!isPlainObject(section)) continue;
45521
+ if (!isPlainObject$1(section)) continue;
45030
45522
  for (const entry of Object.values(section)) {
45031
- if (!isPlainObject(entry)) continue;
45523
+ if (!isPlainObject$1(entry)) continue;
45032
45524
  const gate = entry["Condition"];
45033
45525
  if (typeof gate === "string") {
45034
45526
  names.add(gate);
@@ -45060,10 +45552,10 @@ function buildConditionVerdictRecord(template, conditions, inputOf) {
45060
45552
  function readRecordedConditionVerdicts(state) {
45061
45553
  const read = nullPrototypeRecord();
45062
45554
  const field = state?.conditionVerdicts;
45063
- if (!isPlainObject(field)) return read;
45555
+ if (!isPlainObject$1(field)) return read;
45064
45556
  for (const name of Object.keys(field)) {
45065
45557
  const entry = field[name];
45066
- if (isPlainObject(entry) && typeof entry["verdict"] === "boolean" && typeof entry["fingerprint"] === "string") read[name] = {
45558
+ if (isPlainObject$1(entry) && typeof entry["verdict"] === "boolean" && typeof entry["fingerprint"] === "string") read[name] = {
45067
45559
  verdict: entry["verdict"],
45068
45560
  fingerprint: entry["fingerprint"]
45069
45561
  };
@@ -45106,11 +45598,11 @@ function deployConditionInputs(parameterValues, inheritedSecrets, shadowedBy = /
45106
45598
  function parentSuppliedValues(template, supplied, tokens) {
45107
45599
  const names = /* @__PURE__ */ new Set();
45108
45600
  if (supplied === void 0) return names;
45109
- const declared = isPlainObject(template.Parameters) ? template.Parameters : {};
45601
+ const declared = isPlainObject$1(template.Parameters) ? template.Parameters : {};
45110
45602
  for (const [name, value] of Object.entries(supplied)) {
45111
45603
  if (tokens.has(name)) continue;
45112
45604
  const definition = declared[name];
45113
- const fallback = isPlainObject(definition) ? definition["Default"] : void 0;
45605
+ const fallback = isPlainObject$1(definition) ? definition["Default"] : void 0;
45114
45606
  if (fallback === void 0 || String(fallback) !== String(value)) names.add(name);
45115
45607
  }
45116
45608
  return names;
@@ -45334,6 +45826,67 @@ function promoteRecreateTargets(changes, recreateTargets, stackName) {
45334
45826
  };
45335
45827
  }
45336
45828
 
45829
+ //#endregion
45830
+ //#region src/deployment/read-provenance-sources.ts
45831
+ function isPlainObject(value) {
45832
+ return value !== null && typeof value === "object" && !Array.isArray(value);
45833
+ }
45834
+ function crossStackNodes(value, into = []) {
45835
+ if (Array.isArray(value)) {
45836
+ for (const item of value) crossStackNodes(item, into);
45837
+ return into;
45838
+ }
45839
+ if (!isPlainObject(value)) return into;
45840
+ const keys = Object.keys(value);
45841
+ if (keys.length === 1 && (keys[0] === "Fn::ImportValue" || keys[0] === "Fn::GetStackOutput")) into.push(value);
45842
+ for (const item of Object.values(value)) crossStackNodes(item, into);
45843
+ return into;
45844
+ }
45845
+ function crossStackOutputProvenanceSource(reads, scope, stateBackend) {
45846
+ return async (value) => {
45847
+ const out = [];
45848
+ for (const node of crossStackNodes(value)) {
45849
+ const key = crossStackSourceKey(node);
45850
+ if (key === void 0) continue;
45851
+ const read = reads.get(key);
45852
+ if (read === void 0 || !read.carriesToken) continue;
45853
+ const state = await readProducerStateOnce(scope, stateBackend, read.stackName, read.region, () => void 0, read.state);
45854
+ const bag = outputReferenceProvenanceOf(state, read.outputKey);
45855
+ if (bag !== void 0) out.push(bag);
45856
+ }
45857
+ return out;
45858
+ };
45859
+ }
45860
+ function inheritedProvenanceForChildDiff(args) {
45861
+ const { row, rowRecord, parentRecords, parentTemplate } = args;
45862
+ if (!args.rowProvisioned || rowRecord === void 0) return void 0;
45863
+ const recordedParameters = isPlainObject(rowRecord.properties) ? rowRecord.properties["Parameters"] : void 0;
45864
+ const tokens = referenceTokensIn(recordedParameters);
45865
+ if (tokens.size === 0) return void 0;
45866
+ const own = referenceProvenanceOf(rowRecord);
45867
+ const upstreams = [...new TemplateParser().extractReferences(isPlainObject(row.Properties) ? row.Properties["Parameters"] : void 0)].filter((id) => Object.hasOwn(parentTemplate.Resources, id) && Object.hasOwn(parentRecords, id));
45868
+ const out = /* @__PURE__ */ new Map();
45869
+ for (const token of tokens) {
45870
+ const versions = /* @__PURE__ */ new Set();
45871
+ let region;
45872
+ for (const id of upstreams) {
45873
+ const entry = recordedProvenanceOf(parentRecords[id], token);
45874
+ for (const version of entry?.versions ?? []) versions.add(version);
45875
+ region ??= entry?.region;
45876
+ }
45877
+ if (versions.size > 0) {
45878
+ out.set(token, {
45879
+ ...region !== void 0 && { region },
45880
+ versions: [...versions].sort()
45881
+ });
45882
+ continue;
45883
+ }
45884
+ const recorded = own !== void 0 && Object.hasOwn(own, token) ? own[token] : void 0;
45885
+ if (recorded !== void 0) out.set(token, recorded);
45886
+ }
45887
+ return out.size === 0 ? void 0 : out;
45888
+ }
45889
+
45337
45890
  //#endregion
45338
45891
  //#region src/deployment/deploy-engine/deploy-flow.ts
45339
45892
  const TAIL_WARM_CONNECTIONS = 3;
@@ -45495,13 +46048,18 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
45495
46048
  }, stackName);
45496
46049
  diffResolverContext.bestEffort = true;
45497
46050
  diffResolverContext.skipDynamicReferences = true;
46051
+ const crossStackReads = /* @__PURE__ */ new Map();
46052
+ diffResolverContext.crossStackReads = crossStackReads;
45498
46053
  const diffResolveFn = (value) => this.resolver.resolve(value, diffResolverContext);
45499
46054
  const maskedInputSourcesForDiff = this.maskedInputSources(effectiveTemplate, currentState.resources, conditions, stackName);
45500
46055
  const maskedInputs = maskedInputSourcesForDiff && {
45501
46056
  sources: maskedInputSourcesForDiff,
45502
46057
  rebaselined: /* @__PURE__ */ new Map()
45503
46058
  };
45504
- const changes = await this.diffCalculator.calculateDiff(currentState, effectiveTemplate, diffResolveFn, makeCanonicalizePropertiesFn(this.providerRegistry), this.providerRegistry.getAllowedUnsupportedProperties?.(), freshNoEchoParametersWithDeclared(this.inheritedNoEchoParameters, effectiveTemplate), this.diffLogMasker(diffResolverContext.recordedSecretValues, effectiveTemplate, parameterValues, currentState.resources), recreateTargetIdsFor(this.options.recreateTargets, stackName), maskedInputs, this.options.refusalRecovery, this.noEchoDiffComparison(currentState.resources, effectiveTemplate, conditions, parameterValues, stackName));
46059
+ const changes = await this.diffCalculator.calculateDiff(currentState, effectiveTemplate, diffResolveFn, makeCanonicalizePropertiesFn(this.providerRegistry), this.providerRegistry.getAllowedUnsupportedProperties?.(), freshNoEchoParametersWithDeclared(this.inheritedNoEchoParameters, effectiveTemplate), this.diffLogMasker(diffResolverContext.recordedSecretValues, effectiveTemplate, parameterValues, currentState.resources), recreateTargetIdsFor(this.options.recreateTargets, stackName), maskedInputs, this.options.refusalRecovery, this.noEchoDiffComparison(currentState.resources, effectiveTemplate, conditions, parameterValues, stackName), {
46060
+ ...this.options.inheritedReferenceProvenance && { inherited: this.options.inheritedReferenceProvenance },
46061
+ crossStackOutputs: crossStackOutputProvenanceSource(crossStackReads, this.recordedImports, this.stateBackend)
46062
+ });
45505
46063
  createOnlyPrefetch.cancel();
45506
46064
  for (const [logicalId, fingerprints] of maskedInputs?.rebaselined ?? []) {
45507
46065
  const record = currentState.resources[logicalId];
@@ -46380,5 +46938,5 @@ DeployEngine.prototype.replacementNameOrigin = replacementNameOrigin;
46380
46938
  DeployEngine.prototype.orphanedNameCollisionAdvice = orphanedNameCollisionAdvice;
46381
46939
 
46382
46940
  //#endregion
46383
- export { isTruthyCfnBoolean as $, NO_CC_HANDLERS_REASON as $a, resolveApp as $c, malformedLocalResourceEntriesWarning as $i, ledgerForStack as $n, shareLogOnlyValues as $o, sendableAssumeRoleCommand as $r, hasUnverifiableParameterRefusal as $s, seedsDeleteFirstGuard as $t, noEchoComparisonForTemplate as A, refuseMalformedResourceEntriesForOrphan as Aa, dockerSpawnEnvWithSensitive as Ac, refStateLookupFromResource as Ai, displayAssemblyPath as Al, journaledOrphanPrintingBag as An, TemplateParser as Ao, deleteIndeterminateGuards as Ar, wholeStringLeavesOf as As, dropFailedHint as At, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as B, repairMalformedOrphansForReadOnly as Ba, runDockerForeground as Bc, UNREADABLE_RESOURCES_MAP_ROW as Bi, PRE_DELETE_SNAPSHOT_TYPES as Bn, passedNoEchoParametersOf as Bo, reDisableInstanceApiTermination as Br, rebuildClientForBucketRegion as Bs, getStackRecords as Bt, recordRetainedForReadoption as C, refuseMalformedOutputsForDestroy as Ca, validateContainerRepoName as Cc, carriesDynamicReference as Ci, defineOwnKey as Cl, collectDeclaredOutputNames as Cn, templateResourceTypes as Co, applyCustomResourceResponseExpiration as Cr, carriesSecretMask as Cs, revertNestedChildFromJournal as Ct, withResourceDeadline as D, refuseMalformedResourceEntriesForDestroy as Da, describeDockerCapturedOutput as Dc, AWS_NO_VALUE as Di, ownValue as Dl, DEFAULT_RESOURCE_TIMEOUT_MS as Dn, lambdaFunctionNameForMask as Do, unchangedBehindSecretReference as Dr, recordNoEchoAttributeValues as Ds, getCurrentNestedStackContext as Dt, serviceTokenBlockingReason as E, refuseMalformedResourceEntriesForDeploy as Ea, resolveDockerContextDirectory as Ec, keepsSecretReferenceToken as Ei, nullPrototypeRecord as El, bindingSkippedOutputs as En, canonicalLambdaFunctionName as Eo, slowCcOperationTimeoutMs as Er, recordMaskOnlyValuesIn as Es, collectNestedChildUnaddressed as Et, PROTECTION_PROPERTY_BY_TYPE as F, refuseMalformedResourcesForDeploy as Fa, isMalformedEnvKey as Fc, declaresNoEcho as Fi, clearBucketRegionCache as Fl, secretNamedRecordNeedles as Fn, maskWholeValue as Fo, markWaitAbandoned as Fr, WHOLE_DYNAMIC_REFERENCE_PATTERN as Fs, sameJournaledOrphans as Ft, resolveDynamoDbDeleteBudgetMs as G, unpreviewableOrphanRecords as Ga, stripForDisplay as Gc, hasReadableOutputs as Gi, isFinalSnapshotError as Gn, carryLogOnlyValues as Go, poisonRenderedSpellingsCollidingIn as Gr, isAccessDenied$1 as Gs, isJournaledOrphan as Gt, compensateRemovedDeletionProtection as H, repairMalformedResourceEntriesForReadOnly as Ha, warnFinchArgvExposure as Hc, deployRefusesOrphanRowsReason as Hi, ccRoutedFinalSnapshotError as Hn, readsNoEchoSource as Ho, DiffCalculator as Hr, CrossPrefixScanCache as Hs, removeProtectionTypeList as Ht, isProtectionValueActive as I, refuseMalformedResourcesForDestroy as Ia, partitionSensitiveEnv as Ic, JSON_LISTING_HOLE_VALUE as Ii, resolveBucketRegion as Il, stateSecretNameNeedles as In, maskedLeafCoordinatesOf as Io, disableInstanceApiTermination as Ir, isSingleDynamicReferenceToken as Is, replayFailedOperations as It, deleteTableWithIndexBusyRetry as J, withheldAccountClause as Ja, Synthesizer as Jc, isReadableResourceEntry as Ji, maskingRetryLogger as Jn, literalSplitDelimitersOf as Jo, applyRoleArnIfSet as Jr, acceptedCreateOnlyDropsOf as Js, planRollback as Jt, DELETE_INDEX_WAIT_PROCEED_NOTE as K, unreadableOrphanRecords as Ka, AssetManifestLoader as Kc, hasReadableResources as Ki, refusesFinalSnapshot as Kn, createUnionSecretMasker as Ko, producerLookupOver as Kr, isNotImplemented as Ks, isReplacementOrphan as Kt, perType as L, refuseMalformedResourcesForExport as La, redactDockerArgvValues as Lc, STATE_REGION_DIVERGED as Li, storedSecretNameNeedles as Ln, noEchoCoordinatesOf as Lo, ec2InstanceProtectionSite as Lr, LockManager as Ls, replayRollback as Lt, noEchoParameterNamesOf as M, refuseMalformedResourcePropertiesForDrift as Ma, formatDockerLoginError as Mc, withSharedDrainBudget as Mi, resolveAssemblyPath as Ml, orphanRecordsPrintingBag as Mn, isMarkedCoordinate as Mo, deleteSkipReason as Mr, STATE_SOURCED_CROSS_GENERATION_RULES as Ms, journaledOrphanLines as Mt, recordedProtectionEvidence as N, refuseMalformedResourcePropertiesForExport as Na, getDockerCmd as Nc, parameterInputsFor as Ni, injectAwsRegion as Nl, secretNamePrintingBag as Nn, maskAtCoordinates as No, withIndeterminateGuard as Nr, STATE_SOURCED_READBACK_RULES as Ns, loadJournaledOrphans as Nt, diffSecurity as O, refuseMalformedResourceEntriesForImport as Oa, describeDockerExecFailure as Oc, cfnRefValueFromPhysicalId as Oi, absoluteAssemblyPathEscape as Ol, DEFAULT_RESOURCE_WARN_AFTER_MS as On, sameLambdaFunctionAddress as Oo, RollbackInlinePolicyWriters as Or, recordNoEchoParameterFreshValue as Os, withNestedStackContext as Ot, recordedProtectionNote as P, refuseMalformedResourcePropertiesForOrphan as Pa, isDockerClientEnvKey as Pc, passedParameterClassesOf as Pi, injectedAwsRegionValue as Pl, secretNamePrintingBags as Pn, maskReadbackAtCoordinates as Po, isWaitAbandonedError as Pr, TEMPLATE_SOURCED_RULES as Ps, makeForeignHolderScan as Pt, hasCdkAutoDeleteTag as Q, withoutSilentDropProperties as Qa, loadCdkJson as Qc, malformedLocalOutputsWarning as Qi, earliestDefined as Qn, recordLogOnlyValue as Qo, isIamRoleArn as Qr, hasReasonlessBaselineRefusal as Qs, resolveReplacementOldType as Qt, readProtection as R, refuseMalformedState as Ra, redactedCause as Rc, STATE_RESOURCES_MALFORMED as Ri, extractDeploymentEventError as Rn, noEchoLeavesOf as Ro, isTerminationProtectionPropagationError as Rr, isLockInfoExpired as Rs, awaitInFlightSibling as Rt, keptForReadoption as S, refuseMalformedOutputs as Sa, validateAssetBucketName as Sc, isImpossibleEmptyStoredAttribute as Si, processStackMessages as Sl, noEchoParameterValueSeed as Sn, prefetchCreateOnlyPropertyPaths as So, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as Sr, splitGetAttStringForm as Ss, recordDisplacedSkips as St, findServiceTokenRefusals as T, refuseMalformedResourceEntries as Ta, buildDockerImage as Tc, isNamelessDynamicReferenceError as Ti, hasPlainPrototype$1 as Tl, isExportAliasCollision as Tn, withRetry as To, CloudControlProvider as Tr, recordMaskOnlyValue as Ts, withNestedRevertRun as Tt, deleteBudgetKey as U, repairMalformedResourcePropertiesForReadOnly as Ua, escapeRegExp$3 as Uc, displayLogicalId as Ui, createPreDeleteFinalSnapshot as Un, valueAtCoordinate as Uo, INTRINSIC_KEYS as Ur, applyCrossPrefixScan as Us, recordAfterRollbackUpdate as Ut, beginDeleteWait as V, repairMalformedOutputsForReadOnly as Va, runDockerStreaming as Vc, accountArgs as Vi, buildFinalSnapshotIdentifier as Vn, readbackPathFor as Vo, reEnableInstanceApiTermination as Vr, CrossPrefixReadError as Vs, withStackRecords as Vt, resolveDynamoDbDeleteBudgetClock as W, repairMalformedResourcesForReadOnly as Wa, stripControlChars as Wc, hasReadableOrphans as Wi, effectiveDeletionPolicy as Wn, liveMatchesUnresolvedTokenFrame as Wo, IntrinsicFunctionResolver as Wr, crossPrefixDeniedWarning as Ws, demoteSupersededOrphans as Wt, ECR_AUTO_DELETE_IMAGES_TAG as X, findSilentDropProperties as Xa, getDefaultStateBucketName as Xc, malformedExportNamesWarning as Xi, findDestructiveChanges as Xn, printingCorpusOf as Xo, assertSendableRoleArn as Xr, exportNamesCarriedFrom as Xs, recordUnderIdIsNotOwn as Xt, waitForIndexesSettled as Y, findActionableSilentDrops as Ya, synthesisStatusMessage as Yc, malformedDriftResourcePropertiesWarning as Yi, constructPathOf as Yn, logOnlyValueCount as Yo, assertFlagRoleArn as Yr, describeRegionValueKind as Ys, recheckFailedPlan as Yt, S3_AUTO_DELETE_OBJECTS_TAG as Z, unwrittenCreateOnlyReplacement as Za, getLegacyStateBucketName as Zc, malformedExportSourceWarning as Zi, formatDestructiveChange as Zn, recordLogOnlyParameterValue as Zo, explicitRoleArnOrThrow as Zr, hasReadableExportSet as Zs, replacementNeverSwapped as Zt, makeCanonicalizePropertiesFn as _, refuseMalformedOrphanRecords as _a, ensureAssetStorage as _c, regionLessSecretName as _i, PARTITION_TABLE as _l, secretSafeKeyDisplay as _n, readConfigString as _o, TemplateNoEchoReresolver as _r, recordNestedStackParameterExpressions as _s, displacedOpClause as _t, findNestedTemplateTreeDefect as a, malformedOrphansWarning as aa, shouldRetainResource as ac, keepHeldTokenProvenance as ai, resolveUseCdkBootstrapAssets as al, isRedactedRecordedValue as an, isStatefulRecreateTargetSync as ao, planTagDiff as ar, recordReferenceProvenanceEntry as as, cyan as at, lookupEachName as b, refuseMalformedOrphansForDestroy as ba, parseBootstrapMarker as bc, parameterTypeMayLoseSecretIdentity as bi, AssemblyReader as bl, exportNameSecretExposure as bn, requireConfigObject as bo, getCurrentResourceSecrets as br, recordAttributeIdCopy as bs, getNestedRevertRun as bt, renderNestedTemplateTreeDefect as c, malformedRenderedContainersWarning as ca, stringifyValue as cc, recordedReferenceRegions as ci, ssmResolvedValueType as cl, updatePartialMessage as cn, coerceWarmThroughput as co, tagMapAsList as cr, scrubResourceRecord as cs, red as ct, conditionInputsFrom as d, malformedResourcesWarning as da, createAssetRedirectResolver as dc, s3BucketDualStackDomainName as di, MIGRATE_TMP_PREFIX as dl, DeploymentEventsStore as dn, toFiniteNumber as do, stringifyIfAssigned as dr, DYNAMIC_REFERENCE_TOKEN_SCAN as ds, namesAnyDeclaredParameter as dt, malformedLocalResourcesWarning as ea, importableOutputKeys as ec, AWS_CREDENTIAL_ENV_KEYS as ei, resolveAutoAssetStorage as el, orphanDeleteNeedsIdentity as en, hasNoCloudControlHandlers as eo, reserveStackCreateToken as er, createSecretMasker as es, getPriorAttempts as et, parentSuppliedValues as f, malformedScrubResourceEntriesRefusalMessage as fa, loadPublishableAssetManifest as fc, s3BucketRegionalDomainName as fi, findLargeInlineResources as fl, WITHHELD_NAME_DISPLAY as fn, coerceCfnBoolean as fo, CC_BROKEN_REASON as fr, dynamicReferenceTokens as fs, reachableDivergentParameters as ft, mergeNoChangeOutputs as g, refuseMalformedNestedChildOutputs as ga, assertAssetBucketRegion as gc, producerRegionsFromState as gi, expectedOwnerParam as gl, secretBearingStateKeyWarning as gn, configStringRefusal as go, wouldReturnToSdkProvider as gr, inheritNestedStackParameterAssociations as gs, NESTED_PENDING_PARENT_REASON as gt, keptWholeReasonText as h, refuseDivergentRecordRegionForDestroy as ha, BOOTSTRAP_MARKER_PREFIX as hc, classifyReplaySecretRegion as hi, decodeListingKey as hl, secretBearing as hn, configIntegerRefusal as ho, isCustomResource as hr, identityKeyFor as hs, planOrphanAdoption as ht, childTemplateLoader as i, malformedOrphansRefusalMessage as ia, orphansCarriedFrom as ic, isSettledInstanceState as ii, resolveStateBucketWithDefaultAndSource as il, REDACTED_DELETE_ADDRESS_SKIP_REASON as in, isStatefulRecreateTargetForReplace as io, DBPROXY_TAG_OPTIONS as ir, markSameGenerationBag as is, bold as it, noEchoExactEchoLeavesOf as j, refuseMalformedResourcePropertiesForDestroy as ja, finchSecretArgvRefusal as jc, parseWebACLArn as ji, renderAssemblyPathEscape as jl, maskEventTextWithBoundBags as jn, canonicalCoordinates as jo, deleteLeftInPlace as jr, STATE_SOURCED_BASELINE_RULES as js, isHandledOrphan as jt, noEchoAttributeNamesOf as k, refuseMalformedResourceEntriesForImportSave as ka, describeDockerFailure as kc, isStalePlaceholderArnAttribute as ki, describeFileReadFailure as kl, completedReplayEntries as kn, DagBuilder as ko, UNSPECIFIED_SKIP_REASON as kr, recordProvenPublicExpression as ks, deleteJournaledOrphans as kt, templateIdentity as l, malformedResourceEntriesWarning as la, WorkGraph as lc, s3BucketArn as li, CFN_TEMPLATE_BODY_LIMIT as ll, updatePartialReason as ln, isWarmThroughputDecrease as lo, tagPlanWarning as lr, withPhysicalNameCopies as ls, yellow as lt, isSecretBearingReferenceString as m, previewableOrphanRecords as ma, AssetModeResolver as mc, classifyRecordedSecretRegion as mi, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as ml, exportAliasCollisionScrubWarning as mn, configBooleanRefusal as mo, ccBrokenReason as mr, pathCrossesDottedKey as ms, makeSiblingClaimReader as mt, IMPLICIT_DELETE_DEPENDENCIES as n, malformedOrphanRecordsWarning as na, isReadableBag as nc, callerEnvCredentials as ni, resolveSkipPrefix as nl, getCurrentProducerRegions as nn, shownType as no, acquireIdempotencyToken as nr, maskSecretsInError as ns, formatResourceLine as nt, isAbsoluteAssetPath as o, malformedOutputsRefusalMessage as oa, AssetPublisher as oc, outputReferenceProvenanceOf as oi, stateBucketExistenceConfirmed as ol, redactedDeleteAddressFields as on, renderStatefulReason as oo, readTagList as or, snapshotPassProvenance as os, gray as ot, readRecordedConditionVerdicts as p, malformedStateRefusalMessage as pa, rewriteTemplateAssetReferences as pc, s3BucketWebsiteUrl as pi, uploadCfnTemplate as pl, displayTextOrWithheld as pn, coerceCfnInteger as po, ProviderRegistry as pr, isUncertifiedBaselineMaskPosition as ps, resourcesNamingDeclaredParameter as pt, INDEX_SETTLE_POLL_INTERVAL_MS as q, unreadableResourceEntries as qa, getDockerImageBySourceHash as qc, isReadableOrphanRecord as qi, unsupportedFinalSnapshotError as qn, hasMaskableValues as qo, refuseUnreadableCdkCrossAccountRefs as qr, splitImportedOps as qs, planFailedOps as qt, computeImplicitDeleteEdges as r, malformedOrphanRowsKeptWarning as ra, orphansAfterRollback as rc, envCredentialsAreAssumedRole as ri, resolveStateBucketWithDefault as rl, inheritProducerRegions as rn, MULTI_REGION_RECREATE_BLOCKED_TYPES as ro, DBPROXY_TAGS_WHAT as rr, maskSecretsInText as rs, createReadOnlyAttributeHealerFactory as rt, listNestedTemplateRows as s, malformedOutputsWarning as sa, isSensitiveAttributeName as sc, recordedOutputReferenceRegions as si, warnDeprecatedNoPrefixCliFlag as sl, redactedDeleteAddressSkip as sn, WARM_THROUGHPUT_MEMBERS as so, refuseMalformedDesiredTags as sr, redactSecretsForState as ss, green as st, DeployEngine as t, malformedOrphanRecordsRefusalMessage as ta, importableOutputs as tc, applyCallerIdentityCredentials as ti, resolveCaptureObservedState as tl, findNestedStackTypeChanges as tn, findReplacedReadersOfRecreateTargets as to, withCreateTokenLedger as tr, errorCauseChain as ts, markRefusedBeforeApplying as tt, conditionFingerprint as u, malformedResourcePropertiesWarning as ua, buildAssetRedirectMap as uc, s3BucketDomainName as ui, CFN_TEMPLATE_URL_LIMIT as ul, DeploymentEventsReader as un, toCfnInteger as uo, definedAttributes as ur, withoutPhysicalNameCopies as us, computeParameterTaint as ut, chunks as v, refuseMalformedOrphanRecordsForDestroy as va, getBootstrapMarkerKey as vc, coerceParameterTypedValue as vi, canonicalizeRegion as vl, carriedExportAliasExposure as vn, replayWarn as vo, readsNoEchoDeleteValues as vr, recoverMaskedOutput as vs, displacedPhysicalIdShown as vt, deferredServiceTokenWarning as w, refuseMalformedResourceAttributesForOrphan as wa, buildDenyExternalAccessPolicy as wc, carriesFetchableDynamicReference as wi, hasOwnKey as wl, collectPublishedOutputNames as wn, describeTypeWithThrottleRetry as wo, customResourceResponseExpirationWarning as wr, provenPublicValue as ws, revertedNestedRowIds as wt, withApiLimit as x, refuseMalformedOrphansForOrphan as xa, readBootstrapMarkerBody as xc, getAccountInfo as xi, StageLoadError as xl, isWholeDynamicReferenceValue as xn, requireConfigString as xo, withPrintingSecrets as xr, recordPhysicalNameCopy as xs, nestedChildStackName as xt, isAccessDeniedError as y, refuseMalformedOrphans as ya, isCrossRegionRedirect as yc, isUnboundTemplateParameter as yi, derivePartitionAndUrlSuffix as yl, exportNameNoEchoParameters as yn, requireConfigArray as yo, isCustomResourceType as yr, physicalNameCopiesOf as ys, dropSettledNestedJournals as yt, DynamoDBGlobalTableProvider as z, repairMalformedOrphanRecordsForReadOnly as za, redactedDockerCause as zc, UNREADABLE_ORPHANS_CONTAINER_ROW as zi, ATOMIC_FINAL_SNAPSHOT_TYPES as zn, noEchoOutputsComparison as zo, observeThenDisableInstanceApiTermination as zr, S3StateBackend as zs, destroyStackRecordsView as zt };
46384
- //# sourceMappingURL=deploy-engine-DEBgHf6Z.js.map
46941
+ export { S3_AUTO_DELETE_OBJECTS_TAG as $, unwrittenCreateOnlyReplacement as $a, getLegacyStateBucketName as $c, malformedExportSourceWarning as $i, formatDestructiveChange as $n, recordLogOnlyParameterValue as $o, explicitRoleArnOrThrow as $r, hasReadableExportSet as $s, replacementNeverSwapped as $t, diffSecurity as A, refuseMalformedResourceEntriesForImport as Aa, describeDockerExecFailure as Ac, cfnRefValueFromPhysicalId as Ai, absoluteAssemblyPathEscape as Al, DEFAULT_RESOURCE_WARN_AFTER_MS as An, sameLambdaFunctionAddress as Ao, RollbackInlinePolicyWriters as Ar, recordNoEchoParameterFreshValue as As, withNestedStackContext as At, readProtection as B, refuseMalformedState as Ba, redactedCause as Bc, STATE_RESOURCES_MALFORMED as Bi, extractDeploymentEventError as Bn, noEchoLeavesOf as Bo, isTerminationProtectionPropagationError as Br, isLockInfoExpired as Bs, awaitInFlightSibling as Bt, withApiLimit as C, refuseMalformedOrphansForOrphan as Ca, readBootstrapMarkerBody as Cc, getAccountInfo as Ci, StageLoadError as Cl, isWholeDynamicReferenceValue as Cn, requireConfigString as Co, withPrintingSecrets as Cr, recordPhysicalNameCopy as Cs, nestedChildStackName as Ct, findServiceTokenRefusals as D, refuseMalformedResourceEntries as Da, buildDockerImage as Dc, isNamelessDynamicReferenceError as Di, hasPlainPrototype$1 as Dl, isExportAliasCollision as Dn, withRetry as Do, CloudControlProvider as Dr, recordMaskOnlyValue as Ds, withNestedRevertRun as Dt, deferredServiceTokenWarning as E, refuseMalformedResourceAttributesForOrphan as Ea, buildDenyExternalAccessPolicy as Ec, carriesFetchableDynamicReference as Ei, hasOwnKey as El, collectPublishedOutputNames as En, describeTypeWithThrottleRetry as Eo, customResourceResponseExpirationWarning as Er, provenPublicValue as Es, revertedNestedRowIds as Et, recordedProtectionEvidence as F, refuseMalformedResourcePropertiesForExport as Fa, getDockerCmd as Fc, parameterInputsFor as Fi, injectAwsRegion as Fl, secretNamePrintingBag as Fn, maskAtCoordinates as Fo, withIndeterminateGuard as Fr, STATE_SOURCED_READBACK_RULES as Fs, loadJournaledOrphans as Ft, deleteBudgetKey as G, repairMalformedResourcePropertiesForReadOnly as Ga, escapeRegExp$3 as Gc, displayLogicalId as Gi, createPreDeleteFinalSnapshot as Gn, valueAtCoordinate as Go, INTRINSIC_KEYS as Gr, applyCrossPrefixScan as Gs, recordAfterRollbackUpdate as Gt, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as H, repairMalformedOrphansForReadOnly as Ha, runDockerForeground as Hc, UNREADABLE_RESOURCES_MAP_ROW as Hi, PRE_DELETE_SNAPSHOT_TYPES as Hn, passedNoEchoParametersOf as Ho, reDisableInstanceApiTermination as Hr, rebuildClientForBucketRegion as Hs, getStackRecords as Ht, recordedProtectionNote as I, refuseMalformedResourcePropertiesForOrphan as Ia, isDockerClientEnvKey as Ic, passedParameterClassesOf as Ii, injectedAwsRegionValue as Il, secretNamePrintingBags as In, maskReadbackAtCoordinates as Io, isWaitAbandonedError as Ir, TEMPLATE_SOURCED_RULES as Is, makeForeignHolderScan as It, DELETE_INDEX_WAIT_PROCEED_NOTE as J, unreadableOrphanRecords as Ja, AssetManifestLoader as Jc, hasReadableResources as Ji, refusesFinalSnapshot as Jn, createUnionSecretMasker as Jo, producerLookupOver as Jr, isNotImplemented as Js, isReplacementOrphan as Jt, resolveDynamoDbDeleteBudgetClock as K, repairMalformedResourcesForReadOnly as Ka, stripControlChars as Kc, hasReadableOrphans as Ki, effectiveDeletionPolicy as Kn, liveMatchesUnresolvedTokenFrame as Ko, IntrinsicFunctionResolver as Kr, crossPrefixDeniedWarning as Ks, demoteSupersededOrphans as Kt, PROTECTION_PROPERTY_BY_TYPE as L, refuseMalformedResourcesForDeploy as La, isMalformedEnvKey as Lc, declaresNoEcho as Li, clearBucketRegionCache as Ll, secretNamedRecordNeedles as Ln, maskWholeValue as Lo, markWaitAbandoned as Lr, WHOLE_DYNAMIC_REFERENCE_PATTERN as Ls, sameJournaledOrphans as Lt, noEchoComparisonForTemplate as M, refuseMalformedResourceEntriesForOrphan as Ma, dockerSpawnEnvWithSensitive as Mc, refStateLookupFromResource as Mi, displayAssemblyPath as Ml, journaledOrphanPrintingBag as Mn, TemplateParser as Mo, deleteIndeterminateGuards as Mr, wholeStringLeavesOf as Ms, dropFailedHint as Mt, noEchoExactEchoLeavesOf as N, refuseMalformedResourcePropertiesForDestroy as Na, finchSecretArgvRefusal as Nc, parseWebACLArn as Ni, renderAssemblyPathEscape as Nl, maskEventTextWithBoundBags as Nn, canonicalCoordinates as No, deleteLeftInPlace as Nr, STATE_SOURCED_BASELINE_RULES as Ns, isHandledOrphan as Nt, serviceTokenBlockingReason as O, refuseMalformedResourceEntriesForDeploy as Oa, resolveDockerContextDirectory as Oc, keepsSecretReferenceToken as Oi, nullPrototypeRecord as Ol, bindingSkippedOutputs as On, canonicalLambdaFunctionName as Oo, slowCcOperationTimeoutMs as Or, recordMaskOnlyValuesIn as Os, collectNestedChildUnaddressed as Ot, noEchoParameterNamesOf as P, refuseMalformedResourcePropertiesForDrift as Pa, formatDockerLoginError as Pc, withSharedDrainBudget as Pi, resolveAssemblyPath as Pl, orphanRecordsPrintingBag as Pn, isMarkedCoordinate as Po, deleteSkipReason as Pr, STATE_SOURCED_CROSS_GENERATION_RULES as Ps, journaledOrphanLines as Pt, ECR_AUTO_DELETE_IMAGES_TAG as Q, findSilentDropProperties as Qa, getDefaultStateBucketName as Qc, malformedExportNamesWarning as Qi, findDestructiveChanges as Qn, printingCorpusOf as Qo, assertSendableRoleArn as Qr, exportNamesCarriedFrom as Qs, recordUnderIdIsNotOwn as Qt, isProtectionValueActive as R, refuseMalformedResourcesForDestroy as Ra, partitionSensitiveEnv as Rc, JSON_LISTING_HOLE_VALUE as Ri, resolveBucketRegion as Rl, stateSecretNameNeedles as Rn, maskedLeafCoordinatesOf as Ro, disableInstanceApiTermination as Rr, isSingleDynamicReferenceToken as Rs, replayFailedOperations as Rt, lookupEachName as S, refuseMalformedOrphansForDestroy as Sa, parseBootstrapMarker as Sc, parameterTypeMayLoseSecretIdentity as Si, AssemblyReader as Sl, exportNameSecretExposure as Sn, requireConfigObject as So, getCurrentResourceSecrets as Sr, recordAttributeIdCopy as Ss, getNestedRevertRun as St, recordRetainedForReadoption as T, refuseMalformedOutputsForDestroy as Ta, validateContainerRepoName as Tc, carriesDynamicReference as Ti, defineOwnKey as Tl, collectDeclaredOutputNames as Tn, templateResourceTypes as To, applyCustomResourceResponseExpiration as Tr, carriesSecretMask as Ts, revertNestedChildFromJournal as Tt, beginDeleteWait as U, repairMalformedOutputsForReadOnly as Ua, runDockerStreaming as Uc, accountArgs as Ui, buildFinalSnapshotIdentifier as Un, readbackPathFor as Uo, reEnableInstanceApiTermination as Ur, CrossPrefixReadError as Us, withStackRecords as Ut, DynamoDBGlobalTableProvider as V, repairMalformedOrphanRecordsForReadOnly as Va, redactedDockerCause as Vc, UNREADABLE_ORPHANS_CONTAINER_ROW as Vi, ATOMIC_FINAL_SNAPSHOT_TYPES as Vn, noEchoOutputsComparison as Vo, observeThenDisableInstanceApiTermination as Vr, S3StateBackend as Vs, destroyStackRecordsView as Vt, compensateRemovedDeletionProtection as W, repairMalformedResourceEntriesForReadOnly as Wa, warnFinchArgvExposure as Wc, deployRefusesOrphanRowsReason as Wi, ccRoutedFinalSnapshotError as Wn, readsNoEchoSource as Wo, DiffCalculator as Wr, CrossPrefixScanCache as Ws, removeProtectionTypeList as Wt, deleteTableWithIndexBusyRetry as X, withheldAccountClause as Xa, Synthesizer as Xc, isReadableResourceEntry as Xi, maskingRetryLogger as Xn, literalSplitDelimitersOf as Xo, applyRoleArnIfSet as Xr, acceptedCreateOnlyDropsOf as Xs, planRollback as Xt, INDEX_SETTLE_POLL_INTERVAL_MS as Y, unreadableResourceEntries as Ya, getDockerImageBySourceHash as Yc, isReadableOrphanRecord as Yi, unsupportedFinalSnapshotError as Yn, hasMaskableValues as Yo, refuseUnreadableCdkCrossAccountRefs as Yr, splitImportedOps as Ys, planFailedOps as Yt, waitForIndexesSettled as Z, findActionableSilentDrops as Za, synthesisStatusMessage as Zc, malformedDriftResourcePropertiesWarning as Zi, constructPathOf as Zn, logOnlyValueCount as Zo, assertFlagRoleArn as Zr, describeRegionValueKind as Zs, recheckFailedPlan as Zt, keptWholeReasonText as _, refuseDivergentRecordRegionForDestroy as _a, BOOTSTRAP_MARKER_PREFIX as _c, classifyReplaySecretRegion as _i, decodeListingKey as _l, secretBearing as _n, configIntegerRefusal as _o, isCustomResource as _r, identityKeyFor as _s, planOrphanAdoption as _t, inheritedProvenanceForChildDiff as a, malformedOrphanRowsKeptWarning as aa, orphansAfterRollback as ac, envCredentialsAreAssumedRole as ai, resolveStateBucketWithDefault as al, inheritProducerRegions as an, MULTI_REGION_RECREATE_BLOCKED_TYPES as ao, DBPROXY_TAGS_WHAT as ar, maskSecretsInText as as, createReadOnlyAttributeHealerFactory as at, chunks as b, refuseMalformedOrphanRecordsForDestroy as ba, getBootstrapMarkerKey as bc, coerceParameterTypedValue as bi, canonicalizeRegion as bl, carriedExportAliasExposure as bn, replayWarn as bo, readsNoEchoDeleteValues as br, recoverMaskedOutput as bs, displacedPhysicalIdShown as bt, isAbsoluteAssetPath as c, malformedOutputsRefusalMessage as ca, AssetPublisher as cc, outputReferenceProvenanceOf as ci, stateBucketExistenceConfirmed as cl, redactedDeleteAddressFields as cn, renderStatefulReason as co, readTagList as cr, snapshotPassProvenance as cs, gray as ct, templateIdentity as d, malformedResourceEntriesWarning as da, WorkGraph as dc, s3BucketArn as di, CFN_TEMPLATE_BODY_LIMIT as dl, updatePartialReason as dn, isWarmThroughputDecrease as do, tagPlanWarning as dr, withPhysicalNameCopies as ds, yellow as dt, malformedLocalOutputsWarning as ea, hasReasonlessBaselineRefusal as ec, isIamRoleArn as ei, loadCdkJson as el, resolveReplacementOldType as en, withoutSilentDropProperties as eo, earliestDefined as er, recordLogOnlyValue as es, hasCdkAutoDeleteTag as et, conditionFingerprint as f, malformedResourcePropertiesWarning as fa, buildAssetRedirectMap as fc, s3BucketDomainName as fi, CFN_TEMPLATE_URL_LIMIT as fl, DeploymentEventsReader as fn, toCfnInteger as fo, definedAttributes as fr, withoutPhysicalNameCopies as fs, computeParameterTaint as ft, isSecretBearingReferenceString as g, previewableOrphanRecords as ga, AssetModeResolver as gc, classifyRecordedSecretRegion as gi, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as gl, exportAliasCollisionScrubWarning as gn, configBooleanRefusal as go, ccBrokenReason as gr, pathCrossesDottedKey as gs, makeSiblingClaimReader as gt, readRecordedConditionVerdicts as h, malformedStateRefusalMessage as ha, rewriteTemplateAssetReferences as hc, s3BucketWebsiteUrl as hi, uploadCfnTemplate as hl, displayTextOrWithheld as hn, coerceCfnInteger as ho, ProviderRegistry as hr, isUncertifiedBaselineMaskPosition as hs, resourcesNamingDeclaredParameter as ht, crossStackOutputProvenanceSource as i, malformedOrphanRecordsWarning as ia, isReadableBag as ic, callerEnvCredentials as ii, resolveSkipPrefix as il, getCurrentProducerRegions as in, shownType as io, acquireIdempotencyToken as ir, maskSecretsInError as is, formatResourceLine as it, noEchoAttributeNamesOf as j, refuseMalformedResourceEntriesForImportSave as ja, describeDockerFailure as jc, isStalePlaceholderArnAttribute as ji, describeFileReadFailure as jl, completedReplayEntries as jn, DagBuilder as jo, UNSPECIFIED_SKIP_REASON as jr, recordProvenPublicExpression as js, deleteJournaledOrphans as jt, withResourceDeadline as k, refuseMalformedResourceEntriesForDestroy as ka, describeDockerCapturedOutput as kc, AWS_NO_VALUE as ki, ownValue as kl, DEFAULT_RESOURCE_TIMEOUT_MS as kn, lambdaFunctionNameForMask as ko, unchangedBehindSecretReference as kr, recordNoEchoAttributeValues as ks, getCurrentNestedStackContext as kt, listNestedTemplateRows as l, malformedOutputsWarning as la, isSensitiveAttributeName as lc, recordedOutputReferenceRegions as li, warnDeprecatedNoPrefixCliFlag as ll, redactedDeleteAddressSkip as ln, WARM_THROUGHPUT_MEMBERS as lo, refuseMalformedDesiredTags as lr, redactSecretsForState as ls, green as lt, parentSuppliedValues as m, malformedScrubResourceEntriesRefusalMessage as ma, loadPublishableAssetManifest as mc, s3BucketRegionalDomainName as mi, findLargeInlineResources as ml, WITHHELD_NAME_DISPLAY as mn, coerceCfnBoolean as mo, CC_BROKEN_REASON as mr, dynamicReferenceTokens as ms, reachableDivergentParameters as mt, IMPLICIT_DELETE_DEPENDENCIES as n, malformedLocalResourcesWarning as na, importableOutputKeys as nc, AWS_CREDENTIAL_ENV_KEYS as ni, resolveAutoAssetStorage as nl, orphanDeleteNeedsIdentity as nn, hasNoCloudControlHandlers as no, reserveStackCreateToken as nr, createSecretMasker as ns, getPriorAttempts as nt, childTemplateLoader as o, malformedOrphansRefusalMessage as oa, orphansCarriedFrom as oc, isSettledInstanceState as oi, resolveStateBucketWithDefaultAndSource as ol, REDACTED_DELETE_ADDRESS_SKIP_REASON as on, isStatefulRecreateTargetForReplace as oo, DBPROXY_TAG_OPTIONS as or, markSameGenerationBag as os, bold as ot, conditionInputsFrom as p, malformedResourcesWarning as pa, createAssetRedirectResolver as pc, s3BucketDualStackDomainName as pi, MIGRATE_TMP_PREFIX as pl, DeploymentEventsStore as pn, toFiniteNumber as po, stringifyIfAssigned as pr, DYNAMIC_REFERENCE_TOKEN_SCAN as ps, namesAnyDeclaredParameter as pt, resolveDynamoDbDeleteBudgetMs as q, unpreviewableOrphanRecords as qa, stripForDisplay as qc, hasReadableOutputs as qi, isFinalSnapshotError as qn, carryLogOnlyValues as qo, poisonRenderedSpellingsCollidingIn as qr, isAccessDenied$1 as qs, isJournaledOrphan as qt, computeImplicitDeleteEdges as r, malformedOrphanRecordsRefusalMessage as ra, importableOutputs as rc, applyCallerIdentityCredentials as ri, resolveCaptureObservedState as rl, findNestedStackTypeChanges as rn, findReplacedReadersOfRecreateTargets as ro, withCreateTokenLedger as rr, errorCauseChain as rs, markRefusedBeforeApplying as rt, findNestedTemplateTreeDefect as s, malformedOrphansWarning as sa, shouldRetainResource as sc, keepHeldTokenProvenance as si, resolveUseCdkBootstrapAssets as sl, isRedactedRecordedValue as sn, isStatefulRecreateTargetSync as so, planTagDiff as sr, recordReferenceProvenanceEntry as ss, cyan as st, DeployEngine as t, malformedLocalResourceEntriesWarning as ta, hasUnverifiableParameterRefusal as tc, sendableAssumeRoleCommand as ti, resolveApp as tl, seedsDeleteFirstGuard as tn, NO_CC_HANDLERS_REASON as to, ledgerForStack as tr, shareLogOnlyValues as ts, isTruthyCfnBoolean as tt, renderNestedTemplateTreeDefect as u, malformedRenderedContainersWarning as ua, stringifyValue as uc, recordedReferenceRegions as ui, ssmResolvedValueType as ul, updatePartialMessage as un, coerceWarmThroughput as uo, tagMapAsList as ur, scrubResourceRecord as us, red as ut, mergeNoChangeOutputs as v, refuseMalformedNestedChildOutputs as va, assertAssetBucketRegion as vc, producerRegionsFromState as vi, expectedOwnerParam as vl, secretBearingStateKeyWarning as vn, configStringRefusal as vo, wouldReturnToSdkProvider as vr, inheritNestedStackParameterAssociations as vs, NESTED_PENDING_PARENT_REASON as vt, keptForReadoption as w, refuseMalformedOutputs as wa, validateAssetBucketName as wc, isImpossibleEmptyStoredAttribute as wi, processStackMessages as wl, noEchoParameterValueSeed as wn, prefetchCreateOnlyPropertyPaths as wo, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as wr, splitGetAttStringForm as ws, recordDisplacedSkips as wt, isAccessDeniedError as x, refuseMalformedOrphans as xa, isCrossRegionRedirect as xc, isUnboundTemplateParameter as xi, derivePartitionAndUrlSuffix as xl, exportNameNoEchoParameters as xn, requireConfigArray as xo, isCustomResourceType as xr, physicalNameCopiesOf as xs, dropSettledNestedJournals as xt, makeCanonicalizePropertiesFn as y, refuseMalformedOrphanRecords as ya, ensureAssetStorage as yc, regionLessSecretName as yi, PARTITION_TABLE as yl, secretSafeKeyDisplay as yn, readConfigString as yo, TemplateNoEchoReresolver as yr, recordNestedStackParameterExpressions as ys, displacedOpClause as yt, perType as z, refuseMalformedResourcesForExport as za, redactDockerArgvValues as zc, STATE_REGION_DIVERGED as zi, storedSecretNameNeedles as zn, noEchoCoordinatesOf as zo, ec2InstanceProtectionSite as zr, LockManager as zs, replayRollback as zt };
46942
+ //# sourceMappingURL=deploy-engine-DWIbDQdg.js.map