@go-to-k/cdkd 0.280.2 → 0.280.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { $ as DiffCalculator, $t as resolveBucketRegion, A as red, At as getDockerImageBySourceHash, B as isTerminationProtectionPropagationError, Bt as resolveStateBucketWithDefaultAndSource, C as isStatefulRecreateTargetSync, Ct as validateContainerRepoName, D as cyan, Dt as runDockerForeground, E as bold, En as withErrorHandling, Et as getDockerCmd, F as ProviderRegistry, Ft as resolveApp, G as normalizeAwsTagsToCfn, Gt as CFN_TEMPLATE_URL_LIMIT, H as cfnRefValueFromPhysicalId, Ht as stateBucketExistenceConfirmed, I as findActionableSilentDrops, It as resolveAutoAssetStorage, J as readConfigString, Jt as uploadCfnTemplate, K as resolveExplicitPhysicalId, Kt as MIGRATE_TMP_PREFIX, L as CloudControlProvider, Lt as resolveCaptureObservedState, M as IAMRoleProvider, Mt as synthesisStatusMessage, N as collectInlinePolicyNamesManagedBySiblings, Nt as getDefaultStateBucketName, O as gray, Ot as runDockerStreaming, P as clearOnUpdateRemoval, Pt as getLegacyStateBucketName, Q as applyRoleArnIfSet, R as slowCcOperationTimeoutMs, Rt as resolveSkipPrefix, S as MULTI_REGION_RECREATE_BLOCKED_TYPES, St as validateAssetBucketName, T as formatResourceLine, Tn as normalizeAwsError, Tt as formatDockerLoginError, U as refStateLookupFromResource, Ut as warnDeprecatedNoPrefixCliFlag, V as IntrinsicFunctionResolver, Vt as resolveUseCdkBootstrapAssets, W as WAFv2WebACLProvider, Wt as CFN_TEMPLATE_BODY_LIMIT, X as requireConfigArray, Xt as AssemblyReader, Y as replayWarn, Yt as expectedOwnerParam, Z as requireConfigString, Zt as processStackMessages, _ as createPreDeleteFinalSnapshot, _n as ResourceTimeoutError, _t as AssetModeResolver, a as DeploymentEventsStore, an as CdkdError, at as TemplateParser, b as unsupportedFinalSnapshotError, bn as StackTerminationProtectionError, bt as getBootstrapMarkerKey, c as replayFailedOperations, cn as DeployCancelledError, ct as rebuildClientForBucketRegion, d as IMPLICIT_DELETE_DEPENDENCIES, dn as LocalStartServiceError, dt as stringifyValue, en as AwsClients, et as describeTypeWithThrottleRetry, f as computeImplicitDeleteEdges, ft as WorkGraph, g as ccRoutedFinalSnapshotError, gn as ProvisioningError, gt as rewriteTemplateAssetReferences, h as buildFinalSnapshotIdentifier, hn as PartialFailureError, ht as loadPublishableAssetManifest, i as DeploymentEventsReader, it as DagBuilder, j as yellow, jt as Synthesizer, k as green, kt as AssetManifestLoader, l as replayRollback, ln as LocalInvokeBuildError$1, lt as shouldRetainResource, m as PRE_DELETE_SNAPSHOT_TYPES, mn as NestedStackChildDirectDestroyError, mt as createAssetRedirectResolver, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as resetAwsClients, nt as isRetryableTransientError, o as planFailedOps, ot as LockManager, p as ATOMIC_FINAL_SNAPSHOT_TYPES, pn as MissingCdkCliError, pt as buildAssetRedirectMap, q as assertRegionMatch, qt as findLargeInlineResources, r as DeployEngine, rn as setAwsClients, rt as isThrottlingError, s as planRollback, st as S3StateBackend, t as DEFAULT_RESOURCE_TIMEOUT_MS, tn as getAwsClients, tt as withRetry, u as withResourceDeadline, un as LocalMigrateError, ut as AssetPublisher, v as isFinalSnapshotError, vn as ResourceUpdateNotSupportedError, vt as BOOTSTRAP_MARKER_PREFIX, w as renderStatefulReason, wt as buildDockerImage, x as extractDeploymentEventError, xt as parseBootstrapMarker, y as refusesFinalSnapshot, yn as StackHasActiveImportsError, yt as ensureAssetStorage, z as disableInstanceApiTermination, zt as resolveStateBucketWithDefault } from "./deploy-engine-DK0y5OP8.js";
2
+ import { $ as DiffCalculator, $t as resolveBucketRegion, A as red, At as getDockerImageBySourceHash, B as isTerminationProtectionPropagationError, Bt as resolveStateBucketWithDefaultAndSource, C as isStatefulRecreateTargetSync, Ct as validateContainerRepoName, D as cyan, Dt as runDockerForeground, E as bold, En as withErrorHandling, Et as getDockerCmd, F as ProviderRegistry, Ft as resolveApp, G as normalizeAwsTagsToCfn, Gt as CFN_TEMPLATE_URL_LIMIT, H as cfnRefValueFromPhysicalId, Ht as stateBucketExistenceConfirmed, I as findActionableSilentDrops, It as resolveAutoAssetStorage, J as readConfigString, Jt as uploadCfnTemplate, K as resolveExplicitPhysicalId, Kt as MIGRATE_TMP_PREFIX, L as CloudControlProvider, Lt as resolveCaptureObservedState, M as IAMRoleProvider, Mt as synthesisStatusMessage, N as collectInlinePolicyNamesManagedBySiblings, Nt as getDefaultStateBucketName, O as gray, Ot as runDockerStreaming, P as clearOnUpdateRemoval, Pt as getLegacyStateBucketName, Q as applyRoleArnIfSet, R as slowCcOperationTimeoutMs, Rt as resolveSkipPrefix, S as MULTI_REGION_RECREATE_BLOCKED_TYPES, St as validateAssetBucketName, T as formatResourceLine, Tn as normalizeAwsError, Tt as formatDockerLoginError, U as refStateLookupFromResource, Ut as warnDeprecatedNoPrefixCliFlag, V as IntrinsicFunctionResolver, Vt as resolveUseCdkBootstrapAssets, W as WAFv2WebACLProvider, Wt as CFN_TEMPLATE_BODY_LIMIT, X as requireConfigArray, Xt as AssemblyReader, Y as replayWarn, Yt as expectedOwnerParam, Z as requireConfigString, Zt as processStackMessages, _ as createPreDeleteFinalSnapshot, _n as ResourceTimeoutError, _t as AssetModeResolver, a as DeploymentEventsStore, an as CdkdError, at as TemplateParser, b as unsupportedFinalSnapshotError, bn as StackTerminationProtectionError, bt as getBootstrapMarkerKey, c as replayFailedOperations, cn as DeployCancelledError, ct as rebuildClientForBucketRegion, d as IMPLICIT_DELETE_DEPENDENCIES, dn as LocalStartServiceError, dt as stringifyValue, en as AwsClients, et as describeTypeWithThrottleRetry, f as computeImplicitDeleteEdges, ft as WorkGraph, g as ccRoutedFinalSnapshotError, gn as ProvisioningError, gt as rewriteTemplateAssetReferences, h as buildFinalSnapshotIdentifier, hn as PartialFailureError, ht as loadPublishableAssetManifest, i as DeploymentEventsReader, it as DagBuilder, j as yellow, jt as Synthesizer, k as green, kt as AssetManifestLoader, l as replayRollback, ln as LocalInvokeBuildError$1, lt as shouldRetainResource, m as PRE_DELETE_SNAPSHOT_TYPES, mn as NestedStackChildDirectDestroyError, mt as createAssetRedirectResolver, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as resetAwsClients, nt as isRetryableTransientError, o as planFailedOps, ot as LockManager, p as ATOMIC_FINAL_SNAPSHOT_TYPES, pn as MissingCdkCliError, pt as buildAssetRedirectMap, q as assertRegionMatch, qt as findLargeInlineResources, r as DeployEngine, rn as setAwsClients, rt as isThrottlingError, s as planRollback, st as S3StateBackend, t as DEFAULT_RESOURCE_TIMEOUT_MS, tn as getAwsClients, tt as withRetry, u as withResourceDeadline, un as LocalMigrateError, ut as AssetPublisher, v as isFinalSnapshotError, vn as ResourceUpdateNotSupportedError, vt as BOOTSTRAP_MARKER_PREFIX, w as renderStatefulReason, wt as buildDockerImage, x as extractDeploymentEventError, xt as parseBootstrapMarker, y as refusesFinalSnapshot, yn as StackHasActiveImportsError, yt as ensureAssetStorage, z as disableInstanceApiTermination, zt as resolveStateBucketWithDefault } from "./deploy-engine-Ca5ywZ1L.js";
3
3
  import { a as getLiveRenderer, c as PATTERN_B_RESOURCE_TYPES, d as generateResourceNameWithFallback, f as withSkipPrefix, i as runStackBuffered, n as getLogger, o as PATTERN_B_NAME_OPTIONS, p as withStackName, s as PATTERN_B_NAME_PROPERTIES, u as generateResourceName } from "./logger-BYMEE-BS.js";
