@uipath/solution-sdk 1.203.0-preview.205 → 1.204.0-preview.206

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/THIRD-PARTY-NOTICES.md +2 -2
  2. package/dist/{embedded-file-reader-xxqe8vs8.js → embedded-file-reader-rf2g1kfj.js} +2 -2
  3. package/dist/generated/src/apis/DeploymentsApi.d.ts +27 -23
  4. package/dist/generated/src/models/DeploymentResourceInfo.d.ts +109 -0
  5. package/dist/generated/src/models/DeploymentResourceReplacementDto.d.ts +50 -0
  6. package/dist/generated/src/models/DeploymentUpgradeState.d.ts +27 -0
  7. package/dist/generated/src/models/PageInfoDtoOfDeploymentResourceInfo.d.ts +39 -0
  8. package/dist/generated/src/models/ResetConfigurationSource.d.ts +25 -0
  9. package/dist/generated/src/models/index.d.ts +5 -2
  10. package/dist/{index-y8tgscfm.js → index-6gp5j7j5.js} +22 -6
  11. package/dist/{index-4zqv4bn2.js → index-bdpp6dsk.js} +565 -92
  12. package/dist/index.js +345 -209
  13. package/dist/resources/index.js +418 -82
  14. package/dist/scripts/generate-sdk.js +14 -7
  15. package/dist/solution-auth.js +1 -1
  16. package/dist/src/index.d.ts +0 -1
  17. package/dist/src/resources/index.d.ts +2 -0
  18. package/dist/src/resources/providers/resource-builder-init.d.ts +1 -1
  19. package/dist/src/resources/services/remote-resources.d.ts +45 -0
  20. package/dist/src/resources/services/resource-name.d.ts +28 -0
  21. package/dist/src/resources/services/sync-resources-from-bindings.d.ts +17 -5
  22. package/dist/src/solution-auth.d.ts +3 -0
  23. package/dist/src/zip-utils.d.ts +8 -0
  24. package/package.json +2 -2
  25. package/dist/generated/src/models/DeploymentRunResponse.d.ts +0 -51
  26. package/dist/generated/src/models/DeploymentUpgradeRequest.d.ts +0 -38
  27. package/dist/src/deployments-auto-install.d.ts +0 -55
@@ -18,12 +18,12 @@ import {
18
18
  logger,
19
19
  normalizeProjectType,
20
20
  toPortableRelativePath
21
- } from "../index-4zqv4bn2.js";
21
+ } from "../index-bdpp6dsk.js";
22
22
  import {
23
23
  getAuthContext,
24
24
  getLoginStatusAsync,
25
25
  getSolutionAuthContext
26
- } from "../index-y8tgscfm.js";
26
+ } from "../index-6gp5j7j5.js";
27
27
  import {
28
28
  getFileSystem
29
29
  } from "../index-g0hcxnae.js";
@@ -3314,7 +3314,6 @@ class InMemoryCacheProvider {
3314
3314
  this._defaultTtlMs = defaultTtlMs;
3315
3315
  }
3316
3316
  }
3317
-
3318
3317
  // ../../node_modules/@uipath/resource-builder-sdk/dist/providers/ip-range-bypass-secret-provider.js
