@tailor-platform/sdk 1.2.6 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +90 -0
- package/dist/cli/index.mjs +532 -173
- package/dist/cli/index.mjs.map +1 -1
- package/dist/cli/lib.d.mts +78 -60
- package/dist/cli/lib.mjs +3 -3
- package/dist/cli/lib.mjs.map +1 -1
- package/dist/{config-BmQRlW1j.mjs → config-CBpYlVa-.mjs} +23 -34
- package/dist/config-CBpYlVa-.mjs.map +1 -0
- package/dist/configure/index.d.mts +2 -2
- package/dist/configure/index.mjs +34 -31
- package/dist/configure/index.mjs.map +1 -1
- package/dist/{index-Cf3uhB_7.d.mts → index-CTExbeYE.d.mts} +73 -68
- package/dist/{list-WMFoshbx.mjs → list-1cs_CGF8.mjs} +928 -510
- package/dist/list-1cs_CGF8.mjs.map +1 -0
- package/dist/{src-BhwQdist.mjs → src-Bhwd-tei.mjs} +2 -2
- package/dist/{src-BhwQdist.mjs.map → src-Bhwd-tei.mjs.map} +1 -1
- package/dist/{types-D2rYkxav.d.mts → types-Yxg4lgU0.d.mts} +53 -55
- package/dist/utils/test/index.d.mts +7 -7
- package/dist/utils/test/index.mjs +5 -5
- package/dist/utils/test/index.mjs.map +1 -1
- package/docs/cli/application.md +129 -0
- package/docs/cli-reference.md +26 -9
- package/docs/services/auth.md +5 -0
- package/docs/services/executor.md +6 -0
- package/docs/services/idp.md +13 -1
- package/docs/services/resolver.md +6 -0
- package/docs/services/staticwebsite.md +12 -1
- package/docs/services/tailordb.md +126 -7
- package/docs/services/workflow.md +8 -0
- package/package.json +27 -14
- package/dist/config-BmQRlW1j.mjs.map +0 -1
- package/dist/list-WMFoshbx.mjs.map +0 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM, r as __exportAll, t as __commonJSMin } from "./chunk-CIV_ash9.mjs";
|
|
2
|
-
import { i as WORKFLOW_JOB_BRAND, r as getDistDir } from "./config-
|
|
2
|
+
import { i as WORKFLOW_JOB_BRAND, r as getDistDir } from "./config-CBpYlVa-.mjs";
|
|
3
3
|
import Module, { createRequire } from "node:module";
|
|
4
4
|
import { defineCommand } from "citty";
|
|
5
|
-
import * as
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
5
|
+
import * as fs$15 from "node:fs";
|
|
6
|
+
import fs from "node:fs";
|
|
7
|
+
import util, { formatWithOptions, parseEnv } from "node:util";
|
|
8
|
+
import * as path$20 from "pathe";
|
|
8
9
|
import { z } from "zod";
|
|
9
10
|
import chalk from "chalk";
|
|
10
|
-
import util, { formatWithOptions } from "node:util";
|
|
11
11
|
import { createConsola } from "consola";
|
|
12
12
|
import { formatDistanceToNowStrict } from "date-fns";
|
|
13
13
|
import { isCI } from "std-env";
|
|
@@ -18,8 +18,6 @@ import { Code, ConnectError, createClient } from "@connectrpc/connect";
|
|
|
18
18
|
import { createConnectTransport } from "@connectrpc/connect-node";
|
|
19
19
|
import { enumDesc, fileDesc, messageDesc, serviceDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
|
|
20
20
|
import { readPackageJSON, resolveTSConfig } from "pkg-types";
|
|
21
|
-
import * as fs$15 from "node:fs";
|
|
22
|
-
import fs from "node:fs";
|
|
23
21
|
import * as os$3 from "node:os";
|
|
24
22
|
import os from "node:os";
|
|
25
23
|
import { parseTOML, parseYAML, stringifyYAML } from "confbox";
|
|
@@ -29,6 +27,7 @@ import { xdgConfig } from "xdg-basedir";
|
|
|
29
27
|
import { pathToFileURL } from "node:url";
|
|
30
28
|
import * as inflection from "inflection";
|
|
31
29
|
import { glob } from "node:fs/promises";
|
|
30
|
+
import path from "node:path";
|
|
32
31
|
import assert from "node:assert";
|
|
33
32
|
import * as rolldown from "rolldown";
|
|
34
33
|
import { parseSync } from "oxc-parser";
|
|
@@ -41,8 +40,8 @@ import ora from "ora";
|
|
|
41
40
|
//#region src/cli/utils/errors.ts
|
|
42
41
|
/**
|
|
43
42
|
* Type guard to check if an error is a CLIError
|
|
44
|
-
* @param
|
|
45
|
-
* @returns
|
|
43
|
+
* @param error - Error to check
|
|
44
|
+
* @returns True if the error is a CLIError
|
|
46
45
|
*/
|
|
47
46
|
function isCLIError(error) {
|
|
48
47
|
return error instanceof Error && error.name === "CLIError";
|
|
@@ -244,21 +243,58 @@ const durationSchema = z.templateLiteral([z.number().int().positive(), z.enum(du
|
|
|
244
243
|
});
|
|
245
244
|
/**
|
|
246
245
|
* Parse a duration string (e.g., "3s", "500ms", "1m") to milliseconds
|
|
247
|
-
* @param
|
|
248
|
-
* @returns
|
|
246
|
+
* @param duration - Duration string with unit suffix (ms, s, m)
|
|
247
|
+
* @returns Duration in milliseconds
|
|
249
248
|
*/
|
|
250
249
|
function parseDuration(duration) {
|
|
251
250
|
return durationSchema.parse(duration);
|
|
252
251
|
}
|
|
253
252
|
/**
|
|
253
|
+
* Load env files from parsed arguments.
|
|
254
|
+
* Processes --env-file first, then --env-file-if-exists.
|
|
255
|
+
*
|
|
256
|
+
* Follows Node.js --env-file behavior:
|
|
257
|
+
* - Variables already set in the environment are NOT overwritten
|
|
258
|
+
* - Variables from later files override those from earlier files
|
|
259
|
+
* @param envFiles - Required env file path(s) that must exist
|
|
260
|
+
* @param envFilesIfExists - Optional env file path(s) that are loaded if they exist
|
|
261
|
+
*/
|
|
262
|
+
function loadEnvFiles(envFiles, envFilesIfExists) {
|
|
263
|
+
const originalEnvKeys = new Set(Object.keys(process.env));
|
|
264
|
+
const load = (files, required) => {
|
|
265
|
+
for (const file of [files ?? []].flat()) {
|
|
266
|
+
const envPath = path$20.resolve(process.cwd(), file);
|
|
267
|
+
if (!fs$15.existsSync(envPath)) {
|
|
268
|
+
if (required) throw new Error(`Environment file not found: ${envPath}`);
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
const parsed = parseEnv(fs$15.readFileSync(envPath, "utf-8"));
|
|
272
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
273
|
+
if (originalEnvKeys.has(key)) continue;
|
|
274
|
+
process.env[key] = value;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
load(envFiles, true);
|
|
279
|
+
load(envFilesIfExists, false);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
254
282
|
* Common arguments for all CLI commands
|
|
283
|
+
*
|
|
284
|
+
* NOTE: --env-file and --env-file-if-exists collide with Node.js flags due to a bug
|
|
285
|
+
* (https://github.com/nodejs/node/issues/54232). Node.js parses these even after the
|
|
286
|
+
* script path, causing warnings (twice due to tsx loader).
|
|
255
287
|
*/
|
|
256
288
|
const commonArgs = {
|
|
257
289
|
"env-file": {
|
|
258
290
|
type: "string",
|
|
259
|
-
description: "Path to the environment file",
|
|
291
|
+
description: "Path to the environment file (error if not found)",
|
|
260
292
|
alias: "e"
|
|
261
293
|
},
|
|
294
|
+
"env-file-if-exists": {
|
|
295
|
+
type: "string",
|
|
296
|
+
description: "Path to the environment file (ignored if not found)"
|
|
297
|
+
},
|
|
262
298
|
verbose: {
|
|
263
299
|
type: "boolean",
|
|
264
300
|
description: "Enable verbose logging",
|
|
@@ -316,13 +352,14 @@ const jsonArgs = { json: {
|
|
|
316
352
|
* - Error handling with formatted output
|
|
317
353
|
* - Exit code management
|
|
318
354
|
* @template T
|
|
319
|
-
* @param
|
|
320
|
-
* @returns
|
|
355
|
+
* @param handler - Command handler function
|
|
356
|
+
* @returns Wrapped handler
|
|
321
357
|
*/
|
|
322
|
-
const withCommonArgs = (handler) => async (
|
|
358
|
+
const withCommonArgs = (handler) => async (context) => {
|
|
359
|
+
const { args } = context;
|
|
323
360
|
try {
|
|
324
361
|
if ("json" in args && typeof args.json === "boolean") logger.jsonMode = args.json;
|
|
325
|
-
|
|
362
|
+
loadEnvFiles(args["env-file"], args["env-file-if-exists"]);
|
|
326
363
|
await handler(args);
|
|
327
364
|
} catch (error) {
|
|
328
365
|
if (isCLIError(error)) {
|
|
@@ -440,7 +477,7 @@ const file_tailor_v1_secret_manager_resource = /* @__PURE__ */ fileDesc("Cid0YWl
|
|
|
440
477
|
/**
|
|
441
478
|
* Describes the file tailor/v1/auth_resource.proto.
|
|
442
479
|
*/
|
|
443
|
-
const file_tailor_v1_auth_resource = /* @__PURE__ */ fileDesc("
|
|
480
|
+
const file_tailor_v1_auth_resource = /* @__PURE__ */ fileDesc("Ch10YWlsb3IvdjEvYXV0aF9yZXNvdXJjZS5wcm90bxIJdGFpbG9yLnYxIlYKC0F1dGhTZXJ2aWNlEicKCW5hbWVzcGFjZRgBIAEoCzIULnRhaWxvci52MS5OYW1lc3BhY2USHgoWcHVibGlzaF9zZXNzaW9uX2V2ZW50cxgCIAEoCCK0BgoNQXV0aElEUENvbmZpZxI2CgRuYW1lGAEgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjQKCWF1dGhfdHlwZRgCIAEoDjIhLnRhaWxvci52MS5BdXRoSURQQ29uZmlnLkF1dGhUeXBlEi8KBmNvbmZpZxgDIAEoCzIfLnRhaWxvci52MS5BdXRoSURQQ29uZmlnLkNvbmZpZxq4AQoGQ29uZmlnEjMKBG9pZGMYASABKAsyIy50YWlsb3IudjEuQXV0aElEUENvbmZpZy5PSURDQ29uZmlnSAASMwoEc2FtbBgCIAEoCzIjLnRhaWxvci52MS5BdXRoSURQQ29uZmlnLlNBTUxDb25maWdIABI6CghpZF90b2tlbhgDIAEoCzImLnRhaWxvci52MS5BdXRoSURQQ29uZmlnLklEVG9rZW5Db25maWdIAEIICgZjb25maWcamAEKCk9JRENDb25maWcSFQoNY2xpZW50X2lkX2tleRgBIAEoCRIxChFjbGllbnRfc2VjcmV0X2tleRgCIAEoCzIWLnRhaWxvci52MS5TZWNyZXRWYWx1ZRIUCgxwcm92aWRlcl91cmwYAyABKAkSEgoKaXNzdWVyX3VybBgEIAEoCRIWCg51c2VybmFtZV9jbGFpbRgFIAEoCRphCgpTQU1MQ29uZmlnEhQKDG1ldGFkYXRhX3VybBgBIAEoCRIUCgxyYXdfbWV0YWRhdGEYBCABKAkSGwoTZW5hYmxlX3NpZ25fcmVxdWVzdBgFIAEoCEoECAIQA0oECAMQBBpkCg1JRFRva2VuQ29uZmlnEhQKDHByb3ZpZGVyX3VybBgBIAEoCRIRCgljbGllbnRfaWQYAiABKAkSEgoKaXNzdWVyX3VybBgDIAEoCRIWCg51c2VybmFtZV9jbGFpbRgEIAEoCSJlCghBdXRoVHlwZRIZChVBVVRIX1RZUEVfVU5TUEVDSUZJRUQQABISCg5BVVRIX1RZUEVfT0lEQxABEhIKDkFVVEhfVFlQRV9TQU1MEAISFgoSQVVUSF9UWVBFX0lEX1RPS0VOEAMirQYKGVVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcSFAoIcHJvdmlkZXIYASABKAlCAhgBElMKDXByb3ZpZGVyX3R5cGUYAiABKA4yPC50YWlsb3IudjEuVXNlclByb2ZpbGVQcm92aWRlckNvbmZpZy5Vc2VyUHJvZmlsZVByb3ZpZGVyVHlwZRI7CgZjb25maWcYAyABKAsyKy50YWlsb3IudjEuVXNlclByb2ZpbGVQcm92aWRlckNvbmZpZy5Db25maWcaYwoGQ29uZmlnEk8KCHRhaWxvcmRiGAEgASgLMjsudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcuVGFpbG9yREJQcm92aWRlckNvbmZpZ0gAQggKBmNvbmZpZxqSAwoWVGFpbG9yREJQcm92aWRlckNvbmZpZxI7CgluYW1lc3BhY2UYASABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLQoEdHlwZRgCIAEoCUIfukgcchoyGF5bQS1aXVthLXpBLVowLTldezAsNjJ9JBIWCg51c2VybmFtZV9maWVsZBgDIAEoCRIZChFhdHRyaWJ1dGVzX2ZpZWxkcxgEIAMoCRIXCg90ZW5hbnRfaWRfZmllbGQYBSABKAkSigEKDWF0dHJpYnV0ZV9tYXAYBiADKAsyTS50YWlsb3IudjEuVXNlclByb2ZpbGVQcm92aWRlckNvbmZpZy5UYWlsb3JEQlByb3ZpZGVyQ29uZmlnLkF0dHJpYnV0ZU1hcEVudHJ5QiS6SCGaAR4iHHIaMhheW2Etel1bMC05YS16QS1aXXswLDYyfSQaMwoRQXR0cmlidXRlTWFwRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJuChdVc2VyUHJvZmlsZVByb3ZpZGVyVHlwZRIqCiZVU0VSX1BST0ZJTEVfUFJPVklERVJfVFlQRV9VTlNQRUNJRklFRBAAEicKI1VTRVJfUFJPRklMRV9QUk9WSURFUl9UWVBFX1RBSUxPUkRCEAEivgMKFFRlbmFudFByb3ZpZGVyQ29uZmlnEhAKCHByb3ZpZGVyGAEgASgJEkkKDXByb3ZpZGVyX3R5cGUYAiABKA4yMi50YWlsb3IudjEuVGVuYW50UHJvdmlkZXJDb25maWcuVGVuYW50UHJvdmlkZXJUeXBlEjYKBmNvbmZpZxgDIAEoCzImLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZy5Db25maWcaXgoGQ29uZmlnEkoKCHRhaWxvcmRiGAEgASgLMjYudGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnLlRhaWxvckRCUHJvdmlkZXJDb25maWdIAEIICgZjb25maWcaUgoWVGFpbG9yREJQcm92aWRlckNvbmZpZxIRCgluYW1lc3BhY2UYASABKAkSDAoEdHlwZRgCIAEoCRIXCg9zaWduYXR1cmVfZmllbGQYAyABKAkiXQoSVGVuYW50UHJvdmlkZXJUeXBlEiQKIFRFTkFOVF9QUk9WSURFUl9UWVBFX1VOU1BFQ0lGSUVEEAASIQodVEVOQU5UX1BST1ZJREVSX1RZUEVfVEFJTE9SREIQASI7CgtBdXRoSW52b2tlchIRCgluYW1lc3BhY2UYASABKAkSGQoRbWFjaGluZV91c2VyX25hbWUYAiABKAkiSAoTUGVyc29uYWxBY2Nlc3NUb2tlbhIMCgRuYW1lGAEgASgJEiMKBnNjb3BlcxgCIAMoDjITLnRhaWxvci52MS5QQVRTY29wZSLGAwoLTWFjaGluZVVzZXISCgoCaWQYASABKAkSNgoEbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIWCgljbGllbnRfaWQYAyABKAlCA+BBAxIaCg1jbGllbnRfc2VjcmV0GAQgASgJQgPgQQMSIQoKYXR0cmlidXRlcxgFIAMoCUINukgKkgEHIgVyA7ABARIzCgpjcmVhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEjMKCnVwZGF0ZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSZQoNYXR0cmlidXRlX21hcBgIIAMoCzIoLnRhaWxvci52MS5NYWNoaW5lVXNlci5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEi3gIKDkF1dGhTQ0lNQ29uZmlnEkMKEW1hY2hpbmVfdXNlcl9uYW1lGAEgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEkcKEmF1dGhvcml6YXRpb25fdHlwZRgCIAEoDjIrLnRhaWxvci52MS5BdXRoU0NJTUNvbmZpZy5BdXRob3JpemF0aW9uVHlwZRIvCg1iZWFyZXJfc2VjcmV0GAogASgLMhYudGFpbG9yLnYxLlNlY3JldFZhbHVlSAAidQoRQXV0aG9yaXphdGlvblR5cGUSIgoeQVVUSE9SSVpBVElPTl9UWVBFX1VOU1BFQ0lGSUVEEAASHQoZQVVUSE9SSVpBVElPTl9UWVBFX0JFQVJFUhABEh0KGUFVVEhPUklaQVRJT05fVFlQRV9PQVVUSDIQAkIWChRhdXRob3JpemF0aW9uX2NvbmZpZyLDAgoQQXV0aFNDSU1SZXNvdXJjZRI/CgRuYW1lGAEgASgJQjG6SC5yLDIqXltBLVphLXowLTldW0EtWmEtejAtOS1dezEsNjF9W0EtWmEtejAtOV0kEkUKE3RhaWxvcl9kYl9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNwoOdGFpbG9yX2RiX3R5cGUYAyABKAlCH7pIHHIaMhheW0EtWl1bYS16QS1aMC05XXswLDYyfSQSPgoRYXR0cmlidXRlX21hcHBpbmcYBCADKAsyIy50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGVNYXBwaW5nEi4KC2NvcmVfc2NoZW1hGAUgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNU2NoZW1hIkYKGEF1dGhTQ0lNQXR0cmlidXRlTWFwcGluZxIXCg90YWlsb3JfZGJfZmllbGQYASABKAkSEQoJc2NpbV9wYXRoGAIgASgJIlAKDkF1dGhTQ0lNU2NoZW1hEgwKBG5hbWUYASABKAkSMAoKYXR0cmlidXRlcxgCIAMoCzIcLnRhaWxvci52MS5BdXRoU0NJTUF0dHJpYnV0ZSLZBQoRQXV0aFNDSU1BdHRyaWJ1dGUSLwoEdHlwZRgBIAEoDjIhLnRhaWxvci52MS5BdXRoU0NJTUF0dHJpYnV0ZS5UeXBlEi4KBG5hbWUYAiABKAlCILpIHXIbMhleW0EtWmEtel1bYS16QS1aMC05XyQtXSokEhMKC2Rlc2NyaXB0aW9uGAMgASgJEjsKCm11dGFiaWxpdHkYBCABKA4yJy50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGUuTXV0YWJpbGl0eRIQCghyZXF1aXJlZBgFIAEoCBIUCgxtdWx0aV92YWx1ZWQYBiABKAgSOwoKdW5pcXVlbmVzcxgHIAEoDjInLnRhaWxvci52MS5BdXRoU0NJTUF0dHJpYnV0ZS5VbmlxdWVuZXNzEhgKEGNhbm9uaWNhbF92YWx1ZXMYCCADKAkSNAoOc3ViX2F0dHJpYnV0ZXMYCSADKAsyHC50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGUidQoEVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASEAoMVFlQRV9DT01QTEVYEAESDwoLVFlQRV9TVFJJTkcQAhIPCgtUWVBFX05VTUJFUhADEhAKDFRZUEVfQk9PTEVBThAEEhEKDVRZUEVfREFURVRJTUUQBSJ4CgpNdXRhYmlsaXR5EhoKFk1VVEFCSUxJVFlfVU5TUEVDSUZJRUQQABIYChRNVVRBQklMSVRZX1JFQURfT05MWRABEhkKFU1VVEFCSUxJVFlfUkVBRF9XUklURRACEhkKFU1VVEFCSUxJVFlfV1JJVEVfT05MWRADImsKClVuaXF1ZW5lc3MSGgoWVU5JUVVFTkVTU19VTlNQRUNJRklFRBAAEhMKD1VOSVFVRU5FU1NfTk9ORRABEhUKEVVOSVFVRU5FU1NfU0VSVkVSEAISFQoRVU5JUVVFTkVTU19HTE9CQUwQAyK+BAoOQXV0aENvbm5lY3Rpb24SNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIsCgR0eXBlGAIgASgOMh4udGFpbG9yLnYxLkF1dGhDb25uZWN0aW9uLlR5cGUSRgoGb2F1dGgyGAMgASgLMjQudGFpbG9yLnYxLkF1dGhDb25uZWN0aW9uLkF1dGhDb25uZWN0aW9uT0F1dGgyQ29uZmlnSAASMwoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxqIAgoaQXV0aENvbm5lY3Rpb25PQXV0aDJDb25maWcSFAoMcHJvdmlkZXJfdXJsGAEgASgJEhIKCmlzc3Vlcl91cmwYAiABKAkSEQoJY2xpZW50X2lkGAMgASgJEhoKDWNsaWVudF9zZWNyZXQYBCABKAlCA+BBBBJHCghhdXRoX3VybBgFIAEoCUI1ukgy2AEBci0yKF5odHRwczovL1tBLVphLXowLTkuLV0rKDpbMC05XSspPygvLiopPySIAQESSAoJdG9rZW5fdXJsGAYgASgJQjW6SDLYAQFyLTIoXmh0dHBzOi8vW0EtWmEtejAtOS4tXSsoOlswLTldKyk/KC8uKik/JIgBASItCgRUeXBlEhQKEFRZUEVfVU5TUEVDSUZJRUQQABIPCgtUWVBFX09BVVRIMhABQg8KBmNvbmZpZxIFukgCCAEi0AUKEEF1dGhPQXV0aDJDbGllbnQSDAoEbmFtZRgBIAEoCRITCgtkZXNjcmlwdGlvbhgCIAEoCRI6CgtncmFudF90eXBlcxgDIAMoDjIlLnRhaWxvci52MS5BdXRoT0F1dGgyQ2xpZW50LkdyYW50VHlwZRIVCg1yZWRpcmVjdF91cmlzGAQgAygJEhYKCWNsaWVudF9pZBgFIAEoCUID4EEDEhoKDWNsaWVudF9zZWNyZXQYBiABKAlCA+BBAxIzCgpjcmVhdGVkX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEkoKC2NsaWVudF90eXBlGAggASgOMiYudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQuQ2xpZW50VHlwZUINukgK2AEBggEEEAEgABJKChVhY2Nlc3NfdG9rZW5fbGlmZXRpbWUYCSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CELpIDaoBCiIECICjBTICCDwSSwoWcmVmcmVzaF90b2tlbl9saWZldGltZRgKIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkIQukgNqgEKIgQIgPUkMgIIPBIUCgxyZXF1aXJlX2Rwb3AYCyABKAgiaAoJR3JhbnRUeXBlEhoKFkdSQU5UX1RZUEVfVU5TUEVDSUZJRUQQABIhCh1HUkFOVF9UWVBFX0FVVEhPUklaQVRJT05fQ09ERRABEhwKGEdSQU5UX1RZUEVfUkVGUkVTSF9UT0tFThACIngKCkNsaWVudFR5cGUSGwoXQ0xJRU5UX1RZUEVfVU5TUEVDSUZJRUQQABIcChhDTElFTlRfVFlQRV9DT05GSURFTlRJQUwQARIWChJDTElFTlRfVFlQRV9QVUJMSUMQAhIXChNDTElFTlRfVFlQRV9CUk9XU0VSEAMitwEKF0NvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEg8KAmlkGAEgASgJQgPgQQMSDAoEbmFtZRgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRIcCg9vcmdhbml6YXRpb25faWQYBCABKAlCA+BBAxIWCglmb2xkZXJfaWQYBSABKAlCA+BBAxIWCgljbGllbnRfaWQYBiABKAlCA+BBAxIaCg1jbGllbnRfc2VjcmV0GAcgASgJQgPgQQMqTgoIUEFUU2NvcGUSGQoVUEFUX1NDT1BFX1VOU1BFQ0lGSUVEEAASEgoOUEFUX1NDT1BFX1JFQUQQARITCg9QQVRfU0NPUEVfV1JJVEUQAmIGcHJvdG8z", [
|
|
444
481
|
file_buf_validate_validate,
|
|
445
482
|
file_google_api_field_behavior,
|
|
446
483
|
file_google_protobuf_duration,
|
|
@@ -540,7 +577,7 @@ const PATScope = /* @__PURE__ */ tsEnum(PATScopeSchema);
|
|
|
540
577
|
/**
|
|
541
578
|
* Describes the file tailor/v1/auth.proto.
|
|
542
579
|
*/
|
|
543
|
-
const file_tailor_v1_auth = /* @__PURE__ */ fileDesc("ChR0YWlsb3IvdjEvYXV0aC5wcm90bxIJdGFpbG9yLnYxInwKGENyZWF0ZUF1dGhTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIkkKGUNyZWF0ZUF1dGhTZXJ2aWNlUmVzcG9uc2USLAoMYXV0aF9zZXJ2aWNlGAEgASgLMhYudGFpbG9yLnYxLkF1dGhTZXJ2aWNlInwKGERlbGV0ZUF1dGhTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIhsKGURlbGV0ZUF1dGhTZXJ2aWNlUmVzcG9uc2UieQoVR2V0QXV0aFNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiRgoWR2V0QXV0aFNlcnZpY2VSZXNwb25zZRIsCgxhdXRoX3NlcnZpY2UYASABKAsyFi50YWlsb3IudjEuQXV0aFNlcnZpY2UikgEKF0xpc3RBdXRoU2VydmljZXNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ3ChhMaXN0QXV0aFNlcnZpY2VzUmVzcG9uc2USLQoNYXV0aF9zZXJ2aWNlcxgBIAMoCzIWLnRhaWxvci52MS5BdXRoU2VydmljZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirAEKGkNyZWF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG0NyZWF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcirAEKGlVwZGF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG1VwZGF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcitgEKGkRlbGV0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIdChtEZWxldGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiswEKF0dldEF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJIChhHZXRBdXRoSURQQ29uZmlnUmVzcG9uc2USLAoKaWRwX2NvbmZpZxgBIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnItYBChlMaXN0QXV0aElEUENvbmZpZ3NSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEgoKcGFnZV90b2tlbhgDIAEoCRIRCglwYWdlX3NpemUYBCABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBSABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ5ChpMaXN0QXV0aElEUENvbmZpZ3NSZXNwb25zZRItCgtpZHBfY29uZmlncxgBIAMoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyLOAQoeQ3JlYXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgDIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIm0KH0NyZWF0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2USSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIs4BCh5VcGRhdGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAMgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcibQofVXBkYXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWciggEKHkRlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIiEKH0RlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UifwobR2V0VXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiagocR2V0VXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcixgEKGUNyZWF0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJHChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAMgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnQga6SAPIAQEiXQoaQ3JlYXRlVGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyLGAQoZVXBkYXRlVGVuYW50Q29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEkcKFnRlbmFudF9wcm92aWRlcl9jb25maWcYAyABKAsyHy50YWlsb3IudjEuVGVuYW50UHJvdmlkZXJDb25maWdCBrpIA8gBASJdChpVcGRhdGVUZW5hbnRDb25maWdSZXNwb25zZRI/ChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAEgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnIn0KGURlbGV0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIcChpEZWxldGVUZW5hbnRDb25maWdSZXNwb25zZSJ6ChZHZXRUZW5hbnRDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiWgoXR2V0VGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyKSAQogQ3JlYXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI2CgZzY29wZXMYAiADKA4yEy50YWlsb3IudjEuUEFUU2NvcGVCEbpIDpIBCwgBIgeCAQQQASAAIjkKIUNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZRIUCgxhY2Nlc3NfdG9rZW4YASABKAkiWgogRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIjCiFEZWxldGVQZXJzb25hbEFjY2Vzc1Rva2VuUmVzcG9uc2UiegofTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uIpABCiBMaXN0UGVyc29uYWxBY2Nlc3NUb2tlbnNSZXNwb25zZRI+ChZwZXJzb25hbF9hY2Nlc3NfdG9rZW5zGAEgAygLMh4udGFpbG9yLnYxLlBlcnNvbmFsQWNjZXNzVG9rZW4SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIqMDChxDcmVhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQwoOYXV0aF9uYW1lc3BhY2UYAiABKAlCK7pIKHImMiReKFthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0pPyQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIqADChxVcGRhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIrgBChxEZWxldGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIfCh1EZWxldGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSK1AQoZR2V0QXV0aE1hY2hpbmVVc2VyUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDmF1dGhfbmFtZXNwYWNlGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSgoaR2V0QXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyItgBChtMaXN0QXV0aE1hY2hpbmVVc2Vyc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5hdXRoX25hbWVzcGFjZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBISCgpwYWdlX3Rva2VuGAMgASgJEhEKCXBhZ2Vfc2l6ZRgEIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgFIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uInsKHExpc3RBdXRoTWFjaGluZVVzZXJzUmVzcG9uc2USLQoNbWFjaGluZV91c2VycxgBIAMoCzIWLnRhaWxvci52MS5NYWNoaW5lVXNlchIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirwEKG0NyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHENyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcirwEKG1VwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHFVwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcifAoYR2V0QXV0aFNDSU1Db25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSwoZR2V0QXV0aFNDSU1Db25maWdSZXNwb25zZRIuCgtzY2ltX2NvbmZpZxgBIAEoCzIZLnRhaWxvci52MS5BdXRoU0NJTUNvbmZpZyJ/ChtEZWxldGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIeChxEZWxldGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIrUBCh1DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIrUBCh1VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIo8BCh1EZWxldGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIrYBChpHZXRBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlEjIKDXNjaW1fcmVzb3VyY2UYASABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJ/ChtHZXRBdXRoU0NJTVJlc291cmNlc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJTChxHZXRBdXRoU0NJTVJlc291cmNlc1Jlc3BvbnNlEjMKDnNjaW1fcmVzb3VyY2VzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhTQ0lNUmVzb3VyY2UidAobQ3JlYXRlQXV0aENvbm5lY3Rpb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESNQoKY29ubmVjdGlvbhgCIAEoCzIZLnRhaWxvci52MS5BdXRoQ29ubmVjdGlvbkIGukgDyAEBIh4KHENyZWF0ZUF1dGhDb25uZWN0aW9uUmVzcG9uc2UilQEKGkxpc3RBdXRoQ29ubmVjdGlvbnNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ7ChtMaXN0QXV0aENvbm5lY3Rpb25zUmVzcG9uc2USLgoLY29ubmVjdGlvbnMYASADKAsyGS50YWlsb3IudjEuQXV0aENvbm5lY3Rpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIoABChtSZXZva2VBdXRoQ29ubmVjdGlvblJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiHgocUmV2b2tlQXV0aENvbm5lY3Rpb25SZXNwb25zZSLmAQokUmVnaXN0ZXJBdXRoQ29ubmVjdGlvblNlc3Npb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQQoPY29ubmVjdGlvbl9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhQKDGFjY2Vzc190b2tlbhgDIAEoCRIVCg1yZWZyZXNoX3Rva2VuGAQgASgJEi4KCmV4cGlyZXNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIicKJVJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uUmVzcG9uc2Ui1wEKLkV4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSIwoSYXV0aG9yaXphdGlvbl9jb2RlGAMgASgJQge6SARyAhABEh0KDHJlZGlyZWN0X3VyaRgEIAEoCUIHukgEcgIQASIxCi9FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXNwb25zZSKLAQodQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKLAQodVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCJlCh1EZWxldGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIrYBChpHZXRBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKvAQocTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24iggEKHUxpc3RBdXRoT0F1dGgyQ2xpZW50c1Jlc3BvbnNlEjMKDm9hdXRoMl9jbGllbnRzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIrYBCiRDcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEwoLZGVzY3JpcHRpb24YBCABKAkiYQolQ3JlYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIi/AEKJFVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABARI7CgRuYW1lGAQgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kSACIAQESGAoLZGVzY3JpcHRpb24YBSABKAlIAYgBAUIHCgVfbmFtZUIOCgxfZGVzY3JpcHRpb24iYQolVXBkYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIiiQEKIUdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABASJeCiJHZXRDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlEjgKDG1hY2hpbmVfdXNlchgBIAEoCzIiLnRhaWxvci52MS5Db250cm9scGxhbmVNYWNoaW5lVXNlciLBAQojTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2Vyc1JlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24ijwEKJExpc3RDb250cm9scGxhbmVNYWNoaW5lVXNlcnNSZXNwb25zZRI5Cg1tYWNoaW5lX3VzZXJzGAEgAygLMiIudGFpbG9yLnYxLkNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyKMAQokRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESHgoJZm9sZGVyX2lkGAIgASgJQgu6SAjYAQFyA7ABARIhCg9tYWNoaW5lX3VzZXJfaWQYAyABKAlCCLpIBXIDsAEBIicKJURlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2ViBnByb3RvMw", [
|
|
580
|
+
const file_tailor_v1_auth = /* @__PURE__ */ fileDesc("ChR0YWlsb3IvdjEvYXV0aC5wcm90bxIJdGFpbG9yLnYxIpwBChhDcmVhdGVBdXRoU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIeChZwdWJsaXNoX3Nlc3Npb25fZXZlbnRzGAMgASgIIkkKGUNyZWF0ZUF1dGhTZXJ2aWNlUmVzcG9uc2USLAoMYXV0aF9zZXJ2aWNlGAEgASgLMhYudGFpbG9yLnYxLkF1dGhTZXJ2aWNlIpwBChhVcGRhdGVBdXRoU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIeChZwdWJsaXNoX3Nlc3Npb25fZXZlbnRzGAMgASgIIkkKGVVwZGF0ZUF1dGhTZXJ2aWNlUmVzcG9uc2USLAoMYXV0aF9zZXJ2aWNlGAEgASgLMhYudGFpbG9yLnYxLkF1dGhTZXJ2aWNlInwKGERlbGV0ZUF1dGhTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIhsKGURlbGV0ZUF1dGhTZXJ2aWNlUmVzcG9uc2UieQoVR2V0QXV0aFNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiRgoWR2V0QXV0aFNlcnZpY2VSZXNwb25zZRIsCgxhdXRoX3NlcnZpY2UYASABKAsyFi50YWlsb3IudjEuQXV0aFNlcnZpY2UikgEKF0xpc3RBdXRoU2VydmljZXNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ3ChhMaXN0QXV0aFNlcnZpY2VzUmVzcG9uc2USLQoNYXV0aF9zZXJ2aWNlcxgBIAMoCzIWLnRhaWxvci52MS5BdXRoU2VydmljZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirAEKGkNyZWF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG0NyZWF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcirAEKGlVwZGF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG1VwZGF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcitgEKGkRlbGV0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIdChtEZWxldGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiswEKF0dldEF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJIChhHZXRBdXRoSURQQ29uZmlnUmVzcG9uc2USLAoKaWRwX2NvbmZpZxgBIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnItYBChlMaXN0QXV0aElEUENvbmZpZ3NSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEgoKcGFnZV90b2tlbhgDIAEoCRIRCglwYWdlX3NpemUYBCABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBSABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ5ChpMaXN0QXV0aElEUENvbmZpZ3NSZXNwb25zZRItCgtpZHBfY29uZmlncxgBIAMoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyLOAQoeQ3JlYXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgDIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIm0KH0NyZWF0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2USSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIs4BCh5VcGRhdGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAMgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcibQofVXBkYXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWciggEKHkRlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIiEKH0RlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UifwobR2V0VXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiagocR2V0VXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcixgEKGUNyZWF0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJHChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAMgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnQga6SAPIAQEiXQoaQ3JlYXRlVGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyLGAQoZVXBkYXRlVGVuYW50Q29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEkcKFnRlbmFudF9wcm92aWRlcl9jb25maWcYAyABKAsyHy50YWlsb3IudjEuVGVuYW50UHJvdmlkZXJDb25maWdCBrpIA8gBASJdChpVcGRhdGVUZW5hbnRDb25maWdSZXNwb25zZRI/ChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAEgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnIn0KGURlbGV0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIcChpEZWxldGVUZW5hbnRDb25maWdSZXNwb25zZSJ6ChZHZXRUZW5hbnRDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiWgoXR2V0VGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyKSAQogQ3JlYXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI2CgZzY29wZXMYAiADKA4yEy50YWlsb3IudjEuUEFUU2NvcGVCEbpIDpIBCwgBIgeCAQQQASAAIjkKIUNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZRIUCgxhY2Nlc3NfdG9rZW4YASABKAkiWgogRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIjCiFEZWxldGVQZXJzb25hbEFjY2Vzc1Rva2VuUmVzcG9uc2UiegofTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uIpABCiBMaXN0UGVyc29uYWxBY2Nlc3NUb2tlbnNSZXNwb25zZRI+ChZwZXJzb25hbF9hY2Nlc3NfdG9rZW5zGAEgAygLMh4udGFpbG9yLnYxLlBlcnNvbmFsQWNjZXNzVG9rZW4SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIqMDChxDcmVhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQwoOYXV0aF9uYW1lc3BhY2UYAiABKAlCK7pIKHImMiReKFthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0pPyQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIqADChxVcGRhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIrgBChxEZWxldGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIfCh1EZWxldGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSK1AQoZR2V0QXV0aE1hY2hpbmVVc2VyUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDmF1dGhfbmFtZXNwYWNlGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSgoaR2V0QXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyItgBChtMaXN0QXV0aE1hY2hpbmVVc2Vyc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5hdXRoX25hbWVzcGFjZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBISCgpwYWdlX3Rva2VuGAMgASgJEhEKCXBhZ2Vfc2l6ZRgEIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgFIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uInsKHExpc3RBdXRoTWFjaGluZVVzZXJzUmVzcG9uc2USLQoNbWFjaGluZV91c2VycxgBIAMoCzIWLnRhaWxvci52MS5NYWNoaW5lVXNlchIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirwEKG0NyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHENyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcirwEKG1VwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHFVwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcifAoYR2V0QXV0aFNDSU1Db25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSwoZR2V0QXV0aFNDSU1Db25maWdSZXNwb25zZRIuCgtzY2ltX2NvbmZpZxgBIAEoCzIZLnRhaWxvci52MS5BdXRoU0NJTUNvbmZpZyJ/ChtEZWxldGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIeChxEZWxldGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIrUBCh1DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIrUBCh1VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIo8BCh1EZWxldGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIrYBChpHZXRBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlEjIKDXNjaW1fcmVzb3VyY2UYASABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJ/ChtHZXRBdXRoU0NJTVJlc291cmNlc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJTChxHZXRBdXRoU0NJTVJlc291cmNlc1Jlc3BvbnNlEjMKDnNjaW1fcmVzb3VyY2VzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhTQ0lNUmVzb3VyY2UidAobQ3JlYXRlQXV0aENvbm5lY3Rpb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESNQoKY29ubmVjdGlvbhgCIAEoCzIZLnRhaWxvci52MS5BdXRoQ29ubmVjdGlvbkIGukgDyAEBIh4KHENyZWF0ZUF1dGhDb25uZWN0aW9uUmVzcG9uc2UilQEKGkxpc3RBdXRoQ29ubmVjdGlvbnNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ7ChtMaXN0QXV0aENvbm5lY3Rpb25zUmVzcG9uc2USLgoLY29ubmVjdGlvbnMYASADKAsyGS50YWlsb3IudjEuQXV0aENvbm5lY3Rpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIoABChtSZXZva2VBdXRoQ29ubmVjdGlvblJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiHgocUmV2b2tlQXV0aENvbm5lY3Rpb25SZXNwb25zZSLmAQokUmVnaXN0ZXJBdXRoQ29ubmVjdGlvblNlc3Npb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQQoPY29ubmVjdGlvbl9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhQKDGFjY2Vzc190b2tlbhgDIAEoCRIVCg1yZWZyZXNoX3Rva2VuGAQgASgJEi4KCmV4cGlyZXNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIicKJVJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uUmVzcG9uc2Ui1wEKLkV4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSIwoSYXV0aG9yaXphdGlvbl9jb2RlGAMgASgJQge6SARyAhABEh0KDHJlZGlyZWN0X3VyaRgEIAEoCUIHukgEcgIQASIxCi9FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXNwb25zZSKLAQodQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKLAQodVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCJlCh1EZWxldGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIrYBChpHZXRBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKvAQocTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24iggEKHUxpc3RBdXRoT0F1dGgyQ2xpZW50c1Jlc3BvbnNlEjMKDm9hdXRoMl9jbGllbnRzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIrYBCiRDcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEwoLZGVzY3JpcHRpb24YBCABKAkiYQolQ3JlYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIi/AEKJFVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABARI7CgRuYW1lGAQgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kSACIAQESGAoLZGVzY3JpcHRpb24YBSABKAlIAYgBAUIHCgVfbmFtZUIOCgxfZGVzY3JpcHRpb24iYQolVXBkYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIiiQEKIUdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABASJeCiJHZXRDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlEjgKDG1hY2hpbmVfdXNlchgBIAEoCzIiLnRhaWxvci52MS5Db250cm9scGxhbmVNYWNoaW5lVXNlciLBAQojTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2Vyc1JlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24ijwEKJExpc3RDb250cm9scGxhbmVNYWNoaW5lVXNlcnNSZXNwb25zZRI5Cg1tYWNoaW5lX3VzZXJzGAEgAygLMiIudGFpbG9yLnYxLkNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyKMAQokRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESHgoJZm9sZGVyX2lkGAIgASgJQgu6SAjYAQFyA7ABARIhCg9tYWNoaW5lX3VzZXJfaWQYAyABKAlCCLpIBXIDsAEBIicKJURlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2ViBnByb3RvMw", [
|
|
544
581
|
file_buf_validate_validate,
|
|
545
582
|
file_google_protobuf_struct,
|
|
546
583
|
file_google_protobuf_timestamp,
|
|
@@ -908,7 +945,7 @@ const file_tailor_v1_workspace = /* @__PURE__ */ fileDesc("Chl0YWlsb3IvdjEvd29ya
|
|
|
908
945
|
/**
|
|
909
946
|
* Describes the file tailor/v1/service.proto.
|
|
910
947
|
*/
|
|
911
|
-
const file_tailor_v1_service = /* @__PURE__ */ fileDesc("Chd0YWlsb3IvdjEvc2VydmljZS5wcm90bxIJdGFpbG9yLnYxIg0KC1BpbmdSZXF1ZXN0Ig4KDFBpbmdSZXNwb25zZTKgswEKD09wZXJhdG9yU2VydmljZRI5CgRQaW5nEhYudGFpbG9yLnYxLlBpbmdSZXF1ZXN0GhcudGFpbG9yLnYxLlBpbmdSZXNwb25zZSIAEocBCh1MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9ucxIvLnRhaWxvci52MS5MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9uc1JlcXVlc3QaMC50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVJlZ2lvbnNSZXNwb25zZSIDkAIBEloKD0NyZWF0ZVdvcmtzcGFjZRIhLnRhaWxvci52MS5DcmVhdGVXb3Jrc3BhY2VSZXF1ZXN0GiIudGFpbG9yLnYxLkNyZWF0ZVdvcmtzcGFjZVJlc3BvbnNlIgASWgoPVXBkYXRlV29ya3NwYWNlEiEudGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVJlcXVlc3QaIi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUmVzcG9uc2UiABJaCg9EZWxldGVXb3Jrc3BhY2USIS50YWlsb3IudjEuRGVsZXRlV29ya3NwYWNlUmVxdWVzdBoiLnRhaWxvci52MS5EZWxldGVXb3Jrc3BhY2VSZXNwb25zZSIAEloKDkxpc3RXb3Jrc3BhY2VzEiAudGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdBohLnRhaWxvci52MS5MaXN0V29ya3NwYWNlc1Jlc3BvbnNlIgOQAgESfgoaTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXMSLC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25Xb3Jrc3BhY2VzUmVzcG9uc2UiA5ACARJdChBSZXN0b3JlV29ya3NwYWNlEiIudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXF1ZXN0GiMudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXNwb25zZSIAElQKDEdldFdvcmtzcGFjZRIeLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VSZXF1ZXN0Gh8udGFpbG9yLnYxLkdldFdvcmtzcGFjZVJlc3BvbnNlIgOQAgESfgoaTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnMSLC50YWlsb3IudjEuTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJzUmVzcG9uc2UiA5ACARKlAQonTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzEjkudGFpbG9yLnYxLkxpc3RBdmFpbGFibGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlc1JlcXVlc3QaOi50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzUmVzcG9uc2UiA5ACARJ+ChtJbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISLS50YWlsb3IudjEuSW52aXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBouLnRhaWxvci52MS5JbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIAEn4KG1JlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlchItLnRhaWxvci52MS5SZW1vdmVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXF1ZXN0Gi4udGFpbG9yLnYxLlJlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlc3BvbnNlIgASfgobVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyEi0udGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlcXVlc3QaLi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVzcG9uc2UiABJ4ChhHZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISKi50YWlsb3IudjEuR2V0V29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBorLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIDkAIBEmAKEEdldFdvcmtzcGFjZVJvbGUSIi50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlcXVlc3QaIy50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlc3BvbnNlIgOQAgESYwoSVXBkYXRlT3JnYW5pemF0aW9uEiQudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblJlcXVlc3QaJS50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uUmVzcG9uc2UiABJdCg9HZXRPcmdhbml6YXRpb24SIS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uUmVxdWVzdBoiLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25SZXNwb25zZSIDkAIBEmMKEUxpc3RPcmdhbml6YXRpb25zEiMudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25zUmVxdWVzdBokLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uc1Jlc3BvbnNlIgOQAgESbwoVTGlzdFVzZXJPcmdhbml6YXRpb25zEicudGFpbG9yLnYxLkxpc3RVc2VyT3JnYW5pemF0aW9uc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdFVzZXJPcmdhbml6YXRpb25zUmVzcG9uc2UiA5ACARJyChdHcmFudE9yZ2FuaXphdGlvbkFjY2VzcxIpLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKi50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25BY2Nlc3NSZXNwb25zZSIAEnUKGFVwZGF0ZU9yZ2FuaXphdGlvbkFjY2VzcxIqLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GisudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgASdQoYUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzEioudGFpbG9yLnYxLlJldm9rZU9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKy50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzUmVzcG9uc2UiABJ4ChhMaXN0T3JnYW5pemF0aW9uQWNjZXNzZXMSKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkFjY2Vzc2VzUmVxdWVzdBorLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uQWNjZXNzZXNSZXNwb25zZSIDkAIBEm8KFUdldE9yZ2FuaXphdGlvbkFjY2VzcxInLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GigudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgOQAgESdQoYQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyEioudGFpbG9yLnYxLkNyZWF0ZU9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKy50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiABJ1ChhVcGRhdGVPcmdhbml6YXRpb25Gb2xkZXISKi50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVxdWVzdBorLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJSZXNwb25zZSIAEnUKGERlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlchIqLnRhaWxvci52MS5EZWxldGVPcmdhbml6YXRpb25Gb2xkZXJSZXF1ZXN0GisudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlclJlc3BvbnNlIgASbwoVR2V0T3JnYW5pemF0aW9uRm9sZGVyEicudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiA5ACARJ1ChdMaXN0T3JnYW5pemF0aW9uRm9sZGVycxIpLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyc1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlcnNSZXNwb25zZSIDkAIBEoQBCh1HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2VzcxIvLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1JlcXVlc3QaMC50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEooBCh5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXMSMC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc2VzUmVxdWVzdBoxLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXNSZXNwb25zZSIDkAIBEoEBChtHZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSLS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBouLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZU9yZ2FuaXphdGlvblRlYW0SKC50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgASbwoWVXBkYXRlT3JnYW5pemF0aW9uVGVhbRIoLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVzcG9uc2UiABJvChZEZWxldGVPcmdhbml6YXRpb25UZWFtEigudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXNwb25zZSIAEmkKE0dldE9yZ2FuaXphdGlvblRlYW0SJS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaJi50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgOQAgESbwoVTGlzdE9yZ2FuaXphdGlvblRlYW1zEicudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25UZWFtc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1zUmVzcG9uc2UiA5ACARJ4ChlBZGRPcmdhbml6YXRpb25UZWFtTWVtYmVyEisudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0GiwudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxVcGRhdGVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxSZW1vdmVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChtMaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnMSLS50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1NZW1iZXJzUmVxdWVzdBouLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnNSZXNwb25zZSIDkAIBEnsKGUdldE9yZ2FuaXphdGlvblRlYW1NZW1iZXISKy50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlcXVlc3QaLC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlIgOQAgEScgoWR2V0UGxhdGZvcm1BY2NvdW50UGxhbhIoLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVxdWVzdBopLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBcHBsaWNhdGlvbhIjLnRhaWxvci52MS5DcmVhdGVBcHBsaWNhdGlvblJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXBwbGljYXRpb25SZXNwb25zZSIAEmAKEVVwZGF0ZUFwcGxpY2F0aW9uEiMudGFpbG9yLnYxLlVwZGF0ZUFwcGxpY2F0aW9uUmVxdWVzdBokLnRhaWxvci52MS5VcGRhdGVBcHBsaWNhdGlvblJlc3BvbnNlIgASYAoRRGVsZXRlQXBwbGljYXRpb24SIy50YWlsb3IudjEuRGVsZXRlQXBwbGljYXRpb25SZXF1ZXN0GiQudGFpbG9yLnYxLkRlbGV0ZUFwcGxpY2F0aW9uUmVzcG9uc2UiABJgChBMaXN0QXBwbGljYXRpb25zEiIudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXF1ZXN0GiMudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXNwb25zZSIDkAIBEloKDkdldEFwcGxpY2F0aW9uEiAudGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uUmVxdWVzdBohLnRhaWxvci52MS5HZXRBcHBsaWNhdGlvblJlc3BvbnNlIgOQAgESfgoaR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGgSLC50YWlsb3IudjEuR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGhSZXF1ZXN0Gi0udGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uU2NoZW1hSGVhbHRoUmVzcG9uc2UiA5ACARJjChJDb21wb3NlVGFpbG9yREJTREwSJC50YWlsb3IudjEuQ29tcG9zZVRhaWxvckRCU0RMUmVxdWVzdBolLnRhaWxvci52MS5Db21wb3NlVGFpbG9yREJTRExSZXNwb25zZSIAEmwKFUNyZWF0ZVRhaWxvckRCU2VydmljZRInLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCU2VydmljZVJlc3BvbnNlIgASbAoVVXBkYXRlVGFpbG9yREJTZXJ2aWNlEicudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuVXBkYXRlVGFpbG9yREJTZXJ2aWNlUmVzcG9uc2UiABJsChVEZWxldGVUYWlsb3JEQlNlcnZpY2USJy50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5EZWxldGVUYWlsb3JEQlNlcnZpY2VSZXNwb25zZSIAEmYKEkdldFRhaWxvckRCU2VydmljZRIkLnRhaWxvci52MS5HZXRUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GiUudGFpbG9yLnYxLkdldFRhaWxvckRCU2VydmljZVJlc3BvbnNlIgOQAgESbAoUTGlzdFRhaWxvckRCU2VydmljZXMSJi50YWlsb3IudjEuTGlzdFRhaWxvckRCU2VydmljZXNSZXF1ZXN0GicudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlNlcnZpY2VzUmVzcG9uc2UiA5ACARJjChJDcmVhdGVUYWlsb3JEQlR5cGUSJC50YWlsb3IudjEuQ3JlYXRlVGFpbG9yREJUeXBlUmVxdWVzdBolLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlR5cGVSZXNwb25zZSIAEmMKElVwZGF0ZVRhaWxvckRCVHlwZRIkLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQlR5cGVSZXF1ZXN0GiUudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoSRGVsZXRlVGFpbG9yREJUeXBlEiQudGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCVHlwZVJlcXVlc3QaJS50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJUeXBlUmVzcG9uc2UiABJsChVUcnVuY2F0ZVRhaWxvckRCVHlwZXMSJy50YWlsb3IudjEuVHJ1bmNhdGVUYWlsb3JEQlR5cGVzUmVxdWVzdBooLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZXNSZXNwb25zZSIAEmkKFFRydW5jYXRlVGFpbG9yREJUeXBlEiYudGFpbG9yLnYxLlRydW5jYXRlVGFpbG9yREJUeXBlUmVxdWVzdBonLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoRTGlzdFRhaWxvckRCVHlwZXMSIy50YWlsb3IudjEuTGlzdFRhaWxvckRCVHlwZXNSZXF1ZXN0GiQudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlR5cGVzUmVzcG9uc2UiA5ACARJdCg9HZXRUYWlsb3JEQlR5cGUSIS50YWlsb3IudjEuR2V0VGFpbG9yREJUeXBlUmVxdWVzdBoiLnRhaWxvci52MS5HZXRUYWlsb3JEQlR5cGVSZXNwb25zZSIDkAIBEn4KG0NyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASeAoYR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uEioudGFpbG9yLnYxLkdldFRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaKy50YWlsb3IudjEuR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiA5ACARJ+ChpMaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9ucxIsLnRhaWxvci52MS5MaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9uc1JlcXVlc3QaLS50YWlsb3IudjEuTGlzdFRhaWxvckRCR1FMUGVybWlzc2lvbnNSZXNwb25zZSIDkAIBEn4KG1VwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASfgobRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uEi0udGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaLi50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiABJsChVDcmVhdGVQaXBlbGluZVNlcnZpY2USJy50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5DcmVhdGVQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIAEmwKFVVwZGF0ZVBpcGVsaW5lU2VydmljZRInLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLlVwZGF0ZVBpcGVsaW5lU2VydmljZVJlc3BvbnNlIgASbAoVRGVsZXRlUGlwZWxpbmVTZXJ2aWNlEicudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuRGVsZXRlUGlwZWxpbmVTZXJ2aWNlUmVzcG9uc2UiABJmChJHZXRQaXBlbGluZVNlcnZpY2USJC50YWlsb3IudjEuR2V0UGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBolLnRhaWxvci52MS5HZXRQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIDkAIBEmwKFExpc3RQaXBlbGluZVNlcnZpY2VzEiYudGFpbG9yLnYxLkxpc3RQaXBlbGluZVNlcnZpY2VzUmVxdWVzdBonLnRhaWxvci52MS5MaXN0UGlwZWxpbmVTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESaQoTR2V0UGlwZWxpbmVSZXNvbHZlchIlLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVxdWVzdBomLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiA5ACARJvChVMaXN0UGlwZWxpbmVSZXNvbHZlcnMSJy50YWlsb3IudjEuTGlzdFBpcGVsaW5lUmVzb2x2ZXJzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlcnNSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZVBpcGVsaW5lUmVzb2x2ZXISKC50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlc3BvbnNlIgASbwoWVXBkYXRlUGlwZWxpbmVSZXNvbHZlchIoLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZEZWxldGVQaXBlbGluZVJlc29sdmVyEigudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXNwb25zZSIAEmMKEkNvbXBvc2VQaXBlbGluZVNETBIkLnRhaWxvci52MS5Db21wb3NlUGlwZWxpbmVTRExSZXF1ZXN0GiUudGFpbG9yLnYxLkNvbXBvc2VQaXBlbGluZVNETFJlc3BvbnNlIgASnAEKJExpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0cxI2LnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdHNSZXF1ZXN0GjcudGFpbG9yLnYxLkxpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0c1Jlc3BvbnNlIgOQAgESlgEKIkdldFBpcGVsaW5lUmVzb2x2ZXJFeGVjdXRpb25SZXN1bHQSNC50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlcXVlc3QaNS50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlc3BvbnNlIgOQAgEScgoXUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXISKS50YWlsb3IudjEuUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GioudGFpbG9yLnYxLlJlc3RhcnRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZDcmVhdGVTdGF0ZWZsb3dTZXJ2aWNlEigudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GikudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIAEm8KFlVwZGF0ZVN0YXRlZmxvd1NlcnZpY2USKC50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlc3BvbnNlIgASbwoWRGVsZXRlU3RhdGVmbG93U2VydmljZRIoLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVzcG9uc2UiABJpChNHZXRTdGF0ZWZsb3dTZXJ2aWNlEiUudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GiYudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIDkAIBEm8KFUxpc3RTdGF0ZWZsb3dTZXJ2aWNlcxInLnRhaWxvci52MS5MaXN0U3RhdGVmbG93U2VydmljZXNSZXF1ZXN0GigudGFpbG9yLnYxLkxpc3RTdGF0ZWZsb3dTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESbwoWQ3JlYXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChZVcGRhdGVFeGVjdXRvckV4ZWN1dG9yEigudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXNwb25zZSIAEmkKE0dldEV4ZWN1dG9yRXhlY3V0b3ISJS50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlcXVlc3QaJi50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlc3BvbnNlIgOQAgESbwoWRGVsZXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChVMaXN0RXhlY3V0b3JFeGVjdXRvcnMSJy50YWlsb3IudjEuTGlzdEV4ZWN1dG9yRXhlY3V0b3JzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0RXhlY3V0b3JFeGVjdXRvcnNSZXNwb25zZSIDkAIBEloKDkdldEV4ZWN1dG9ySm9iEiAudGFpbG9yLnYxLkdldEV4ZWN1dG9ySm9iUmVxdWVzdBohLnRhaWxvci52MS5HZXRFeGVjdXRvckpvYlJlc3BvbnNlIgOQAgESYAoQTGlzdEV4ZWN1dG9ySm9icxIiLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVxdWVzdBojLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVzcG9uc2UiA5ACARJ1ChdMaXN0RXhlY3V0b3JKb2JBdHRlbXB0cxIpLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JBdHRlbXB0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdEV4ZWN1dG9ySm9iQXR0ZW1wdHNSZXNwb25zZSIDkAIBEoQBChxMaXN0RXhlY3V0b3JJbmNvbWluZ1dlYmhvb2tzEi4udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXF1ZXN0Gi8udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXNwb25zZSIDkAIBEn4KGkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rEiwudGFpbG9yLnYxLkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rUmVxdWVzdBotLnRhaWxvci52MS5HZXRFeGVjdXRvckluY29taW5nV2ViaG9va1Jlc3BvbnNlIgOQAgESWgoPVHJpZ2dlckV4ZWN1dG9yEiEudGFpbG9yLnYxLlRyaWdnZXJFeGVjdXRvclJlcXVlc3QaIi50YWlsb3IudjEuVHJpZ2dlckV4ZWN1dG9yUmVzcG9uc2UiABJ1ChhDcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHQSKi50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclZhdWx0UmVxdWVzdBorLnRhaWxvci52MS5DcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHRSZXNwb25zZSIAEm8KFUdldFNlY3JldE1hbmFnZXJWYXVsdBInLnRhaWxvci52MS5HZXRTZWNyZXRNYW5hZ2VyVmF1bHRSZXF1ZXN0GigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJWYXVsdFJlc3BvbnNlIgOQAgESdQoYRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0EioudGFpbG9yLnYxLkRlbGV0ZVNlY3JldE1hbmFnZXJWYXVsdFJlcXVlc3QaKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0UmVzcG9uc2UiABJ1ChdMaXN0U2VjcmV0TWFuYWdlclZhdWx0cxIpLnRhaWxvci52MS5MaXN0U2VjcmV0TWFuYWdlclZhdWx0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJWYXVsdHNSZXNwb25zZSIDkAIBEngKGUNyZWF0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoZVXBkYXRlU2VjcmV0TWFuYWdlclNlY3JldBIrLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVxdWVzdBosLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVzcG9uc2UiABJyChZHZXRTZWNyZXRNYW5hZ2VyU2VjcmV0EigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXF1ZXN0GikudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXNwb25zZSIDkAIBEngKGURlbGV0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoYTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzEioudGFpbG9yLnYxLkxpc3RTZWNyZXRNYW5hZ2VyU2VjcmV0c1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBdXRoU2VydmljZRIjLnRhaWxvci52MS5DcmVhdGVBdXRoU2VydmljZVJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXV0aFNlcnZpY2VSZXNwb25zZSIAEmAKEURlbGV0ZUF1dGhTZXJ2aWNlEiMudGFpbG9yLnYxLkRlbGV0ZUF1dGhTZXJ2aWNlUmVxdWVzdBokLnRhaWxvci52MS5EZWxldGVBdXRoU2VydmljZVJlc3BvbnNlIgASWgoOR2V0QXV0aFNlcnZpY2USIC50YWlsb3IudjEuR2V0QXV0aFNlcnZpY2VSZXF1ZXN0GiEudGFpbG9yLnYxLkdldEF1dGhTZXJ2aWNlUmVzcG9uc2UiA5ACARJgChBMaXN0QXV0aFNlcnZpY2VzEiIudGFpbG9yLnYxLkxpc3RBdXRoU2VydmljZXNSZXF1ZXN0GiMudGFpbG9yLnYxLkxpc3RBdXRoU2VydmljZXNSZXNwb25zZSIDkAIBEmYKE0NyZWF0ZUF1dGhJRFBDb25maWcSJS50YWlsb3IudjEuQ3JlYXRlQXV0aElEUENvbmZpZ1JlcXVlc3QaJi50YWlsb3IudjEuQ3JlYXRlQXV0aElEUENvbmZpZ1Jlc3BvbnNlIgASZgoTVXBkYXRlQXV0aElEUENvbmZpZxIlLnRhaWxvci52MS5VcGRhdGVBdXRoSURQQ29uZmlnUmVxdWVzdBomLnRhaWxvci52MS5VcGRhdGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiABJmChNEZWxldGVBdXRoSURQQ29uZmlnEiUudGFpbG9yLnYxLkRlbGV0ZUF1dGhJRFBDb25maWdSZXF1ZXN0GiYudGFpbG9yLnYxLkRlbGV0ZUF1dGhJRFBDb25maWdSZXNwb25zZSIAEmAKEEdldEF1dGhJRFBDb25maWcSIi50YWlsb3IudjEuR2V0QXV0aElEUENvbmZpZ1JlcXVlc3QaIy50YWlsb3IudjEuR2V0QXV0aElEUENvbmZpZ1Jlc3BvbnNlIgOQAgESZgoSTGlzdEF1dGhJRFBDb25maWdzEiQudGFpbG9yLnYxLkxpc3RBdXRoSURQQ29uZmlnc1JlcXVlc3QaJS50YWlsb3IudjEuTGlzdEF1dGhJRFBDb25maWdzUmVzcG9uc2UiA5ACARJyChdDcmVhdGVVc2VyUHJvZmlsZUNvbmZpZxIpLnRhaWxvci52MS5DcmVhdGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QaKi50YWlsb3IudjEuQ3JlYXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZSIAEnIKF1VwZGF0ZVVzZXJQcm9maWxlQ29uZmlnEikudGFpbG9yLnYxLlVwZGF0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBoqLnRhaWxvci52MS5VcGRhdGVVc2VyUHJvZmlsZUNvbmZpZ1Jlc3BvbnNlIgAScgoXRGVsZXRlVXNlclByb2ZpbGVDb25maWcSKS50YWlsb3IudjEuRGVsZXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0GioudGFpbG9yLnYxLkRlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UiABJsChRHZXRVc2VyUHJvZmlsZUNvbmZpZxImLnRhaWxvci52MS5HZXRVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QaJy50YWlsb3IudjEuR2V0VXNlclByb2ZpbGVDb25maWdSZXNwb25zZSIDkAIBEmMKEkNyZWF0ZVRlbmFudENvbmZpZxIkLnRhaWxvci52MS5DcmVhdGVUZW5hbnRDb25maWdSZXF1ZXN0GiUudGFpbG9yLnYxLkNyZWF0ZVRlbmFudENvbmZpZ1Jlc3BvbnNlIgASYwoSVXBkYXRlVGVuYW50Q29uZmlnEiQudGFpbG9yLnYxLlVwZGF0ZVRlbmFudENvbmZpZ1JlcXVlc3QaJS50YWlsb3IudjEuVXBkYXRlVGVuYW50Q29uZmlnUmVzcG9uc2UiABJjChJEZWxldGVUZW5hbnRDb25maWcSJC50YWlsb3IudjEuRGVsZXRlVGVuYW50Q29uZmlnUmVxdWVzdBolLnRhaWxvci52MS5EZWxldGVUZW5hbnRDb25maWdSZXNwb25zZSIAEl0KD0dldFRlbmFudENvbmZpZxIhLnRhaWxvci52MS5HZXRUZW5hbnRDb25maWdSZXF1ZXN0GiIudGFpbG9yLnYxLkdldFRlbmFudENvbmZpZ1Jlc3BvbnNlIgOQAgESeAoZQ3JlYXRlUGVyc29uYWxBY2Nlc3NUb2tlbhIrLnRhaWxvci52MS5DcmVhdGVQZXJzb25hbEFjY2Vzc1Rva2VuUmVxdWVzdBosLnRhaWxvci52MS5DcmVhdGVQZXJzb25hbEFjY2Vzc1Rva2VuUmVzcG9uc2UiABJ4ChlEZWxldGVQZXJzb25hbEFjY2Vzc1Rva2VuEisudGFpbG9yLnYxLkRlbGV0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXF1ZXN0GiwudGFpbG9yLnYxLkRlbGV0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZSIAEngKGExpc3RQZXJzb25hbEFjY2Vzc1Rva2VucxIqLnRhaWxvci52MS5MaXN0UGVyc29uYWxBY2Nlc3NUb2tlbnNSZXF1ZXN0GisudGFpbG9yLnYxLkxpc3RQZXJzb25hbEFjY2Vzc1Rva2Vuc1Jlc3BvbnNlIgOQAgESbAoVQ3JlYXRlQXV0aE1hY2hpbmVVc2VyEicudGFpbG9yLnYxLkNyZWF0ZUF1dGhNYWNoaW5lVXNlclJlcXVlc3QaKC50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2UiABJsChVVcGRhdGVBdXRoTWFjaGluZVVzZXISJy50YWlsb3IudjEuVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdBooLnRhaWxvci52MS5VcGRhdGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSIAEmwKFURlbGV0ZUF1dGhNYWNoaW5lVXNlchInLnRhaWxvci52MS5EZWxldGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0GigudGFpbG9yLnYxLkRlbGV0ZUF1dGhNYWNoaW5lVXNlclJlc3BvbnNlIgASZgoSR2V0QXV0aE1hY2hpbmVVc2VyEiQudGFpbG9yLnYxLkdldEF1dGhNYWNoaW5lVXNlclJlcXVlc3QaJS50YWlsb3IudjEuR2V0QXV0aE1hY2hpbmVVc2VyUmVzcG9uc2UiA5ACARJsChRMaXN0QXV0aE1hY2hpbmVVc2VycxImLnRhaWxvci52MS5MaXN0QXV0aE1hY2hpbmVVc2Vyc1JlcXVlc3QaJy50YWlsb3IudjEuTGlzdEF1dGhNYWNoaW5lVXNlcnNSZXNwb25zZSIDkAIBEmkKFENyZWF0ZUF1dGhTQ0lNQ29uZmlnEiYudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBonLnRhaWxvci52MS5DcmVhdGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIgASaQoUVXBkYXRlQXV0aFNDSU1Db25maWcSJi50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1Db25maWdSZXF1ZXN0GicudGFpbG9yLnYxLlVwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2UiABJpChREZWxldGVBdXRoU0NJTUNvbmZpZxImLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QaJy50YWlsb3IudjEuRGVsZXRlQXV0aFNDSU1Db25maWdSZXNwb25zZSIAEmMKEUdldEF1dGhTQ0lNQ29uZmlnEiMudGFpbG9yLnYxLkdldEF1dGhTQ0lNQ29uZmlnUmVxdWVzdBokLnRhaWxvci52MS5HZXRBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIgOQAgESbwoWQ3JlYXRlQXV0aFNDSU1SZXNvdXJjZRIoLnRhaWxvci52MS5DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2UiABJvChZVcGRhdGVBdXRoU0NJTVJlc291cmNlEigudGFpbG9yLnYxLlVwZGF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXNwb25zZSIAEm8KFkRlbGV0ZUF1dGhTQ0lNUmVzb3VyY2USKC50YWlsb3IudjEuRGVsZXRlQXV0aFNDSU1SZXNvdXJjZVJlcXVlc3QaKS50YWlsb3IudjEuRGVsZXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIgASaQoTR2V0QXV0aFNDSU1SZXNvdXJjZRIlLnRhaWxvci52MS5HZXRBdXRoU0NJTVJlc291cmNlUmVxdWVzdBomLnRhaWxvci52MS5HZXRBdXRoU0NJTVJlc291cmNlUmVzcG9uc2UiA5ACARJsChRHZXRBdXRoU0NJTVJlc291cmNlcxImLnRhaWxvci52MS5HZXRBdXRoU0NJTVJlc291cmNlc1JlcXVlc3QaJy50YWlsb3IudjEuR2V0QXV0aFNDSU1SZXNvdXJjZXNSZXNwb25zZSIDkAIBEmkKFENyZWF0ZUF1dGhDb25uZWN0aW9uEiYudGFpbG9yLnYxLkNyZWF0ZUF1dGhDb25uZWN0aW9uUmVxdWVzdBonLnRhaWxvci52MS5DcmVhdGVBdXRoQ29ubmVjdGlvblJlc3BvbnNlIgASaQoTTGlzdEF1dGhDb25uZWN0aW9ucxIlLnRhaWxvci52MS5MaXN0QXV0aENvbm5lY3Rpb25zUmVxdWVzdBomLnRhaWxvci52MS5MaXN0QXV0aENvbm5lY3Rpb25zUmVzcG9uc2UiA5ACARJpChRSZXZva2VBdXRoQ29ubmVjdGlvbhImLnRhaWxvci52MS5SZXZva2VBdXRoQ29ubmVjdGlvblJlcXVlc3QaJy50YWlsb3IudjEuUmV2b2tlQXV0aENvbm5lY3Rpb25SZXNwb25zZSIAEoQBCh1SZWdpc3RlckF1dGhDb25uZWN0aW9uU2Vzc2lvbhIvLnRhaWxvci52MS5SZWdpc3RlckF1dGhDb25uZWN0aW9uU2Vzc2lvblJlcXVlc3QaMC50YWlsb3IudjEuUmVnaXN0ZXJBdXRoQ29ubmVjdGlvblNlc3Npb25SZXNwb25zZSIAEqIBCidFeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGUSOS50YWlsb3IudjEuRXhjaGFuZ2VBdXRoQ29ubmVjdGlvbkF1dGhvcml6YXRpb25Db2RlUmVxdWVzdBo6LnRhaWxvci52MS5FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXNwb25zZSIAEm8KFkNyZWF0ZUF1dGhPQXV0aDJDbGllbnQSKC50YWlsb3IudjEuQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIgASbwoWVXBkYXRlQXV0aE9BdXRoMkNsaWVudBIoLnRhaWxvci52MS5VcGRhdGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVBdXRoT0F1dGgyQ2xpZW50UmVzcG9uc2UiABJvChZEZWxldGVBdXRoT0F1dGgyQ2xpZW50EigudGFpbG9yLnYxLkRlbGV0ZUF1dGhPQXV0aDJDbGllbnRSZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZUF1dGhPQXV0aDJDbGllbnRSZXNwb25zZSIAEmkKE0dldEF1dGhPQXV0aDJDbGllbnQSJS50YWlsb3IudjEuR2V0QXV0aE9BdXRoMkNsaWVudFJlcXVlc3QaJi50YWlsb3IudjEuR2V0QXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIgOQAgESbwoVTGlzdEF1dGhPQXV0aDJDbGllbnRzEicudGFpbG9yLnYxLkxpc3RBdXRoT0F1dGgyQ2xpZW50c1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVzcG9uc2UiA5ACARJpChNMaXN0RGF0YXBsYW5lRXZlbnRzEiUudGFpbG9yLnYxLkxpc3REYXRhcGxhbmVFdmVudHNSZXF1ZXN0GiYudGFpbG9yLnYxLkxpc3REYXRhcGxhbmVFdmVudHNSZXNwb25zZSIDkAIBEoQBChxMaXN0Q29udHJvbHBsYW5lQWN0aXZpdHlMb2dzEi4udGFpbG9yLnYxLkxpc3RDb250cm9scGxhbmVBY3Rpdml0eUxvZ3NSZXF1ZXN0Gi8udGFpbG9yLnYxLkxpc3RDb250cm9scGxhbmVBY3Rpdml0eUxvZ3NSZXNwb25zZSIDkAIBElcKDlRlc3RFeGVjU2NyaXB0EiAudGFpbG9yLnYxLlRlc3RFeGVjU2NyaXB0UmVxdWVzdBohLnRhaWxvci52MS5UZXN0RXhlY1NjcmlwdFJlc3BvbnNlIgASbAoUR2V0RnVuY3Rpb25FeGVjdXRpb24SJi50YWlsb3IudjEuR2V0RnVuY3Rpb25FeGVjdXRpb25SZXF1ZXN0GicudGFpbG9yLnYxLkdldEZ1bmN0aW9uRXhlY3V0aW9uUmVzcG9uc2UiA5ACARJyChZMaXN0RnVuY3Rpb25FeGVjdXRpb25zEigudGFpbG9yLnYxLkxpc3RGdW5jdGlvbkV4ZWN1dGlvbnNSZXF1ZXN0GikudGFpbG9yLnYxLkxpc3RGdW5jdGlvbkV4ZWN1dGlvbnNSZXNwb25zZSIDkAIBEnEKFkNyZWF0ZUZ1bmN0aW9uUmVnaXN0cnkSKC50YWlsb3IudjEuQ3JlYXRlRnVuY3Rpb25SZWdpc3RyeVJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlRnVuY3Rpb25SZWdpc3RyeVJlc3BvbnNlIgAoARJxChZVcGRhdGVGdW5jdGlvblJlZ2lzdHJ5EigudGFpbG9yLnYxLlVwZGF0ZUZ1bmN0aW9uUmVnaXN0cnlSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUZ1bmN0aW9uUmVnaXN0cnlSZXNwb25zZSIAKAESaQoTR2V0RnVuY3Rpb25SZWdpc3RyeRIlLnRhaWxvci52MS5HZXRGdW5jdGlvblJlZ2lzdHJ5UmVxdWVzdBomLnRhaWxvci52MS5HZXRGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2UiA5ACARJyChZMaXN0RnVuY3Rpb25SZWdpc3RyaWVzEigudGFpbG9yLnYxLkxpc3RGdW5jdGlvblJlZ2lzdHJpZXNSZXF1ZXN0GikudGFpbG9yLnYxLkxpc3RGdW5jdGlvblJlZ2lzdHJpZXNSZXNwb25zZSIDkAIBEm8KFkRlbGV0ZUZ1bmN0aW9uUmVnaXN0cnkSKC50YWlsb3IudjEuRGVsZXRlRnVuY3Rpb25SZWdpc3RyeVJlcXVlc3QaKS50YWlsb3IudjEuRGVsZXRlRnVuY3Rpb25SZWdpc3RyeVJlc3BvbnNlIgASjAEKHkRvd25sb2FkRnVuY3Rpb25SZWdpc3RyeVNjcmlwdBIwLnRhaWxvci52MS5Eb3dubG9hZEZ1bmN0aW9uUmVnaXN0cnlTY3JpcHRSZXF1ZXN0GjEudGFpbG9yLnYxLkRvd25sb2FkRnVuY3Rpb25SZWdpc3RyeVNjcmlwdFJlc3BvbnNlIgOQAgEwARJyChZMaXN0TWV0ZXJSZXF1ZXN0Q291bnRzEigudGFpbG9yLnYxLkxpc3RNZXRlclJlcXVlc3RDb3VudHNSZXF1ZXN0GikudGFpbG9yLnYxLkxpc3RNZXRlclJlcXVlc3RDb3VudHNSZXNwb25zZSIDkAIBEngKGExpc3RNZXRlckV4ZWN1dGlvbkNvdW50cxIqLnRhaWxvci52MS5MaXN0TWV0ZXJFeGVjdXRpb25Db3VudHNSZXF1ZXN0GisudGFpbG9yLnYxLkxpc3RNZXRlckV4ZWN1dGlvbkNvdW50c1Jlc3BvbnNlIgOQAgESbAoUTGlzdE1ldGVyRXZlbnRDb3VudHMSJi50YWlsb3IudjEuTGlzdE1ldGVyRXZlbnRDb3VudHNSZXF1ZXN0GicudGFpbG9yLnYxLkxpc3RNZXRlckV2ZW50Q291bnRzUmVzcG9uc2UiA5ACARJdCg9MaXN0SWRQU2VydmljZXMSIS50YWlsb3IudjEuTGlzdElkUFNlcnZpY2VzUmVxdWVzdBoiLnRhaWxvci52MS5MaXN0SWRQU2VydmljZXNSZXNwb25zZSIDkAIBEl0KEENyZWF0ZUlkUFNlcnZpY2USIi50YWlsb3IudjEuQ3JlYXRlSWRQU2VydmljZVJlcXVlc3QaIy50YWlsb3IudjEuQ3JlYXRlSWRQU2VydmljZVJlc3BvbnNlIgASXQoQVXBkYXRlSWRQU2VydmljZRIiLnRhaWxvci52MS5VcGRhdGVJZFBTZXJ2aWNlUmVxdWVzdBojLnRhaWxvci52MS5VcGRhdGVJZFBTZXJ2aWNlUmVzcG9uc2UiABJdChBEZWxldGVJZFBTZXJ2aWNlEiIudGFpbG9yLnYxLkRlbGV0ZUlkUFNlcnZpY2VSZXF1ZXN0GiMudGFpbG9yLnYxLkRlbGV0ZUlkUFNlcnZpY2VSZXNwb25zZSIAElcKDUdldElkUFNlcnZpY2USHy50YWlsb3IudjEuR2V0SWRQU2VydmljZVJlcXVlc3QaIC50YWlsb3IudjEuR2V0SWRQU2VydmljZVJlc3BvbnNlIgOQAgESWgoOTGlzdElkUENsaWVudHMSIC50YWlsb3IudjEuTGlzdElkUENsaWVudHNSZXF1ZXN0GiEudGFpbG9yLnYxLkxpc3RJZFBDbGllbnRzUmVzcG9uc2UiA5ACARJaCg9DcmVhdGVJZFBDbGllbnQSIS50YWlsb3IudjEuQ3JlYXRlSWRQQ2xpZW50UmVxdWVzdBoiLnRhaWxvci52MS5DcmVhdGVJZFBDbGllbnRSZXNwb25zZSIAEloKD0RlbGV0ZUlkUENsaWVudBIhLnRhaWxvci52MS5EZWxldGVJZFBDbGllbnRSZXF1ZXN0GiIudGFpbG9yLnYxLkRlbGV0ZUlkUENsaWVudFJlc3BvbnNlIgASVAoMR2V0SWRQQ2xpZW50Eh4udGFpbG9yLnYxLkdldElkUENsaWVudFJlcXVlc3QaHy50YWlsb3IudjEuR2V0SWRQQ2xpZW50UmVzcG9uc2UiA5ACARJmChNDcmVhdGVTdGF0aWNXZWJzaXRlEiUudGFpbG9yLnYxLkNyZWF0ZVN0YXRpY1dlYnNpdGVSZXF1ZXN0GiYudGFpbG9yLnYxLkNyZWF0ZVN0YXRpY1dlYnNpdGVSZXNwb25zZSIAEmYKE1VwZGF0ZVN0YXRpY1dlYnNpdGUSJS50YWlsb3IudjEuVXBkYXRlU3RhdGljV2Vic2l0ZVJlcXVlc3QaJi50YWlsb3IudjEuVXBkYXRlU3RhdGljV2Vic2l0ZVJlc3BvbnNlIgASZgoTRGVsZXRlU3RhdGljV2Vic2l0ZRIlLnRhaWxvci52MS5EZWxldGVTdGF0aWNXZWJzaXRlUmVxdWVzdBomLnRhaWxvci52MS5EZWxldGVTdGF0aWNXZWJzaXRlUmVzcG9uc2UiABJgChBHZXRTdGF0aWNXZWJzaXRlEiIudGFpbG9yLnYxLkdldFN0YXRpY1dlYnNpdGVSZXF1ZXN0GiMudGFpbG9yLnYxLkdldFN0YXRpY1dlYnNpdGVSZXNwb25zZSIDkAIBEmYKEkxpc3RTdGF0aWNXZWJzaXRlcxIkLnRhaWxvci52MS5MaXN0U3RhdGljV2Vic2l0ZXNSZXF1ZXN0GiUudGFpbG9yLnYxLkxpc3RTdGF0aWNXZWJzaXRlc1Jlc3BvbnNlIgOQAgESXQoQQ3JlYXRlRGVwbG95bWVudBIiLnRhaWxvci52MS5DcmVhdGVEZXBsb3ltZW50UmVxdWVzdBojLnRhaWxvci52MS5DcmVhdGVEZXBsb3ltZW50UmVzcG9uc2UiABJNCgpVcGxvYWRGaWxlEhwudGFpbG9yLnYxLlVwbG9hZEZpbGVSZXF1ZXN0Gh0udGFpbG9yLnYxLlVwbG9hZEZpbGVSZXNwb25zZSIAKAESYAoRUHVibGlzaERlcGxveW1lbnQSIy50YWlsb3IudjEuUHVibGlzaERlcGxveW1lbnRSZXF1ZXN0GiQudGFpbG9yLnYxLlB1Ymxpc2hEZXBsb3ltZW50UmVzcG9uc2UiABJXCg5DcmVhdGVXb3JrZmxvdxIgLnRhaWxvci52MS5DcmVhdGVXb3JrZmxvd1JlcXVlc3QaIS50YWlsb3IudjEuQ3JlYXRlV29ya2Zsb3dSZXNwb25zZSIAElcKDlVwZGF0ZVdvcmtmbG93EiAudGFpbG9yLnYxLlVwZGF0ZVdvcmtmbG93UmVxdWVzdBohLnRhaWxvci52MS5VcGRhdGVXb3JrZmxvd1Jlc3BvbnNlIgASVwoORGVsZXRlV29ya2Zsb3cSIC50YWlsb3IudjEuRGVsZXRlV29ya2Zsb3dSZXF1ZXN0GiEudGFpbG9yLnYxLkRlbGV0ZVdvcmtmbG93UmVzcG9uc2UiABJRCgtHZXRXb3JrZmxvdxIdLnRhaWxvci52MS5HZXRXb3JrZmxvd1JlcXVlc3QaHi50YWlsb3IudjEuR2V0V29ya2Zsb3dSZXNwb25zZSIDkAIBEmMKEUdldFdvcmtmbG93QnlOYW1lEiMudGFpbG9yLnYxLkdldFdvcmtmbG93QnlOYW1lUmVxdWVzdBokLnRhaWxvci52MS5HZXRXb3JrZmxvd0J5TmFtZVJlc3BvbnNlIgOQAgESVwoNTGlzdFdvcmtmbG93cxIfLnRhaWxvci52MS5MaXN0V29ya2Zsb3dzUmVxdWVzdBogLnRhaWxvci52MS5MaXN0V29ya2Zsb3dzUmVzcG9uc2UiA5ACARJ4ChlDcmVhdGVXb3JrZmxvd0pvYkZ1bmN0aW9uEisudGFpbG9yLnYxLkNyZWF0ZVdvcmtmbG93Sm9iRnVuY3Rpb25SZXF1ZXN0GiwudGFpbG9yLnYxLkNyZWF0ZVdvcmtmbG93Sm9iRnVuY3Rpb25SZXNwb25zZSIAEngKGVVwZGF0ZVdvcmtmbG93Sm9iRnVuY3Rpb24SKy50YWlsb3IudjEuVXBkYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlcXVlc3QaLC50YWlsb3IudjEuVXBkYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlc3BvbnNlIgAScgoWR2V0V29ya2Zsb3dKb2JGdW5jdGlvbhIoLnRhaWxvci52MS5HZXRXb3JrZmxvd0pvYkZ1bmN0aW9uUmVxdWVzdBopLnRhaWxvci52MS5HZXRXb3JrZmxvd0pvYkZ1bmN0aW9uUmVzcG9uc2UiA5ACARKEAQocR2V0V29ya2Zsb3dKb2JGdW5jdGlvbkJ5TmFtZRIuLnRhaWxvci52MS5HZXRXb3JrZmxvd0pvYkZ1bmN0aW9uQnlOYW1lUmVxdWVzdBovLnRhaWxvci52MS5HZXRXb3JrZmxvd0pvYkZ1bmN0aW9uQnlOYW1lUmVzcG9uc2UiA5ACARJ4ChhMaXN0V29ya2Zsb3dKb2JGdW5jdGlvbnMSKi50YWlsb3IudjEuTGlzdFdvcmtmbG93Sm9iRnVuY3Rpb25zUmVxdWVzdBorLnRhaWxvci52MS5MaXN0V29ya2Zsb3dKb2JGdW5jdGlvbnNSZXNwb25zZSIDkAIBEmwKFEdldFdvcmtmbG93RXhlY3V0aW9uEiYudGFpbG9yLnYxLkdldFdvcmtmbG93RXhlY3V0aW9uUmVxdWVzdBonLnRhaWxvci52MS5HZXRXb3JrZmxvd0V4ZWN1dGlvblJlc3BvbnNlIgOQAgEScgoWTGlzdFdvcmtmbG93RXhlY3V0aW9ucxIoLnRhaWxvci52MS5MaXN0V29ya2Zsb3dFeGVjdXRpb25zUmVxdWVzdBopLnRhaWxvci52MS5MaXN0V29ya2Zsb3dFeGVjdXRpb25zUmVzcG9uc2UiA5ACARJgChFUZXN0U3RhcnRXb3JrZmxvdxIjLnRhaWxvci52MS5UZXN0U3RhcnRXb3JrZmxvd1JlcXVlc3QaJC50YWlsb3IudjEuVGVzdFN0YXJ0V29ya2Zsb3dSZXNwb25zZSIAEmMKElRlc3RSZXN1bWVXb3JrZmxvdxIkLnRhaWxvci52MS5UZXN0UmVzdW1lV29ya2Zsb3dSZXF1ZXN0GiUudGFpbG9yLnYxLlRlc3RSZXN1bWVXb3JrZmxvd1Jlc3BvbnNlIgASTgoLU2V0TWV0YWRhdGESHS50YWlsb3IudjEuU2V0TWV0YWRhdGFSZXF1ZXN0Gh4udGFpbG9yLnYxLlNldE1ldGFkYXRhUmVzcG9uc2UiABJRCgtHZXRNZXRhZGF0YRIdLnRhaWxvci52MS5HZXRNZXRhZGF0YVJlcXVlc3QaHi50YWlsb3IudjEuR2V0TWV0YWRhdGFSZXNwb25zZSIDkAIBEoQBCh1DcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlchIvLnRhaWxvci52MS5DcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QaMC50YWlsb3IudjEuQ3JlYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZSIAEoQBCh1VcGRhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlchIvLnRhaWxvci52MS5VcGRhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QaMC50YWlsb3IudjEuVXBkYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZSIAEn4KGkdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEiwudGFpbG9yLnYxLkdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBotLnRhaWxvci52MS5HZXRDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgOQAgEShAEKHExpc3RDb250cm9scGxhbmVNYWNoaW5lVXNlcnMSLi50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2Vyc1JlcXVlc3QaLy50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2Vyc1Jlc3BvbnNlIgOQAgEShAEKHURlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEi8udGFpbG9yLnYxLkRlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBowLnRhaWxvci52MS5EZWxldGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgBiBnByb3RvMw", [
|
|
948
|
+
const file_tailor_v1_service = /* @__PURE__ */ fileDesc("Chd0YWlsb3IvdjEvc2VydmljZS5wcm90bxIJdGFpbG9yLnYxIg0KC1BpbmdSZXF1ZXN0Ig4KDFBpbmdSZXNwb25zZTKCtAEKD09wZXJhdG9yU2VydmljZRI5CgRQaW5nEhYudGFpbG9yLnYxLlBpbmdSZXF1ZXN0GhcudGFpbG9yLnYxLlBpbmdSZXNwb25zZSIAEocBCh1MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9ucxIvLnRhaWxvci52MS5MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9uc1JlcXVlc3QaMC50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVJlZ2lvbnNSZXNwb25zZSIDkAIBEloKD0NyZWF0ZVdvcmtzcGFjZRIhLnRhaWxvci52MS5DcmVhdGVXb3Jrc3BhY2VSZXF1ZXN0GiIudGFpbG9yLnYxLkNyZWF0ZVdvcmtzcGFjZVJlc3BvbnNlIgASWgoPVXBkYXRlV29ya3NwYWNlEiEudGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVJlcXVlc3QaIi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUmVzcG9uc2UiABJaCg9EZWxldGVXb3Jrc3BhY2USIS50YWlsb3IudjEuRGVsZXRlV29ya3NwYWNlUmVxdWVzdBoiLnRhaWxvci52MS5EZWxldGVXb3Jrc3BhY2VSZXNwb25zZSIAEloKDkxpc3RXb3Jrc3BhY2VzEiAudGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdBohLnRhaWxvci52MS5MaXN0V29ya3NwYWNlc1Jlc3BvbnNlIgOQAgESfgoaTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXMSLC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25Xb3Jrc3BhY2VzUmVzcG9uc2UiA5ACARJdChBSZXN0b3JlV29ya3NwYWNlEiIudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXF1ZXN0GiMudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXNwb25zZSIAElQKDEdldFdvcmtzcGFjZRIeLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VSZXF1ZXN0Gh8udGFpbG9yLnYxLkdldFdvcmtzcGFjZVJlc3BvbnNlIgOQAgESfgoaTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnMSLC50YWlsb3IudjEuTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJzUmVzcG9uc2UiA5ACARKlAQonTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzEjkudGFpbG9yLnYxLkxpc3RBdmFpbGFibGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlc1JlcXVlc3QaOi50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzUmVzcG9uc2UiA5ACARJ+ChtJbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISLS50YWlsb3IudjEuSW52aXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBouLnRhaWxvci52MS5JbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIAEn4KG1JlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlchItLnRhaWxvci52MS5SZW1vdmVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXF1ZXN0Gi4udGFpbG9yLnYxLlJlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlc3BvbnNlIgASfgobVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyEi0udGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlcXVlc3QaLi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVzcG9uc2UiABJ4ChhHZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISKi50YWlsb3IudjEuR2V0V29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBorLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIDkAIBEmAKEEdldFdvcmtzcGFjZVJvbGUSIi50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlcXVlc3QaIy50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlc3BvbnNlIgOQAgESYwoSVXBkYXRlT3JnYW5pemF0aW9uEiQudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblJlcXVlc3QaJS50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uUmVzcG9uc2UiABJdCg9HZXRPcmdhbml6YXRpb24SIS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uUmVxdWVzdBoiLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25SZXNwb25zZSIDkAIBEmMKEUxpc3RPcmdhbml6YXRpb25zEiMudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25zUmVxdWVzdBokLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uc1Jlc3BvbnNlIgOQAgESbwoVTGlzdFVzZXJPcmdhbml6YXRpb25zEicudGFpbG9yLnYxLkxpc3RVc2VyT3JnYW5pemF0aW9uc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdFVzZXJPcmdhbml6YXRpb25zUmVzcG9uc2UiA5ACARJyChdHcmFudE9yZ2FuaXphdGlvbkFjY2VzcxIpLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKi50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25BY2Nlc3NSZXNwb25zZSIAEnUKGFVwZGF0ZU9yZ2FuaXphdGlvbkFjY2VzcxIqLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GisudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgASdQoYUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzEioudGFpbG9yLnYxLlJldm9rZU9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKy50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzUmVzcG9uc2UiABJ4ChhMaXN0T3JnYW5pemF0aW9uQWNjZXNzZXMSKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkFjY2Vzc2VzUmVxdWVzdBorLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uQWNjZXNzZXNSZXNwb25zZSIDkAIBEm8KFUdldE9yZ2FuaXphdGlvbkFjY2VzcxInLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GigudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgOQAgESdQoYQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyEioudGFpbG9yLnYxLkNyZWF0ZU9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKy50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiABJ1ChhVcGRhdGVPcmdhbml6YXRpb25Gb2xkZXISKi50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVxdWVzdBorLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJSZXNwb25zZSIAEnUKGERlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlchIqLnRhaWxvci52MS5EZWxldGVPcmdhbml6YXRpb25Gb2xkZXJSZXF1ZXN0GisudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlclJlc3BvbnNlIgASbwoVR2V0T3JnYW5pemF0aW9uRm9sZGVyEicudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiA5ACARJ1ChdMaXN0T3JnYW5pemF0aW9uRm9sZGVycxIpLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyc1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlcnNSZXNwb25zZSIDkAIBEoQBCh1HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2VzcxIvLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1JlcXVlc3QaMC50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEooBCh5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXMSMC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc2VzUmVxdWVzdBoxLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXNSZXNwb25zZSIDkAIBEoEBChtHZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSLS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBouLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZU9yZ2FuaXphdGlvblRlYW0SKC50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgASbwoWVXBkYXRlT3JnYW5pemF0aW9uVGVhbRIoLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVzcG9uc2UiABJvChZEZWxldGVPcmdhbml6YXRpb25UZWFtEigudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXNwb25zZSIAEmkKE0dldE9yZ2FuaXphdGlvblRlYW0SJS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaJi50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgOQAgESbwoVTGlzdE9yZ2FuaXphdGlvblRlYW1zEicudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25UZWFtc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1zUmVzcG9uc2UiA5ACARJ4ChlBZGRPcmdhbml6YXRpb25UZWFtTWVtYmVyEisudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0GiwudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxVcGRhdGVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxSZW1vdmVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChtMaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnMSLS50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1NZW1iZXJzUmVxdWVzdBouLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnNSZXNwb25zZSIDkAIBEnsKGUdldE9yZ2FuaXphdGlvblRlYW1NZW1iZXISKy50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlcXVlc3QaLC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlIgOQAgEScgoWR2V0UGxhdGZvcm1BY2NvdW50UGxhbhIoLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVxdWVzdBopLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBcHBsaWNhdGlvbhIjLnRhaWxvci52MS5DcmVhdGVBcHBsaWNhdGlvblJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXBwbGljYXRpb25SZXNwb25zZSIAEmAKEVVwZGF0ZUFwcGxpY2F0aW9uEiMudGFpbG9yLnYxLlVwZGF0ZUFwcGxpY2F0aW9uUmVxdWVzdBokLnRhaWxvci52MS5VcGRhdGVBcHBsaWNhdGlvblJlc3BvbnNlIgASYAoRRGVsZXRlQXBwbGljYXRpb24SIy50YWlsb3IudjEuRGVsZXRlQXBwbGljYXRpb25SZXF1ZXN0GiQudGFpbG9yLnYxLkRlbGV0ZUFwcGxpY2F0aW9uUmVzcG9uc2UiABJgChBMaXN0QXBwbGljYXRpb25zEiIudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXF1ZXN0GiMudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXNwb25zZSIDkAIBEloKDkdldEFwcGxpY2F0aW9uEiAudGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uUmVxdWVzdBohLnRhaWxvci52MS5HZXRBcHBsaWNhdGlvblJlc3BvbnNlIgOQAgESfgoaR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGgSLC50YWlsb3IudjEuR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGhSZXF1ZXN0Gi0udGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uU2NoZW1hSGVhbHRoUmVzcG9uc2UiA5ACARJjChJDb21wb3NlVGFpbG9yREJTREwSJC50YWlsb3IudjEuQ29tcG9zZVRhaWxvckRCU0RMUmVxdWVzdBolLnRhaWxvci52MS5Db21wb3NlVGFpbG9yREJTRExSZXNwb25zZSIAEmwKFUNyZWF0ZVRhaWxvckRCU2VydmljZRInLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCU2VydmljZVJlc3BvbnNlIgASbAoVVXBkYXRlVGFpbG9yREJTZXJ2aWNlEicudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuVXBkYXRlVGFpbG9yREJTZXJ2aWNlUmVzcG9uc2UiABJsChVEZWxldGVUYWlsb3JEQlNlcnZpY2USJy50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5EZWxldGVUYWlsb3JEQlNlcnZpY2VSZXNwb25zZSIAEmYKEkdldFRhaWxvckRCU2VydmljZRIkLnRhaWxvci52MS5HZXRUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GiUudGFpbG9yLnYxLkdldFRhaWxvckRCU2VydmljZVJlc3BvbnNlIgOQAgESbAoUTGlzdFRhaWxvckRCU2VydmljZXMSJi50YWlsb3IudjEuTGlzdFRhaWxvckRCU2VydmljZXNSZXF1ZXN0GicudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlNlcnZpY2VzUmVzcG9uc2UiA5ACARJjChJDcmVhdGVUYWlsb3JEQlR5cGUSJC50YWlsb3IudjEuQ3JlYXRlVGFpbG9yREJUeXBlUmVxdWVzdBolLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlR5cGVSZXNwb25zZSIAEmMKElVwZGF0ZVRhaWxvckRCVHlwZRIkLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQlR5cGVSZXF1ZXN0GiUudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoSRGVsZXRlVGFpbG9yREJUeXBlEiQudGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCVHlwZVJlcXVlc3QaJS50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJUeXBlUmVzcG9uc2UiABJsChVUcnVuY2F0ZVRhaWxvckRCVHlwZXMSJy50YWlsb3IudjEuVHJ1bmNhdGVUYWlsb3JEQlR5cGVzUmVxdWVzdBooLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZXNSZXNwb25zZSIAEmkKFFRydW5jYXRlVGFpbG9yREJUeXBlEiYudGFpbG9yLnYxLlRydW5jYXRlVGFpbG9yREJUeXBlUmVxdWVzdBonLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoRTGlzdFRhaWxvckRCVHlwZXMSIy50YWlsb3IudjEuTGlzdFRhaWxvckRCVHlwZXNSZXF1ZXN0GiQudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlR5cGVzUmVzcG9uc2UiA5ACARJdCg9HZXRUYWlsb3JEQlR5cGUSIS50YWlsb3IudjEuR2V0VGFpbG9yREJUeXBlUmVxdWVzdBoiLnRhaWxvci52MS5HZXRUYWlsb3JEQlR5cGVSZXNwb25zZSIDkAIBEn4KG0NyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASeAoYR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uEioudGFpbG9yLnYxLkdldFRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaKy50YWlsb3IudjEuR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiA5ACARJ+ChpMaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9ucxIsLnRhaWxvci52MS5MaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9uc1JlcXVlc3QaLS50YWlsb3IudjEuTGlzdFRhaWxvckRCR1FMUGVybWlzc2lvbnNSZXNwb25zZSIDkAIBEn4KG1VwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASfgobRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uEi0udGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaLi50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiABJsChVDcmVhdGVQaXBlbGluZVNlcnZpY2USJy50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5DcmVhdGVQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIAEmwKFVVwZGF0ZVBpcGVsaW5lU2VydmljZRInLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLlVwZGF0ZVBpcGVsaW5lU2VydmljZVJlc3BvbnNlIgASbAoVRGVsZXRlUGlwZWxpbmVTZXJ2aWNlEicudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuRGVsZXRlUGlwZWxpbmVTZXJ2aWNlUmVzcG9uc2UiABJmChJHZXRQaXBlbGluZVNlcnZpY2USJC50YWlsb3IudjEuR2V0UGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBolLnRhaWxvci52MS5HZXRQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIDkAIBEmwKFExpc3RQaXBlbGluZVNlcnZpY2VzEiYudGFpbG9yLnYxLkxpc3RQaXBlbGluZVNlcnZpY2VzUmVxdWVzdBonLnRhaWxvci52MS5MaXN0UGlwZWxpbmVTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESaQoTR2V0UGlwZWxpbmVSZXNvbHZlchIlLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVxdWVzdBomLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiA5ACARJvChVMaXN0UGlwZWxpbmVSZXNvbHZlcnMSJy50YWlsb3IudjEuTGlzdFBpcGVsaW5lUmVzb2x2ZXJzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlcnNSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZVBpcGVsaW5lUmVzb2x2ZXISKC50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlc3BvbnNlIgASbwoWVXBkYXRlUGlwZWxpbmVSZXNvbHZlchIoLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZEZWxldGVQaXBlbGluZVJlc29sdmVyEigudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXNwb25zZSIAEmMKEkNvbXBvc2VQaXBlbGluZVNETBIkLnRhaWxvci52MS5Db21wb3NlUGlwZWxpbmVTRExSZXF1ZXN0GiUudGFpbG9yLnYxLkNvbXBvc2VQaXBlbGluZVNETFJlc3BvbnNlIgASnAEKJExpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0cxI2LnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdHNSZXF1ZXN0GjcudGFpbG9yLnYxLkxpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0c1Jlc3BvbnNlIgOQAgESlgEKIkdldFBpcGVsaW5lUmVzb2x2ZXJFeGVjdXRpb25SZXN1bHQSNC50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlcXVlc3QaNS50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlc3BvbnNlIgOQAgEScgoXUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXISKS50YWlsb3IudjEuUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GioudGFpbG9yLnYxLlJlc3RhcnRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZDcmVhdGVTdGF0ZWZsb3dTZXJ2aWNlEigudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GikudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIAEm8KFlVwZGF0ZVN0YXRlZmxvd1NlcnZpY2USKC50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlc3BvbnNlIgASbwoWRGVsZXRlU3RhdGVmbG93U2VydmljZRIoLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVzcG9uc2UiABJpChNHZXRTdGF0ZWZsb3dTZXJ2aWNlEiUudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GiYudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIDkAIBEm8KFUxpc3RTdGF0ZWZsb3dTZXJ2aWNlcxInLnRhaWxvci52MS5MaXN0U3RhdGVmbG93U2VydmljZXNSZXF1ZXN0GigudGFpbG9yLnYxLkxpc3RTdGF0ZWZsb3dTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESbwoWQ3JlYXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChZVcGRhdGVFeGVjdXRvckV4ZWN1dG9yEigudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXNwb25zZSIAEmkKE0dldEV4ZWN1dG9yRXhlY3V0b3ISJS50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlcXVlc3QaJi50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlc3BvbnNlIgOQAgESbwoWRGVsZXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChVMaXN0RXhlY3V0b3JFeGVjdXRvcnMSJy50YWlsb3IudjEuTGlzdEV4ZWN1dG9yRXhlY3V0b3JzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0RXhlY3V0b3JFeGVjdXRvcnNSZXNwb25zZSIDkAIBEloKDkdldEV4ZWN1dG9ySm9iEiAudGFpbG9yLnYxLkdldEV4ZWN1dG9ySm9iUmVxdWVzdBohLnRhaWxvci52MS5HZXRFeGVjdXRvckpvYlJlc3BvbnNlIgOQAgESYAoQTGlzdEV4ZWN1dG9ySm9icxIiLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVxdWVzdBojLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVzcG9uc2UiA5ACARJ1ChdMaXN0RXhlY3V0b3JKb2JBdHRlbXB0cxIpLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JBdHRlbXB0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdEV4ZWN1dG9ySm9iQXR0ZW1wdHNSZXNwb25zZSIDkAIBEoQBChxMaXN0RXhlY3V0b3JJbmNvbWluZ1dlYmhvb2tzEi4udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXF1ZXN0Gi8udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXNwb25zZSIDkAIBEn4KGkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rEiwudGFpbG9yLnYxLkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rUmVxdWVzdBotLnRhaWxvci52MS5HZXRFeGVjdXRvckluY29taW5nV2ViaG9va1Jlc3BvbnNlIgOQAgESWgoPVHJpZ2dlckV4ZWN1dG9yEiEudGFpbG9yLnYxLlRyaWdnZXJFeGVjdXRvclJlcXVlc3QaIi50YWlsb3IudjEuVHJpZ2dlckV4ZWN1dG9yUmVzcG9uc2UiABJ1ChhDcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHQSKi50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclZhdWx0UmVxdWVzdBorLnRhaWxvci52MS5DcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHRSZXNwb25zZSIAEm8KFUdldFNlY3JldE1hbmFnZXJWYXVsdBInLnRhaWxvci52MS5HZXRTZWNyZXRNYW5hZ2VyVmF1bHRSZXF1ZXN0GigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJWYXVsdFJlc3BvbnNlIgOQAgESdQoYRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0EioudGFpbG9yLnYxLkRlbGV0ZVNlY3JldE1hbmFnZXJWYXVsdFJlcXVlc3QaKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0UmVzcG9uc2UiABJ1ChdMaXN0U2VjcmV0TWFuYWdlclZhdWx0cxIpLnRhaWxvci52MS5MaXN0U2VjcmV0TWFuYWdlclZhdWx0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJWYXVsdHNSZXNwb25zZSIDkAIBEngKGUNyZWF0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoZVXBkYXRlU2VjcmV0TWFuYWdlclNlY3JldBIrLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVxdWVzdBosLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVzcG9uc2UiABJyChZHZXRTZWNyZXRNYW5hZ2VyU2VjcmV0EigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXF1ZXN0GikudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXNwb25zZSIDkAIBEngKGURlbGV0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoYTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzEioudGFpbG9yLnYxLkxpc3RTZWNyZXRNYW5hZ2VyU2VjcmV0c1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBdXRoU2VydmljZRIjLnRhaWxvci52MS5DcmVhdGVBdXRoU2VydmljZVJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXV0aFNlcnZpY2VSZXNwb25zZSIAEmAKEVVwZGF0ZUF1dGhTZXJ2aWNlEiMudGFpbG9yLnYxLlVwZGF0ZUF1dGhTZXJ2aWNlUmVxdWVzdBokLnRhaWxvci52MS5VcGRhdGVBdXRoU2VydmljZVJlc3BvbnNlIgASYAoRRGVsZXRlQXV0aFNlcnZpY2USIy50YWlsb3IudjEuRGVsZXRlQXV0aFNlcnZpY2VSZXF1ZXN0GiQudGFpbG9yLnYxLkRlbGV0ZUF1dGhTZXJ2aWNlUmVzcG9uc2UiABJaCg5HZXRBdXRoU2VydmljZRIgLnRhaWxvci52MS5HZXRBdXRoU2VydmljZVJlcXVlc3QaIS50YWlsb3IudjEuR2V0QXV0aFNlcnZpY2VSZXNwb25zZSIDkAIBEmAKEExpc3RBdXRoU2VydmljZXMSIi50YWlsb3IudjEuTGlzdEF1dGhTZXJ2aWNlc1JlcXVlc3QaIy50YWlsb3IudjEuTGlzdEF1dGhTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESZgoTQ3JlYXRlQXV0aElEUENvbmZpZxIlLnRhaWxvci52MS5DcmVhdGVBdXRoSURQQ29uZmlnUmVxdWVzdBomLnRhaWxvci52MS5DcmVhdGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiABJmChNVcGRhdGVBdXRoSURQQ29uZmlnEiUudGFpbG9yLnYxLlVwZGF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0GiYudGFpbG9yLnYxLlVwZGF0ZUF1dGhJRFBDb25maWdSZXNwb25zZSIAEmYKE0RlbGV0ZUF1dGhJRFBDb25maWcSJS50YWlsb3IudjEuRGVsZXRlQXV0aElEUENvbmZpZ1JlcXVlc3QaJi50YWlsb3IudjEuRGVsZXRlQXV0aElEUENvbmZpZ1Jlc3BvbnNlIgASYAoQR2V0QXV0aElEUENvbmZpZxIiLnRhaWxvci52MS5HZXRBdXRoSURQQ29uZmlnUmVxdWVzdBojLnRhaWxvci52MS5HZXRBdXRoSURQQ29uZmlnUmVzcG9uc2UiA5ACARJmChJMaXN0QXV0aElEUENvbmZpZ3MSJC50YWlsb3IudjEuTGlzdEF1dGhJRFBDb25maWdzUmVxdWVzdBolLnRhaWxvci52MS5MaXN0QXV0aElEUENvbmZpZ3NSZXNwb25zZSIDkAIBEnIKF0NyZWF0ZVVzZXJQcm9maWxlQ29uZmlnEikudGFpbG9yLnYxLkNyZWF0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBoqLnRhaWxvci52MS5DcmVhdGVVc2VyUHJvZmlsZUNvbmZpZ1Jlc3BvbnNlIgAScgoXVXBkYXRlVXNlclByb2ZpbGVDb25maWcSKS50YWlsb3IudjEuVXBkYXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0GioudGFpbG9yLnYxLlVwZGF0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UiABJyChdEZWxldGVVc2VyUHJvZmlsZUNvbmZpZxIpLnRhaWxvci52MS5EZWxldGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QaKi50YWlsb3IudjEuRGVsZXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZSIAEmwKFEdldFVzZXJQcm9maWxlQ29uZmlnEiYudGFpbG9yLnYxLkdldFVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBonLnRhaWxvci52MS5HZXRVc2VyUHJvZmlsZUNvbmZpZ1Jlc3BvbnNlIgOQAgESYwoSQ3JlYXRlVGVuYW50Q29uZmlnEiQudGFpbG9yLnYxLkNyZWF0ZVRlbmFudENvbmZpZ1JlcXVlc3QaJS50YWlsb3IudjEuQ3JlYXRlVGVuYW50Q29uZmlnUmVzcG9uc2UiABJjChJVcGRhdGVUZW5hbnRDb25maWcSJC50YWlsb3IudjEuVXBkYXRlVGVuYW50Q29uZmlnUmVxdWVzdBolLnRhaWxvci52MS5VcGRhdGVUZW5hbnRDb25maWdSZXNwb25zZSIAEmMKEkRlbGV0ZVRlbmFudENvbmZpZxIkLnRhaWxvci52MS5EZWxldGVUZW5hbnRDb25maWdSZXF1ZXN0GiUudGFpbG9yLnYxLkRlbGV0ZVRlbmFudENvbmZpZ1Jlc3BvbnNlIgASXQoPR2V0VGVuYW50Q29uZmlnEiEudGFpbG9yLnYxLkdldFRlbmFudENvbmZpZ1JlcXVlc3QaIi50YWlsb3IudjEuR2V0VGVuYW50Q29uZmlnUmVzcG9uc2UiA5ACARJ4ChlDcmVhdGVQZXJzb25hbEFjY2Vzc1Rva2VuEisudGFpbG9yLnYxLkNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXF1ZXN0GiwudGFpbG9yLnYxLkNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZSIAEngKGURlbGV0ZVBlcnNvbmFsQWNjZXNzVG9rZW4SKy50YWlsb3IudjEuRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QaLC50YWlsb3IudjEuRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlc3BvbnNlIgASeAoYTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zEioudGFpbG9yLnYxLkxpc3RQZXJzb25hbEFjY2Vzc1Rva2Vuc1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zUmVzcG9uc2UiA5ACARJsChVDcmVhdGVBdXRoTWFjaGluZVVzZXISJy50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdBooLnRhaWxvci52MS5DcmVhdGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSIAEmwKFVVwZGF0ZUF1dGhNYWNoaW5lVXNlchInLnRhaWxvci52MS5VcGRhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0GigudGFpbG9yLnYxLlVwZGF0ZUF1dGhNYWNoaW5lVXNlclJlc3BvbnNlIgASbAoVRGVsZXRlQXV0aE1hY2hpbmVVc2VyEicudGFpbG9yLnYxLkRlbGV0ZUF1dGhNYWNoaW5lVXNlclJlcXVlc3QaKC50YWlsb3IudjEuRGVsZXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2UiABJmChJHZXRBdXRoTWFjaGluZVVzZXISJC50YWlsb3IudjEuR2V0QXV0aE1hY2hpbmVVc2VyUmVxdWVzdBolLnRhaWxvci52MS5HZXRBdXRoTWFjaGluZVVzZXJSZXNwb25zZSIDkAIBEmwKFExpc3RBdXRoTWFjaGluZVVzZXJzEiYudGFpbG9yLnYxLkxpc3RBdXRoTWFjaGluZVVzZXJzUmVxdWVzdBonLnRhaWxvci52MS5MaXN0QXV0aE1hY2hpbmVVc2Vyc1Jlc3BvbnNlIgOQAgESaQoUQ3JlYXRlQXV0aFNDSU1Db25maWcSJi50YWlsb3IudjEuQ3JlYXRlQXV0aFNDSU1Db25maWdSZXF1ZXN0GicudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2UiABJpChRVcGRhdGVBdXRoU0NJTUNvbmZpZxImLnRhaWxvci52MS5VcGRhdGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QaJy50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1Db25maWdSZXNwb25zZSIAEmkKFERlbGV0ZUF1dGhTQ0lNQ29uZmlnEiYudGFpbG9yLnYxLkRlbGV0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBonLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIgASYwoRR2V0QXV0aFNDSU1Db25maWcSIy50YWlsb3IudjEuR2V0QXV0aFNDSU1Db25maWdSZXF1ZXN0GiQudGFpbG9yLnYxLkdldEF1dGhTQ0lNQ29uZmlnUmVzcG9uc2UiA5ACARJvChZDcmVhdGVBdXRoU0NJTVJlc291cmNlEigudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXF1ZXN0GikudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXNwb25zZSIAEm8KFlVwZGF0ZUF1dGhTQ0lNUmVzb3VyY2USKC50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1SZXNvdXJjZVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIgASbwoWRGVsZXRlQXV0aFNDSU1SZXNvdXJjZRIoLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2UiABJpChNHZXRBdXRoU0NJTVJlc291cmNlEiUudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VSZXF1ZXN0GiYudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VSZXNwb25zZSIDkAIBEmwKFEdldEF1dGhTQ0lNUmVzb3VyY2VzEiYudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VzUmVxdWVzdBonLnRhaWxvci52MS5HZXRBdXRoU0NJTVJlc291cmNlc1Jlc3BvbnNlIgOQAgESaQoUQ3JlYXRlQXV0aENvbm5lY3Rpb24SJi50YWlsb3IudjEuQ3JlYXRlQXV0aENvbm5lY3Rpb25SZXF1ZXN0GicudGFpbG9yLnYxLkNyZWF0ZUF1dGhDb25uZWN0aW9uUmVzcG9uc2UiABJpChNMaXN0QXV0aENvbm5lY3Rpb25zEiUudGFpbG9yLnYxLkxpc3RBdXRoQ29ubmVjdGlvbnNSZXF1ZXN0GiYudGFpbG9yLnYxLkxpc3RBdXRoQ29ubmVjdGlvbnNSZXNwb25zZSIDkAIBEmkKFFJldm9rZUF1dGhDb25uZWN0aW9uEiYudGFpbG9yLnYxLlJldm9rZUF1dGhDb25uZWN0aW9uUmVxdWVzdBonLnRhaWxvci52MS5SZXZva2VBdXRoQ29ubmVjdGlvblJlc3BvbnNlIgAShAEKHVJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uEi8udGFpbG9yLnYxLlJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uUmVxdWVzdBowLnRhaWxvci52MS5SZWdpc3RlckF1dGhDb25uZWN0aW9uU2Vzc2lvblJlc3BvbnNlIgASogEKJ0V4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZRI5LnRhaWxvci52MS5FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXF1ZXN0GjoudGFpbG9yLnYxLkV4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZVJlc3BvbnNlIgASbwoWQ3JlYXRlQXV0aE9BdXRoMkNsaWVudBIoLnRhaWxvci52MS5DcmVhdGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVBdXRoT0F1dGgyQ2xpZW50UmVzcG9uc2UiABJvChZVcGRhdGVBdXRoT0F1dGgyQ2xpZW50EigudGFpbG9yLnYxLlVwZGF0ZUF1dGhPQXV0aDJDbGllbnRSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUF1dGhPQXV0aDJDbGllbnRSZXNwb25zZSIAEm8KFkRlbGV0ZUF1dGhPQXV0aDJDbGllbnQSKC50YWlsb3IudjEuRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QaKS50YWlsb3IudjEuRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIgASaQoTR2V0QXV0aE9BdXRoMkNsaWVudBIlLnRhaWxvci52MS5HZXRBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBomLnRhaWxvci52MS5HZXRBdXRoT0F1dGgyQ2xpZW50UmVzcG9uc2UiA5ACARJvChVMaXN0QXV0aE9BdXRoMkNsaWVudHMSJy50YWlsb3IudjEuTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0QXV0aE9BdXRoMkNsaWVudHNSZXNwb25zZSIDkAIBEmkKE0xpc3REYXRhcGxhbmVFdmVudHMSJS50YWlsb3IudjEuTGlzdERhdGFwbGFuZUV2ZW50c1JlcXVlc3QaJi50YWlsb3IudjEuTGlzdERhdGFwbGFuZUV2ZW50c1Jlc3BvbnNlIgOQAgEShAEKHExpc3RDb250cm9scGxhbmVBY3Rpdml0eUxvZ3MSLi50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZUFjdGl2aXR5TG9nc1JlcXVlc3QaLy50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZUFjdGl2aXR5TG9nc1Jlc3BvbnNlIgOQAgESVwoOVGVzdEV4ZWNTY3JpcHQSIC50YWlsb3IudjEuVGVzdEV4ZWNTY3JpcHRSZXF1ZXN0GiEudGFpbG9yLnYxLlRlc3RFeGVjU2NyaXB0UmVzcG9uc2UiABJsChRHZXRGdW5jdGlvbkV4ZWN1dGlvbhImLnRhaWxvci52MS5HZXRGdW5jdGlvbkV4ZWN1dGlvblJlcXVlc3QaJy50YWlsb3IudjEuR2V0RnVuY3Rpb25FeGVjdXRpb25SZXNwb25zZSIDkAIBEnIKFkxpc3RGdW5jdGlvbkV4ZWN1dGlvbnMSKC50YWlsb3IudjEuTGlzdEZ1bmN0aW9uRXhlY3V0aW9uc1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdEZ1bmN0aW9uRXhlY3V0aW9uc1Jlc3BvbnNlIgOQAgEScQoWQ3JlYXRlRnVuY3Rpb25SZWdpc3RyeRIoLnRhaWxvci52MS5DcmVhdGVGdW5jdGlvblJlZ2lzdHJ5UmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2UiACgBEnEKFlVwZGF0ZUZ1bmN0aW9uUmVnaXN0cnkSKC50YWlsb3IudjEuVXBkYXRlRnVuY3Rpb25SZWdpc3RyeVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlRnVuY3Rpb25SZWdpc3RyeVJlc3BvbnNlIgAoARJpChNHZXRGdW5jdGlvblJlZ2lzdHJ5EiUudGFpbG9yLnYxLkdldEZ1bmN0aW9uUmVnaXN0cnlSZXF1ZXN0GiYudGFpbG9yLnYxLkdldEZ1bmN0aW9uUmVnaXN0cnlSZXNwb25zZSIDkAIBEnIKFkxpc3RGdW5jdGlvblJlZ2lzdHJpZXMSKC50YWlsb3IudjEuTGlzdEZ1bmN0aW9uUmVnaXN0cmllc1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdEZ1bmN0aW9uUmVnaXN0cmllc1Jlc3BvbnNlIgOQAgESbwoWRGVsZXRlRnVuY3Rpb25SZWdpc3RyeRIoLnRhaWxvci52MS5EZWxldGVGdW5jdGlvblJlZ2lzdHJ5UmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2UiABKMAQoeRG93bmxvYWRGdW5jdGlvblJlZ2lzdHJ5U2NyaXB0EjAudGFpbG9yLnYxLkRvd25sb2FkRnVuY3Rpb25SZWdpc3RyeVNjcmlwdFJlcXVlc3QaMS50YWlsb3IudjEuRG93bmxvYWRGdW5jdGlvblJlZ2lzdHJ5U2NyaXB0UmVzcG9uc2UiA5ACATABEnIKFkxpc3RNZXRlclJlcXVlc3RDb3VudHMSKC50YWlsb3IudjEuTGlzdE1ldGVyUmVxdWVzdENvdW50c1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdE1ldGVyUmVxdWVzdENvdW50c1Jlc3BvbnNlIgOQAgESeAoYTGlzdE1ldGVyRXhlY3V0aW9uQ291bnRzEioudGFpbG9yLnYxLkxpc3RNZXRlckV4ZWN1dGlvbkNvdW50c1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdE1ldGVyRXhlY3V0aW9uQ291bnRzUmVzcG9uc2UiA5ACARJsChRMaXN0TWV0ZXJFdmVudENvdW50cxImLnRhaWxvci52MS5MaXN0TWV0ZXJFdmVudENvdW50c1JlcXVlc3QaJy50YWlsb3IudjEuTGlzdE1ldGVyRXZlbnRDb3VudHNSZXNwb25zZSIDkAIBEl0KD0xpc3RJZFBTZXJ2aWNlcxIhLnRhaWxvci52MS5MaXN0SWRQU2VydmljZXNSZXF1ZXN0GiIudGFpbG9yLnYxLkxpc3RJZFBTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESXQoQQ3JlYXRlSWRQU2VydmljZRIiLnRhaWxvci52MS5DcmVhdGVJZFBTZXJ2aWNlUmVxdWVzdBojLnRhaWxvci52MS5DcmVhdGVJZFBTZXJ2aWNlUmVzcG9uc2UiABJdChBVcGRhdGVJZFBTZXJ2aWNlEiIudGFpbG9yLnYxLlVwZGF0ZUlkUFNlcnZpY2VSZXF1ZXN0GiMudGFpbG9yLnYxLlVwZGF0ZUlkUFNlcnZpY2VSZXNwb25zZSIAEl0KEERlbGV0ZUlkUFNlcnZpY2USIi50YWlsb3IudjEuRGVsZXRlSWRQU2VydmljZVJlcXVlc3QaIy50YWlsb3IudjEuRGVsZXRlSWRQU2VydmljZVJlc3BvbnNlIgASVwoNR2V0SWRQU2VydmljZRIfLnRhaWxvci52MS5HZXRJZFBTZXJ2aWNlUmVxdWVzdBogLnRhaWxvci52MS5HZXRJZFBTZXJ2aWNlUmVzcG9uc2UiA5ACARJaCg5MaXN0SWRQQ2xpZW50cxIgLnRhaWxvci52MS5MaXN0SWRQQ2xpZW50c1JlcXVlc3QaIS50YWlsb3IudjEuTGlzdElkUENsaWVudHNSZXNwb25zZSIDkAIBEloKD0NyZWF0ZUlkUENsaWVudBIhLnRhaWxvci52MS5DcmVhdGVJZFBDbGllbnRSZXF1ZXN0GiIudGFpbG9yLnYxLkNyZWF0ZUlkUENsaWVudFJlc3BvbnNlIgASWgoPRGVsZXRlSWRQQ2xpZW50EiEudGFpbG9yLnYxLkRlbGV0ZUlkUENsaWVudFJlcXVlc3QaIi50YWlsb3IudjEuRGVsZXRlSWRQQ2xpZW50UmVzcG9uc2UiABJUCgxHZXRJZFBDbGllbnQSHi50YWlsb3IudjEuR2V0SWRQQ2xpZW50UmVxdWVzdBofLnRhaWxvci52MS5HZXRJZFBDbGllbnRSZXNwb25zZSIDkAIBEmYKE0NyZWF0ZVN0YXRpY1dlYnNpdGUSJS50YWlsb3IudjEuQ3JlYXRlU3RhdGljV2Vic2l0ZVJlcXVlc3QaJi50YWlsb3IudjEuQ3JlYXRlU3RhdGljV2Vic2l0ZVJlc3BvbnNlIgASZgoTVXBkYXRlU3RhdGljV2Vic2l0ZRIlLnRhaWxvci52MS5VcGRhdGVTdGF0aWNXZWJzaXRlUmVxdWVzdBomLnRhaWxvci52MS5VcGRhdGVTdGF0aWNXZWJzaXRlUmVzcG9uc2UiABJmChNEZWxldGVTdGF0aWNXZWJzaXRlEiUudGFpbG9yLnYxLkRlbGV0ZVN0YXRpY1dlYnNpdGVSZXF1ZXN0GiYudGFpbG9yLnYxLkRlbGV0ZVN0YXRpY1dlYnNpdGVSZXNwb25zZSIAEmAKEEdldFN0YXRpY1dlYnNpdGUSIi50YWlsb3IudjEuR2V0U3RhdGljV2Vic2l0ZVJlcXVlc3QaIy50YWlsb3IudjEuR2V0U3RhdGljV2Vic2l0ZVJlc3BvbnNlIgOQAgESZgoSTGlzdFN0YXRpY1dlYnNpdGVzEiQudGFpbG9yLnYxLkxpc3RTdGF0aWNXZWJzaXRlc1JlcXVlc3QaJS50YWlsb3IudjEuTGlzdFN0YXRpY1dlYnNpdGVzUmVzcG9uc2UiA5ACARJdChBDcmVhdGVEZXBsb3ltZW50EiIudGFpbG9yLnYxLkNyZWF0ZURlcGxveW1lbnRSZXF1ZXN0GiMudGFpbG9yLnYxLkNyZWF0ZURlcGxveW1lbnRSZXNwb25zZSIAEk0KClVwbG9hZEZpbGUSHC50YWlsb3IudjEuVXBsb2FkRmlsZVJlcXVlc3QaHS50YWlsb3IudjEuVXBsb2FkRmlsZVJlc3BvbnNlIgAoARJgChFQdWJsaXNoRGVwbG95bWVudBIjLnRhaWxvci52MS5QdWJsaXNoRGVwbG95bWVudFJlcXVlc3QaJC50YWlsb3IudjEuUHVibGlzaERlcGxveW1lbnRSZXNwb25zZSIAElcKDkNyZWF0ZVdvcmtmbG93EiAudGFpbG9yLnYxLkNyZWF0ZVdvcmtmbG93UmVxdWVzdBohLnRhaWxvci52MS5DcmVhdGVXb3JrZmxvd1Jlc3BvbnNlIgASVwoOVXBkYXRlV29ya2Zsb3cSIC50YWlsb3IudjEuVXBkYXRlV29ya2Zsb3dSZXF1ZXN0GiEudGFpbG9yLnYxLlVwZGF0ZVdvcmtmbG93UmVzcG9uc2UiABJXCg5EZWxldGVXb3JrZmxvdxIgLnRhaWxvci52MS5EZWxldGVXb3JrZmxvd1JlcXVlc3QaIS50YWlsb3IudjEuRGVsZXRlV29ya2Zsb3dSZXNwb25zZSIAElEKC0dldFdvcmtmbG93Eh0udGFpbG9yLnYxLkdldFdvcmtmbG93UmVxdWVzdBoeLnRhaWxvci52MS5HZXRXb3JrZmxvd1Jlc3BvbnNlIgOQAgESYwoRR2V0V29ya2Zsb3dCeU5hbWUSIy50YWlsb3IudjEuR2V0V29ya2Zsb3dCeU5hbWVSZXF1ZXN0GiQudGFpbG9yLnYxLkdldFdvcmtmbG93QnlOYW1lUmVzcG9uc2UiA5ACARJXCg1MaXN0V29ya2Zsb3dzEh8udGFpbG9yLnYxLkxpc3RXb3JrZmxvd3NSZXF1ZXN0GiAudGFpbG9yLnYxLkxpc3RXb3JrZmxvd3NSZXNwb25zZSIDkAIBEngKGUNyZWF0ZVdvcmtmbG93Sm9iRnVuY3Rpb24SKy50YWlsb3IudjEuQ3JlYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlcXVlc3QaLC50YWlsb3IudjEuQ3JlYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlc3BvbnNlIgASeAoZVXBkYXRlV29ya2Zsb3dKb2JGdW5jdGlvbhIrLnRhaWxvci52MS5VcGRhdGVXb3JrZmxvd0pvYkZ1bmN0aW9uUmVxdWVzdBosLnRhaWxvci52MS5VcGRhdGVXb3JrZmxvd0pvYkZ1bmN0aW9uUmVzcG9uc2UiABJyChZHZXRXb3JrZmxvd0pvYkZ1bmN0aW9uEigudGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25SZXF1ZXN0GikudGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25SZXNwb25zZSIDkAIBEoQBChxHZXRXb3JrZmxvd0pvYkZ1bmN0aW9uQnlOYW1lEi4udGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25CeU5hbWVSZXF1ZXN0Gi8udGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25CeU5hbWVSZXNwb25zZSIDkAIBEngKGExpc3RXb3JrZmxvd0pvYkZ1bmN0aW9ucxIqLnRhaWxvci52MS5MaXN0V29ya2Zsb3dKb2JGdW5jdGlvbnNSZXF1ZXN0GisudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0pvYkZ1bmN0aW9uc1Jlc3BvbnNlIgOQAgESbAoUR2V0V29ya2Zsb3dFeGVjdXRpb24SJi50YWlsb3IudjEuR2V0V29ya2Zsb3dFeGVjdXRpb25SZXF1ZXN0GicudGFpbG9yLnYxLkdldFdvcmtmbG93RXhlY3V0aW9uUmVzcG9uc2UiA5ACARJyChZMaXN0V29ya2Zsb3dFeGVjdXRpb25zEigudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0V4ZWN1dGlvbnNSZXF1ZXN0GikudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0V4ZWN1dGlvbnNSZXNwb25zZSIDkAIBEmAKEVRlc3RTdGFydFdvcmtmbG93EiMudGFpbG9yLnYxLlRlc3RTdGFydFdvcmtmbG93UmVxdWVzdBokLnRhaWxvci52MS5UZXN0U3RhcnRXb3JrZmxvd1Jlc3BvbnNlIgASYwoSVGVzdFJlc3VtZVdvcmtmbG93EiQudGFpbG9yLnYxLlRlc3RSZXN1bWVXb3JrZmxvd1JlcXVlc3QaJS50YWlsb3IudjEuVGVzdFJlc3VtZVdvcmtmbG93UmVzcG9uc2UiABJOCgtTZXRNZXRhZGF0YRIdLnRhaWxvci52MS5TZXRNZXRhZGF0YVJlcXVlc3QaHi50YWlsb3IudjEuU2V0TWV0YWRhdGFSZXNwb25zZSIAElEKC0dldE1ldGFkYXRhEh0udGFpbG9yLnYxLkdldE1ldGFkYXRhUmVxdWVzdBoeLnRhaWxvci52MS5HZXRNZXRhZGF0YVJlc3BvbnNlIgOQAgEShAEKHUNyZWF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEi8udGFpbG9yLnYxLkNyZWF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBowLnRhaWxvci52MS5DcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgAShAEKHVVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEi8udGFpbG9yLnYxLlVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBowLnRhaWxvci52MS5VcGRhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgASfgoaR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXISLC50YWlsb3IudjEuR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0Gi0udGFpbG9yLnYxLkdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2UiA5ACARKEAQocTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2VycxIuLnRhaWxvci52MS5MaXN0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJzUmVxdWVzdBovLnRhaWxvci52MS5MaXN0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJzUmVzcG9uc2UiA5ACARKEAQodRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXISLy50YWlsb3IudjEuRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0GjAudGFpbG9yLnYxLkRlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2UiAGIGcHJvdG8z", [
|
|
912
949
|
file_tailor_v1_application,
|
|
913
950
|
file_tailor_v1_auth,
|
|
914
951
|
file_tailor_v1_events,
|
|
@@ -936,7 +973,7 @@ const OperatorService = /* @__PURE__ */ serviceDesc(file_tailor_v1_service, 0);
|
|
|
936
973
|
let packageJson = null;
|
|
937
974
|
/**
|
|
938
975
|
* Read and cache the package.json of the SDK package.
|
|
939
|
-
* @returns
|
|
976
|
+
* @returns Parsed package.json contents
|
|
940
977
|
*/
|
|
941
978
|
async function readPackageJson() {
|
|
942
979
|
if (packageJson) return packageJson;
|
|
@@ -951,7 +988,7 @@ const oauth2ClientId = process.env.PLATFORM_OAUTH2_CLIENT_ID ?? "cpoc_0Iudir72fq
|
|
|
951
988
|
const oauth2DiscoveryEndpoint = "/.well-known/oauth-authorization-server/oauth2/platform";
|
|
952
989
|
/**
|
|
953
990
|
* Initialize an OAuth2 client for Tailor Platform.
|
|
954
|
-
* @returns
|
|
991
|
+
* @returns Configured OAuth2 client
|
|
955
992
|
*/
|
|
956
993
|
function initOAuth2Client() {
|
|
957
994
|
return new OAuth2Client({
|
|
@@ -962,8 +999,8 @@ function initOAuth2Client() {
|
|
|
962
999
|
}
|
|
963
1000
|
/**
|
|
964
1001
|
* Initialize an Operator client with the given access token.
|
|
965
|
-
* @param
|
|
966
|
-
* @returns
|
|
1002
|
+
* @param accessToken - Access token for authentication
|
|
1003
|
+
* @returns Configured Operator client
|
|
967
1004
|
*/
|
|
968
1005
|
async function initOperatorClient(accessToken) {
|
|
969
1006
|
return createClient(OperatorService, createConnectTransport({
|
|
@@ -979,7 +1016,7 @@ async function initOperatorClient(accessToken) {
|
|
|
979
1016
|
}
|
|
980
1017
|
/**
|
|
981
1018
|
* Create an interceptor that sets a User-Agent header.
|
|
982
|
-
* @returns
|
|
1019
|
+
* @returns User-Agent interceptor
|
|
983
1020
|
*/
|
|
984
1021
|
async function userAgentInterceptor() {
|
|
985
1022
|
const ua = await userAgent();
|
|
@@ -990,15 +1027,15 @@ async function userAgentInterceptor() {
|
|
|
990
1027
|
}
|
|
991
1028
|
/**
|
|
992
1029
|
* Build the User-Agent string for CLI requests.
|
|
993
|
-
* @returns
|
|
1030
|
+
* @returns User-Agent header value
|
|
994
1031
|
*/
|
|
995
1032
|
async function userAgent() {
|
|
996
1033
|
return `tailor-sdk/${(await readPackageJson()).version ?? "unknown"}`;
|
|
997
1034
|
}
|
|
998
1035
|
/**
|
|
999
1036
|
* Create an interceptor that sets the Authorization bearer token.
|
|
1000
|
-
* @param
|
|
1001
|
-
* @returns
|
|
1037
|
+
* @param accessToken - Access token to use
|
|
1038
|
+
* @returns Bearer token interceptor
|
|
1002
1039
|
*/
|
|
1003
1040
|
async function bearerTokenInterceptor(accessToken) {
|
|
1004
1041
|
return (next) => async (req) => {
|
|
@@ -1008,7 +1045,7 @@ async function bearerTokenInterceptor(accessToken) {
|
|
|
1008
1045
|
}
|
|
1009
1046
|
/**
|
|
1010
1047
|
* Create an interceptor that retries idempotent requests with backoff.
|
|
1011
|
-
* @returns
|
|
1048
|
+
* @returns Retry interceptor
|
|
1012
1049
|
*/
|
|
1013
1050
|
function retryInterceptor() {
|
|
1014
1051
|
return (next) => async (req) => {
|
|
@@ -1031,8 +1068,8 @@ function retryInterceptor() {
|
|
|
1031
1068
|
}
|
|
1032
1069
|
/**
|
|
1033
1070
|
* Wait for an exponential backoff delay with jitter.
|
|
1034
|
-
* @param
|
|
1035
|
-
* @returns
|
|
1071
|
+
* @param attempt - Current retry attempt number (1-based)
|
|
1072
|
+
* @returns Promise that resolves after the delay
|
|
1036
1073
|
*/
|
|
1037
1074
|
function waitRetryBackoff(attempt) {
|
|
1038
1075
|
const backoff = 50 * 2 ** (attempt - 1) * (1 + .1 * (Math.random() * 2 - 1));
|
|
@@ -1040,9 +1077,9 @@ function waitRetryBackoff(attempt) {
|
|
|
1040
1077
|
}
|
|
1041
1078
|
/**
|
|
1042
1079
|
* Determine whether the given error is retriable for the method idempotency.
|
|
1043
|
-
* @param
|
|
1044
|
-
* @param
|
|
1045
|
-
* @returns
|
|
1080
|
+
* @param error - Error thrown by the request
|
|
1081
|
+
* @param idempotency - Method idempotency level
|
|
1082
|
+
* @returns True if the error should be retried
|
|
1046
1083
|
*/
|
|
1047
1084
|
function isRetirable(error, idempotency) {
|
|
1048
1085
|
if (!(error instanceof ConnectError)) return false;
|
|
@@ -1054,7 +1091,7 @@ function isRetirable(error, idempotency) {
|
|
|
1054
1091
|
}
|
|
1055
1092
|
/**
|
|
1056
1093
|
* Create an interceptor that enhances error messages from the Operator API.
|
|
1057
|
-
* @returns
|
|
1094
|
+
* @returns Error handling interceptor
|
|
1058
1095
|
*/
|
|
1059
1096
|
function errorHandlingInterceptor() {
|
|
1060
1097
|
return (next) => async (req) => {
|
|
@@ -1072,8 +1109,8 @@ function errorHandlingInterceptor() {
|
|
|
1072
1109
|
}
|
|
1073
1110
|
/**
|
|
1074
1111
|
* @internal
|
|
1075
|
-
* @param
|
|
1076
|
-
* @returns
|
|
1112
|
+
* @param methodName - RPC method name (e.g., "CreateWorkspace")
|
|
1113
|
+
* @returns Parsed operation and resource type
|
|
1077
1114
|
*/
|
|
1078
1115
|
function parseMethodName(methodName) {
|
|
1079
1116
|
const match = methodName.match(/^(Create|Update|Delete|Set|List|Get)(.+)$/);
|
|
@@ -1089,8 +1126,8 @@ function parseMethodName(methodName) {
|
|
|
1089
1126
|
}
|
|
1090
1127
|
/**
|
|
1091
1128
|
* @internal
|
|
1092
|
-
* @param
|
|
1093
|
-
* @returns
|
|
1129
|
+
* @param message - Request message to format
|
|
1130
|
+
* @returns Pretty-printed JSON or error placeholder
|
|
1094
1131
|
*/
|
|
1095
1132
|
function formatRequestParams(message) {
|
|
1096
1133
|
try {
|
|
@@ -1103,8 +1140,8 @@ function formatRequestParams(message) {
|
|
|
1103
1140
|
/**
|
|
1104
1141
|
* Fetch all paginated resources by repeatedly calling the given function.
|
|
1105
1142
|
* @template T
|
|
1106
|
-
* @param
|
|
1107
|
-
* @returns
|
|
1143
|
+
* @param fn - Page fetcher returning items and next page token
|
|
1144
|
+
* @returns All fetched items
|
|
1108
1145
|
*/
|
|
1109
1146
|
async function fetchAll(fn) {
|
|
1110
1147
|
const items = [];
|
|
@@ -1119,8 +1156,8 @@ async function fetchAll(fn) {
|
|
|
1119
1156
|
}
|
|
1120
1157
|
/**
|
|
1121
1158
|
* Fetch user info from the Tailor Platform userinfo endpoint.
|
|
1122
|
-
* @param
|
|
1123
|
-
* @returns
|
|
1159
|
+
* @param accessToken - Access token for the current user
|
|
1160
|
+
* @returns Parsed user info
|
|
1124
1161
|
*/
|
|
1125
1162
|
async function fetchUserInfo(accessToken) {
|
|
1126
1163
|
const userInfoUrl = new URL("/auth/platform/userinfo", platformBaseUrl).href;
|
|
@@ -1134,11 +1171,11 @@ async function fetchUserInfo(accessToken) {
|
|
|
1134
1171
|
}
|
|
1135
1172
|
/**
|
|
1136
1173
|
* Resolve "name:url" patterns to actual Static Website URLs.
|
|
1137
|
-
* @param
|
|
1138
|
-
* @param
|
|
1139
|
-
* @param
|
|
1140
|
-
* @param
|
|
1141
|
-
* @returns
|
|
1174
|
+
* @param client - Operator client instance
|
|
1175
|
+
* @param workspaceId - Workspace ID
|
|
1176
|
+
* @param urls - URLs or name:url patterns
|
|
1177
|
+
* @param context - Logging context (e.g., "CORS", "OAuth2 redirect URIs")
|
|
1178
|
+
* @returns Resolved URLs
|
|
1142
1179
|
*/
|
|
1143
1180
|
async function resolveStaticWebsiteUrls(client, workspaceId, urls, context) {
|
|
1144
1181
|
if (!urls) return [];
|
|
@@ -1167,10 +1204,10 @@ async function resolveStaticWebsiteUrls(client, workspaceId, urls, context) {
|
|
|
1167
1204
|
}
|
|
1168
1205
|
/**
|
|
1169
1206
|
* Fetch an OAuth2 access token for a machine user.
|
|
1170
|
-
* @param
|
|
1171
|
-
* @param
|
|
1172
|
-
* @param
|
|
1173
|
-
* @returns
|
|
1207
|
+
* @param url - OAuth2 server base URL
|
|
1208
|
+
* @param clientId - Client ID for the machine user
|
|
1209
|
+
* @param clientSecret - Client secret for the machine user
|
|
1210
|
+
* @returns Access token
|
|
1174
1211
|
*/
|
|
1175
1212
|
async function fetchMachineUserToken(url, clientId, clientSecret) {
|
|
1176
1213
|
const tokenEndpoint = new URL("/oauth2/token", url).href;
|
|
@@ -1216,7 +1253,7 @@ function platformConfigPath() {
|
|
|
1216
1253
|
}
|
|
1217
1254
|
/**
|
|
1218
1255
|
* Read Tailor Platform CLI configuration, migrating from tailorctl if necessary.
|
|
1219
|
-
* @returns
|
|
1256
|
+
* @returns Parsed platform configuration
|
|
1220
1257
|
*/
|
|
1221
1258
|
function readPlatformConfig() {
|
|
1222
1259
|
const configPath = platformConfigPath();
|
|
@@ -1237,8 +1274,7 @@ function readPlatformConfig() {
|
|
|
1237
1274
|
}
|
|
1238
1275
|
/**
|
|
1239
1276
|
* Write Tailor Platform CLI configuration to disk.
|
|
1240
|
-
* @param
|
|
1241
|
-
* @returns {void}
|
|
1277
|
+
* @param config - Platform configuration to write
|
|
1242
1278
|
*/
|
|
1243
1279
|
function writePlatformConfig(config) {
|
|
1244
1280
|
const configPath = platformConfigPath();
|
|
@@ -1295,10 +1331,8 @@ function validateUUID(value, source) {
|
|
|
1295
1331
|
/**
|
|
1296
1332
|
* Load workspace ID from command options, environment variables, or platform config.
|
|
1297
1333
|
* Priority: opts/workspaceId > env/workspaceId > opts/profile > env/profile > error
|
|
1298
|
-
* @param
|
|
1299
|
-
* @
|
|
1300
|
-
* @param {string} [opts.profile] - Workspace profile name
|
|
1301
|
-
* @returns {string} Resolved workspace ID
|
|
1334
|
+
* @param opts - Workspace and profile options
|
|
1335
|
+
* @returns Resolved workspace ID
|
|
1302
1336
|
*/
|
|
1303
1337
|
function loadWorkspaceId(opts) {
|
|
1304
1338
|
if (opts?.workspaceId) return validateUUID(opts.workspaceId, "--workspace-id option");
|
|
@@ -1317,10 +1351,8 @@ function loadWorkspaceId(opts) {
|
|
|
1317
1351
|
/**
|
|
1318
1352
|
* Load access token from command options, environment variables, or platform config.
|
|
1319
1353
|
* Priority: env/TAILOR_PLATFORM_TOKEN > env/TAILOR_TOKEN (deprecated) > opts/profile > env/profile > config/currentUser > error
|
|
1320
|
-
* @param
|
|
1321
|
-
* @
|
|
1322
|
-
* @param {string} [opts.profile] - Profile name
|
|
1323
|
-
* @returns {Promise<string>} Resolved access token
|
|
1354
|
+
* @param opts - Profile options
|
|
1355
|
+
* @returns Resolved access token
|
|
1324
1356
|
*/
|
|
1325
1357
|
async function loadAccessToken(opts) {
|
|
1326
1358
|
if (process.env.TAILOR_PLATFORM_TOKEN) return process.env.TAILOR_PLATFORM_TOKEN;
|
|
@@ -1347,9 +1379,9 @@ async function loadAccessToken(opts) {
|
|
|
1347
1379
|
}
|
|
1348
1380
|
/**
|
|
1349
1381
|
* Fetch the latest access token, refreshing if necessary.
|
|
1350
|
-
* @param
|
|
1351
|
-
* @param
|
|
1352
|
-
* @returns
|
|
1382
|
+
* @param config - Platform config
|
|
1383
|
+
* @param user - User name
|
|
1384
|
+
* @returns Latest access token
|
|
1353
1385
|
*/
|
|
1354
1386
|
async function fetchLatestToken(config, user) {
|
|
1355
1387
|
const tokens = config.users[user];
|
|
@@ -1384,8 +1416,8 @@ const DEFAULT_CONFIG_FILENAME = "tailor.config.ts";
|
|
|
1384
1416
|
/**
|
|
1385
1417
|
* Load config path from command options or environment variables.
|
|
1386
1418
|
* Priority: opts/config > env/config > search parent directories
|
|
1387
|
-
* @param
|
|
1388
|
-
* @returns
|
|
1419
|
+
* @param configPath - Optional explicit config path
|
|
1420
|
+
* @returns Resolved config path or undefined
|
|
1389
1421
|
*/
|
|
1390
1422
|
function loadConfigPath(configPath) {
|
|
1391
1423
|
if (configPath) return configPath;
|
|
@@ -1395,8 +1427,8 @@ function loadConfigPath(configPath) {
|
|
|
1395
1427
|
/**
|
|
1396
1428
|
* Load organization ID from command options or environment variables.
|
|
1397
1429
|
* Priority: opts/organizationId > env/organizationId > undefined (optional)
|
|
1398
|
-
* @param
|
|
1399
|
-
* @returns
|
|
1430
|
+
* @param organizationId - Organization ID override
|
|
1431
|
+
* @returns Resolved organization ID or undefined
|
|
1400
1432
|
*/
|
|
1401
1433
|
function loadOrganizationId(organizationId) {
|
|
1402
1434
|
if (organizationId) return validateUUID(organizationId, "--organization-id option");
|
|
@@ -1405,8 +1437,8 @@ function loadOrganizationId(organizationId) {
|
|
|
1405
1437
|
/**
|
|
1406
1438
|
* Load folder ID from command options or environment variables.
|
|
1407
1439
|
* Priority: opts/folderId > env/folderId > undefined (optional)
|
|
1408
|
-
* @param
|
|
1409
|
-
* @returns
|
|
1440
|
+
* @param folderId - Folder ID override
|
|
1441
|
+
* @returns Resolved folder ID or undefined
|
|
1410
1442
|
*/
|
|
1411
1443
|
function loadFolderId(folderId) {
|
|
1412
1444
|
if (folderId) return validateUUID(folderId, "--folder-id option");
|
|
@@ -1418,8 +1450,8 @@ function loadFolderId(folderId) {
|
|
|
1418
1450
|
/**
|
|
1419
1451
|
* Call Tailor Platform API endpoints directly.
|
|
1420
1452
|
* If the endpoint doesn't contain "/", it defaults to `tailor.v1.OperatorService/{endpoint}`.
|
|
1421
|
-
* @param
|
|
1422
|
-
* @returns
|
|
1453
|
+
* @param options - API call options (profile, endpoint, body)
|
|
1454
|
+
* @returns Response status and data
|
|
1423
1455
|
*/
|
|
1424
1456
|
async function apiCall(options) {
|
|
1425
1457
|
const accessToken = await loadAccessToken({
|
|
@@ -1647,7 +1679,8 @@ const AuthConfigSchema = z.object({
|
|
|
1647
1679
|
oauth2Clients: z.record(z.string(), OAuth2ClientSchema).optional(),
|
|
1648
1680
|
idProvider: IdProviderSchema.optional(),
|
|
1649
1681
|
scim: SCIMSchema.optional(),
|
|
1650
|
-
tenantProvider: TenantProviderSchema.optional()
|
|
1682
|
+
tenantProvider: TenantProviderSchema.optional(),
|
|
1683
|
+
publishSessionEvents: z.boolean().optional()
|
|
1651
1684
|
}).brand("AuthConfig");
|
|
1652
1685
|
|
|
1653
1686
|
//#endregion
|
|
@@ -1715,8 +1748,8 @@ const DEFAULT_IGNORE_PATTERNS = ["**/*.test.ts", "**/*.spec.ts"];
|
|
|
1715
1748
|
/**
|
|
1716
1749
|
* Load files matching the given patterns, excluding files that match ignore patterns.
|
|
1717
1750
|
* By default, test files (*.test.ts, *.spec.ts) are excluded unless ignores is explicitly specified.
|
|
1718
|
-
* @param
|
|
1719
|
-
* @returns
|
|
1751
|
+
* @param config - Configuration with files patterns and optional ignores patterns
|
|
1752
|
+
* @returns Array of absolute file paths
|
|
1720
1753
|
*/
|
|
1721
1754
|
function loadFilesWithIgnores(config) {
|
|
1722
1755
|
const ignorePatterns = config.ignores ?? DEFAULT_IGNORE_PATTERNS;
|
|
@@ -1950,8 +1983,8 @@ const tailorUserMap = `{ id: user.id, type: user.type, workspaceId: user.workspa
|
|
|
1950
1983
|
* Convert a function to a string representation.
|
|
1951
1984
|
* Handles method shorthand syntax (e.g., `create() { ... }`) by converting it to
|
|
1952
1985
|
* a function expression (e.g., `function create() { ... }`).
|
|
1953
|
-
* @param
|
|
1954
|
-
* @returns
|
|
1986
|
+
* @param fn - Function to stringify
|
|
1987
|
+
* @returns Stringified function source
|
|
1955
1988
|
*/
|
|
1956
1989
|
const stringifyFunction = (fn) => {
|
|
1957
1990
|
const src = fn.toString().trim();
|
|
@@ -1960,8 +1993,8 @@ const stringifyFunction = (fn) => {
|
|
|
1960
1993
|
};
|
|
1961
1994
|
/**
|
|
1962
1995
|
* Convert a hook function to a script expression.
|
|
1963
|
-
* @param
|
|
1964
|
-
* @returns
|
|
1996
|
+
* @param fn - Hook function
|
|
1997
|
+
* @returns JavaScript expression calling the hook
|
|
1965
1998
|
*/
|
|
1966
1999
|
const convertHookToExpr = (fn) => {
|
|
1967
2000
|
return `(${stringifyFunction(fn)})({ value: _value, data: _data, user: ${tailorUserMap} })`;
|
|
@@ -1969,8 +2002,8 @@ const convertHookToExpr = (fn) => {
|
|
|
1969
2002
|
/**
|
|
1970
2003
|
* Parse TailorDBField into OperatorFieldConfig.
|
|
1971
2004
|
* This transforms user-defined functions into script expressions.
|
|
1972
|
-
* @param
|
|
1973
|
-
* @returns
|
|
2005
|
+
* @param field - TailorDB field definition
|
|
2006
|
+
* @returns Parsed operator field configuration
|
|
1974
2007
|
*/
|
|
1975
2008
|
function parseFieldConfig(field) {
|
|
1976
2009
|
const metadata = field.metadata;
|
|
@@ -2042,8 +2075,8 @@ function isSingleArrayConditionFormat(cond) {
|
|
|
2042
2075
|
* Normalize record-level permissions into a standard structure.
|
|
2043
2076
|
* @template User
|
|
2044
2077
|
* @template Type
|
|
2045
|
-
* @param
|
|
2046
|
-
* @returns
|
|
2078
|
+
* @param permission - Tailor type permission
|
|
2079
|
+
* @returns Normalized record permissions
|
|
2047
2080
|
*/
|
|
2048
2081
|
function normalizePermission(permission) {
|
|
2049
2082
|
return Object.keys(permission).reduce((acc, action) => {
|
|
@@ -2053,8 +2086,8 @@ function normalizePermission(permission) {
|
|
|
2053
2086
|
}
|
|
2054
2087
|
/**
|
|
2055
2088
|
* Normalize GraphQL permissions into a standard structure.
|
|
2056
|
-
* @param
|
|
2057
|
-
* @returns
|
|
2089
|
+
* @param permission - Tailor GQL permission
|
|
2090
|
+
* @returns Normalized GQL permissions
|
|
2058
2091
|
*/
|
|
2059
2092
|
function normalizeGqlPermission(permission) {
|
|
2060
2093
|
return permission.map((policy) => normalizeGqlPolicy(policy));
|
|
@@ -2070,8 +2103,8 @@ function normalizeGqlPolicy(policy) {
|
|
|
2070
2103
|
/**
|
|
2071
2104
|
* Parse raw permissions into normalized permissions.
|
|
2072
2105
|
* This is the main entry point for permission parsing in the parser layer.
|
|
2073
|
-
* @param
|
|
2074
|
-
* @returns
|
|
2106
|
+
* @param rawPermissions - Raw permissions definition
|
|
2107
|
+
* @returns Normalized permissions
|
|
2075
2108
|
*/
|
|
2076
2109
|
function parsePermissions(rawPermissions) {
|
|
2077
2110
|
return {
|
|
@@ -2081,8 +2114,8 @@ function parsePermissions(rawPermissions) {
|
|
|
2081
2114
|
}
|
|
2082
2115
|
/**
|
|
2083
2116
|
* Normalize a single action permission into the standard format.
|
|
2084
|
-
* @param
|
|
2085
|
-
* @returns
|
|
2117
|
+
* @param permission - Raw permission definition
|
|
2118
|
+
* @returns Normalized action permission
|
|
2086
2119
|
*/
|
|
2087
2120
|
function normalizeActionPermission(permission) {
|
|
2088
2121
|
if (isObjectFormat(permission)) {
|
|
@@ -2136,8 +2169,8 @@ function fieldRef(context) {
|
|
|
2136
2169
|
}
|
|
2137
2170
|
/**
|
|
2138
2171
|
* Validate relation configuration.
|
|
2139
|
-
* @param
|
|
2140
|
-
* @param
|
|
2172
|
+
* @param rawRelation - Raw relation configuration from TailorDB type definition
|
|
2173
|
+
* @param context - Context information for the relation (type name, field name, all type names)
|
|
2141
2174
|
*/
|
|
2142
2175
|
function validateRelationConfig(rawRelation, context) {
|
|
2143
2176
|
if (!rawRelation.type) throw new Error(`${fieldRef(context)} has a relation but is missing the required 'type' property. Valid values: ${Object.keys(relationTypes).join(", ")}.`);
|
|
@@ -2146,10 +2179,10 @@ function validateRelationConfig(rawRelation, context) {
|
|
|
2146
2179
|
}
|
|
2147
2180
|
/**
|
|
2148
2181
|
* Process raw relation config and compute derived metadata values.
|
|
2149
|
-
* @param
|
|
2150
|
-
* @param
|
|
2151
|
-
* @param
|
|
2152
|
-
* @returns
|
|
2182
|
+
* @param rawRelation - Raw relation configuration
|
|
2183
|
+
* @param context - Context information for the relation
|
|
2184
|
+
* @param isArrayField - Whether the target field is an array field
|
|
2185
|
+
* @returns Computed relation metadata to apply to field config
|
|
2153
2186
|
*/
|
|
2154
2187
|
function processRelationMetadata(rawRelation, context, isArrayField = false) {
|
|
2155
2188
|
const isUnique = relationTypes[rawRelation.type] === "1-1";
|
|
@@ -2169,9 +2202,9 @@ function processRelationMetadata(rawRelation, context, isArrayField = false) {
|
|
|
2169
2202
|
/**
|
|
2170
2203
|
* Build relation info for creating forward/backward relationships.
|
|
2171
2204
|
* Returns undefined for keyOnly relations.
|
|
2172
|
-
* @param
|
|
2173
|
-
* @param
|
|
2174
|
-
* @returns
|
|
2205
|
+
* @param rawRelation - Raw relation configuration
|
|
2206
|
+
* @param context - Context information for the relation
|
|
2207
|
+
* @returns Relation information or undefined for keyOnly relations
|
|
2175
2208
|
*/
|
|
2176
2209
|
function buildRelationInfo(rawRelation, context) {
|
|
2177
2210
|
if (rawRelation.type === "keyOnly") return;
|
|
@@ -2191,9 +2224,9 @@ function buildRelationInfo(rawRelation, context) {
|
|
|
2191
2224
|
}
|
|
2192
2225
|
/**
|
|
2193
2226
|
* Apply processed relation metadata to field config.
|
|
2194
|
-
* @param
|
|
2195
|
-
* @param
|
|
2196
|
-
* @returns
|
|
2227
|
+
* @param fieldConfig - Original operator field configuration
|
|
2228
|
+
* @param metadata - Processed relation metadata to apply
|
|
2229
|
+
* @returns Field config with relation metadata applied
|
|
2197
2230
|
*/
|
|
2198
2231
|
function applyRelationMetadataToFieldConfig(fieldConfig, metadata) {
|
|
2199
2232
|
return {
|
|
@@ -70328,7 +70361,7 @@ var require_schema_obj = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
70328
70361
|
}));
|
|
70329
70362
|
|
|
70330
70363
|
//#endregion
|
|
70331
|
-
//#region ../../node_modules/json-schema-traverse/index.js
|
|
70364
|
+
//#region ../../node_modules/ajv/node_modules/json-schema-traverse/index.js
|
|
70332
70365
|
var require_json_schema_traverse = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
70333
70366
|
var traverse = module.exports = function(schema, opts, cb) {
|
|
70334
70367
|
if (typeof opts == "function") {
|
|
@@ -88273,7 +88306,7 @@ var require_eslint_helpers = /* @__PURE__ */ __commonJSMin(((exports, module) =>
|
|
|
88273
88306
|
*/
|
|
88274
88307
|
async function globMatch({ basePath, pattern }) {
|
|
88275
88308
|
let found = false;
|
|
88276
|
-
const { hfs } = await import("./src-
|
|
88309
|
+
const { hfs } = await import("./src-Bhwd-tei.mjs");
|
|
88277
88310
|
const matcher = new Minimatch(normalizeToPosix(path$9.relative(basePath, pattern)), MINIMATCH_OPTIONS);
|
|
88278
88311
|
const walkSettings = {
|
|
88279
88312
|
directoryFilter(entry) {
|
|
@@ -88320,7 +88353,7 @@ var require_eslint_helpers = /* @__PURE__ */ __commonJSMin(((exports, module) =>
|
|
|
88320
88353
|
return new Minimatch(patternToUse, MINIMATCH_OPTIONS);
|
|
88321
88354
|
});
|
|
88322
88355
|
const unmatchedPatterns = new Set([...relativeToPatterns.keys()]);
|
|
88323
|
-
const { hfs } = await import("./src-
|
|
88356
|
+
const { hfs } = await import("./src-Bhwd-tei.mjs");
|
|
88324
88357
|
const walk = hfs.walk(basePath, {
|
|
88325
88358
|
async directoryFilter(entry) {
|
|
88326
88359
|
if (!matchers.some((matcher) => matcher.match(entry.path, true))) return false;
|
|
@@ -98977,9 +99010,8 @@ const eslintConfig = {
|
|
|
98977
99010
|
};
|
|
98978
99011
|
/**
|
|
98979
99012
|
* Ensure that a TailorDB script expression does not reference external variables.
|
|
98980
|
-
* @param
|
|
98981
|
-
* @param
|
|
98982
|
-
* @returns {void}
|
|
99013
|
+
* @param expr - JavaScript expression to validate
|
|
99014
|
+
* @param ctx - Script context (type, field, kind)
|
|
98983
99015
|
*/
|
|
98984
99016
|
function ensureNoExternalVariablesInScript(expr, ctx) {
|
|
98985
99017
|
if (!expr.trim()) return;
|
|
@@ -99001,10 +99033,9 @@ function ensureNoExternalVariablesInScript(expr, ctx) {
|
|
|
99001
99033
|
}
|
|
99002
99034
|
/**
|
|
99003
99035
|
* Ensure that TailorDB field scripts do not capture external variables.
|
|
99004
|
-
* @param
|
|
99005
|
-
* @param
|
|
99006
|
-
* @param
|
|
99007
|
-
* @returns {void}
|
|
99036
|
+
* @param typeName - TailorDB type name
|
|
99037
|
+
* @param fieldName - Field name
|
|
99038
|
+
* @param fieldConfig - Parsed field configuration
|
|
99008
99039
|
*/
|
|
99009
99040
|
function ensureNoExternalVariablesInFieldScripts(typeName, fieldName, fieldConfig) {
|
|
99010
99041
|
for (const validateConfig of fieldConfig.validate ?? []) {
|
|
@@ -99032,10 +99063,10 @@ function ensureNoExternalVariablesInFieldScripts(typeName, fieldName, fieldConfi
|
|
|
99032
99063
|
/**
|
|
99033
99064
|
* Parse multiple TailorDB types, build relationships, and validate uniqueness.
|
|
99034
99065
|
* This is the main entry point for parsing TailorDB types.
|
|
99035
|
-
* @param
|
|
99036
|
-
* @param
|
|
99037
|
-
* @param
|
|
99038
|
-
* @returns
|
|
99066
|
+
* @param rawTypes - Raw TailorDB types keyed by name
|
|
99067
|
+
* @param namespace - TailorDB namespace name
|
|
99068
|
+
* @param typeSourceInfo - Optional type source information
|
|
99069
|
+
* @returns Parsed types
|
|
99039
99070
|
*/
|
|
99040
99071
|
function parseTypes(rawTypes, namespace, typeSourceInfo) {
|
|
99041
99072
|
const types$2 = {};
|
|
@@ -99047,10 +99078,10 @@ function parseTypes(rawTypes, namespace, typeSourceInfo) {
|
|
|
99047
99078
|
}
|
|
99048
99079
|
/**
|
|
99049
99080
|
* Parse a TailorDBType into a ParsedTailorDBType.
|
|
99050
|
-
* @param
|
|
99051
|
-
* @param
|
|
99052
|
-
* @param
|
|
99053
|
-
* @returns
|
|
99081
|
+
* @param type - TailorDB type to parse
|
|
99082
|
+
* @param allTypeNames - Set of all TailorDB type names
|
|
99083
|
+
* @param rawTypes - All raw TailorDB types keyed by name
|
|
99084
|
+
* @returns Parsed TailorDB type
|
|
99054
99085
|
*/
|
|
99055
99086
|
function parseTailorDBType(type, allTypeNames, rawTypes) {
|
|
99056
99087
|
const metadata = type.metadata;
|
|
@@ -99108,10 +99139,9 @@ function parseTailorDBType(type, allTypeNames, rawTypes) {
|
|
|
99108
99139
|
/**
|
|
99109
99140
|
* Build backward relationships between parsed types.
|
|
99110
99141
|
* Also validates that backward relation names are unique within each type.
|
|
99111
|
-
* @param
|
|
99112
|
-
* @param
|
|
99113
|
-
* @param
|
|
99114
|
-
* @returns {void}
|
|
99142
|
+
* @param types - Parsed types
|
|
99143
|
+
* @param namespace - TailorDB namespace name
|
|
99144
|
+
* @param typeSourceInfo - Optional type source information
|
|
99115
99145
|
*/
|
|
99116
99146
|
function buildBackwardRelationships(types$2, namespace, typeSourceInfo) {
|
|
99117
99147
|
const backwardNameSources = {};
|
|
@@ -99171,10 +99201,9 @@ function buildBackwardRelationships(types$2, namespace, typeSourceInfo) {
|
|
|
99171
99201
|
* Checks for:
|
|
99172
99202
|
* 1. Each type's singular query name != plural query name
|
|
99173
99203
|
* 2. No duplicate query names across all types
|
|
99174
|
-
* @param
|
|
99175
|
-
* @param
|
|
99176
|
-
* @param
|
|
99177
|
-
* @returns {void}
|
|
99204
|
+
* @param types - Parsed types
|
|
99205
|
+
* @param namespace - TailorDB namespace name
|
|
99206
|
+
* @param typeSourceInfo - Optional type source information
|
|
99178
99207
|
*/
|
|
99179
99208
|
function validatePluralFormUniqueness(types$2, namespace, typeSourceInfo) {
|
|
99180
99209
|
const errors = [];
|
|
@@ -99432,8 +99461,8 @@ var Application = class {
|
|
|
99432
99461
|
};
|
|
99433
99462
|
/**
|
|
99434
99463
|
* Define a Tailor application from the given configuration.
|
|
99435
|
-
* @param
|
|
99436
|
-
* @returns
|
|
99464
|
+
* @param config - Application configuration object
|
|
99465
|
+
* @returns Configured application instance
|
|
99437
99466
|
*/
|
|
99438
99467
|
function defineApplication(config) {
|
|
99439
99468
|
const app = new Application(config.name, config);
|
|
@@ -99464,8 +99493,8 @@ const WorkflowSchema = z.object({
|
|
|
99464
99493
|
/**
|
|
99465
99494
|
* Load workflow files and collect all jobs in a single pass.
|
|
99466
99495
|
* Dependencies are detected at bundle time via AST analysis.
|
|
99467
|
-
* @param
|
|
99468
|
-
* @returns
|
|
99496
|
+
* @param config - Workflow service configuration
|
|
99497
|
+
* @returns Loaded workflows and collected jobs
|
|
99469
99498
|
*/
|
|
99470
99499
|
async function loadAndCollectJobs(config) {
|
|
99471
99500
|
const workflows = {};
|
|
@@ -99512,7 +99541,7 @@ async function loadAndCollectJobs(config) {
|
|
|
99512
99541
|
}
|
|
99513
99542
|
/**
|
|
99514
99543
|
* Print workflow loading logs.
|
|
99515
|
-
* @param
|
|
99544
|
+
* @param result - Workflow load result to print
|
|
99516
99545
|
*/
|
|
99517
99546
|
function printLoadedWorkflows(result) {
|
|
99518
99547
|
if (result.fileCount === 0) return;
|
|
@@ -99525,8 +99554,8 @@ function printLoadedWorkflows(result) {
|
|
|
99525
99554
|
}
|
|
99526
99555
|
/**
|
|
99527
99556
|
* Load a single file and extract jobs and workflow
|
|
99528
|
-
* @param
|
|
99529
|
-
* @returns
|
|
99557
|
+
* @param filePath - Path to the workflow file
|
|
99558
|
+
* @returns Extracted jobs and workflow
|
|
99530
99559
|
*/
|
|
99531
99560
|
async function loadFileContent(filePath) {
|
|
99532
99561
|
const jobs = [];
|
|
@@ -99561,8 +99590,8 @@ async function loadFileContent(filePath) {
|
|
|
99561
99590
|
}
|
|
99562
99591
|
/**
|
|
99563
99592
|
* Check if a value is a WorkflowJob by looking for the brand symbol
|
|
99564
|
-
* @param
|
|
99565
|
-
* @returns
|
|
99593
|
+
* @param value - Value to check
|
|
99594
|
+
* @returns True if the value is a branded WorkflowJob
|
|
99566
99595
|
*/
|
|
99567
99596
|
function isWorkflowJob(value) {
|
|
99568
99597
|
return value != null && typeof value === "object" && WORKFLOW_JOB_BRAND in value && value[WORKFLOW_JOB_BRAND] === true;
|
|
@@ -99576,16 +99605,16 @@ const enableInlineSourcemap = process.env.TAILOR_ENABLE_INLINE_SOURCEMAP === "tr
|
|
|
99576
99605
|
//#region src/cli/bundler/workflow/ast-utils.ts
|
|
99577
99606
|
/**
|
|
99578
99607
|
* Check if a module source is from the Tailor SDK package (including subpaths)
|
|
99579
|
-
* @param
|
|
99580
|
-
* @returns
|
|
99608
|
+
* @param source - Module source string
|
|
99609
|
+
* @returns True if the source is from the Tailor SDK package
|
|
99581
99610
|
*/
|
|
99582
99611
|
function isTailorSdkSource(source) {
|
|
99583
99612
|
return /^@tailor-platform\/sdk(\/|$)/.test(source);
|
|
99584
99613
|
}
|
|
99585
99614
|
/**
|
|
99586
99615
|
* Get the source string from a dynamic import or require call
|
|
99587
|
-
* @param
|
|
99588
|
-
* @returns
|
|
99616
|
+
* @param node - AST node to inspect
|
|
99617
|
+
* @returns Resolved import/require source string or null
|
|
99589
99618
|
*/
|
|
99590
99619
|
function getImportSource(node) {
|
|
99591
99620
|
if (!node) return null;
|
|
@@ -99604,8 +99633,8 @@ function getImportSource(node) {
|
|
|
99604
99633
|
}
|
|
99605
99634
|
/**
|
|
99606
99635
|
* Unwrap AwaitExpression to get the inner expression
|
|
99607
|
-
* @param
|
|
99608
|
-
* @returns
|
|
99636
|
+
* @param node - AST expression node
|
|
99637
|
+
* @returns Inner expression if node is an AwaitExpression
|
|
99609
99638
|
*/
|
|
99610
99639
|
function unwrapAwait(node) {
|
|
99611
99640
|
if (node?.type === "AwaitExpression") return node.argument;
|
|
@@ -99613,25 +99642,25 @@ function unwrapAwait(node) {
|
|
|
99613
99642
|
}
|
|
99614
99643
|
/**
|
|
99615
99644
|
* Check if a node is a string literal
|
|
99616
|
-
* @param
|
|
99617
|
-
* @returns
|
|
99645
|
+
* @param node - AST expression node
|
|
99646
|
+
* @returns True if node is a string literal
|
|
99618
99647
|
*/
|
|
99619
99648
|
function isStringLiteral(node) {
|
|
99620
99649
|
return node?.type === "Literal" && typeof node.value === "string";
|
|
99621
99650
|
}
|
|
99622
99651
|
/**
|
|
99623
99652
|
* Check if a node is a function expression (arrow or regular)
|
|
99624
|
-
* @param
|
|
99625
|
-
* @returns
|
|
99653
|
+
* @param node - AST expression node
|
|
99654
|
+
* @returns True if node is a function expression
|
|
99626
99655
|
*/
|
|
99627
99656
|
function isFunctionExpression(node) {
|
|
99628
99657
|
return node?.type === "ArrowFunctionExpression" || node?.type === "FunctionExpression";
|
|
99629
99658
|
}
|
|
99630
99659
|
/**
|
|
99631
99660
|
* Find a property in an object expression
|
|
99632
|
-
* @param
|
|
99633
|
-
* @param
|
|
99634
|
-
* @returns
|
|
99661
|
+
* @param properties - Object properties to search
|
|
99662
|
+
* @param name - Property name to find
|
|
99663
|
+
* @returns Found property info or null
|
|
99635
99664
|
*/
|
|
99636
99665
|
function findProperty(properties, name$1) {
|
|
99637
99666
|
for (const prop of properties) if (prop.type === "Property") {
|
|
@@ -99648,9 +99677,9 @@ function findProperty(properties, name$1) {
|
|
|
99648
99677
|
/**
|
|
99649
99678
|
* Apply string replacements to source code
|
|
99650
99679
|
* Replacements are applied from end to start to maintain positions
|
|
99651
|
-
* @param
|
|
99652
|
-
* @param
|
|
99653
|
-
* @returns
|
|
99680
|
+
* @param source - Original source code
|
|
99681
|
+
* @param replacements - Replacements to apply
|
|
99682
|
+
* @returns Transformed source code
|
|
99654
99683
|
*/
|
|
99655
99684
|
function applyReplacements(source, replacements) {
|
|
99656
99685
|
const sorted = [...replacements].sort((a, b) => b.start - a.start);
|
|
@@ -99660,9 +99689,9 @@ function applyReplacements(source, replacements) {
|
|
|
99660
99689
|
}
|
|
99661
99690
|
/**
|
|
99662
99691
|
* Find the end of a statement including any trailing newline
|
|
99663
|
-
* @param
|
|
99664
|
-
* @param
|
|
99665
|
-
* @returns
|
|
99692
|
+
* @param source - Source code
|
|
99693
|
+
* @param position - Start position of the statement
|
|
99694
|
+
* @returns Index of the end of the statement including trailing newline
|
|
99666
99695
|
*/
|
|
99667
99696
|
function findStatementEnd(source, position) {
|
|
99668
99697
|
let i$1 = position;
|
|
@@ -99673,9 +99702,9 @@ function findStatementEnd(source, position) {
|
|
|
99673
99702
|
/**
|
|
99674
99703
|
* Resolve a relative path from a base directory
|
|
99675
99704
|
* Simple implementation that handles ./ and ../ prefixes
|
|
99676
|
-
* @param
|
|
99677
|
-
* @param
|
|
99678
|
-
* @returns
|
|
99705
|
+
* @param baseDir - Base directory
|
|
99706
|
+
* @param relativePath - Relative path to resolve
|
|
99707
|
+
* @returns Resolved absolute path
|
|
99679
99708
|
*/
|
|
99680
99709
|
function resolvePath(baseDir, relativePath) {
|
|
99681
99710
|
const parts = relativePath.replace(/\\/g, "/").split("/");
|
|
@@ -99690,9 +99719,9 @@ function resolvePath(baseDir, relativePath) {
|
|
|
99690
99719
|
/**
|
|
99691
99720
|
* Collect all import bindings for a specific function from the Tailor SDK package
|
|
99692
99721
|
* Returns a Set of local names that refer to the function
|
|
99693
|
-
* @param
|
|
99694
|
-
* @param
|
|
99695
|
-
* @returns
|
|
99722
|
+
* @param program - Parsed TypeScript program
|
|
99723
|
+
* @param functionName - Function name to collect bindings for
|
|
99724
|
+
* @returns Set of local names bound to the SDK function
|
|
99696
99725
|
*/
|
|
99697
99726
|
function collectSdkBindings(program, functionName) {
|
|
99698
99727
|
const bindings = /* @__PURE__ */ new Set();
|
|
@@ -99745,10 +99774,10 @@ function collectSdkBindings(program, functionName) {
|
|
|
99745
99774
|
}
|
|
99746
99775
|
/**
|
|
99747
99776
|
* Check if a CallExpression is a call to a specific SDK function
|
|
99748
|
-
* @param
|
|
99749
|
-
* @param
|
|
99750
|
-
* @param
|
|
99751
|
-
* @returns
|
|
99777
|
+
* @param node - AST node to inspect
|
|
99778
|
+
* @param bindings - Collected SDK bindings
|
|
99779
|
+
* @param functionName - SDK function name
|
|
99780
|
+
* @returns True if node is a call to the SDK function
|
|
99752
99781
|
*/
|
|
99753
99782
|
function isSdkFunctionCall(node, bindings, functionName) {
|
|
99754
99783
|
if (node.type !== "CallExpression") return false;
|
|
@@ -99771,10 +99800,10 @@ function isSdkFunctionCall(node, bindings, functionName) {
|
|
|
99771
99800
|
//#endregion
|
|
99772
99801
|
//#region src/cli/bundler/workflow/job-detector.ts
|
|
99773
99802
|
/**
|
|
99774
|
-
* Find all workflow jobs by detecting createWorkflowJob calls from
|
|
99775
|
-
* @param
|
|
99776
|
-
* @param
|
|
99777
|
-
* @returns
|
|
99803
|
+
* Find all workflow jobs by detecting createWorkflowJob calls from @tailor-platform/sdk
|
|
99804
|
+
* @param program - Parsed TypeScript program
|
|
99805
|
+
* @param _sourceText - Source code text (currently unused)
|
|
99806
|
+
* @returns Detected job locations
|
|
99778
99807
|
*/
|
|
99779
99808
|
function findAllJobs(program, _sourceText) {
|
|
99780
99809
|
const jobs = [];
|
|
@@ -99829,8 +99858,8 @@ function findAllJobs(program, _sourceText) {
|
|
|
99829
99858
|
}
|
|
99830
99859
|
/**
|
|
99831
99860
|
* Build a map from export name to job name from detected jobs
|
|
99832
|
-
* @param
|
|
99833
|
-
* @returns
|
|
99861
|
+
* @param jobs - Detected job locations
|
|
99862
|
+
* @returns Map from export name to job name
|
|
99834
99863
|
*/
|
|
99835
99864
|
function buildJobNameMap(jobs) {
|
|
99836
99865
|
const map = /* @__PURE__ */ new Map();
|
|
@@ -99840,9 +99869,9 @@ function buildJobNameMap(jobs) {
|
|
|
99840
99869
|
/**
|
|
99841
99870
|
* Detect all .trigger() calls in the source code
|
|
99842
99871
|
* Returns information about each trigger call for transformation
|
|
99843
|
-
* @param
|
|
99844
|
-
* @param
|
|
99845
|
-
* @returns
|
|
99872
|
+
* @param program - Parsed TypeScript program
|
|
99873
|
+
* @param sourceText - Source code text
|
|
99874
|
+
* @returns Detected trigger calls
|
|
99846
99875
|
*/
|
|
99847
99876
|
function detectTriggerCalls(program, sourceText) {
|
|
99848
99877
|
const calls = [];
|
|
@@ -99894,10 +99923,10 @@ function detectTriggerCalls(program, sourceText) {
|
|
|
99894
99923
|
//#endregion
|
|
99895
99924
|
//#region src/cli/bundler/workflow/workflow-detector.ts
|
|
99896
99925
|
/**
|
|
99897
|
-
* Find all workflows by detecting createWorkflow calls from
|
|
99898
|
-
* @param
|
|
99899
|
-
* @param
|
|
99900
|
-
* @returns
|
|
99926
|
+
* Find all workflows by detecting createWorkflow calls from @tailor-platform/sdk
|
|
99927
|
+
* @param program - Parsed TypeScript program
|
|
99928
|
+
* @param _sourceText - Source code text (currently unused)
|
|
99929
|
+
* @returns Detected workflows
|
|
99901
99930
|
*/
|
|
99902
99931
|
function findAllWorkflows(program, _sourceText) {
|
|
99903
99932
|
const workflows = [];
|
|
@@ -99943,8 +99972,8 @@ function findAllWorkflows(program, _sourceText) {
|
|
|
99943
99972
|
}
|
|
99944
99973
|
/**
|
|
99945
99974
|
* Build a map from export name to workflow name from detected workflows
|
|
99946
|
-
* @param
|
|
99947
|
-
* @returns
|
|
99975
|
+
* @param workflows - Detected workflows
|
|
99976
|
+
* @returns Map from export name to workflow name
|
|
99948
99977
|
*/
|
|
99949
99978
|
function buildWorkflowNameMap(workflows) {
|
|
99950
99979
|
const map = /* @__PURE__ */ new Map();
|
|
@@ -99953,8 +99982,8 @@ function buildWorkflowNameMap(workflows) {
|
|
|
99953
99982
|
}
|
|
99954
99983
|
/**
|
|
99955
99984
|
* Detect default imports in a source file and return a map from local name to import source
|
|
99956
|
-
* @param
|
|
99957
|
-
* @returns
|
|
99985
|
+
* @param program - Parsed TypeScript program
|
|
99986
|
+
* @returns Map from local name to import source
|
|
99958
99987
|
*/
|
|
99959
99988
|
function detectDefaultImports(program) {
|
|
99960
99989
|
const imports = /* @__PURE__ */ new Map();
|
|
@@ -99985,9 +100014,9 @@ function detectDefaultImports(program) {
|
|
|
99985
100014
|
/**
|
|
99986
100015
|
* Extract authInvoker info from a config object expression
|
|
99987
100016
|
* Returns the authInvoker value text and whether it's a shorthand property
|
|
99988
|
-
* @param
|
|
99989
|
-
* @param
|
|
99990
|
-
* @returns
|
|
100017
|
+
* @param configArg - Config argument node
|
|
100018
|
+
* @param sourceText - Source code text
|
|
100019
|
+
* @returns Extracted authInvoker info, if any
|
|
99991
100020
|
*/
|
|
99992
100021
|
function extractAuthInvokerInfo(configArg, sourceText) {
|
|
99993
100022
|
if (!configArg || typeof configArg !== "object") return void 0;
|
|
@@ -100011,11 +100040,11 @@ function extractAuthInvokerInfo(configArg, sourceText) {
|
|
|
100011
100040
|
/**
|
|
100012
100041
|
* Detect .trigger() calls for known workflows and jobs
|
|
100013
100042
|
* Only detects calls where the identifier is in workflowNames or jobNames
|
|
100014
|
-
* @param
|
|
100015
|
-
* @param
|
|
100016
|
-
* @param
|
|
100017
|
-
* @param
|
|
100018
|
-
* @returns
|
|
100043
|
+
* @param program - The parsed AST program
|
|
100044
|
+
* @param sourceText - The source code text
|
|
100045
|
+
* @param workflowNames - Set of known workflow identifier names
|
|
100046
|
+
* @param jobNames - Set of known job identifier names
|
|
100047
|
+
* @returns Detected trigger call metadata
|
|
100019
100048
|
*/
|
|
100020
100049
|
function detectExtendedTriggerCalls(program, sourceText, workflowNames, jobNames) {
|
|
100021
100050
|
const calls = [];
|
|
@@ -100082,12 +100111,12 @@ function detectExtendedTriggerCalls(program, sourceText, workflowNames, jobNames
|
|
|
100082
100111
|
/**
|
|
100083
100112
|
* Transform trigger calls for resolver/executor/workflow functions
|
|
100084
100113
|
* Handles both job.trigger() and workflow.trigger() calls
|
|
100085
|
-
* @param
|
|
100086
|
-
* @param
|
|
100087
|
-
* @param
|
|
100088
|
-
* @param
|
|
100089
|
-
* @param
|
|
100090
|
-
* @returns
|
|
100114
|
+
* @param source - The source code to transform
|
|
100115
|
+
* @param workflowNameMap - Map from variable name to workflow name
|
|
100116
|
+
* @param jobNameMap - Map from variable name to job name
|
|
100117
|
+
* @param workflowFileMap - Map from file path (without extension) to workflow name for default exports
|
|
100118
|
+
* @param currentFilePath - Path of the current file being transformed (for resolving relative imports)
|
|
100119
|
+
* @returns Transformed source code with trigger calls rewritten
|
|
100091
100120
|
*/
|
|
100092
100121
|
function transformFunctionTriggers(source, workflowNameMap, jobNameMap, workflowFileMap, currentFilePath) {
|
|
100093
100122
|
const { program } = parseSync("input.ts", source);
|
|
@@ -100134,8 +100163,8 @@ function transformFunctionTriggers(source, workflowNameMap, jobNameMap, workflow
|
|
|
100134
100163
|
//#region src/cli/bundler/trigger-context.ts
|
|
100135
100164
|
/**
|
|
100136
100165
|
* Normalize a file path by removing extension and resolving to absolute path
|
|
100137
|
-
* @param
|
|
100138
|
-
* @returns
|
|
100166
|
+
* @param filePath - File path to normalize
|
|
100167
|
+
* @returns Normalized absolute path without extension
|
|
100139
100168
|
*/
|
|
100140
100169
|
function normalizeFilePath(filePath) {
|
|
100141
100170
|
const absolutePath = path$20.resolve(filePath);
|
|
@@ -100145,8 +100174,8 @@ function normalizeFilePath(filePath) {
|
|
|
100145
100174
|
/**
|
|
100146
100175
|
* Build trigger context from workflow configuration
|
|
100147
100176
|
* Scans workflow files to collect workflow and job mappings
|
|
100148
|
-
* @param
|
|
100149
|
-
* @returns
|
|
100177
|
+
* @param workflowConfig - Workflow file loading configuration
|
|
100178
|
+
* @returns Trigger context built from workflow sources
|
|
100150
100179
|
*/
|
|
100151
100180
|
async function buildTriggerContext(workflowConfig) {
|
|
100152
100181
|
const workflowNameMap = /* @__PURE__ */ new Map();
|
|
@@ -100184,8 +100213,8 @@ async function buildTriggerContext(workflowConfig) {
|
|
|
100184
100213
|
/**
|
|
100185
100214
|
* Create a rolldown plugin for transforming trigger calls
|
|
100186
100215
|
* Returns undefined if no trigger context is provided
|
|
100187
|
-
* @param
|
|
100188
|
-
* @returns
|
|
100216
|
+
* @param triggerContext - Trigger context to use for transformations
|
|
100217
|
+
* @returns Rolldown plugin or undefined when no context
|
|
100189
100218
|
*/
|
|
100190
100219
|
function createTriggerTransformPlugin(triggerContext) {
|
|
100191
100220
|
if (!triggerContext) return;
|
|
@@ -100205,8 +100234,8 @@ function createTriggerTransformPlugin(triggerContext) {
|
|
|
100205
100234
|
//#region src/cli/bundler/executor/loader.ts
|
|
100206
100235
|
/**
|
|
100207
100236
|
* Load and validate an executor definition from a file.
|
|
100208
|
-
* @param
|
|
100209
|
-
* @returns
|
|
100237
|
+
* @param executorFilePath - Path to the executor file
|
|
100238
|
+
* @returns Parsed executor or null if invalid
|
|
100210
100239
|
*/
|
|
100211
100240
|
async function loadExecutor(executorFilePath) {
|
|
100212
100241
|
const executor = (await import(pathToFileURL(executorFilePath).href)).default;
|
|
@@ -100223,9 +100252,9 @@ async function loadExecutor(executorFilePath) {
|
|
|
100223
100252
|
* This function:
|
|
100224
100253
|
* 1. Creates entry file that extracts operation.body
|
|
100225
100254
|
* 2. Bundles in a single step with tree-shaking
|
|
100226
|
-
* @param
|
|
100227
|
-
* @param
|
|
100228
|
-
* @returns
|
|
100255
|
+
* @param config - Executor file loading configuration
|
|
100256
|
+
* @param triggerContext - Trigger context for workflow/job transformations
|
|
100257
|
+
* @returns Promise that resolves when bundling completes
|
|
100229
100258
|
*/
|
|
100230
100259
|
async function bundleExecutors(config, triggerContext) {
|
|
100231
100260
|
const files = loadFilesWithIgnores(config);
|
|
@@ -100269,7 +100298,7 @@ async function bundleExecutors(config, triggerContext) {
|
|
|
100269
100298
|
async function bundleSingleExecutor(executor, outputDir, tsconfig, triggerContext) {
|
|
100270
100299
|
const entryPath = path$20.join(outputDir, `${executor.name}.entry.js`);
|
|
100271
100300
|
const entryContent = ml`
|
|
100272
|
-
import _internalExecutor from "${path$20.resolve(executor.sourceFile)
|
|
100301
|
+
import _internalExecutor from "${path$20.resolve(executor.sourceFile)}";
|
|
100273
100302
|
|
|
100274
100303
|
const __executor_function = _internalExecutor.operation.body;
|
|
100275
100304
|
|
|
@@ -100303,8 +100332,8 @@ async function bundleSingleExecutor(executor, outputDir, tsconfig, triggerContex
|
|
|
100303
100332
|
//#region src/cli/bundler/resolver/loader.ts
|
|
100304
100333
|
/**
|
|
100305
100334
|
* Load and validate a resolver definition from a file.
|
|
100306
|
-
* @param
|
|
100307
|
-
* @returns
|
|
100335
|
+
* @param resolverFilePath - Path to the resolver file
|
|
100336
|
+
* @returns Parsed resolver or null if invalid
|
|
100308
100337
|
*/
|
|
100309
100338
|
async function loadResolver(resolverFilePath) {
|
|
100310
100339
|
const resolver = (await import(pathToFileURL(resolverFilePath).href)).default;
|
|
@@ -100322,10 +100351,10 @@ async function loadResolver(resolverFilePath) {
|
|
|
100322
100351
|
* 1. Uses a transform plugin to add validation wrapper during bundling
|
|
100323
100352
|
* 2. Creates entry file
|
|
100324
100353
|
* 3. Bundles in a single step with tree-shaking
|
|
100325
|
-
* @param
|
|
100326
|
-
* @param
|
|
100327
|
-
* @param
|
|
100328
|
-
* @returns
|
|
100354
|
+
* @param namespace - Resolver namespace name
|
|
100355
|
+
* @param config - Resolver file loading configuration
|
|
100356
|
+
* @param triggerContext - Trigger context for workflow/job transformations
|
|
100357
|
+
* @returns Promise that resolves when bundling completes
|
|
100329
100358
|
*/
|
|
100330
100359
|
async function bundleResolvers(namespace, config, triggerContext) {
|
|
100331
100360
|
const files = loadFilesWithIgnores(config);
|
|
@@ -100361,7 +100390,7 @@ async function bundleResolvers(namespace, config, triggerContext) {
|
|
|
100361
100390
|
async function bundleSingleResolver(resolver, outputDir, tsconfig, triggerContext) {
|
|
100362
100391
|
const entryPath = path$20.join(outputDir, `${resolver.name}.entry.js`);
|
|
100363
100392
|
const entryContent = ml`
|
|
100364
|
-
import _internalResolver from "${path$20.resolve(resolver.sourceFile)
|
|
100393
|
+
import _internalResolver from "${path$20.resolve(resolver.sourceFile)}";
|
|
100365
100394
|
import { t } from "@tailor-platform/sdk";
|
|
100366
100395
|
|
|
100367
100396
|
const $tailor_resolver_body = async (context) => {
|
|
@@ -100417,8 +100446,8 @@ async function bundleSingleResolver(resolver, outputDir, tsconfig, triggerContex
|
|
|
100417
100446
|
/**
|
|
100418
100447
|
* Find variable declarations by export names
|
|
100419
100448
|
* Returns a map of export name to statement range
|
|
100420
|
-
* @param
|
|
100421
|
-
* @returns
|
|
100449
|
+
* @param program - Parsed TypeScript program
|
|
100450
|
+
* @returns Map of export name to statement range
|
|
100422
100451
|
*/
|
|
100423
100452
|
function findVariableDeclarationsByName(program) {
|
|
100424
100453
|
const declarations = /* @__PURE__ */ new Map();
|
|
@@ -100457,8 +100486,8 @@ function findVariableDeclarationsByName(program) {
|
|
|
100457
100486
|
/**
|
|
100458
100487
|
* Find createWorkflow default export declarations
|
|
100459
100488
|
* Returns the range of the export statement to remove
|
|
100460
|
-
* @param
|
|
100461
|
-
* @returns
|
|
100489
|
+
* @param program - Parsed TypeScript program
|
|
100490
|
+
* @returns Range of the default export statement or null
|
|
100462
100491
|
*/
|
|
100463
100492
|
function findWorkflowDefaultExport(program) {
|
|
100464
100493
|
const bindings = collectSdkBindings(program, "createWorkflow");
|
|
@@ -100480,12 +100509,12 @@ function findWorkflowDefaultExport(program) {
|
|
|
100480
100509
|
* Transform workflow source code
|
|
100481
100510
|
* - Transform .trigger() calls to tailor.workflow.triggerJobFunction()
|
|
100482
100511
|
* - Other jobs: remove entire variable declaration
|
|
100483
|
-
* @param
|
|
100484
|
-
* @param
|
|
100485
|
-
* @param
|
|
100486
|
-
* @param
|
|
100487
|
-
* @param
|
|
100488
|
-
* @returns
|
|
100512
|
+
* @param source - The source code to transform
|
|
100513
|
+
* @param targetJobName - The name of the target job (from job config)
|
|
100514
|
+
* @param targetJobExportName - The export name of the target job (optional, for enhanced detection)
|
|
100515
|
+
* @param otherJobExportNames - Export names of other jobs to remove (optional, for enhanced detection)
|
|
100516
|
+
* @param allJobsMap - Map from export name to job name for trigger transformation (optional)
|
|
100517
|
+
* @returns Transformed workflow source code
|
|
100489
100518
|
*/
|
|
100490
100519
|
function transformWorkflowSource(source, targetJobName, targetJobExportName, otherJobExportNames, allJobsMap) {
|
|
100491
100520
|
const { program } = parseSync("input.ts", source);
|
|
@@ -100575,11 +100604,11 @@ function transformWorkflowSource(source, targetJobName, targetJobExportName, oth
|
|
|
100575
100604
|
* 3. Creates entry file and bundles with tree-shaking
|
|
100576
100605
|
*
|
|
100577
100606
|
* Returns metadata about which jobs each workflow uses.
|
|
100578
|
-
* @param
|
|
100579
|
-
* @param
|
|
100580
|
-
* @param
|
|
100581
|
-
* @param
|
|
100582
|
-
* @returns
|
|
100607
|
+
* @param allJobs - All available job infos
|
|
100608
|
+
* @param mainJobNames - Names of main jobs
|
|
100609
|
+
* @param env - Environment variables to inject
|
|
100610
|
+
* @param triggerContext - Trigger context for transformations
|
|
100611
|
+
* @returns Workflow job bundling result
|
|
100583
100612
|
*/
|
|
100584
100613
|
async function bundleWorkflowJobs(allJobs, mainJobNames, env = {}, triggerContext) {
|
|
100585
100614
|
if (allJobs.length === 0) {
|
|
@@ -100609,9 +100638,9 @@ async function bundleWorkflowJobs(allJobs, mainJobNames, env = {}, triggerContex
|
|
|
100609
100638
|
* - It's called via .trigger() from another used job (transitively)
|
|
100610
100639
|
*
|
|
100611
100640
|
* Also returns a map of mainJob -> all jobs it depends on (for metadata).
|
|
100612
|
-
* @param
|
|
100613
|
-
* @param
|
|
100614
|
-
* @returns
|
|
100641
|
+
* @param allJobs - All available job infos
|
|
100642
|
+
* @param mainJobNames - Names of main jobs
|
|
100643
|
+
* @returns Used jobs and main job dependency map
|
|
100615
100644
|
*/
|
|
100616
100645
|
async function filterUsedJobs(allJobs, mainJobNames) {
|
|
100617
100646
|
if (allJobs.length === 0 || mainJobNames.length === 0) return {
|
|
@@ -100676,7 +100705,7 @@ async function filterUsedJobs(allJobs, mainJobNames) {
|
|
|
100676
100705
|
}
|
|
100677
100706
|
async function bundleSingleJob(job, allJobs, outputDir, tsconfig, env, triggerContext) {
|
|
100678
100707
|
const entryPath = path$20.join(outputDir, `${job.name}.entry.js`);
|
|
100679
|
-
const absoluteSourcePath = path$20.resolve(job.sourceFile)
|
|
100708
|
+
const absoluteSourcePath = path$20.resolve(job.sourceFile);
|
|
100680
100709
|
const entryContent = ml`
|
|
100681
100710
|
import { ${job.exportName} } from "${absoluteSourcePath}";
|
|
100682
100711
|
|
|
@@ -100756,8 +100785,8 @@ const BaseGeneratorConfigSchema = z.union([
|
|
|
100756
100785
|
]);
|
|
100757
100786
|
/**
|
|
100758
100787
|
* Creates a GeneratorConfigSchema with built-in generator support
|
|
100759
|
-
* @param
|
|
100760
|
-
* @returns
|
|
100788
|
+
* @param builtinGenerators - Map of generator IDs to their constructor functions
|
|
100789
|
+
* @returns Generator config schema
|
|
100761
100790
|
*/
|
|
100762
100791
|
function createGeneratorConfigSchema(builtinGenerators$1) {
|
|
100763
100792
|
return z.union([
|
|
@@ -100782,10 +100811,9 @@ function createGeneratorConfigSchema(builtinGenerators$1) {
|
|
|
100782
100811
|
/**
|
|
100783
100812
|
* Type guard to check if a generator has a specific dependency.
|
|
100784
100813
|
* @template D
|
|
100785
|
-
* @param
|
|
100786
|
-
* @param
|
|
100787
|
-
* @
|
|
100788
|
-
* @returns {boolean} True if the generator has the dependency
|
|
100814
|
+
* @param generator - Code generator instance
|
|
100815
|
+
* @param dependency - Dependency kind to check
|
|
100816
|
+
* @returns True if the generator has the dependency
|
|
100789
100817
|
*/
|
|
100790
100818
|
function hasDependency(generator, dependency) {
|
|
100791
100819
|
return generator.dependencies.includes(dependency);
|
|
@@ -100831,8 +100859,8 @@ var EnumProcessor = class {
|
|
|
100831
100859
|
}
|
|
100832
100860
|
/**
|
|
100833
100861
|
* Generate enum constant definitions from collected metadata.
|
|
100834
|
-
* @param
|
|
100835
|
-
* @returns
|
|
100862
|
+
* @param allEnums - All collected enum definitions
|
|
100863
|
+
* @returns Generated enum constant definitions
|
|
100836
100864
|
*/
|
|
100837
100865
|
static generateUnifiedEnumConstants(allEnums) {
|
|
100838
100866
|
if (allEnums.length === 0) return "";
|
|
@@ -101044,8 +101072,8 @@ var FileUtilsGenerator = class {
|
|
|
101044
101072
|
var TypeProcessor = class {
|
|
101045
101073
|
/**
|
|
101046
101074
|
* Convert a ParsedTailorDBType into KyselyTypeMetadata.
|
|
101047
|
-
* @param
|
|
101048
|
-
* @returns
|
|
101075
|
+
* @param type - Parsed TailorDB type
|
|
101076
|
+
* @returns Generated Kysely type metadata
|
|
101049
101077
|
*/
|
|
101050
101078
|
static async processType(type) {
|
|
101051
101079
|
const result = this.generateTableInterface(type);
|
|
@@ -101057,8 +101085,8 @@ var TypeProcessor = class {
|
|
|
101057
101085
|
}
|
|
101058
101086
|
/**
|
|
101059
101087
|
* Generate the table interface.
|
|
101060
|
-
* @param
|
|
101061
|
-
* @returns
|
|
101088
|
+
* @param type - Parsed TailorDB type
|
|
101089
|
+
* @returns Table interface code and used utility types
|
|
101062
101090
|
*/
|
|
101063
101091
|
static generateTableInterface(type) {
|
|
101064
101092
|
const fieldResults = Object.entries(type.fields).filter(([fieldName]) => fieldName !== "id").map(([fieldName, parsedField]) => ({
|
|
@@ -101084,8 +101112,8 @@ var TypeProcessor = class {
|
|
|
101084
101112
|
}
|
|
101085
101113
|
/**
|
|
101086
101114
|
* Generate the complete field type including array and null modifiers.
|
|
101087
|
-
* @param
|
|
101088
|
-
* @returns
|
|
101115
|
+
* @param fieldConfig - Parsed field configuration
|
|
101116
|
+
* @returns Field type and used utility types
|
|
101089
101117
|
*/
|
|
101090
101118
|
static generateFieldType(fieldConfig) {
|
|
101091
101119
|
const baseTypeResult = this.getBaseType(fieldConfig);
|
|
@@ -101107,8 +101135,8 @@ var TypeProcessor = class {
|
|
|
101107
101135
|
}
|
|
101108
101136
|
/**
|
|
101109
101137
|
* Get the base Kysely type for a field (without array/null modifiers).
|
|
101110
|
-
* @param
|
|
101111
|
-
* @returns
|
|
101138
|
+
* @param fieldConfig - Parsed field configuration
|
|
101139
|
+
* @returns Base field type and used utility types
|
|
101112
101140
|
*/
|
|
101113
101141
|
static getBaseType(fieldConfig) {
|
|
101114
101142
|
const fieldType = fieldConfig.type;
|
|
@@ -101150,8 +101178,8 @@ var TypeProcessor = class {
|
|
|
101150
101178
|
}
|
|
101151
101179
|
/**
|
|
101152
101180
|
* Get the enum type definition.
|
|
101153
|
-
* @param
|
|
101154
|
-
* @returns
|
|
101181
|
+
* @param fieldConfig - Parsed field configuration
|
|
101182
|
+
* @returns Enum type definition
|
|
101155
101183
|
*/
|
|
101156
101184
|
static getEnumType(fieldConfig) {
|
|
101157
101185
|
const allowedValues = fieldConfig.allowedValues;
|
|
@@ -101162,8 +101190,8 @@ var TypeProcessor = class {
|
|
|
101162
101190
|
}
|
|
101163
101191
|
/**
|
|
101164
101192
|
* Get the nested object type definition.
|
|
101165
|
-
* @param
|
|
101166
|
-
* @returns
|
|
101193
|
+
* @param fieldConfig - Parsed field configuration
|
|
101194
|
+
* @returns Nested object type and used utility types
|
|
101167
101195
|
*/
|
|
101168
101196
|
static getNestedType(fieldConfig) {
|
|
101169
101197
|
const fields = fieldConfig.fields;
|
|
@@ -101193,8 +101221,8 @@ var TypeProcessor = class {
|
|
|
101193
101221
|
}
|
|
101194
101222
|
/**
|
|
101195
101223
|
* Generate unified types file from multiple namespaces.
|
|
101196
|
-
* @param
|
|
101197
|
-
* @returns
|
|
101224
|
+
* @param namespaceData - Namespace metadata
|
|
101225
|
+
* @returns Generated types file contents
|
|
101198
101226
|
*/
|
|
101199
101227
|
static generateUnifiedTypes(namespaceData) {
|
|
101200
101228
|
if (namespaceData.length === 0) return "";
|
|
@@ -101293,10 +101321,11 @@ var KyselyGenerator = class {
|
|
|
101293
101321
|
//#region src/cli/generator/builtin/seed/gql-ingest-processor.ts
|
|
101294
101322
|
/**
|
|
101295
101323
|
* Processes TailorDB types to generate GraphQL Ingest metadata
|
|
101296
|
-
* @param
|
|
101297
|
-
* @
|
|
101324
|
+
* @param type - Parsed TailorDB type
|
|
101325
|
+
* @param namespace - Namespace of the type
|
|
101326
|
+
* @returns Generated GraphQL Ingest metadata
|
|
101298
101327
|
*/
|
|
101299
|
-
function processGqlIngest(type) {
|
|
101328
|
+
function processGqlIngest(type, namespace) {
|
|
101300
101329
|
const dependencies = Array.from(Object.values(type.fields).reduce((set$1, field) => {
|
|
101301
101330
|
if (field.relation?.targetType && field.relation.targetType !== type.name) set$1.add(field.relation.targetType);
|
|
101302
101331
|
return set$1;
|
|
@@ -101309,6 +101338,7 @@ function processGqlIngest(type) {
|
|
|
101309
101338
|
`;
|
|
101310
101339
|
return {
|
|
101311
101340
|
name: type.name,
|
|
101341
|
+
namespace,
|
|
101312
101342
|
dependencies,
|
|
101313
101343
|
mapping: {
|
|
101314
101344
|
dataFile: `data/${type.name}.jsonl`,
|
|
@@ -101324,8 +101354,8 @@ function processGqlIngest(type) {
|
|
|
101324
101354
|
//#region src/cli/generator/builtin/seed/idp-user-processor.ts
|
|
101325
101355
|
/**
|
|
101326
101356
|
* Processes auth configuration to generate IdP user seed metadata
|
|
101327
|
-
* @param
|
|
101328
|
-
* @returns
|
|
101357
|
+
* @param auth - Auth configuration from generator
|
|
101358
|
+
* @returns IdP user metadata or undefined if not applicable
|
|
101329
101359
|
*/
|
|
101330
101360
|
function processIdpUser(auth) {
|
|
101331
101361
|
if (auth.idProvider?.kind !== "BuiltInIdP" || !auth.userProfile) return;
|
|
@@ -101353,9 +101383,9 @@ function processIdpUser(auth) {
|
|
|
101353
101383
|
}
|
|
101354
101384
|
/**
|
|
101355
101385
|
* Generates the schema file content for IdP users with foreign key
|
|
101356
|
-
* @param
|
|
101357
|
-
* @param
|
|
101358
|
-
* @returns
|
|
101386
|
+
* @param usernameField - Username field name
|
|
101387
|
+
* @param userTypeName - TailorDB user type name
|
|
101388
|
+
* @returns Schema file contents
|
|
101359
101389
|
*/
|
|
101360
101390
|
function generateIdpUserSchemaFile(usernameField, userTypeName) {
|
|
101361
101391
|
return ml`
|
|
@@ -101397,11 +101427,9 @@ function generateIdpUserSchemaFile(usernameField, userTypeName) {
|
|
|
101397
101427
|
//#region src/cli/generator/builtin/seed/lines-db-processor.ts
|
|
101398
101428
|
/**
|
|
101399
101429
|
* Processes TailorDB types to generate lines-db metadata
|
|
101400
|
-
* @param
|
|
101401
|
-
* @param
|
|
101402
|
-
* @
|
|
101403
|
-
* @param {string} source.exportName - Source export name
|
|
101404
|
-
* @returns {LinesDbMetadata} Generated lines-db metadata
|
|
101430
|
+
* @param type - Parsed TailorDB type
|
|
101431
|
+
* @param source - Source file info
|
|
101432
|
+
* @returns Generated lines-db metadata
|
|
101405
101433
|
*/
|
|
101406
101434
|
function processLinesDb(type, source) {
|
|
101407
101435
|
if (!source.filePath || !source.exportName) throw new Error(`Missing source info for type ${type.name}`);
|
|
@@ -101442,9 +101470,9 @@ function processLinesDb(type, source) {
|
|
|
101442
101470
|
}
|
|
101443
101471
|
/**
|
|
101444
101472
|
* Generates the schema file content for lines-db
|
|
101445
|
-
* @param
|
|
101446
|
-
* @param
|
|
101447
|
-
* @returns
|
|
101473
|
+
* @param metadata - lines-db metadata
|
|
101474
|
+
* @param importPath - Import path for the TailorDB type
|
|
101475
|
+
* @returns Schema file contents
|
|
101448
101476
|
*/
|
|
101449
101477
|
function generateLinesDbSchemaFile(metadata, importPath) {
|
|
101450
101478
|
const { exportName, optionalFields, omitFields, foreignKeys, indexes } = metadata;
|
|
@@ -101494,49 +101522,249 @@ function generateLinesDbSchemaFile(metadata, importPath) {
|
|
|
101494
101522
|
//#region src/cli/generator/builtin/seed/index.ts
|
|
101495
101523
|
const SeedGeneratorID = "@tailor-platform/seed";
|
|
101496
101524
|
/**
|
|
101497
|
-
*
|
|
101498
|
-
*
|
|
101499
|
-
* @param
|
|
101500
|
-
* @
|
|
101501
|
-
|
|
101502
|
-
function toPosixPath(p) {
|
|
101503
|
-
return p.split(path$20.sep).join(path$20.posix.sep);
|
|
101504
|
-
}
|
|
101505
|
-
/**
|
|
101506
|
-
* Generates the exec.mjs script content (Node.js executable)
|
|
101507
|
-
* @param {string} machineUserName - Machine user name for token retrieval
|
|
101508
|
-
* @param {string} relativeConfigPath - Config path relative to exec script
|
|
101509
|
-
* @returns {string} exec.mjs file contents
|
|
101525
|
+
* Generates the exec.mjs script content (Node.js executable) using gql-ingest Programmatic API
|
|
101526
|
+
* @param machineUserName - Machine user name for token retrieval
|
|
101527
|
+
* @param relativeConfigPath - Config path relative to exec script
|
|
101528
|
+
* @param entityDependencies - Entity dependencies mapping
|
|
101529
|
+
* @returns exec.mjs file contents
|
|
101510
101530
|
*/
|
|
101511
|
-
function generateExecScript(machineUserName, relativeConfigPath) {
|
|
101531
|
+
function generateExecScript(machineUserName, relativeConfigPath, entityDependencies) {
|
|
101532
|
+
const namespaceMap = /* @__PURE__ */ new Map();
|
|
101533
|
+
for (const [type, meta] of Object.entries(entityDependencies)) if (meta.namespace) {
|
|
101534
|
+
if (!namespaceMap.has(meta.namespace)) namespaceMap.set(meta.namespace, []);
|
|
101535
|
+
namespaceMap.get(meta.namespace).push(type);
|
|
101536
|
+
}
|
|
101512
101537
|
return ml`
|
|
101513
|
-
import {
|
|
101538
|
+
import { GQLIngest } from "@jackchuka/gql-ingest";
|
|
101514
101539
|
import { join } from "node:path";
|
|
101515
|
-
import {
|
|
101540
|
+
import { parseArgs, styleText } from "node:util";
|
|
101541
|
+
import { createInterface } from "node:readline";
|
|
101542
|
+
import { show, getMachineUserToken, truncate } from "@tailor-platform/sdk/cli";
|
|
101543
|
+
|
|
101544
|
+
// Parse command-line arguments
|
|
101545
|
+
const { values, positionals } = parseArgs({
|
|
101546
|
+
options: {
|
|
101547
|
+
namespace: { type: "string", short: "n" },
|
|
101548
|
+
"skip-idp": { type: "boolean", default: false },
|
|
101549
|
+
truncate: { type: "boolean", default: false },
|
|
101550
|
+
yes: { type: "boolean", default: false },
|
|
101551
|
+
help: { type: "boolean", short: "h", default: false },
|
|
101552
|
+
},
|
|
101553
|
+
allowPositionals: true,
|
|
101554
|
+
});
|
|
101555
|
+
|
|
101556
|
+
if (values.help) {
|
|
101557
|
+
console.log(\`
|
|
101558
|
+
Usage: node exec.mjs [options] [types...]
|
|
101559
|
+
|
|
101560
|
+
Options:
|
|
101561
|
+
-n, --namespace <ns> Process all types in specified namespace (excludes _User)
|
|
101562
|
+
--skip-idp Skip IdP user (_User) entity
|
|
101563
|
+
--truncate Truncate tables before seeding
|
|
101564
|
+
--yes Skip confirmation prompts (for truncate)
|
|
101565
|
+
-h, --help Show help
|
|
101566
|
+
|
|
101567
|
+
Examples:
|
|
101568
|
+
node exec.mjs # Process all types (default)
|
|
101569
|
+
node exec.mjs --namespace <namespace> # Process tailordb namespace only (no _User)
|
|
101570
|
+
node exec.mjs User Order # Process specific types only
|
|
101571
|
+
node exec.mjs --skip-idp # Process all except _User
|
|
101572
|
+
node exec.mjs --truncate # Truncate all tables, then seed all
|
|
101573
|
+
node exec.mjs --truncate --yes # Truncate all tables without confirmation, then seed all
|
|
101574
|
+
node exec.mjs --truncate --namespace <namespace> # Truncate tailordb, then seed tailordb
|
|
101575
|
+
node exec.mjs --truncate User Order # Truncate User and Order, then seed them
|
|
101576
|
+
\`);
|
|
101577
|
+
process.exit(0);
|
|
101578
|
+
}
|
|
101579
|
+
|
|
101580
|
+
// Helper function to prompt for y/n confirmation
|
|
101581
|
+
const promptConfirmation = (question) => {
|
|
101582
|
+
const rl = createInterface({
|
|
101583
|
+
input: process.stdin,
|
|
101584
|
+
output: process.stdout,
|
|
101585
|
+
});
|
|
101586
|
+
|
|
101587
|
+
return new Promise((resolve) => {
|
|
101588
|
+
rl.question(styleText("yellow", question), (answer) => {
|
|
101589
|
+
rl.close();
|
|
101590
|
+
resolve(answer.toLowerCase().trim());
|
|
101591
|
+
});
|
|
101592
|
+
});
|
|
101593
|
+
};
|
|
101516
101594
|
|
|
101517
101595
|
const configDir = import.meta.dirname;
|
|
101518
101596
|
const configPath = join(configDir, "${relativeConfigPath}");
|
|
101519
101597
|
|
|
101520
|
-
console.log("Starting seed data generation...");
|
|
101598
|
+
console.log(styleText("cyan", "Starting seed data generation..."));
|
|
101521
101599
|
|
|
101600
|
+
// Entity configuration
|
|
101601
|
+
const namespaceEntities = {
|
|
101602
|
+
${Array.from(namespaceMap.entries()).map(([namespace, entities]) => {
|
|
101603
|
+
return ` ${namespace}: [\n${entities.map((e) => ` "${e}",`).join("\n")}\n ]`;
|
|
101604
|
+
}).join(",\n")}
|
|
101605
|
+
};
|
|
101606
|
+
const entities = Object.values(namespaceEntities).flat();
|
|
101607
|
+
|
|
101608
|
+
// Determine which entities to process
|
|
101609
|
+
let entitiesToProcess = null;
|
|
101610
|
+
|
|
101611
|
+
const hasNamespace = !!values.namespace;
|
|
101612
|
+
const hasTypes = positionals.length > 0;
|
|
101613
|
+
const skipIdp = values["skip-idp"];
|
|
101614
|
+
|
|
101615
|
+
// Validate mutually exclusive options
|
|
101616
|
+
const optionCount = [hasNamespace, hasTypes].filter(Boolean).length;
|
|
101617
|
+
if (optionCount > 1) {
|
|
101618
|
+
console.error(styleText("red", "Error: Options --namespace and type names are mutually exclusive."));
|
|
101619
|
+
process.exit(1);
|
|
101620
|
+
}
|
|
101621
|
+
|
|
101622
|
+
// --skip-idp and --namespace are redundant (namespace already excludes _User)
|
|
101623
|
+
if (skipIdp && hasNamespace) {
|
|
101624
|
+
console.warn(styleText("yellow", "Warning: --skip-idp is redundant with --namespace (namespace filtering already excludes _User)."));
|
|
101625
|
+
}
|
|
101626
|
+
|
|
101627
|
+
// Filter by namespace (automatically excludes _User as it has no namespace)
|
|
101628
|
+
if (hasNamespace) {
|
|
101629
|
+
const namespace = values.namespace;
|
|
101630
|
+
entitiesToProcess = namespaceEntities[namespace];
|
|
101631
|
+
|
|
101632
|
+
if (!entitiesToProcess || entitiesToProcess.length === 0) {
|
|
101633
|
+
console.error(styleText("red", \`Error: No entities found in namespace "\${namespace}"\`));
|
|
101634
|
+
console.error(styleText("yellow", \`Available namespaces: \${Object.keys(namespaceEntities).join(", ")}\`));
|
|
101635
|
+
process.exit(1);
|
|
101636
|
+
}
|
|
101637
|
+
|
|
101638
|
+
console.log(styleText("cyan", \`Filtering by namespace: \${namespace}\`));
|
|
101639
|
+
console.log(styleText("dim", \`Entities: \${entitiesToProcess.join(", ")}\`));
|
|
101640
|
+
}
|
|
101641
|
+
|
|
101642
|
+
// Filter by specific types
|
|
101643
|
+
if (hasTypes) {
|
|
101644
|
+
const requestedTypes = positionals;
|
|
101645
|
+
const notFoundTypes = [];
|
|
101646
|
+
|
|
101647
|
+
entitiesToProcess = requestedTypes.filter((type) => {
|
|
101648
|
+
if (!entities.includes(type)) {
|
|
101649
|
+
notFoundTypes.push(type);
|
|
101650
|
+
return false;
|
|
101651
|
+
}
|
|
101652
|
+
return true;
|
|
101653
|
+
});
|
|
101654
|
+
|
|
101655
|
+
if (notFoundTypes.length > 0) {
|
|
101656
|
+
console.error(styleText("red", \`Error: The following types were not found: \${notFoundTypes.join(", ")}\`));
|
|
101657
|
+
console.error(styleText("yellow", \`Available types: \${entities.join(", ")}\`));
|
|
101658
|
+
process.exit(1);
|
|
101659
|
+
}
|
|
101660
|
+
|
|
101661
|
+
console.log(styleText("cyan", \`Filtering by types: \${entitiesToProcess.join(", ")}\`));
|
|
101662
|
+
}
|
|
101663
|
+
|
|
101664
|
+
// Apply --skip-idp filter
|
|
101665
|
+
if (skipIdp) {
|
|
101666
|
+
if (entitiesToProcess) {
|
|
101667
|
+
// Filter out _User from already filtered list
|
|
101668
|
+
entitiesToProcess = entitiesToProcess.filter((entity) => entity !== "_User");
|
|
101669
|
+
} else {
|
|
101670
|
+
// Get all entities except _User
|
|
101671
|
+
entitiesToProcess = entities.filter((entity) => entity !== "_User");
|
|
101672
|
+
}
|
|
101673
|
+
console.log(styleText("dim", \`Skipping IdP user (_User)\`));
|
|
101674
|
+
}
|
|
101675
|
+
|
|
101676
|
+
// Truncate tables if requested
|
|
101677
|
+
// Note: --skip-idp only affects seeding, not truncation
|
|
101678
|
+
if (values.truncate) {
|
|
101679
|
+
// Prompt user for confirmation
|
|
101680
|
+
const answer = values.yes ? "y" : await promptConfirmation("Are you sure you want to truncate? (y/n): ");
|
|
101681
|
+
if (answer !== "y") {
|
|
101682
|
+
console.log(styleText("yellow", "Truncate cancelled."));
|
|
101683
|
+
process.exit(0);
|
|
101684
|
+
}
|
|
101685
|
+
|
|
101686
|
+
console.log(styleText("cyan", "\\nTruncating tables..."));
|
|
101687
|
+
|
|
101688
|
+
try {
|
|
101689
|
+
if (hasNamespace) {
|
|
101690
|
+
// Truncate specific namespace
|
|
101691
|
+
await truncate({
|
|
101692
|
+
configPath,
|
|
101693
|
+
namespace: values.namespace,
|
|
101694
|
+
});
|
|
101695
|
+
} else if (hasTypes) {
|
|
101696
|
+
// Truncate specific types
|
|
101697
|
+
await truncate({
|
|
101698
|
+
configPath,
|
|
101699
|
+
types: entitiesToProcess,
|
|
101700
|
+
});
|
|
101701
|
+
} else {
|
|
101702
|
+
// Truncate all (--skip-idp does not affect truncation)
|
|
101703
|
+
await truncate({
|
|
101704
|
+
configPath,
|
|
101705
|
+
all: true,
|
|
101706
|
+
});
|
|
101707
|
+
}
|
|
101708
|
+
console.log(styleText("green", "Truncate completed.\\n"));
|
|
101709
|
+
} catch (error) {
|
|
101710
|
+
console.error(styleText("red", \`Truncate failed: \${error.message}\`));
|
|
101711
|
+
process.exit(1);
|
|
101712
|
+
}
|
|
101713
|
+
}
|
|
101714
|
+
|
|
101715
|
+
// Get application info and endpoint
|
|
101522
101716
|
const appInfo = await show({ configPath });
|
|
101523
101717
|
const endpoint = \`\${appInfo.url}/query\`;
|
|
101524
101718
|
|
|
101719
|
+
// Get machine user token
|
|
101525
101720
|
const tokenInfo = await getMachineUserToken({ name: "${machineUserName}", configPath });
|
|
101526
|
-
const headers = JSON.stringify({ Authorization: \`Bearer \${tokenInfo.accessToken}\` });
|
|
101527
101721
|
|
|
101528
|
-
|
|
101529
|
-
|
|
101530
|
-
|
|
101722
|
+
// Initialize GQLIngest client
|
|
101723
|
+
const client = new GQLIngest({
|
|
101724
|
+
endpoint,
|
|
101725
|
+
headers: {
|
|
101726
|
+
Authorization: \`Bearer \${tokenInfo.accessToken}\`,
|
|
101727
|
+
},
|
|
101728
|
+
});
|
|
101531
101729
|
|
|
101532
|
-
|
|
101533
|
-
|
|
101730
|
+
// Progress monitoring event handlers
|
|
101731
|
+
client.on("started", (payload) => {
|
|
101732
|
+
console.log(styleText("cyan", \`Processing \${payload.totalEntities} entities...\`));
|
|
101733
|
+
});
|
|
101534
101734
|
|
|
101735
|
+
client.on("entityStart", (payload) => {
|
|
101736
|
+
console.log(styleText("dim", \` Processing \${payload.entityName}...\`));
|
|
101737
|
+
});
|
|
101738
|
+
|
|
101739
|
+
client.on("entityComplete", (payload) => {
|
|
101740
|
+
const { entityName, metrics: { rowsProcessed } } = payload;
|
|
101741
|
+
console.log(styleText("green", \` ✓ \${entityName}: \${rowsProcessed} rows processed\`));
|
|
101742
|
+
});
|
|
101743
|
+
|
|
101744
|
+
client.on("rowFailure", (payload) => {
|
|
101745
|
+
console.error(styleText("red", \` ✗ Row \${payload.rowIndex} in \${payload.entityName} failed: \${payload.error.message}\`));
|
|
101746
|
+
});
|
|
101747
|
+
|
|
101748
|
+
// Run ingestion
|
|
101535
101749
|
try {
|
|
101536
|
-
|
|
101750
|
+
let result;
|
|
101751
|
+
if (entitiesToProcess && entitiesToProcess.length > 0) {
|
|
101752
|
+
result = await client.ingestEntities(configDir, entitiesToProcess);
|
|
101753
|
+
} else {
|
|
101754
|
+
result = await client.ingest(configDir);
|
|
101755
|
+
}
|
|
101756
|
+
|
|
101757
|
+
if (result.success) {
|
|
101758
|
+
console.log(styleText("green", "\\n✓ Seed data generation completed successfully"));
|
|
101759
|
+
console.log(client.getMetricsSummary());
|
|
101760
|
+
} else {
|
|
101761
|
+
console.error(styleText("red", "\\n✗ Seed data generation failed"));
|
|
101762
|
+
console.error(client.getMetricsSummary());
|
|
101763
|
+
process.exit(1);
|
|
101764
|
+
}
|
|
101537
101765
|
} catch (error) {
|
|
101538
|
-
console.error("Seed failed with
|
|
101539
|
-
process.exit(
|
|
101766
|
+
console.error(styleText("red", \`\\n✗ Seed data generation failed with error: \${error.message}\`));
|
|
101767
|
+
process.exit(1);
|
|
101540
101768
|
}
|
|
101541
101769
|
|
|
101542
101770
|
`;
|
|
@@ -101544,19 +101772,17 @@ function generateExecScript(machineUserName, relativeConfigPath) {
|
|
|
101544
101772
|
/**
|
|
101545
101773
|
* Factory function to create a Seed generator.
|
|
101546
101774
|
* Combines GraphQL Ingest and lines-db schema generation.
|
|
101547
|
-
* @param
|
|
101548
|
-
* @
|
|
101549
|
-
* @param {string} [options.machineUserName] - Machine user name for seeding
|
|
101550
|
-
* @returns {TailorDBGenerator<SeedTypeMetadata, Record<string, SeedTypeMetadata>>} Seed generator
|
|
101775
|
+
* @param options - Seed generator options
|
|
101776
|
+
* @returns Seed generator
|
|
101551
101777
|
*/
|
|
101552
101778
|
function createSeedGenerator(options) {
|
|
101553
101779
|
return {
|
|
101554
101780
|
id: SeedGeneratorID,
|
|
101555
101781
|
description: "Generates seed data files (GraphQL Ingest + lines-db schema)",
|
|
101556
101782
|
dependencies: ["tailordb"],
|
|
101557
|
-
processType: ({ type, source }) => {
|
|
101783
|
+
processType: ({ type, source, namespace }) => {
|
|
101558
101784
|
return {
|
|
101559
|
-
gqlIngest: processGqlIngest(type),
|
|
101785
|
+
gqlIngest: processGqlIngest(type, namespace),
|
|
101560
101786
|
linesDb: processLinesDb(type, source)
|
|
101561
101787
|
};
|
|
101562
101788
|
},
|
|
@@ -101570,7 +101796,10 @@ function createSeedGenerator(options) {
|
|
|
101570
101796
|
if (!(outputBaseDir in entityDependencies)) entityDependencies[outputBaseDir] = {};
|
|
101571
101797
|
for (const [_typeName, metadata] of Object.entries(nsResult.types)) {
|
|
101572
101798
|
const { gqlIngest, linesDb } = metadata;
|
|
101573
|
-
entityDependencies[outputBaseDir][gqlIngest.name] =
|
|
101799
|
+
entityDependencies[outputBaseDir][gqlIngest.name] = {
|
|
101800
|
+
namespace: gqlIngest.namespace,
|
|
101801
|
+
dependencies: gqlIngest.dependencies
|
|
101802
|
+
};
|
|
101574
101803
|
files.push({
|
|
101575
101804
|
path: path$20.join(outputBaseDir, "mappings", `${gqlIngest.name}.json`),
|
|
101576
101805
|
content: JSON.stringify(gqlIngest.mapping, null, 2) + "\n"
|
|
@@ -101583,7 +101812,7 @@ function createSeedGenerator(options) {
|
|
|
101583
101812
|
content: gqlIngest.graphql
|
|
101584
101813
|
});
|
|
101585
101814
|
const schemaOutputPath = path$20.join(outputBaseDir, "data", `${linesDb.typeName}.schema.ts`);
|
|
101586
|
-
const importPath =
|
|
101815
|
+
const importPath = path$20.relative(path$20.dirname(schemaOutputPath), linesDb.importPath);
|
|
101587
101816
|
const normalizedImportPath = importPath.replace(/\.ts$/, "").startsWith(".") ? importPath.replace(/\.ts$/, "") : `./${importPath.replace(/\.ts$/, "")}`;
|
|
101588
101817
|
files.push({
|
|
101589
101818
|
path: schemaOutputPath,
|
|
@@ -101596,7 +101825,7 @@ function createSeedGenerator(options) {
|
|
|
101596
101825
|
if (idpUser) {
|
|
101597
101826
|
const outputBaseDir = options.distPath;
|
|
101598
101827
|
if (!(outputBaseDir in entityDependencies)) entityDependencies[outputBaseDir] = {};
|
|
101599
|
-
entityDependencies[outputBaseDir][idpUser.name] = idpUser.dependencies;
|
|
101828
|
+
entityDependencies[outputBaseDir][idpUser.name] = { dependencies: idpUser.dependencies };
|
|
101600
101829
|
files.push({
|
|
101601
101830
|
path: path$20.join(outputBaseDir, idpUser.mapping.graphqlFile),
|
|
101602
101831
|
content: idpUser.graphql
|
|
@@ -101620,14 +101849,14 @@ function createSeedGenerator(options) {
|
|
|
101620
101849
|
files.push({
|
|
101621
101850
|
path: path$20.join(outputDir, "config.yaml"),
|
|
101622
101851
|
content: `entityDependencies:
|
|
101623
|
-
${Object.entries(dependencies).map(([type, deps]) => `${type}: [${deps.join(", ")}]`).join("\n ")}
|
|
101852
|
+
${Object.entries(dependencies).map(([type, deps]) => `${type}: [${deps.dependencies.join(", ")}]`).join("\n ")}
|
|
101624
101853
|
`
|
|
101625
101854
|
});
|
|
101626
101855
|
if (options.machineUserName) {
|
|
101627
|
-
const relativeConfigPath =
|
|
101856
|
+
const relativeConfigPath = path$20.relative(outputDir, configPath);
|
|
101628
101857
|
files.push({
|
|
101629
101858
|
path: path$20.join(outputDir, "exec.mjs"),
|
|
101630
|
-
content: generateExecScript(options.machineUserName, relativeConfigPath)
|
|
101859
|
+
content: generateExecScript(options.machineUserName, relativeConfigPath, dependencies)
|
|
101631
101860
|
});
|
|
101632
101861
|
}
|
|
101633
101862
|
}
|
|
@@ -101658,8 +101887,8 @@ const builtinGenerators = new Map([
|
|
|
101658
101887
|
const GeneratorConfigSchema = createGeneratorConfigSchema(builtinGenerators);
|
|
101659
101888
|
/**
|
|
101660
101889
|
* Load Tailor configuration file and associated generators.
|
|
101661
|
-
* @param
|
|
101662
|
-
* @returns
|
|
101890
|
+
* @param configPath - Optional explicit config path
|
|
101891
|
+
* @returns Loaded config and generators
|
|
101663
101892
|
*/
|
|
101664
101893
|
async function loadConfig(configPath) {
|
|
101665
101894
|
const foundPath = loadConfigPath(configPath);
|
|
@@ -101696,10 +101925,10 @@ function extractAttributesFromConfig(config) {
|
|
|
101696
101925
|
}
|
|
101697
101926
|
/**
|
|
101698
101927
|
* Generate the contents of the user-defined type definition file.
|
|
101699
|
-
* @param
|
|
101700
|
-
* @param
|
|
101701
|
-
* @param
|
|
101702
|
-
* @returns
|
|
101928
|
+
* @param attributeMap - Attribute map configuration
|
|
101929
|
+
* @param attributeList - Attribute list configuration
|
|
101930
|
+
* @param env - Environment configuration
|
|
101931
|
+
* @returns Generated type definition source
|
|
101703
101932
|
*/
|
|
101704
101933
|
function generateTypeDefinition(attributeMap, attributeList, env) {
|
|
101705
101934
|
const mapFields = attributeMap ? Object.entries(attributeMap).map(([key, value]) => ` ${key}: ${value};`).join("\n") : "";
|
|
@@ -101760,8 +101989,8 @@ function collectAttributesFromConfig(config) {
|
|
|
101760
101989
|
}
|
|
101761
101990
|
/**
|
|
101762
101991
|
* Resolve the output path for the generated type definition file.
|
|
101763
|
-
* @param
|
|
101764
|
-
* @returns
|
|
101992
|
+
* @param configPath - Path to Tailor config file
|
|
101993
|
+
* @returns Absolute path to the type definition file
|
|
101765
101994
|
*/
|
|
101766
101995
|
function resolveTypeDefinitionPath(configPath) {
|
|
101767
101996
|
const typePath = process.env.TAILOR_PLATFORM_SDK_TYPE_PATH;
|
|
@@ -101773,9 +102002,9 @@ function resolveTypeDefinitionPath(configPath) {
|
|
|
101773
102002
|
}
|
|
101774
102003
|
/**
|
|
101775
102004
|
* Generate user type definitions from the app config and write them to disk.
|
|
101776
|
-
* @param
|
|
101777
|
-
* @param
|
|
101778
|
-
* @returns
|
|
102005
|
+
* @param config - Application config
|
|
102006
|
+
* @param configPath - Path to Tailor config file
|
|
102007
|
+
* @returns Promise that resolves when types are generated
|
|
101779
102008
|
*/
|
|
101780
102009
|
async function generateUserTypes(config, configPath) {
|
|
101781
102010
|
try {
|
|
@@ -101819,8 +102048,8 @@ function resolvePackageDirectory(startDir) {
|
|
|
101819
102048
|
//#region src/cli/apply/services/label.ts
|
|
101820
102049
|
/**
|
|
101821
102050
|
* Build TRN prefix for a workspace.
|
|
101822
|
-
* @param
|
|
101823
|
-
* @returns
|
|
102051
|
+
* @param workspaceId - Workspace ID
|
|
102052
|
+
* @returns TRN prefix string
|
|
101824
102053
|
*/
|
|
101825
102054
|
function trnPrefix(workspaceId) {
|
|
101826
102055
|
return `trn:v1:workspace:${workspaceId}`;
|
|
@@ -101828,9 +102057,9 @@ function trnPrefix(workspaceId) {
|
|
|
101828
102057
|
const sdkNameLabelKey = "sdk-name";
|
|
101829
102058
|
/**
|
|
101830
102059
|
* Build metadata request with SDK labels.
|
|
101831
|
-
* @param
|
|
101832
|
-
* @param
|
|
101833
|
-
* @returns
|
|
102060
|
+
* @param trn - Target TRN
|
|
102061
|
+
* @param appName - Application name label
|
|
102062
|
+
* @returns Metadata request
|
|
101834
102063
|
*/
|
|
101835
102064
|
async function buildMetaRequest(trn$7, appName) {
|
|
101836
102065
|
const packageJson$1 = await readPackageJson();
|
|
@@ -101875,10 +102104,10 @@ var ChangeSet = class {
|
|
|
101875
102104
|
//#region src/cli/apply/services/application.ts
|
|
101876
102105
|
/**
|
|
101877
102106
|
* Apply application changes for the given phase.
|
|
101878
|
-
* @param
|
|
101879
|
-
* @param
|
|
101880
|
-
* @param
|
|
101881
|
-
* @returns
|
|
102107
|
+
* @param client - Operator client instance
|
|
102108
|
+
* @param changeSet - Planned application changes
|
|
102109
|
+
* @param phase - Apply phase
|
|
102110
|
+
* @returns Promise that resolves when applications are applied
|
|
101882
102111
|
*/
|
|
101883
102112
|
async function applyApplication(client, changeSet, phase = "create-update") {
|
|
101884
102113
|
if (phase === "create-update") await Promise.all([...changeSet.creates.map(async (create$1) => {
|
|
@@ -101899,10 +102128,11 @@ function trn$6(workspaceId, name$1) {
|
|
|
101899
102128
|
}
|
|
101900
102129
|
/**
|
|
101901
102130
|
* Plan application changes based on current and desired state.
|
|
101902
|
-
* @param
|
|
101903
|
-
* @returns
|
|
102131
|
+
* @param context - Planning context
|
|
102132
|
+
* @returns Planned changes
|
|
101904
102133
|
*/
|
|
101905
|
-
async function planApplication(
|
|
102134
|
+
async function planApplication(context) {
|
|
102135
|
+
const { client, workspaceId, application, forRemoval } = context;
|
|
101906
102136
|
const changeSet = new ChangeSet("Applications");
|
|
101907
102137
|
const existingApplications = await fetchAll(async (pageToken) => {
|
|
101908
102138
|
try {
|
|
@@ -102009,28 +102239,28 @@ function protoSubgraph(subgraph) {
|
|
|
102009
102239
|
//#region src/cli/apply/services/idp.ts
|
|
102010
102240
|
/**
|
|
102011
102241
|
* Build the vault name for an IdP client.
|
|
102012
|
-
* @param
|
|
102013
|
-
* @param
|
|
102014
|
-
* @returns
|
|
102242
|
+
* @param namespaceName - IdP namespace name
|
|
102243
|
+
* @param clientName - IdP client name
|
|
102244
|
+
* @returns Vault name
|
|
102015
102245
|
*/
|
|
102016
102246
|
function idpClientVaultName(namespaceName, clientName) {
|
|
102017
102247
|
return `idp-${namespaceName}-${clientName}`;
|
|
102018
102248
|
}
|
|
102019
102249
|
/**
|
|
102020
102250
|
* Build the secret name for an IdP client.
|
|
102021
|
-
* @param
|
|
102022
|
-
* @param
|
|
102023
|
-
* @returns
|
|
102251
|
+
* @param namespaceName - IdP namespace name
|
|
102252
|
+
* @param clientName - IdP client name
|
|
102253
|
+
* @returns Secret name
|
|
102024
102254
|
*/
|
|
102025
102255
|
function idpClientSecretName(namespaceName, clientName) {
|
|
102026
102256
|
return `client-secret-${namespaceName}-${clientName}`;
|
|
102027
102257
|
}
|
|
102028
102258
|
/**
|
|
102029
102259
|
* Apply IdP-related changes for the given phase.
|
|
102030
|
-
* @param
|
|
102031
|
-
* @param
|
|
102032
|
-
* @param
|
|
102033
|
-
* @returns
|
|
102260
|
+
* @param client - Operator client instance
|
|
102261
|
+
* @param result - Planned IdP changes
|
|
102262
|
+
* @param phase - Apply phase
|
|
102263
|
+
* @returns Promise that resolves when IdP changes are applied
|
|
102034
102264
|
*/
|
|
102035
102265
|
async function applyIdP(client, result, phase = "create-update") {
|
|
102036
102266
|
const { changeSet } = result;
|
|
@@ -102091,10 +102321,11 @@ async function applyIdP(client, result, phase = "create-update") {
|
|
|
102091
102321
|
}
|
|
102092
102322
|
/**
|
|
102093
102323
|
* Plan IdP-related changes based on current and desired state.
|
|
102094
|
-
* @param
|
|
102095
|
-
* @returns
|
|
102324
|
+
* @param context - Planning context
|
|
102325
|
+
* @returns Planned changes and metadata
|
|
102096
102326
|
*/
|
|
102097
|
-
async function planIdP(
|
|
102327
|
+
async function planIdP(context) {
|
|
102328
|
+
const { client, workspaceId, application, forRemoval } = context;
|
|
102098
102329
|
const idps = forRemoval ? [] : application.idpServices;
|
|
102099
102330
|
const { changeSet: serviceChangeSet, conflicts, unmanaged, resourceOwners } = await planServices$3(client, workspaceId, application.name, idps);
|
|
102100
102331
|
const clientChangeSet = await planClients(client, workspaceId, idps, serviceChangeSet.deletes.map((del) => del.name));
|
|
@@ -102284,10 +102515,10 @@ function convertLang(lang) {
|
|
|
102284
102515
|
//#region src/cli/apply/services/auth.ts
|
|
102285
102516
|
/**
|
|
102286
102517
|
* Apply auth-related changes for the given phase.
|
|
102287
|
-
* @param
|
|
102288
|
-
* @param
|
|
102289
|
-
* @param
|
|
102290
|
-
* @returns
|
|
102518
|
+
* @param client - Operator client instance
|
|
102519
|
+
* @param result - Planned auth changes
|
|
102520
|
+
* @param phase - Apply phase (defaults to "create-update")
|
|
102521
|
+
* @returns Promise that resolves when auth changes are applied
|
|
102291
102522
|
*/
|
|
102292
102523
|
async function applyAuth(client, result, phase = "create-update") {
|
|
102293
102524
|
const { changeSet } = result;
|
|
@@ -102295,7 +102526,10 @@ async function applyAuth(client, result, phase = "create-update") {
|
|
|
102295
102526
|
await Promise.all([...changeSet.service.creates.map(async (create$1) => {
|
|
102296
102527
|
await client.createAuthService(create$1.request);
|
|
102297
102528
|
await client.setMetadata(create$1.metaRequest);
|
|
102298
|
-
}), ...changeSet.service.updates.map((update) =>
|
|
102529
|
+
}), ...changeSet.service.updates.map(async (update) => {
|
|
102530
|
+
await client.updateAuthService(update.request);
|
|
102531
|
+
await client.setMetadata(update.metaRequest);
|
|
102532
|
+
})]);
|
|
102299
102533
|
await Promise.all([...changeSet.idpConfig.creates.map(async (create$1) => {
|
|
102300
102534
|
if (create$1.idpConfig.kind === "BuiltInIdP") create$1.request.idpConfig.config = await protoBuiltinIdPConfig(client, create$1.request.workspaceId, create$1.idpConfig);
|
|
102301
102535
|
return client.createAuthIDPConfig(create$1.request);
|
|
@@ -102327,10 +102561,11 @@ async function applyAuth(client, result, phase = "create-update") {
|
|
|
102327
102561
|
}
|
|
102328
102562
|
/**
|
|
102329
102563
|
* Plan auth-related changes based on current and desired state.
|
|
102330
|
-
* @param
|
|
102331
|
-
* @returns
|
|
102564
|
+
* @param context - Planning context
|
|
102565
|
+
* @returns Planned auth changes and metadata
|
|
102332
102566
|
*/
|
|
102333
|
-
async function planAuth(
|
|
102567
|
+
async function planAuth(context) {
|
|
102568
|
+
const { client, workspaceId, application, forRemoval } = context;
|
|
102334
102569
|
const auths = [];
|
|
102335
102570
|
if (!forRemoval && application.authService) {
|
|
102336
102571
|
await application.authService.resolveNamespaces();
|
|
@@ -102414,6 +102649,11 @@ async function planServices$2(client, workspaceId, appName, auths) {
|
|
|
102414
102649
|
});
|
|
102415
102650
|
changeSet.updates.push({
|
|
102416
102651
|
name: config.name,
|
|
102652
|
+
request: {
|
|
102653
|
+
workspaceId,
|
|
102654
|
+
namespaceName: config.name,
|
|
102655
|
+
publishSessionEvents: config.publishSessionEvents
|
|
102656
|
+
},
|
|
102417
102657
|
metaRequest
|
|
102418
102658
|
});
|
|
102419
102659
|
delete existingServices[config.name];
|
|
@@ -102421,7 +102661,8 @@ async function planServices$2(client, workspaceId, appName, auths) {
|
|
|
102421
102661
|
name: config.name,
|
|
102422
102662
|
request: {
|
|
102423
102663
|
workspaceId,
|
|
102424
|
-
namespaceName: config.name
|
|
102664
|
+
namespaceName: config.name,
|
|
102665
|
+
publishSessionEvents: config.publishSessionEvents
|
|
102425
102666
|
},
|
|
102426
102667
|
metaRequest
|
|
102427
102668
|
});
|
|
@@ -103138,10 +103379,10 @@ function protoSCIMAttribute(attr) {
|
|
|
103138
103379
|
//#region src/cli/apply/services/confirm.ts
|
|
103139
103380
|
/**
|
|
103140
103381
|
* Confirm reassignment of resources when owner conflicts are detected.
|
|
103141
|
-
* @param
|
|
103142
|
-
* @param
|
|
103143
|
-
* @param
|
|
103144
|
-
* @returns
|
|
103382
|
+
* @param conflicts - Detected owner conflicts
|
|
103383
|
+
* @param appName - Target application name
|
|
103384
|
+
* @param yes - Whether to auto-confirm without prompting
|
|
103385
|
+
* @returns Promise that resolves when confirmation completes
|
|
103145
103386
|
*/
|
|
103146
103387
|
async function confirmOwnerConflict(conflicts, appName, yes) {
|
|
103147
103388
|
if (conflicts.length === 0) return;
|
|
@@ -103167,10 +103408,10 @@ async function confirmOwnerConflict(conflicts, appName, yes) {
|
|
|
103167
103408
|
}
|
|
103168
103409
|
/**
|
|
103169
103410
|
* Confirm allowing tailor-sdk to manage previously unmanaged resources.
|
|
103170
|
-
* @param
|
|
103171
|
-
* @param
|
|
103172
|
-
* @param
|
|
103173
|
-
* @returns
|
|
103411
|
+
* @param resources - Unmanaged resources
|
|
103412
|
+
* @param appName - Target application name
|
|
103413
|
+
* @param yes - Whether to auto-confirm without prompting
|
|
103414
|
+
* @returns Promise that resolves when confirmation completes
|
|
103174
103415
|
*/
|
|
103175
103416
|
async function confirmUnmanagedResources(resources, appName, yes) {
|
|
103176
103417
|
if (resources.length === 0) return;
|
|
@@ -103195,9 +103436,9 @@ async function confirmUnmanagedResources(resources, appName, yes) {
|
|
|
103195
103436
|
}
|
|
103196
103437
|
/**
|
|
103197
103438
|
* Confirm deletion of important resources.
|
|
103198
|
-
* @param
|
|
103199
|
-
* @param
|
|
103200
|
-
* @returns
|
|
103439
|
+
* @param resources - Resources scheduled for deletion
|
|
103440
|
+
* @param yes - Whether to auto-confirm without prompting
|
|
103441
|
+
* @returns Promise that resolves when confirmation completes
|
|
103201
103442
|
*/
|
|
103202
103443
|
async function confirmImportantResourceDeletion(resources, yes) {
|
|
103203
103444
|
if (resources.length === 0) return;
|
|
@@ -103223,10 +103464,10 @@ async function confirmImportantResourceDeletion(resources, yes) {
|
|
|
103223
103464
|
//#region src/cli/apply/services/executor.ts
|
|
103224
103465
|
/**
|
|
103225
103466
|
* Apply executor-related changes for the given phase.
|
|
103226
|
-
* @param
|
|
103227
|
-
* @param
|
|
103228
|
-
* @param
|
|
103229
|
-
* @returns
|
|
103467
|
+
* @param client - Operator client instance
|
|
103468
|
+
* @param result - Planned executor changes
|
|
103469
|
+
* @param phase - Apply phase (defaults to "create-update")
|
|
103470
|
+
* @returns Promise that resolves when executors are applied
|
|
103230
103471
|
*/
|
|
103231
103472
|
async function applyExecutor(client, result, phase = "create-update") {
|
|
103232
103473
|
const { changeSet } = result;
|
|
@@ -103244,10 +103485,11 @@ function trn$3(workspaceId, name$1) {
|
|
|
103244
103485
|
}
|
|
103245
103486
|
/**
|
|
103246
103487
|
* Plan executor-related changes based on current and desired state.
|
|
103247
|
-
* @param
|
|
103248
|
-
* @returns
|
|
103488
|
+
* @param context - Planning context
|
|
103489
|
+
* @returns Planned changes
|
|
103249
103490
|
*/
|
|
103250
|
-
async function planExecutor(
|
|
103491
|
+
async function planExecutor(context) {
|
|
103492
|
+
const { client, workspaceId, application, forRemoval } = context;
|
|
103251
103493
|
const changeSet = new ChangeSet("Executors");
|
|
103252
103494
|
const conflicts = [];
|
|
103253
103495
|
const unmanaged = [];
|
|
@@ -103326,8 +103568,8 @@ async function planExecutor({ client, workspaceId, application, forRemoval }) {
|
|
|
103326
103568
|
/**
|
|
103327
103569
|
* Build args expression for resolverExecuted trigger.
|
|
103328
103570
|
* Transforms server's succeeded/failed fields to success/result/error fields.
|
|
103329
|
-
* @param
|
|
103330
|
-
* @returns
|
|
103571
|
+
* @param additionalFields - Additional fields to include in the args expression
|
|
103572
|
+
* @returns JavaScript expression for resolverExecuted trigger args
|
|
103331
103573
|
*/
|
|
103332
103574
|
function buildResolverExecutedArgsExpr(additionalFields) {
|
|
103333
103575
|
const baseFields = `...args, appNamespace: args.namespaceName, success: !!args.succeeded, result: args.succeeded?.result.resolver, error: args.failed?.error`;
|
|
@@ -103511,10 +103753,10 @@ const SCALAR_TYPE_MAP = {
|
|
|
103511
103753
|
};
|
|
103512
103754
|
/**
|
|
103513
103755
|
* Apply resolver pipeline changes for the given phase.
|
|
103514
|
-
* @param
|
|
103515
|
-
* @param
|
|
103516
|
-
* @param
|
|
103517
|
-
* @returns
|
|
103756
|
+
* @param client - Operator client instance
|
|
103757
|
+
* @param result - Planned pipeline changes
|
|
103758
|
+
* @param phase - Apply phase
|
|
103759
|
+
* @returns Promise that resolves when pipeline changes are applied
|
|
103518
103760
|
*/
|
|
103519
103761
|
async function applyPipeline(client, result, phase = "create-update") {
|
|
103520
103762
|
const { changeSet } = result;
|
|
@@ -103532,10 +103774,11 @@ async function applyPipeline(client, result, phase = "create-update") {
|
|
|
103532
103774
|
}
|
|
103533
103775
|
/**
|
|
103534
103776
|
* Plan resolver pipeline changes based on current and desired state.
|
|
103535
|
-
* @param
|
|
103536
|
-
* @returns
|
|
103777
|
+
* @param context - Planning context
|
|
103778
|
+
* @returns Planned changes
|
|
103537
103779
|
*/
|
|
103538
|
-
async function planPipeline(
|
|
103780
|
+
async function planPipeline(context) {
|
|
103781
|
+
const { client, workspaceId, application, forRemoval } = context;
|
|
103539
103782
|
const pipelines = [];
|
|
103540
103783
|
if (!forRemoval) for (const pipeline of application.resolverServices) {
|
|
103541
103784
|
await pipeline.loadResolvers();
|
|
@@ -103771,10 +104014,10 @@ function protoFields(fields, baseName, isInput) {
|
|
|
103771
104014
|
//#region src/cli/apply/services/staticwebsite.ts
|
|
103772
104015
|
/**
|
|
103773
104016
|
* Apply static website changes for the given phase.
|
|
103774
|
-
* @param
|
|
103775
|
-
* @param
|
|
103776
|
-
* @param
|
|
103777
|
-
* @returns
|
|
104017
|
+
* @param client - Operator client instance
|
|
104018
|
+
* @param result - Planned static website changes
|
|
104019
|
+
* @param phase - Apply phase
|
|
104020
|
+
* @returns Promise that resolves when static websites are applied
|
|
103778
104021
|
*/
|
|
103779
104022
|
async function applyStaticWebsite(client, result, phase = "create-update") {
|
|
103780
104023
|
const { changeSet } = result;
|
|
@@ -103792,10 +104035,11 @@ function trn$1(workspaceId, name$1) {
|
|
|
103792
104035
|
}
|
|
103793
104036
|
/**
|
|
103794
104037
|
* Plan static website changes based on current and desired state.
|
|
103795
|
-
* @param
|
|
103796
|
-
* @returns
|
|
104038
|
+
* @param context - Planning context
|
|
104039
|
+
* @returns Planned changes
|
|
103797
104040
|
*/
|
|
103798
|
-
async function planStaticWebsite(
|
|
104041
|
+
async function planStaticWebsite(context) {
|
|
104042
|
+
const { client, workspaceId, application, forRemoval } = context;
|
|
103799
104043
|
const changeSet = new ChangeSet("StaticWebsites");
|
|
103800
104044
|
const conflicts = [];
|
|
103801
104045
|
const unmanaged = [];
|
|
@@ -103886,10 +104130,10 @@ async function planStaticWebsite({ client, workspaceId, application, forRemoval
|
|
|
103886
104130
|
//#region src/cli/apply/services/tailordb.ts
|
|
103887
104131
|
/**
|
|
103888
104132
|
* Apply TailorDB-related changes for the given phase.
|
|
103889
|
-
* @param
|
|
103890
|
-
* @param
|
|
103891
|
-
* @param
|
|
103892
|
-
* @returns
|
|
104133
|
+
* @param client - Operator client instance
|
|
104134
|
+
* @param result - Planned TailorDB changes
|
|
104135
|
+
* @param phase - Apply phase (defaults to "create-update")
|
|
104136
|
+
* @returns Promise that resolves when TailorDB changes are applied
|
|
103893
104137
|
*/
|
|
103894
104138
|
async function applyTailorDB(client, result, phase = "create-update") {
|
|
103895
104139
|
const { changeSet } = result;
|
|
@@ -103907,10 +104151,11 @@ async function applyTailorDB(client, result, phase = "create-update") {
|
|
|
103907
104151
|
}
|
|
103908
104152
|
/**
|
|
103909
104153
|
* Plan TailorDB-related changes based on current and desired state.
|
|
103910
|
-
* @param
|
|
103911
|
-
* @returns
|
|
104154
|
+
* @param context - Planning context
|
|
104155
|
+
* @returns Planned changes
|
|
103912
104156
|
*/
|
|
103913
|
-
async function planTailorDB(
|
|
104157
|
+
async function planTailorDB(context) {
|
|
104158
|
+
const { client, workspaceId, application, forRemoval } = context;
|
|
103914
104159
|
const tailordbs = [];
|
|
103915
104160
|
if (!forRemoval) for (const tailordb of application.tailorDBServices) {
|
|
103916
104161
|
await tailordb.loadTypes();
|
|
@@ -104440,10 +104685,10 @@ function protoGqlOperand(operand) {
|
|
|
104440
104685
|
//#region src/cli/apply/services/workflow.ts
|
|
104441
104686
|
/**
|
|
104442
104687
|
* Apply workflow changes for the given phase.
|
|
104443
|
-
* @param
|
|
104444
|
-
* @param
|
|
104445
|
-
* @param
|
|
104446
|
-
* @returns
|
|
104688
|
+
* @param client - Operator client instance
|
|
104689
|
+
* @param result - Planned workflow changes
|
|
104690
|
+
* @param phase - Apply phase
|
|
104691
|
+
* @returns Promise that resolves when workflows are applied
|
|
104447
104692
|
*/
|
|
104448
104693
|
async function applyWorkflow(client, result, phase = "create-update") {
|
|
104449
104694
|
const { changeSet, appName } = result;
|
|
@@ -104475,9 +104720,9 @@ async function applyWorkflow(client, result, phase = "create-update") {
|
|
|
104475
104720
|
}
|
|
104476
104721
|
/**
|
|
104477
104722
|
* Filter job function versions to only include those used by a workflow
|
|
104478
|
-
* @param
|
|
104479
|
-
* @param
|
|
104480
|
-
* @returns
|
|
104723
|
+
* @param allVersions - Map of job function names to versions
|
|
104724
|
+
* @param usedJobNames - Job names used by the workflow
|
|
104725
|
+
* @returns Filtered job function versions
|
|
104481
104726
|
*/
|
|
104482
104727
|
function filterJobFunctionVersions(allVersions, usedJobNames) {
|
|
104483
104728
|
const filtered = {};
|
|
@@ -104489,10 +104734,10 @@ function filterJobFunctionVersions(allVersions, usedJobNames) {
|
|
|
104489
104734
|
* Only registers jobs that are actually used (based on usedJobNames in changeSet).
|
|
104490
104735
|
* Uses create for new jobs and update for existing jobs.
|
|
104491
104736
|
* Sets metadata on used JobFunctions and removes metadata from unused ones.
|
|
104492
|
-
* @param
|
|
104493
|
-
* @param
|
|
104494
|
-
* @param
|
|
104495
|
-
* @returns
|
|
104737
|
+
* @param client - Operator client instance
|
|
104738
|
+
* @param changeSet - Workflow change set
|
|
104739
|
+
* @param appName - Application name
|
|
104740
|
+
* @returns Map of job function names to versions
|
|
104496
104741
|
*/
|
|
104497
104742
|
async function registerJobFunctions(client, changeSet, appName) {
|
|
104498
104743
|
const jobFunctionVersions = {};
|
|
@@ -104546,12 +104791,12 @@ function jobFunctionTrn(workspaceId, name$1) {
|
|
|
104546
104791
|
}
|
|
104547
104792
|
/**
|
|
104548
104793
|
* Plan workflow changes and job functions based on current and desired state.
|
|
104549
|
-
* @param
|
|
104550
|
-
* @param
|
|
104551
|
-
* @param
|
|
104552
|
-
* @param
|
|
104553
|
-
* @param
|
|
104554
|
-
* @returns
|
|
104794
|
+
* @param client - Operator client instance
|
|
104795
|
+
* @param workspaceId - Workspace ID
|
|
104796
|
+
* @param appName - Application name
|
|
104797
|
+
* @param workflows - Parsed workflows
|
|
104798
|
+
* @param mainJobDeps - Main job dependencies by workflow
|
|
104799
|
+
* @returns Planned workflow changes
|
|
104555
104800
|
*/
|
|
104556
104801
|
async function planWorkflow(client, workspaceId, appName, workflows, mainJobDeps) {
|
|
104557
104802
|
const changeSet = new ChangeSet("Workflows");
|
|
@@ -104646,8 +104891,8 @@ async function loadWorkflowScripts() {
|
|
|
104646
104891
|
//#region src/cli/apply/index.ts
|
|
104647
104892
|
/**
|
|
104648
104893
|
* Apply the configured application to the Tailor platform.
|
|
104649
|
-
* @param
|
|
104650
|
-
* @returns
|
|
104894
|
+
* @param options - Options for apply execution
|
|
104895
|
+
* @returns Promise that resolves when apply completes
|
|
104651
104896
|
*/
|
|
104652
104897
|
async function apply(options) {
|
|
104653
104898
|
const { config, configPath } = await loadConfig(options?.configPath);
|
|
@@ -104856,8 +105101,8 @@ var DependencyGraphManager = class {
|
|
|
104856
105101
|
}
|
|
104857
105102
|
/**
|
|
104858
105103
|
* Build the dependency graph from the given files.
|
|
104859
|
-
* @param
|
|
104860
|
-
* @returns
|
|
105104
|
+
* @param filePaths - File paths to analyze
|
|
105105
|
+
* @returns Promise that resolves when the graph is built
|
|
104861
105106
|
*/
|
|
104862
105107
|
async buildGraph(filePaths) {
|
|
104863
105108
|
try {
|
|
@@ -104902,8 +105147,8 @@ var DependencyGraphManager = class {
|
|
|
104902
105147
|
}
|
|
104903
105148
|
/**
|
|
104904
105149
|
* Get every file that depends on the specified file (all levels).
|
|
104905
|
-
* @param
|
|
104906
|
-
* @returns
|
|
105150
|
+
* @param filePath - File path to inspect
|
|
105151
|
+
* @returns List of dependent files
|
|
104907
105152
|
*/
|
|
104908
105153
|
getDependents(filePath) {
|
|
104909
105154
|
const visited = /* @__PURE__ */ new Set();
|
|
@@ -104911,8 +105156,8 @@ var DependencyGraphManager = class {
|
|
|
104911
105156
|
}
|
|
104912
105157
|
/**
|
|
104913
105158
|
* Get every file the specified file depends on (all levels).
|
|
104914
|
-
* @param
|
|
104915
|
-
* @returns
|
|
105159
|
+
* @param filePath - File path to inspect
|
|
105160
|
+
* @returns List of dependency files
|
|
104916
105161
|
*/
|
|
104917
105162
|
getDependencies(filePath) {
|
|
104918
105163
|
const visited = /* @__PURE__ */ new Set();
|
|
@@ -104920,7 +105165,7 @@ var DependencyGraphManager = class {
|
|
|
104920
105165
|
}
|
|
104921
105166
|
/**
|
|
104922
105167
|
* Detect circular dependencies.
|
|
104923
|
-
* @returns
|
|
105168
|
+
* @returns List of circular dependency cycles
|
|
104924
105169
|
*/
|
|
104925
105170
|
findCircularDependencies() {
|
|
104926
105171
|
if (!this.madgeInstance) return [];
|
|
@@ -104933,7 +105178,7 @@ var DependencyGraphManager = class {
|
|
|
104933
105178
|
}
|
|
104934
105179
|
/**
|
|
104935
105180
|
* Add a node to the graph.
|
|
104936
|
-
* @param
|
|
105181
|
+
* @param filePath - File path to add as a node
|
|
104937
105182
|
*/
|
|
104938
105183
|
addNode(filePath) {
|
|
104939
105184
|
const absolutePath = path$20.resolve(filePath);
|
|
@@ -104945,7 +105190,7 @@ var DependencyGraphManager = class {
|
|
|
104945
105190
|
}
|
|
104946
105191
|
/**
|
|
104947
105192
|
* Remove a node from the graph.
|
|
104948
|
-
* @param
|
|
105193
|
+
* @param filePath - File path to remove from the graph
|
|
104949
105194
|
*/
|
|
104950
105195
|
removeNode(filePath) {
|
|
104951
105196
|
const absolutePath = path$20.resolve(filePath);
|
|
@@ -104963,7 +105208,7 @@ var DependencyGraphManager = class {
|
|
|
104963
105208
|
}
|
|
104964
105209
|
/**
|
|
104965
105210
|
* Get graph statistics.
|
|
104966
|
-
* @returns
|
|
105211
|
+
* @returns Current dependency graph statistics
|
|
104967
105212
|
*/
|
|
104968
105213
|
getGraphStats() {
|
|
104969
105214
|
let edgeCount = 0;
|
|
@@ -105057,9 +105302,9 @@ var DependencyWatcher = class {
|
|
|
105057
105302
|
}
|
|
105058
105303
|
/**
|
|
105059
105304
|
* Add a watch group.
|
|
105060
|
-
* @param
|
|
105061
|
-
* @param
|
|
105062
|
-
* @returns
|
|
105305
|
+
* @param groupId - Group identifier
|
|
105306
|
+
* @param patterns - Glob patterns to watch
|
|
105307
|
+
* @returns Promise that resolves when the group is added
|
|
105063
105308
|
*/
|
|
105064
105309
|
async addWatchGroup(groupId, patterns) {
|
|
105065
105310
|
this.validateWatchGroup(groupId, patterns);
|
|
@@ -105083,8 +105328,8 @@ var DependencyWatcher = class {
|
|
|
105083
105328
|
}
|
|
105084
105329
|
/**
|
|
105085
105330
|
* Remove a watch group.
|
|
105086
|
-
* @param
|
|
105087
|
-
* @returns
|
|
105331
|
+
* @param groupId - Group identifier
|
|
105332
|
+
* @returns Promise that resolves when the group is removed
|
|
105088
105333
|
*/
|
|
105089
105334
|
async removeWatchGroup(groupId) {
|
|
105090
105335
|
const watchGroup = this.watchGroups.get(groupId);
|
|
@@ -105116,8 +105361,7 @@ var DependencyWatcher = class {
|
|
|
105116
105361
|
}
|
|
105117
105362
|
/**
|
|
105118
105363
|
* Set the error handling callback.
|
|
105119
|
-
* @param
|
|
105120
|
-
* @returns {void}
|
|
105364
|
+
* @param callback - Error callback
|
|
105121
105365
|
*/
|
|
105122
105366
|
onError(callback) {
|
|
105123
105367
|
this.errorCallback = callback;
|
|
@@ -105137,8 +105381,8 @@ var DependencyWatcher = class {
|
|
|
105137
105381
|
}
|
|
105138
105382
|
/**
|
|
105139
105383
|
* Compute the impact scope of a specific file.
|
|
105140
|
-
* @param
|
|
105141
|
-
* @returns
|
|
105384
|
+
* @param filePath - File path to analyze
|
|
105385
|
+
* @returns Impact analysis result for the file
|
|
105142
105386
|
*/
|
|
105143
105387
|
calculateImpact(filePath) {
|
|
105144
105388
|
const cacheKey = `impact:${filePath}`;
|
|
@@ -105156,14 +105400,14 @@ var DependencyWatcher = class {
|
|
|
105156
105400
|
}
|
|
105157
105401
|
/**
|
|
105158
105402
|
* Detect circular dependencies.
|
|
105159
|
-
* @returns
|
|
105403
|
+
* @returns List of circular dependency cycles
|
|
105160
105404
|
*/
|
|
105161
105405
|
detectCircularDependencies() {
|
|
105162
105406
|
return this.dependencyGraphManager.findCircularDependencies();
|
|
105163
105407
|
}
|
|
105164
105408
|
/**
|
|
105165
105409
|
* Retrieve the current watcher status.
|
|
105166
|
-
* @returns
|
|
105410
|
+
* @returns Snapshot of the current watcher status
|
|
105167
105411
|
*/
|
|
105168
105412
|
getWatchStatus() {
|
|
105169
105413
|
let fileCount = 0;
|
|
@@ -105188,7 +105432,7 @@ var DependencyWatcher = class {
|
|
|
105188
105432
|
restartCallback = null;
|
|
105189
105433
|
/**
|
|
105190
105434
|
* Set the restart callback to be called when a file change is detected.
|
|
105191
|
-
* @param
|
|
105435
|
+
* @param callback - Restart callback
|
|
105192
105436
|
*/
|
|
105193
105437
|
setRestartCallback(callback) {
|
|
105194
105438
|
this.restartCallback = callback;
|
|
@@ -105244,7 +105488,6 @@ var DependencyWatcher = class {
|
|
|
105244
105488
|
}
|
|
105245
105489
|
/**
|
|
105246
105490
|
* Register signal handlers.
|
|
105247
|
-
* @returns {void}
|
|
105248
105491
|
*/
|
|
105249
105492
|
setupSignalHandlers() {
|
|
105250
105493
|
if (this.signalHandlersRegistered) return;
|
|
@@ -105264,7 +105507,6 @@ var DependencyWatcher = class {
|
|
|
105264
105507
|
}
|
|
105265
105508
|
/**
|
|
105266
105509
|
* Remove signal handlers.
|
|
105267
|
-
* @returns {void}
|
|
105268
105510
|
*/
|
|
105269
105511
|
removeSignalHandlers() {
|
|
105270
105512
|
if (!this.signalHandlersRegistered) return;
|
|
@@ -105564,8 +105806,8 @@ var GenerationManager = class {
|
|
|
105564
105806
|
};
|
|
105565
105807
|
/**
|
|
105566
105808
|
* Run code generation using the Tailor configuration and generators.
|
|
105567
|
-
* @param
|
|
105568
|
-
* @returns
|
|
105809
|
+
* @param options - Generation options
|
|
105810
|
+
* @returns Promise that resolves when generation (and watch, if enabled) completes
|
|
105569
105811
|
*/
|
|
105570
105812
|
async function generate(options) {
|
|
105571
105813
|
const { config, generators, configPath } = await loadConfig(options?.configPath);
|
|
@@ -105607,8 +105849,8 @@ const generateCommand = defineCommand({
|
|
|
105607
105849
|
//#region src/cli/machineuser/list.ts
|
|
105608
105850
|
/**
|
|
105609
105851
|
* Map a MachineUser protobuf message to CLI-friendly info.
|
|
105610
|
-
* @param
|
|
105611
|
-
* @returns
|
|
105852
|
+
* @param user - Machine user resource
|
|
105853
|
+
* @returns Flattened machine user info
|
|
105612
105854
|
*/
|
|
105613
105855
|
function machineUserInfo(user) {
|
|
105614
105856
|
return {
|
|
@@ -105621,8 +105863,8 @@ function machineUserInfo(user) {
|
|
|
105621
105863
|
}
|
|
105622
105864
|
/**
|
|
105623
105865
|
* List machine users for the current application.
|
|
105624
|
-
* @param
|
|
105625
|
-
* @returns
|
|
105866
|
+
* @param options - Machine user listing options
|
|
105867
|
+
* @returns List of machine users
|
|
105626
105868
|
*/
|
|
105627
105869
|
async function listMachineUsers(options) {
|
|
105628
105870
|
const client = await initOperatorClient(await loadAccessToken({
|
|
@@ -105672,8 +105914,8 @@ const listCommand$3 = defineCommand({
|
|
|
105672
105914
|
//#region src/cli/machineuser/token.ts
|
|
105673
105915
|
/**
|
|
105674
105916
|
* Get a machine user access token for the current application.
|
|
105675
|
-
* @param
|
|
105676
|
-
* @returns
|
|
105917
|
+
* @param options - Token retrieval options
|
|
105918
|
+
* @returns Machine user token info
|
|
105677
105919
|
*/
|
|
105678
105920
|
async function getMachineUserToken(options) {
|
|
105679
105921
|
const client = await initOperatorClient(await loadAccessToken({
|
|
@@ -105747,8 +105989,8 @@ const grantTypeToString = (grantType) => {
|
|
|
105747
105989
|
};
|
|
105748
105990
|
/**
|
|
105749
105991
|
* Transform an AuthOAuth2Client into CLI-friendly OAuth2 client info.
|
|
105750
|
-
* @param
|
|
105751
|
-
* @returns
|
|
105992
|
+
* @param client - OAuth2 client resource
|
|
105993
|
+
* @returns Flattened OAuth2 client info
|
|
105752
105994
|
*/
|
|
105753
105995
|
function toOAuth2ClientInfo(client) {
|
|
105754
105996
|
return {
|
|
@@ -105762,8 +106004,8 @@ function toOAuth2ClientInfo(client) {
|
|
|
105762
106004
|
}
|
|
105763
106005
|
/**
|
|
105764
106006
|
* Transform an AuthOAuth2Client into OAuth2 client credentials info.
|
|
105765
|
-
* @param
|
|
105766
|
-
* @returns
|
|
106007
|
+
* @param client - OAuth2 client resource
|
|
106008
|
+
* @returns OAuth2 client credentials
|
|
105767
106009
|
*/
|
|
105768
106010
|
function toOAuth2ClientCredentials(client) {
|
|
105769
106011
|
return {
|
|
@@ -105781,8 +106023,8 @@ function toOAuth2ClientCredentials(client) {
|
|
|
105781
106023
|
//#region src/cli/oauth2client/get.ts
|
|
105782
106024
|
/**
|
|
105783
106025
|
* Get OAuth2 client credentials for the current application.
|
|
105784
|
-
* @param
|
|
105785
|
-
* @returns
|
|
106026
|
+
* @param options - OAuth2 client lookup options
|
|
106027
|
+
* @returns OAuth2 client credentials
|
|
105786
106028
|
*/
|
|
105787
106029
|
async function getOAuth2Client(options) {
|
|
105788
106030
|
const client = await initOperatorClient(await loadAccessToken({
|
|
@@ -105841,8 +106083,8 @@ const getCommand$1 = defineCommand({
|
|
|
105841
106083
|
//#region src/cli/oauth2client/list.ts
|
|
105842
106084
|
/**
|
|
105843
106085
|
* List OAuth2 clients for the current application.
|
|
105844
|
-
* @param
|
|
105845
|
-
* @returns
|
|
106086
|
+
* @param options - OAuth2 client listing options
|
|
106087
|
+
* @returns List of OAuth2 clients
|
|
105846
106088
|
*/
|
|
105847
106089
|
async function listOAuth2Clients(options) {
|
|
105848
106090
|
const client = await initOperatorClient(await loadAccessToken({
|
|
@@ -105938,8 +106180,8 @@ async function execRemove(client, workspaceId, application, confirm) {
|
|
|
105938
106180
|
}
|
|
105939
106181
|
/**
|
|
105940
106182
|
* Remove all resources managed by the current application.
|
|
105941
|
-
* @param
|
|
105942
|
-
* @returns
|
|
106183
|
+
* @param options - Remove options
|
|
106184
|
+
* @returns Promise that resolves when removal completes
|
|
105943
106185
|
*/
|
|
105944
106186
|
async function remove(options) {
|
|
105945
106187
|
const { client, workspaceId, application } = await loadOptions$1(options);
|
|
@@ -106015,8 +106257,8 @@ function applicationInfo(app) {
|
|
|
106015
106257
|
}
|
|
106016
106258
|
/**
|
|
106017
106259
|
* Show applied application information for the current workspace.
|
|
106018
|
-
* @param
|
|
106019
|
-
* @returns
|
|
106260
|
+
* @param options - Show options
|
|
106261
|
+
* @returns Application information
|
|
106020
106262
|
*/
|
|
106021
106263
|
async function show(options) {
|
|
106022
106264
|
const client = await initOperatorClient(await loadAccessToken({
|
|
@@ -106068,14 +106310,191 @@ const showCommand = defineCommand({
|
|
|
106068
106310
|
})
|
|
106069
106311
|
});
|
|
106070
106312
|
|
|
106313
|
+
//#endregion
|
|
106314
|
+
//#region src/cli/tailordb/truncate.ts
|
|
106315
|
+
async function truncateSingleType(options, client) {
|
|
106316
|
+
await client.truncateTailorDBType({
|
|
106317
|
+
workspaceId: options.workspaceId,
|
|
106318
|
+
namespaceName: options.namespaceName,
|
|
106319
|
+
tailordbTypeName: options.typeName
|
|
106320
|
+
});
|
|
106321
|
+
logger.success(`Truncated type "${options.typeName}" in namespace "${options.namespaceName}"`);
|
|
106322
|
+
}
|
|
106323
|
+
async function truncateNamespace(workspaceId, namespaceName, client) {
|
|
106324
|
+
await client.truncateTailorDBTypes({
|
|
106325
|
+
workspaceId,
|
|
106326
|
+
namespaceName
|
|
106327
|
+
});
|
|
106328
|
+
logger.success(`Truncated all types in namespace "${namespaceName}"`);
|
|
106329
|
+
}
|
|
106330
|
+
async function getAllNamespaces(configPath) {
|
|
106331
|
+
const { config } = await loadConfig(configPath);
|
|
106332
|
+
const namespaces = /* @__PURE__ */ new Set();
|
|
106333
|
+
if (config.db) for (const [namespaceName] of Object.entries(config.db)) namespaces.add(namespaceName);
|
|
106334
|
+
return Array.from(namespaces);
|
|
106335
|
+
}
|
|
106336
|
+
async function getTypeNamespace(workspaceId, typeName, client, configPath) {
|
|
106337
|
+
const namespaces = await getAllNamespaces(configPath);
|
|
106338
|
+
for (const namespace of namespaces) try {
|
|
106339
|
+
const { tailordbTypes } = await client.listTailorDBTypes({
|
|
106340
|
+
workspaceId,
|
|
106341
|
+
namespaceName: namespace
|
|
106342
|
+
});
|
|
106343
|
+
if (tailordbTypes.some((type) => type.name === typeName)) return namespace;
|
|
106344
|
+
} catch {
|
|
106345
|
+
continue;
|
|
106346
|
+
}
|
|
106347
|
+
return null;
|
|
106348
|
+
}
|
|
106349
|
+
/**
|
|
106350
|
+
* Truncate TailorDB data based on the given options.
|
|
106351
|
+
* @param options - Truncate options (all, namespace, or types)
|
|
106352
|
+
* @returns Promise that resolves when truncation completes
|
|
106353
|
+
*/
|
|
106354
|
+
async function truncate(options) {
|
|
106355
|
+
return await $truncate({
|
|
106356
|
+
...options,
|
|
106357
|
+
yes: true
|
|
106358
|
+
});
|
|
106359
|
+
}
|
|
106360
|
+
async function $truncate(options) {
|
|
106361
|
+
const client = await initOperatorClient(await loadAccessToken({
|
|
106362
|
+
useProfile: true,
|
|
106363
|
+
profile: options?.profile
|
|
106364
|
+
}));
|
|
106365
|
+
const workspaceId = loadWorkspaceId({
|
|
106366
|
+
workspaceId: options?.workspaceId,
|
|
106367
|
+
profile: options?.profile
|
|
106368
|
+
});
|
|
106369
|
+
const hasTypes = options?.types && options.types.length > 0;
|
|
106370
|
+
const hasNamespace = !!options?.namespace;
|
|
106371
|
+
const hasAll = !!options?.all;
|
|
106372
|
+
const optionCount = [
|
|
106373
|
+
hasAll,
|
|
106374
|
+
hasNamespace,
|
|
106375
|
+
hasTypes
|
|
106376
|
+
].filter(Boolean).length;
|
|
106377
|
+
if (optionCount === 0) throw new Error("Please specify one of: --all, --namespace <name>, or type names");
|
|
106378
|
+
if (optionCount > 1) throw new Error("Options --all, --namespace, and type names are mutually exclusive. Please specify only one.");
|
|
106379
|
+
const namespaces = await getAllNamespaces(options?.configPath);
|
|
106380
|
+
if (hasAll) {
|
|
106381
|
+
if (namespaces.length === 0) {
|
|
106382
|
+
logger.warn("No namespaces found in config file.");
|
|
106383
|
+
return;
|
|
106384
|
+
}
|
|
106385
|
+
if (!options?.yes) {
|
|
106386
|
+
const namespaceList = namespaces.join(", ");
|
|
106387
|
+
if (!await logger.prompt(`This will truncate ALL tables in the following namespaces: ${namespaceList}. Continue? (yes/no)`, {
|
|
106388
|
+
type: "confirm",
|
|
106389
|
+
initial: false
|
|
106390
|
+
})) {
|
|
106391
|
+
logger.info("Truncate cancelled.");
|
|
106392
|
+
return;
|
|
106393
|
+
}
|
|
106394
|
+
}
|
|
106395
|
+
for (const namespace of namespaces) await truncateNamespace(workspaceId, namespace, client);
|
|
106396
|
+
logger.success("Truncated all tables in all namespaces");
|
|
106397
|
+
return;
|
|
106398
|
+
}
|
|
106399
|
+
if (hasNamespace && options?.namespace) {
|
|
106400
|
+
const namespace = options.namespace;
|
|
106401
|
+
if (!namespaces.includes(namespace)) throw new Error(`Namespace "${namespace}" not found in config. Available namespaces: ${namespaces.join(", ")}`);
|
|
106402
|
+
if (!options.yes) {
|
|
106403
|
+
if (!await logger.prompt(`This will truncate ALL tables in namespace "${namespace}". Continue? (yes/no)`, {
|
|
106404
|
+
type: "confirm",
|
|
106405
|
+
initial: false
|
|
106406
|
+
})) {
|
|
106407
|
+
logger.info("Truncate cancelled.");
|
|
106408
|
+
return;
|
|
106409
|
+
}
|
|
106410
|
+
}
|
|
106411
|
+
await truncateNamespace(workspaceId, namespace, client);
|
|
106412
|
+
return;
|
|
106413
|
+
}
|
|
106414
|
+
if (hasTypes && options?.types) {
|
|
106415
|
+
const typeNames = options.types;
|
|
106416
|
+
const typeNamespaceMap = /* @__PURE__ */ new Map();
|
|
106417
|
+
const notFoundTypes = [];
|
|
106418
|
+
for (const typeName of typeNames) {
|
|
106419
|
+
const namespace = await getTypeNamespace(workspaceId, typeName, client, options.configPath);
|
|
106420
|
+
if (namespace) typeNamespaceMap.set(typeName, namespace);
|
|
106421
|
+
else notFoundTypes.push(typeName);
|
|
106422
|
+
}
|
|
106423
|
+
if (notFoundTypes.length > 0) throw new Error(`The following types were not found in any namespace: ${notFoundTypes.join(", ")}`);
|
|
106424
|
+
if (!options.yes) {
|
|
106425
|
+
const typeList = typeNames.join(", ");
|
|
106426
|
+
if (!await logger.prompt(`This will truncate the following types: ${typeList}. Continue? (yes/no)`, {
|
|
106427
|
+
type: "confirm",
|
|
106428
|
+
initial: false
|
|
106429
|
+
})) {
|
|
106430
|
+
logger.info("Truncate cancelled.");
|
|
106431
|
+
return;
|
|
106432
|
+
}
|
|
106433
|
+
}
|
|
106434
|
+
for (const typeName of typeNames) {
|
|
106435
|
+
const namespace = typeNamespaceMap.get(typeName);
|
|
106436
|
+
if (!namespace) continue;
|
|
106437
|
+
await truncateSingleType({
|
|
106438
|
+
workspaceId,
|
|
106439
|
+
namespaceName: namespace,
|
|
106440
|
+
typeName
|
|
106441
|
+
}, client);
|
|
106442
|
+
}
|
|
106443
|
+
}
|
|
106444
|
+
}
|
|
106445
|
+
const truncateCommand = defineCommand({
|
|
106446
|
+
meta: {
|
|
106447
|
+
name: "truncate",
|
|
106448
|
+
description: "Truncate TailorDB tables"
|
|
106449
|
+
},
|
|
106450
|
+
args: {
|
|
106451
|
+
...commonArgs,
|
|
106452
|
+
types: {
|
|
106453
|
+
type: "positional",
|
|
106454
|
+
description: "Type names to truncate",
|
|
106455
|
+
required: false
|
|
106456
|
+
},
|
|
106457
|
+
all: {
|
|
106458
|
+
type: "boolean",
|
|
106459
|
+
description: "Truncate all tables in all namespaces",
|
|
106460
|
+
default: false,
|
|
106461
|
+
alias: "a"
|
|
106462
|
+
},
|
|
106463
|
+
namespace: {
|
|
106464
|
+
type: "string",
|
|
106465
|
+
description: "Truncate all tables in specified namespace",
|
|
106466
|
+
alias: "n"
|
|
106467
|
+
},
|
|
106468
|
+
yes: {
|
|
106469
|
+
type: "boolean",
|
|
106470
|
+
description: "Skip confirmation prompt",
|
|
106471
|
+
alias: "y",
|
|
106472
|
+
default: false
|
|
106473
|
+
},
|
|
106474
|
+
...deploymentArgs
|
|
106475
|
+
},
|
|
106476
|
+
run: withCommonArgs(async (args) => {
|
|
106477
|
+
const types$2 = args._.length > 0 ? args._.map((arg) => String(arg)).filter(Boolean) : void 0;
|
|
106478
|
+
await $truncate({
|
|
106479
|
+
workspaceId: args["workspace-id"],
|
|
106480
|
+
profile: args.profile,
|
|
106481
|
+
configPath: args.config,
|
|
106482
|
+
all: args.all,
|
|
106483
|
+
namespace: args.namespace,
|
|
106484
|
+
types: types$2,
|
|
106485
|
+
yes: args.yes
|
|
106486
|
+
});
|
|
106487
|
+
})
|
|
106488
|
+
});
|
|
106489
|
+
|
|
106071
106490
|
//#endregion
|
|
106072
106491
|
//#region src/cli/utils/format.ts
|
|
106073
106492
|
/**
|
|
106074
106493
|
* Formats a table with consistent single-line border style.
|
|
106075
106494
|
* Use this instead of importing `table` directly.
|
|
106076
|
-
* @param
|
|
106077
|
-
* @param
|
|
106078
|
-
* @returns
|
|
106495
|
+
* @param data - Table data
|
|
106496
|
+
* @param config - Table configuration
|
|
106497
|
+
* @returns Formatted table string
|
|
106079
106498
|
*/
|
|
106080
106499
|
function formatTable(data$1, config) {
|
|
106081
106500
|
return table(data$1, {
|
|
@@ -106085,8 +106504,8 @@ function formatTable(data$1, config) {
|
|
|
106085
106504
|
}
|
|
106086
106505
|
/**
|
|
106087
106506
|
* Formats a key-value table with single-line border style.
|
|
106088
|
-
* @param
|
|
106089
|
-
* @returns
|
|
106507
|
+
* @param data - Key-value pairs
|
|
106508
|
+
* @returns Formatted key-value table string
|
|
106090
106509
|
*/
|
|
106091
106510
|
function formatKeyValueTable(data$1) {
|
|
106092
106511
|
return formatTable(data$1, { singleLine: true });
|
|
@@ -106094,9 +106513,9 @@ function formatKeyValueTable(data$1) {
|
|
|
106094
106513
|
/**
|
|
106095
106514
|
* Formats a table with headers, using single-line border style.
|
|
106096
106515
|
* Draws horizontal lines only at top, after header, and bottom.
|
|
106097
|
-
* @param
|
|
106098
|
-
* @param
|
|
106099
|
-
* @returns
|
|
106516
|
+
* @param headers - Table header labels
|
|
106517
|
+
* @param rows - Table rows
|
|
106518
|
+
* @returns Formatted table string with headers
|
|
106100
106519
|
*/
|
|
106101
106520
|
function formatTableWithHeaders(headers, rows) {
|
|
106102
106521
|
return formatTable([headers, ...rows], { drawHorizontalLine: (lineIndex, rowCount) => {
|
|
@@ -106105,8 +106524,8 @@ function formatTableWithHeaders(headers, rows) {
|
|
|
106105
106524
|
}
|
|
106106
106525
|
/**
|
|
106107
106526
|
* Format an ISO timestamp string as a human-readable relative time.
|
|
106108
|
-
* @param
|
|
106109
|
-
* @returns
|
|
106527
|
+
* @param isoString - ISO date string
|
|
106528
|
+
* @returns Relative time (e.g., "5 minutes ago")
|
|
106110
106529
|
*/
|
|
106111
106530
|
function humanizeRelativeTime(isoString) {
|
|
106112
106531
|
const date = new Date(isoString);
|
|
@@ -106146,8 +106565,8 @@ const waitArgs = {
|
|
|
106146
106565
|
//#region src/cli/workflow/transform.ts
|
|
106147
106566
|
/**
|
|
106148
106567
|
* Convert a workflow execution status enum to a string.
|
|
106149
|
-
* @param
|
|
106150
|
-
* @returns
|
|
106568
|
+
* @param status - Workflow execution status
|
|
106569
|
+
* @returns String representation of the status
|
|
106151
106570
|
*/
|
|
106152
106571
|
function workflowExecutionStatusToString(status) {
|
|
106153
106572
|
switch (status) {
|
|
@@ -106161,8 +106580,8 @@ function workflowExecutionStatusToString(status) {
|
|
|
106161
106580
|
}
|
|
106162
106581
|
/**
|
|
106163
106582
|
* Convert a workflow job execution status enum to a string.
|
|
106164
|
-
* @param
|
|
106165
|
-
* @returns
|
|
106583
|
+
* @param status - Workflow job execution status
|
|
106584
|
+
* @returns String representation of the status
|
|
106166
106585
|
*/
|
|
106167
106586
|
function workflowJobExecutionStatusToString(status) {
|
|
106168
106587
|
switch (status) {
|
|
@@ -106175,8 +106594,8 @@ function workflowJobExecutionStatusToString(status) {
|
|
|
106175
106594
|
}
|
|
106176
106595
|
/**
|
|
106177
106596
|
* Convert a Workflow proto to CLI-friendly list info.
|
|
106178
|
-
* @param
|
|
106179
|
-
* @returns
|
|
106597
|
+
* @param workflow - Workflow resource
|
|
106598
|
+
* @returns Flattened workflow list info
|
|
106180
106599
|
*/
|
|
106181
106600
|
function toWorkflowListInfo(workflow) {
|
|
106182
106601
|
return {
|
|
@@ -106188,8 +106607,8 @@ function toWorkflowListInfo(workflow) {
|
|
|
106188
106607
|
}
|
|
106189
106608
|
/**
|
|
106190
106609
|
* Convert a Workflow proto to detailed workflow info for CLI output.
|
|
106191
|
-
* @param
|
|
106192
|
-
* @returns
|
|
106610
|
+
* @param workflow - Workflow resource
|
|
106611
|
+
* @returns Detailed workflow info
|
|
106193
106612
|
*/
|
|
106194
106613
|
function toWorkflowInfo(workflow) {
|
|
106195
106614
|
const jobFunctions = {};
|
|
@@ -106205,8 +106624,8 @@ function toWorkflowInfo(workflow) {
|
|
|
106205
106624
|
}
|
|
106206
106625
|
/**
|
|
106207
106626
|
* Convert a WorkflowJobExecution proto to CLI-friendly job execution info.
|
|
106208
|
-
* @param
|
|
106209
|
-
* @returns
|
|
106627
|
+
* @param jobExecution - Workflow job execution resource
|
|
106628
|
+
* @returns Flattened job execution info
|
|
106210
106629
|
*/
|
|
106211
106630
|
function toWorkflowJobExecutionInfo(jobExecution) {
|
|
106212
106631
|
return {
|
|
@@ -106220,8 +106639,8 @@ function toWorkflowJobExecutionInfo(jobExecution) {
|
|
|
106220
106639
|
}
|
|
106221
106640
|
/**
|
|
106222
106641
|
* Convert a WorkflowExecution proto to CLI-friendly execution info.
|
|
106223
|
-
* @param
|
|
106224
|
-
* @returns
|
|
106642
|
+
* @param execution - Workflow execution resource
|
|
106643
|
+
* @returns Flattened execution info
|
|
106225
106644
|
*/
|
|
106226
106645
|
function toWorkflowExecutionInfo(execution) {
|
|
106227
106646
|
return {
|
|
@@ -106265,8 +106684,8 @@ function parseStatus(status) {
|
|
|
106265
106684
|
}
|
|
106266
106685
|
/**
|
|
106267
106686
|
* List workflow executions with optional filters.
|
|
106268
|
-
* @param
|
|
106269
|
-
* @returns
|
|
106687
|
+
* @param options - Workflow execution listing options
|
|
106688
|
+
* @returns List of workflow executions
|
|
106270
106689
|
*/
|
|
106271
106690
|
async function listWorkflowExecutions(options) {
|
|
106272
106691
|
const client = await initOperatorClient(await loadAccessToken({
|
|
@@ -106310,8 +106729,8 @@ async function listWorkflowExecutions(options) {
|
|
|
106310
106729
|
}
|
|
106311
106730
|
/**
|
|
106312
106731
|
* Get a single workflow execution with optional logs.
|
|
106313
|
-
* @param
|
|
106314
|
-
* @returns
|
|
106732
|
+
* @param options - Workflow execution lookup options
|
|
106733
|
+
* @returns Workflow execution with optional logs
|
|
106315
106734
|
*/
|
|
106316
106735
|
async function getWorkflowExecution(options) {
|
|
106317
106736
|
const client = await initOperatorClient(await loadAccessToken({
|
|
@@ -106397,8 +106816,7 @@ async function waitWithSpinner(waitFn, interval, json) {
|
|
|
106397
106816
|
}
|
|
106398
106817
|
/**
|
|
106399
106818
|
* Print a workflow execution and its logs in a human-readable format.
|
|
106400
|
-
* @param
|
|
106401
|
-
* @returns {void}
|
|
106819
|
+
* @param execution - Workflow execution detail info
|
|
106402
106820
|
*/
|
|
106403
106821
|
function printExecutionWithLogs(execution) {
|
|
106404
106822
|
const summaryData = [
|
|
@@ -106495,10 +106913,10 @@ const executionsCommand = defineCommand({
|
|
|
106495
106913
|
//#region src/cli/workflow/get.ts
|
|
106496
106914
|
/**
|
|
106497
106915
|
* Resolve a workflow definition by name.
|
|
106498
|
-
* @param
|
|
106499
|
-
* @param
|
|
106500
|
-
* @param
|
|
106501
|
-
* @returns
|
|
106916
|
+
* @param client - Operator client
|
|
106917
|
+
* @param workspaceId - Workspace ID
|
|
106918
|
+
* @param name - Workflow name
|
|
106919
|
+
* @returns Resolved workflow
|
|
106502
106920
|
*/
|
|
106503
106921
|
async function resolveWorkflow(client, workspaceId, name$1) {
|
|
106504
106922
|
const { workflow } = await client.getWorkflowByName({
|
|
@@ -106510,8 +106928,8 @@ async function resolveWorkflow(client, workspaceId, name$1) {
|
|
|
106510
106928
|
}
|
|
106511
106929
|
/**
|
|
106512
106930
|
* Get a workflow by name and return CLI-friendly info.
|
|
106513
|
-
* @param
|
|
106514
|
-
* @returns
|
|
106931
|
+
* @param options - Workflow lookup options
|
|
106932
|
+
* @returns Workflow information
|
|
106515
106933
|
*/
|
|
106516
106934
|
async function getWorkflow(options) {
|
|
106517
106935
|
const client = await initOperatorClient(await loadAccessToken({
|
|
@@ -106554,8 +106972,8 @@ const getCommand = defineCommand({
|
|
|
106554
106972
|
//#region src/cli/workflow/list.ts
|
|
106555
106973
|
/**
|
|
106556
106974
|
* List workflows in the workspace and return CLI-friendly info.
|
|
106557
|
-
* @param
|
|
106558
|
-
* @returns
|
|
106975
|
+
* @param options - Workflow listing options
|
|
106976
|
+
* @returns List of workflows
|
|
106559
106977
|
*/
|
|
106560
106978
|
async function listWorkflows(options) {
|
|
106561
106979
|
const client = await initOperatorClient(await loadAccessToken({
|
|
@@ -106633,8 +107051,8 @@ function colorizeStatus(status) {
|
|
|
106633
107051
|
}
|
|
106634
107052
|
/**
|
|
106635
107053
|
* Wait for a workflow execution to reach a terminal state, optionally showing progress.
|
|
106636
|
-
* @param
|
|
106637
|
-
* @returns
|
|
107054
|
+
* @param options - Wait options
|
|
107055
|
+
* @returns Final workflow execution info
|
|
106638
107056
|
*/
|
|
106639
107057
|
async function waitForExecution(options) {
|
|
106640
107058
|
const { client, workspaceId, executionId, interval, showProgress, trackJobs } = options;
|
|
@@ -106694,8 +107112,8 @@ function isTerminalStatus(status) {
|
|
|
106694
107112
|
}
|
|
106695
107113
|
/**
|
|
106696
107114
|
* Start a workflow and return a handle to wait for completion.
|
|
106697
|
-
* @param
|
|
106698
|
-
* @returns
|
|
107115
|
+
* @param options - Start options
|
|
107116
|
+
* @returns Start result with wait helper
|
|
106699
107117
|
*/
|
|
106700
107118
|
async function startWorkflow(options) {
|
|
106701
107119
|
const client = await initOperatorClient(await loadAccessToken({
|
|
@@ -106795,8 +107213,8 @@ const startCommand = defineCommand({
|
|
|
106795
107213
|
//#region src/cli/workflow/resume.ts
|
|
106796
107214
|
/**
|
|
106797
107215
|
* Resume a suspended workflow execution and return a handle to wait for completion.
|
|
106798
|
-
* @param
|
|
106799
|
-
* @returns
|
|
107216
|
+
* @param options - Resume options
|
|
107217
|
+
* @returns Resume result with wait helper
|
|
106800
107218
|
*/
|
|
106801
107219
|
async function resumeWorkflow(options) {
|
|
106802
107220
|
const client = await initOperatorClient(await loadAccessToken({
|
|
@@ -106908,8 +107326,8 @@ const validateRegion = async (region, client) => {
|
|
|
106908
107326
|
};
|
|
106909
107327
|
/**
|
|
106910
107328
|
* Create a new workspace with the given options.
|
|
106911
|
-
* @param
|
|
106912
|
-
* @returns
|
|
107329
|
+
* @param options - Workspace creation options
|
|
107330
|
+
* @returns Created workspace info
|
|
106913
107331
|
*/
|
|
106914
107332
|
async function createWorkspace(options) {
|
|
106915
107333
|
const result = createWorkspaceOptionsSchema.safeParse(options);
|
|
@@ -106990,8 +107408,8 @@ async function loadOptions(options) {
|
|
|
106990
107408
|
}
|
|
106991
107409
|
/**
|
|
106992
107410
|
* Delete a workspace by ID.
|
|
106993
|
-
* @param
|
|
106994
|
-
* @returns
|
|
107411
|
+
* @param options - Workspace deletion options
|
|
107412
|
+
* @returns Promise that resolves when deletion completes
|
|
106995
107413
|
*/
|
|
106996
107414
|
async function deleteWorkspace(options) {
|
|
106997
107415
|
const { client, workspaceId } = await loadOptions(options);
|
|
@@ -107041,8 +107459,8 @@ const deleteCommand = defineCommand({
|
|
|
107041
107459
|
const limitSchema = z.coerce.number().int().positive().optional();
|
|
107042
107460
|
/**
|
|
107043
107461
|
* List workspaces with an optional limit.
|
|
107044
|
-
* @param
|
|
107045
|
-
* @returns
|
|
107462
|
+
* @param options - Workspace listing options
|
|
107463
|
+
* @returns List of workspaces
|
|
107046
107464
|
*/
|
|
107047
107465
|
async function listWorkspaces(options) {
|
|
107048
107466
|
const limit = options?.limit;
|
|
@@ -107097,5 +107515,5 @@ const listCommand = defineCommand({
|
|
|
107097
107515
|
});
|
|
107098
107516
|
|
|
107099
107517
|
//#endregion
|
|
107100
|
-
export {
|
|
107101
|
-
//# sourceMappingURL=list-
|
|
107518
|
+
export { deploymentArgs as $, listCommand$3 as A, fetchLatestToken as B, removeCommand as C, getOAuth2Client as D, getCommand$1 as E, applyCommand as F, fetchAll as G, loadWorkspaceId as H, generateUserTypes as I, initOperatorClient as J, fetchUserInfo as K, loadConfig as L, generate as M, generateCommand as N, getMachineUserToken as O, apply as P, confirmationArgs as Q, apiCall as R, remove as S, listOAuth2Clients as T, readPlatformConfig as U, loadAccessToken as V, writePlatformConfig as W, PATScope as X, readPackageJson as Y, commonArgs as Z, listWorkflowExecutions as _, createCommand as a, show as b, resumeWorkflow as c, listCommand$1 as d, jsonArgs as et, listWorkflows as f, getWorkflowExecution as g, executionsCommand as h, deleteWorkspace as i, listMachineUsers as j, tokenCommand as k, startCommand as l, getWorkflow as m, listWorkspaces as n, workspaceArgs as nt, createWorkspace as o, getCommand as p, initOAuth2Client as q, deleteCommand as r, logger as rt, resumeCommand as s, listCommand as t, withCommonArgs as tt, startWorkflow as u, truncate as v, listCommand$2 as w, showCommand as x, truncateCommand as y, apiCommand as z };
|
|
107519
|
+
//# sourceMappingURL=list-1cs_CGF8.mjs.map
|