4
- import { t as ASGProvider } from "./asg-provider-CwKNCS78.js";
4
+ import { t as ASGProvider } from "./asg-provider-C-Mym0XH.js";
5
5
  import { AsyncLocalStorage } from "node:async_hooks";
6
6
  import { createHash, randomBytes, randomUUID } from "node:crypto";
7
7
  import { CopyObjectCommand, CreateBucketCommand, DeleteBucketAnalyticsConfigurationCommand, DeleteBucketCommand, DeleteBucketCorsCommand, DeleteBucketEncryptionCommand, DeleteBucketIntelligentTieringConfigurationCommand, DeleteBucketInventoryConfigurationCommand, DeleteBucketLifecycleCommand, DeleteBucketMetricsConfigurationCommand, DeleteBucketOwnershipControlsCommand, DeleteBucketPolicyCommand, DeleteBucketReplicationCommand, DeleteBucketTaggingCommand, DeleteBucketWebsiteCommand, DeleteObjectsCommand, GetBucketAccelerateConfigurationCommand, GetBucketCorsCommand, GetBucketEncryptionCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketLoggingCommand, GetBucketNotificationConfigurationCommand, GetBucketOwnershipControlsCommand, GetBucketPolicyCommand, GetBucketReplicationCommand, GetBucketTaggingCommand, GetBucketVersioningCommand, GetBucketWebsiteCommand, GetObjectCommand, GetObjectLockConfigurationCommand, GetPublicAccessBlockCommand, HeadBucketCommand, ListBucketAnalyticsConfigurationsCommand, ListBucketIntelligentTieringConfigurationsCommand, ListBucketInventoryConfigurationsCommand, ListBucketMetricsConfigurationsCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchBucket, PutBucketAccelerateConfigurationCommand, PutBucketAnalyticsConfigurationCommand, PutBucketCorsCommand, PutBucketEncryptionCommand, PutBucketIntelligentTieringConfigurationCommand, PutBucketInventoryConfigurationCommand, PutBucketLifecycleConfigurationCommand, PutBucketLoggingCommand, PutBucketMetricsConfigurationCommand, PutBucketNotificationConfigurationCommand, PutBucketOwnershipControlsCommand, PutBucketPolicyCommand, PutBucketReplicationCommand, PutBucketTaggingCommand, PutBucketVersioningCommand, PutBucketWebsiteCommand, PutObjectCommand, PutObjectLockConfigurationCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
@@ -5075,7 +5075,13 @@ var S3BucketProvider = class S3BucketProvider {
5075
5075
  * - CFn Transition.TransitionInDays -> SDK Transition.Days
5076
5076
  * - CFn Transition.TransitionDate -> SDK Transition.Date
5077
5077
  */
5078
- async applyLifecycleConfiguration(bucketName, lifecycleConfig) {
5078
+ async applyLifecycleConfiguration(bucketName, lifecycleConfig, onUnusable) {
5079
+ for (const rule of lifecycleConfig.Rules) {
5080
+ const rawTagFilters = rule["Filter"]?.["TagFilters"] ?? rule["TagFilters"];
5081
+ if (rawTagFilters != null) {
5082
+ if (requireConfigArray(rawTagFilters, "AWS::S3::Bucket LifecycleConfiguration.Rules[].TagFilters", { ...onUnusable ? { onUnusable } : {} }) === void 0) return;
5083
+ }
5084
+ }
5079
5085
  const gatherScope = (rule) => {
5080
5086
  const filter = rule["Filter"];
5081
5087
  return {
@@ -5088,7 +5094,7 @@ var S3BucketProvider = class S3BucketProvider {
5088
5094
  const isPlainPrefixOnly = (rule) => {
5089
5095
  if (rule["Filter"] !== void 0) return false;
5090
5096
  const s = gatherScope(rule);
5091
- return s.prefix !== void 0 && (s.tagFilters === void 0 || s.tagFilters.length === 0) && s.sizeGt === void 0 && s.sizeLt === void 0;
5097
+ return s.prefix !== void 0 && (s.tagFilters == null || s.tagFilters.length === 0) && s.sizeGt === void 0 && s.sizeLt === void 0;
5092
5098
  };
5093
5099
  const useFilterForm = !lifecycleConfig.Rules.every(isPlainPrefixOnly);
5094
5100
  const rules = lifecycleConfig.Rules.map((rule) => {
@@ -5141,7 +5147,7 @@ var S3BucketProvider = class S3BucketProvider {
5141
5147
  const abort = isPlainObject$1(rule["AbortIncompleteMultipartUpload"]) ? rule["AbortIncompleteMultipartUpload"] : void 0;
5142
5148
  if (abort) sdkRule.AbortIncompleteMultipartUpload = { DaysAfterInitiation: abort["DaysAfterInitiation"] };
5143
5149
  const { prefix, tagFilters, sizeGt, sizeLt } = gatherScope(rule);
5144
- const hasTags = tagFilters !== void 0 && tagFilters.length > 0;
5150
+ const hasTags = tagFilters != null && tagFilters.length > 0;
5145
5151
  if ((hasTags ? 1 : 0) + (prefix !== void 0 ? 1 : 0) + (sizeGt !== void 0 ? 1 : 0) + (sizeLt !== void 0 ? 1 : 0) > 1) sdkRule.Filter = { And: {
5146
5152
  Prefix: prefix,
5147
5153
  Tags: hasTags ? tagFilters : void 0,
@@ -5367,13 +5373,14 @@ var S3BucketProvider = class S3BucketProvider {
5367
5373
  * CFn property: MetricsConfigurations[] (array of configurations)
5368
5374
  * SDK: PutBucketMetricsConfiguration (one per configuration, keyed by Id)
5369
5375
  */
5370
- async applyMetricsConfigurations(bucketName, configs) {
5376
+ async applyMetricsConfigurations(bucketName, configs, onUnusable) {
5371
5377
  for (const config of configs) {
5372
5378
  const id = config["Id"];
5373
5379
  const metricsConfig = { Id: id };
5374
5380
  const prefix = config["Prefix"];
5375
5381
  const accessPointArn = config["AccessPointArn"];
5376
5382
  const tagFilters = config["TagFilters"];
5383
+ if (tagFilters != null && requireConfigArray(tagFilters, "AWS::S3::Bucket MetricsConfigurations[].TagFilters", { ...onUnusable ? { onUnusable } : {} }) === void 0) continue;
5377
5384
  const tagCount = tagFilters?.length ?? 0;
5378
5385
  if ((prefix ? 1 : 0) + tagCount + (accessPointArn ? 1 : 0) > 1) metricsConfig.Filter = { And: {
5379
5386
  Prefix: prefix,
@@ -5456,6 +5463,7 @@ var S3BucketProvider = class S3BucketProvider {
5456
5463
  };
5457
5464
  const prefix = config["Prefix"];
5458
5465
  const tagFilters = config["TagFilters"];
5466
+ if (tagFilters != null && requireConfigArray(tagFilters, "AWS::S3::Bucket AnalyticsConfigurations[].TagFilters", { ...onUnusable ? { onUnusable } : {} }) === void 0) continue;
5459
5467
  const tagCount = tagFilters?.length ?? 0;
5460
5468
  if ((prefix ? 1 : 0) + tagCount > 1) analyticsConfig.Filter = { And: {
5461
5469
  Prefix: prefix,
@@ -5494,7 +5502,7 @@ var S3BucketProvider = class S3BucketProvider {
5494
5502
  * CFn property: IntelligentTieringConfigurations[]
5495
5503
  * SDK: PutBucketIntelligentTieringConfiguration (one per configuration, keyed by Id)
5496
5504
  */
5497
- async applyIntelligentTieringConfigurations(bucketName, configs) {
5505
+ async applyIntelligentTieringConfigurations(bucketName, configs, onUnusable) {
5498
5506
  for (const config of configs) {
5499
5507
  const id = config["Id"];
5500
5508
  const tierings = config["Tierings"];
@@ -5508,6 +5516,7 @@ var S3BucketProvider = class S3BucketProvider {
5508
5516
  };
5509
5517
  const prefix = config["Prefix"];
5510
5518
  const tagFilters = config["TagFilters"];
5519
+ if (tagFilters != null && requireConfigArray(tagFilters, "AWS::S3::Bucket IntelligentTieringConfigurations[].TagFilters", { ...onUnusable ? { onUnusable } : {} }) === void 0) continue;
5511
5520
  const tagCount = tagFilters?.length ?? 0;
5512
5521
  if ((prefix ? 1 : 0) + tagCount > 1) itConfig.Filter = { And: {
5513
5522
  Prefix: prefix,
@@ -5852,7 +5861,7 @@ var S3BucketProvider = class S3BucketProvider {
5852
5861
  });
5853
5862
  await this.diffSubConfig(bucketName, previousProperties["LifecycleConfiguration"], properties["LifecycleConfiguration"], async (cfg) => {
5854
5863
  if (!cfg.Rules || !Array.isArray(cfg.Rules) || cfg.Rules.length === 0) return;
5855
- await this.applyLifecycleConfiguration(bucketName, cfg);
5864
+ await this.applyLifecycleConfiguration(bucketName, cfg, (m) => this.logger.warn(m));
5856
5865
  }, async () => {
5857
5866
  await this.s3Client.send(new DeleteBucketLifecycleCommand({ Bucket: bucketName }));
5858
5867
  this.logger.debug(`Deleted lifecycle configuration on bucket ${bucketName}`);
@@ -5882,7 +5891,7 @@ var S3BucketProvider = class S3BucketProvider {
5882
5891
  this.logger.debug(`Cleared object lock rule on bucket ${bucketName}`);
5883
5892
  });
5884
5893
  await this.diffSubConfig(bucketName, previousProperties["AccelerateConfiguration"], properties["AccelerateConfiguration"], async (cfg) => this.applyAccelerateConfiguration(bucketName, cfg), async () => this.applyAccelerateConfiguration(bucketName, { AccelerationStatus: "Suspended" }));
5885
- await this.diffArrayConfigById(bucketName, previousProperties["MetricsConfigurations"], properties["MetricsConfigurations"], async (_id, cfg) => this.applyMetricsConfigurations(bucketName, [cfg]), async (id) => {
5894
+ await this.diffArrayConfigById(bucketName, previousProperties["MetricsConfigurations"], properties["MetricsConfigurations"], async (_id, cfg) => this.applyMetricsConfigurations(bucketName, [cfg], (m) => this.logger.warn(m)), async (id) => {
5886
5895
  await this.s3Client.send(new DeleteBucketMetricsConfigurationCommand({
5887
5896
  Bucket: bucketName,
5888
5897
  Id: id
@@ -5896,7 +5905,7 @@ var S3BucketProvider = class S3BucketProvider {
5896
5905
  }));
5897
5906
  this.logger.debug(`Deleted analytics configuration ${id} on bucket ${bucketName}`);
5898
5907
  });
5899
- await this.diffArrayConfigById(bucketName, previousProperties["IntelligentTieringConfigurations"], properties["IntelligentTieringConfigurations"], async (_id, cfg) => this.applyIntelligentTieringConfigurations(bucketName, [cfg]), async (id) => {
5908
+ await this.diffArrayConfigById(bucketName, previousProperties["IntelligentTieringConfigurations"], properties["IntelligentTieringConfigurations"], async (_id, cfg) => this.applyIntelligentTieringConfigurations(bucketName, [cfg], (m) => this.logger.warn(m)), async (id) => {
5900
5909
  await this.s3Client.send(new DeleteBucketIntelligentTieringConfigurationCommand({
5901
5910
  Bucket: bucketName,
5902
5911
  Id: id
@@ -5930,7 +5939,7 @@ var S3BucketProvider = class S3BucketProvider {
5930
5939
  const corsConfig = properties["CorsConfiguration"];
5931
5940
  if (corsConfig?.CorsRules && Array.isArray(corsConfig.CorsRules) && corsConfig.CorsRules.length > 0) await this.applyCorsConfiguration(bucketName, corsConfig);
5932
5941
  const lifecycleConfig = properties["LifecycleConfiguration"];
5933
- if (lifecycleConfig?.Rules && Array.isArray(lifecycleConfig.Rules) && lifecycleConfig.Rules.length > 0) await this.applyLifecycleConfiguration(bucketName, lifecycleConfig);
5942
+ if (lifecycleConfig?.Rules && Array.isArray(lifecycleConfig.Rules) && lifecycleConfig.Rules.length > 0) await this.applyLifecycleConfiguration(bucketName, lifecycleConfig, replayOnUnusable);
5934
5943
  const loggingConfig = properties["LoggingConfiguration"];
5935
5944
  if (readConfigString(loggingConfig, "DestinationBucketName", "", "AWS::S3::Bucket LoggingConfiguration") !== "") await this.applyLoggingConfiguration(bucketName, loggingConfig);
5936
5945
  const websiteConfig = properties["WebsiteConfiguration"];
@@ -5938,11 +5947,11 @@ var S3BucketProvider = class S3BucketProvider {
5938
5947
  const accelerateConfig = properties["AccelerateConfiguration"];
5939
5948
  if (accelerateConfig) await this.applyAccelerateConfiguration(bucketName, accelerateConfig);
5940
5949
  const metricsConfigs = properties["MetricsConfigurations"];
5941
- if (metricsConfigs && Array.isArray(metricsConfigs) && metricsConfigs.length > 0) await this.applyMetricsConfigurations(bucketName, metricsConfigs);
5950
+ if (metricsConfigs && Array.isArray(metricsConfigs) && metricsConfigs.length > 0) await this.applyMetricsConfigurations(bucketName, metricsConfigs, replayOnUnusable);
5942
5951
  const analyticsConfigs = properties["AnalyticsConfigurations"];
5943
5952
  if (analyticsConfigs && Array.isArray(analyticsConfigs) && analyticsConfigs.length > 0) await this.applyAnalyticsConfigurations(bucketName, analyticsConfigs, replayOnUnusable);
5944
5953
  const itConfigs = properties["IntelligentTieringConfigurations"];
5945
- if (itConfigs && Array.isArray(itConfigs) && itConfigs.length > 0) await this.applyIntelligentTieringConfigurations(bucketName, itConfigs);
5954
+ if (itConfigs && Array.isArray(itConfigs) && itConfigs.length > 0) await this.applyIntelligentTieringConfigurations(bucketName, itConfigs, replayOnUnusable);
5946
5955
  const inventoryConfigs = properties["InventoryConfigurations"];
5947
5956
  if (inventoryConfigs && Array.isArray(inventoryConfigs) && inventoryConfigs.length > 0) await this.applyInventoryConfigurations(bucketName, inventoryConfigs, replayOnUnusable);
5948
5957
  const replConfig = properties["ReplicationConfiguration"];
@@ -68365,7 +68374,7 @@ function createMigrateCommand() {
68365
68374
  */
68366
68375
  function buildProgram() {
68367
68376
  const program = new Command();
68368
- program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.280.2");
68377
+ program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.280.3");
68369
68378
  program.hook("preAction", (_thisCommand, actionCommand) => {
68370
68379
  const { profile } = actionCommand.optsWithGlobals();
68371
68380
  if (profile !== void 0) process.env["AWS_PROFILE"] = profile;