3319
3318
  class NullIpRangeBypassSecretProvider {
3320
3319
  async getIpRangeBypassSecretAsync(_cancellationToken) {
@@ -3335,6 +3334,183 @@ class NullSecretsProvider {
3335
3334
  }
3336
3335
  }
3337
3336
 
3337
+ // ../../node_modules/@uipath/resource-builder-sdk/dist/exceptions/timeout-exception.js
3338
+ class TimeoutException extends Error {
3339
+ constructor(message, timeoutMs) {
3340
+ super(message);
3341
+ this.name = "TimeoutException";
3342
+ this.timeoutMs = timeoutMs;
3343
+ if (Error.captureStackTrace)
3344
+ Error.captureStackTrace(this, TimeoutException);
3345
+ }
3346
+ }
3347
+
3348
+ // ../../node_modules/@uipath/resource-builder-sdk/dist/helpers/timeout.js
3349
+ function createTimeoutSignal(timeoutMs, description, linkedSignal) {
3350
+ const controller = new AbortController;
3351
+ let timeoutId;
3352
+ const dispose = () => {
3353
+ if (timeoutId !== undefined) {
3354
+ clearTimeout(timeoutId);
3355
+ timeoutId = undefined;
3356
+ }
3357
+ linkedSignal?.removeEventListener("abort", onLinkedAbort);
3358
+ };
3359
+ const onLinkedAbort = () => {
3360
+ dispose();
3361
+ controller.abort(linkedSignal?.reason);
3362
+ };
3363
+ if (linkedSignal?.aborted) {
3364
+ controller.abort(linkedSignal.reason);
3365
+ return {
3366
+ signal: controller.signal,
3367
+ dispose
3368
+ };
3369
+ }
3370
+ timeoutId = setTimeout(() => {
3371
+ dispose();
3372
+ controller.abort(new TimeoutException(`${description} timed out after ${timeoutMs}ms`, timeoutMs));
3373
+ }, timeoutMs);
3374
+ linkedSignal?.addEventListener("abort", onLinkedAbort, {
3375
+ once: true
3376
+ });
3377
+ return {
3378
+ signal: controller.signal,
3379
+ dispose
3380
+ };
3381
+ }
3382
+ var MAX_TIMEOUT_MS = 2147483647;
3383
+ function isValidTimeoutMs(value) {
3384
+ return typeof value == "number" && Number.isFinite(value) && value > 0 && value <= MAX_TIMEOUT_MS;
3385
+ }
3386
+ function readTimeoutOverrideMs(storageKey) {
3387
+ try {
3388
+ if ("u" < typeof localStorage)
3389
+ return;
3390
+ const raw = localStorage.getItem(storageKey);
3391
+ if (raw === null || raw.trim() === "")
3392
+ return;
3393
+ const parsed = Number(raw);
3394
+ return isValidTimeoutMs(parsed) ? parsed : undefined;
3395
+ } catch {
3396
+ return;
3397
+ }
3398
+ }
3399
+
3400
+ // ../../node_modules/@uipath/resource-builder-sdk/dist/exceptions/operation-cancelled-exception.js
3401
+ class OperationCancelledException extends Error {
3402
+ constructor(message, operationName) {
3403
+ super(message ?? "The operation was cancelled");
3404
+ this.name = "OperationCancelledException";
3405
+ this.operationName = operationName;
3406
+ if (Error.captureStackTrace)
3407
+ Error.captureStackTrace(this, OperationCancelledException);
3408
+ }
3409
+ }
3410
+
3411
+ // ../../node_modules/@uipath/resource-builder-sdk/dist/providers/timeout-file-storage-provider.js
3412
+ class TimeoutFileStorageProvider2 {
3413
+ fileExistsAsync(path, cancellationToken) {
3414
+ return this.guard(`fileExists(${path})`, cancellationToken, (signal) => this.inner.fileExistsAsync(path, signal));
3415
+ }
3416
+ async openFileAsync(path, cancellationToken) {
3417
+ const stream = await this.guard(`openFile(${path})`, cancellationToken, (signal) => this.inner.openFileAsync(path, signal));
3418
+ return this.bindReadsToTimeout(stream, `read(${path})`, cancellationToken);
3419
+ }
3420
+ bindReadsToTimeout(stream, description, cancellationToken) {
3421
+ const reader = stream.getReader();
3422
+ return new ReadableStream({
3423
+ pull: async (controller) => {
3424
+ let result;
3425
+ try {
3426
+ result = await this.guard(description, cancellationToken, () => reader.read());
3427
+ } catch (error) {
3428
+ reader.cancel(error).catch(() => {});
3429
+ throw error;
3430
+ }
3431
+ if (result.done)
3432
+ controller.close();
3433
+ else
3434
+ controller.enqueue(result.value);
3435
+ },
3436
+ cancel: (reason) => reader.cancel(reason)
3437
+ });
3438
+ }
3439
+ readFileToEndAsync(path, cancellationToken) {
3440
+ return this.guard(`readFileToEnd(${path})`, cancellationToken, (signal) => this.inner.readFileToEndAsync(path, signal));
3441
+ }
3442
+ writeFileAsync(path, content, cancellationToken) {
3443
+ return this.guard(`writeFile(${path})`, cancellationToken, (signal) => this.inner.writeFileAsync(path, content, signal));
3444
+ }
3445
+ deleteFileAsync(path, cancellationToken) {
3446
+ return this.guard(`deleteFile(${path})`, cancellationToken, (signal) => this.inner.deleteFileAsync(path, signal));
3447
+ }
3448
+ getFilesAsync(path, searchPattern, cancellationToken) {
3449
+ return this.guard(`getFiles(${path ?? ""}, ${searchPattern ?? ""})`, cancellationToken, (signal) => this.inner.getFilesAsync(path, searchPattern, signal));
3450
+ }
3451
+ async guard(description, cancellationToken, operation) {
3452
+ const timeout = createTimeoutSignal(this.timeoutMs, `File storage operation ${description}`, cancellationToken);
3453
+ try {
3454
+ return await Promise.race([
3455
+ operation(timeout.signal),
3456
+ rejectOnAbort(timeout.signal)
3457
+ ]);
3458
+ } catch (error) {
3459
+ if (cancellationToken?.aborted)
3460
+ throw cancellationToken.reason instanceof OperationCancelledException ? cancellationToken.reason : new OperationCancelledException(undefined, description);
3461
+ if (timeout.signal.aborted && timeout.signal.reason instanceof TimeoutException)
3462
+ throw timeout.signal.reason;
3463
+ throw error;
3464
+ } finally {
3465
+ timeout.dispose();
3466
+ }
3467
+ }
3468
+ constructor(inner, timeoutMs) {
3469
+ this.inner = inner;
3470
+ this.timeoutMs = timeoutMs;
3471
+ }
3472
+ }
3473
+ function rejectOnAbort(signal) {
3474
+ return new Promise((_, reject) => {
3475
+ if (signal.aborted)
3476
+ return void reject(signal.reason);
3477
+ signal.addEventListener("abort", () => reject(signal.reason), {
3478
+ once: true
3479
+ });
3480
+ });
3481
+ }
3482
+ function withFileOperationTimeout2(provider, timeoutMs) {
3483
+ if (!isValidTimeoutMs(timeoutMs) || provider instanceof TimeoutFileStorageProvider2)
3484
+ return provider;
3485
+ return new TimeoutFileStorageProvider2(provider, timeoutMs);
3486
+ }
3487
+
3488
+ // ../../node_modules/@uipath/resource-builder-sdk/dist/solution/solution-context-options.js
3489
+ var DEFAULT_SOLUTION_CONTEXT_OPTIONS = {
3490
+ lockTimeoutMs: 30000,
3491
+ fileOperationTimeoutMs: 30000
3492
+ };
3493
+ var SOLUTION_CONTEXT_TIMEOUT_STORAGE_KEY = "SOL_RB_SOLUTION_CONTEXT_TIMEOUT_MS";
3494
+ var FILE_OPERATION_TIMEOUT_STORAGE_KEY = "SOL_RB_FILE_OPERATION_TIMEOUT_MS";
3495
+ function resolveTimeoutMs(storageKey, configured, fallback) {
3496
+ const override = readTimeoutOverrideMs(storageKey);
3497
+ if (override !== undefined)
3498
+ return override;
3499
+ return isValidTimeoutMs(configured) ? configured : fallback;
3500
+ }
3501
+ function resolveLockTimeoutMs(options) {
3502
+ return resolveTimeoutMs(SOLUTION_CONTEXT_TIMEOUT_STORAGE_KEY, options?.lockTimeoutMs, DEFAULT_SOLUTION_CONTEXT_OPTIONS.lockTimeoutMs);
3503
+ }
3504
+ function resolveFileOperationTimeoutMs(options) {
3505
+ return resolveTimeoutMs(FILE_OPERATION_TIMEOUT_STORAGE_KEY, options?.fileOperationTimeoutMs, DEFAULT_SOLUTION_CONTEXT_OPTIONS.fileOperationTimeoutMs);
3506
+ }
3507
+ function mergeSolutionContextOptions(options) {
3508
+ return {
3509
+ lockTimeoutMs: isValidTimeoutMs(options?.lockTimeoutMs) ? options.lockTimeoutMs : DEFAULT_SOLUTION_CONTEXT_OPTIONS.lockTimeoutMs,
3510
+ fileOperationTimeoutMs: isValidTimeoutMs(options?.fileOperationTimeoutMs) ? options.fileOperationTimeoutMs : DEFAULT_SOLUTION_CONTEXT_OPTIONS.fileOperationTimeoutMs
3511
+ };
3512
+ }
3513
+
3338
3514
  // ../../node_modules/@uipath/resource-builder-sdk/dist/solution/models.js
3339
3515
  var SolutionConstants = {
3340
3516
  RESOURCE_FILES_FOLDER_NAME: "resources",
@@ -3469,17 +3645,6 @@ class DisconnectedException extends Error {
3469
3645
  }
3470
3646
  }
3471
3647
 
3472
- // ../../node_modules/@uipath/resource-builder-sdk/dist/exceptions/operation-cancelled-exception.js
3473
- class OperationCancelledException extends Error {
3474
- constructor(message, operationName) {
3475
- super(message ?? "The operation was cancelled");
3476
- this.name = "OperationCancelledException";
3477
- this.operationName = operationName;
3478
- if (Error.captureStackTrace)
3479
- Error.captureStackTrace(this, OperationCancelledException);
3480
- }
3481
- }
3482
-
3483
3648
  // ../../node_modules/@uipath/resource-builder-sdk/dist/exceptions/invalid-operation-exception.js
3484
3649
  class InvalidOperationException extends Error {
3485
3650
  constructor(message) {
@@ -4144,10 +4309,14 @@ class MultiFileSolutionDefinitionProvider {
4144
4309
  this._jsonSerializer = this.jsonSerializerFactory.getByName(JsonSerializerNames.CamelCaseIndented);
4145
4310
  return this._jsonSerializer;
4146
4311
  }
4312
+ async getFileStorageProviderAsync(context, cancellationToken) {
4313
+ const provider = await this.fileStorageProviderFactory.getProviderAsync(context, cancellationToken);
4314
+ return withFileOperationTimeout2(provider, resolveFileOperationTimeoutMs(this.options));
4315
+ }
4147
4316
  async readAsync(context, cancellationToken) {
4148
4317
  this.logger.info("Reading multi-file solution definition for solution %s", context.path);
4149
4318
  const solutionKey = this.getSolutionKey(context);
4150
- const fileStorageProvider = await this.fileStorageProviderFactory.getProviderAsync(context, cancellationToken);
4319
+ const fileStorageProvider = await this.getFileStorageProviderAsync(context, cancellationToken);
4151
4320
  const resources = [];
4152
4321
  const solutionFiles = [];
4153
4322
  let hashes;
@@ -4223,6 +4392,12 @@ class MultiFileSolutionDefinitionProvider {
4223
4392
  invalidFiles.push(resourceFile);
4224
4393
  }
4225
4394
  } catch (ex) {
4395
+ if (ex instanceof OperationCancelledException || cancellationToken?.aborted) {
4396
+ this.logger.warn("Operation cancelled while reading file %s for solution %s", resourceFile, context.path);
4397
+ throw ex instanceof OperationCancelledException ? ex : new OperationCancelledException;
4398
+ }
4399
+ if (ex instanceof TimeoutException)
4400
+ throw new TimeoutException(`Reading resource file ${resourceFile} for solution ${context.path} timed out: ${ex.message}`, ex.timeoutMs);
4226
4401
  if (isFileNotFoundError(ex)) {
4227
4402
  this.logger.warn("Resource file listed but missing in storage for solution %s: %s", resourceFile, context.path);
4228
4403
  missingFiles.push(resourceFile);
@@ -4275,7 +4450,7 @@ class MultiFileSolutionDefinitionProvider {
4275
4450
  async writeAsync(context, solution, cancellationToken) {
4276
4451
  if (context.isReadOnly)
4277
4452
  return;
4278
- const fileStorageProvider = await this.fileStorageProviderFactory.getProviderAsync(context, cancellationToken);
4453
+ const fileStorageProvider = await this.getFileStorageProviderAsync(context, cancellationToken);
4279
4454
  const existingHashes = this.getHashes(context);
4280
4455
  const existingPaths = this.getPaths(context);
4281
4456
  const existingTree = this.getTree(context);
@@ -4350,7 +4525,7 @@ class MultiFileSolutionDefinitionProvider {
4350
4525
  async deleteFilesAsync(context, filesToDelete, cancellationToken) {
4351
4526
  if (!filesToDelete || filesToDelete.length === 0 || context.isReadOnly)
4352
4527
  return;
4353
- const fileStorageProvider = await this.fileStorageProviderFactory.getProviderAsync(context, cancellationToken);
4528
+ const fileStorageProvider = await this.getFileStorageProviderAsync(context, cancellationToken);
4354
4529
  for (const file of filesToDelete)
4355
4530
  try {
4356
4531
  const outputPath = this.joinPath("resourceFiles", file.name);
@@ -4547,7 +4722,8 @@ class MultiFileSolutionDefinitionProvider {
4547
4722
  const hex = Math.abs(hash).toString(16).padStart(8, "0");
4548
4723
  return `${hex.slice(0, 8)}-${hex.slice(0, 4)}-4${hex.slice(1, 4)}-8${hex.slice(1, 4)}-${hex.slice(0, 12).padEnd(12, "0")}`;
4549
4724
  }
4550
- constructor(fileStorageProviderFactory, jsonSerializerFactory, loggerFactory) {
4725
+ constructor(fileStorageProviderFactory, jsonSerializerFactory, loggerFactory, options) {
4726
+ this.options = options;
4551
4727
  this._caseInsensitiveSerializer = null;
4552
4728
  this._jsonSerializer = null;
4553
4729
  this.fileStorageProviderFactory = fileStorageProviderFactory;
@@ -4560,12 +4736,13 @@ MultiFileSolutionDefinitionProvider.INVALID_FILE_NAME_CHARS = /[<>:"/\\|?*\x00-\
4560
4736
  // ../../node_modules/@uipath/resource-builder-sdk/dist/solution/multi-file-solution-definition-factory.js
4561
4737
  class MultiFileSolutionDefinitionFactory {
4562
4738
  async getProviderAsync(cancellationToken) {
4563
- return new MultiFileSolutionDefinitionProvider(this.fileStorageProviderFactory, this.jsonSerializerFactory, this.loggerFactory);
4739
+ return new MultiFileSolutionDefinitionProvider(this.fileStorageProviderFactory, this.jsonSerializerFactory, this.loggerFactory, this.options);
4564
4740
  }
4565
- constructor(fileStorageProviderFactory, jsonSerializerFactory, loggerFactory) {
4741
+ constructor(fileStorageProviderFactory, jsonSerializerFactory, loggerFactory, options) {
4566
4742
  this.fileStorageProviderFactory = fileStorageProviderFactory;
4567
4743
  this.jsonSerializerFactory = jsonSerializerFactory;
4568
4744
  this.loggerFactory = loggerFactory;
4745
+ this.options = options;
4569
4746
  this.logger = loggerFactory.create("MultiFileSolutionDefinitionFactory");
4570
4747
  }
4571
4748
  }
@@ -4573,7 +4750,7 @@ class MultiFileSolutionDefinitionFactory {
4573
4750
  // ../../node_modules/@uipath/resource-builder-sdk/dist/embedded-files-default.js
4574
4751
  async function createDefaultEmbeddedFileReaderAsync() {
4575
4752
  const [{ EmbeddedFileReader }, { JsonSerializerFactory: JsonSerializerFactory2 }] = await Promise.all([
4576
- import("../embedded-file-reader-xxqe8vs8.js"),
4753
+ import("../embedded-file-reader-rf2g1kfj.js"),
4577
4754
  import("../index-dqa169gp.js")
4578
4755
  ]);
4579
4756
  return new EmbeddedFileReader(new JsonSerializerFactory2);
@@ -4606,7 +4783,8 @@ var ServiceTokens = {
4606
4783
  JsonSerializerFactory: "IJsonSerializerFactory",
4607
4784
  SerializerProxy: "ISerializerProxy",
4608
4785
  StreamSerializer: "IStreamSerializer",
4609
- HttpReaderOptions: "HttpReaderOptions"
4786
+ HttpReaderOptions: "HttpReaderOptions",
4787
+ SolutionContextOptions: "SolutionContextOptions"
4610
4788
  };
4611
4789
  var Tokens = {
4612
4790
  IMediator: "IMediator",
@@ -5172,7 +5350,8 @@ class BindingOverwritesHandler {
5172
5350
  [BindingsKnownKeys.FolderKeyPropertyName]: resourceOverwrite.folderKey ?? ""
5173
5351
  };
5174
5352
  else {
5175
- const folderPath = bindingResource.isArtefactResource ? "" : resourceOverwrite.folderFullyQualifiedName ?? "";
5353
+ const isBusinessRule = bindingResource.binding.resourceType === models_BindingsResourceType.BusinessRule;
5354
+ const folderPath = bindingResource.isArtefactResource && !isBusinessRule ? "" : resourceOverwrite.folderFullyQualifiedName ?? "";
5176
5355
  overwrite = {
5177
5356
  [BindingsKnownKeys.FolderPathPropertyName]: folderPath,
5178
5357
  [BindingsKnownKeys.NamePropertyName]: resourceOverwrite.resourceName
@@ -5330,42 +5509,6 @@ class AsyncSemaphore {
5330
5509
  this._permits = permits;
5331
5510
  }
5332
5511
  }
5333
- function createTimeoutSignal(timeoutMs, linkedSignal) {
5334
- const controller = new AbortController;
5335
- const timeoutId = setTimeout(() => {
5336
- controller.abort(new Error(`Operation timed out after ${timeoutMs}ms`));
5337
- }, timeoutMs);
5338
- if (linkedSignal)
5339
- if (linkedSignal.aborted) {
5340
- clearTimeout(timeoutId);
5341
- controller.abort(linkedSignal.reason);
5342
- } else
5343
- linkedSignal.addEventListener("abort", () => {
5344
- clearTimeout(timeoutId);
5345
- controller.abort(linkedSignal.reason);
5346
- }, {
5347
- signal: controller.signal
5348
- });
5349
- controller.signal.addEventListener("abort", () => {
5350
- clearTimeout(timeoutId);
5351
- });
5352
- return controller.signal;
5353
- }
5354
- var DEFAULT_TIMEOUT_MS = 5000;
5355
- var SOLUTION_CONTEXT_TIMEOUT_STORAGE_KEY = "SOL_RB_SOLUTION_CONTEXT_TIMEOUT_MS";
5356
- function getLockTimeoutMs() {
5357
- try {
5358
- if ("u" < typeof localStorage)
5359
- return DEFAULT_TIMEOUT_MS;
5360
- const raw = localStorage.getItem(SOLUTION_CONTEXT_TIMEOUT_STORAGE_KEY);
5361
- if (raw === null || raw.trim() === "")
5362
- return DEFAULT_TIMEOUT_MS;
5363
- const parsed = Number(raw);
5364
- return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_TIMEOUT_MS;
5365
- } catch {
5366
- return DEFAULT_TIMEOUT_MS;
5367
- }
5368
- }
5369
5512
 
5370
5513
  class SolutionContext {
5371
5514
  get isLoaded() {
@@ -5493,30 +5636,42 @@ class SolutionContext {
5493
5636
  throw new FileDependencyNotFoundException(missingFileDependencies);
5494
5637
  }
5495
5638
  async doWithLockAsync(doWork, cancellationToken) {
5496
- const timeoutSignal = createTimeoutSignal(getLockTimeoutMs(), cancellationToken);
5497
- await this._semaphore.acquire(timeoutSignal);
5639
+ const lockTimeoutMs = resolveLockTimeoutMs(this._options);
5640
+ const lockTimeout = createTimeoutSignal(lockTimeoutMs, `Waiting for the lock on solution ${this.path}`, cancellationToken);
5498
5641
  try {
5499
- return await doWork(timeoutSignal);
5642
+ await this._semaphore.acquire(lockTimeout.signal);
5643
+ } catch (error) {
5644
+ if (!cancellationToken?.aborted && lockTimeout.signal.reason instanceof TimeoutException)
5645
+ throw lockTimeout.signal.reason;
5646
+ throw error;
5647
+ } finally {
5648
+ lockTimeout.dispose();
5649
+ }
5650
+ try {
5651
+ return await doWork(cancellationToken);
5500
5652
  } finally {
5501
5653
  this._semaphore.release();
5502
5654
  }
5503
5655
  }
5504
- constructor(path, isReadOnlyOrProvider, definitionProvider) {
5656
+ constructor(path, isReadOnlyOrProvider, definitionProviderOrOptions, options) {
5505
5657
  this._definition = null;
5506
5658
  this._semaphore = new AsyncSemaphore(1);
5507
5659
  this._items = {};
5508
5660
  this._persistChanges = true;
5509
5661
  ArgumentException.throwIfNullOrEmpty(path, "path");
5510
5662
  if (typeof isReadOnlyOrProvider == "boolean") {
5663
+ const definitionProvider = definitionProviderOrOptions;
5511
5664
  ArgumentException.throwIfNull(definitionProvider, "definitionProvider");
5512
5665
  this.path = path;
5513
5666
  this.isReadOnly = isReadOnlyOrProvider;
5514
5667
  this._definitionProvider = definitionProvider;
5668
+ this._options = options;
5515
5669
  } else {
5516
5670
  ArgumentException.throwIfNull(isReadOnlyOrProvider, "definitionProvider");
5517
5671
  this.path = path;
5518
5672
  this.isReadOnly = false;
5519
5673
  this._definitionProvider = isReadOnlyOrProvider;
5674
+ this._options = definitionProviderOrOptions;
5520
5675
  }
5521
5676
  }
5522
5677
  }
@@ -5527,7 +5682,8 @@ class SolutionContextFactory {
5527
5682
  ArgumentException.throwIfNullOrEmpty(path, "path");
5528
5683
  const solutionDefinitionFactory = this._container.resolve(Tokens.ISolutionDefinitionFactory);
5529
5684
  const solutionDefinitionProvider = await solutionDefinitionFactory.getProviderAsync(cancellationToken);
5530
- return new SolutionContext(path, isReadOnly, solutionDefinitionProvider);
5685
+ const options = this._container.isRegistered(ServiceTokens.SolutionContextOptions, true) ? this._container.resolve(ServiceTokens.SolutionContextOptions) : undefined;
5686
+ return new SolutionContext(path, isReadOnly, solutionDefinitionProvider, options);
5531
5687
  }
5532
5688
  constructor(_container) {
5533
5689
  this._container = _container;
@@ -6549,7 +6705,13 @@ var solutionsSubtypesMap = {
6549
6705
  Api: "api",
6550
6706
  Function: "function",
6551
6707
  McpServer: "mcpserver",
6552
- BusinessRule: "businessRule"
6708
+ BusinessRule: "businessRule",
6709
+ Native: "native",
6710
+ Federated: "federated",
6711
+ Case: "case",
6712
+ CaseMain: "caseMain",
6713
+ CaseComment: "caseComment",
6714
+ CaseDocument: "caseDocument"
6553
6715
  };
6554
6716
  function mapResourceToSolutionSubtype(entitySubtype) {
6555
6717
  if (!entitySubtype)
@@ -14980,9 +15142,9 @@ class UnconfiguredEmbeddedFileReader {
14980
15142
  }
14981
15143
 
14982
15144
  // ../../node_modules/@uipath/resource-builder-sdk/dist/container.js
14983
- function createContainer(accessProvider, cacheProvider, secretsProvider, fileStorageProviderFactory, ipRangeBypassSecretProvider, solutionDefinitionProvider, solutionDefinitionFactory, artifactResourceSpecEnhancer, httpReaderOptions, loggerFactory, embeddedFileReader) {
15145
+ function createContainer(accessProvider, cacheProvider, secretsProvider, fileStorageProviderFactory, ipRangeBypassSecretProvider, solutionDefinitionProvider, solutionDefinitionFactory, artifactResourceSpecEnhancer, httpReaderOptions, loggerFactory, embeddedFileReader, solutionContextOptions) {
14984
15146
  const childContainer = import_tsyringe6.container.createChildContainer();
14985
- registerProviders(childContainer, accessProvider, cacheProvider, secretsProvider, fileStorageProviderFactory, ipRangeBypassSecretProvider, solutionDefinitionProvider, solutionDefinitionFactory, artifactResourceSpecEnhancer, httpReaderOptions, loggerFactory);
15147
+ registerProviders(childContainer, accessProvider, cacheProvider, secretsProvider, fileStorageProviderFactory, ipRangeBypassSecretProvider, solutionDefinitionProvider, solutionDefinitionFactory, artifactResourceSpecEnhancer, httpReaderOptions, loggerFactory, solutionContextOptions);
14986
15148
  registerServices(childContainer, embeddedFileReader);
14987
15149
  registerHandlers(childContainer);
14988
15150
  childContainer.register(ServiceTokens.Mediator, {
@@ -15006,7 +15168,7 @@ function registerProvider(diContainer, token, provider) {
15006
15168
  break;
15007
15169
  }
15008
15170
  }
15009
- function registerProviders(diContainer, accessProvider, cacheProvider, secretsProvider, fileStorageProviderFactory, ipRangeBypassSecretProvider, solutionDefinitionProvider, solutionDefinitionFactory, artifactResourceSpecEnhancer, httpReaderOptions, loggerFactory) {
15171
+ function registerProviders(diContainer, accessProvider, cacheProvider, secretsProvider, fileStorageProviderFactory, ipRangeBypassSecretProvider, solutionDefinitionProvider, solutionDefinitionFactory, artifactResourceSpecEnhancer, httpReaderOptions, loggerFactory, solutionContextOptions) {
15010
15172
  registerProvider(diContainer, ServiceTokens.AccessProvider, accessProvider);
15011
15173
  registerProvider(diContainer, ServiceTokens.CacheProvider, cacheProvider);
15012
15174
  registerProvider(diContainer, ServiceTokens.SecretsProvider, secretsProvider);
@@ -15021,6 +15183,7 @@ function registerProviders(diContainer, accessProvider, cacheProvider, secretsPr
15021
15183
  ...httpReaderOptions
15022
15184
  };
15023
15185
  diContainer.registerInstance(ServiceTokens.HttpReaderOptions, mergedOptions);
15186
+ diContainer.registerInstance(ServiceTokens.SolutionContextOptions, mergeSolutionContextOptions(solutionContextOptions));
15024
15187
  }
15025
15188
  function registerServices(diContainer, embeddedFileReader) {
15026
15189
  diContainer.register(ServiceTokens.AutomationSolutionsClientProxy, {
@@ -15755,6 +15918,10 @@ class ResourceBuilderConfiguration {
15755
15918
  this._httpReaderOptions = options;
15756
15919
  return this;
15757
15920
  }
15921
+ addSolutionContextOptions(options) {
15922
+ this._solutionContextOptions = options;
15923
+ return this;
15924
+ }
15758
15925
  addLoggerFactory(factoryProvider, lifetime = service_tokens_ServiceLifetime.Singleton) {
15759
15926
  this._loggerFactoryProvider = factoryProvider;
15760
15927
  this._loggerFactoryLifetime = lifetime;
@@ -15819,7 +15986,7 @@ class ResourceBuilderConfiguration {
15819
15986
  };
15820
15987
  } else if (!solutionDefinitionProvider && fileStorageProviderFactory)
15821
15988
  solutionDefinitionFactory = {
15822
- instance: new MultiFileSolutionDefinitionFactory(fileStorageProviderFactory.instance, new JsonSerializerFactory, loggerFactoryInstance),
15989
+ instance: new MultiFileSolutionDefinitionFactory(fileStorageProviderFactory.instance, new JsonSerializerFactory, loggerFactoryInstance, this._solutionContextOptions),
15823
15990
  lifetime: service_tokens_ServiceLifetime.Scoped
15824
15991
  };
15825
15992
  const artifactResourceSpecEnhancerInstance = this._artifactResourceSpecEnhancerProvider ? await this.resolveGenericProvider(this._artifactResourceSpecEnhancerProvider) : new DefaultArtifactResourceSpecEnhancer;
@@ -15828,7 +15995,7 @@ class ResourceBuilderConfiguration {
15828
15995
  lifetime: this._artifactResourceSpecEnhancerLifetime
15829
15996
  };
15830
15997
  const embeddedFileReader = await createDefaultEmbeddedFileReaderAsync();
15831
- const container3 = createContainer(accessProvider, cacheProvider, secretsProvider, fileStorageProviderFactory, ipRangeBypassSecretProvider, solutionDefinitionProvider, solutionDefinitionFactory, artifactResourceSpecEnhancer, this._httpReaderOptions, loggerFactory, embeddedFileReader);
15998
+ const container3 = createContainer(accessProvider, cacheProvider, secretsProvider, fileStorageProviderFactory, ipRangeBypassSecretProvider, solutionDefinitionProvider, solutionDefinitionFactory, artifactResourceSpecEnhancer, this._httpReaderOptions, loggerFactory, embeddedFileReader, this._solutionContextOptions);
15832
15999
  return new ResourceBuilderServices(container3);
15833
16000
  }
15834
16001
  async buildServices() {
@@ -15849,7 +16016,6 @@ class ResourceBuilderConfiguration {
15849
16016
  function createResourceBuilderConfiguration() {
15850
16017
  return new ResourceBuilderConfiguration;
15851
16018
  }
15852
-
15853
16019
  // src/resources/services/solution-manifest.ts
15854
16020
  async function assertSolutionManifest(dir) {
15855
16021
  const fs = getFileSystem();
@@ -16205,7 +16371,7 @@ class CliResourceBuilderLoggerFactory {
16205
16371
  }
16206
16372
 
16207
16373
  // ../orchestrator-sdk/generated/src/runtime.ts
16208
- var BASE_PATH = "https://alpha.uipath.com/uipattycyrhx/abizon_1/orchestrator_".replace(/\/+$/, "");
16374
+ var BASE_PATH = "https://alpha.uipath.com/Ada/byoa/orchestrator_".replace(/\/+$/, "");
16209
16375
 
16210
16376
  class Configuration {
16211
16377
  configuration;
@@ -16458,7 +16624,7 @@ var package_default = {
16458
16624
  name: "@uipath/orchestrator-sdk",
16459
16625
  author: "UiPath",
16460
16626
  license: "SEE LICENSE IN LICENSE.txt",
16461
- version: "1.203.0",
16627
+ version: "1.204.0",
16462
16628
  repository: {
16463
16629
  type: "git",
16464
16630
  url: "https://github.com/UiPath/cli.git",
@@ -18010,6 +18176,12 @@ async function createApiClient(ApiClass, options) {
18010
18176
  const config = await createOrchestratorConfig(options);
18011
18177
  return new ApiClass(config);
18012
18178
  }
18179
+ // ../orchestrator-sdk/src/knowledge-bundles.ts
18180
+ var KB_INLINE_LIMITS = {
18181
+ maxObjectBytes: 16 * 1024 * 1024,
18182
+ maxBodyBytes: 100 * 1024 * 1024,
18183
+ maxParts: 1e4
18184
+ };
18013
18185
  // src/resources/providers/solution-access-provider.ts
18014
18186
  var ORG_SCOPED_SERVICES = new Set(["apps", "authz"]);
18015
18187
 
@@ -18324,6 +18496,81 @@ function hasAnyTemplateRow(projectType) {
18324
18496
  return key === wanted || key.startsWith(`${wanted}_`);
18325
18497
  });
18326
18498
  }
18499
+ // src/resources/services/remote-resources.ts
18500
+ function getRemoteResourceClients(services2) {
18501
+ return {
18502
+ catalog: services2.container.resolve(Tokens.IResourceCatalogClientProxy),
18503
+ importer: services2.container.resolve(Tokens.IImportResourceHelper)
18504
+ };
18505
+ }
18506
+ async function findCatalogEntityAsync(catalog, query, match) {
18507
+ let pageCursor;
18508
+ do {
18509
+ const page = await catalog.searchFolderEntities({
18510
+ ...query,
18511
+ pageSize: 100,
18512
+ pageCursor
18513
+ });
18514
+ const found = (page.items ?? []).find(match);
18515
+ if (found) {
18516
+ return found;
18517
+ }
18518
+ pageCursor = page.nextPage ?? undefined;
18519
+ } while (pageCursor);
18520
+ return;
18521
+ }
18522
+ function toResourceReference(entity) {
18523
+ return toCatalogReference({
18524
+ kind: entity.entityType ?? "",
18525
+ type: entity.entitySubType ?? undefined,
18526
+ key: entity.entityKey ?? "",
18527
+ name: entity.entityName ?? undefined,
18528
+ folderPath: entity.fullyQualifiedName ?? undefined,
18529
+ folderKey: entity.folderKey ?? undefined
18530
+ });
18531
+ }
18532
+ function toCatalogReference(reference) {
18533
+ const { folderPath, folderKey, ...rest } = reference;
18534
+ return {
18535
+ ...rest,
18536
+ folder: folderPath ? { fullyQualifiedName: folderPath, folderKey } : undefined
18537
+ };
18538
+ }
18539
+ async function exportResourceDefinitionAsync(importer, reference) {
18540
+ const payload = await importer.exportResourceAsync(reference);
18541
+ return payload.resourceDefinitions.find((d) => d.key === reference.key);
18542
+ }
18543
+ function readSpecProperty(spec, name) {
18544
+ if (!spec) {
18545
+ return;
18546
+ }
18547
+ if (spec[name] !== undefined) {
18548
+ return spec[name];
18549
+ }
18550
+ const lower = name.toLowerCase();
18551
+ const key = Object.keys(spec).find((k) => k.toLowerCase() === lower);
18552
+ return key === undefined ? undefined : spec[key];
18553
+ }
18554
+ function readSpecEntryPoints(spec) {
18555
+ const entryPoints = parseJsonString(readSpecProperty(spec, "entryPoints"));
18556
+ if (!Array.isArray(entryPoints) || !entryPoints.every((entry) => entry !== null && typeof entry === "object")) {
18557
+ return;
18558
+ }
18559
+ return entryPoints.map((entry) => ({
18560
+ UniqueId: String(readSpecProperty(entry, "uniqueId") ?? ""),
18561
+ Path: String(readSpecProperty(entry, "path") ?? ""),
18562
+ DisplayName: String(readSpecProperty(entry, "displayName") ?? ""),
18563
+ InputArguments: readSpecProperty(entry, "inputArguments"),
18564
+ OutputArguments: readSpecProperty(entry, "outputArguments")
18565
+ }));
18566
+ }
18567
+ function parseJsonString(raw) {
18568
+ if (typeof raw !== "string") {
18569
+ return raw;
18570
+ }
18571
+ const [error, parsed] = catchError(() => JSON.parse(raw));
18572
+ return error ? undefined : parsed;
18573
+ }
18327
18574
  // src/resources/services/resource-casing.ts
18328
18575
  var RESOURCE_FILES_FOLDER_NAME = "resources";
18329
18576
  function lowerFirstChar(value) {
@@ -18481,7 +18728,52 @@ function parseResourceHeader(content) {
18481
18728
  return null;
18482
18729
  }
18483
18730
  }
18731
+ // src/resources/services/resource-name.ts
18732
+ var MAX_RESOURCE_NAME_LENGTH = 256;
18733
+ var UNSAFE_NAME_CHARS = /[\\/:*?"<>|]/;
18734
+ function hasControlChar(value) {
18735
+ for (let i = 0;i < value.length; i++) {
18736
+ if (value.charCodeAt(i) < 32)
18737
+ return true;
18738
+ }
18739
+ return false;
18740
+ }
18741
+ function validateResourceName(name, options = {}) {
18742
+ const optionName = options.optionName ?? "--name";
18743
+ if (name.trim() === "") {
18744
+ return {
18745
+ ok: false,
18746
+ message: `${optionName} must not be blank`,
18747
+ instructions: "Pass a non-empty resource name."
18748
+ };
18749
+ }
18750
+ if (name.length > MAX_RESOURCE_NAME_LENGTH) {
18751
+ return {
18752
+ ok: false,
18753
+ message: `${optionName} exceeds the ${MAX_RESOURCE_NAME_LENGTH}-character limit (got ${name.length})`,
18754
+ instructions: "Shorten the resource name. Orchestrator name limits are kind-specific (queues cap at 50, assets at 256)."
18755
+ };
18756
+ }
18757
+ if (UNSAFE_NAME_CHARS.test(name) || hasControlChar(name)) {
18758
+ return {
18759
+ ok: false,
18760
+ message: `${optionName} contains unsafe characters`,
18761
+ instructions: 'Resource names cannot contain path separators (/, \\), control characters, or any of: : * ? " < > |'
18762
+ };
18763
+ }
18764
+ return { ok: true };
18765
+ }
18766
+ function assertValidResourceName(name, options = {}) {
18767
+ const result = validateResourceName(name, options);
18768
+ if (!result.ok) {
18769
+ throw new Error(`${result.message}. ${result.instructions}`);
18770
+ }
18771
+ }
18484
18772
  // src/resources/services/sync-resources-from-bindings.ts
18773
+ var TYPE_IS_IDENTITY_REPLACE_OPTIONS = new Set([
18774
+ "SameType",
18775
+ "SameNameAndType"
18776
+ ]);
18485
18777
  var BINDINGS_JSON_FALLBACK_TYPES = new Set(["agent", "function"]);
18486
18778
  function placeholderForType(type) {
18487
18779
  switch ((type ?? "string").toLowerCase()) {
@@ -18511,7 +18803,7 @@ async function buildKindResolver(metadataReader) {
18511
18803
  byKind.set(key, list);
18512
18804
  }
18513
18805
  return async (kind, type) => {
18514
- const cacheKey = `${kind}|${type ?? ""}`.toLowerCase();
18806
+ const cacheKey = (type === undefined ? kind : `${kind}|${type}`).toLowerCase();
18515
18807
  if (cache.has(cacheKey))
18516
18808
  return cache.get(cacheKey);
18517
18809
  const list = byKind.get(kind.toLowerCase());
@@ -18519,7 +18811,9 @@ async function buildKindResolver(metadataReader) {
18519
18811
  cache.set(cacheKey, undefined);
18520
18812
  return;
18521
18813
  }
18522
- const entry = type ? list.find((r) => (r.type ?? "").toLowerCase() === type.toLowerCase()) ?? list[0] : list[0];
18814
+ const subtypes = list.flatMap((r) => r.type ? [r.type] : []);
18815
+ const matched = type === undefined ? undefined : findSubtypeEntry(list, type);
18816
+ const entry = matched ?? list[0];
18523
18817
  const version = entry.versions?.[0];
18524
18818
  const requiredDefaults = [];
18525
18819
  for (const prop of version?.spec ?? []) {
@@ -18538,16 +18832,35 @@ async function buildKindResolver(metadataReader) {
18538
18832
  }
18539
18833
  }
18540
18834
  }
18835
+ const takesFreeFormType = type !== undefined && type.trim() !== "" && subtypes.length === 0 && TYPE_IS_IDENTITY_REPLACE_OPTIONS.has(String(version?.replaceOption));
18541
18836
  const resolved = {
18542
18837
  type: entry.type,
18543
18838
  virtualizable: version?.supportsInLineCreation ?? false,
18544
18839
  requiredDefaults,
18545
- specProperties
18840
+ specProperties,
18841
+ subtypes,
18842
+ typeMatched: type === undefined || matched !== undefined || takesFreeFormType
18546
18843
  };
18547
18844
  cache.set(cacheKey, resolved);
18548
18845
  return resolved;
18549
18846
  };
18550
18847
  }
18848
+ function formatResourceSubtypes(subtypes) {
18849
+ return subtypes.map((subtype) => {
18850
+ const alias = mapSolutionToResourceSubtype(subtype);
18851
+ return alias && alias.toLowerCase() !== subtype.toLowerCase() ? `${subtype} (${alias})` : subtype;
18852
+ }).join(", ");
18853
+ }
18854
+ function sameResourceSubtype(a, b) {
18855
+ if (a === undefined || b === undefined)
18856
+ return false;
18857
+ if (a.toLowerCase() === b.toLowerCase())
18858
+ return true;
18859
+ return mapSolutionToResourceSubtype(a)?.toLowerCase() === mapSolutionToResourceSubtype(b)?.toLowerCase();
18860
+ }
18861
+ function findSubtypeEntry(list, type) {
18862
+ return list.find((r) => !!r.type && sameResourceSubtype(r.type, type));
18863
+ }
18551
18864
  function resolveBindingResourceIdentity(binding) {
18552
18865
  switch (binding.resourceType) {
18553
18866
  case models_BindingsResourceType.TimeTrigger:
@@ -18860,14 +19173,18 @@ async function findResourceByKeyInRcs(builder, kind, expectedKey, folderPath, pr
18860
19173
  return;
18861
19174
  }
18862
19175
  async function searchRcsResources(builder, kind, name) {
19176
+ const [searchError, matches] = await catchError(searchRcsResourcesStrict(builder, kind, name));
19177
+ if (searchError) {
19178
+ logger.warn(`Failed to search ${kind} resources in RCS: ${searchError.message}`);
19179
+ return [];
19180
+ }
19181
+ return matches;
19182
+ }
19183
+ async function searchRcsResourcesStrict(builder, kind, name) {
18863
19184
  let pageCursor;
18864
19185
  const allMatches = [];
18865
19186
  do {
18866
- const [searchError, result] = await catchError(builder.searchResourcesAsync(kind, undefined, name, pageCursor, 50, undefined, false));
18867
- if (searchError) {
18868
- logger.warn(`Failed to search ${kind} resources in RCS: ${searchError.message}`);
18869
- return [];
18870
- }
19187
+ const result = await builder.searchResourcesAsync(kind, undefined, name, pageCursor, 50, undefined, false);
18871
19188
  for (const folderResources of result.availableResources) {
18872
19189
  const matches = folderResources.resources.filter((r) => r.name.toLowerCase() === name.toLowerCase());
18873
19190
  for (const match of matches) {
@@ -18921,7 +19238,13 @@ async function resolveResourceKindMetadata(services2, kind, type) {
18921
19238
  }
18922
19239
  async function createLocalResource(params) {
18923
19240
  const { builder, services: services2, kind, type, name } = params;
19241
+ if (type !== undefined && type.trim() === "") {
19242
+ throw new Error(`Type for kind ${kind} is empty.`);
19243
+ }
18924
19244
  const metadata = await resolveResourceKindMetadata(services2, kind, type);
19245
+ if (type !== undefined && metadata && !metadata.typeMatched) {
19246
+ throw new Error(metadata.subtypes.length > 0 ? `Unknown type "${type}" for kind ${kind}. Use one of: ${formatResourceSubtypes(metadata.subtypes)}` : `Kind ${kind} has no subtypes, so type "${type}" does not apply.`);
19247
+ }
18925
19248
  const minted = await mintVirtualResource(builder, kind, metadata?.type ?? type, name, metadata);
18926
19249
  if (!minted?.resource)
18927
19250
  return;
@@ -19346,21 +19669,27 @@ function sortKeysDeep(value) {
19346
19669
  }
19347
19670
  export {
19348
19671
  EntryPointSpecEnhancer,
19672
+ MAX_RESOURCE_NAME_LENGTH,
19349
19673
  ProjectManifestError,
19350
19674
  addProjectArtifactsToSolutionAsync,
19351
19675
  applyEntryPointEnhancementAsync,
19352
19676
  assertSolutionManifest,
19677
+ assertValidResourceName,
19353
19678
  computeEntryPointSpec,
19354
19679
  createLocalResource,
19355
19680
  createProjectInSolutionBuilder,
19356
19681
  createResourceBuilderServices,
19357
19682
  createResourceKindMetadataResolver,
19683
+ exportResourceDefinitionAsync,
19684
+ findCatalogEntityAsync,
19358
19685
  findMatchingLocalResource,
19359
19686
  findMatchingMemberResource,
19360
19687
  findMemberCloneResources,
19361
19688
  findProjectFile,
19362
19689
  findResourceByKeyInRcs,
19363
19690
  findResourceInRcs,
19691
+ formatResourceSubtypes,
19692
+ getRemoteResourceClients,
19364
19693
  hasAnyTemplateRow,
19365
19694
  hasBareTemplateRow,
19366
19695
  isMissingProjectTypeError,
@@ -19371,6 +19700,8 @@ export {
19371
19700
  readProjectFile,
19372
19701
  readSolutionFile,
19373
19702
  readSolutionManifest,
19703
+ readSpecEntryPoints,
19704
+ readSpecProperty,
19374
19705
  readUipxProjects,
19375
19706
  resolveProjectDirFromManifest,
19376
19707
  resolveResourceKindMetadata,
@@ -19378,12 +19709,17 @@ export {
19378
19709
  resourceRefreshAsync,
19379
19710
  resourceRemoteSyncAsync,
19380
19711
  restoreSolutionFile,
19712
+ sameResourceSubtype,
19381
19713
  saveCasingNormalized,
19382
19714
  searchRcsResources,
19715
+ searchRcsResourcesStrict,
19383
19716
  syncAndLog,
19384
19717
  syncResourcesFromBindings,
19718
+ toCatalogReference,
19719
+ toResourceReference,
19385
19720
  uniqueNameForResource,
19721
+ validateResourceName,
19386
19722
  writeSolutionFile
19387
19723
  };
19388
19724
 
19389
- //# debugId=A05FBBF114C0206364756E2164756E21
19725
+ //# debugId=67B9891A0091029064756E2164756E21