@signstack/cli 0.1.1
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/README.md +458 -0
- package/bin/run.js +12 -0
- package/dist/apps/signstack-cli/schemas/asset.schema.json +220 -0
- package/dist/apps/signstack-cli/schemas/blueprint.schema.json +485 -0
- package/dist/apps/signstack-cli/schemas/jsonata-function.schema.json +185 -0
- package/dist/apps/signstack-cli/schemas/schema.schema.json +97 -0
- package/dist/apps/signstack-cli/schemas/template.schema.json +295 -0
- package/dist/apps/signstack-cli/src/commands/auth/login.d.ts +25 -0
- package/dist/apps/signstack-cli/src/commands/auth/login.js +229 -0
- package/dist/apps/signstack-cli/src/commands/auth/login.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/auth/logout.d.ts +10 -0
- package/dist/apps/signstack-cli/src/commands/auth/logout.js +59 -0
- package/dist/apps/signstack-cli/src/commands/auth/logout.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/auth/whoami.d.ts +9 -0
- package/dist/apps/signstack-cli/src/commands/auth/whoami.js +85 -0
- package/dist/apps/signstack-cli/src/commands/auth/whoami.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/generate.d.ts +51 -0
- package/dist/apps/signstack-cli/src/commands/generate.js +479 -0
- package/dist/apps/signstack-cli/src/commands/generate.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/preview.d.ts +24 -0
- package/dist/apps/signstack-cli/src/commands/preview.js +162 -0
- package/dist/apps/signstack-cli/src/commands/preview.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/pull.d.ts +28 -0
- package/dist/apps/signstack-cli/src/commands/pull.js +244 -0
- package/dist/apps/signstack-cli/src/commands/pull.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/push.d.ts +46 -0
- package/dist/apps/signstack-cli/src/commands/push.js +460 -0
- package/dist/apps/signstack-cli/src/commands/push.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/run.d.ts +22 -0
- package/dist/apps/signstack-cli/src/commands/run.js +126 -0
- package/dist/apps/signstack-cli/src/commands/run.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/test.d.ts +6 -0
- package/dist/apps/signstack-cli/src/commands/test.js +25 -0
- package/dist/apps/signstack-cli/src/commands/test.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/validate.d.ts +59 -0
- package/dist/apps/signstack-cli/src/commands/validate.js +558 -0
- package/dist/apps/signstack-cli/src/commands/validate.js.map +1 -0
- package/dist/apps/signstack-cli/src/index.d.ts +1 -0
- package/dist/apps/signstack-cli/src/index.js +2 -0
- package/dist/apps/signstack-cli/src/index.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/api-client.d.ts +77 -0
- package/dist/apps/signstack-cli/src/lib/api-client.js +269 -0
- package/dist/apps/signstack-cli/src/lib/api-client.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/base-command.d.ts +38 -0
- package/dist/apps/signstack-cli/src/lib/base-command.js +135 -0
- package/dist/apps/signstack-cli/src/lib/base-command.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/config.d.ts +47 -0
- package/dist/apps/signstack-cli/src/lib/config.js +106 -0
- package/dist/apps/signstack-cli/src/lib/config.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/entity-data-resolver.d.ts +31 -0
- package/dist/apps/signstack-cli/src/lib/entity-data-resolver.js +107 -0
- package/dist/apps/signstack-cli/src/lib/entity-data-resolver.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/local-resource-loader.d.ts +72 -0
- package/dist/apps/signstack-cli/src/lib/local-resource-loader.js +238 -0
- package/dist/apps/signstack-cli/src/lib/local-resource-loader.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/path-utils.d.ts +4 -0
- package/dist/apps/signstack-cli/src/lib/path-utils.js +7 -0
- package/dist/apps/signstack-cli/src/lib/path-utils.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/payload-builder.d.ts +127 -0
- package/dist/apps/signstack-cli/src/lib/payload-builder.js +545 -0
- package/dist/apps/signstack-cli/src/lib/payload-builder.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/preview-handler.d.ts +95 -0
- package/dist/apps/signstack-cli/src/lib/preview-handler.js +611 -0
- package/dist/apps/signstack-cli/src/lib/preview-handler.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/preview-output-formatter.d.ts +63 -0
- package/dist/apps/signstack-cli/src/lib/preview-output-formatter.js +198 -0
- package/dist/apps/signstack-cli/src/lib/preview-output-formatter.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/public-api-client.d.ts +13 -0
- package/dist/apps/signstack-cli/src/lib/public-api-client.js +39 -0
- package/dist/apps/signstack-cli/src/lib/public-api-client.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/resource-puller.d.ts +131 -0
- package/dist/apps/signstack-cli/src/lib/resource-puller.js +800 -0
- package/dist/apps/signstack-cli/src/lib/resource-puller.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/resource-pusher.d.ts +87 -0
- package/dist/apps/signstack-cli/src/lib/resource-pusher.js +361 -0
- package/dist/apps/signstack-cli/src/lib/resource-pusher.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/resource-scanner.d.ts +29 -0
- package/dist/apps/signstack-cli/src/lib/resource-scanner.js +101 -0
- package/dist/apps/signstack-cli/src/lib/resource-scanner.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/resource-validator.d.ts +44 -0
- package/dist/apps/signstack-cli/src/lib/resource-validator.js +158 -0
- package/dist/apps/signstack-cli/src/lib/resource-validator.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/run-handler.d.ts +47 -0
- package/dist/apps/signstack-cli/src/lib/run-handler.js +266 -0
- package/dist/apps/signstack-cli/src/lib/run-handler.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/safe-path.d.ts +28 -0
- package/dist/apps/signstack-cli/src/lib/safe-path.js +44 -0
- package/dist/apps/signstack-cli/src/lib/safe-path.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/scenario-file.d.ts +35 -0
- package/dist/apps/signstack-cli/src/lib/scenario-file.js +80 -0
- package/dist/apps/signstack-cli/src/lib/scenario-file.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/schema-validator.d.ts +8 -0
- package/dist/apps/signstack-cli/src/lib/schema-validator.js +39 -0
- package/dist/apps/signstack-cli/src/lib/schema-validator.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/url-validator.d.ts +17 -0
- package/dist/apps/signstack-cli/src/lib/url-validator.js +61 -0
- package/dist/apps/signstack-cli/src/lib/url-validator.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/yaml-document-parser.d.ts +25 -0
- package/dist/apps/signstack-cli/src/lib/yaml-document-parser.js +133 -0
- package/dist/apps/signstack-cli/src/lib/yaml-document-parser.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/yaml-transforms.d.ts +3 -0
- package/dist/apps/signstack-cli/src/lib/yaml-transforms.js +32 -0
- package/dist/apps/signstack-cli/src/lib/yaml-transforms.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/yaml-writer.d.ts +47 -0
- package/dist/apps/signstack-cli/src/lib/yaml-writer.js +160 -0
- package/dist/apps/signstack-cli/src/lib/yaml-writer.js.map +1 -0
- package/dist/apps/signstack-cli/src/types/auth.types.d.ts +48 -0
- package/dist/apps/signstack-cli/src/types/auth.types.js +31 -0
- package/dist/apps/signstack-cli/src/types/auth.types.js.map +1 -0
- package/dist/apps/signstack-cli/src/types/schema.types.d.ts +14 -0
- package/dist/apps/signstack-cli/src/types/schema.types.js +16 -0
- package/dist/apps/signstack-cli/src/types/schema.types.js.map +1 -0
- package/dist/apps/signstack-cli/src/types/yaml.types.d.ts +144 -0
- package/dist/apps/signstack-cli/src/types/yaml.types.js +2 -0
- package/dist/apps/signstack-cli/src/types/yaml.types.js.map +1 -0
- package/dist/libs/common/base/src/index.d.ts +14 -0
- package/dist/libs/common/base/src/index.js +44 -0
- package/dist/libs/common/base/src/index.js.map +1 -0
- package/dist/libs/common/base/src/lib/address.util.d.ts +12 -0
- package/dist/libs/common/base/src/lib/address.util.js +55 -0
- package/dist/libs/common/base/src/lib/address.util.js.map +1 -0
- package/dist/libs/common/base/src/lib/country-code-data.d.ts +5 -0
- package/dist/libs/common/base/src/lib/country-code-data.js +1256 -0
- package/dist/libs/common/base/src/lib/country-code-data.js.map +1 -0
- package/dist/libs/common/base/src/lib/date.util.d.ts +13 -0
- package/dist/libs/common/base/src/lib/date.util.js +135 -0
- package/dist/libs/common/base/src/lib/date.util.js.map +1 -0
- package/dist/libs/common/base/src/lib/headers.d.ts +1 -0
- package/dist/libs/common/base/src/lib/headers.js +5 -0
- package/dist/libs/common/base/src/lib/headers.js.map +1 -0
- package/dist/libs/common/base/src/lib/jsonata.service.d.ts +32 -0
- package/dist/libs/common/base/src/lib/jsonata.service.js +207 -0
- package/dist/libs/common/base/src/lib/jsonata.service.js.map +1 -0
- package/dist/libs/common/base/src/lib/key-validation.constants.d.ts +37 -0
- package/dist/libs/common/base/src/lib/key-validation.constants.js +144 -0
- package/dist/libs/common/base/src/lib/key-validation.constants.js.map +1 -0
- package/dist/libs/common/base/src/lib/phone-util.d.ts +16 -0
- package/dist/libs/common/base/src/lib/phone-util.js +61 -0
- package/dist/libs/common/base/src/lib/phone-util.js.map +1 -0
- package/dist/libs/common/base/src/lib/schema-validation.util.d.ts +24 -0
- package/dist/libs/common/base/src/lib/schema-validation.util.js +155 -0
- package/dist/libs/common/base/src/lib/schema-validation.util.js.map +1 -0
- package/dist/libs/common/base/src/lib/string-builder.d.ts +48 -0
- package/dist/libs/common/base/src/lib/string-builder.js +90 -0
- package/dist/libs/common/base/src/lib/string-builder.js.map +1 -0
- package/dist/libs/common/base/src/lib/util.d.ts +20 -0
- package/dist/libs/common/base/src/lib/util.js +110 -0
- package/dist/libs/common/base/src/lib/util.js.map +1 -0
- package/dist/libs/signstack/base/schemas/asset.schema.json +220 -0
- package/dist/libs/signstack/base/schemas/blueprint.schema.json +485 -0
- package/dist/libs/signstack/base/schemas/jsonata-function.schema.json +185 -0
- package/dist/libs/signstack/base/schemas/schema.schema.json +97 -0
- package/dist/libs/signstack/base/schemas/template.schema.json +295 -0
- package/dist/libs/signstack/base/src/index.d.ts +28 -0
- package/dist/libs/signstack/base/src/index.js +32 -0
- package/dist/libs/signstack/base/src/index.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/constants.d.ts +123 -0
- package/dist/libs/signstack/base/src/lib/constants.js +131 -0
- package/dist/libs/signstack/base/src/lib/constants.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/hash.util.d.ts +58 -0
- package/dist/libs/signstack/base/src/lib/hash.util.js +90 -0
- package/dist/libs/signstack/base/src/lib/hash.util.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/is-schema-renderable.util.d.ts +29 -0
- package/dist/libs/signstack/base/src/lib/is-schema-renderable.util.js +93 -0
- package/dist/libs/signstack/base/src/lib/is-schema-renderable.util.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/ai-chat.d.ts +41 -0
- package/dist/libs/signstack/base/src/lib/models/ai-chat.js +3 -0
- package/dist/libs/signstack/base/src/lib/models/ai-chat.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/api-key.d.ts +54 -0
- package/dist/libs/signstack/base/src/lib/models/api-key.js +18 -0
- package/dist/libs/signstack/base/src/lib/models/api-key.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/asset.d.ts +101 -0
- package/dist/libs/signstack/base/src/lib/models/asset.js +11 -0
- package/dist/libs/signstack/base/src/lib/models/asset.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/auth.d.ts +142 -0
- package/dist/libs/signstack/base/src/lib/models/auth.js +35 -0
- package/dist/libs/signstack/base/src/lib/models/auth.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/base.d.ts +134 -0
- package/dist/libs/signstack/base/src/lib/models/base.js +71 -0
- package/dist/libs/signstack/base/src/lib/models/base.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/blueprint.d.ts +311 -0
- package/dist/libs/signstack/base/src/lib/models/blueprint.js +9 -0
- package/dist/libs/signstack/base/src/lib/models/blueprint.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/file.d.ts +75 -0
- package/dist/libs/signstack/base/src/lib/models/file.js +9 -0
- package/dist/libs/signstack/base/src/lib/models/file.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/jsonata-function.d.ts +111 -0
- package/dist/libs/signstack/base/src/lib/models/jsonata-function.js +19 -0
- package/dist/libs/signstack/base/src/lib/models/jsonata-function.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/marketplace-listing.d.ts +132 -0
- package/dist/libs/signstack/base/src/lib/models/marketplace-listing.js +22 -0
- package/dist/libs/signstack/base/src/lib/models/marketplace-listing.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/membership.d.ts +127 -0
- package/dist/libs/signstack/base/src/lib/models/membership.js +22 -0
- package/dist/libs/signstack/base/src/lib/models/membership.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/namespace.d.ts +87 -0
- package/dist/libs/signstack/base/src/lib/models/namespace.js +57 -0
- package/dist/libs/signstack/base/src/lib/models/namespace.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/organization.d.ts +79 -0
- package/dist/libs/signstack/base/src/lib/models/organization.js +41 -0
- package/dist/libs/signstack/base/src/lib/models/organization.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/render-job.d.ts +88 -0
- package/dist/libs/signstack/base/src/lib/models/render-job.js +3 -0
- package/dist/libs/signstack/base/src/lib/models/render-job.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/resource-edge.d.ts +60 -0
- package/dist/libs/signstack/base/src/lib/models/resource-edge.js +202 -0
- package/dist/libs/signstack/base/src/lib/models/resource-edge.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/scenario.d.ts +138 -0
- package/dist/libs/signstack/base/src/lib/models/scenario.js +14 -0
- package/dist/libs/signstack/base/src/lib/models/scenario.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/schema.d.ts +131 -0
- package/dist/libs/signstack/base/src/lib/models/schema.js +44 -0
- package/dist/libs/signstack/base/src/lib/models/schema.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/shareable-link.d.ts +215 -0
- package/dist/libs/signstack/base/src/lib/models/shareable-link.js +27 -0
- package/dist/libs/signstack/base/src/lib/models/shareable-link.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/subscription.d.ts +279 -0
- package/dist/libs/signstack/base/src/lib/models/subscription.js +105 -0
- package/dist/libs/signstack/base/src/lib/models/subscription.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/template.d.ts +248 -0
- package/dist/libs/signstack/base/src/lib/models/template.js +32 -0
- package/dist/libs/signstack/base/src/lib/models/template.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/user.d.ts +30 -0
- package/dist/libs/signstack/base/src/lib/models/user.js +3 -0
- package/dist/libs/signstack/base/src/lib/models/user.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/webhook.d.ts +223 -0
- package/dist/libs/signstack/base/src/lib/models/webhook.js +62 -0
- package/dist/libs/signstack/base/src/lib/models/webhook.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/workflow.d.ts +917 -0
- package/dist/libs/signstack/base/src/lib/models/workflow.js +152 -0
- package/dist/libs/signstack/base/src/lib/models/workflow.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/util.d.ts +92 -0
- package/dist/libs/signstack/base/src/lib/util.js +406 -0
- package/dist/libs/signstack/base/src/lib/util.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/dependency-graph.d.ts +94 -0
- package/dist/libs/signstack/base/src/lib/validation/dependency-graph.js +446 -0
- package/dist/libs/signstack/base/src/lib/validation/dependency-graph.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/graph.types.d.ts +57 -0
- package/dist/libs/signstack/base/src/lib/validation/graph.types.js +8 -0
- package/dist/libs/signstack/base/src/lib/validation/graph.types.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/index.d.ts +9 -0
- package/dist/libs/signstack/base/src/lib/validation/index.js +23 -0
- package/dist/libs/signstack/base/src/lib/validation/index.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/resource-schemas.d.ts +3 -0
- package/dist/libs/signstack/base/src/lib/validation/resource-schemas.js +27 -0
- package/dist/libs/signstack/base/src/lib/validation/resource-schemas.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/schema-validation.types.d.ts +57 -0
- package/dist/libs/signstack/base/src/lib/validation/schema-validation.types.js +57 -0
- package/dist/libs/signstack/base/src/lib/validation/schema-validation.types.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/schema-validator.d.ts +38 -0
- package/dist/libs/signstack/base/src/lib/validation/schema-validator.js +146 -0
- package/dist/libs/signstack/base/src/lib/validation/schema-validator.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-dependencies.d.ts +22 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-dependencies.js +69 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-dependencies.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-resource-tree.d.ts +37 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-resource-tree.js +250 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-resource-tree.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-template-inputs.d.ts +24 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-template-inputs.js +98 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-template-inputs.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/yaml-document-utils.d.ts +12 -0
- package/dist/libs/signstack/base/src/lib/validation/yaml-document-utils.js +50 -0
- package/dist/libs/signstack/base/src/lib/validation/yaml-document-utils.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/yaml-spec-converter.d.ts +101 -0
- package/dist/libs/signstack/base/src/lib/yaml-spec-converter.js +998 -0
- package/dist/libs/signstack/base/src/lib/yaml-spec-converter.js.map +1 -0
- package/oclif.manifest.json +822 -0
- package/package.json +101 -0
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://signstack.ai/schemas/blueprint/v1beta2",
|
|
4
|
+
"title": "SignStack Blueprint",
|
|
5
|
+
"description": "A Blueprint defines a multi-document signing workflow with orchestration. It specifies: (1) inputs - data schemas provided at runtime, (2) participants - people who will sign, (3) envelopes - groups of documents sent together, (4) orchestration - the order and conditions for signing. Blueprints are reusable workflow templates that produce Workflows when executed with concrete data.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["apiVersion", "kind", "metadata", "spec"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"apiVersion": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"const": "signstack/v1beta2",
|
|
13
|
+
"description": "API version for the blueprint schema"
|
|
14
|
+
},
|
|
15
|
+
"kind": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"const": "Blueprint",
|
|
18
|
+
"description": "Resource type identifier"
|
|
19
|
+
},
|
|
20
|
+
"metadata": {
|
|
21
|
+
"type": "object",
|
|
22
|
+
"required": ["key", "version", "name"],
|
|
23
|
+
"additionalProperties": false,
|
|
24
|
+
"properties": {
|
|
25
|
+
"key": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
|
|
28
|
+
"description": "Unique identifier for the blueprint. Must be snake_case: starts with a letter, contains only lowercase letters, numbers, and single underscores. Cannot end with underscore or have consecutive underscores.",
|
|
29
|
+
"examples": [
|
|
30
|
+
"employee_onboarding",
|
|
31
|
+
"simple_nda",
|
|
32
|
+
"multi_party_contract"
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
"version": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"pattern": "^(draft|(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*))$",
|
|
38
|
+
"description": "Semantic version (e.g., 1.0.0)",
|
|
39
|
+
"examples": ["1.0.0", "2.1.0", "1.0.1"]
|
|
40
|
+
},
|
|
41
|
+
"name": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"minLength": 1,
|
|
44
|
+
"maxLength": 200,
|
|
45
|
+
"description": "Human-readable name for the blueprint"
|
|
46
|
+
},
|
|
47
|
+
"description": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"minLength": 1,
|
|
50
|
+
"maxLength": 1000,
|
|
51
|
+
"description": "Description of the blueprint"
|
|
52
|
+
},
|
|
53
|
+
"labels": {
|
|
54
|
+
"type": "object",
|
|
55
|
+
"propertyNames": {
|
|
56
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$"
|
|
57
|
+
},
|
|
58
|
+
"additionalProperties": { "type": "string" },
|
|
59
|
+
"description": "Key-value labels for categorization and filtering. Keys must be in snake_case format."
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"spec": {
|
|
64
|
+
"type": "object",
|
|
65
|
+
"required": ["envelopes"],
|
|
66
|
+
"additionalProperties": false,
|
|
67
|
+
"properties": {
|
|
68
|
+
"inputs": {
|
|
69
|
+
"type": "array",
|
|
70
|
+
"description": "Data inputs required when creating a workflow from this blueprint. Each input references a Schema (key@version) that defines its structure. Input keys are used in JSONata expressions throughout the blueprint via $.inputKey syntax. Blueprint inputs auto-map to template inputs by matching keys - if blueprint has 'employee' and template expects 'employee', no inputMap needed.",
|
|
71
|
+
"items": {
|
|
72
|
+
"type": "object",
|
|
73
|
+
"required": ["key", "schema"],
|
|
74
|
+
"additionalProperties": false,
|
|
75
|
+
"properties": {
|
|
76
|
+
"key": {
|
|
77
|
+
"type": "string",
|
|
78
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
|
|
79
|
+
"description": "Unique identifier for the input"
|
|
80
|
+
},
|
|
81
|
+
"name": {
|
|
82
|
+
"type": "string",
|
|
83
|
+
"description": "Human-readable name"
|
|
84
|
+
},
|
|
85
|
+
"schema": {
|
|
86
|
+
"type": "string",
|
|
87
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*@(draft|(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*))$",
|
|
88
|
+
"description": "Reference to schema (key@version)"
|
|
89
|
+
},
|
|
90
|
+
"required": {
|
|
91
|
+
"oneOf": [
|
|
92
|
+
{ "type": "boolean" },
|
|
93
|
+
{
|
|
94
|
+
"type": "object",
|
|
95
|
+
"description": "Expression-based value",
|
|
96
|
+
"required": ["expression"],
|
|
97
|
+
"properties": {
|
|
98
|
+
"expression": {
|
|
99
|
+
"type": "string",
|
|
100
|
+
"minLength": 1,
|
|
101
|
+
"description": "JSONata expression (must be non-empty)"
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"additionalProperties": false
|
|
105
|
+
}
|
|
106
|
+
],
|
|
107
|
+
"default": true,
|
|
108
|
+
"description": "Whether this input is required (boolean or expression object). Defaults to true."
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
"participants": {
|
|
114
|
+
"type": "array",
|
|
115
|
+
"description": "People who will perform actions (sign, review, etc.) in this workflow. Each participant has a key referenced by orchestration steps. Name and email can be literal strings or JSONata expressions that pull from inputs (e.g., expression: '$.employee.email'). Define participants statically - for conditional participants, use step conditions rather than dynamic participant lists. Typical workflows have 2-5 participants.",
|
|
116
|
+
"items": {
|
|
117
|
+
"type": "object",
|
|
118
|
+
"required": ["key", "name", "email"],
|
|
119
|
+
"additionalProperties": false,
|
|
120
|
+
"properties": {
|
|
121
|
+
"key": {
|
|
122
|
+
"type": "string",
|
|
123
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
|
|
124
|
+
"description": "Unique identifier for the participant"
|
|
125
|
+
},
|
|
126
|
+
"name": {
|
|
127
|
+
"oneOf": [
|
|
128
|
+
{ "type": "string" },
|
|
129
|
+
{
|
|
130
|
+
"type": "object",
|
|
131
|
+
"required": ["expression"],
|
|
132
|
+
"additionalProperties": false,
|
|
133
|
+
"properties": {
|
|
134
|
+
"expression": {
|
|
135
|
+
"type": "string",
|
|
136
|
+
"description": "JSONata expression"
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
],
|
|
141
|
+
"description": "Display name (literal or JSONata expression)"
|
|
142
|
+
},
|
|
143
|
+
"email": {
|
|
144
|
+
"oneOf": [
|
|
145
|
+
{ "type": "string", "format": "email" },
|
|
146
|
+
{
|
|
147
|
+
"type": "object",
|
|
148
|
+
"required": ["expression"],
|
|
149
|
+
"additionalProperties": false,
|
|
150
|
+
"properties": {
|
|
151
|
+
"expression": {
|
|
152
|
+
"type": "string",
|
|
153
|
+
"description": "JSONata expression"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
],
|
|
158
|
+
"description": "Email address (literal or JSONata expression)"
|
|
159
|
+
},
|
|
160
|
+
"roleCategory": {
|
|
161
|
+
"type": "string",
|
|
162
|
+
"description": "Category of the participant (e.g. signer, viewer, approver). Free-form string."
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
"functions": {
|
|
168
|
+
"description": "JsonataFunction references. Two shapes are accepted: (1) an object map where keys are aliases used in $<alias>() calls within JSONata expressions and values are versioned references (key@version) — this decouples call-site names from resource keys and pins exact versions; (2) an array of 'key@version' strings — alias defaults to functionKey.",
|
|
169
|
+
"oneOf": [
|
|
170
|
+
{
|
|
171
|
+
"type": "object",
|
|
172
|
+
"propertyNames": {
|
|
173
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$"
|
|
174
|
+
},
|
|
175
|
+
"additionalProperties": {
|
|
176
|
+
"type": "string",
|
|
177
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*@(draft|(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*))$"
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"type": "array",
|
|
182
|
+
"items": {
|
|
183
|
+
"type": "string",
|
|
184
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*@(draft|(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*))$"
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
]
|
|
188
|
+
},
|
|
189
|
+
"envelopes": {
|
|
190
|
+
"type": "array",
|
|
191
|
+
"minItems": 1,
|
|
192
|
+
"description": "Envelopes group documents that are sent together in a single signing session. Use multiple envelopes when different document sets need different signing flows. Example: 'offer_envelope' (offer letter + job description) vs 'compliance_envelope' (NDA + IP agreement). Each envelope can have conditions and contains one or more documents referencing templates.",
|
|
193
|
+
"items": {
|
|
194
|
+
"type": "object",
|
|
195
|
+
"required": ["key", "documents"],
|
|
196
|
+
"additionalProperties": false,
|
|
197
|
+
"properties": {
|
|
198
|
+
"key": {
|
|
199
|
+
"type": "string",
|
|
200
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
|
|
201
|
+
"description": "Unique identifier for the envelope"
|
|
202
|
+
},
|
|
203
|
+
"name": {
|
|
204
|
+
"type": "string",
|
|
205
|
+
"description": "Human-readable name"
|
|
206
|
+
},
|
|
207
|
+
"subject": {
|
|
208
|
+
"type": "string",
|
|
209
|
+
"minLength": 1,
|
|
210
|
+
"maxLength": 100,
|
|
211
|
+
"description": "Email subject line used when sending this envelope for signing. Also used as the envelope display name in signing certificates and PDF filenames. Defaults to the envelope key if not specified."
|
|
212
|
+
},
|
|
213
|
+
"documents": {
|
|
214
|
+
"type": "array",
|
|
215
|
+
"minItems": 1,
|
|
216
|
+
"description": "Documents within this envelope",
|
|
217
|
+
"items": {
|
|
218
|
+
"type": "object",
|
|
219
|
+
"required": ["key"],
|
|
220
|
+
"additionalProperties": false,
|
|
221
|
+
"properties": {
|
|
222
|
+
"key": {
|
|
223
|
+
"type": "string",
|
|
224
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
|
|
225
|
+
"description": "Unique identifier for the document within the envelope"
|
|
226
|
+
},
|
|
227
|
+
"name": {
|
|
228
|
+
"type": "string",
|
|
229
|
+
"description": "Human-readable name"
|
|
230
|
+
},
|
|
231
|
+
"template": {
|
|
232
|
+
"type": "string",
|
|
233
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*@(draft|(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*))$",
|
|
234
|
+
"description": "Reference to template (key@version)"
|
|
235
|
+
},
|
|
236
|
+
"inputMap": {
|
|
237
|
+
"type": "object",
|
|
238
|
+
"additionalProperties": { "type": "string" },
|
|
239
|
+
"description": "Maps template input keys to JSONata expressions. Optional: blueprint inputs are auto-mapped to template inputs by matching keys. Use inputMap to override auto-mapping or provide values for template inputs that don't match any blueprint input key. Unmapped template inputs resolve to undefined."
|
|
240
|
+
},
|
|
241
|
+
"includeIf": {
|
|
242
|
+
"type": "string",
|
|
243
|
+
"description": "JSONata expression - include document if true. When iterator is present, the current array item is available as __iterator__."
|
|
244
|
+
},
|
|
245
|
+
"iterator": {
|
|
246
|
+
"type": "string",
|
|
247
|
+
"description": "JSONata path to an array (e.g. '$.position.supplements'). When specified, one document instance is created per array item. Expressions in includeIf and fileId can reference the current item via __iterator__."
|
|
248
|
+
},
|
|
249
|
+
"fileId": {
|
|
250
|
+
"oneOf": [
|
|
251
|
+
{ "type": "string", "pattern": "^f_[0-9a-z]{26}$" },
|
|
252
|
+
{
|
|
253
|
+
"type": "object",
|
|
254
|
+
"required": ["expression"],
|
|
255
|
+
"additionalProperties": false,
|
|
256
|
+
"properties": {
|
|
257
|
+
"expression": { "type": "string" }
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
],
|
|
261
|
+
"description": "Override the template's backing file. Can be a literal file ID string or an expression { expression: '...' } evaluated at resolution time. When iterator is present, the current array item is available as __iterator__."
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
"includeIf": {
|
|
267
|
+
"type": "string",
|
|
268
|
+
"description": "JSONata expression - include envelope if true"
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
"orchestration": {
|
|
274
|
+
"$ref": "#/$defs/step",
|
|
275
|
+
"description": "Root step of the orchestration tree. Can be a group (contains child steps) or participant (signing task)."
|
|
276
|
+
},
|
|
277
|
+
"customFields": {
|
|
278
|
+
"type": "array",
|
|
279
|
+
"description": "Custom fields for storing additional metadata or computed values. Values can be literals or JSONata expressions.",
|
|
280
|
+
"items": {
|
|
281
|
+
"type": "object",
|
|
282
|
+
"required": ["key", "name"],
|
|
283
|
+
"additionalProperties": false,
|
|
284
|
+
"properties": {
|
|
285
|
+
"key": {
|
|
286
|
+
"type": "string",
|
|
287
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
|
|
288
|
+
"description": "Unique identifier for the custom field"
|
|
289
|
+
},
|
|
290
|
+
"name": {
|
|
291
|
+
"type": "string",
|
|
292
|
+
"minLength": 1,
|
|
293
|
+
"description": "Human-readable name"
|
|
294
|
+
},
|
|
295
|
+
"value": {
|
|
296
|
+
"anyOf": [
|
|
297
|
+
{
|
|
298
|
+
"type": ["string", "number", "boolean"],
|
|
299
|
+
"minLength": 1,
|
|
300
|
+
"description": "Literal value (must be non-empty for strings)"
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
"type": "string",
|
|
304
|
+
"format": "date-time",
|
|
305
|
+
"minLength": 1,
|
|
306
|
+
"description": "Date value (ISO string)"
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"type": "object",
|
|
310
|
+
"description": "Expression-based value",
|
|
311
|
+
"required": ["expression"],
|
|
312
|
+
"properties": {
|
|
313
|
+
"expression": {
|
|
314
|
+
"type": "string",
|
|
315
|
+
"minLength": 1,
|
|
316
|
+
"description": "JSONata expression (must be non-empty)"
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
"additionalProperties": false
|
|
320
|
+
}
|
|
321
|
+
],
|
|
322
|
+
"description": "Value of the custom field: non-empty literal (string, number, boolean) or object with a non-empty expression"
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
"$defs": {
|
|
331
|
+
"step": {
|
|
332
|
+
"type": "object",
|
|
333
|
+
"required": ["key", "type"],
|
|
334
|
+
"additionalProperties": false,
|
|
335
|
+
"description": "A step in the orchestration tree. Two types: (1) 'group' - contains child steps with mode (sequential/parallel) and completionRule (all/any/quorum), (2) 'participant' - assigns a person to sign documents via an action. Steps can be nested: groups contain children which can be groups or participants. The root orchestration can be either type.",
|
|
336
|
+
"properties": {
|
|
337
|
+
"key": {
|
|
338
|
+
"type": "string",
|
|
339
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
|
|
340
|
+
"description": "Unique identifier for this step"
|
|
341
|
+
},
|
|
342
|
+
"type": {
|
|
343
|
+
"type": "string",
|
|
344
|
+
"enum": ["group", "participant"],
|
|
345
|
+
"description": "Step type: 'group' contains child steps with an execution mode, 'participant' defines a signing task"
|
|
346
|
+
},
|
|
347
|
+
"name": {
|
|
348
|
+
"type": "string",
|
|
349
|
+
"description": "Human-readable name"
|
|
350
|
+
},
|
|
351
|
+
"includeIf": {
|
|
352
|
+
"type": "string",
|
|
353
|
+
"description": "JSONata expression - include step if true"
|
|
354
|
+
},
|
|
355
|
+
"execution": {
|
|
356
|
+
"type": "string",
|
|
357
|
+
"enum": ["sequential", "parallel"],
|
|
358
|
+
"default": "sequential",
|
|
359
|
+
"description": "When children START (group only). 'sequential': children execute one at a time in order. 'parallel': all children can execute concurrently. Execution is independent of completion. Example: execution=parallel + completion=all means everyone signs at once but we wait for all."
|
|
360
|
+
},
|
|
361
|
+
"completion": {
|
|
362
|
+
"type": "string",
|
|
363
|
+
"enum": ["all", "any", "quorum"],
|
|
364
|
+
"default": "all",
|
|
365
|
+
"description": "When the group is COMPLETE (group only). 'all': wait for every child (default). 'any': complete when first child finishes (race). 'quorum': complete when quorum children finish. Common patterns: parallel+all (everyone signs concurrently), parallel+quorum (2 of 3 board members), sequential+all (sign in order)."
|
|
366
|
+
},
|
|
367
|
+
"quorum": {
|
|
368
|
+
"type": "integer",
|
|
369
|
+
"minimum": 1,
|
|
370
|
+
"description": "Number of children required to complete when completion='quorum'. Example: 3 board members with quorum=2 means any 2 signatures are sufficient. Must be less than or equal to number of children."
|
|
371
|
+
},
|
|
372
|
+
"children": {
|
|
373
|
+
"type": "array",
|
|
374
|
+
"minItems": 1,
|
|
375
|
+
"description": "Child steps (group only)",
|
|
376
|
+
"items": {
|
|
377
|
+
"$ref": "#/$defs/step"
|
|
378
|
+
}
|
|
379
|
+
},
|
|
380
|
+
"participant": {
|
|
381
|
+
"type": "string",
|
|
382
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
|
|
383
|
+
"description": "Participant key (participant only, must reference a key from participants array)"
|
|
384
|
+
},
|
|
385
|
+
"onComplete": {
|
|
386
|
+
"type": "object",
|
|
387
|
+
"additionalProperties": false,
|
|
388
|
+
"description": "Actions triggered when this step completes. Can validate the step result and apply data updates to entities.",
|
|
389
|
+
"properties": {
|
|
390
|
+
"validate": {
|
|
391
|
+
"type": "string",
|
|
392
|
+
"description": "JSONata expression that must evaluate to true for the step to be considered valid. Root context has three keys: $.inputs.<entityKey> (blueprint inputs at current value), $.docOutputs.<documentKey>.<roleKey> (role output payloads, participant steps only), $.childOutputs.<childStepKey>.<entityKey> (child entity snapshots, parent group steps only). Plus JSONata built-ins like $now(), $exists()."
|
|
393
|
+
},
|
|
394
|
+
"updates": {
|
|
395
|
+
"type": "array",
|
|
396
|
+
"description": "Data updates to apply when the step completes. Each update targets an entity; the transform's return value REPLACES the target entity's data wholesale (no automatic merge).",
|
|
397
|
+
"items": {
|
|
398
|
+
"type": "object",
|
|
399
|
+
"required": ["key", "transform"],
|
|
400
|
+
"additionalProperties": false,
|
|
401
|
+
"properties": {
|
|
402
|
+
"key": {
|
|
403
|
+
"type": "string",
|
|
404
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
|
|
405
|
+
"description": "Target entity key to update (must match an input key)"
|
|
406
|
+
},
|
|
407
|
+
"transform": {
|
|
408
|
+
"type": "string",
|
|
409
|
+
"description": "JSONata expression whose return value REPLACES the target entity wholesale (no automatic merge). Use $merge([$.inputs.<entityKey>, { ... }]) to preserve existing fields. Root context has three keys: $.inputs.<entityKey>, $.docOutputs.<documentKey>.<roleKey>, $.childOutputs.<childStepKey>.<entityKey>. Plus JSONata built-ins like $now()."
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
},
|
|
416
|
+
"action": {
|
|
417
|
+
"type": "object",
|
|
418
|
+
"required": ["type"],
|
|
419
|
+
"additionalProperties": false,
|
|
420
|
+
"description": "What this participant does. Currently supports type='sign'. Groups envelope reference and role assignments together for clarity.",
|
|
421
|
+
"properties": {
|
|
422
|
+
"type": {
|
|
423
|
+
"type": "string",
|
|
424
|
+
"enum": ["sign"],
|
|
425
|
+
"description": "Action type. 'sign' = participant signs documents in the envelope. Future types may include 'review', 'approve', 'fill'."
|
|
426
|
+
},
|
|
427
|
+
"envelope": {
|
|
428
|
+
"type": "string",
|
|
429
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
|
|
430
|
+
"description": "Which envelope this participant acts on. Must match a key from spec.envelopes array."
|
|
431
|
+
},
|
|
432
|
+
"assignments": {
|
|
433
|
+
"type": "array",
|
|
434
|
+
"minItems": 1,
|
|
435
|
+
"description": "Maps this participant to template roles for each document. Each assignment says 'for document X, this participant fills the Y role'. The role must exist in that document's template. One participant can have different roles on different documents.",
|
|
436
|
+
"items": {
|
|
437
|
+
"type": "object",
|
|
438
|
+
"required": ["document", "role"],
|
|
439
|
+
"additionalProperties": false,
|
|
440
|
+
"properties": {
|
|
441
|
+
"document": {
|
|
442
|
+
"type": "string",
|
|
443
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
|
|
444
|
+
"description": "Document key (must match a key from this step's envelope)"
|
|
445
|
+
},
|
|
446
|
+
"role": {
|
|
447
|
+
"type": "string",
|
|
448
|
+
"pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$",
|
|
449
|
+
"description": "Role key from the template"
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
},
|
|
455
|
+
"allOf": [
|
|
456
|
+
{
|
|
457
|
+
"if": { "properties": { "type": { "const": "sign" } } },
|
|
458
|
+
"then": { "required": ["envelope", "assignments"] }
|
|
459
|
+
}
|
|
460
|
+
]
|
|
461
|
+
}
|
|
462
|
+
},
|
|
463
|
+
"allOf": [
|
|
464
|
+
{
|
|
465
|
+
"if": { "properties": { "type": { "const": "group" } } },
|
|
466
|
+
"then": { "required": ["execution", "children"] }
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
"if": { "properties": { "type": { "const": "participant" } } },
|
|
470
|
+
"then": { "required": ["participant", "action"] }
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
"if": {
|
|
474
|
+
"properties": {
|
|
475
|
+
"type": { "const": "group" },
|
|
476
|
+
"completion": { "const": "quorum" }
|
|
477
|
+
},
|
|
478
|
+
"required": ["completion"]
|
|
479
|
+
},
|
|
480
|
+
"then": { "required": ["quorum"] }
|
|
481
|
+
}
|
|
482
|
+
]
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|