diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index 2555174..b1825e4 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -27,6 +27,7 @@ workspaceItem | sharedAttachmentDecl | conformanceDecl | constructorBindingDecl + | typeAliasDecl ; resourceImportDecl @@ -46,6 +47,7 @@ resourcePreamble : resourceImportDecl | externalAtomDecl | externalInterfaceDecl + | typeAliasDecl ; atomDecl @@ -53,10 +55,39 @@ atomDecl ; interfaceResourceDecl - : resourcePreamble* INTERFACE identifier ID stringLiteral REVISION stringLiteral + : resourcePreamble* INTERFACE identifier typeParameters? ID stringLiteral REVISION stringLiteral + (REQUIRES interfaceType (COMMA interfaceType)*)? LBRACE interfaceMember* RBRACE ; +typeParameters + : LT typeParameter (COMMA typeParameter)* GT + ; + +typeParameter + : VALUE identifier (COLON STORABLE)? + | OBJECT identifier (IMPLEMENTS interfaceType (AMP interfaceType)*)? + ; + +interfaceType + : identifier typeArguments? + ; + +typeArguments + : LT typeArgument (COMMA typeArgument)* GT + ; + +typeArgument + : ATOM identifier + | INTERFACE interfaceType + | OBJECT identifier + | valueType + ; + +typeAliasDecl + : TYPE identifier typeParameters? EQUAL valueType SEMI + ; + interfaceMember : valueMember | relationshipMember @@ -93,7 +124,8 @@ relationshipOperation targetConstraint : ATOM identifier - | INTERFACE identifier + | INTERFACE identifier typeArguments? + | OBJECT identifier ; packageResourceDecl @@ -109,12 +141,12 @@ packageExport ; packageOperationExport - : OPERATION identifier ID stringLiteral COLON valueType ARROW valueType + : OPERATION identifier typeParameters? ID stringLiteral COLON valueType ARROW valueType MODE operationMode eventClause? RECEIVER receiverRequirement dependencyBlock? SEMI ; packageFunctionExport - : FUNCTION identifier ID stringLiteral COLON valueType ARROW valueType + : FUNCTION identifier typeParameters? ID stringLiteral COLON valueType ARROW valueType dependencyBlock? SEMI ; @@ -138,7 +170,8 @@ operationMode receiverRequirement : ANY | ATOM identifier - | INTERFACES LBRACK identifierList? RBRACK + | OBJECT identifier + | INTERFACES LBRACK (interfaceType (COMMA interfaceType)*)? RBRACK ; identifierList @@ -152,7 +185,7 @@ dependencyBlock dependencyPort : STATE identifier ID stringLiteral COLON valueType primitiveList SEMI | EDGE identifier ID stringLiteral COLON cardinality targetConstraint primitiveList SEMI - | INTERFACE identifier ID stringLiteral COLON identifier SEMI + | INTERFACE identifier ID stringLiteral COLON identifier typeArguments? SEMI | CONSTRUCTOR identifier ID stringLiteral COLON identifier (INPUT valueType)? SEMI ; @@ -199,7 +232,7 @@ edgeEndpoint ; conformanceDecl - : CONFORM identifier AS identifier (ID stringLiteral)? (SEMANTIC_MAJOR INTEGER)? + : CONFORM identifier AS identifier typeArguments? (ID stringLiteral)? (SEMANTIC_MAJOR INTEGER)? LBRACE conformanceItem* RBRACE ; @@ -238,7 +271,7 @@ operationName operationProvider : STATE identifier DOT statePrimitive | EDGE identifier DOT identifier DOT edgePrimitive - | PACKAGE identifier DOT identifier dependencyBindingBlock? + | PACKAGE identifier DOT identifier typeArguments? dependencyBindingBlock? ; statePrimitive @@ -263,7 +296,7 @@ dependencyBindingBlock dependencyBinding : identifier TO STATE identifier (VIA EDGE identifier DOT identifier)? SEMI | identifier TO EDGE identifier DOT identifier (VIA EDGE identifier DOT identifier)? SEMI - | identifier TO INTERFACE identifier (VIA EDGE identifier DOT identifier)? SEMI + | identifier TO INTERFACE identifier typeArguments? (VIA EDGE identifier DOT identifier)? SEMI | identifier TO CONSTRUCTOR identifier SEMI ; @@ -277,10 +310,12 @@ valueType | WATCH_HANDLE | MESSAGE stringLiteral | ATOM_REF LT identifier GT - | INTERFACE_REF LT identifier GT + | INTERFACE_REF LT identifier typeArguments? GT + | REF LT identifier GT | OPTIONAL LT valueType GT | LIST LT valueType GT | RECORD LBRACE recordField* RBRACE + | identifier typeArguments? ; recordField @@ -338,6 +373,11 @@ stringLiteral ; WORKSPACE: 'workspace'; +TYPE: 'type'; +OBJECT: 'object'; +STORABLE: 'storable'; +IMPLEMENTS: 'implements'; +REF: 'ref'; FRAGMENT: 'fragment'; IMPORT: 'import'; EXTERNAL: 'external'; @@ -441,6 +481,8 @@ LPAREN: '('; RPAREN: ')'; LT: '<'; GT: '>'; +AMP: '&'; +EQUAL: '='; INTEGER: '-'? [0-9]+; JSON_NUMBER: '-'? ('0' | [1-9] [0-9]*) ('.' [0-9]+)? ([eE] [+-]? [0-9]+)?; diff --git a/nix/checked-candidate.nix b/nix/checked-candidate.nix index d2eebd0..fabe5b9 100644 --- a/nix/checked-candidate.nix +++ b/nix/checked-candidate.nix @@ -70,7 +70,7 @@ let ${protocol}/bin/quixos-workspace-compile --root ${node.directory} \ --source-root-commit ${pkgs.lib.escapeShellArg node.commit} \ --checkout-root "$TMPDIR/checkouts" --snapshot-map ${snapshots} \ - --graph-out "$out/graph.json" > "$out/candidate.json" + --graph-out "$out/graph.json" --schemas-out "$out/package-schemas.json" > "$out/candidate.json" '' else '' @@ -95,7 +95,15 @@ let package.quixosPackages.${system}.checkedServer or (throw "Package ${node.repository} lacks checkedServer; use the supported package scaffold."); artifact = checked { - schema = "${compiled}/bindings.json"; + schema = + if kind == "workspace" then + pkgs.writeText "package-specialization-schema.json" ( + builtins.toJSON + (builtins.fromJSON (builtins.readFile "${contract}/package-schemas.json")) + .${candidate.revision.revisionId} + ) + else + "${compiled}/bindings.json"; generator = protocol; packageRevisionId = candidate.revision.revisionId; }; diff --git a/src/bindings/client.ts b/src/bindings/client.ts index af56ad3..cac5353 100644 --- a/src/bindings/client.ts +++ b/src/bindings/client.ts @@ -2,7 +2,13 @@ import type { InterfaceRevision, ValueType } from "../capability-model/types.js" /** Host clients have no package receiver, but must use the same checked * interface signatures and argument framing as generated package ports. */ -export const generateClientContracts = (interfaces: InterfaceRevision[], messages: Record) => { +export const generateClientContracts = ( + interfaces: InterfaceRevision[], + messages: Record, + qualified = false, +) => { + if (interfaces.some((entry) => entry.template)) + throw new Error("Host contracts require closed interface applications, not generic definitions"); const type = (value: ValueType): string => { switch (value.kind) { case "builtin": @@ -19,7 +25,9 @@ export const generateClientContracts = (interfaces: InterfaceRevision[], message uint64: "bigint", }[value.name]; case "object-ref": - return `{readonly $quixosRef: string}`; + return qualified + ? `CapabilityReference<${JSON.stringify(value.expectation.kind === "atom" ? `atom:${value.expectation.atomId}` : `interface:${value.expectation.interfaceRevisionId}`)}>` + : `{readonly $quixosRef: string}`; case "optional": return `(${type(value.value)} | null)`; case "list": @@ -42,6 +50,30 @@ export const generateClientContracts = (interfaces: InterfaceRevision[], message .map((operation) => ({ ...operation, interfaceRevisionId: iface.revisionId })), ), ); + if (qualified) { + const contracts = interfaces.map((iface) => { + const members = iface.members.flatMap((member) => + member.operations + .filter((op) => op.mode === "call") + .map((op) => ` ${JSON.stringify(op.id)}: {input: ${type(op.inputType)}; output: ${type(op.outputType)}};`), + ); + return `${JSON.stringify(iface.revisionId)}: {\n${members.join("\n")}\n}`; + }); + if (new Set(interfaces.map((iface) => iface.revisionId)).size !== interfaces.length) + throw new Error("Duplicate closed interface identity"); + return ( + `// Generated closed capability contracts. Dispatch by interface AND operation.\n` + + `declare const referenceType: unique symbol;\nexport type CapabilityReference = {readonly $quixosRef: string; readonly [referenceType]: T};\n` + + `export type CapabilityContracts = {${contracts.join(";\n")}};\n` + + `export type CapabilityInput = CapabilityContracts[I][O] extends {input: infer T} ? T : never;\n` + + `export type CapabilityOutput = CapabilityContracts[I][O] extends {output: infer T} ? T : never;\n` + + `export const capabilityApplications = ${JSON.stringify(Object.fromEntries(interfaces.map((iface) => [iface.revisionId, { definitionId: iface.application?.definitionId ?? iface.revisionId, arguments: iface.application?.arguments ?? [], ...(iface.application?.self ? { self: iface.application.self } : {}) }])))} as const;\n` + ); + } + if (new Set(operations.map((entry) => entry.id)).size !== operations.length) + throw new Error( + "Host operation IDs are ambiguous across interfaces; select a closed interface application explicitly", + ); return ( `// Generated from checked QX interfaces. Regenerate with scripts/generate-platform-contracts.mjs.\n` + `export type PlatformInputs = {\n${operations.map((operation) => ` ${JSON.stringify(operation.id)}: ${type(operation.inputType)};`).join("\n")}\n};\n` + @@ -65,3 +97,9 @@ export const generateClientContracts = (interfaces: InterfaceRevision[], message )} as const;\n` ); }; + +/** New consumers use exact closed interface identities; operation IDs alone are not unique. */ +export const generateAppliedClientContracts = ( + interfaces: InterfaceRevision[], + messages: Record = {}, +) => generateClientContracts(interfaces, messages, true); diff --git a/src/bindings/generics.ts b/src/bindings/generics.ts new file mode 100644 index 0000000..a6c3011 --- /dev/null +++ b/src/bindings/generics.ts @@ -0,0 +1,160 @@ +import type { GenericPackageExport, GenericDependencyPort } from "../capability-model/generic-packages.js"; +import type { InterfaceRevision, ValueType } from "../capability-model/types.js"; +import type { + ValueTypeExpression, + ObjectTypeExpression, + TypeArgumentExpression, + TypeParameter, + ValueAliasDefinition, +} from "../capability-model/generics.js"; + +/** Universal source contracts. Only closed exports get executable codecs. */ +export const genericImplementationType = ( + definition: GenericPackageExport, + interfaces: InterfaceRevision[], + concrete: (type: ValueType) => string, +): string => { + const names = new Map(definition.parameters.map((parameter, index) => [parameter.id, `T${index}`])); + type Scope = { arguments: Map; aliases: ValueAliasDefinition[] }; + const rootScope = (): Scope => ({ arguments: new Map(), aliases: definition.aliases }); + const object = (entries: [string, string][]) => + `{${entries.map(([key, value]) => `${JSON.stringify(key)}:${value}`).join(";")}}`; + const target = (type: ObjectTypeExpression, scope: Scope): string => { + if (type.kind === "parameter") { + const bound = scope.arguments.get(type.parameterId); + if (bound) return bound; + const name = names.get(type.parameterId); + if (!name) throw new Error(`Unbound object parameter ${type.parameterId}`); + return name; + } + if (type.kind === "atom") return JSON.stringify(`atom:${type.atomId}`); + if (type.kind === "interface") return JSON.stringify(`interface:${type.interfaceRevisionId}`); + if (type.kind === "application") + return `QxApplied<${JSON.stringify(type.application.definitionId)}, [${type.application.arguments.map((arg) => argument(arg, scope)).join(",")}]>`; + throw new Error("Generic package Self must be expressed as an explicit object parameter"); + }; + const argument = (arg: TypeArgumentExpression, scope: Scope): string => + arg.kind === "value" ? value(arg.type, scope) : target(arg.target, scope); + const bind = (parameters: TypeParameter[], args: TypeArgumentExpression[], scope: Scope): Scope => { + if (parameters.length !== args.length) throw new Error("Wrong generic arity during code generation"); + const result = new Map(scope.arguments); + // Render arguments in their original lexical scope before introducing binders. + const rendered = args.map((arg) => argument(arg, scope)); + parameters.forEach((parameter, index) => result.set(parameter.id, rendered[index])); + return { ...scope, arguments: result }; + }; + const value = (type: ValueTypeExpression, scope: Scope, depth = 0): string => { + if (depth > 128) throw new Error("Generic type expansion exceeds depth limit"); + switch (type.kind) { + case "parameter": { + const bound = scope.arguments.get(type.parameterId); + if (bound) return bound; + const name = names.get(type.parameterId); + if (!name) throw new Error(`Unbound value parameter ${type.parameterId}`); + return name; + } + case "object-ref": + return `QxObjectRef<${target(type.expectation, scope)}>`; + case "record": + return object(Object.entries(type.fields).map(([name, field]) => [name, value(field, scope, depth + 1)])); + case "optional": + return `(${value(type.value, scope, depth + 1)} | null)`; + case "list": + return `Array<${value(type.value, scope, depth + 1)}>`; + case "alias": { + const alias = scope.aliases.find((entry) => entry.id === type.definitionId); + if (!alias) throw new Error(`Missing alias ${type.definitionId}`); + return value(alias.body, bind(alias.parameters, type.arguments, scope), depth + 1); + } + default: + return concrete(type); + } + }; + const params = (type: ValueTypeExpression, scope: Scope) => + type.kind === "builtin" && type.name === "unit" ? "" : `input:${value(type, scope)}`; + const port = (entry: GenericDependencyPort): string => { + const requirement = entry.requirement, + scope = rootScope(); + switch (requirement.kind) { + case "state": + return object([ + ...requirement.primitives.map((primitive): [string, string] => { + if (primitive === "read") return ["get", `()=>Promise<${value(requirement.valueType, scope)}>`]; + if (primitive === "write") return ["set", `(value:${value(requirement.valueType, scope)})=>Promise`]; + throw new Error(`Unsupported generic state primitive ${primitive}`); + }), + ...(requirement.primitives.includes("read") + ? [["live", "()=>Promise"] as [string, string]] + : []), + ]); + case "edge": { + const ref = `QxObjectRef<${target(requirement.target, scope)}>`; + const methods = requirement.primitives.map((primitive): [string, string] => { + if (primitive === "resolve") return ["resolve", `()=>Promise>`]; + if (primitive === "connect" || primitive === "disconnect") + return [primitive, `(target:${ref})=>Promise`]; + throw new Error(`Unsupported generic edge primitive ${primitive}`); + }); + if (requirement.primitives.includes("resolve")) + methods.push(["collection", `()=>Promise>`]); + if ( + ["resolve", "connect", "disconnect"].every((primitive) => + requirement.primitives.includes(primitive as "resolve"), + ) + ) + methods.push([ + "replace", + `(entries:RelationshipEntry<${ref}>[],expectedRevision:bigint)=>Promise>`, + ]); + return object(methods); + } + case "constructor": + return object([ + [ + "construct", + `(${params(requirement.inputType, scope)})=>Promise>`, + ], + ]); + case "interface": { + const contract = interfaces.find((entry) => entry.revisionId === requirement.application.definitionId); + if (!contract) throw new Error(`Missing generic port contract ${requirement.application.definitionId}`); + const local = { + ...bind(contract.template?.parameters ?? [], requirement.application.arguments, scope), + aliases: contract.template?.aliases ?? [], + }; + const operations = (contract.template?.members ?? contract.members).flatMap((member) => + member.operations + .filter((op) => op.mode === "call") + .map((op) => ({ ...op, name: `${member.displayName}.${op.displayName}` })), + ); + return object([ + ["objectId", `QxObjectRef<${target({ kind: "application", application: requirement.application }, scope)}>`], + ["live", object(operations.map((op) => [op.name, `(${params(op.inputType, local)})=>Promise`]))], + ...operations.map( + (op) => + [op.name, `(${params(op.inputType, local)})=>Promise<${value(op.outputType, local)}>`] as [ + string, + string, + ], + ), + ]); + } + } + }; + const declarations = definition.parameters + .map((parameter) => `${names.get(parameter.id)}${parameter.kind === "object" ? " extends string" : ""}`) + .join(","); + const receiver = definition.receiverRequirement; + const context = object([ + ["objectId", `QxObjectRef<${receiver.kind === "target" ? target(receiver.target, rootScope()) : "string"}>`], + ["input", value(definition.inputType, rootScope())], + ["ports", object(definition.dependencyPorts.map((entry) => [entry.displayName, port(entry)]))], + ]); + const contextWithLifecycle = `${context} & QxContextLifecycle<${context} & {signal?: AbortSignal}>`; + const result = value(definition.eventType ?? definition.outputType, rootScope()); + const handler = `<${declarations}>(context:${contextWithLifecycle})=>${result}|Promise<${result}>`; + const derived = `{kind:"derived";get:${handler}}`; + return definition.eventType + ? derived + : `(${handler})${definition.kind === "operation" && definition.mode === "call" ? ` | ${derived}` : ""}`; +}; diff --git a/src/bindings/index.ts b/src/bindings/index.ts index ec9f78d..27210b3 100644 --- a/src/bindings/index.ts +++ b/src/bindings/index.ts @@ -1,21 +1,74 @@ -import type { InterfaceRevision, PackageRevision, ValueType, DependencyPort } from "../capability-model/types.js"; +import type { + InterfaceRevision, + PackageRevision, + ValueType, + DependencyPort, + WorkspaceRevision, +} from "../capability-model/types.js"; import type { CompiledCapabilityResourceRepository } from "../capability-language/assembly.js"; +import { genericImplementationType } from "./generics.js"; /** Portable generator input. New backends consume this instead of the parser or TS runtime. */ export type BindingSchema = { format: "quixos-bindings"; version: 1; interfaces: InterfaceRevision[]; + interfaceTemplates?: InterfaceRevision[]; packages: PackageRevision[]; }; -export const bindingSchema = (compiled: CompiledCapabilityResourceRepository): BindingSchema => ({ +export const bindingSchema = (compiled: Pick): BindingSchema => ({ format: "quixos-bindings", version: 1, - interfaces: compiled.resources.flatMap((node) => - node.resource.kind === "interface" ? [node.resource.revision] : [], + interfaceTemplates: compiled.resources.flatMap((node) => + node.resource.kind === "interface" && node.resource.revision.template ? [node.resource.revision] : [], ), + interfaces: [ + ...new Map( + compiled.resources + .flatMap((node) => [ + ...(node.resource.kind === "interface" ? [node.resource.revision] : []), + ...(node.resource.specializations ?? []), + ]) + .filter((entry) => !entry.template) + .map((entry) => [entry.revisionId, entry]), + ).values(), + ], packages: compiled.resources.flatMap((node) => (node.resource.kind === "package" ? [node.resource.revision] : [])), }); + +export const specializeBindingSchema = ( + base: BindingSchema, + workspace: WorkspaceRevision, + revisionId: string, +): BindingSchema => { + const pkg = workspace.packageImports.find((entry) => entry.revisionId === revisionId); + if (!pkg) throw new Error(`Missing candidate package ${revisionId}`); + const needed = new Set(); + const visit = (value: unknown): void => { + if (!value || typeof value !== "object") return; + if ("interfaceRevisionId" in value && typeof value.interfaceRevisionId === "string") + needed.add(value.interfaceRevisionId); + Object.values(value).forEach(visit); + }; + visit(pkg.exports); + const interfaces = new Map(base.interfaces.map((entry) => [entry.revisionId, entry])); + for (const id of needed) { + const iface = workspace.interfaceImports.find((entry) => entry.revisionId === id); + if (iface) { + interfaces.set(id, iface); + visit(iface.members); + } + } + return { + ...base, + interfaces: [...interfaces.values()], + packages: base.packages.map((entry) => { + const candidate = workspace.packageImports.find((value) => value.revisionId === entry.revisionId); + if (!candidate) throw new Error(`Missing dependency package ${entry.revisionId}`); + return candidate; + }), + }; +}; export type TypeScriptBindingOptions = { runtimeModule?: string; /** Each export must implement MessageBinding, providing both TS type and wire codec. */ @@ -46,6 +99,8 @@ export const generateTypeScriptBindings = ( ) => { if (schema.format !== "quixos-bindings" || schema.version !== 1) throw new Error("Unsupported binding schema version"); + if (schema.interfaces.some((entry) => entry.template)) + throw new Error("Package bindings require closed interface applications, not generic definitions"); const pkg = schema.packages.find((entry) => entry.revisionId === packageRevisionId); if (!pkg) throw new Error(`Unknown package revision ${packageRevisionId}`); const messages = new Map(); @@ -174,6 +229,7 @@ export const generateTypeScriptBindings = ( const specs: Record = {}; const contexts: [string, string][] = []; const handlers: [string, string][] = []; + const results: [string, string][] = []; for (const entry of exports) { if (names.has(entry.displayName)) throw new Error(`Duplicate export name ${entry.displayName}`); names.add(entry.displayName); @@ -200,13 +256,15 @@ export const generateTypeScriptBindings = ( const event = entry.kind === "operation" ? entry.eventType : undefined; const contextType = `Contexts[${q(entry.displayName)}]`; const outputType = type(event ?? entry.outputType); + results.push([entry.displayName, outputType]); // Watch-start handlers produce events through the runtime's derived stream protocol. - handlers.push([ - entry.displayName, - event - ? `QxDerived<${contextType}, ${outputType}>` - : `QxHandler<${contextType}, ${outputType}>${entry.kind === "operation" && entry.mode === "call" ? ` | QxDerived<${contextType}, ${outputType}>` : ""}`, - ]); + if (!entry.application) + handlers.push([ + entry.displayName, + event + ? `QxDerived<${contextType}, ${outputType}>` + : `QxHandler<${contextType}, ${outputType}>${entry.kind === "operation" && entry.mode === "call" ? ` | QxDerived<${contextType}, ${outputType}>` : ""}`, + ]); specs[entry.displayName] = { inputType: entry.inputType, outputType: entry.outputType, @@ -214,13 +272,19 @@ export const generateTypeScriptBindings = ( ports: Object.fromEntries(ports.map((port) => [port.name, port.spec])), }; } + for (const definition of pkg.genericExports ?? []) { + handlers.push([ + definition.displayName, + genericImplementationType(definition, [...schema.interfaces, ...(schema.interfaceTemplates ?? [])], type), + ]); + } const imports = [...messages].map(([id, alias]) => { const binding = options.messages![id]!; if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(binding.export)) throw new Error(`Invalid message binding export ${binding.export}`); return `import { ${binding.export} as ${alias} } from ${q(binding.module)};`; }); - const signatures = `${object(contexts)} ${object(handlers)}`; + const signatures = `${object(contexts)} ${object(handlers)} ${object(results)}`; const typeImports = [ "BindingValue", "QxObjectRef", @@ -237,14 +301,15 @@ export const generateTypeScriptBindings = ( `import { ${exports.length ? "bindQxHandler, " : ""}${[...typeImports, "QxHandlerSpec", "QxMessages"].map((name) => `type ${name}`).join(", ")} } from ${q(options.runtimeModule ?? "@quixos/camino-package-runtime")};\n` + imports.join("\n") + `\nexport const packageRevisionId = ${q(pkg.revisionId)};\n` + - `export type Contexts = ${object(contexts)};\nexport type Implementation = ${object(handlers)};\n` + + `declare const appliedType: unique symbol;\ntype QxApplied = string & {readonly [appliedType]: (value: [Definition, Arguments]) => [Definition, Arguments]};\n` + + `export type Contexts = ${object(contexts)};\nexport type Results = ${object(results)};\nexport type Implementation = ${object(handlers)};\n` + `const messages = { ${[...messages].map(([id, alias]) => `${q(id)}: ${alias}`).join(", ")} } satisfies QxMessages;\n` + `const specs = ${JSON.stringify(specs, null, 2)} satisfies Record;\n` + `export const createRuntime = (implementation: Implementation) => ({\n packageRevisionId,\n exports: {\n` + exports .map( (entry) => - ` ${q(entry.id)}: bindQxHandler(specs[${q(entry.displayName)}], implementation[${q(entry.displayName)}], messages),`, + ` ${q(entry.id)}: bindQxHandler(specs[${q(entry.displayName)}], implementation[${q(entry.application ? pkg.genericExports!.find((definition) => definition.id === entry.application!.exportId)!.displayName : entry.displayName)}], messages),`, ) .join("\n") + `\n },\n});\n` diff --git a/src/capability-language/assembly.ts b/src/capability-language/assembly.ts index 8a8fd91..ca13370 100644 --- a/src/capability-language/assembly.ts +++ b/src/capability-language/assembly.ts @@ -162,7 +162,10 @@ const environmentFor = ( ), ), interfaceClosure: exactRevisions( - closure.flatMap((node) => (node.resource.kind === "interface" ? [node.resource.revision] : [])), + closure.flatMap((node) => [ + ...(node.resource.kind === "interface" ? [node.resource.revision] : []), + ...(node.resource.specializations ?? []), + ]), ), packageClosure: exactRevisions( closure.flatMap((node) => (node.resource.kind === "package" ? [node.resource.revision] : [])), diff --git a/src/capability-language/candidate-check.ts b/src/capability-language/candidate-check.ts index 6ccb5ed..6a67de9 100644 --- a/src/capability-language/candidate-check.ts +++ b/src/capability-language/candidate-check.ts @@ -12,7 +12,7 @@ import { type EvolutionReview, type WorkspaceRevision, } from "../capability-model/index.js"; -import { bindingSchema } from "../bindings/index.js"; +import { bindingSchema, specializeBindingSchema } from "../bindings/index.js"; import { snapshotCommit, checkoutCommit, buildCheckedPackage } from "./checked-build.js"; const execFile = promisify(execFileCallback); const bytesDigest = (value: Uint8Array) => `sha256:${createHash("sha256").update(value).digest("hex")}`; @@ -219,7 +219,12 @@ export const checkWorkspaceCandidate = async (options: { resolveResource, }); const schema = path.join(temporary, "bindings.json"); - await fs.writeFile(schema, JSON.stringify(bindingSchema(candidate))); + await fs.writeFile( + schema, + JSON.stringify( + specializeBindingSchema(bindingSchema(candidate), compiled.workspace, candidate.resource.revision.revisionId), + ), + ); const artifactPath = await buildCheckedPackage( resource.directory, schema, diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index b9a41e7..ce06dea 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -1,6 +1,11 @@ token literal names: null 'workspace' +'type' +'object' +'storable' +'implements' +'ref' 'fragment' 'import' 'external' @@ -103,6 +108,8 @@ null ')' '<' '>' +'&' +'=' null null null @@ -114,6 +121,11 @@ null token symbolic names: null WORKSPACE +TYPE +OBJECT +STORABLE +IMPLEMENTS +REF FRAGMENT IMPORT EXTERNAL @@ -216,6 +228,8 @@ LPAREN RPAREN LT GT +AMP +EQUAL INTEGER JSON_NUMBER IDENTIFIER @@ -236,6 +250,12 @@ externalInterfaceDecl resourcePreamble atomDecl interfaceResourceDecl +typeParameters +typeParameter +interfaceType +typeArguments +typeArgument +typeAliasDecl interfaceMember operationMember valueMember @@ -287,4 +307,4 @@ stringLiteral atn: -[4, 1, 110, 821, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 131, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 136, 8, 1, 10, 1, 12, 1, 139, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 157, 8, 3, 10, 3, 12, 3, 160, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 170, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 182, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 3, 8, 201, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 209, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 214, 8, 10, 10, 10, 12, 10, 217, 9, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 227, 8, 10, 10, 10, 12, 10, 230, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 3, 11, 237, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 262, 8, 13, 10, 13, 12, 13, 265, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 288, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 298, 8, 15, 1, 15, 1, 15, 5, 15, 302, 8, 15, 10, 15, 12, 15, 305, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 333, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 339, 8, 17, 1, 18, 5, 18, 342, 8, 18, 10, 18, 12, 18, 345, 9, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 355, 8, 18, 1, 18, 1, 18, 5, 18, 359, 8, 18, 10, 18, 12, 18, 362, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 3, 19, 369, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 382, 8, 20, 1, 20, 1, 20, 1, 20, 3, 20, 387, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 400, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 413, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 428, 8, 25, 1, 25, 3, 25, 431, 8, 25, 1, 26, 1, 26, 1, 26, 5, 26, 436, 8, 26, 10, 26, 12, 26, 439, 9, 26, 1, 27, 1, 27, 1, 27, 5, 27, 444, 8, 27, 10, 27, 12, 27, 447, 9, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 486, 8, 28, 1, 28, 1, 28, 3, 28, 490, 8, 28, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 496, 8, 29, 10, 29, 12, 29, 499, 9, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 3, 32, 510, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 524, 8, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 534, 8, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 552, 8, 36, 1, 36, 1, 36, 3, 36, 556, 8, 36, 1, 36, 3, 36, 559, 8, 36, 1, 36, 1, 36, 3, 36, 563, 8, 36, 1, 36, 3, 36, 566, 8, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 576, 8, 37, 1, 37, 1, 37, 3, 37, 580, 8, 37, 1, 37, 1, 37, 5, 37, 584, 8, 37, 10, 37, 12, 37, 587, 9, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 595, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 632, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 651, 8, 43, 3, 43, 653, 8, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 5, 46, 662, 8, 46, 10, 46, 12, 46, 665, 9, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 679, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 695, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 709, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 719, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 728, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 5, 49, 760, 8, 49, 10, 49, 12, 49, 763, 9, 49, 1, 49, 3, 49, 766, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 785, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 791, 8, 54, 10, 54, 12, 54, 794, 9, 54, 3, 54, 796, 8, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 808, 8, 56, 10, 56, 12, 56, 811, 9, 56, 3, 56, 813, 8, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 0, 0, 59, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 0, 7, 1, 0, 60, 64, 2, 0, 55, 59, 61, 62, 2, 0, 55, 56, 61, 62, 2, 0, 57, 59, 61, 62, 1, 0, 80, 87, 1, 0, 67, 70, 2, 0, 34, 34, 106, 106, 861, 0, 130, 1, 0, 0, 0, 2, 132, 1, 0, 0, 0, 4, 142, 1, 0, 0, 0, 6, 146, 1, 0, 0, 0, 8, 169, 1, 0, 0, 0, 10, 181, 1, 0, 0, 0, 12, 183, 1, 0, 0, 0, 14, 190, 1, 0, 0, 0, 16, 200, 1, 0, 0, 0, 18, 202, 1, 0, 0, 0, 20, 215, 1, 0, 0, 0, 22, 236, 1, 0, 0, 0, 24, 238, 1, 0, 0, 0, 26, 253, 1, 0, 0, 0, 28, 287, 1, 0, 0, 0, 30, 289, 1, 0, 0, 0, 32, 332, 1, 0, 0, 0, 34, 338, 1, 0, 0, 0, 36, 343, 1, 0, 0, 0, 38, 368, 1, 0, 0, 0, 40, 370, 1, 0, 0, 0, 42, 390, 1, 0, 0, 0, 44, 403, 1, 0, 0, 0, 46, 416, 1, 0, 0, 0, 48, 419, 1, 0, 0, 0, 50, 430, 1, 0, 0, 0, 52, 432, 1, 0, 0, 0, 54, 440, 1, 0, 0, 0, 56, 489, 1, 0, 0, 0, 58, 491, 1, 0, 0, 0, 60, 502, 1, 0, 0, 0, 62, 504, 1, 0, 0, 0, 64, 509, 1, 0, 0, 0, 66, 511, 1, 0, 0, 0, 68, 533, 1, 0, 0, 0, 70, 535, 1, 0, 0, 0, 72, 544, 1, 0, 0, 0, 74, 569, 1, 0, 0, 0, 76, 594, 1, 0, 0, 0, 78, 596, 1, 0, 0, 0, 80, 610, 1, 0, 0, 0, 82, 616, 1, 0, 0, 0, 84, 631, 1, 0, 0, 0, 86, 652, 1, 0, 0, 0, 88, 654, 1, 0, 0, 0, 90, 656, 1, 0, 0, 0, 92, 658, 1, 0, 0, 0, 94, 718, 1, 0, 0, 0, 96, 720, 1, 0, 0, 0, 98, 765, 1, 0, 0, 0, 100, 767, 1, 0, 0, 0, 102, 772, 1, 0, 0, 0, 104, 774, 1, 0, 0, 0, 106, 784, 1, 0, 0, 0, 108, 786, 1, 0, 0, 0, 110, 799, 1, 0, 0, 0, 112, 803, 1, 0, 0, 0, 114, 816, 1, 0, 0, 0, 116, 818, 1, 0, 0, 0, 118, 119, 3, 6, 3, 0, 119, 120, 5, 0, 0, 1, 120, 131, 1, 0, 0, 0, 121, 122, 3, 20, 10, 0, 122, 123, 5, 0, 0, 1, 123, 131, 1, 0, 0, 0, 124, 125, 3, 36, 18, 0, 125, 126, 5, 0, 0, 1, 126, 131, 1, 0, 0, 0, 127, 128, 3, 2, 1, 0, 128, 129, 5, 0, 0, 1, 129, 131, 1, 0, 0, 0, 130, 118, 1, 0, 0, 0, 130, 121, 1, 0, 0, 0, 130, 124, 1, 0, 0, 0, 130, 127, 1, 0, 0, 0, 131, 1, 1, 0, 0, 0, 132, 133, 5, 2, 0, 0, 133, 137, 5, 96, 0, 0, 134, 136, 3, 8, 4, 0, 135, 134, 1, 0, 0, 0, 136, 139, 1, 0, 0, 0, 137, 135, 1, 0, 0, 0, 137, 138, 1, 0, 0, 0, 138, 140, 1, 0, 0, 0, 139, 137, 1, 0, 0, 0, 140, 141, 5, 97, 0, 0, 141, 3, 1, 0, 0, 0, 142, 143, 5, 3, 0, 0, 143, 144, 3, 116, 58, 0, 144, 145, 5, 93, 0, 0, 145, 5, 1, 0, 0, 0, 146, 147, 5, 1, 0, 0, 147, 148, 3, 114, 57, 0, 148, 149, 5, 43, 0, 0, 149, 150, 3, 116, 58, 0, 150, 151, 5, 37, 0, 0, 151, 152, 3, 116, 58, 0, 152, 153, 5, 36, 0, 0, 153, 154, 3, 116, 58, 0, 154, 158, 5, 96, 0, 0, 155, 157, 3, 8, 4, 0, 156, 155, 1, 0, 0, 0, 157, 160, 1, 0, 0, 0, 158, 156, 1, 0, 0, 0, 158, 159, 1, 0, 0, 0, 159, 161, 1, 0, 0, 0, 160, 158, 1, 0, 0, 0, 161, 162, 5, 97, 0, 0, 162, 7, 1, 0, 0, 0, 163, 170, 3, 4, 2, 0, 164, 170, 3, 18, 9, 0, 165, 170, 3, 10, 5, 0, 166, 170, 3, 62, 31, 0, 167, 170, 3, 74, 37, 0, 168, 170, 3, 96, 48, 0, 169, 163, 1, 0, 0, 0, 169, 164, 1, 0, 0, 0, 169, 165, 1, 0, 0, 0, 169, 166, 1, 0, 0, 0, 169, 167, 1, 0, 0, 0, 169, 168, 1, 0, 0, 0, 170, 9, 1, 0, 0, 0, 171, 172, 5, 3, 0, 0, 172, 173, 5, 6, 0, 0, 173, 174, 3, 114, 57, 0, 174, 175, 5, 93, 0, 0, 175, 182, 1, 0, 0, 0, 176, 177, 5, 3, 0, 0, 177, 178, 5, 8, 0, 0, 178, 179, 3, 114, 57, 0, 179, 180, 5, 93, 0, 0, 180, 182, 1, 0, 0, 0, 181, 171, 1, 0, 0, 0, 181, 176, 1, 0, 0, 0, 182, 11, 1, 0, 0, 0, 183, 184, 5, 4, 0, 0, 184, 185, 5, 5, 0, 0, 185, 186, 3, 114, 57, 0, 186, 187, 5, 43, 0, 0, 187, 188, 3, 116, 58, 0, 188, 189, 5, 93, 0, 0, 189, 13, 1, 0, 0, 0, 190, 191, 5, 4, 0, 0, 191, 192, 5, 6, 0, 0, 192, 193, 3, 114, 57, 0, 193, 194, 5, 37, 0, 0, 194, 195, 3, 116, 58, 0, 195, 196, 5, 93, 0, 0, 196, 15, 1, 0, 0, 0, 197, 201, 3, 10, 5, 0, 198, 201, 3, 12, 6, 0, 199, 201, 3, 14, 7, 0, 200, 197, 1, 0, 0, 0, 200, 198, 1, 0, 0, 0, 200, 199, 1, 0, 0, 0, 201, 17, 1, 0, 0, 0, 202, 203, 5, 5, 0, 0, 203, 204, 3, 114, 57, 0, 204, 205, 5, 43, 0, 0, 205, 208, 3, 116, 58, 0, 206, 207, 5, 44, 0, 0, 207, 209, 3, 116, 58, 0, 208, 206, 1, 0, 0, 0, 208, 209, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 211, 5, 93, 0, 0, 211, 19, 1, 0, 0, 0, 212, 214, 3, 16, 8, 0, 213, 212, 1, 0, 0, 0, 214, 217, 1, 0, 0, 0, 215, 213, 1, 0, 0, 0, 215, 216, 1, 0, 0, 0, 216, 218, 1, 0, 0, 0, 217, 215, 1, 0, 0, 0, 218, 219, 5, 6, 0, 0, 219, 220, 3, 114, 57, 0, 220, 221, 5, 43, 0, 0, 221, 222, 3, 116, 58, 0, 222, 223, 5, 37, 0, 0, 223, 224, 3, 116, 58, 0, 224, 228, 5, 96, 0, 0, 225, 227, 3, 22, 11, 0, 226, 225, 1, 0, 0, 0, 227, 230, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 231, 1, 0, 0, 0, 230, 228, 1, 0, 0, 0, 231, 232, 5, 97, 0, 0, 232, 21, 1, 0, 0, 0, 233, 237, 3, 26, 13, 0, 234, 237, 3, 30, 15, 0, 235, 237, 3, 24, 12, 0, 236, 233, 1, 0, 0, 0, 236, 234, 1, 0, 0, 0, 236, 235, 1, 0, 0, 0, 237, 23, 1, 0, 0, 0, 238, 239, 5, 11, 0, 0, 239, 240, 3, 114, 57, 0, 240, 241, 5, 43, 0, 0, 241, 242, 3, 116, 58, 0, 242, 243, 5, 92, 0, 0, 243, 244, 3, 98, 49, 0, 244, 245, 5, 91, 0, 0, 245, 246, 3, 98, 49, 0, 246, 247, 5, 96, 0, 0, 247, 248, 5, 60, 0, 0, 248, 249, 5, 43, 0, 0, 249, 250, 3, 116, 58, 0, 250, 251, 5, 93, 0, 0, 251, 252, 5, 97, 0, 0, 252, 25, 1, 0, 0, 0, 253, 254, 5, 9, 0, 0, 254, 255, 3, 114, 57, 0, 255, 256, 5, 43, 0, 0, 256, 257, 3, 116, 58, 0, 257, 258, 5, 92, 0, 0, 258, 259, 3, 98, 49, 0, 259, 263, 5, 96, 0, 0, 260, 262, 3, 28, 14, 0, 261, 260, 1, 0, 0, 0, 262, 265, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 266, 1, 0, 0, 0, 265, 263, 1, 0, 0, 0, 266, 267, 5, 97, 0, 0, 267, 27, 1, 0, 0, 0, 268, 269, 5, 50, 0, 0, 269, 270, 5, 43, 0, 0, 270, 271, 3, 116, 58, 0, 271, 272, 5, 93, 0, 0, 272, 288, 1, 0, 0, 0, 273, 274, 5, 51, 0, 0, 274, 275, 5, 43, 0, 0, 275, 276, 3, 116, 58, 0, 276, 277, 5, 93, 0, 0, 277, 288, 1, 0, 0, 0, 278, 279, 5, 52, 0, 0, 279, 280, 5, 53, 0, 0, 280, 281, 5, 43, 0, 0, 281, 282, 3, 116, 58, 0, 282, 283, 5, 54, 0, 0, 283, 284, 5, 43, 0, 0, 284, 285, 3, 116, 58, 0, 285, 286, 5, 93, 0, 0, 286, 288, 1, 0, 0, 0, 287, 268, 1, 0, 0, 0, 287, 273, 1, 0, 0, 0, 287, 278, 1, 0, 0, 0, 288, 29, 1, 0, 0, 0, 289, 290, 5, 10, 0, 0, 290, 291, 3, 114, 57, 0, 291, 292, 5, 43, 0, 0, 292, 293, 3, 116, 58, 0, 293, 294, 5, 92, 0, 0, 294, 295, 3, 104, 52, 0, 295, 297, 3, 34, 17, 0, 296, 298, 5, 71, 0, 0, 297, 296, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 299, 1, 0, 0, 0, 299, 303, 5, 96, 0, 0, 300, 302, 3, 32, 16, 0, 301, 300, 1, 0, 0, 0, 302, 305, 1, 0, 0, 0, 303, 301, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 306, 1, 0, 0, 0, 305, 303, 1, 0, 0, 0, 306, 307, 5, 97, 0, 0, 307, 31, 1, 0, 0, 0, 308, 309, 5, 57, 0, 0, 309, 310, 5, 43, 0, 0, 310, 311, 3, 116, 58, 0, 311, 312, 5, 93, 0, 0, 312, 333, 1, 0, 0, 0, 313, 314, 5, 58, 0, 0, 314, 315, 5, 43, 0, 0, 315, 316, 3, 116, 58, 0, 316, 317, 5, 93, 0, 0, 317, 333, 1, 0, 0, 0, 318, 319, 5, 59, 0, 0, 319, 320, 5, 43, 0, 0, 320, 321, 3, 116, 58, 0, 321, 322, 5, 93, 0, 0, 322, 333, 1, 0, 0, 0, 323, 324, 5, 52, 0, 0, 324, 325, 5, 53, 0, 0, 325, 326, 5, 43, 0, 0, 326, 327, 3, 116, 58, 0, 327, 328, 5, 54, 0, 0, 328, 329, 5, 43, 0, 0, 329, 330, 3, 116, 58, 0, 330, 331, 5, 93, 0, 0, 331, 333, 1, 0, 0, 0, 332, 308, 1, 0, 0, 0, 332, 313, 1, 0, 0, 0, 332, 318, 1, 0, 0, 0, 332, 323, 1, 0, 0, 0, 333, 33, 1, 0, 0, 0, 334, 335, 5, 5, 0, 0, 335, 339, 3, 114, 57, 0, 336, 337, 5, 6, 0, 0, 337, 339, 3, 114, 57, 0, 338, 334, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 339, 35, 1, 0, 0, 0, 340, 342, 3, 16, 8, 0, 341, 340, 1, 0, 0, 0, 342, 345, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 346, 1, 0, 0, 0, 345, 343, 1, 0, 0, 0, 346, 347, 5, 8, 0, 0, 347, 348, 3, 114, 57, 0, 348, 349, 5, 43, 0, 0, 349, 350, 3, 116, 58, 0, 350, 351, 5, 37, 0, 0, 351, 354, 3, 116, 58, 0, 352, 353, 5, 38, 0, 0, 353, 355, 5, 104, 0, 0, 354, 352, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 360, 5, 96, 0, 0, 357, 359, 3, 38, 19, 0, 358, 357, 1, 0, 0, 0, 359, 362, 1, 0, 0, 0, 360, 358, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 363, 1, 0, 0, 0, 362, 360, 1, 0, 0, 0, 363, 364, 5, 97, 0, 0, 364, 37, 1, 0, 0, 0, 365, 369, 3, 40, 20, 0, 366, 369, 3, 42, 21, 0, 367, 369, 3, 44, 22, 0, 368, 365, 1, 0, 0, 0, 368, 366, 1, 0, 0, 0, 368, 367, 1, 0, 0, 0, 369, 39, 1, 0, 0, 0, 370, 371, 5, 11, 0, 0, 371, 372, 3, 114, 57, 0, 372, 373, 5, 43, 0, 0, 373, 374, 3, 116, 58, 0, 374, 375, 5, 92, 0, 0, 375, 376, 3, 98, 49, 0, 376, 377, 5, 91, 0, 0, 377, 378, 3, 98, 49, 0, 378, 379, 5, 45, 0, 0, 379, 381, 3, 48, 24, 0, 380, 382, 3, 46, 23, 0, 381, 380, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 5, 47, 0, 0, 384, 386, 3, 50, 25, 0, 385, 387, 3, 54, 27, 0, 386, 385, 1, 0, 0, 0, 386, 387, 1, 0, 0, 0, 387, 388, 1, 0, 0, 0, 388, 389, 5, 93, 0, 0, 389, 41, 1, 0, 0, 0, 390, 391, 5, 12, 0, 0, 391, 392, 3, 114, 57, 0, 392, 393, 5, 43, 0, 0, 393, 394, 3, 116, 58, 0, 394, 395, 5, 92, 0, 0, 395, 396, 3, 98, 49, 0, 396, 397, 5, 91, 0, 0, 397, 399, 3, 98, 49, 0, 398, 400, 3, 54, 27, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 5, 93, 0, 0, 402, 43, 1, 0, 0, 0, 403, 404, 5, 13, 0, 0, 404, 405, 3, 114, 57, 0, 405, 406, 5, 43, 0, 0, 406, 407, 3, 116, 58, 0, 407, 408, 5, 14, 0, 0, 408, 409, 3, 114, 57, 0, 409, 410, 5, 92, 0, 0, 410, 412, 3, 98, 49, 0, 411, 413, 3, 54, 27, 0, 412, 411, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 415, 5, 93, 0, 0, 415, 45, 1, 0, 0, 0, 416, 417, 5, 46, 0, 0, 417, 418, 3, 98, 49, 0, 418, 47, 1, 0, 0, 0, 419, 420, 7, 0, 0, 0, 420, 49, 1, 0, 0, 0, 421, 431, 5, 49, 0, 0, 422, 423, 5, 5, 0, 0, 423, 431, 3, 114, 57, 0, 424, 425, 5, 7, 0, 0, 425, 427, 5, 98, 0, 0, 426, 428, 3, 52, 26, 0, 427, 426, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 431, 5, 99, 0, 0, 430, 421, 1, 0, 0, 0, 430, 422, 1, 0, 0, 0, 430, 424, 1, 0, 0, 0, 431, 51, 1, 0, 0, 0, 432, 437, 3, 114, 57, 0, 433, 434, 5, 94, 0, 0, 434, 436, 3, 114, 57, 0, 435, 433, 1, 0, 0, 0, 436, 439, 1, 0, 0, 0, 437, 435, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 53, 1, 0, 0, 0, 439, 437, 1, 0, 0, 0, 440, 441, 5, 48, 0, 0, 441, 445, 5, 96, 0, 0, 442, 444, 3, 56, 28, 0, 443, 442, 1, 0, 0, 0, 444, 447, 1, 0, 0, 0, 445, 443, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 448, 1, 0, 0, 0, 447, 445, 1, 0, 0, 0, 448, 449, 5, 97, 0, 0, 449, 55, 1, 0, 0, 0, 450, 451, 5, 22, 0, 0, 451, 452, 3, 114, 57, 0, 452, 453, 5, 43, 0, 0, 453, 454, 3, 116, 58, 0, 454, 455, 5, 92, 0, 0, 455, 456, 3, 98, 49, 0, 456, 457, 3, 58, 29, 0, 457, 458, 5, 93, 0, 0, 458, 490, 1, 0, 0, 0, 459, 460, 5, 23, 0, 0, 460, 461, 3, 114, 57, 0, 461, 462, 5, 43, 0, 0, 462, 463, 3, 116, 58, 0, 463, 464, 5, 92, 0, 0, 464, 465, 3, 104, 52, 0, 465, 466, 3, 34, 17, 0, 466, 467, 3, 58, 29, 0, 467, 468, 5, 93, 0, 0, 468, 490, 1, 0, 0, 0, 469, 470, 5, 6, 0, 0, 470, 471, 3, 114, 57, 0, 471, 472, 5, 43, 0, 0, 472, 473, 3, 116, 58, 0, 473, 474, 5, 92, 0, 0, 474, 475, 3, 114, 57, 0, 475, 476, 5, 93, 0, 0, 476, 490, 1, 0, 0, 0, 477, 478, 5, 13, 0, 0, 478, 479, 3, 114, 57, 0, 479, 480, 5, 43, 0, 0, 480, 481, 3, 116, 58, 0, 481, 482, 5, 92, 0, 0, 482, 485, 3, 114, 57, 0, 483, 484, 5, 15, 0, 0, 484, 486, 3, 98, 49, 0, 485, 483, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 487, 1, 0, 0, 0, 487, 488, 5, 93, 0, 0, 488, 490, 1, 0, 0, 0, 489, 450, 1, 0, 0, 0, 489, 459, 1, 0, 0, 0, 489, 469, 1, 0, 0, 0, 489, 477, 1, 0, 0, 0, 490, 57, 1, 0, 0, 0, 491, 492, 5, 98, 0, 0, 492, 497, 3, 60, 30, 0, 493, 494, 5, 94, 0, 0, 494, 496, 3, 60, 30, 0, 495, 493, 1, 0, 0, 0, 496, 499, 1, 0, 0, 0, 497, 495, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 500, 1, 0, 0, 0, 499, 497, 1, 0, 0, 0, 500, 501, 5, 99, 0, 0, 501, 59, 1, 0, 0, 0, 502, 503, 7, 1, 0, 0, 503, 61, 1, 0, 0, 0, 504, 505, 5, 21, 0, 0, 505, 506, 3, 64, 32, 0, 506, 63, 1, 0, 0, 0, 507, 510, 3, 66, 33, 0, 508, 510, 3, 70, 35, 0, 509, 507, 1, 0, 0, 0, 509, 508, 1, 0, 0, 0, 510, 65, 1, 0, 0, 0, 511, 512, 5, 22, 0, 0, 512, 513, 3, 114, 57, 0, 513, 514, 5, 43, 0, 0, 514, 515, 3, 116, 58, 0, 515, 516, 5, 31, 0, 0, 516, 517, 3, 114, 57, 0, 517, 518, 5, 92, 0, 0, 518, 519, 3, 98, 49, 0, 519, 520, 5, 32, 0, 0, 520, 523, 3, 68, 34, 0, 521, 522, 5, 33, 0, 0, 522, 524, 3, 106, 53, 0, 523, 521, 1, 0, 0, 0, 523, 524, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 526, 5, 93, 0, 0, 526, 67, 1, 0, 0, 0, 527, 534, 5, 65, 0, 0, 528, 529, 5, 66, 0, 0, 529, 530, 5, 100, 0, 0, 530, 531, 3, 98, 49, 0, 531, 532, 5, 101, 0, 0, 532, 534, 1, 0, 0, 0, 533, 527, 1, 0, 0, 0, 533, 528, 1, 0, 0, 0, 534, 69, 1, 0, 0, 0, 535, 536, 5, 23, 0, 0, 536, 537, 3, 114, 57, 0, 537, 538, 5, 43, 0, 0, 538, 539, 3, 116, 58, 0, 539, 540, 5, 96, 0, 0, 540, 541, 3, 72, 36, 0, 541, 542, 3, 72, 36, 0, 542, 543, 5, 97, 0, 0, 543, 71, 1, 0, 0, 0, 544, 545, 3, 34, 17, 0, 545, 546, 5, 24, 0, 0, 546, 547, 3, 114, 57, 0, 547, 548, 5, 43, 0, 0, 548, 549, 3, 116, 58, 0, 549, 551, 3, 104, 52, 0, 550, 552, 5, 71, 0, 0, 551, 550, 1, 0, 0, 0, 551, 552, 1, 0, 0, 0, 552, 555, 1, 0, 0, 0, 553, 554, 5, 39, 0, 0, 554, 556, 3, 116, 58, 0, 555, 553, 1, 0, 0, 0, 555, 556, 1, 0, 0, 0, 556, 558, 1, 0, 0, 0, 557, 559, 5, 40, 0, 0, 558, 557, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 562, 1, 0, 0, 0, 560, 561, 5, 41, 0, 0, 561, 563, 3, 116, 58, 0, 562, 560, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 565, 1, 0, 0, 0, 564, 566, 5, 42, 0, 0, 565, 564, 1, 0, 0, 0, 565, 566, 1, 0, 0, 0, 566, 567, 1, 0, 0, 0, 567, 568, 5, 93, 0, 0, 568, 73, 1, 0, 0, 0, 569, 570, 5, 16, 0, 0, 570, 571, 3, 114, 57, 0, 571, 572, 5, 17, 0, 0, 572, 575, 3, 114, 57, 0, 573, 574, 5, 43, 0, 0, 574, 576, 3, 116, 58, 0, 575, 573, 1, 0, 0, 0, 575, 576, 1, 0, 0, 0, 576, 579, 1, 0, 0, 0, 577, 578, 5, 38, 0, 0, 578, 580, 5, 104, 0, 0, 579, 577, 1, 0, 0, 0, 579, 580, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 585, 5, 96, 0, 0, 582, 584, 3, 76, 38, 0, 583, 582, 1, 0, 0, 0, 584, 587, 1, 0, 0, 0, 585, 583, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 588, 1, 0, 0, 0, 587, 585, 1, 0, 0, 0, 588, 589, 5, 97, 0, 0, 589, 75, 1, 0, 0, 0, 590, 591, 5, 20, 0, 0, 591, 595, 3, 64, 32, 0, 592, 595, 3, 80, 40, 0, 593, 595, 3, 78, 39, 0, 594, 590, 1, 0, 0, 0, 594, 592, 1, 0, 0, 0, 594, 593, 1, 0, 0, 0, 595, 77, 1, 0, 0, 0, 596, 597, 5, 28, 0, 0, 597, 598, 3, 114, 57, 0, 598, 599, 5, 29, 0, 0, 599, 600, 5, 30, 0, 0, 600, 601, 5, 26, 0, 0, 601, 602, 5, 13, 0, 0, 602, 603, 3, 114, 57, 0, 603, 604, 5, 27, 0, 0, 604, 605, 5, 23, 0, 0, 605, 606, 3, 114, 57, 0, 606, 607, 5, 95, 0, 0, 607, 608, 3, 114, 57, 0, 608, 609, 5, 93, 0, 0, 609, 79, 1, 0, 0, 0, 610, 611, 5, 18, 0, 0, 611, 612, 3, 82, 41, 0, 612, 613, 5, 19, 0, 0, 613, 614, 3, 86, 43, 0, 614, 615, 5, 93, 0, 0, 615, 81, 1, 0, 0, 0, 616, 617, 3, 114, 57, 0, 617, 618, 5, 95, 0, 0, 618, 619, 3, 84, 42, 0, 619, 83, 1, 0, 0, 0, 620, 632, 3, 114, 57, 0, 621, 632, 5, 60, 0, 0, 622, 632, 5, 50, 0, 0, 623, 632, 5, 51, 0, 0, 624, 632, 5, 57, 0, 0, 625, 632, 5, 58, 0, 0, 626, 632, 5, 59, 0, 0, 627, 632, 5, 61, 0, 0, 628, 632, 5, 62, 0, 0, 629, 632, 5, 63, 0, 0, 630, 632, 5, 64, 0, 0, 631, 620, 1, 0, 0, 0, 631, 621, 1, 0, 0, 0, 631, 622, 1, 0, 0, 0, 631, 623, 1, 0, 0, 0, 631, 624, 1, 0, 0, 0, 631, 625, 1, 0, 0, 0, 631, 626, 1, 0, 0, 0, 631, 627, 1, 0, 0, 0, 631, 628, 1, 0, 0, 0, 631, 629, 1, 0, 0, 0, 631, 630, 1, 0, 0, 0, 632, 85, 1, 0, 0, 0, 633, 634, 5, 22, 0, 0, 634, 635, 3, 114, 57, 0, 635, 636, 5, 95, 0, 0, 636, 637, 3, 88, 44, 0, 637, 653, 1, 0, 0, 0, 638, 639, 5, 23, 0, 0, 639, 640, 3, 114, 57, 0, 640, 641, 5, 95, 0, 0, 641, 642, 3, 114, 57, 0, 642, 643, 5, 95, 0, 0, 643, 644, 3, 90, 45, 0, 644, 653, 1, 0, 0, 0, 645, 646, 5, 8, 0, 0, 646, 647, 3, 114, 57, 0, 647, 648, 5, 95, 0, 0, 648, 650, 3, 114, 57, 0, 649, 651, 3, 92, 46, 0, 650, 649, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 653, 1, 0, 0, 0, 652, 633, 1, 0, 0, 0, 652, 638, 1, 0, 0, 0, 652, 645, 1, 0, 0, 0, 653, 87, 1, 0, 0, 0, 654, 655, 7, 2, 0, 0, 655, 89, 1, 0, 0, 0, 656, 657, 7, 3, 0, 0, 657, 91, 1, 0, 0, 0, 658, 659, 5, 25, 0, 0, 659, 663, 5, 96, 0, 0, 660, 662, 3, 94, 47, 0, 661, 660, 1, 0, 0, 0, 662, 665, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 663, 664, 1, 0, 0, 0, 664, 666, 1, 0, 0, 0, 665, 663, 1, 0, 0, 0, 666, 667, 5, 97, 0, 0, 667, 93, 1, 0, 0, 0, 668, 669, 3, 114, 57, 0, 669, 670, 5, 19, 0, 0, 670, 671, 5, 22, 0, 0, 671, 678, 3, 114, 57, 0, 672, 673, 5, 27, 0, 0, 673, 674, 5, 23, 0, 0, 674, 675, 3, 114, 57, 0, 675, 676, 5, 95, 0, 0, 676, 677, 3, 114, 57, 0, 677, 679, 1, 0, 0, 0, 678, 672, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 680, 1, 0, 0, 0, 680, 681, 5, 93, 0, 0, 681, 719, 1, 0, 0, 0, 682, 683, 3, 114, 57, 0, 683, 684, 5, 19, 0, 0, 684, 685, 5, 23, 0, 0, 685, 686, 3, 114, 57, 0, 686, 687, 5, 95, 0, 0, 687, 694, 3, 114, 57, 0, 688, 689, 5, 27, 0, 0, 689, 690, 5, 23, 0, 0, 690, 691, 3, 114, 57, 0, 691, 692, 5, 95, 0, 0, 692, 693, 3, 114, 57, 0, 693, 695, 1, 0, 0, 0, 694, 688, 1, 0, 0, 0, 694, 695, 1, 0, 0, 0, 695, 696, 1, 0, 0, 0, 696, 697, 5, 93, 0, 0, 697, 719, 1, 0, 0, 0, 698, 699, 3, 114, 57, 0, 699, 700, 5, 19, 0, 0, 700, 701, 5, 6, 0, 0, 701, 708, 3, 114, 57, 0, 702, 703, 5, 27, 0, 0, 703, 704, 5, 23, 0, 0, 704, 705, 3, 114, 57, 0, 705, 706, 5, 95, 0, 0, 706, 707, 3, 114, 57, 0, 707, 709, 1, 0, 0, 0, 708, 702, 1, 0, 0, 0, 708, 709, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 711, 5, 93, 0, 0, 711, 719, 1, 0, 0, 0, 712, 713, 3, 114, 57, 0, 713, 714, 5, 19, 0, 0, 714, 715, 5, 13, 0, 0, 715, 716, 3, 114, 57, 0, 716, 717, 5, 93, 0, 0, 717, 719, 1, 0, 0, 0, 718, 668, 1, 0, 0, 0, 718, 682, 1, 0, 0, 0, 718, 698, 1, 0, 0, 0, 718, 712, 1, 0, 0, 0, 719, 95, 1, 0, 0, 0, 720, 721, 5, 13, 0, 0, 721, 722, 3, 114, 57, 0, 722, 723, 5, 19, 0, 0, 723, 724, 3, 114, 57, 0, 724, 725, 5, 95, 0, 0, 725, 727, 3, 114, 57, 0, 726, 728, 3, 92, 46, 0, 727, 726, 1, 0, 0, 0, 727, 728, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 5, 93, 0, 0, 730, 97, 1, 0, 0, 0, 731, 766, 3, 102, 51, 0, 732, 766, 5, 72, 0, 0, 733, 766, 5, 73, 0, 0, 734, 735, 5, 74, 0, 0, 735, 766, 3, 116, 58, 0, 736, 737, 5, 75, 0, 0, 737, 738, 5, 102, 0, 0, 738, 739, 3, 114, 57, 0, 739, 740, 5, 103, 0, 0, 740, 766, 1, 0, 0, 0, 741, 742, 5, 76, 0, 0, 742, 743, 5, 102, 0, 0, 743, 744, 3, 114, 57, 0, 744, 745, 5, 103, 0, 0, 745, 766, 1, 0, 0, 0, 746, 747, 5, 77, 0, 0, 747, 748, 5, 102, 0, 0, 748, 749, 3, 98, 49, 0, 749, 750, 5, 103, 0, 0, 750, 766, 1, 0, 0, 0, 751, 752, 5, 78, 0, 0, 752, 753, 5, 102, 0, 0, 753, 754, 3, 98, 49, 0, 754, 755, 5, 103, 0, 0, 755, 766, 1, 0, 0, 0, 756, 757, 5, 79, 0, 0, 757, 761, 5, 96, 0, 0, 758, 760, 3, 100, 50, 0, 759, 758, 1, 0, 0, 0, 760, 763, 1, 0, 0, 0, 761, 759, 1, 0, 0, 0, 761, 762, 1, 0, 0, 0, 762, 764, 1, 0, 0, 0, 763, 761, 1, 0, 0, 0, 764, 766, 5, 97, 0, 0, 765, 731, 1, 0, 0, 0, 765, 732, 1, 0, 0, 0, 765, 733, 1, 0, 0, 0, 765, 734, 1, 0, 0, 0, 765, 736, 1, 0, 0, 0, 765, 741, 1, 0, 0, 0, 765, 746, 1, 0, 0, 0, 765, 751, 1, 0, 0, 0, 765, 756, 1, 0, 0, 0, 766, 99, 1, 0, 0, 0, 767, 768, 3, 114, 57, 0, 768, 769, 5, 92, 0, 0, 769, 770, 3, 98, 49, 0, 770, 771, 5, 93, 0, 0, 771, 101, 1, 0, 0, 0, 772, 773, 7, 4, 0, 0, 773, 103, 1, 0, 0, 0, 774, 775, 7, 5, 0, 0, 775, 105, 1, 0, 0, 0, 776, 785, 3, 116, 58, 0, 777, 785, 5, 104, 0, 0, 778, 785, 5, 105, 0, 0, 779, 785, 5, 88, 0, 0, 780, 785, 5, 89, 0, 0, 781, 785, 5, 90, 0, 0, 782, 785, 3, 108, 54, 0, 783, 785, 3, 112, 56, 0, 784, 776, 1, 0, 0, 0, 784, 777, 1, 0, 0, 0, 784, 778, 1, 0, 0, 0, 784, 779, 1, 0, 0, 0, 784, 780, 1, 0, 0, 0, 784, 781, 1, 0, 0, 0, 784, 782, 1, 0, 0, 0, 784, 783, 1, 0, 0, 0, 785, 107, 1, 0, 0, 0, 786, 795, 5, 96, 0, 0, 787, 792, 3, 110, 55, 0, 788, 789, 5, 94, 0, 0, 789, 791, 3, 110, 55, 0, 790, 788, 1, 0, 0, 0, 791, 794, 1, 0, 0, 0, 792, 790, 1, 0, 0, 0, 792, 793, 1, 0, 0, 0, 793, 796, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 795, 787, 1, 0, 0, 0, 795, 796, 1, 0, 0, 0, 796, 797, 1, 0, 0, 0, 797, 798, 5, 97, 0, 0, 798, 109, 1, 0, 0, 0, 799, 800, 3, 116, 58, 0, 800, 801, 5, 92, 0, 0, 801, 802, 3, 106, 53, 0, 802, 111, 1, 0, 0, 0, 803, 812, 5, 98, 0, 0, 804, 809, 3, 106, 53, 0, 805, 806, 5, 94, 0, 0, 806, 808, 3, 106, 53, 0, 807, 805, 1, 0, 0, 0, 808, 811, 1, 0, 0, 0, 809, 807, 1, 0, 0, 0, 809, 810, 1, 0, 0, 0, 810, 813, 1, 0, 0, 0, 811, 809, 1, 0, 0, 0, 812, 804, 1, 0, 0, 0, 812, 813, 1, 0, 0, 0, 813, 814, 1, 0, 0, 0, 814, 815, 5, 99, 0, 0, 815, 113, 1, 0, 0, 0, 816, 817, 7, 6, 0, 0, 817, 115, 1, 0, 0, 0, 818, 819, 5, 107, 0, 0, 819, 117, 1, 0, 0, 0, 59, 130, 137, 158, 169, 181, 200, 208, 215, 228, 236, 263, 287, 297, 303, 332, 338, 343, 354, 360, 368, 381, 386, 399, 412, 427, 430, 437, 445, 485, 489, 497, 509, 523, 533, 551, 555, 558, 562, 565, 575, 579, 585, 594, 631, 650, 652, 663, 678, 694, 708, 718, 727, 761, 765, 784, 792, 795, 809, 812] \ No newline at end of file +[4, 1, 117, 958, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 143, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 148, 8, 1, 10, 1, 12, 1, 151, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 169, 8, 3, 10, 3, 12, 3, 172, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 183, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 195, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 215, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 223, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 228, 8, 10, 10, 10, 12, 10, 231, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 236, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 246, 8, 10, 10, 10, 12, 10, 249, 9, 10, 3, 10, 251, 8, 10, 1, 10, 1, 10, 5, 10, 255, 8, 10, 10, 10, 12, 10, 258, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 266, 8, 11, 10, 11, 12, 11, 269, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 277, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 285, 8, 12, 10, 12, 12, 12, 288, 9, 12, 3, 12, 290, 8, 12, 3, 12, 292, 8, 12, 1, 13, 1, 13, 3, 13, 296, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 302, 8, 14, 10, 14, 12, 14, 305, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 316, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 321, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 330, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 355, 8, 19, 10, 19, 12, 19, 358, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 381, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 391, 8, 21, 1, 21, 1, 21, 5, 21, 395, 8, 21, 10, 21, 12, 21, 398, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 426, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 433, 8, 23, 1, 23, 1, 23, 3, 23, 437, 8, 23, 1, 24, 5, 24, 440, 8, 24, 10, 24, 12, 24, 443, 9, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 453, 8, 24, 1, 24, 1, 24, 5, 24, 457, 8, 24, 10, 24, 12, 24, 460, 9, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 3, 25, 467, 8, 25, 1, 26, 1, 26, 1, 26, 3, 26, 472, 8, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 483, 8, 26, 1, 26, 1, 26, 1, 26, 3, 26, 488, 8, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 3, 27, 495, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 504, 8, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 517, 8, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 536, 8, 31, 10, 31, 12, 31, 539, 9, 31, 3, 31, 541, 8, 31, 1, 31, 3, 31, 544, 8, 31, 1, 32, 1, 32, 1, 32, 5, 32, 549, 8, 32, 10, 32, 12, 32, 552, 9, 32, 1, 33, 1, 33, 1, 33, 5, 33, 557, 8, 33, 10, 33, 12, 33, 560, 9, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 590, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 602, 8, 34, 1, 34, 1, 34, 3, 34, 606, 8, 34, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 612, 8, 35, 10, 35, 12, 35, 615, 9, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 3, 38, 626, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 640, 8, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 650, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 668, 8, 42, 1, 42, 1, 42, 3, 42, 672, 8, 42, 1, 42, 3, 42, 675, 8, 42, 1, 42, 1, 42, 3, 42, 679, 8, 42, 1, 42, 3, 42, 682, 8, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 691, 8, 43, 1, 43, 1, 43, 3, 43, 695, 8, 43, 1, 43, 1, 43, 3, 43, 699, 8, 43, 1, 43, 1, 43, 5, 43, 703, 8, 43, 10, 43, 12, 43, 706, 9, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 714, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 751, 8, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 770, 8, 49, 1, 49, 3, 49, 773, 8, 49, 3, 49, 775, 8, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 5, 52, 784, 8, 52, 10, 52, 12, 52, 787, 9, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 801, 8, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 817, 8, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 826, 8, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 834, 8, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 844, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 853, 8, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 871, 8, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 893, 8, 55, 10, 55, 12, 55, 896, 9, 55, 1, 55, 1, 55, 1, 55, 3, 55, 901, 8, 55, 3, 55, 903, 8, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 922, 8, 59, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 928, 8, 60, 10, 60, 12, 60, 931, 9, 60, 3, 60, 933, 8, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 5, 62, 945, 8, 62, 10, 62, 12, 62, 948, 9, 62, 3, 62, 950, 8, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 0, 0, 65, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 0, 7, 1, 0, 65, 69, 2, 0, 60, 64, 66, 67, 2, 0, 60, 61, 66, 67, 2, 0, 62, 64, 66, 67, 1, 0, 85, 92, 1, 0, 72, 75, 2, 0, 39, 39, 113, 113, 1022, 0, 142, 1, 0, 0, 0, 2, 144, 1, 0, 0, 0, 4, 154, 1, 0, 0, 0, 6, 158, 1, 0, 0, 0, 8, 182, 1, 0, 0, 0, 10, 194, 1, 0, 0, 0, 12, 196, 1, 0, 0, 0, 14, 203, 1, 0, 0, 0, 16, 214, 1, 0, 0, 0, 18, 216, 1, 0, 0, 0, 20, 229, 1, 0, 0, 0, 22, 261, 1, 0, 0, 0, 24, 291, 1, 0, 0, 0, 26, 293, 1, 0, 0, 0, 28, 297, 1, 0, 0, 0, 30, 315, 1, 0, 0, 0, 32, 317, 1, 0, 0, 0, 34, 329, 1, 0, 0, 0, 36, 331, 1, 0, 0, 0, 38, 346, 1, 0, 0, 0, 40, 380, 1, 0, 0, 0, 42, 382, 1, 0, 0, 0, 44, 425, 1, 0, 0, 0, 46, 436, 1, 0, 0, 0, 48, 441, 1, 0, 0, 0, 50, 466, 1, 0, 0, 0, 52, 468, 1, 0, 0, 0, 54, 491, 1, 0, 0, 0, 56, 507, 1, 0, 0, 0, 58, 520, 1, 0, 0, 0, 60, 523, 1, 0, 0, 0, 62, 543, 1, 0, 0, 0, 64, 545, 1, 0, 0, 0, 66, 553, 1, 0, 0, 0, 68, 605, 1, 0, 0, 0, 70, 607, 1, 0, 0, 0, 72, 618, 1, 0, 0, 0, 74, 620, 1, 0, 0, 0, 76, 625, 1, 0, 0, 0, 78, 627, 1, 0, 0, 0, 80, 649, 1, 0, 0, 0, 82, 651, 1, 0, 0, 0, 84, 660, 1, 0, 0, 0, 86, 685, 1, 0, 0, 0, 88, 713, 1, 0, 0, 0, 90, 715, 1, 0, 0, 0, 92, 729, 1, 0, 0, 0, 94, 735, 1, 0, 0, 0, 96, 750, 1, 0, 0, 0, 98, 774, 1, 0, 0, 0, 100, 776, 1, 0, 0, 0, 102, 778, 1, 0, 0, 0, 104, 780, 1, 0, 0, 0, 106, 843, 1, 0, 0, 0, 108, 845, 1, 0, 0, 0, 110, 902, 1, 0, 0, 0, 112, 904, 1, 0, 0, 0, 114, 909, 1, 0, 0, 0, 116, 911, 1, 0, 0, 0, 118, 921, 1, 0, 0, 0, 120, 923, 1, 0, 0, 0, 122, 936, 1, 0, 0, 0, 124, 940, 1, 0, 0, 0, 126, 953, 1, 0, 0, 0, 128, 955, 1, 0, 0, 0, 130, 131, 3, 6, 3, 0, 131, 132, 5, 0, 0, 1, 132, 143, 1, 0, 0, 0, 133, 134, 3, 20, 10, 0, 134, 135, 5, 0, 0, 1, 135, 143, 1, 0, 0, 0, 136, 137, 3, 48, 24, 0, 137, 138, 5, 0, 0, 1, 138, 143, 1, 0, 0, 0, 139, 140, 3, 2, 1, 0, 140, 141, 5, 0, 0, 1, 141, 143, 1, 0, 0, 0, 142, 130, 1, 0, 0, 0, 142, 133, 1, 0, 0, 0, 142, 136, 1, 0, 0, 0, 142, 139, 1, 0, 0, 0, 143, 1, 1, 0, 0, 0, 144, 145, 5, 7, 0, 0, 145, 149, 5, 101, 0, 0, 146, 148, 3, 8, 4, 0, 147, 146, 1, 0, 0, 0, 148, 151, 1, 0, 0, 0, 149, 147, 1, 0, 0, 0, 149, 150, 1, 0, 0, 0, 150, 152, 1, 0, 0, 0, 151, 149, 1, 0, 0, 0, 152, 153, 5, 102, 0, 0, 153, 3, 1, 0, 0, 0, 154, 155, 5, 8, 0, 0, 155, 156, 3, 128, 64, 0, 156, 157, 5, 98, 0, 0, 157, 5, 1, 0, 0, 0, 158, 159, 5, 1, 0, 0, 159, 160, 3, 126, 63, 0, 160, 161, 5, 48, 0, 0, 161, 162, 3, 128, 64, 0, 162, 163, 5, 42, 0, 0, 163, 164, 3, 128, 64, 0, 164, 165, 5, 41, 0, 0, 165, 166, 3, 128, 64, 0, 166, 170, 5, 101, 0, 0, 167, 169, 3, 8, 4, 0, 168, 167, 1, 0, 0, 0, 169, 172, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 173, 1, 0, 0, 0, 172, 170, 1, 0, 0, 0, 173, 174, 5, 102, 0, 0, 174, 7, 1, 0, 0, 0, 175, 183, 3, 4, 2, 0, 176, 183, 3, 18, 9, 0, 177, 183, 3, 10, 5, 0, 178, 183, 3, 74, 37, 0, 179, 183, 3, 86, 43, 0, 180, 183, 3, 108, 54, 0, 181, 183, 3, 32, 16, 0, 182, 175, 1, 0, 0, 0, 182, 176, 1, 0, 0, 0, 182, 177, 1, 0, 0, 0, 182, 178, 1, 0, 0, 0, 182, 179, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 182, 181, 1, 0, 0, 0, 183, 9, 1, 0, 0, 0, 184, 185, 5, 8, 0, 0, 185, 186, 5, 11, 0, 0, 186, 187, 3, 126, 63, 0, 187, 188, 5, 98, 0, 0, 188, 195, 1, 0, 0, 0, 189, 190, 5, 8, 0, 0, 190, 191, 5, 13, 0, 0, 191, 192, 3, 126, 63, 0, 192, 193, 5, 98, 0, 0, 193, 195, 1, 0, 0, 0, 194, 184, 1, 0, 0, 0, 194, 189, 1, 0, 0, 0, 195, 11, 1, 0, 0, 0, 196, 197, 5, 9, 0, 0, 197, 198, 5, 10, 0, 0, 198, 199, 3, 126, 63, 0, 199, 200, 5, 48, 0, 0, 200, 201, 3, 128, 64, 0, 201, 202, 5, 98, 0, 0, 202, 13, 1, 0, 0, 0, 203, 204, 5, 9, 0, 0, 204, 205, 5, 11, 0, 0, 205, 206, 3, 126, 63, 0, 206, 207, 5, 42, 0, 0, 207, 208, 3, 128, 64, 0, 208, 209, 5, 98, 0, 0, 209, 15, 1, 0, 0, 0, 210, 215, 3, 10, 5, 0, 211, 215, 3, 12, 6, 0, 212, 215, 3, 14, 7, 0, 213, 215, 3, 32, 16, 0, 214, 210, 1, 0, 0, 0, 214, 211, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 214, 213, 1, 0, 0, 0, 215, 17, 1, 0, 0, 0, 216, 217, 5, 10, 0, 0, 217, 218, 3, 126, 63, 0, 218, 219, 5, 48, 0, 0, 219, 222, 3, 128, 64, 0, 220, 221, 5, 49, 0, 0, 221, 223, 3, 128, 64, 0, 222, 220, 1, 0, 0, 0, 222, 223, 1, 0, 0, 0, 223, 224, 1, 0, 0, 0, 224, 225, 5, 98, 0, 0, 225, 19, 1, 0, 0, 0, 226, 228, 3, 16, 8, 0, 227, 226, 1, 0, 0, 0, 228, 231, 1, 0, 0, 0, 229, 227, 1, 0, 0, 0, 229, 230, 1, 0, 0, 0, 230, 232, 1, 0, 0, 0, 231, 229, 1, 0, 0, 0, 232, 233, 5, 11, 0, 0, 233, 235, 3, 126, 63, 0, 234, 236, 3, 22, 11, 0, 235, 234, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, 237, 238, 5, 48, 0, 0, 238, 239, 3, 128, 64, 0, 239, 240, 5, 42, 0, 0, 240, 250, 3, 128, 64, 0, 241, 242, 5, 53, 0, 0, 242, 247, 3, 26, 13, 0, 243, 244, 5, 99, 0, 0, 244, 246, 3, 26, 13, 0, 245, 243, 1, 0, 0, 0, 246, 249, 1, 0, 0, 0, 247, 245, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 251, 1, 0, 0, 0, 249, 247, 1, 0, 0, 0, 250, 241, 1, 0, 0, 0, 250, 251, 1, 0, 0, 0, 251, 252, 1, 0, 0, 0, 252, 256, 5, 101, 0, 0, 253, 255, 3, 34, 17, 0, 254, 253, 1, 0, 0, 0, 255, 258, 1, 0, 0, 0, 256, 254, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 259, 1, 0, 0, 0, 258, 256, 1, 0, 0, 0, 259, 260, 5, 102, 0, 0, 260, 21, 1, 0, 0, 0, 261, 262, 5, 107, 0, 0, 262, 267, 3, 24, 12, 0, 263, 264, 5, 99, 0, 0, 264, 266, 3, 24, 12, 0, 265, 263, 1, 0, 0, 0, 266, 269, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 270, 1, 0, 0, 0, 269, 267, 1, 0, 0, 0, 270, 271, 5, 108, 0, 0, 271, 23, 1, 0, 0, 0, 272, 273, 5, 14, 0, 0, 273, 276, 3, 126, 63, 0, 274, 275, 5, 97, 0, 0, 275, 277, 5, 4, 0, 0, 276, 274, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 292, 1, 0, 0, 0, 278, 279, 5, 3, 0, 0, 279, 289, 3, 126, 63, 0, 280, 281, 5, 5, 0, 0, 281, 286, 3, 26, 13, 0, 282, 283, 5, 109, 0, 0, 283, 285, 3, 26, 13, 0, 284, 282, 1, 0, 0, 0, 285, 288, 1, 0, 0, 0, 286, 284, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 289, 280, 1, 0, 0, 0, 289, 290, 1, 0, 0, 0, 290, 292, 1, 0, 0, 0, 291, 272, 1, 0, 0, 0, 291, 278, 1, 0, 0, 0, 292, 25, 1, 0, 0, 0, 293, 295, 3, 126, 63, 0, 294, 296, 3, 28, 14, 0, 295, 294, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 27, 1, 0, 0, 0, 297, 298, 5, 107, 0, 0, 298, 303, 3, 30, 15, 0, 299, 300, 5, 99, 0, 0, 300, 302, 3, 30, 15, 0, 301, 299, 1, 0, 0, 0, 302, 305, 1, 0, 0, 0, 303, 301, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 306, 1, 0, 0, 0, 305, 303, 1, 0, 0, 0, 306, 307, 5, 108, 0, 0, 307, 29, 1, 0, 0, 0, 308, 309, 5, 10, 0, 0, 309, 316, 3, 126, 63, 0, 310, 311, 5, 11, 0, 0, 311, 316, 3, 26, 13, 0, 312, 313, 5, 3, 0, 0, 313, 316, 3, 126, 63, 0, 314, 316, 3, 110, 55, 0, 315, 308, 1, 0, 0, 0, 315, 310, 1, 0, 0, 0, 315, 312, 1, 0, 0, 0, 315, 314, 1, 0, 0, 0, 316, 31, 1, 0, 0, 0, 317, 318, 5, 2, 0, 0, 318, 320, 3, 126, 63, 0, 319, 321, 3, 22, 11, 0, 320, 319, 1, 0, 0, 0, 320, 321, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 323, 5, 110, 0, 0, 323, 324, 3, 110, 55, 0, 324, 325, 5, 98, 0, 0, 325, 33, 1, 0, 0, 0, 326, 330, 3, 38, 19, 0, 327, 330, 3, 42, 21, 0, 328, 330, 3, 36, 18, 0, 329, 326, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 329, 328, 1, 0, 0, 0, 330, 35, 1, 0, 0, 0, 331, 332, 5, 16, 0, 0, 332, 333, 3, 126, 63, 0, 333, 334, 5, 48, 0, 0, 334, 335, 3, 128, 64, 0, 335, 336, 5, 97, 0, 0, 336, 337, 3, 110, 55, 0, 337, 338, 5, 96, 0, 0, 338, 339, 3, 110, 55, 0, 339, 340, 5, 101, 0, 0, 340, 341, 5, 65, 0, 0, 341, 342, 5, 48, 0, 0, 342, 343, 3, 128, 64, 0, 343, 344, 5, 98, 0, 0, 344, 345, 5, 102, 0, 0, 345, 37, 1, 0, 0, 0, 346, 347, 5, 14, 0, 0, 347, 348, 3, 126, 63, 0, 348, 349, 5, 48, 0, 0, 349, 350, 3, 128, 64, 0, 350, 351, 5, 97, 0, 0, 351, 352, 3, 110, 55, 0, 352, 356, 5, 101, 0, 0, 353, 355, 3, 40, 20, 0, 354, 353, 1, 0, 0, 0, 355, 358, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 359, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 359, 360, 5, 102, 0, 0, 360, 39, 1, 0, 0, 0, 361, 362, 5, 55, 0, 0, 362, 363, 5, 48, 0, 0, 363, 364, 3, 128, 64, 0, 364, 365, 5, 98, 0, 0, 365, 381, 1, 0, 0, 0, 366, 367, 5, 56, 0, 0, 367, 368, 5, 48, 0, 0, 368, 369, 3, 128, 64, 0, 369, 370, 5, 98, 0, 0, 370, 381, 1, 0, 0, 0, 371, 372, 5, 57, 0, 0, 372, 373, 5, 58, 0, 0, 373, 374, 5, 48, 0, 0, 374, 375, 3, 128, 64, 0, 375, 376, 5, 59, 0, 0, 376, 377, 5, 48, 0, 0, 377, 378, 3, 128, 64, 0, 378, 379, 5, 98, 0, 0, 379, 381, 1, 0, 0, 0, 380, 361, 1, 0, 0, 0, 380, 366, 1, 0, 0, 0, 380, 371, 1, 0, 0, 0, 381, 41, 1, 0, 0, 0, 382, 383, 5, 15, 0, 0, 383, 384, 3, 126, 63, 0, 384, 385, 5, 48, 0, 0, 385, 386, 3, 128, 64, 0, 386, 387, 5, 97, 0, 0, 387, 388, 3, 116, 58, 0, 388, 390, 3, 46, 23, 0, 389, 391, 5, 76, 0, 0, 390, 389, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 392, 1, 0, 0, 0, 392, 396, 5, 101, 0, 0, 393, 395, 3, 44, 22, 0, 394, 393, 1, 0, 0, 0, 395, 398, 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 399, 1, 0, 0, 0, 398, 396, 1, 0, 0, 0, 399, 400, 5, 102, 0, 0, 400, 43, 1, 0, 0, 0, 401, 402, 5, 62, 0, 0, 402, 403, 5, 48, 0, 0, 403, 404, 3, 128, 64, 0, 404, 405, 5, 98, 0, 0, 405, 426, 1, 0, 0, 0, 406, 407, 5, 63, 0, 0, 407, 408, 5, 48, 0, 0, 408, 409, 3, 128, 64, 0, 409, 410, 5, 98, 0, 0, 410, 426, 1, 0, 0, 0, 411, 412, 5, 64, 0, 0, 412, 413, 5, 48, 0, 0, 413, 414, 3, 128, 64, 0, 414, 415, 5, 98, 0, 0, 415, 426, 1, 0, 0, 0, 416, 417, 5, 57, 0, 0, 417, 418, 5, 58, 0, 0, 418, 419, 5, 48, 0, 0, 419, 420, 3, 128, 64, 0, 420, 421, 5, 59, 0, 0, 421, 422, 5, 48, 0, 0, 422, 423, 3, 128, 64, 0, 423, 424, 5, 98, 0, 0, 424, 426, 1, 0, 0, 0, 425, 401, 1, 0, 0, 0, 425, 406, 1, 0, 0, 0, 425, 411, 1, 0, 0, 0, 425, 416, 1, 0, 0, 0, 426, 45, 1, 0, 0, 0, 427, 428, 5, 10, 0, 0, 428, 437, 3, 126, 63, 0, 429, 430, 5, 11, 0, 0, 430, 432, 3, 126, 63, 0, 431, 433, 3, 28, 14, 0, 432, 431, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 437, 1, 0, 0, 0, 434, 435, 5, 3, 0, 0, 435, 437, 3, 126, 63, 0, 436, 427, 1, 0, 0, 0, 436, 429, 1, 0, 0, 0, 436, 434, 1, 0, 0, 0, 437, 47, 1, 0, 0, 0, 438, 440, 3, 16, 8, 0, 439, 438, 1, 0, 0, 0, 440, 443, 1, 0, 0, 0, 441, 439, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 444, 1, 0, 0, 0, 443, 441, 1, 0, 0, 0, 444, 445, 5, 13, 0, 0, 445, 446, 3, 126, 63, 0, 446, 447, 5, 48, 0, 0, 447, 448, 3, 128, 64, 0, 448, 449, 5, 42, 0, 0, 449, 452, 3, 128, 64, 0, 450, 451, 5, 43, 0, 0, 451, 453, 5, 111, 0, 0, 452, 450, 1, 0, 0, 0, 452, 453, 1, 0, 0, 0, 453, 454, 1, 0, 0, 0, 454, 458, 5, 101, 0, 0, 455, 457, 3, 50, 25, 0, 456, 455, 1, 0, 0, 0, 457, 460, 1, 0, 0, 0, 458, 456, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 461, 1, 0, 0, 0, 460, 458, 1, 0, 0, 0, 461, 462, 5, 102, 0, 0, 462, 49, 1, 0, 0, 0, 463, 467, 3, 52, 26, 0, 464, 467, 3, 54, 27, 0, 465, 467, 3, 56, 28, 0, 466, 463, 1, 0, 0, 0, 466, 464, 1, 0, 0, 0, 466, 465, 1, 0, 0, 0, 467, 51, 1, 0, 0, 0, 468, 469, 5, 16, 0, 0, 469, 471, 3, 126, 63, 0, 470, 472, 3, 22, 11, 0, 471, 470, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 474, 5, 48, 0, 0, 474, 475, 3, 128, 64, 0, 475, 476, 5, 97, 0, 0, 476, 477, 3, 110, 55, 0, 477, 478, 5, 96, 0, 0, 478, 479, 3, 110, 55, 0, 479, 480, 5, 50, 0, 0, 480, 482, 3, 60, 30, 0, 481, 483, 3, 58, 29, 0, 482, 481, 1, 0, 0, 0, 482, 483, 1, 0, 0, 0, 483, 484, 1, 0, 0, 0, 484, 485, 5, 52, 0, 0, 485, 487, 3, 62, 31, 0, 486, 488, 3, 66, 33, 0, 487, 486, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 489, 1, 0, 0, 0, 489, 490, 5, 98, 0, 0, 490, 53, 1, 0, 0, 0, 491, 492, 5, 17, 0, 0, 492, 494, 3, 126, 63, 0, 493, 495, 3, 22, 11, 0, 494, 493, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 496, 1, 0, 0, 0, 496, 497, 5, 48, 0, 0, 497, 498, 3, 128, 64, 0, 498, 499, 5, 97, 0, 0, 499, 500, 3, 110, 55, 0, 500, 501, 5, 96, 0, 0, 501, 503, 3, 110, 55, 0, 502, 504, 3, 66, 33, 0, 503, 502, 1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 506, 5, 98, 0, 0, 506, 55, 1, 0, 0, 0, 507, 508, 5, 18, 0, 0, 508, 509, 3, 126, 63, 0, 509, 510, 5, 48, 0, 0, 510, 511, 3, 128, 64, 0, 511, 512, 5, 19, 0, 0, 512, 513, 3, 126, 63, 0, 513, 514, 5, 97, 0, 0, 514, 516, 3, 110, 55, 0, 515, 517, 3, 66, 33, 0, 516, 515, 1, 0, 0, 0, 516, 517, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 5, 98, 0, 0, 519, 57, 1, 0, 0, 0, 520, 521, 5, 51, 0, 0, 521, 522, 3, 110, 55, 0, 522, 59, 1, 0, 0, 0, 523, 524, 7, 0, 0, 0, 524, 61, 1, 0, 0, 0, 525, 544, 5, 54, 0, 0, 526, 527, 5, 10, 0, 0, 527, 544, 3, 126, 63, 0, 528, 529, 5, 3, 0, 0, 529, 544, 3, 126, 63, 0, 530, 531, 5, 12, 0, 0, 531, 540, 5, 103, 0, 0, 532, 537, 3, 26, 13, 0, 533, 534, 5, 99, 0, 0, 534, 536, 3, 26, 13, 0, 535, 533, 1, 0, 0, 0, 536, 539, 1, 0, 0, 0, 537, 535, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 541, 1, 0, 0, 0, 539, 537, 1, 0, 0, 0, 540, 532, 1, 0, 0, 0, 540, 541, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 544, 5, 104, 0, 0, 543, 525, 1, 0, 0, 0, 543, 526, 1, 0, 0, 0, 543, 528, 1, 0, 0, 0, 543, 530, 1, 0, 0, 0, 544, 63, 1, 0, 0, 0, 545, 550, 3, 126, 63, 0, 546, 547, 5, 99, 0, 0, 547, 549, 3, 126, 63, 0, 548, 546, 1, 0, 0, 0, 549, 552, 1, 0, 0, 0, 550, 548, 1, 0, 0, 0, 550, 551, 1, 0, 0, 0, 551, 65, 1, 0, 0, 0, 552, 550, 1, 0, 0, 0, 553, 554, 5, 53, 0, 0, 554, 558, 5, 101, 0, 0, 555, 557, 3, 68, 34, 0, 556, 555, 1, 0, 0, 0, 557, 560, 1, 0, 0, 0, 558, 556, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 561, 1, 0, 0, 0, 560, 558, 1, 0, 0, 0, 561, 562, 5, 102, 0, 0, 562, 67, 1, 0, 0, 0, 563, 564, 5, 27, 0, 0, 564, 565, 3, 126, 63, 0, 565, 566, 5, 48, 0, 0, 566, 567, 3, 128, 64, 0, 567, 568, 5, 97, 0, 0, 568, 569, 3, 110, 55, 0, 569, 570, 3, 70, 35, 0, 570, 571, 5, 98, 0, 0, 571, 606, 1, 0, 0, 0, 572, 573, 5, 28, 0, 0, 573, 574, 3, 126, 63, 0, 574, 575, 5, 48, 0, 0, 575, 576, 3, 128, 64, 0, 576, 577, 5, 97, 0, 0, 577, 578, 3, 116, 58, 0, 578, 579, 3, 46, 23, 0, 579, 580, 3, 70, 35, 0, 580, 581, 5, 98, 0, 0, 581, 606, 1, 0, 0, 0, 582, 583, 5, 11, 0, 0, 583, 584, 3, 126, 63, 0, 584, 585, 5, 48, 0, 0, 585, 586, 3, 128, 64, 0, 586, 587, 5, 97, 0, 0, 587, 589, 3, 126, 63, 0, 588, 590, 3, 28, 14, 0, 589, 588, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 592, 5, 98, 0, 0, 592, 606, 1, 0, 0, 0, 593, 594, 5, 18, 0, 0, 594, 595, 3, 126, 63, 0, 595, 596, 5, 48, 0, 0, 596, 597, 3, 128, 64, 0, 597, 598, 5, 97, 0, 0, 598, 601, 3, 126, 63, 0, 599, 600, 5, 20, 0, 0, 600, 602, 3, 110, 55, 0, 601, 599, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 5, 98, 0, 0, 604, 606, 1, 0, 0, 0, 605, 563, 1, 0, 0, 0, 605, 572, 1, 0, 0, 0, 605, 582, 1, 0, 0, 0, 605, 593, 1, 0, 0, 0, 606, 69, 1, 0, 0, 0, 607, 608, 5, 103, 0, 0, 608, 613, 3, 72, 36, 0, 609, 610, 5, 99, 0, 0, 610, 612, 3, 72, 36, 0, 611, 609, 1, 0, 0, 0, 612, 615, 1, 0, 0, 0, 613, 611, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 616, 1, 0, 0, 0, 615, 613, 1, 0, 0, 0, 616, 617, 5, 104, 0, 0, 617, 71, 1, 0, 0, 0, 618, 619, 7, 1, 0, 0, 619, 73, 1, 0, 0, 0, 620, 621, 5, 26, 0, 0, 621, 622, 3, 76, 38, 0, 622, 75, 1, 0, 0, 0, 623, 626, 3, 78, 39, 0, 624, 626, 3, 82, 41, 0, 625, 623, 1, 0, 0, 0, 625, 624, 1, 0, 0, 0, 626, 77, 1, 0, 0, 0, 627, 628, 5, 27, 0, 0, 628, 629, 3, 126, 63, 0, 629, 630, 5, 48, 0, 0, 630, 631, 3, 128, 64, 0, 631, 632, 5, 36, 0, 0, 632, 633, 3, 126, 63, 0, 633, 634, 5, 97, 0, 0, 634, 635, 3, 110, 55, 0, 635, 636, 5, 37, 0, 0, 636, 639, 3, 80, 40, 0, 637, 638, 5, 38, 0, 0, 638, 640, 3, 118, 59, 0, 639, 637, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 641, 1, 0, 0, 0, 641, 642, 5, 98, 0, 0, 642, 79, 1, 0, 0, 0, 643, 650, 5, 70, 0, 0, 644, 645, 5, 71, 0, 0, 645, 646, 5, 105, 0, 0, 646, 647, 3, 110, 55, 0, 647, 648, 5, 106, 0, 0, 648, 650, 1, 0, 0, 0, 649, 643, 1, 0, 0, 0, 649, 644, 1, 0, 0, 0, 650, 81, 1, 0, 0, 0, 651, 652, 5, 28, 0, 0, 652, 653, 3, 126, 63, 0, 653, 654, 5, 48, 0, 0, 654, 655, 3, 128, 64, 0, 655, 656, 5, 101, 0, 0, 656, 657, 3, 84, 42, 0, 657, 658, 3, 84, 42, 0, 658, 659, 5, 102, 0, 0, 659, 83, 1, 0, 0, 0, 660, 661, 3, 46, 23, 0, 661, 662, 5, 29, 0, 0, 662, 663, 3, 126, 63, 0, 663, 664, 5, 48, 0, 0, 664, 665, 3, 128, 64, 0, 665, 667, 3, 116, 58, 0, 666, 668, 5, 76, 0, 0, 667, 666, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 671, 1, 0, 0, 0, 669, 670, 5, 44, 0, 0, 670, 672, 3, 128, 64, 0, 671, 669, 1, 0, 0, 0, 671, 672, 1, 0, 0, 0, 672, 674, 1, 0, 0, 0, 673, 675, 5, 45, 0, 0, 674, 673, 1, 0, 0, 0, 674, 675, 1, 0, 0, 0, 675, 678, 1, 0, 0, 0, 676, 677, 5, 46, 0, 0, 677, 679, 3, 128, 64, 0, 678, 676, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 681, 1, 0, 0, 0, 680, 682, 5, 47, 0, 0, 681, 680, 1, 0, 0, 0, 681, 682, 1, 0, 0, 0, 682, 683, 1, 0, 0, 0, 683, 684, 5, 98, 0, 0, 684, 85, 1, 0, 0, 0, 685, 686, 5, 21, 0, 0, 686, 687, 3, 126, 63, 0, 687, 688, 5, 22, 0, 0, 688, 690, 3, 126, 63, 0, 689, 691, 3, 28, 14, 0, 690, 689, 1, 0, 0, 0, 690, 691, 1, 0, 0, 0, 691, 694, 1, 0, 0, 0, 692, 693, 5, 48, 0, 0, 693, 695, 3, 128, 64, 0, 694, 692, 1, 0, 0, 0, 694, 695, 1, 0, 0, 0, 695, 698, 1, 0, 0, 0, 696, 697, 5, 43, 0, 0, 697, 699, 5, 111, 0, 0, 698, 696, 1, 0, 0, 0, 698, 699, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 704, 5, 101, 0, 0, 701, 703, 3, 88, 44, 0, 702, 701, 1, 0, 0, 0, 703, 706, 1, 0, 0, 0, 704, 702, 1, 0, 0, 0, 704, 705, 1, 0, 0, 0, 705, 707, 1, 0, 0, 0, 706, 704, 1, 0, 0, 0, 707, 708, 5, 102, 0, 0, 708, 87, 1, 0, 0, 0, 709, 710, 5, 25, 0, 0, 710, 714, 3, 76, 38, 0, 711, 714, 3, 92, 46, 0, 712, 714, 3, 90, 45, 0, 713, 709, 1, 0, 0, 0, 713, 711, 1, 0, 0, 0, 713, 712, 1, 0, 0, 0, 714, 89, 1, 0, 0, 0, 715, 716, 5, 33, 0, 0, 716, 717, 3, 126, 63, 0, 717, 718, 5, 34, 0, 0, 718, 719, 5, 35, 0, 0, 719, 720, 5, 31, 0, 0, 720, 721, 5, 18, 0, 0, 721, 722, 3, 126, 63, 0, 722, 723, 5, 32, 0, 0, 723, 724, 5, 28, 0, 0, 724, 725, 3, 126, 63, 0, 725, 726, 5, 100, 0, 0, 726, 727, 3, 126, 63, 0, 727, 728, 5, 98, 0, 0, 728, 91, 1, 0, 0, 0, 729, 730, 5, 23, 0, 0, 730, 731, 3, 94, 47, 0, 731, 732, 5, 24, 0, 0, 732, 733, 3, 98, 49, 0, 733, 734, 5, 98, 0, 0, 734, 93, 1, 0, 0, 0, 735, 736, 3, 126, 63, 0, 736, 737, 5, 100, 0, 0, 737, 738, 3, 96, 48, 0, 738, 95, 1, 0, 0, 0, 739, 751, 3, 126, 63, 0, 740, 751, 5, 65, 0, 0, 741, 751, 5, 55, 0, 0, 742, 751, 5, 56, 0, 0, 743, 751, 5, 62, 0, 0, 744, 751, 5, 63, 0, 0, 745, 751, 5, 64, 0, 0, 746, 751, 5, 66, 0, 0, 747, 751, 5, 67, 0, 0, 748, 751, 5, 68, 0, 0, 749, 751, 5, 69, 0, 0, 750, 739, 1, 0, 0, 0, 750, 740, 1, 0, 0, 0, 750, 741, 1, 0, 0, 0, 750, 742, 1, 0, 0, 0, 750, 743, 1, 0, 0, 0, 750, 744, 1, 0, 0, 0, 750, 745, 1, 0, 0, 0, 750, 746, 1, 0, 0, 0, 750, 747, 1, 0, 0, 0, 750, 748, 1, 0, 0, 0, 750, 749, 1, 0, 0, 0, 751, 97, 1, 0, 0, 0, 752, 753, 5, 27, 0, 0, 753, 754, 3, 126, 63, 0, 754, 755, 5, 100, 0, 0, 755, 756, 3, 100, 50, 0, 756, 775, 1, 0, 0, 0, 757, 758, 5, 28, 0, 0, 758, 759, 3, 126, 63, 0, 759, 760, 5, 100, 0, 0, 760, 761, 3, 126, 63, 0, 761, 762, 5, 100, 0, 0, 762, 763, 3, 102, 51, 0, 763, 775, 1, 0, 0, 0, 764, 765, 5, 13, 0, 0, 765, 766, 3, 126, 63, 0, 766, 767, 5, 100, 0, 0, 767, 769, 3, 126, 63, 0, 768, 770, 3, 28, 14, 0, 769, 768, 1, 0, 0, 0, 769, 770, 1, 0, 0, 0, 770, 772, 1, 0, 0, 0, 771, 773, 3, 104, 52, 0, 772, 771, 1, 0, 0, 0, 772, 773, 1, 0, 0, 0, 773, 775, 1, 0, 0, 0, 774, 752, 1, 0, 0, 0, 774, 757, 1, 0, 0, 0, 774, 764, 1, 0, 0, 0, 775, 99, 1, 0, 0, 0, 776, 777, 7, 2, 0, 0, 777, 101, 1, 0, 0, 0, 778, 779, 7, 3, 0, 0, 779, 103, 1, 0, 0, 0, 780, 781, 5, 30, 0, 0, 781, 785, 5, 101, 0, 0, 782, 784, 3, 106, 53, 0, 783, 782, 1, 0, 0, 0, 784, 787, 1, 0, 0, 0, 785, 783, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 788, 1, 0, 0, 0, 787, 785, 1, 0, 0, 0, 788, 789, 5, 102, 0, 0, 789, 105, 1, 0, 0, 0, 790, 791, 3, 126, 63, 0, 791, 792, 5, 24, 0, 0, 792, 793, 5, 27, 0, 0, 793, 800, 3, 126, 63, 0, 794, 795, 5, 32, 0, 0, 795, 796, 5, 28, 0, 0, 796, 797, 3, 126, 63, 0, 797, 798, 5, 100, 0, 0, 798, 799, 3, 126, 63, 0, 799, 801, 1, 0, 0, 0, 800, 794, 1, 0, 0, 0, 800, 801, 1, 0, 0, 0, 801, 802, 1, 0, 0, 0, 802, 803, 5, 98, 0, 0, 803, 844, 1, 0, 0, 0, 804, 805, 3, 126, 63, 0, 805, 806, 5, 24, 0, 0, 806, 807, 5, 28, 0, 0, 807, 808, 3, 126, 63, 0, 808, 809, 5, 100, 0, 0, 809, 816, 3, 126, 63, 0, 810, 811, 5, 32, 0, 0, 811, 812, 5, 28, 0, 0, 812, 813, 3, 126, 63, 0, 813, 814, 5, 100, 0, 0, 814, 815, 3, 126, 63, 0, 815, 817, 1, 0, 0, 0, 816, 810, 1, 0, 0, 0, 816, 817, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 819, 5, 98, 0, 0, 819, 844, 1, 0, 0, 0, 820, 821, 3, 126, 63, 0, 821, 822, 5, 24, 0, 0, 822, 823, 5, 11, 0, 0, 823, 825, 3, 126, 63, 0, 824, 826, 3, 28, 14, 0, 825, 824, 1, 0, 0, 0, 825, 826, 1, 0, 0, 0, 826, 833, 1, 0, 0, 0, 827, 828, 5, 32, 0, 0, 828, 829, 5, 28, 0, 0, 829, 830, 3, 126, 63, 0, 830, 831, 5, 100, 0, 0, 831, 832, 3, 126, 63, 0, 832, 834, 1, 0, 0, 0, 833, 827, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 836, 5, 98, 0, 0, 836, 844, 1, 0, 0, 0, 837, 838, 3, 126, 63, 0, 838, 839, 5, 24, 0, 0, 839, 840, 5, 18, 0, 0, 840, 841, 3, 126, 63, 0, 841, 842, 5, 98, 0, 0, 842, 844, 1, 0, 0, 0, 843, 790, 1, 0, 0, 0, 843, 804, 1, 0, 0, 0, 843, 820, 1, 0, 0, 0, 843, 837, 1, 0, 0, 0, 844, 107, 1, 0, 0, 0, 845, 846, 5, 18, 0, 0, 846, 847, 3, 126, 63, 0, 847, 848, 5, 24, 0, 0, 848, 849, 3, 126, 63, 0, 849, 850, 5, 100, 0, 0, 850, 852, 3, 126, 63, 0, 851, 853, 3, 104, 52, 0, 852, 851, 1, 0, 0, 0, 852, 853, 1, 0, 0, 0, 853, 854, 1, 0, 0, 0, 854, 855, 5, 98, 0, 0, 855, 109, 1, 0, 0, 0, 856, 903, 3, 114, 57, 0, 857, 903, 5, 77, 0, 0, 858, 903, 5, 78, 0, 0, 859, 860, 5, 79, 0, 0, 860, 903, 3, 128, 64, 0, 861, 862, 5, 80, 0, 0, 862, 863, 5, 107, 0, 0, 863, 864, 3, 126, 63, 0, 864, 865, 5, 108, 0, 0, 865, 903, 1, 0, 0, 0, 866, 867, 5, 81, 0, 0, 867, 868, 5, 107, 0, 0, 868, 870, 3, 126, 63, 0, 869, 871, 3, 28, 14, 0, 870, 869, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 872, 1, 0, 0, 0, 872, 873, 5, 108, 0, 0, 873, 903, 1, 0, 0, 0, 874, 875, 5, 6, 0, 0, 875, 876, 5, 107, 0, 0, 876, 877, 3, 126, 63, 0, 877, 878, 5, 108, 0, 0, 878, 903, 1, 0, 0, 0, 879, 880, 5, 82, 0, 0, 880, 881, 5, 107, 0, 0, 881, 882, 3, 110, 55, 0, 882, 883, 5, 108, 0, 0, 883, 903, 1, 0, 0, 0, 884, 885, 5, 83, 0, 0, 885, 886, 5, 107, 0, 0, 886, 887, 3, 110, 55, 0, 887, 888, 5, 108, 0, 0, 888, 903, 1, 0, 0, 0, 889, 890, 5, 84, 0, 0, 890, 894, 5, 101, 0, 0, 891, 893, 3, 112, 56, 0, 892, 891, 1, 0, 0, 0, 893, 896, 1, 0, 0, 0, 894, 892, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 897, 1, 0, 0, 0, 896, 894, 1, 0, 0, 0, 897, 903, 5, 102, 0, 0, 898, 900, 3, 126, 63, 0, 899, 901, 3, 28, 14, 0, 900, 899, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 903, 1, 0, 0, 0, 902, 856, 1, 0, 0, 0, 902, 857, 1, 0, 0, 0, 902, 858, 1, 0, 0, 0, 902, 859, 1, 0, 0, 0, 902, 861, 1, 0, 0, 0, 902, 866, 1, 0, 0, 0, 902, 874, 1, 0, 0, 0, 902, 879, 1, 0, 0, 0, 902, 884, 1, 0, 0, 0, 902, 889, 1, 0, 0, 0, 902, 898, 1, 0, 0, 0, 903, 111, 1, 0, 0, 0, 904, 905, 3, 126, 63, 0, 905, 906, 5, 97, 0, 0, 906, 907, 3, 110, 55, 0, 907, 908, 5, 98, 0, 0, 908, 113, 1, 0, 0, 0, 909, 910, 7, 4, 0, 0, 910, 115, 1, 0, 0, 0, 911, 912, 7, 5, 0, 0, 912, 117, 1, 0, 0, 0, 913, 922, 3, 128, 64, 0, 914, 922, 5, 111, 0, 0, 915, 922, 5, 112, 0, 0, 916, 922, 5, 93, 0, 0, 917, 922, 5, 94, 0, 0, 918, 922, 5, 95, 0, 0, 919, 922, 3, 120, 60, 0, 920, 922, 3, 124, 62, 0, 921, 913, 1, 0, 0, 0, 921, 914, 1, 0, 0, 0, 921, 915, 1, 0, 0, 0, 921, 916, 1, 0, 0, 0, 921, 917, 1, 0, 0, 0, 921, 918, 1, 0, 0, 0, 921, 919, 1, 0, 0, 0, 921, 920, 1, 0, 0, 0, 922, 119, 1, 0, 0, 0, 923, 932, 5, 101, 0, 0, 924, 929, 3, 122, 61, 0, 925, 926, 5, 99, 0, 0, 926, 928, 3, 122, 61, 0, 927, 925, 1, 0, 0, 0, 928, 931, 1, 0, 0, 0, 929, 927, 1, 0, 0, 0, 929, 930, 1, 0, 0, 0, 930, 933, 1, 0, 0, 0, 931, 929, 1, 0, 0, 0, 932, 924, 1, 0, 0, 0, 932, 933, 1, 0, 0, 0, 933, 934, 1, 0, 0, 0, 934, 935, 5, 102, 0, 0, 935, 121, 1, 0, 0, 0, 936, 937, 3, 128, 64, 0, 937, 938, 5, 97, 0, 0, 938, 939, 3, 118, 59, 0, 939, 123, 1, 0, 0, 0, 940, 949, 5, 103, 0, 0, 941, 946, 3, 118, 59, 0, 942, 943, 5, 99, 0, 0, 943, 945, 3, 118, 59, 0, 944, 942, 1, 0, 0, 0, 945, 948, 1, 0, 0, 0, 946, 944, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 950, 1, 0, 0, 0, 948, 946, 1, 0, 0, 0, 949, 941, 1, 0, 0, 0, 949, 950, 1, 0, 0, 0, 950, 951, 1, 0, 0, 0, 951, 952, 5, 104, 0, 0, 952, 125, 1, 0, 0, 0, 953, 954, 7, 6, 0, 0, 954, 127, 1, 0, 0, 0, 955, 956, 5, 114, 0, 0, 956, 129, 1, 0, 0, 0, 81, 142, 149, 170, 182, 194, 214, 222, 229, 235, 247, 250, 256, 267, 276, 286, 289, 291, 295, 303, 315, 320, 329, 356, 380, 390, 396, 425, 432, 436, 441, 452, 458, 466, 471, 482, 487, 494, 503, 516, 537, 540, 543, 550, 558, 589, 601, 605, 613, 625, 639, 649, 667, 671, 674, 678, 681, 690, 694, 698, 704, 713, 750, 769, 772, 774, 785, 800, 816, 825, 833, 843, 852, 870, 894, 900, 902, 921, 929, 932, 946, 949] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index 8571c0b..75f42fb 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -1,213 +1,227 @@ WORKSPACE=1 -FRAGMENT=2 -IMPORT=3 -EXTERNAL=4 -ATOM=5 -INTERFACE=6 -INTERFACES=7 -PACKAGE=8 -VALUE=9 -RELATION=10 -OPERATION=11 -FUNCTION=12 -CONSTRUCTOR=13 -CONSTRUCTS=14 -INPUT=15 -CONFORM=16 -AS=17 -BIND=18 -TO=19 -PRIVATE=20 -SHARED=21 -STATE=22 -EDGE=23 -PROJECTION=24 -WITH=25 -USING=26 -VIA=27 -MATERIALIZE=28 -IF=29 -ABSENT=30 -ON=31 -POLICY=32 -DEFAULT=33 -SOURCE=34 -REPOSITORY=35 -COMMIT=36 -REVISION=37 -SEMANTIC_MAJOR=38 -ON_DELETE=39 -RETAIN_OTHER=40 -KEYED=41 -PUBLIC_TRAVERSAL=42 -ID=43 -DOC=44 -MODE=45 -EMITS=46 -RECEIVER=47 -REQUIRES=48 -ANY=49 -GET=50 -SET=51 -WATCH=52 -START=53 -STOP=54 -READ=55 -WRITE=56 -RESOLVE=57 -CONNECT=58 -DISCONNECT=59 -CALL=60 -WATCH_START=61 -WATCH_STOP=62 -SUBSCRIBE=63 -UNSUBSCRIBE=64 -OPTIMISTIC_REGISTER=65 -CRDT=66 -OPTIONAL_ONE=67 -EXACTLY_ONE=68 -MANY_UNIQUE=69 -MANY=70 -ORDERED=71 -UNIT=72 -WATCH_HANDLE=73 -MESSAGE=74 -ATOM_REF=75 -INTERFACE_REF=76 -OPTIONAL=77 -LIST=78 -RECORD=79 -BOOL=80 -BYTES=81 -DOUBLE=82 -INT32=83 -INT64=84 -STRING=85 -UINT32=86 -UINT64=87 -TRUE=88 -FALSE=89 -NULL=90 -ARROW=91 -COLON=92 -SEMI=93 -COMMA=94 -DOT=95 -LBRACE=96 -RBRACE=97 -LBRACK=98 -RBRACK=99 -LPAREN=100 -RPAREN=101 -LT=102 -GT=103 -INTEGER=104 -JSON_NUMBER=105 -IDENTIFIER=106 -STRING_LITERAL=107 -LINE_COMMENT=108 -BLOCK_COMMENT=109 -WS=110 +TYPE=2 +OBJECT=3 +STORABLE=4 +IMPLEMENTS=5 +REF=6 +FRAGMENT=7 +IMPORT=8 +EXTERNAL=9 +ATOM=10 +INTERFACE=11 +INTERFACES=12 +PACKAGE=13 +VALUE=14 +RELATION=15 +OPERATION=16 +FUNCTION=17 +CONSTRUCTOR=18 +CONSTRUCTS=19 +INPUT=20 +CONFORM=21 +AS=22 +BIND=23 +TO=24 +PRIVATE=25 +SHARED=26 +STATE=27 +EDGE=28 +PROJECTION=29 +WITH=30 +USING=31 +VIA=32 +MATERIALIZE=33 +IF=34 +ABSENT=35 +ON=36 +POLICY=37 +DEFAULT=38 +SOURCE=39 +REPOSITORY=40 +COMMIT=41 +REVISION=42 +SEMANTIC_MAJOR=43 +ON_DELETE=44 +RETAIN_OTHER=45 +KEYED=46 +PUBLIC_TRAVERSAL=47 +ID=48 +DOC=49 +MODE=50 +EMITS=51 +RECEIVER=52 +REQUIRES=53 +ANY=54 +GET=55 +SET=56 +WATCH=57 +START=58 +STOP=59 +READ=60 +WRITE=61 +RESOLVE=62 +CONNECT=63 +DISCONNECT=64 +CALL=65 +WATCH_START=66 +WATCH_STOP=67 +SUBSCRIBE=68 +UNSUBSCRIBE=69 +OPTIMISTIC_REGISTER=70 +CRDT=71 +OPTIONAL_ONE=72 +EXACTLY_ONE=73 +MANY_UNIQUE=74 +MANY=75 +ORDERED=76 +UNIT=77 +WATCH_HANDLE=78 +MESSAGE=79 +ATOM_REF=80 +INTERFACE_REF=81 +OPTIONAL=82 +LIST=83 +RECORD=84 +BOOL=85 +BYTES=86 +DOUBLE=87 +INT32=88 +INT64=89 +STRING=90 +UINT32=91 +UINT64=92 +TRUE=93 +FALSE=94 +NULL=95 +ARROW=96 +COLON=97 +SEMI=98 +COMMA=99 +DOT=100 +LBRACE=101 +RBRACE=102 +LBRACK=103 +RBRACK=104 +LPAREN=105 +RPAREN=106 +LT=107 +GT=108 +AMP=109 +EQUAL=110 +INTEGER=111 +JSON_NUMBER=112 +IDENTIFIER=113 +STRING_LITERAL=114 +LINE_COMMENT=115 +BLOCK_COMMENT=116 +WS=117 'workspace'=1 -'fragment'=2 -'import'=3 -'external'=4 -'atom'=5 -'interface'=6 -'interfaces'=7 -'package'=8 -'value'=9 -'relation'=10 -'operation'=11 -'function'=12 -'constructor'=13 -'constructs'=14 -'input'=15 -'conform'=16 -'as'=17 -'bind'=18 -'to'=19 -'private'=20 -'shared'=21 -'state'=22 -'edge'=23 -'projection'=24 -'with'=25 -'using'=26 -'via'=27 -'materialize'=28 -'if'=29 -'absent'=30 -'on'=31 -'policy'=32 -'default'=33 -'source'=34 -'repository'=35 -'commit'=36 -'revision'=37 -'semantic-major'=38 -'on-delete'=39 -'retain-other'=40 -'keyed'=41 -'public-traversal'=42 -'id'=43 -'doc'=44 -'mode'=45 -'emits'=46 -'receiver'=47 -'requires'=48 -'any'=49 -'get'=50 -'set'=51 -'watch'=52 -'start'=53 -'stop'=54 -'read'=55 -'write'=56 -'resolve'=57 -'connect'=58 -'disconnect'=59 -'call'=60 -'watch-start'=61 -'watch-stop'=62 -'subscribe'=63 -'unsubscribe'=64 -'optimistic-register'=65 -'crdt'=66 -'optional-one'=67 -'exactly-one'=68 -'many-unique'=69 -'many'=70 -'ordered'=71 -'unit'=72 -'watch-handle'=73 -'message'=74 -'atom-ref'=75 -'interface-ref'=76 -'optional'=77 -'list'=78 -'record'=79 -'bool'=80 -'bytes'=81 -'double'=82 -'int32'=83 -'int64'=84 -'string'=85 -'uint32'=86 -'uint64'=87 -'true'=88 -'false'=89 -'null'=90 -'->'=91 -':'=92 -';'=93 -','=94 -'.'=95 -'{'=96 -'}'=97 -'['=98 -']'=99 -'('=100 -')'=101 -'<'=102 -'>'=103 +'type'=2 +'object'=3 +'storable'=4 +'implements'=5 +'ref'=6 +'fragment'=7 +'import'=8 +'external'=9 +'atom'=10 +'interface'=11 +'interfaces'=12 +'package'=13 +'value'=14 +'relation'=15 +'operation'=16 +'function'=17 +'constructor'=18 +'constructs'=19 +'input'=20 +'conform'=21 +'as'=22 +'bind'=23 +'to'=24 +'private'=25 +'shared'=26 +'state'=27 +'edge'=28 +'projection'=29 +'with'=30 +'using'=31 +'via'=32 +'materialize'=33 +'if'=34 +'absent'=35 +'on'=36 +'policy'=37 +'default'=38 +'source'=39 +'repository'=40 +'commit'=41 +'revision'=42 +'semantic-major'=43 +'on-delete'=44 +'retain-other'=45 +'keyed'=46 +'public-traversal'=47 +'id'=48 +'doc'=49 +'mode'=50 +'emits'=51 +'receiver'=52 +'requires'=53 +'any'=54 +'get'=55 +'set'=56 +'watch'=57 +'start'=58 +'stop'=59 +'read'=60 +'write'=61 +'resolve'=62 +'connect'=63 +'disconnect'=64 +'call'=65 +'watch-start'=66 +'watch-stop'=67 +'subscribe'=68 +'unsubscribe'=69 +'optimistic-register'=70 +'crdt'=71 +'optional-one'=72 +'exactly-one'=73 +'many-unique'=74 +'many'=75 +'ordered'=76 +'unit'=77 +'watch-handle'=78 +'message'=79 +'atom-ref'=80 +'interface-ref'=81 +'optional'=82 +'list'=83 +'record'=84 +'bool'=85 +'bytes'=86 +'double'=87 +'int32'=88 +'int64'=89 +'string'=90 +'uint32'=91 +'uint64'=92 +'true'=93 +'false'=94 +'null'=95 +'->'=96 +':'=97 +';'=98 +','=99 +'.'=100 +'{'=101 +'}'=102 +'['=103 +']'=104 +'('=105 +')'=106 +'<'=107 +'>'=108 +'&'=109 +'='=110 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index 094257a..4e55c58 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -1,6 +1,11 @@ token literal names: null 'workspace' +'type' +'object' +'storable' +'implements' +'ref' 'fragment' 'import' 'external' @@ -103,6 +108,8 @@ null ')' '<' '>' +'&' +'=' null null null @@ -114,6 +121,11 @@ null token symbolic names: null WORKSPACE +TYPE +OBJECT +STORABLE +IMPLEMENTS +REF FRAGMENT IMPORT EXTERNAL @@ -216,6 +228,8 @@ LPAREN RPAREN LT GT +AMP +EQUAL INTEGER JSON_NUMBER IDENTIFIER @@ -226,6 +240,11 @@ WS rule names: WORKSPACE +TYPE +OBJECT +STORABLE +IMPLEMENTS +REF FRAGMENT IMPORT EXTERNAL @@ -328,6 +347,8 @@ LPAREN RPAREN LT GT +AMP +EQUAL INTEGER JSON_NUMBER IDENTIFIER @@ -346,4 +367,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 110, 1056, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 1, 93, 1, 94, 1, 94, 1, 95, 1, 95, 1, 96, 1, 96, 1, 97, 1, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 100, 1, 100, 1, 101, 1, 101, 1, 102, 1, 102, 1, 103, 3, 103, 957, 8, 103, 1, 103, 4, 103, 960, 8, 103, 11, 103, 12, 103, 961, 1, 104, 3, 104, 965, 8, 104, 1, 104, 1, 104, 1, 104, 5, 104, 970, 8, 104, 10, 104, 12, 104, 973, 9, 104, 3, 104, 975, 8, 104, 1, 104, 1, 104, 4, 104, 979, 8, 104, 11, 104, 12, 104, 980, 3, 104, 983, 8, 104, 1, 104, 1, 104, 3, 104, 987, 8, 104, 1, 104, 4, 104, 990, 8, 104, 11, 104, 12, 104, 991, 3, 104, 994, 8, 104, 1, 105, 1, 105, 5, 105, 998, 8, 105, 10, 105, 12, 105, 1001, 9, 105, 1, 106, 1, 106, 1, 106, 5, 106, 1006, 8, 106, 10, 106, 12, 106, 1009, 9, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 3, 107, 1021, 8, 107, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 5, 109, 1029, 8, 109, 10, 109, 12, 109, 1032, 9, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1040, 8, 110, 10, 110, 12, 110, 1043, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 4, 111, 1051, 8, 111, 11, 111, 12, 111, 1052, 1, 111, 1, 111, 1, 1041, 0, 112, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 0, 217, 0, 219, 108, 221, 109, 223, 110, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1070, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 1, 225, 1, 0, 0, 0, 3, 235, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 7, 251, 1, 0, 0, 0, 9, 260, 1, 0, 0, 0, 11, 265, 1, 0, 0, 0, 13, 275, 1, 0, 0, 0, 15, 286, 1, 0, 0, 0, 17, 294, 1, 0, 0, 0, 19, 300, 1, 0, 0, 0, 21, 309, 1, 0, 0, 0, 23, 319, 1, 0, 0, 0, 25, 328, 1, 0, 0, 0, 27, 340, 1, 0, 0, 0, 29, 351, 1, 0, 0, 0, 31, 357, 1, 0, 0, 0, 33, 365, 1, 0, 0, 0, 35, 368, 1, 0, 0, 0, 37, 373, 1, 0, 0, 0, 39, 376, 1, 0, 0, 0, 41, 384, 1, 0, 0, 0, 43, 391, 1, 0, 0, 0, 45, 397, 1, 0, 0, 0, 47, 402, 1, 0, 0, 0, 49, 413, 1, 0, 0, 0, 51, 418, 1, 0, 0, 0, 53, 424, 1, 0, 0, 0, 55, 428, 1, 0, 0, 0, 57, 440, 1, 0, 0, 0, 59, 443, 1, 0, 0, 0, 61, 450, 1, 0, 0, 0, 63, 453, 1, 0, 0, 0, 65, 460, 1, 0, 0, 0, 67, 468, 1, 0, 0, 0, 69, 475, 1, 0, 0, 0, 71, 486, 1, 0, 0, 0, 73, 493, 1, 0, 0, 0, 75, 502, 1, 0, 0, 0, 77, 517, 1, 0, 0, 0, 79, 527, 1, 0, 0, 0, 81, 540, 1, 0, 0, 0, 83, 546, 1, 0, 0, 0, 85, 563, 1, 0, 0, 0, 87, 566, 1, 0, 0, 0, 89, 570, 1, 0, 0, 0, 91, 575, 1, 0, 0, 0, 93, 581, 1, 0, 0, 0, 95, 590, 1, 0, 0, 0, 97, 599, 1, 0, 0, 0, 99, 603, 1, 0, 0, 0, 101, 607, 1, 0, 0, 0, 103, 611, 1, 0, 0, 0, 105, 617, 1, 0, 0, 0, 107, 623, 1, 0, 0, 0, 109, 628, 1, 0, 0, 0, 111, 633, 1, 0, 0, 0, 113, 639, 1, 0, 0, 0, 115, 647, 1, 0, 0, 0, 117, 655, 1, 0, 0, 0, 119, 666, 1, 0, 0, 0, 121, 671, 1, 0, 0, 0, 123, 683, 1, 0, 0, 0, 125, 694, 1, 0, 0, 0, 127, 704, 1, 0, 0, 0, 129, 716, 1, 0, 0, 0, 131, 736, 1, 0, 0, 0, 133, 741, 1, 0, 0, 0, 135, 754, 1, 0, 0, 0, 137, 766, 1, 0, 0, 0, 139, 778, 1, 0, 0, 0, 141, 783, 1, 0, 0, 0, 143, 791, 1, 0, 0, 0, 145, 796, 1, 0, 0, 0, 147, 809, 1, 0, 0, 0, 149, 817, 1, 0, 0, 0, 151, 826, 1, 0, 0, 0, 153, 840, 1, 0, 0, 0, 155, 849, 1, 0, 0, 0, 157, 854, 1, 0, 0, 0, 159, 861, 1, 0, 0, 0, 161, 866, 1, 0, 0, 0, 163, 872, 1, 0, 0, 0, 165, 879, 1, 0, 0, 0, 167, 885, 1, 0, 0, 0, 169, 891, 1, 0, 0, 0, 171, 898, 1, 0, 0, 0, 173, 905, 1, 0, 0, 0, 175, 912, 1, 0, 0, 0, 177, 917, 1, 0, 0, 0, 179, 923, 1, 0, 0, 0, 181, 928, 1, 0, 0, 0, 183, 931, 1, 0, 0, 0, 185, 933, 1, 0, 0, 0, 187, 935, 1, 0, 0, 0, 189, 937, 1, 0, 0, 0, 191, 939, 1, 0, 0, 0, 193, 941, 1, 0, 0, 0, 195, 943, 1, 0, 0, 0, 197, 945, 1, 0, 0, 0, 199, 947, 1, 0, 0, 0, 201, 949, 1, 0, 0, 0, 203, 951, 1, 0, 0, 0, 205, 953, 1, 0, 0, 0, 207, 956, 1, 0, 0, 0, 209, 964, 1, 0, 0, 0, 211, 995, 1, 0, 0, 0, 213, 1002, 1, 0, 0, 0, 215, 1012, 1, 0, 0, 0, 217, 1022, 1, 0, 0, 0, 219, 1024, 1, 0, 0, 0, 221, 1035, 1, 0, 0, 0, 223, 1050, 1, 0, 0, 0, 225, 226, 5, 119, 0, 0, 226, 227, 5, 111, 0, 0, 227, 228, 5, 114, 0, 0, 228, 229, 5, 107, 0, 0, 229, 230, 5, 115, 0, 0, 230, 231, 5, 112, 0, 0, 231, 232, 5, 97, 0, 0, 232, 233, 5, 99, 0, 0, 233, 234, 5, 101, 0, 0, 234, 2, 1, 0, 0, 0, 235, 236, 5, 102, 0, 0, 236, 237, 5, 114, 0, 0, 237, 238, 5, 97, 0, 0, 238, 239, 5, 103, 0, 0, 239, 240, 5, 109, 0, 0, 240, 241, 5, 101, 0, 0, 241, 242, 5, 110, 0, 0, 242, 243, 5, 116, 0, 0, 243, 4, 1, 0, 0, 0, 244, 245, 5, 105, 0, 0, 245, 246, 5, 109, 0, 0, 246, 247, 5, 112, 0, 0, 247, 248, 5, 111, 0, 0, 248, 249, 5, 114, 0, 0, 249, 250, 5, 116, 0, 0, 250, 6, 1, 0, 0, 0, 251, 252, 5, 101, 0, 0, 252, 253, 5, 120, 0, 0, 253, 254, 5, 116, 0, 0, 254, 255, 5, 101, 0, 0, 255, 256, 5, 114, 0, 0, 256, 257, 5, 110, 0, 0, 257, 258, 5, 97, 0, 0, 258, 259, 5, 108, 0, 0, 259, 8, 1, 0, 0, 0, 260, 261, 5, 97, 0, 0, 261, 262, 5, 116, 0, 0, 262, 263, 5, 111, 0, 0, 263, 264, 5, 109, 0, 0, 264, 10, 1, 0, 0, 0, 265, 266, 5, 105, 0, 0, 266, 267, 5, 110, 0, 0, 267, 268, 5, 116, 0, 0, 268, 269, 5, 101, 0, 0, 269, 270, 5, 114, 0, 0, 270, 271, 5, 102, 0, 0, 271, 272, 5, 97, 0, 0, 272, 273, 5, 99, 0, 0, 273, 274, 5, 101, 0, 0, 274, 12, 1, 0, 0, 0, 275, 276, 5, 105, 0, 0, 276, 277, 5, 110, 0, 0, 277, 278, 5, 116, 0, 0, 278, 279, 5, 101, 0, 0, 279, 280, 5, 114, 0, 0, 280, 281, 5, 102, 0, 0, 281, 282, 5, 97, 0, 0, 282, 283, 5, 99, 0, 0, 283, 284, 5, 101, 0, 0, 284, 285, 5, 115, 0, 0, 285, 14, 1, 0, 0, 0, 286, 287, 5, 112, 0, 0, 287, 288, 5, 97, 0, 0, 288, 289, 5, 99, 0, 0, 289, 290, 5, 107, 0, 0, 290, 291, 5, 97, 0, 0, 291, 292, 5, 103, 0, 0, 292, 293, 5, 101, 0, 0, 293, 16, 1, 0, 0, 0, 294, 295, 5, 118, 0, 0, 295, 296, 5, 97, 0, 0, 296, 297, 5, 108, 0, 0, 297, 298, 5, 117, 0, 0, 298, 299, 5, 101, 0, 0, 299, 18, 1, 0, 0, 0, 300, 301, 5, 114, 0, 0, 301, 302, 5, 101, 0, 0, 302, 303, 5, 108, 0, 0, 303, 304, 5, 97, 0, 0, 304, 305, 5, 116, 0, 0, 305, 306, 5, 105, 0, 0, 306, 307, 5, 111, 0, 0, 307, 308, 5, 110, 0, 0, 308, 20, 1, 0, 0, 0, 309, 310, 5, 111, 0, 0, 310, 311, 5, 112, 0, 0, 311, 312, 5, 101, 0, 0, 312, 313, 5, 114, 0, 0, 313, 314, 5, 97, 0, 0, 314, 315, 5, 116, 0, 0, 315, 316, 5, 105, 0, 0, 316, 317, 5, 111, 0, 0, 317, 318, 5, 110, 0, 0, 318, 22, 1, 0, 0, 0, 319, 320, 5, 102, 0, 0, 320, 321, 5, 117, 0, 0, 321, 322, 5, 110, 0, 0, 322, 323, 5, 99, 0, 0, 323, 324, 5, 116, 0, 0, 324, 325, 5, 105, 0, 0, 325, 326, 5, 111, 0, 0, 326, 327, 5, 110, 0, 0, 327, 24, 1, 0, 0, 0, 328, 329, 5, 99, 0, 0, 329, 330, 5, 111, 0, 0, 330, 331, 5, 110, 0, 0, 331, 332, 5, 115, 0, 0, 332, 333, 5, 116, 0, 0, 333, 334, 5, 114, 0, 0, 334, 335, 5, 117, 0, 0, 335, 336, 5, 99, 0, 0, 336, 337, 5, 116, 0, 0, 337, 338, 5, 111, 0, 0, 338, 339, 5, 114, 0, 0, 339, 26, 1, 0, 0, 0, 340, 341, 5, 99, 0, 0, 341, 342, 5, 111, 0, 0, 342, 343, 5, 110, 0, 0, 343, 344, 5, 115, 0, 0, 344, 345, 5, 116, 0, 0, 345, 346, 5, 114, 0, 0, 346, 347, 5, 117, 0, 0, 347, 348, 5, 99, 0, 0, 348, 349, 5, 116, 0, 0, 349, 350, 5, 115, 0, 0, 350, 28, 1, 0, 0, 0, 351, 352, 5, 105, 0, 0, 352, 353, 5, 110, 0, 0, 353, 354, 5, 112, 0, 0, 354, 355, 5, 117, 0, 0, 355, 356, 5, 116, 0, 0, 356, 30, 1, 0, 0, 0, 357, 358, 5, 99, 0, 0, 358, 359, 5, 111, 0, 0, 359, 360, 5, 110, 0, 0, 360, 361, 5, 102, 0, 0, 361, 362, 5, 111, 0, 0, 362, 363, 5, 114, 0, 0, 363, 364, 5, 109, 0, 0, 364, 32, 1, 0, 0, 0, 365, 366, 5, 97, 0, 0, 366, 367, 5, 115, 0, 0, 367, 34, 1, 0, 0, 0, 368, 369, 5, 98, 0, 0, 369, 370, 5, 105, 0, 0, 370, 371, 5, 110, 0, 0, 371, 372, 5, 100, 0, 0, 372, 36, 1, 0, 0, 0, 373, 374, 5, 116, 0, 0, 374, 375, 5, 111, 0, 0, 375, 38, 1, 0, 0, 0, 376, 377, 5, 112, 0, 0, 377, 378, 5, 114, 0, 0, 378, 379, 5, 105, 0, 0, 379, 380, 5, 118, 0, 0, 380, 381, 5, 97, 0, 0, 381, 382, 5, 116, 0, 0, 382, 383, 5, 101, 0, 0, 383, 40, 1, 0, 0, 0, 384, 385, 5, 115, 0, 0, 385, 386, 5, 104, 0, 0, 386, 387, 5, 97, 0, 0, 387, 388, 5, 114, 0, 0, 388, 389, 5, 101, 0, 0, 389, 390, 5, 100, 0, 0, 390, 42, 1, 0, 0, 0, 391, 392, 5, 115, 0, 0, 392, 393, 5, 116, 0, 0, 393, 394, 5, 97, 0, 0, 394, 395, 5, 116, 0, 0, 395, 396, 5, 101, 0, 0, 396, 44, 1, 0, 0, 0, 397, 398, 5, 101, 0, 0, 398, 399, 5, 100, 0, 0, 399, 400, 5, 103, 0, 0, 400, 401, 5, 101, 0, 0, 401, 46, 1, 0, 0, 0, 402, 403, 5, 112, 0, 0, 403, 404, 5, 114, 0, 0, 404, 405, 5, 111, 0, 0, 405, 406, 5, 106, 0, 0, 406, 407, 5, 101, 0, 0, 407, 408, 5, 99, 0, 0, 408, 409, 5, 116, 0, 0, 409, 410, 5, 105, 0, 0, 410, 411, 5, 111, 0, 0, 411, 412, 5, 110, 0, 0, 412, 48, 1, 0, 0, 0, 413, 414, 5, 119, 0, 0, 414, 415, 5, 105, 0, 0, 415, 416, 5, 116, 0, 0, 416, 417, 5, 104, 0, 0, 417, 50, 1, 0, 0, 0, 418, 419, 5, 117, 0, 0, 419, 420, 5, 115, 0, 0, 420, 421, 5, 105, 0, 0, 421, 422, 5, 110, 0, 0, 422, 423, 5, 103, 0, 0, 423, 52, 1, 0, 0, 0, 424, 425, 5, 118, 0, 0, 425, 426, 5, 105, 0, 0, 426, 427, 5, 97, 0, 0, 427, 54, 1, 0, 0, 0, 428, 429, 5, 109, 0, 0, 429, 430, 5, 97, 0, 0, 430, 431, 5, 116, 0, 0, 431, 432, 5, 101, 0, 0, 432, 433, 5, 114, 0, 0, 433, 434, 5, 105, 0, 0, 434, 435, 5, 97, 0, 0, 435, 436, 5, 108, 0, 0, 436, 437, 5, 105, 0, 0, 437, 438, 5, 122, 0, 0, 438, 439, 5, 101, 0, 0, 439, 56, 1, 0, 0, 0, 440, 441, 5, 105, 0, 0, 441, 442, 5, 102, 0, 0, 442, 58, 1, 0, 0, 0, 443, 444, 5, 97, 0, 0, 444, 445, 5, 98, 0, 0, 445, 446, 5, 115, 0, 0, 446, 447, 5, 101, 0, 0, 447, 448, 5, 110, 0, 0, 448, 449, 5, 116, 0, 0, 449, 60, 1, 0, 0, 0, 450, 451, 5, 111, 0, 0, 451, 452, 5, 110, 0, 0, 452, 62, 1, 0, 0, 0, 453, 454, 5, 112, 0, 0, 454, 455, 5, 111, 0, 0, 455, 456, 5, 108, 0, 0, 456, 457, 5, 105, 0, 0, 457, 458, 5, 99, 0, 0, 458, 459, 5, 121, 0, 0, 459, 64, 1, 0, 0, 0, 460, 461, 5, 100, 0, 0, 461, 462, 5, 101, 0, 0, 462, 463, 5, 102, 0, 0, 463, 464, 5, 97, 0, 0, 464, 465, 5, 117, 0, 0, 465, 466, 5, 108, 0, 0, 466, 467, 5, 116, 0, 0, 467, 66, 1, 0, 0, 0, 468, 469, 5, 115, 0, 0, 469, 470, 5, 111, 0, 0, 470, 471, 5, 117, 0, 0, 471, 472, 5, 114, 0, 0, 472, 473, 5, 99, 0, 0, 473, 474, 5, 101, 0, 0, 474, 68, 1, 0, 0, 0, 475, 476, 5, 114, 0, 0, 476, 477, 5, 101, 0, 0, 477, 478, 5, 112, 0, 0, 478, 479, 5, 111, 0, 0, 479, 480, 5, 115, 0, 0, 480, 481, 5, 105, 0, 0, 481, 482, 5, 116, 0, 0, 482, 483, 5, 111, 0, 0, 483, 484, 5, 114, 0, 0, 484, 485, 5, 121, 0, 0, 485, 70, 1, 0, 0, 0, 486, 487, 5, 99, 0, 0, 487, 488, 5, 111, 0, 0, 488, 489, 5, 109, 0, 0, 489, 490, 5, 109, 0, 0, 490, 491, 5, 105, 0, 0, 491, 492, 5, 116, 0, 0, 492, 72, 1, 0, 0, 0, 493, 494, 5, 114, 0, 0, 494, 495, 5, 101, 0, 0, 495, 496, 5, 118, 0, 0, 496, 497, 5, 105, 0, 0, 497, 498, 5, 115, 0, 0, 498, 499, 5, 105, 0, 0, 499, 500, 5, 111, 0, 0, 500, 501, 5, 110, 0, 0, 501, 74, 1, 0, 0, 0, 502, 503, 5, 115, 0, 0, 503, 504, 5, 101, 0, 0, 504, 505, 5, 109, 0, 0, 505, 506, 5, 97, 0, 0, 506, 507, 5, 110, 0, 0, 507, 508, 5, 116, 0, 0, 508, 509, 5, 105, 0, 0, 509, 510, 5, 99, 0, 0, 510, 511, 5, 45, 0, 0, 511, 512, 5, 109, 0, 0, 512, 513, 5, 97, 0, 0, 513, 514, 5, 106, 0, 0, 514, 515, 5, 111, 0, 0, 515, 516, 5, 114, 0, 0, 516, 76, 1, 0, 0, 0, 517, 518, 5, 111, 0, 0, 518, 519, 5, 110, 0, 0, 519, 520, 5, 45, 0, 0, 520, 521, 5, 100, 0, 0, 521, 522, 5, 101, 0, 0, 522, 523, 5, 108, 0, 0, 523, 524, 5, 101, 0, 0, 524, 525, 5, 116, 0, 0, 525, 526, 5, 101, 0, 0, 526, 78, 1, 0, 0, 0, 527, 528, 5, 114, 0, 0, 528, 529, 5, 101, 0, 0, 529, 530, 5, 116, 0, 0, 530, 531, 5, 97, 0, 0, 531, 532, 5, 105, 0, 0, 532, 533, 5, 110, 0, 0, 533, 534, 5, 45, 0, 0, 534, 535, 5, 111, 0, 0, 535, 536, 5, 116, 0, 0, 536, 537, 5, 104, 0, 0, 537, 538, 5, 101, 0, 0, 538, 539, 5, 114, 0, 0, 539, 80, 1, 0, 0, 0, 540, 541, 5, 107, 0, 0, 541, 542, 5, 101, 0, 0, 542, 543, 5, 121, 0, 0, 543, 544, 5, 101, 0, 0, 544, 545, 5, 100, 0, 0, 545, 82, 1, 0, 0, 0, 546, 547, 5, 112, 0, 0, 547, 548, 5, 117, 0, 0, 548, 549, 5, 98, 0, 0, 549, 550, 5, 108, 0, 0, 550, 551, 5, 105, 0, 0, 551, 552, 5, 99, 0, 0, 552, 553, 5, 45, 0, 0, 553, 554, 5, 116, 0, 0, 554, 555, 5, 114, 0, 0, 555, 556, 5, 97, 0, 0, 556, 557, 5, 118, 0, 0, 557, 558, 5, 101, 0, 0, 558, 559, 5, 114, 0, 0, 559, 560, 5, 115, 0, 0, 560, 561, 5, 97, 0, 0, 561, 562, 5, 108, 0, 0, 562, 84, 1, 0, 0, 0, 563, 564, 5, 105, 0, 0, 564, 565, 5, 100, 0, 0, 565, 86, 1, 0, 0, 0, 566, 567, 5, 100, 0, 0, 567, 568, 5, 111, 0, 0, 568, 569, 5, 99, 0, 0, 569, 88, 1, 0, 0, 0, 570, 571, 5, 109, 0, 0, 571, 572, 5, 111, 0, 0, 572, 573, 5, 100, 0, 0, 573, 574, 5, 101, 0, 0, 574, 90, 1, 0, 0, 0, 575, 576, 5, 101, 0, 0, 576, 577, 5, 109, 0, 0, 577, 578, 5, 105, 0, 0, 578, 579, 5, 116, 0, 0, 579, 580, 5, 115, 0, 0, 580, 92, 1, 0, 0, 0, 581, 582, 5, 114, 0, 0, 582, 583, 5, 101, 0, 0, 583, 584, 5, 99, 0, 0, 584, 585, 5, 101, 0, 0, 585, 586, 5, 105, 0, 0, 586, 587, 5, 118, 0, 0, 587, 588, 5, 101, 0, 0, 588, 589, 5, 114, 0, 0, 589, 94, 1, 0, 0, 0, 590, 591, 5, 114, 0, 0, 591, 592, 5, 101, 0, 0, 592, 593, 5, 113, 0, 0, 593, 594, 5, 117, 0, 0, 594, 595, 5, 105, 0, 0, 595, 596, 5, 114, 0, 0, 596, 597, 5, 101, 0, 0, 597, 598, 5, 115, 0, 0, 598, 96, 1, 0, 0, 0, 599, 600, 5, 97, 0, 0, 600, 601, 5, 110, 0, 0, 601, 602, 5, 121, 0, 0, 602, 98, 1, 0, 0, 0, 603, 604, 5, 103, 0, 0, 604, 605, 5, 101, 0, 0, 605, 606, 5, 116, 0, 0, 606, 100, 1, 0, 0, 0, 607, 608, 5, 115, 0, 0, 608, 609, 5, 101, 0, 0, 609, 610, 5, 116, 0, 0, 610, 102, 1, 0, 0, 0, 611, 612, 5, 119, 0, 0, 612, 613, 5, 97, 0, 0, 613, 614, 5, 116, 0, 0, 614, 615, 5, 99, 0, 0, 615, 616, 5, 104, 0, 0, 616, 104, 1, 0, 0, 0, 617, 618, 5, 115, 0, 0, 618, 619, 5, 116, 0, 0, 619, 620, 5, 97, 0, 0, 620, 621, 5, 114, 0, 0, 621, 622, 5, 116, 0, 0, 622, 106, 1, 0, 0, 0, 623, 624, 5, 115, 0, 0, 624, 625, 5, 116, 0, 0, 625, 626, 5, 111, 0, 0, 626, 627, 5, 112, 0, 0, 627, 108, 1, 0, 0, 0, 628, 629, 5, 114, 0, 0, 629, 630, 5, 101, 0, 0, 630, 631, 5, 97, 0, 0, 631, 632, 5, 100, 0, 0, 632, 110, 1, 0, 0, 0, 633, 634, 5, 119, 0, 0, 634, 635, 5, 114, 0, 0, 635, 636, 5, 105, 0, 0, 636, 637, 5, 116, 0, 0, 637, 638, 5, 101, 0, 0, 638, 112, 1, 0, 0, 0, 639, 640, 5, 114, 0, 0, 640, 641, 5, 101, 0, 0, 641, 642, 5, 115, 0, 0, 642, 643, 5, 111, 0, 0, 643, 644, 5, 108, 0, 0, 644, 645, 5, 118, 0, 0, 645, 646, 5, 101, 0, 0, 646, 114, 1, 0, 0, 0, 647, 648, 5, 99, 0, 0, 648, 649, 5, 111, 0, 0, 649, 650, 5, 110, 0, 0, 650, 651, 5, 110, 0, 0, 651, 652, 5, 101, 0, 0, 652, 653, 5, 99, 0, 0, 653, 654, 5, 116, 0, 0, 654, 116, 1, 0, 0, 0, 655, 656, 5, 100, 0, 0, 656, 657, 5, 105, 0, 0, 657, 658, 5, 115, 0, 0, 658, 659, 5, 99, 0, 0, 659, 660, 5, 111, 0, 0, 660, 661, 5, 110, 0, 0, 661, 662, 5, 110, 0, 0, 662, 663, 5, 101, 0, 0, 663, 664, 5, 99, 0, 0, 664, 665, 5, 116, 0, 0, 665, 118, 1, 0, 0, 0, 666, 667, 5, 99, 0, 0, 667, 668, 5, 97, 0, 0, 668, 669, 5, 108, 0, 0, 669, 670, 5, 108, 0, 0, 670, 120, 1, 0, 0, 0, 671, 672, 5, 119, 0, 0, 672, 673, 5, 97, 0, 0, 673, 674, 5, 116, 0, 0, 674, 675, 5, 99, 0, 0, 675, 676, 5, 104, 0, 0, 676, 677, 5, 45, 0, 0, 677, 678, 5, 115, 0, 0, 678, 679, 5, 116, 0, 0, 679, 680, 5, 97, 0, 0, 680, 681, 5, 114, 0, 0, 681, 682, 5, 116, 0, 0, 682, 122, 1, 0, 0, 0, 683, 684, 5, 119, 0, 0, 684, 685, 5, 97, 0, 0, 685, 686, 5, 116, 0, 0, 686, 687, 5, 99, 0, 0, 687, 688, 5, 104, 0, 0, 688, 689, 5, 45, 0, 0, 689, 690, 5, 115, 0, 0, 690, 691, 5, 116, 0, 0, 691, 692, 5, 111, 0, 0, 692, 693, 5, 112, 0, 0, 693, 124, 1, 0, 0, 0, 694, 695, 5, 115, 0, 0, 695, 696, 5, 117, 0, 0, 696, 697, 5, 98, 0, 0, 697, 698, 5, 115, 0, 0, 698, 699, 5, 99, 0, 0, 699, 700, 5, 114, 0, 0, 700, 701, 5, 105, 0, 0, 701, 702, 5, 98, 0, 0, 702, 703, 5, 101, 0, 0, 703, 126, 1, 0, 0, 0, 704, 705, 5, 117, 0, 0, 705, 706, 5, 110, 0, 0, 706, 707, 5, 115, 0, 0, 707, 708, 5, 117, 0, 0, 708, 709, 5, 98, 0, 0, 709, 710, 5, 115, 0, 0, 710, 711, 5, 99, 0, 0, 711, 712, 5, 114, 0, 0, 712, 713, 5, 105, 0, 0, 713, 714, 5, 98, 0, 0, 714, 715, 5, 101, 0, 0, 715, 128, 1, 0, 0, 0, 716, 717, 5, 111, 0, 0, 717, 718, 5, 112, 0, 0, 718, 719, 5, 116, 0, 0, 719, 720, 5, 105, 0, 0, 720, 721, 5, 109, 0, 0, 721, 722, 5, 105, 0, 0, 722, 723, 5, 115, 0, 0, 723, 724, 5, 116, 0, 0, 724, 725, 5, 105, 0, 0, 725, 726, 5, 99, 0, 0, 726, 727, 5, 45, 0, 0, 727, 728, 5, 114, 0, 0, 728, 729, 5, 101, 0, 0, 729, 730, 5, 103, 0, 0, 730, 731, 5, 105, 0, 0, 731, 732, 5, 115, 0, 0, 732, 733, 5, 116, 0, 0, 733, 734, 5, 101, 0, 0, 734, 735, 5, 114, 0, 0, 735, 130, 1, 0, 0, 0, 736, 737, 5, 99, 0, 0, 737, 738, 5, 114, 0, 0, 738, 739, 5, 100, 0, 0, 739, 740, 5, 116, 0, 0, 740, 132, 1, 0, 0, 0, 741, 742, 5, 111, 0, 0, 742, 743, 5, 112, 0, 0, 743, 744, 5, 116, 0, 0, 744, 745, 5, 105, 0, 0, 745, 746, 5, 111, 0, 0, 746, 747, 5, 110, 0, 0, 747, 748, 5, 97, 0, 0, 748, 749, 5, 108, 0, 0, 749, 750, 5, 45, 0, 0, 750, 751, 5, 111, 0, 0, 751, 752, 5, 110, 0, 0, 752, 753, 5, 101, 0, 0, 753, 134, 1, 0, 0, 0, 754, 755, 5, 101, 0, 0, 755, 756, 5, 120, 0, 0, 756, 757, 5, 97, 0, 0, 757, 758, 5, 99, 0, 0, 758, 759, 5, 116, 0, 0, 759, 760, 5, 108, 0, 0, 760, 761, 5, 121, 0, 0, 761, 762, 5, 45, 0, 0, 762, 763, 5, 111, 0, 0, 763, 764, 5, 110, 0, 0, 764, 765, 5, 101, 0, 0, 765, 136, 1, 0, 0, 0, 766, 767, 5, 109, 0, 0, 767, 768, 5, 97, 0, 0, 768, 769, 5, 110, 0, 0, 769, 770, 5, 121, 0, 0, 770, 771, 5, 45, 0, 0, 771, 772, 5, 117, 0, 0, 772, 773, 5, 110, 0, 0, 773, 774, 5, 105, 0, 0, 774, 775, 5, 113, 0, 0, 775, 776, 5, 117, 0, 0, 776, 777, 5, 101, 0, 0, 777, 138, 1, 0, 0, 0, 778, 779, 5, 109, 0, 0, 779, 780, 5, 97, 0, 0, 780, 781, 5, 110, 0, 0, 781, 782, 5, 121, 0, 0, 782, 140, 1, 0, 0, 0, 783, 784, 5, 111, 0, 0, 784, 785, 5, 114, 0, 0, 785, 786, 5, 100, 0, 0, 786, 787, 5, 101, 0, 0, 787, 788, 5, 114, 0, 0, 788, 789, 5, 101, 0, 0, 789, 790, 5, 100, 0, 0, 790, 142, 1, 0, 0, 0, 791, 792, 5, 117, 0, 0, 792, 793, 5, 110, 0, 0, 793, 794, 5, 105, 0, 0, 794, 795, 5, 116, 0, 0, 795, 144, 1, 0, 0, 0, 796, 797, 5, 119, 0, 0, 797, 798, 5, 97, 0, 0, 798, 799, 5, 116, 0, 0, 799, 800, 5, 99, 0, 0, 800, 801, 5, 104, 0, 0, 801, 802, 5, 45, 0, 0, 802, 803, 5, 104, 0, 0, 803, 804, 5, 97, 0, 0, 804, 805, 5, 110, 0, 0, 805, 806, 5, 100, 0, 0, 806, 807, 5, 108, 0, 0, 807, 808, 5, 101, 0, 0, 808, 146, 1, 0, 0, 0, 809, 810, 5, 109, 0, 0, 810, 811, 5, 101, 0, 0, 811, 812, 5, 115, 0, 0, 812, 813, 5, 115, 0, 0, 813, 814, 5, 97, 0, 0, 814, 815, 5, 103, 0, 0, 815, 816, 5, 101, 0, 0, 816, 148, 1, 0, 0, 0, 817, 818, 5, 97, 0, 0, 818, 819, 5, 116, 0, 0, 819, 820, 5, 111, 0, 0, 820, 821, 5, 109, 0, 0, 821, 822, 5, 45, 0, 0, 822, 823, 5, 114, 0, 0, 823, 824, 5, 101, 0, 0, 824, 825, 5, 102, 0, 0, 825, 150, 1, 0, 0, 0, 826, 827, 5, 105, 0, 0, 827, 828, 5, 110, 0, 0, 828, 829, 5, 116, 0, 0, 829, 830, 5, 101, 0, 0, 830, 831, 5, 114, 0, 0, 831, 832, 5, 102, 0, 0, 832, 833, 5, 97, 0, 0, 833, 834, 5, 99, 0, 0, 834, 835, 5, 101, 0, 0, 835, 836, 5, 45, 0, 0, 836, 837, 5, 114, 0, 0, 837, 838, 5, 101, 0, 0, 838, 839, 5, 102, 0, 0, 839, 152, 1, 0, 0, 0, 840, 841, 5, 111, 0, 0, 841, 842, 5, 112, 0, 0, 842, 843, 5, 116, 0, 0, 843, 844, 5, 105, 0, 0, 844, 845, 5, 111, 0, 0, 845, 846, 5, 110, 0, 0, 846, 847, 5, 97, 0, 0, 847, 848, 5, 108, 0, 0, 848, 154, 1, 0, 0, 0, 849, 850, 5, 108, 0, 0, 850, 851, 5, 105, 0, 0, 851, 852, 5, 115, 0, 0, 852, 853, 5, 116, 0, 0, 853, 156, 1, 0, 0, 0, 854, 855, 5, 114, 0, 0, 855, 856, 5, 101, 0, 0, 856, 857, 5, 99, 0, 0, 857, 858, 5, 111, 0, 0, 858, 859, 5, 114, 0, 0, 859, 860, 5, 100, 0, 0, 860, 158, 1, 0, 0, 0, 861, 862, 5, 98, 0, 0, 862, 863, 5, 111, 0, 0, 863, 864, 5, 111, 0, 0, 864, 865, 5, 108, 0, 0, 865, 160, 1, 0, 0, 0, 866, 867, 5, 98, 0, 0, 867, 868, 5, 121, 0, 0, 868, 869, 5, 116, 0, 0, 869, 870, 5, 101, 0, 0, 870, 871, 5, 115, 0, 0, 871, 162, 1, 0, 0, 0, 872, 873, 5, 100, 0, 0, 873, 874, 5, 111, 0, 0, 874, 875, 5, 117, 0, 0, 875, 876, 5, 98, 0, 0, 876, 877, 5, 108, 0, 0, 877, 878, 5, 101, 0, 0, 878, 164, 1, 0, 0, 0, 879, 880, 5, 105, 0, 0, 880, 881, 5, 110, 0, 0, 881, 882, 5, 116, 0, 0, 882, 883, 5, 51, 0, 0, 883, 884, 5, 50, 0, 0, 884, 166, 1, 0, 0, 0, 885, 886, 5, 105, 0, 0, 886, 887, 5, 110, 0, 0, 887, 888, 5, 116, 0, 0, 888, 889, 5, 54, 0, 0, 889, 890, 5, 52, 0, 0, 890, 168, 1, 0, 0, 0, 891, 892, 5, 115, 0, 0, 892, 893, 5, 116, 0, 0, 893, 894, 5, 114, 0, 0, 894, 895, 5, 105, 0, 0, 895, 896, 5, 110, 0, 0, 896, 897, 5, 103, 0, 0, 897, 170, 1, 0, 0, 0, 898, 899, 5, 117, 0, 0, 899, 900, 5, 105, 0, 0, 900, 901, 5, 110, 0, 0, 901, 902, 5, 116, 0, 0, 902, 903, 5, 51, 0, 0, 903, 904, 5, 50, 0, 0, 904, 172, 1, 0, 0, 0, 905, 906, 5, 117, 0, 0, 906, 907, 5, 105, 0, 0, 907, 908, 5, 110, 0, 0, 908, 909, 5, 116, 0, 0, 909, 910, 5, 54, 0, 0, 910, 911, 5, 52, 0, 0, 911, 174, 1, 0, 0, 0, 912, 913, 5, 116, 0, 0, 913, 914, 5, 114, 0, 0, 914, 915, 5, 117, 0, 0, 915, 916, 5, 101, 0, 0, 916, 176, 1, 0, 0, 0, 917, 918, 5, 102, 0, 0, 918, 919, 5, 97, 0, 0, 919, 920, 5, 108, 0, 0, 920, 921, 5, 115, 0, 0, 921, 922, 5, 101, 0, 0, 922, 178, 1, 0, 0, 0, 923, 924, 5, 110, 0, 0, 924, 925, 5, 117, 0, 0, 925, 926, 5, 108, 0, 0, 926, 927, 5, 108, 0, 0, 927, 180, 1, 0, 0, 0, 928, 929, 5, 45, 0, 0, 929, 930, 5, 62, 0, 0, 930, 182, 1, 0, 0, 0, 931, 932, 5, 58, 0, 0, 932, 184, 1, 0, 0, 0, 933, 934, 5, 59, 0, 0, 934, 186, 1, 0, 0, 0, 935, 936, 5, 44, 0, 0, 936, 188, 1, 0, 0, 0, 937, 938, 5, 46, 0, 0, 938, 190, 1, 0, 0, 0, 939, 940, 5, 123, 0, 0, 940, 192, 1, 0, 0, 0, 941, 942, 5, 125, 0, 0, 942, 194, 1, 0, 0, 0, 943, 944, 5, 91, 0, 0, 944, 196, 1, 0, 0, 0, 945, 946, 5, 93, 0, 0, 946, 198, 1, 0, 0, 0, 947, 948, 5, 40, 0, 0, 948, 200, 1, 0, 0, 0, 949, 950, 5, 41, 0, 0, 950, 202, 1, 0, 0, 0, 951, 952, 5, 60, 0, 0, 952, 204, 1, 0, 0, 0, 953, 954, 5, 62, 0, 0, 954, 206, 1, 0, 0, 0, 955, 957, 5, 45, 0, 0, 956, 955, 1, 0, 0, 0, 956, 957, 1, 0, 0, 0, 957, 959, 1, 0, 0, 0, 958, 960, 7, 0, 0, 0, 959, 958, 1, 0, 0, 0, 960, 961, 1, 0, 0, 0, 961, 959, 1, 0, 0, 0, 961, 962, 1, 0, 0, 0, 962, 208, 1, 0, 0, 0, 963, 965, 5, 45, 0, 0, 964, 963, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, 965, 974, 1, 0, 0, 0, 966, 975, 5, 48, 0, 0, 967, 971, 7, 1, 0, 0, 968, 970, 7, 0, 0, 0, 969, 968, 1, 0, 0, 0, 970, 973, 1, 0, 0, 0, 971, 969, 1, 0, 0, 0, 971, 972, 1, 0, 0, 0, 972, 975, 1, 0, 0, 0, 973, 971, 1, 0, 0, 0, 974, 966, 1, 0, 0, 0, 974, 967, 1, 0, 0, 0, 975, 982, 1, 0, 0, 0, 976, 978, 5, 46, 0, 0, 977, 979, 7, 0, 0, 0, 978, 977, 1, 0, 0, 0, 979, 980, 1, 0, 0, 0, 980, 978, 1, 0, 0, 0, 980, 981, 1, 0, 0, 0, 981, 983, 1, 0, 0, 0, 982, 976, 1, 0, 0, 0, 982, 983, 1, 0, 0, 0, 983, 993, 1, 0, 0, 0, 984, 986, 7, 2, 0, 0, 985, 987, 7, 3, 0, 0, 986, 985, 1, 0, 0, 0, 986, 987, 1, 0, 0, 0, 987, 989, 1, 0, 0, 0, 988, 990, 7, 0, 0, 0, 989, 988, 1, 0, 0, 0, 990, 991, 1, 0, 0, 0, 991, 989, 1, 0, 0, 0, 991, 992, 1, 0, 0, 0, 992, 994, 1, 0, 0, 0, 993, 984, 1, 0, 0, 0, 993, 994, 1, 0, 0, 0, 994, 210, 1, 0, 0, 0, 995, 999, 7, 4, 0, 0, 996, 998, 7, 5, 0, 0, 997, 996, 1, 0, 0, 0, 998, 1001, 1, 0, 0, 0, 999, 997, 1, 0, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 212, 1, 0, 0, 0, 1001, 999, 1, 0, 0, 0, 1002, 1007, 5, 34, 0, 0, 1003, 1006, 3, 215, 107, 0, 1004, 1006, 8, 6, 0, 0, 1005, 1003, 1, 0, 0, 0, 1005, 1004, 1, 0, 0, 0, 1006, 1009, 1, 0, 0, 0, 1007, 1005, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1010, 1, 0, 0, 0, 1009, 1007, 1, 0, 0, 0, 1010, 1011, 5, 34, 0, 0, 1011, 214, 1, 0, 0, 0, 1012, 1020, 5, 92, 0, 0, 1013, 1021, 7, 7, 0, 0, 1014, 1015, 5, 117, 0, 0, 1015, 1016, 3, 217, 108, 0, 1016, 1017, 3, 217, 108, 0, 1017, 1018, 3, 217, 108, 0, 1018, 1019, 3, 217, 108, 0, 1019, 1021, 1, 0, 0, 0, 1020, 1013, 1, 0, 0, 0, 1020, 1014, 1, 0, 0, 0, 1021, 216, 1, 0, 0, 0, 1022, 1023, 7, 8, 0, 0, 1023, 218, 1, 0, 0, 0, 1024, 1025, 5, 47, 0, 0, 1025, 1026, 5, 47, 0, 0, 1026, 1030, 1, 0, 0, 0, 1027, 1029, 8, 9, 0, 0, 1028, 1027, 1, 0, 0, 0, 1029, 1032, 1, 0, 0, 0, 1030, 1028, 1, 0, 0, 0, 1030, 1031, 1, 0, 0, 0, 1031, 1033, 1, 0, 0, 0, 1032, 1030, 1, 0, 0, 0, 1033, 1034, 6, 109, 0, 0, 1034, 220, 1, 0, 0, 0, 1035, 1036, 5, 47, 0, 0, 1036, 1037, 5, 42, 0, 0, 1037, 1041, 1, 0, 0, 0, 1038, 1040, 9, 0, 0, 0, 1039, 1038, 1, 0, 0, 0, 1040, 1043, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1041, 1039, 1, 0, 0, 0, 1042, 1044, 1, 0, 0, 0, 1043, 1041, 1, 0, 0, 0, 1044, 1045, 5, 42, 0, 0, 1045, 1046, 5, 47, 0, 0, 1046, 1047, 1, 0, 0, 0, 1047, 1048, 6, 110, 0, 0, 1048, 222, 1, 0, 0, 0, 1049, 1051, 7, 10, 0, 0, 1050, 1049, 1, 0, 0, 0, 1051, 1052, 1, 0, 0, 0, 1052, 1050, 1, 0, 0, 0, 1052, 1053, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1055, 6, 111, 0, 0, 1055, 224, 1, 0, 0, 0, 18, 0, 956, 961, 964, 971, 974, 980, 982, 986, 991, 993, 999, 1005, 1007, 1020, 1030, 1041, 1052, 1, 0, 1, 0] \ No newline at end of file +[4, 0, 117, 1110, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 97, 1, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 100, 1, 100, 1, 101, 1, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 1, 106, 1, 107, 1, 107, 1, 108, 1, 108, 1, 109, 1, 109, 1, 110, 3, 110, 1011, 8, 110, 1, 110, 4, 110, 1014, 8, 110, 11, 110, 12, 110, 1015, 1, 111, 3, 111, 1019, 8, 111, 1, 111, 1, 111, 1, 111, 5, 111, 1024, 8, 111, 10, 111, 12, 111, 1027, 9, 111, 3, 111, 1029, 8, 111, 1, 111, 1, 111, 4, 111, 1033, 8, 111, 11, 111, 12, 111, 1034, 3, 111, 1037, 8, 111, 1, 111, 1, 111, 3, 111, 1041, 8, 111, 1, 111, 4, 111, 1044, 8, 111, 11, 111, 12, 111, 1045, 3, 111, 1048, 8, 111, 1, 112, 1, 112, 5, 112, 1052, 8, 112, 10, 112, 12, 112, 1055, 9, 112, 1, 113, 1, 113, 1, 113, 5, 113, 1060, 8, 113, 10, 113, 12, 113, 1063, 9, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 3, 114, 1075, 8, 114, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 5, 116, 1083, 8, 116, 10, 116, 12, 116, 1086, 9, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 5, 117, 1094, 8, 117, 10, 117, 12, 117, 1097, 9, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 4, 118, 1105, 8, 118, 11, 118, 12, 118, 1106, 1, 118, 1, 118, 1, 1095, 0, 119, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 0, 231, 0, 233, 115, 235, 116, 237, 117, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1124, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 1, 239, 1, 0, 0, 0, 3, 249, 1, 0, 0, 0, 5, 254, 1, 0, 0, 0, 7, 261, 1, 0, 0, 0, 9, 270, 1, 0, 0, 0, 11, 281, 1, 0, 0, 0, 13, 285, 1, 0, 0, 0, 15, 294, 1, 0, 0, 0, 17, 301, 1, 0, 0, 0, 19, 310, 1, 0, 0, 0, 21, 315, 1, 0, 0, 0, 23, 325, 1, 0, 0, 0, 25, 336, 1, 0, 0, 0, 27, 344, 1, 0, 0, 0, 29, 350, 1, 0, 0, 0, 31, 359, 1, 0, 0, 0, 33, 369, 1, 0, 0, 0, 35, 378, 1, 0, 0, 0, 37, 390, 1, 0, 0, 0, 39, 401, 1, 0, 0, 0, 41, 407, 1, 0, 0, 0, 43, 415, 1, 0, 0, 0, 45, 418, 1, 0, 0, 0, 47, 423, 1, 0, 0, 0, 49, 426, 1, 0, 0, 0, 51, 434, 1, 0, 0, 0, 53, 441, 1, 0, 0, 0, 55, 447, 1, 0, 0, 0, 57, 452, 1, 0, 0, 0, 59, 463, 1, 0, 0, 0, 61, 468, 1, 0, 0, 0, 63, 474, 1, 0, 0, 0, 65, 478, 1, 0, 0, 0, 67, 490, 1, 0, 0, 0, 69, 493, 1, 0, 0, 0, 71, 500, 1, 0, 0, 0, 73, 503, 1, 0, 0, 0, 75, 510, 1, 0, 0, 0, 77, 518, 1, 0, 0, 0, 79, 525, 1, 0, 0, 0, 81, 536, 1, 0, 0, 0, 83, 543, 1, 0, 0, 0, 85, 552, 1, 0, 0, 0, 87, 567, 1, 0, 0, 0, 89, 577, 1, 0, 0, 0, 91, 590, 1, 0, 0, 0, 93, 596, 1, 0, 0, 0, 95, 613, 1, 0, 0, 0, 97, 616, 1, 0, 0, 0, 99, 620, 1, 0, 0, 0, 101, 625, 1, 0, 0, 0, 103, 631, 1, 0, 0, 0, 105, 640, 1, 0, 0, 0, 107, 649, 1, 0, 0, 0, 109, 653, 1, 0, 0, 0, 111, 657, 1, 0, 0, 0, 113, 661, 1, 0, 0, 0, 115, 667, 1, 0, 0, 0, 117, 673, 1, 0, 0, 0, 119, 678, 1, 0, 0, 0, 121, 683, 1, 0, 0, 0, 123, 689, 1, 0, 0, 0, 125, 697, 1, 0, 0, 0, 127, 705, 1, 0, 0, 0, 129, 716, 1, 0, 0, 0, 131, 721, 1, 0, 0, 0, 133, 733, 1, 0, 0, 0, 135, 744, 1, 0, 0, 0, 137, 754, 1, 0, 0, 0, 139, 766, 1, 0, 0, 0, 141, 786, 1, 0, 0, 0, 143, 791, 1, 0, 0, 0, 145, 804, 1, 0, 0, 0, 147, 816, 1, 0, 0, 0, 149, 828, 1, 0, 0, 0, 151, 833, 1, 0, 0, 0, 153, 841, 1, 0, 0, 0, 155, 846, 1, 0, 0, 0, 157, 859, 1, 0, 0, 0, 159, 867, 1, 0, 0, 0, 161, 876, 1, 0, 0, 0, 163, 890, 1, 0, 0, 0, 165, 899, 1, 0, 0, 0, 167, 904, 1, 0, 0, 0, 169, 911, 1, 0, 0, 0, 171, 916, 1, 0, 0, 0, 173, 922, 1, 0, 0, 0, 175, 929, 1, 0, 0, 0, 177, 935, 1, 0, 0, 0, 179, 941, 1, 0, 0, 0, 181, 948, 1, 0, 0, 0, 183, 955, 1, 0, 0, 0, 185, 962, 1, 0, 0, 0, 187, 967, 1, 0, 0, 0, 189, 973, 1, 0, 0, 0, 191, 978, 1, 0, 0, 0, 193, 981, 1, 0, 0, 0, 195, 983, 1, 0, 0, 0, 197, 985, 1, 0, 0, 0, 199, 987, 1, 0, 0, 0, 201, 989, 1, 0, 0, 0, 203, 991, 1, 0, 0, 0, 205, 993, 1, 0, 0, 0, 207, 995, 1, 0, 0, 0, 209, 997, 1, 0, 0, 0, 211, 999, 1, 0, 0, 0, 213, 1001, 1, 0, 0, 0, 215, 1003, 1, 0, 0, 0, 217, 1005, 1, 0, 0, 0, 219, 1007, 1, 0, 0, 0, 221, 1010, 1, 0, 0, 0, 223, 1018, 1, 0, 0, 0, 225, 1049, 1, 0, 0, 0, 227, 1056, 1, 0, 0, 0, 229, 1066, 1, 0, 0, 0, 231, 1076, 1, 0, 0, 0, 233, 1078, 1, 0, 0, 0, 235, 1089, 1, 0, 0, 0, 237, 1104, 1, 0, 0, 0, 239, 240, 5, 119, 0, 0, 240, 241, 5, 111, 0, 0, 241, 242, 5, 114, 0, 0, 242, 243, 5, 107, 0, 0, 243, 244, 5, 115, 0, 0, 244, 245, 5, 112, 0, 0, 245, 246, 5, 97, 0, 0, 246, 247, 5, 99, 0, 0, 247, 248, 5, 101, 0, 0, 248, 2, 1, 0, 0, 0, 249, 250, 5, 116, 0, 0, 250, 251, 5, 121, 0, 0, 251, 252, 5, 112, 0, 0, 252, 253, 5, 101, 0, 0, 253, 4, 1, 0, 0, 0, 254, 255, 5, 111, 0, 0, 255, 256, 5, 98, 0, 0, 256, 257, 5, 106, 0, 0, 257, 258, 5, 101, 0, 0, 258, 259, 5, 99, 0, 0, 259, 260, 5, 116, 0, 0, 260, 6, 1, 0, 0, 0, 261, 262, 5, 115, 0, 0, 262, 263, 5, 116, 0, 0, 263, 264, 5, 111, 0, 0, 264, 265, 5, 114, 0, 0, 265, 266, 5, 97, 0, 0, 266, 267, 5, 98, 0, 0, 267, 268, 5, 108, 0, 0, 268, 269, 5, 101, 0, 0, 269, 8, 1, 0, 0, 0, 270, 271, 5, 105, 0, 0, 271, 272, 5, 109, 0, 0, 272, 273, 5, 112, 0, 0, 273, 274, 5, 108, 0, 0, 274, 275, 5, 101, 0, 0, 275, 276, 5, 109, 0, 0, 276, 277, 5, 101, 0, 0, 277, 278, 5, 110, 0, 0, 278, 279, 5, 116, 0, 0, 279, 280, 5, 115, 0, 0, 280, 10, 1, 0, 0, 0, 281, 282, 5, 114, 0, 0, 282, 283, 5, 101, 0, 0, 283, 284, 5, 102, 0, 0, 284, 12, 1, 0, 0, 0, 285, 286, 5, 102, 0, 0, 286, 287, 5, 114, 0, 0, 287, 288, 5, 97, 0, 0, 288, 289, 5, 103, 0, 0, 289, 290, 5, 109, 0, 0, 290, 291, 5, 101, 0, 0, 291, 292, 5, 110, 0, 0, 292, 293, 5, 116, 0, 0, 293, 14, 1, 0, 0, 0, 294, 295, 5, 105, 0, 0, 295, 296, 5, 109, 0, 0, 296, 297, 5, 112, 0, 0, 297, 298, 5, 111, 0, 0, 298, 299, 5, 114, 0, 0, 299, 300, 5, 116, 0, 0, 300, 16, 1, 0, 0, 0, 301, 302, 5, 101, 0, 0, 302, 303, 5, 120, 0, 0, 303, 304, 5, 116, 0, 0, 304, 305, 5, 101, 0, 0, 305, 306, 5, 114, 0, 0, 306, 307, 5, 110, 0, 0, 307, 308, 5, 97, 0, 0, 308, 309, 5, 108, 0, 0, 309, 18, 1, 0, 0, 0, 310, 311, 5, 97, 0, 0, 311, 312, 5, 116, 0, 0, 312, 313, 5, 111, 0, 0, 313, 314, 5, 109, 0, 0, 314, 20, 1, 0, 0, 0, 315, 316, 5, 105, 0, 0, 316, 317, 5, 110, 0, 0, 317, 318, 5, 116, 0, 0, 318, 319, 5, 101, 0, 0, 319, 320, 5, 114, 0, 0, 320, 321, 5, 102, 0, 0, 321, 322, 5, 97, 0, 0, 322, 323, 5, 99, 0, 0, 323, 324, 5, 101, 0, 0, 324, 22, 1, 0, 0, 0, 325, 326, 5, 105, 0, 0, 326, 327, 5, 110, 0, 0, 327, 328, 5, 116, 0, 0, 328, 329, 5, 101, 0, 0, 329, 330, 5, 114, 0, 0, 330, 331, 5, 102, 0, 0, 331, 332, 5, 97, 0, 0, 332, 333, 5, 99, 0, 0, 333, 334, 5, 101, 0, 0, 334, 335, 5, 115, 0, 0, 335, 24, 1, 0, 0, 0, 336, 337, 5, 112, 0, 0, 337, 338, 5, 97, 0, 0, 338, 339, 5, 99, 0, 0, 339, 340, 5, 107, 0, 0, 340, 341, 5, 97, 0, 0, 341, 342, 5, 103, 0, 0, 342, 343, 5, 101, 0, 0, 343, 26, 1, 0, 0, 0, 344, 345, 5, 118, 0, 0, 345, 346, 5, 97, 0, 0, 346, 347, 5, 108, 0, 0, 347, 348, 5, 117, 0, 0, 348, 349, 5, 101, 0, 0, 349, 28, 1, 0, 0, 0, 350, 351, 5, 114, 0, 0, 351, 352, 5, 101, 0, 0, 352, 353, 5, 108, 0, 0, 353, 354, 5, 97, 0, 0, 354, 355, 5, 116, 0, 0, 355, 356, 5, 105, 0, 0, 356, 357, 5, 111, 0, 0, 357, 358, 5, 110, 0, 0, 358, 30, 1, 0, 0, 0, 359, 360, 5, 111, 0, 0, 360, 361, 5, 112, 0, 0, 361, 362, 5, 101, 0, 0, 362, 363, 5, 114, 0, 0, 363, 364, 5, 97, 0, 0, 364, 365, 5, 116, 0, 0, 365, 366, 5, 105, 0, 0, 366, 367, 5, 111, 0, 0, 367, 368, 5, 110, 0, 0, 368, 32, 1, 0, 0, 0, 369, 370, 5, 102, 0, 0, 370, 371, 5, 117, 0, 0, 371, 372, 5, 110, 0, 0, 372, 373, 5, 99, 0, 0, 373, 374, 5, 116, 0, 0, 374, 375, 5, 105, 0, 0, 375, 376, 5, 111, 0, 0, 376, 377, 5, 110, 0, 0, 377, 34, 1, 0, 0, 0, 378, 379, 5, 99, 0, 0, 379, 380, 5, 111, 0, 0, 380, 381, 5, 110, 0, 0, 381, 382, 5, 115, 0, 0, 382, 383, 5, 116, 0, 0, 383, 384, 5, 114, 0, 0, 384, 385, 5, 117, 0, 0, 385, 386, 5, 99, 0, 0, 386, 387, 5, 116, 0, 0, 387, 388, 5, 111, 0, 0, 388, 389, 5, 114, 0, 0, 389, 36, 1, 0, 0, 0, 390, 391, 5, 99, 0, 0, 391, 392, 5, 111, 0, 0, 392, 393, 5, 110, 0, 0, 393, 394, 5, 115, 0, 0, 394, 395, 5, 116, 0, 0, 395, 396, 5, 114, 0, 0, 396, 397, 5, 117, 0, 0, 397, 398, 5, 99, 0, 0, 398, 399, 5, 116, 0, 0, 399, 400, 5, 115, 0, 0, 400, 38, 1, 0, 0, 0, 401, 402, 5, 105, 0, 0, 402, 403, 5, 110, 0, 0, 403, 404, 5, 112, 0, 0, 404, 405, 5, 117, 0, 0, 405, 406, 5, 116, 0, 0, 406, 40, 1, 0, 0, 0, 407, 408, 5, 99, 0, 0, 408, 409, 5, 111, 0, 0, 409, 410, 5, 110, 0, 0, 410, 411, 5, 102, 0, 0, 411, 412, 5, 111, 0, 0, 412, 413, 5, 114, 0, 0, 413, 414, 5, 109, 0, 0, 414, 42, 1, 0, 0, 0, 415, 416, 5, 97, 0, 0, 416, 417, 5, 115, 0, 0, 417, 44, 1, 0, 0, 0, 418, 419, 5, 98, 0, 0, 419, 420, 5, 105, 0, 0, 420, 421, 5, 110, 0, 0, 421, 422, 5, 100, 0, 0, 422, 46, 1, 0, 0, 0, 423, 424, 5, 116, 0, 0, 424, 425, 5, 111, 0, 0, 425, 48, 1, 0, 0, 0, 426, 427, 5, 112, 0, 0, 427, 428, 5, 114, 0, 0, 428, 429, 5, 105, 0, 0, 429, 430, 5, 118, 0, 0, 430, 431, 5, 97, 0, 0, 431, 432, 5, 116, 0, 0, 432, 433, 5, 101, 0, 0, 433, 50, 1, 0, 0, 0, 434, 435, 5, 115, 0, 0, 435, 436, 5, 104, 0, 0, 436, 437, 5, 97, 0, 0, 437, 438, 5, 114, 0, 0, 438, 439, 5, 101, 0, 0, 439, 440, 5, 100, 0, 0, 440, 52, 1, 0, 0, 0, 441, 442, 5, 115, 0, 0, 442, 443, 5, 116, 0, 0, 443, 444, 5, 97, 0, 0, 444, 445, 5, 116, 0, 0, 445, 446, 5, 101, 0, 0, 446, 54, 1, 0, 0, 0, 447, 448, 5, 101, 0, 0, 448, 449, 5, 100, 0, 0, 449, 450, 5, 103, 0, 0, 450, 451, 5, 101, 0, 0, 451, 56, 1, 0, 0, 0, 452, 453, 5, 112, 0, 0, 453, 454, 5, 114, 0, 0, 454, 455, 5, 111, 0, 0, 455, 456, 5, 106, 0, 0, 456, 457, 5, 101, 0, 0, 457, 458, 5, 99, 0, 0, 458, 459, 5, 116, 0, 0, 459, 460, 5, 105, 0, 0, 460, 461, 5, 111, 0, 0, 461, 462, 5, 110, 0, 0, 462, 58, 1, 0, 0, 0, 463, 464, 5, 119, 0, 0, 464, 465, 5, 105, 0, 0, 465, 466, 5, 116, 0, 0, 466, 467, 5, 104, 0, 0, 467, 60, 1, 0, 0, 0, 468, 469, 5, 117, 0, 0, 469, 470, 5, 115, 0, 0, 470, 471, 5, 105, 0, 0, 471, 472, 5, 110, 0, 0, 472, 473, 5, 103, 0, 0, 473, 62, 1, 0, 0, 0, 474, 475, 5, 118, 0, 0, 475, 476, 5, 105, 0, 0, 476, 477, 5, 97, 0, 0, 477, 64, 1, 0, 0, 0, 478, 479, 5, 109, 0, 0, 479, 480, 5, 97, 0, 0, 480, 481, 5, 116, 0, 0, 481, 482, 5, 101, 0, 0, 482, 483, 5, 114, 0, 0, 483, 484, 5, 105, 0, 0, 484, 485, 5, 97, 0, 0, 485, 486, 5, 108, 0, 0, 486, 487, 5, 105, 0, 0, 487, 488, 5, 122, 0, 0, 488, 489, 5, 101, 0, 0, 489, 66, 1, 0, 0, 0, 490, 491, 5, 105, 0, 0, 491, 492, 5, 102, 0, 0, 492, 68, 1, 0, 0, 0, 493, 494, 5, 97, 0, 0, 494, 495, 5, 98, 0, 0, 495, 496, 5, 115, 0, 0, 496, 497, 5, 101, 0, 0, 497, 498, 5, 110, 0, 0, 498, 499, 5, 116, 0, 0, 499, 70, 1, 0, 0, 0, 500, 501, 5, 111, 0, 0, 501, 502, 5, 110, 0, 0, 502, 72, 1, 0, 0, 0, 503, 504, 5, 112, 0, 0, 504, 505, 5, 111, 0, 0, 505, 506, 5, 108, 0, 0, 506, 507, 5, 105, 0, 0, 507, 508, 5, 99, 0, 0, 508, 509, 5, 121, 0, 0, 509, 74, 1, 0, 0, 0, 510, 511, 5, 100, 0, 0, 511, 512, 5, 101, 0, 0, 512, 513, 5, 102, 0, 0, 513, 514, 5, 97, 0, 0, 514, 515, 5, 117, 0, 0, 515, 516, 5, 108, 0, 0, 516, 517, 5, 116, 0, 0, 517, 76, 1, 0, 0, 0, 518, 519, 5, 115, 0, 0, 519, 520, 5, 111, 0, 0, 520, 521, 5, 117, 0, 0, 521, 522, 5, 114, 0, 0, 522, 523, 5, 99, 0, 0, 523, 524, 5, 101, 0, 0, 524, 78, 1, 0, 0, 0, 525, 526, 5, 114, 0, 0, 526, 527, 5, 101, 0, 0, 527, 528, 5, 112, 0, 0, 528, 529, 5, 111, 0, 0, 529, 530, 5, 115, 0, 0, 530, 531, 5, 105, 0, 0, 531, 532, 5, 116, 0, 0, 532, 533, 5, 111, 0, 0, 533, 534, 5, 114, 0, 0, 534, 535, 5, 121, 0, 0, 535, 80, 1, 0, 0, 0, 536, 537, 5, 99, 0, 0, 537, 538, 5, 111, 0, 0, 538, 539, 5, 109, 0, 0, 539, 540, 5, 109, 0, 0, 540, 541, 5, 105, 0, 0, 541, 542, 5, 116, 0, 0, 542, 82, 1, 0, 0, 0, 543, 544, 5, 114, 0, 0, 544, 545, 5, 101, 0, 0, 545, 546, 5, 118, 0, 0, 546, 547, 5, 105, 0, 0, 547, 548, 5, 115, 0, 0, 548, 549, 5, 105, 0, 0, 549, 550, 5, 111, 0, 0, 550, 551, 5, 110, 0, 0, 551, 84, 1, 0, 0, 0, 552, 553, 5, 115, 0, 0, 553, 554, 5, 101, 0, 0, 554, 555, 5, 109, 0, 0, 555, 556, 5, 97, 0, 0, 556, 557, 5, 110, 0, 0, 557, 558, 5, 116, 0, 0, 558, 559, 5, 105, 0, 0, 559, 560, 5, 99, 0, 0, 560, 561, 5, 45, 0, 0, 561, 562, 5, 109, 0, 0, 562, 563, 5, 97, 0, 0, 563, 564, 5, 106, 0, 0, 564, 565, 5, 111, 0, 0, 565, 566, 5, 114, 0, 0, 566, 86, 1, 0, 0, 0, 567, 568, 5, 111, 0, 0, 568, 569, 5, 110, 0, 0, 569, 570, 5, 45, 0, 0, 570, 571, 5, 100, 0, 0, 571, 572, 5, 101, 0, 0, 572, 573, 5, 108, 0, 0, 573, 574, 5, 101, 0, 0, 574, 575, 5, 116, 0, 0, 575, 576, 5, 101, 0, 0, 576, 88, 1, 0, 0, 0, 577, 578, 5, 114, 0, 0, 578, 579, 5, 101, 0, 0, 579, 580, 5, 116, 0, 0, 580, 581, 5, 97, 0, 0, 581, 582, 5, 105, 0, 0, 582, 583, 5, 110, 0, 0, 583, 584, 5, 45, 0, 0, 584, 585, 5, 111, 0, 0, 585, 586, 5, 116, 0, 0, 586, 587, 5, 104, 0, 0, 587, 588, 5, 101, 0, 0, 588, 589, 5, 114, 0, 0, 589, 90, 1, 0, 0, 0, 590, 591, 5, 107, 0, 0, 591, 592, 5, 101, 0, 0, 592, 593, 5, 121, 0, 0, 593, 594, 5, 101, 0, 0, 594, 595, 5, 100, 0, 0, 595, 92, 1, 0, 0, 0, 596, 597, 5, 112, 0, 0, 597, 598, 5, 117, 0, 0, 598, 599, 5, 98, 0, 0, 599, 600, 5, 108, 0, 0, 600, 601, 5, 105, 0, 0, 601, 602, 5, 99, 0, 0, 602, 603, 5, 45, 0, 0, 603, 604, 5, 116, 0, 0, 604, 605, 5, 114, 0, 0, 605, 606, 5, 97, 0, 0, 606, 607, 5, 118, 0, 0, 607, 608, 5, 101, 0, 0, 608, 609, 5, 114, 0, 0, 609, 610, 5, 115, 0, 0, 610, 611, 5, 97, 0, 0, 611, 612, 5, 108, 0, 0, 612, 94, 1, 0, 0, 0, 613, 614, 5, 105, 0, 0, 614, 615, 5, 100, 0, 0, 615, 96, 1, 0, 0, 0, 616, 617, 5, 100, 0, 0, 617, 618, 5, 111, 0, 0, 618, 619, 5, 99, 0, 0, 619, 98, 1, 0, 0, 0, 620, 621, 5, 109, 0, 0, 621, 622, 5, 111, 0, 0, 622, 623, 5, 100, 0, 0, 623, 624, 5, 101, 0, 0, 624, 100, 1, 0, 0, 0, 625, 626, 5, 101, 0, 0, 626, 627, 5, 109, 0, 0, 627, 628, 5, 105, 0, 0, 628, 629, 5, 116, 0, 0, 629, 630, 5, 115, 0, 0, 630, 102, 1, 0, 0, 0, 631, 632, 5, 114, 0, 0, 632, 633, 5, 101, 0, 0, 633, 634, 5, 99, 0, 0, 634, 635, 5, 101, 0, 0, 635, 636, 5, 105, 0, 0, 636, 637, 5, 118, 0, 0, 637, 638, 5, 101, 0, 0, 638, 639, 5, 114, 0, 0, 639, 104, 1, 0, 0, 0, 640, 641, 5, 114, 0, 0, 641, 642, 5, 101, 0, 0, 642, 643, 5, 113, 0, 0, 643, 644, 5, 117, 0, 0, 644, 645, 5, 105, 0, 0, 645, 646, 5, 114, 0, 0, 646, 647, 5, 101, 0, 0, 647, 648, 5, 115, 0, 0, 648, 106, 1, 0, 0, 0, 649, 650, 5, 97, 0, 0, 650, 651, 5, 110, 0, 0, 651, 652, 5, 121, 0, 0, 652, 108, 1, 0, 0, 0, 653, 654, 5, 103, 0, 0, 654, 655, 5, 101, 0, 0, 655, 656, 5, 116, 0, 0, 656, 110, 1, 0, 0, 0, 657, 658, 5, 115, 0, 0, 658, 659, 5, 101, 0, 0, 659, 660, 5, 116, 0, 0, 660, 112, 1, 0, 0, 0, 661, 662, 5, 119, 0, 0, 662, 663, 5, 97, 0, 0, 663, 664, 5, 116, 0, 0, 664, 665, 5, 99, 0, 0, 665, 666, 5, 104, 0, 0, 666, 114, 1, 0, 0, 0, 667, 668, 5, 115, 0, 0, 668, 669, 5, 116, 0, 0, 669, 670, 5, 97, 0, 0, 670, 671, 5, 114, 0, 0, 671, 672, 5, 116, 0, 0, 672, 116, 1, 0, 0, 0, 673, 674, 5, 115, 0, 0, 674, 675, 5, 116, 0, 0, 675, 676, 5, 111, 0, 0, 676, 677, 5, 112, 0, 0, 677, 118, 1, 0, 0, 0, 678, 679, 5, 114, 0, 0, 679, 680, 5, 101, 0, 0, 680, 681, 5, 97, 0, 0, 681, 682, 5, 100, 0, 0, 682, 120, 1, 0, 0, 0, 683, 684, 5, 119, 0, 0, 684, 685, 5, 114, 0, 0, 685, 686, 5, 105, 0, 0, 686, 687, 5, 116, 0, 0, 687, 688, 5, 101, 0, 0, 688, 122, 1, 0, 0, 0, 689, 690, 5, 114, 0, 0, 690, 691, 5, 101, 0, 0, 691, 692, 5, 115, 0, 0, 692, 693, 5, 111, 0, 0, 693, 694, 5, 108, 0, 0, 694, 695, 5, 118, 0, 0, 695, 696, 5, 101, 0, 0, 696, 124, 1, 0, 0, 0, 697, 698, 5, 99, 0, 0, 698, 699, 5, 111, 0, 0, 699, 700, 5, 110, 0, 0, 700, 701, 5, 110, 0, 0, 701, 702, 5, 101, 0, 0, 702, 703, 5, 99, 0, 0, 703, 704, 5, 116, 0, 0, 704, 126, 1, 0, 0, 0, 705, 706, 5, 100, 0, 0, 706, 707, 5, 105, 0, 0, 707, 708, 5, 115, 0, 0, 708, 709, 5, 99, 0, 0, 709, 710, 5, 111, 0, 0, 710, 711, 5, 110, 0, 0, 711, 712, 5, 110, 0, 0, 712, 713, 5, 101, 0, 0, 713, 714, 5, 99, 0, 0, 714, 715, 5, 116, 0, 0, 715, 128, 1, 0, 0, 0, 716, 717, 5, 99, 0, 0, 717, 718, 5, 97, 0, 0, 718, 719, 5, 108, 0, 0, 719, 720, 5, 108, 0, 0, 720, 130, 1, 0, 0, 0, 721, 722, 5, 119, 0, 0, 722, 723, 5, 97, 0, 0, 723, 724, 5, 116, 0, 0, 724, 725, 5, 99, 0, 0, 725, 726, 5, 104, 0, 0, 726, 727, 5, 45, 0, 0, 727, 728, 5, 115, 0, 0, 728, 729, 5, 116, 0, 0, 729, 730, 5, 97, 0, 0, 730, 731, 5, 114, 0, 0, 731, 732, 5, 116, 0, 0, 732, 132, 1, 0, 0, 0, 733, 734, 5, 119, 0, 0, 734, 735, 5, 97, 0, 0, 735, 736, 5, 116, 0, 0, 736, 737, 5, 99, 0, 0, 737, 738, 5, 104, 0, 0, 738, 739, 5, 45, 0, 0, 739, 740, 5, 115, 0, 0, 740, 741, 5, 116, 0, 0, 741, 742, 5, 111, 0, 0, 742, 743, 5, 112, 0, 0, 743, 134, 1, 0, 0, 0, 744, 745, 5, 115, 0, 0, 745, 746, 5, 117, 0, 0, 746, 747, 5, 98, 0, 0, 747, 748, 5, 115, 0, 0, 748, 749, 5, 99, 0, 0, 749, 750, 5, 114, 0, 0, 750, 751, 5, 105, 0, 0, 751, 752, 5, 98, 0, 0, 752, 753, 5, 101, 0, 0, 753, 136, 1, 0, 0, 0, 754, 755, 5, 117, 0, 0, 755, 756, 5, 110, 0, 0, 756, 757, 5, 115, 0, 0, 757, 758, 5, 117, 0, 0, 758, 759, 5, 98, 0, 0, 759, 760, 5, 115, 0, 0, 760, 761, 5, 99, 0, 0, 761, 762, 5, 114, 0, 0, 762, 763, 5, 105, 0, 0, 763, 764, 5, 98, 0, 0, 764, 765, 5, 101, 0, 0, 765, 138, 1, 0, 0, 0, 766, 767, 5, 111, 0, 0, 767, 768, 5, 112, 0, 0, 768, 769, 5, 116, 0, 0, 769, 770, 5, 105, 0, 0, 770, 771, 5, 109, 0, 0, 771, 772, 5, 105, 0, 0, 772, 773, 5, 115, 0, 0, 773, 774, 5, 116, 0, 0, 774, 775, 5, 105, 0, 0, 775, 776, 5, 99, 0, 0, 776, 777, 5, 45, 0, 0, 777, 778, 5, 114, 0, 0, 778, 779, 5, 101, 0, 0, 779, 780, 5, 103, 0, 0, 780, 781, 5, 105, 0, 0, 781, 782, 5, 115, 0, 0, 782, 783, 5, 116, 0, 0, 783, 784, 5, 101, 0, 0, 784, 785, 5, 114, 0, 0, 785, 140, 1, 0, 0, 0, 786, 787, 5, 99, 0, 0, 787, 788, 5, 114, 0, 0, 788, 789, 5, 100, 0, 0, 789, 790, 5, 116, 0, 0, 790, 142, 1, 0, 0, 0, 791, 792, 5, 111, 0, 0, 792, 793, 5, 112, 0, 0, 793, 794, 5, 116, 0, 0, 794, 795, 5, 105, 0, 0, 795, 796, 5, 111, 0, 0, 796, 797, 5, 110, 0, 0, 797, 798, 5, 97, 0, 0, 798, 799, 5, 108, 0, 0, 799, 800, 5, 45, 0, 0, 800, 801, 5, 111, 0, 0, 801, 802, 5, 110, 0, 0, 802, 803, 5, 101, 0, 0, 803, 144, 1, 0, 0, 0, 804, 805, 5, 101, 0, 0, 805, 806, 5, 120, 0, 0, 806, 807, 5, 97, 0, 0, 807, 808, 5, 99, 0, 0, 808, 809, 5, 116, 0, 0, 809, 810, 5, 108, 0, 0, 810, 811, 5, 121, 0, 0, 811, 812, 5, 45, 0, 0, 812, 813, 5, 111, 0, 0, 813, 814, 5, 110, 0, 0, 814, 815, 5, 101, 0, 0, 815, 146, 1, 0, 0, 0, 816, 817, 5, 109, 0, 0, 817, 818, 5, 97, 0, 0, 818, 819, 5, 110, 0, 0, 819, 820, 5, 121, 0, 0, 820, 821, 5, 45, 0, 0, 821, 822, 5, 117, 0, 0, 822, 823, 5, 110, 0, 0, 823, 824, 5, 105, 0, 0, 824, 825, 5, 113, 0, 0, 825, 826, 5, 117, 0, 0, 826, 827, 5, 101, 0, 0, 827, 148, 1, 0, 0, 0, 828, 829, 5, 109, 0, 0, 829, 830, 5, 97, 0, 0, 830, 831, 5, 110, 0, 0, 831, 832, 5, 121, 0, 0, 832, 150, 1, 0, 0, 0, 833, 834, 5, 111, 0, 0, 834, 835, 5, 114, 0, 0, 835, 836, 5, 100, 0, 0, 836, 837, 5, 101, 0, 0, 837, 838, 5, 114, 0, 0, 838, 839, 5, 101, 0, 0, 839, 840, 5, 100, 0, 0, 840, 152, 1, 0, 0, 0, 841, 842, 5, 117, 0, 0, 842, 843, 5, 110, 0, 0, 843, 844, 5, 105, 0, 0, 844, 845, 5, 116, 0, 0, 845, 154, 1, 0, 0, 0, 846, 847, 5, 119, 0, 0, 847, 848, 5, 97, 0, 0, 848, 849, 5, 116, 0, 0, 849, 850, 5, 99, 0, 0, 850, 851, 5, 104, 0, 0, 851, 852, 5, 45, 0, 0, 852, 853, 5, 104, 0, 0, 853, 854, 5, 97, 0, 0, 854, 855, 5, 110, 0, 0, 855, 856, 5, 100, 0, 0, 856, 857, 5, 108, 0, 0, 857, 858, 5, 101, 0, 0, 858, 156, 1, 0, 0, 0, 859, 860, 5, 109, 0, 0, 860, 861, 5, 101, 0, 0, 861, 862, 5, 115, 0, 0, 862, 863, 5, 115, 0, 0, 863, 864, 5, 97, 0, 0, 864, 865, 5, 103, 0, 0, 865, 866, 5, 101, 0, 0, 866, 158, 1, 0, 0, 0, 867, 868, 5, 97, 0, 0, 868, 869, 5, 116, 0, 0, 869, 870, 5, 111, 0, 0, 870, 871, 5, 109, 0, 0, 871, 872, 5, 45, 0, 0, 872, 873, 5, 114, 0, 0, 873, 874, 5, 101, 0, 0, 874, 875, 5, 102, 0, 0, 875, 160, 1, 0, 0, 0, 876, 877, 5, 105, 0, 0, 877, 878, 5, 110, 0, 0, 878, 879, 5, 116, 0, 0, 879, 880, 5, 101, 0, 0, 880, 881, 5, 114, 0, 0, 881, 882, 5, 102, 0, 0, 882, 883, 5, 97, 0, 0, 883, 884, 5, 99, 0, 0, 884, 885, 5, 101, 0, 0, 885, 886, 5, 45, 0, 0, 886, 887, 5, 114, 0, 0, 887, 888, 5, 101, 0, 0, 888, 889, 5, 102, 0, 0, 889, 162, 1, 0, 0, 0, 890, 891, 5, 111, 0, 0, 891, 892, 5, 112, 0, 0, 892, 893, 5, 116, 0, 0, 893, 894, 5, 105, 0, 0, 894, 895, 5, 111, 0, 0, 895, 896, 5, 110, 0, 0, 896, 897, 5, 97, 0, 0, 897, 898, 5, 108, 0, 0, 898, 164, 1, 0, 0, 0, 899, 900, 5, 108, 0, 0, 900, 901, 5, 105, 0, 0, 901, 902, 5, 115, 0, 0, 902, 903, 5, 116, 0, 0, 903, 166, 1, 0, 0, 0, 904, 905, 5, 114, 0, 0, 905, 906, 5, 101, 0, 0, 906, 907, 5, 99, 0, 0, 907, 908, 5, 111, 0, 0, 908, 909, 5, 114, 0, 0, 909, 910, 5, 100, 0, 0, 910, 168, 1, 0, 0, 0, 911, 912, 5, 98, 0, 0, 912, 913, 5, 111, 0, 0, 913, 914, 5, 111, 0, 0, 914, 915, 5, 108, 0, 0, 915, 170, 1, 0, 0, 0, 916, 917, 5, 98, 0, 0, 917, 918, 5, 121, 0, 0, 918, 919, 5, 116, 0, 0, 919, 920, 5, 101, 0, 0, 920, 921, 5, 115, 0, 0, 921, 172, 1, 0, 0, 0, 922, 923, 5, 100, 0, 0, 923, 924, 5, 111, 0, 0, 924, 925, 5, 117, 0, 0, 925, 926, 5, 98, 0, 0, 926, 927, 5, 108, 0, 0, 927, 928, 5, 101, 0, 0, 928, 174, 1, 0, 0, 0, 929, 930, 5, 105, 0, 0, 930, 931, 5, 110, 0, 0, 931, 932, 5, 116, 0, 0, 932, 933, 5, 51, 0, 0, 933, 934, 5, 50, 0, 0, 934, 176, 1, 0, 0, 0, 935, 936, 5, 105, 0, 0, 936, 937, 5, 110, 0, 0, 937, 938, 5, 116, 0, 0, 938, 939, 5, 54, 0, 0, 939, 940, 5, 52, 0, 0, 940, 178, 1, 0, 0, 0, 941, 942, 5, 115, 0, 0, 942, 943, 5, 116, 0, 0, 943, 944, 5, 114, 0, 0, 944, 945, 5, 105, 0, 0, 945, 946, 5, 110, 0, 0, 946, 947, 5, 103, 0, 0, 947, 180, 1, 0, 0, 0, 948, 949, 5, 117, 0, 0, 949, 950, 5, 105, 0, 0, 950, 951, 5, 110, 0, 0, 951, 952, 5, 116, 0, 0, 952, 953, 5, 51, 0, 0, 953, 954, 5, 50, 0, 0, 954, 182, 1, 0, 0, 0, 955, 956, 5, 117, 0, 0, 956, 957, 5, 105, 0, 0, 957, 958, 5, 110, 0, 0, 958, 959, 5, 116, 0, 0, 959, 960, 5, 54, 0, 0, 960, 961, 5, 52, 0, 0, 961, 184, 1, 0, 0, 0, 962, 963, 5, 116, 0, 0, 963, 964, 5, 114, 0, 0, 964, 965, 5, 117, 0, 0, 965, 966, 5, 101, 0, 0, 966, 186, 1, 0, 0, 0, 967, 968, 5, 102, 0, 0, 968, 969, 5, 97, 0, 0, 969, 970, 5, 108, 0, 0, 970, 971, 5, 115, 0, 0, 971, 972, 5, 101, 0, 0, 972, 188, 1, 0, 0, 0, 973, 974, 5, 110, 0, 0, 974, 975, 5, 117, 0, 0, 975, 976, 5, 108, 0, 0, 976, 977, 5, 108, 0, 0, 977, 190, 1, 0, 0, 0, 978, 979, 5, 45, 0, 0, 979, 980, 5, 62, 0, 0, 980, 192, 1, 0, 0, 0, 981, 982, 5, 58, 0, 0, 982, 194, 1, 0, 0, 0, 983, 984, 5, 59, 0, 0, 984, 196, 1, 0, 0, 0, 985, 986, 5, 44, 0, 0, 986, 198, 1, 0, 0, 0, 987, 988, 5, 46, 0, 0, 988, 200, 1, 0, 0, 0, 989, 990, 5, 123, 0, 0, 990, 202, 1, 0, 0, 0, 991, 992, 5, 125, 0, 0, 992, 204, 1, 0, 0, 0, 993, 994, 5, 91, 0, 0, 994, 206, 1, 0, 0, 0, 995, 996, 5, 93, 0, 0, 996, 208, 1, 0, 0, 0, 997, 998, 5, 40, 0, 0, 998, 210, 1, 0, 0, 0, 999, 1000, 5, 41, 0, 0, 1000, 212, 1, 0, 0, 0, 1001, 1002, 5, 60, 0, 0, 1002, 214, 1, 0, 0, 0, 1003, 1004, 5, 62, 0, 0, 1004, 216, 1, 0, 0, 0, 1005, 1006, 5, 38, 0, 0, 1006, 218, 1, 0, 0, 0, 1007, 1008, 5, 61, 0, 0, 1008, 220, 1, 0, 0, 0, 1009, 1011, 5, 45, 0, 0, 1010, 1009, 1, 0, 0, 0, 1010, 1011, 1, 0, 0, 0, 1011, 1013, 1, 0, 0, 0, 1012, 1014, 7, 0, 0, 0, 1013, 1012, 1, 0, 0, 0, 1014, 1015, 1, 0, 0, 0, 1015, 1013, 1, 0, 0, 0, 1015, 1016, 1, 0, 0, 0, 1016, 222, 1, 0, 0, 0, 1017, 1019, 5, 45, 0, 0, 1018, 1017, 1, 0, 0, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1028, 1, 0, 0, 0, 1020, 1029, 5, 48, 0, 0, 1021, 1025, 7, 1, 0, 0, 1022, 1024, 7, 0, 0, 0, 1023, 1022, 1, 0, 0, 0, 1024, 1027, 1, 0, 0, 0, 1025, 1023, 1, 0, 0, 0, 1025, 1026, 1, 0, 0, 0, 1026, 1029, 1, 0, 0, 0, 1027, 1025, 1, 0, 0, 0, 1028, 1020, 1, 0, 0, 0, 1028, 1021, 1, 0, 0, 0, 1029, 1036, 1, 0, 0, 0, 1030, 1032, 5, 46, 0, 0, 1031, 1033, 7, 0, 0, 0, 1032, 1031, 1, 0, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1032, 1, 0, 0, 0, 1034, 1035, 1, 0, 0, 0, 1035, 1037, 1, 0, 0, 0, 1036, 1030, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1047, 1, 0, 0, 0, 1038, 1040, 7, 2, 0, 0, 1039, 1041, 7, 3, 0, 0, 1040, 1039, 1, 0, 0, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1043, 1, 0, 0, 0, 1042, 1044, 7, 0, 0, 0, 1043, 1042, 1, 0, 0, 0, 1044, 1045, 1, 0, 0, 0, 1045, 1043, 1, 0, 0, 0, 1045, 1046, 1, 0, 0, 0, 1046, 1048, 1, 0, 0, 0, 1047, 1038, 1, 0, 0, 0, 1047, 1048, 1, 0, 0, 0, 1048, 224, 1, 0, 0, 0, 1049, 1053, 7, 4, 0, 0, 1050, 1052, 7, 5, 0, 0, 1051, 1050, 1, 0, 0, 0, 1052, 1055, 1, 0, 0, 0, 1053, 1051, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 226, 1, 0, 0, 0, 1055, 1053, 1, 0, 0, 0, 1056, 1061, 5, 34, 0, 0, 1057, 1060, 3, 229, 114, 0, 1058, 1060, 8, 6, 0, 0, 1059, 1057, 1, 0, 0, 0, 1059, 1058, 1, 0, 0, 0, 1060, 1063, 1, 0, 0, 0, 1061, 1059, 1, 0, 0, 0, 1061, 1062, 1, 0, 0, 0, 1062, 1064, 1, 0, 0, 0, 1063, 1061, 1, 0, 0, 0, 1064, 1065, 5, 34, 0, 0, 1065, 228, 1, 0, 0, 0, 1066, 1074, 5, 92, 0, 0, 1067, 1075, 7, 7, 0, 0, 1068, 1069, 5, 117, 0, 0, 1069, 1070, 3, 231, 115, 0, 1070, 1071, 3, 231, 115, 0, 1071, 1072, 3, 231, 115, 0, 1072, 1073, 3, 231, 115, 0, 1073, 1075, 1, 0, 0, 0, 1074, 1067, 1, 0, 0, 0, 1074, 1068, 1, 0, 0, 0, 1075, 230, 1, 0, 0, 0, 1076, 1077, 7, 8, 0, 0, 1077, 232, 1, 0, 0, 0, 1078, 1079, 5, 47, 0, 0, 1079, 1080, 5, 47, 0, 0, 1080, 1084, 1, 0, 0, 0, 1081, 1083, 8, 9, 0, 0, 1082, 1081, 1, 0, 0, 0, 1083, 1086, 1, 0, 0, 0, 1084, 1082, 1, 0, 0, 0, 1084, 1085, 1, 0, 0, 0, 1085, 1087, 1, 0, 0, 0, 1086, 1084, 1, 0, 0, 0, 1087, 1088, 6, 116, 0, 0, 1088, 234, 1, 0, 0, 0, 1089, 1090, 5, 47, 0, 0, 1090, 1091, 5, 42, 0, 0, 1091, 1095, 1, 0, 0, 0, 1092, 1094, 9, 0, 0, 0, 1093, 1092, 1, 0, 0, 0, 1094, 1097, 1, 0, 0, 0, 1095, 1096, 1, 0, 0, 0, 1095, 1093, 1, 0, 0, 0, 1096, 1098, 1, 0, 0, 0, 1097, 1095, 1, 0, 0, 0, 1098, 1099, 5, 42, 0, 0, 1099, 1100, 5, 47, 0, 0, 1100, 1101, 1, 0, 0, 0, 1101, 1102, 6, 117, 0, 0, 1102, 236, 1, 0, 0, 0, 1103, 1105, 7, 10, 0, 0, 1104, 1103, 1, 0, 0, 0, 1105, 1106, 1, 0, 0, 0, 1106, 1104, 1, 0, 0, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1109, 6, 118, 0, 0, 1109, 238, 1, 0, 0, 0, 18, 0, 1010, 1015, 1018, 1025, 1028, 1034, 1036, 1040, 1045, 1047, 1053, 1059, 1061, 1074, 1084, 1095, 1106, 1, 0, 1, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index 8571c0b..75f42fb 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -1,213 +1,227 @@ WORKSPACE=1 -FRAGMENT=2 -IMPORT=3 -EXTERNAL=4 -ATOM=5 -INTERFACE=6 -INTERFACES=7 -PACKAGE=8 -VALUE=9 -RELATION=10 -OPERATION=11 -FUNCTION=12 -CONSTRUCTOR=13 -CONSTRUCTS=14 -INPUT=15 -CONFORM=16 -AS=17 -BIND=18 -TO=19 -PRIVATE=20 -SHARED=21 -STATE=22 -EDGE=23 -PROJECTION=24 -WITH=25 -USING=26 -VIA=27 -MATERIALIZE=28 -IF=29 -ABSENT=30 -ON=31 -POLICY=32 -DEFAULT=33 -SOURCE=34 -REPOSITORY=35 -COMMIT=36 -REVISION=37 -SEMANTIC_MAJOR=38 -ON_DELETE=39 -RETAIN_OTHER=40 -KEYED=41 -PUBLIC_TRAVERSAL=42 -ID=43 -DOC=44 -MODE=45 -EMITS=46 -RECEIVER=47 -REQUIRES=48 -ANY=49 -GET=50 -SET=51 -WATCH=52 -START=53 -STOP=54 -READ=55 -WRITE=56 -RESOLVE=57 -CONNECT=58 -DISCONNECT=59 -CALL=60 -WATCH_START=61 -WATCH_STOP=62 -SUBSCRIBE=63 -UNSUBSCRIBE=64 -OPTIMISTIC_REGISTER=65 -CRDT=66 -OPTIONAL_ONE=67 -EXACTLY_ONE=68 -MANY_UNIQUE=69 -MANY=70 -ORDERED=71 -UNIT=72 -WATCH_HANDLE=73 -MESSAGE=74 -ATOM_REF=75 -INTERFACE_REF=76 -OPTIONAL=77 -LIST=78 -RECORD=79 -BOOL=80 -BYTES=81 -DOUBLE=82 -INT32=83 -INT64=84 -STRING=85 -UINT32=86 -UINT64=87 -TRUE=88 -FALSE=89 -NULL=90 -ARROW=91 -COLON=92 -SEMI=93 -COMMA=94 -DOT=95 -LBRACE=96 -RBRACE=97 -LBRACK=98 -RBRACK=99 -LPAREN=100 -RPAREN=101 -LT=102 -GT=103 -INTEGER=104 -JSON_NUMBER=105 -IDENTIFIER=106 -STRING_LITERAL=107 -LINE_COMMENT=108 -BLOCK_COMMENT=109 -WS=110 +TYPE=2 +OBJECT=3 +STORABLE=4 +IMPLEMENTS=5 +REF=6 +FRAGMENT=7 +IMPORT=8 +EXTERNAL=9 +ATOM=10 +INTERFACE=11 +INTERFACES=12 +PACKAGE=13 +VALUE=14 +RELATION=15 +OPERATION=16 +FUNCTION=17 +CONSTRUCTOR=18 +CONSTRUCTS=19 +INPUT=20 +CONFORM=21 +AS=22 +BIND=23 +TO=24 +PRIVATE=25 +SHARED=26 +STATE=27 +EDGE=28 +PROJECTION=29 +WITH=30 +USING=31 +VIA=32 +MATERIALIZE=33 +IF=34 +ABSENT=35 +ON=36 +POLICY=37 +DEFAULT=38 +SOURCE=39 +REPOSITORY=40 +COMMIT=41 +REVISION=42 +SEMANTIC_MAJOR=43 +ON_DELETE=44 +RETAIN_OTHER=45 +KEYED=46 +PUBLIC_TRAVERSAL=47 +ID=48 +DOC=49 +MODE=50 +EMITS=51 +RECEIVER=52 +REQUIRES=53 +ANY=54 +GET=55 +SET=56 +WATCH=57 +START=58 +STOP=59 +READ=60 +WRITE=61 +RESOLVE=62 +CONNECT=63 +DISCONNECT=64 +CALL=65 +WATCH_START=66 +WATCH_STOP=67 +SUBSCRIBE=68 +UNSUBSCRIBE=69 +OPTIMISTIC_REGISTER=70 +CRDT=71 +OPTIONAL_ONE=72 +EXACTLY_ONE=73 +MANY_UNIQUE=74 +MANY=75 +ORDERED=76 +UNIT=77 +WATCH_HANDLE=78 +MESSAGE=79 +ATOM_REF=80 +INTERFACE_REF=81 +OPTIONAL=82 +LIST=83 +RECORD=84 +BOOL=85 +BYTES=86 +DOUBLE=87 +INT32=88 +INT64=89 +STRING=90 +UINT32=91 +UINT64=92 +TRUE=93 +FALSE=94 +NULL=95 +ARROW=96 +COLON=97 +SEMI=98 +COMMA=99 +DOT=100 +LBRACE=101 +RBRACE=102 +LBRACK=103 +RBRACK=104 +LPAREN=105 +RPAREN=106 +LT=107 +GT=108 +AMP=109 +EQUAL=110 +INTEGER=111 +JSON_NUMBER=112 +IDENTIFIER=113 +STRING_LITERAL=114 +LINE_COMMENT=115 +BLOCK_COMMENT=116 +WS=117 'workspace'=1 -'fragment'=2 -'import'=3 -'external'=4 -'atom'=5 -'interface'=6 -'interfaces'=7 -'package'=8 -'value'=9 -'relation'=10 -'operation'=11 -'function'=12 -'constructor'=13 -'constructs'=14 -'input'=15 -'conform'=16 -'as'=17 -'bind'=18 -'to'=19 -'private'=20 -'shared'=21 -'state'=22 -'edge'=23 -'projection'=24 -'with'=25 -'using'=26 -'via'=27 -'materialize'=28 -'if'=29 -'absent'=30 -'on'=31 -'policy'=32 -'default'=33 -'source'=34 -'repository'=35 -'commit'=36 -'revision'=37 -'semantic-major'=38 -'on-delete'=39 -'retain-other'=40 -'keyed'=41 -'public-traversal'=42 -'id'=43 -'doc'=44 -'mode'=45 -'emits'=46 -'receiver'=47 -'requires'=48 -'any'=49 -'get'=50 -'set'=51 -'watch'=52 -'start'=53 -'stop'=54 -'read'=55 -'write'=56 -'resolve'=57 -'connect'=58 -'disconnect'=59 -'call'=60 -'watch-start'=61 -'watch-stop'=62 -'subscribe'=63 -'unsubscribe'=64 -'optimistic-register'=65 -'crdt'=66 -'optional-one'=67 -'exactly-one'=68 -'many-unique'=69 -'many'=70 -'ordered'=71 -'unit'=72 -'watch-handle'=73 -'message'=74 -'atom-ref'=75 -'interface-ref'=76 -'optional'=77 -'list'=78 -'record'=79 -'bool'=80 -'bytes'=81 -'double'=82 -'int32'=83 -'int64'=84 -'string'=85 -'uint32'=86 -'uint64'=87 -'true'=88 -'false'=89 -'null'=90 -'->'=91 -':'=92 -';'=93 -','=94 -'.'=95 -'{'=96 -'}'=97 -'['=98 -']'=99 -'('=100 -')'=101 -'<'=102 -'>'=103 +'type'=2 +'object'=3 +'storable'=4 +'implements'=5 +'ref'=6 +'fragment'=7 +'import'=8 +'external'=9 +'atom'=10 +'interface'=11 +'interfaces'=12 +'package'=13 +'value'=14 +'relation'=15 +'operation'=16 +'function'=17 +'constructor'=18 +'constructs'=19 +'input'=20 +'conform'=21 +'as'=22 +'bind'=23 +'to'=24 +'private'=25 +'shared'=26 +'state'=27 +'edge'=28 +'projection'=29 +'with'=30 +'using'=31 +'via'=32 +'materialize'=33 +'if'=34 +'absent'=35 +'on'=36 +'policy'=37 +'default'=38 +'source'=39 +'repository'=40 +'commit'=41 +'revision'=42 +'semantic-major'=43 +'on-delete'=44 +'retain-other'=45 +'keyed'=46 +'public-traversal'=47 +'id'=48 +'doc'=49 +'mode'=50 +'emits'=51 +'receiver'=52 +'requires'=53 +'any'=54 +'get'=55 +'set'=56 +'watch'=57 +'start'=58 +'stop'=59 +'read'=60 +'write'=61 +'resolve'=62 +'connect'=63 +'disconnect'=64 +'call'=65 +'watch-start'=66 +'watch-stop'=67 +'subscribe'=68 +'unsubscribe'=69 +'optimistic-register'=70 +'crdt'=71 +'optional-one'=72 +'exactly-one'=73 +'many-unique'=74 +'many'=75 +'ordered'=76 +'unit'=77 +'watch-handle'=78 +'message'=79 +'atom-ref'=80 +'interface-ref'=81 +'optional'=82 +'list'=83 +'record'=84 +'bool'=85 +'bytes'=86 +'double'=87 +'int32'=88 +'int64'=89 +'string'=90 +'uint32'=91 +'uint64'=92 +'true'=93 +'false'=94 +'null'=95 +'->'=96 +':'=97 +';'=98 +','=99 +'.'=100 +'{'=101 +'}'=102 +'['=103 +']'=104 +'('=105 +')'=106 +'<'=107 +'>'=108 +'&'=109 +'='=110 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index 21de55e..0aa0f03 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -5,160 +5,169 @@ import { Token } from "antlr4ng"; export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly WORKSPACE = 1; - public static readonly FRAGMENT = 2; - public static readonly IMPORT = 3; - public static readonly EXTERNAL = 4; - public static readonly ATOM = 5; - public static readonly INTERFACE = 6; - public static readonly INTERFACES = 7; - public static readonly PACKAGE = 8; - public static readonly VALUE = 9; - public static readonly RELATION = 10; - public static readonly OPERATION = 11; - public static readonly FUNCTION = 12; - public static readonly CONSTRUCTOR = 13; - public static readonly CONSTRUCTS = 14; - public static readonly INPUT = 15; - public static readonly CONFORM = 16; - public static readonly AS = 17; - public static readonly BIND = 18; - public static readonly TO = 19; - public static readonly PRIVATE = 20; - public static readonly SHARED = 21; - public static readonly STATE = 22; - public static readonly EDGE = 23; - public static readonly PROJECTION = 24; - public static readonly WITH = 25; - public static readonly USING = 26; - public static readonly VIA = 27; - public static readonly MATERIALIZE = 28; - public static readonly IF = 29; - public static readonly ABSENT = 30; - public static readonly ON = 31; - public static readonly POLICY = 32; - public static readonly DEFAULT = 33; - public static readonly SOURCE = 34; - public static readonly REPOSITORY = 35; - public static readonly COMMIT = 36; - public static readonly REVISION = 37; - public static readonly SEMANTIC_MAJOR = 38; - public static readonly ON_DELETE = 39; - public static readonly RETAIN_OTHER = 40; - public static readonly KEYED = 41; - public static readonly PUBLIC_TRAVERSAL = 42; - public static readonly ID = 43; - public static readonly DOC = 44; - public static readonly MODE = 45; - public static readonly EMITS = 46; - public static readonly RECEIVER = 47; - public static readonly REQUIRES = 48; - public static readonly ANY = 49; - public static readonly GET = 50; - public static readonly SET = 51; - public static readonly WATCH = 52; - public static readonly START = 53; - public static readonly STOP = 54; - public static readonly READ = 55; - public static readonly WRITE = 56; - public static readonly RESOLVE = 57; - public static readonly CONNECT = 58; - public static readonly DISCONNECT = 59; - public static readonly CALL = 60; - public static readonly WATCH_START = 61; - public static readonly WATCH_STOP = 62; - public static readonly SUBSCRIBE = 63; - public static readonly UNSUBSCRIBE = 64; - public static readonly OPTIMISTIC_REGISTER = 65; - public static readonly CRDT = 66; - public static readonly OPTIONAL_ONE = 67; - public static readonly EXACTLY_ONE = 68; - public static readonly MANY_UNIQUE = 69; - public static readonly MANY = 70; - public static readonly ORDERED = 71; - public static readonly UNIT = 72; - public static readonly WATCH_HANDLE = 73; - public static readonly MESSAGE = 74; - public static readonly ATOM_REF = 75; - public static readonly INTERFACE_REF = 76; - public static readonly OPTIONAL = 77; - public static readonly LIST = 78; - public static readonly RECORD = 79; - public static readonly BOOL = 80; - public static readonly BYTES = 81; - public static readonly DOUBLE = 82; - public static readonly INT32 = 83; - public static readonly INT64 = 84; - public static readonly STRING = 85; - public static readonly UINT32 = 86; - public static readonly UINT64 = 87; - public static readonly TRUE = 88; - public static readonly FALSE = 89; - public static readonly NULL = 90; - public static readonly ARROW = 91; - public static readonly COLON = 92; - public static readonly SEMI = 93; - public static readonly COMMA = 94; - public static readonly DOT = 95; - public static readonly LBRACE = 96; - public static readonly RBRACE = 97; - public static readonly LBRACK = 98; - public static readonly RBRACK = 99; - public static readonly LPAREN = 100; - public static readonly RPAREN = 101; - public static readonly LT = 102; - public static readonly GT = 103; - public static readonly INTEGER = 104; - public static readonly JSON_NUMBER = 105; - public static readonly IDENTIFIER = 106; - public static readonly STRING_LITERAL = 107; - public static readonly LINE_COMMENT = 108; - public static readonly BLOCK_COMMENT = 109; - public static readonly WS = 110; + public static readonly TYPE = 2; + public static readonly OBJECT = 3; + public static readonly STORABLE = 4; + public static readonly IMPLEMENTS = 5; + public static readonly REF = 6; + public static readonly FRAGMENT = 7; + public static readonly IMPORT = 8; + public static readonly EXTERNAL = 9; + public static readonly ATOM = 10; + public static readonly INTERFACE = 11; + public static readonly INTERFACES = 12; + public static readonly PACKAGE = 13; + public static readonly VALUE = 14; + public static readonly RELATION = 15; + public static readonly OPERATION = 16; + public static readonly FUNCTION = 17; + public static readonly CONSTRUCTOR = 18; + public static readonly CONSTRUCTS = 19; + public static readonly INPUT = 20; + public static readonly CONFORM = 21; + public static readonly AS = 22; + public static readonly BIND = 23; + public static readonly TO = 24; + public static readonly PRIVATE = 25; + public static readonly SHARED = 26; + public static readonly STATE = 27; + public static readonly EDGE = 28; + public static readonly PROJECTION = 29; + public static readonly WITH = 30; + public static readonly USING = 31; + public static readonly VIA = 32; + public static readonly MATERIALIZE = 33; + public static readonly IF = 34; + public static readonly ABSENT = 35; + public static readonly ON = 36; + public static readonly POLICY = 37; + public static readonly DEFAULT = 38; + public static readonly SOURCE = 39; + public static readonly REPOSITORY = 40; + public static readonly COMMIT = 41; + public static readonly REVISION = 42; + public static readonly SEMANTIC_MAJOR = 43; + public static readonly ON_DELETE = 44; + public static readonly RETAIN_OTHER = 45; + public static readonly KEYED = 46; + public static readonly PUBLIC_TRAVERSAL = 47; + public static readonly ID = 48; + public static readonly DOC = 49; + public static readonly MODE = 50; + public static readonly EMITS = 51; + public static readonly RECEIVER = 52; + public static readonly REQUIRES = 53; + public static readonly ANY = 54; + public static readonly GET = 55; + public static readonly SET = 56; + public static readonly WATCH = 57; + public static readonly START = 58; + public static readonly STOP = 59; + public static readonly READ = 60; + public static readonly WRITE = 61; + public static readonly RESOLVE = 62; + public static readonly CONNECT = 63; + public static readonly DISCONNECT = 64; + public static readonly CALL = 65; + public static readonly WATCH_START = 66; + public static readonly WATCH_STOP = 67; + public static readonly SUBSCRIBE = 68; + public static readonly UNSUBSCRIBE = 69; + public static readonly OPTIMISTIC_REGISTER = 70; + public static readonly CRDT = 71; + public static readonly OPTIONAL_ONE = 72; + public static readonly EXACTLY_ONE = 73; + public static readonly MANY_UNIQUE = 74; + public static readonly MANY = 75; + public static readonly ORDERED = 76; + public static readonly UNIT = 77; + public static readonly WATCH_HANDLE = 78; + public static readonly MESSAGE = 79; + public static readonly ATOM_REF = 80; + public static readonly INTERFACE_REF = 81; + public static readonly OPTIONAL = 82; + public static readonly LIST = 83; + public static readonly RECORD = 84; + public static readonly BOOL = 85; + public static readonly BYTES = 86; + public static readonly DOUBLE = 87; + public static readonly INT32 = 88; + public static readonly INT64 = 89; + public static readonly STRING = 90; + public static readonly UINT32 = 91; + public static readonly UINT64 = 92; + public static readonly TRUE = 93; + public static readonly FALSE = 94; + public static readonly NULL = 95; + public static readonly ARROW = 96; + public static readonly COLON = 97; + public static readonly SEMI = 98; + public static readonly COMMA = 99; + public static readonly DOT = 100; + public static readonly LBRACE = 101; + public static readonly RBRACE = 102; + public static readonly LBRACK = 103; + public static readonly RBRACK = 104; + public static readonly LPAREN = 105; + public static readonly RPAREN = 106; + public static readonly LT = 107; + public static readonly GT = 108; + public static readonly AMP = 109; + public static readonly EQUAL = 110; + public static readonly INTEGER = 111; + public static readonly JSON_NUMBER = 112; + public static readonly IDENTIFIER = 113; + public static readonly STRING_LITERAL = 114; + public static readonly LINE_COMMENT = 115; + public static readonly BLOCK_COMMENT = 116; + public static readonly WS = 117; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ]; public static readonly literalNames = [ - null, "'workspace'", "'fragment'", "'import'", "'external'", "'atom'", - "'interface'", "'interfaces'", "'package'", "'value'", "'relation'", - "'operation'", "'function'", "'constructor'", "'constructs'", "'input'", - "'conform'", "'as'", "'bind'", "'to'", "'private'", "'shared'", - "'state'", "'edge'", "'projection'", "'with'", "'using'", "'via'", - "'materialize'", "'if'", "'absent'", "'on'", "'policy'", "'default'", - "'source'", "'repository'", "'commit'", "'revision'", "'semantic-major'", - "'on-delete'", "'retain-other'", "'keyed'", "'public-traversal'", - "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", "'requires'", - "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", "'read'", - "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'", "'watch-start'", - "'watch-stop'", "'subscribe'", "'unsubscribe'", "'optimistic-register'", - "'crdt'", "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", - "'ordered'", "'unit'", "'watch-handle'", "'message'", "'atom-ref'", - "'interface-ref'", "'optional'", "'list'", "'record'", "'bool'", - "'bytes'", "'double'", "'int32'", "'int64'", "'string'", "'uint32'", - "'uint64'", "'true'", "'false'", "'null'", "'->'", "':'", "';'", - "','", "'.'", "'{'", "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'" + null, "'workspace'", "'type'", "'object'", "'storable'", "'implements'", + "'ref'", "'fragment'", "'import'", "'external'", "'atom'", "'interface'", + "'interfaces'", "'package'", "'value'", "'relation'", "'operation'", + "'function'", "'constructor'", "'constructs'", "'input'", "'conform'", + "'as'", "'bind'", "'to'", "'private'", "'shared'", "'state'", "'edge'", + "'projection'", "'with'", "'using'", "'via'", "'materialize'", "'if'", + "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", + "'commit'", "'revision'", "'semantic-major'", "'on-delete'", "'retain-other'", + "'keyed'", "'public-traversal'", "'id'", "'doc'", "'mode'", "'emits'", + "'receiver'", "'requires'", "'any'", "'get'", "'set'", "'watch'", + "'start'", "'stop'", "'read'", "'write'", "'resolve'", "'connect'", + "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", "'subscribe'", + "'unsubscribe'", "'optimistic-register'", "'crdt'", "'optional-one'", + "'exactly-one'", "'many-unique'", "'many'", "'ordered'", "'unit'", + "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", + "'optional'", "'list'", "'record'", "'bool'", "'bytes'", "'double'", + "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", "'true'", + "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", "'{'", + "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'", "'&'", "'='" ]; public static readonly symbolicNames = [ - null, "WORKSPACE", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", - "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", - "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "TO", - "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", - "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", - "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", - "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", - "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", - "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", - "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", - "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", - "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", - "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", - "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", - "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", - "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", - "LINE_COMMENT", "BLOCK_COMMENT", "WS" + null, "WORKSPACE", "TYPE", "OBJECT", "STORABLE", "IMPLEMENTS", "REF", + "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", + "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", + "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "TO", "PRIVATE", + "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", + "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", + "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", + "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", + "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", + "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", + "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", + "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", + "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", + "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", + "INT64", "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", + "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", + "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "AMP", "EQUAL", "INTEGER", + "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", + "WS" ]; public static readonly modeNames = [ @@ -166,24 +175,25 @@ export class QuixosCapabilityLexer extends antlr.Lexer { ]; public static readonly ruleNames = [ - "WORKSPACE", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", - "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", - "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "TO", - "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", - "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", - "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", - "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", - "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", - "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", - "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", - "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", - "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", - "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", - "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", - "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", - "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", - "ESC", "HEX", "LINE_COMMENT", "BLOCK_COMMENT", "WS", + "WORKSPACE", "TYPE", "OBJECT", "STORABLE", "IMPLEMENTS", "REF", + "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", + "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", + "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "TO", "PRIVATE", + "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", + "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", + "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", + "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", + "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", + "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", + "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", + "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", + "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", + "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", + "INT64", "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", + "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", + "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "AMP", "EQUAL", "INTEGER", + "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", + "BLOCK_COMMENT", "WS", ]; @@ -205,7 +215,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,110,1056,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7, + 4,0,117,1110,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7, 5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12, 2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19, 7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25, @@ -222,368 +232,390 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 2,91,7,91,2,92,7,92,2,93,7,93,2,94,7,94,2,95,7,95,2,96,7,96,2,97, 7,97,2,98,7,98,2,99,7,99,2,100,7,100,2,101,7,101,2,102,7,102,2,103, 7,103,2,104,7,104,2,105,7,105,2,106,7,106,2,107,7,107,2,108,7,108, - 2,109,7,109,2,110,7,110,2,111,7,111,1,0,1,0,1,0,1,0,1,0,1,0,1,0, - 1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2, - 1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4, - 1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6, - 1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8, - 1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1, - 10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1, - 11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1, - 12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1, - 13,1,14,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1, - 15,1,15,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1, - 19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1, - 20,1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1, - 24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1, - 27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1, - 28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,31,1, - 31,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1, - 32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1, - 34,1,34,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1, - 36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,37,1, - 37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1, - 38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1, + 2,109,7,109,2,110,7,110,2,111,7,111,2,112,7,112,2,113,7,113,2,114, + 7,114,2,115,7,115,2,116,7,116,2,117,7,117,2,118,7,118,1,0,1,0,1, + 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1, + 2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1, + 4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1, + 6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1, + 8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1, + 10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1, + 11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1, + 13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1, + 15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1, + 16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1, + 17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1, + 18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,23,1, + 23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,25,1,25,1,25,1, + 25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,1,27,1,27,1,27,1, + 27,1,27,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1, + 29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1,30,1,31,1,31,1, + 31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1, + 32,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,35,1,35,1, + 35,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,37,1,37,1, + 37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1, 39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1, - 40,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1, - 41,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,44,1, - 44,1,44,1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1, - 46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1, - 47,1,47,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1, - 50,1,51,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,52,1, - 53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1, - 55,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1, - 57,1,57,1,57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1, - 58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1, - 60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1, - 61,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1, - 62,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1, - 63,1,63,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1, - 64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1, - 65,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1, - 66,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1, - 68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,69,1, - 69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,71,1, - 71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1, - 72,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,74,1, - 74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1, - 75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,76,1,76,1,76,1,76,1, - 76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,78,1,78,1,78,1, - 78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1, - 80,1,80,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1, - 82,1,82,1,83,1,83,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,84,1, - 84,1,84,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1, - 86,1,86,1,86,1,87,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1, - 88,1,89,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,91,1,91,1,92,1,92,1, - 93,1,93,1,94,1,94,1,95,1,95,1,96,1,96,1,97,1,97,1,98,1,98,1,99,1, - 99,1,100,1,100,1,101,1,101,1,102,1,102,1,103,3,103,957,8,103,1,103, - 4,103,960,8,103,11,103,12,103,961,1,104,3,104,965,8,104,1,104,1, - 104,1,104,5,104,970,8,104,10,104,12,104,973,9,104,3,104,975,8,104, - 1,104,1,104,4,104,979,8,104,11,104,12,104,980,3,104,983,8,104,1, - 104,1,104,3,104,987,8,104,1,104,4,104,990,8,104,11,104,12,104,991, - 3,104,994,8,104,1,105,1,105,5,105,998,8,105,10,105,12,105,1001,9, - 105,1,106,1,106,1,106,5,106,1006,8,106,10,106,12,106,1009,9,106, - 1,106,1,106,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,3,107, - 1021,8,107,1,108,1,108,1,109,1,109,1,109,1,109,5,109,1029,8,109, - 10,109,12,109,1032,9,109,1,109,1,109,1,110,1,110,1,110,1,110,5,110, - 1040,8,110,10,110,12,110,1043,9,110,1,110,1,110,1,110,1,110,1,110, - 1,111,4,111,1051,8,111,11,111,12,111,1052,1,111,1,111,1,1041,0,112, - 1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13, - 27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24, - 49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35, - 71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46, - 93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56, - 113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131, - 66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74,149,75, - 151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,169, - 85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93,187,94, - 189,95,191,96,193,97,195,98,197,99,199,100,201,101,203,102,205,103, - 207,104,209,105,211,106,213,107,215,0,217,0,219,108,221,109,223, - 110,1,0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45, - 3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13, - 13,34,34,92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114, - 116,116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32, - 32,1070,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0, - 0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0, - 0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0, - 0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0, - 0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0, - 0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0, - 0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0, - 0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0, - 0,0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0, - 0,0,0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0, - 0,0,0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109, - 1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0, - 0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1, - 0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0, - 137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0, - 0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0,0,0,0,155, - 1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0, - 0,165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0,0,173,1, - 0,0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0, - 183,1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0,191,1,0, - 0,0,0,193,1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,199,1,0,0,0,0,201, - 1,0,0,0,0,203,1,0,0,0,0,205,1,0,0,0,0,207,1,0,0,0,0,209,1,0,0,0, - 0,211,1,0,0,0,0,213,1,0,0,0,0,219,1,0,0,0,0,221,1,0,0,0,0,223,1, - 0,0,0,1,225,1,0,0,0,3,235,1,0,0,0,5,244,1,0,0,0,7,251,1,0,0,0,9, - 260,1,0,0,0,11,265,1,0,0,0,13,275,1,0,0,0,15,286,1,0,0,0,17,294, - 1,0,0,0,19,300,1,0,0,0,21,309,1,0,0,0,23,319,1,0,0,0,25,328,1,0, - 0,0,27,340,1,0,0,0,29,351,1,0,0,0,31,357,1,0,0,0,33,365,1,0,0,0, - 35,368,1,0,0,0,37,373,1,0,0,0,39,376,1,0,0,0,41,384,1,0,0,0,43,391, - 1,0,0,0,45,397,1,0,0,0,47,402,1,0,0,0,49,413,1,0,0,0,51,418,1,0, - 0,0,53,424,1,0,0,0,55,428,1,0,0,0,57,440,1,0,0,0,59,443,1,0,0,0, - 61,450,1,0,0,0,63,453,1,0,0,0,65,460,1,0,0,0,67,468,1,0,0,0,69,475, - 1,0,0,0,71,486,1,0,0,0,73,493,1,0,0,0,75,502,1,0,0,0,77,517,1,0, - 0,0,79,527,1,0,0,0,81,540,1,0,0,0,83,546,1,0,0,0,85,563,1,0,0,0, - 87,566,1,0,0,0,89,570,1,0,0,0,91,575,1,0,0,0,93,581,1,0,0,0,95,590, - 1,0,0,0,97,599,1,0,0,0,99,603,1,0,0,0,101,607,1,0,0,0,103,611,1, - 0,0,0,105,617,1,0,0,0,107,623,1,0,0,0,109,628,1,0,0,0,111,633,1, - 0,0,0,113,639,1,0,0,0,115,647,1,0,0,0,117,655,1,0,0,0,119,666,1, - 0,0,0,121,671,1,0,0,0,123,683,1,0,0,0,125,694,1,0,0,0,127,704,1, - 0,0,0,129,716,1,0,0,0,131,736,1,0,0,0,133,741,1,0,0,0,135,754,1, - 0,0,0,137,766,1,0,0,0,139,778,1,0,0,0,141,783,1,0,0,0,143,791,1, - 0,0,0,145,796,1,0,0,0,147,809,1,0,0,0,149,817,1,0,0,0,151,826,1, - 0,0,0,153,840,1,0,0,0,155,849,1,0,0,0,157,854,1,0,0,0,159,861,1, - 0,0,0,161,866,1,0,0,0,163,872,1,0,0,0,165,879,1,0,0,0,167,885,1, - 0,0,0,169,891,1,0,0,0,171,898,1,0,0,0,173,905,1,0,0,0,175,912,1, - 0,0,0,177,917,1,0,0,0,179,923,1,0,0,0,181,928,1,0,0,0,183,931,1, - 0,0,0,185,933,1,0,0,0,187,935,1,0,0,0,189,937,1,0,0,0,191,939,1, - 0,0,0,193,941,1,0,0,0,195,943,1,0,0,0,197,945,1,0,0,0,199,947,1, - 0,0,0,201,949,1,0,0,0,203,951,1,0,0,0,205,953,1,0,0,0,207,956,1, - 0,0,0,209,964,1,0,0,0,211,995,1,0,0,0,213,1002,1,0,0,0,215,1012, - 1,0,0,0,217,1022,1,0,0,0,219,1024,1,0,0,0,221,1035,1,0,0,0,223,1050, - 1,0,0,0,225,226,5,119,0,0,226,227,5,111,0,0,227,228,5,114,0,0,228, - 229,5,107,0,0,229,230,5,115,0,0,230,231,5,112,0,0,231,232,5,97,0, - 0,232,233,5,99,0,0,233,234,5,101,0,0,234,2,1,0,0,0,235,236,5,102, - 0,0,236,237,5,114,0,0,237,238,5,97,0,0,238,239,5,103,0,0,239,240, - 5,109,0,0,240,241,5,101,0,0,241,242,5,110,0,0,242,243,5,116,0,0, - 243,4,1,0,0,0,244,245,5,105,0,0,245,246,5,109,0,0,246,247,5,112, - 0,0,247,248,5,111,0,0,248,249,5,114,0,0,249,250,5,116,0,0,250,6, - 1,0,0,0,251,252,5,101,0,0,252,253,5,120,0,0,253,254,5,116,0,0,254, - 255,5,101,0,0,255,256,5,114,0,0,256,257,5,110,0,0,257,258,5,97,0, - 0,258,259,5,108,0,0,259,8,1,0,0,0,260,261,5,97,0,0,261,262,5,116, - 0,0,262,263,5,111,0,0,263,264,5,109,0,0,264,10,1,0,0,0,265,266,5, - 105,0,0,266,267,5,110,0,0,267,268,5,116,0,0,268,269,5,101,0,0,269, - 270,5,114,0,0,270,271,5,102,0,0,271,272,5,97,0,0,272,273,5,99,0, - 0,273,274,5,101,0,0,274,12,1,0,0,0,275,276,5,105,0,0,276,277,5,110, - 0,0,277,278,5,116,0,0,278,279,5,101,0,0,279,280,5,114,0,0,280,281, - 5,102,0,0,281,282,5,97,0,0,282,283,5,99,0,0,283,284,5,101,0,0,284, - 285,5,115,0,0,285,14,1,0,0,0,286,287,5,112,0,0,287,288,5,97,0,0, - 288,289,5,99,0,0,289,290,5,107,0,0,290,291,5,97,0,0,291,292,5,103, - 0,0,292,293,5,101,0,0,293,16,1,0,0,0,294,295,5,118,0,0,295,296,5, - 97,0,0,296,297,5,108,0,0,297,298,5,117,0,0,298,299,5,101,0,0,299, - 18,1,0,0,0,300,301,5,114,0,0,301,302,5,101,0,0,302,303,5,108,0,0, - 303,304,5,97,0,0,304,305,5,116,0,0,305,306,5,105,0,0,306,307,5,111, - 0,0,307,308,5,110,0,0,308,20,1,0,0,0,309,310,5,111,0,0,310,311,5, - 112,0,0,311,312,5,101,0,0,312,313,5,114,0,0,313,314,5,97,0,0,314, - 315,5,116,0,0,315,316,5,105,0,0,316,317,5,111,0,0,317,318,5,110, - 0,0,318,22,1,0,0,0,319,320,5,102,0,0,320,321,5,117,0,0,321,322,5, - 110,0,0,322,323,5,99,0,0,323,324,5,116,0,0,324,325,5,105,0,0,325, - 326,5,111,0,0,326,327,5,110,0,0,327,24,1,0,0,0,328,329,5,99,0,0, - 329,330,5,111,0,0,330,331,5,110,0,0,331,332,5,115,0,0,332,333,5, - 116,0,0,333,334,5,114,0,0,334,335,5,117,0,0,335,336,5,99,0,0,336, - 337,5,116,0,0,337,338,5,111,0,0,338,339,5,114,0,0,339,26,1,0,0,0, - 340,341,5,99,0,0,341,342,5,111,0,0,342,343,5,110,0,0,343,344,5,115, - 0,0,344,345,5,116,0,0,345,346,5,114,0,0,346,347,5,117,0,0,347,348, - 5,99,0,0,348,349,5,116,0,0,349,350,5,115,0,0,350,28,1,0,0,0,351, - 352,5,105,0,0,352,353,5,110,0,0,353,354,5,112,0,0,354,355,5,117, - 0,0,355,356,5,116,0,0,356,30,1,0,0,0,357,358,5,99,0,0,358,359,5, - 111,0,0,359,360,5,110,0,0,360,361,5,102,0,0,361,362,5,111,0,0,362, - 363,5,114,0,0,363,364,5,109,0,0,364,32,1,0,0,0,365,366,5,97,0,0, - 366,367,5,115,0,0,367,34,1,0,0,0,368,369,5,98,0,0,369,370,5,105, - 0,0,370,371,5,110,0,0,371,372,5,100,0,0,372,36,1,0,0,0,373,374,5, - 116,0,0,374,375,5,111,0,0,375,38,1,0,0,0,376,377,5,112,0,0,377,378, - 5,114,0,0,378,379,5,105,0,0,379,380,5,118,0,0,380,381,5,97,0,0,381, - 382,5,116,0,0,382,383,5,101,0,0,383,40,1,0,0,0,384,385,5,115,0,0, - 385,386,5,104,0,0,386,387,5,97,0,0,387,388,5,114,0,0,388,389,5,101, - 0,0,389,390,5,100,0,0,390,42,1,0,0,0,391,392,5,115,0,0,392,393,5, - 116,0,0,393,394,5,97,0,0,394,395,5,116,0,0,395,396,5,101,0,0,396, - 44,1,0,0,0,397,398,5,101,0,0,398,399,5,100,0,0,399,400,5,103,0,0, - 400,401,5,101,0,0,401,46,1,0,0,0,402,403,5,112,0,0,403,404,5,114, - 0,0,404,405,5,111,0,0,405,406,5,106,0,0,406,407,5,101,0,0,407,408, - 5,99,0,0,408,409,5,116,0,0,409,410,5,105,0,0,410,411,5,111,0,0,411, - 412,5,110,0,0,412,48,1,0,0,0,413,414,5,119,0,0,414,415,5,105,0,0, - 415,416,5,116,0,0,416,417,5,104,0,0,417,50,1,0,0,0,418,419,5,117, - 0,0,419,420,5,115,0,0,420,421,5,105,0,0,421,422,5,110,0,0,422,423, - 5,103,0,0,423,52,1,0,0,0,424,425,5,118,0,0,425,426,5,105,0,0,426, - 427,5,97,0,0,427,54,1,0,0,0,428,429,5,109,0,0,429,430,5,97,0,0,430, - 431,5,116,0,0,431,432,5,101,0,0,432,433,5,114,0,0,433,434,5,105, - 0,0,434,435,5,97,0,0,435,436,5,108,0,0,436,437,5,105,0,0,437,438, - 5,122,0,0,438,439,5,101,0,0,439,56,1,0,0,0,440,441,5,105,0,0,441, - 442,5,102,0,0,442,58,1,0,0,0,443,444,5,97,0,0,444,445,5,98,0,0,445, - 446,5,115,0,0,446,447,5,101,0,0,447,448,5,110,0,0,448,449,5,116, - 0,0,449,60,1,0,0,0,450,451,5,111,0,0,451,452,5,110,0,0,452,62,1, - 0,0,0,453,454,5,112,0,0,454,455,5,111,0,0,455,456,5,108,0,0,456, - 457,5,105,0,0,457,458,5,99,0,0,458,459,5,121,0,0,459,64,1,0,0,0, - 460,461,5,100,0,0,461,462,5,101,0,0,462,463,5,102,0,0,463,464,5, - 97,0,0,464,465,5,117,0,0,465,466,5,108,0,0,466,467,5,116,0,0,467, - 66,1,0,0,0,468,469,5,115,0,0,469,470,5,111,0,0,470,471,5,117,0,0, - 471,472,5,114,0,0,472,473,5,99,0,0,473,474,5,101,0,0,474,68,1,0, - 0,0,475,476,5,114,0,0,476,477,5,101,0,0,477,478,5,112,0,0,478,479, - 5,111,0,0,479,480,5,115,0,0,480,481,5,105,0,0,481,482,5,116,0,0, - 482,483,5,111,0,0,483,484,5,114,0,0,484,485,5,121,0,0,485,70,1,0, - 0,0,486,487,5,99,0,0,487,488,5,111,0,0,488,489,5,109,0,0,489,490, - 5,109,0,0,490,491,5,105,0,0,491,492,5,116,0,0,492,72,1,0,0,0,493, - 494,5,114,0,0,494,495,5,101,0,0,495,496,5,118,0,0,496,497,5,105, - 0,0,497,498,5,115,0,0,498,499,5,105,0,0,499,500,5,111,0,0,500,501, - 5,110,0,0,501,74,1,0,0,0,502,503,5,115,0,0,503,504,5,101,0,0,504, - 505,5,109,0,0,505,506,5,97,0,0,506,507,5,110,0,0,507,508,5,116,0, - 0,508,509,5,105,0,0,509,510,5,99,0,0,510,511,5,45,0,0,511,512,5, - 109,0,0,512,513,5,97,0,0,513,514,5,106,0,0,514,515,5,111,0,0,515, - 516,5,114,0,0,516,76,1,0,0,0,517,518,5,111,0,0,518,519,5,110,0,0, - 519,520,5,45,0,0,520,521,5,100,0,0,521,522,5,101,0,0,522,523,5,108, - 0,0,523,524,5,101,0,0,524,525,5,116,0,0,525,526,5,101,0,0,526,78, - 1,0,0,0,527,528,5,114,0,0,528,529,5,101,0,0,529,530,5,116,0,0,530, - 531,5,97,0,0,531,532,5,105,0,0,532,533,5,110,0,0,533,534,5,45,0, - 0,534,535,5,111,0,0,535,536,5,116,0,0,536,537,5,104,0,0,537,538, - 5,101,0,0,538,539,5,114,0,0,539,80,1,0,0,0,540,541,5,107,0,0,541, - 542,5,101,0,0,542,543,5,121,0,0,543,544,5,101,0,0,544,545,5,100, - 0,0,545,82,1,0,0,0,546,547,5,112,0,0,547,548,5,117,0,0,548,549,5, - 98,0,0,549,550,5,108,0,0,550,551,5,105,0,0,551,552,5,99,0,0,552, - 553,5,45,0,0,553,554,5,116,0,0,554,555,5,114,0,0,555,556,5,97,0, - 0,556,557,5,118,0,0,557,558,5,101,0,0,558,559,5,114,0,0,559,560, - 5,115,0,0,560,561,5,97,0,0,561,562,5,108,0,0,562,84,1,0,0,0,563, - 564,5,105,0,0,564,565,5,100,0,0,565,86,1,0,0,0,566,567,5,100,0,0, - 567,568,5,111,0,0,568,569,5,99,0,0,569,88,1,0,0,0,570,571,5,109, - 0,0,571,572,5,111,0,0,572,573,5,100,0,0,573,574,5,101,0,0,574,90, - 1,0,0,0,575,576,5,101,0,0,576,577,5,109,0,0,577,578,5,105,0,0,578, - 579,5,116,0,0,579,580,5,115,0,0,580,92,1,0,0,0,581,582,5,114,0,0, - 582,583,5,101,0,0,583,584,5,99,0,0,584,585,5,101,0,0,585,586,5,105, - 0,0,586,587,5,118,0,0,587,588,5,101,0,0,588,589,5,114,0,0,589,94, - 1,0,0,0,590,591,5,114,0,0,591,592,5,101,0,0,592,593,5,113,0,0,593, - 594,5,117,0,0,594,595,5,105,0,0,595,596,5,114,0,0,596,597,5,101, - 0,0,597,598,5,115,0,0,598,96,1,0,0,0,599,600,5,97,0,0,600,601,5, - 110,0,0,601,602,5,121,0,0,602,98,1,0,0,0,603,604,5,103,0,0,604,605, - 5,101,0,0,605,606,5,116,0,0,606,100,1,0,0,0,607,608,5,115,0,0,608, - 609,5,101,0,0,609,610,5,116,0,0,610,102,1,0,0,0,611,612,5,119,0, - 0,612,613,5,97,0,0,613,614,5,116,0,0,614,615,5,99,0,0,615,616,5, - 104,0,0,616,104,1,0,0,0,617,618,5,115,0,0,618,619,5,116,0,0,619, - 620,5,97,0,0,620,621,5,114,0,0,621,622,5,116,0,0,622,106,1,0,0,0, - 623,624,5,115,0,0,624,625,5,116,0,0,625,626,5,111,0,0,626,627,5, - 112,0,0,627,108,1,0,0,0,628,629,5,114,0,0,629,630,5,101,0,0,630, - 631,5,97,0,0,631,632,5,100,0,0,632,110,1,0,0,0,633,634,5,119,0,0, - 634,635,5,114,0,0,635,636,5,105,0,0,636,637,5,116,0,0,637,638,5, - 101,0,0,638,112,1,0,0,0,639,640,5,114,0,0,640,641,5,101,0,0,641, - 642,5,115,0,0,642,643,5,111,0,0,643,644,5,108,0,0,644,645,5,118, - 0,0,645,646,5,101,0,0,646,114,1,0,0,0,647,648,5,99,0,0,648,649,5, - 111,0,0,649,650,5,110,0,0,650,651,5,110,0,0,651,652,5,101,0,0,652, - 653,5,99,0,0,653,654,5,116,0,0,654,116,1,0,0,0,655,656,5,100,0,0, - 656,657,5,105,0,0,657,658,5,115,0,0,658,659,5,99,0,0,659,660,5,111, - 0,0,660,661,5,110,0,0,661,662,5,110,0,0,662,663,5,101,0,0,663,664, - 5,99,0,0,664,665,5,116,0,0,665,118,1,0,0,0,666,667,5,99,0,0,667, - 668,5,97,0,0,668,669,5,108,0,0,669,670,5,108,0,0,670,120,1,0,0,0, - 671,672,5,119,0,0,672,673,5,97,0,0,673,674,5,116,0,0,674,675,5,99, - 0,0,675,676,5,104,0,0,676,677,5,45,0,0,677,678,5,115,0,0,678,679, - 5,116,0,0,679,680,5,97,0,0,680,681,5,114,0,0,681,682,5,116,0,0,682, - 122,1,0,0,0,683,684,5,119,0,0,684,685,5,97,0,0,685,686,5,116,0,0, - 686,687,5,99,0,0,687,688,5,104,0,0,688,689,5,45,0,0,689,690,5,115, - 0,0,690,691,5,116,0,0,691,692,5,111,0,0,692,693,5,112,0,0,693,124, - 1,0,0,0,694,695,5,115,0,0,695,696,5,117,0,0,696,697,5,98,0,0,697, - 698,5,115,0,0,698,699,5,99,0,0,699,700,5,114,0,0,700,701,5,105,0, - 0,701,702,5,98,0,0,702,703,5,101,0,0,703,126,1,0,0,0,704,705,5,117, - 0,0,705,706,5,110,0,0,706,707,5,115,0,0,707,708,5,117,0,0,708,709, - 5,98,0,0,709,710,5,115,0,0,710,711,5,99,0,0,711,712,5,114,0,0,712, - 713,5,105,0,0,713,714,5,98,0,0,714,715,5,101,0,0,715,128,1,0,0,0, - 716,717,5,111,0,0,717,718,5,112,0,0,718,719,5,116,0,0,719,720,5, - 105,0,0,720,721,5,109,0,0,721,722,5,105,0,0,722,723,5,115,0,0,723, - 724,5,116,0,0,724,725,5,105,0,0,725,726,5,99,0,0,726,727,5,45,0, - 0,727,728,5,114,0,0,728,729,5,101,0,0,729,730,5,103,0,0,730,731, - 5,105,0,0,731,732,5,115,0,0,732,733,5,116,0,0,733,734,5,101,0,0, - 734,735,5,114,0,0,735,130,1,0,0,0,736,737,5,99,0,0,737,738,5,114, - 0,0,738,739,5,100,0,0,739,740,5,116,0,0,740,132,1,0,0,0,741,742, - 5,111,0,0,742,743,5,112,0,0,743,744,5,116,0,0,744,745,5,105,0,0, - 745,746,5,111,0,0,746,747,5,110,0,0,747,748,5,97,0,0,748,749,5,108, - 0,0,749,750,5,45,0,0,750,751,5,111,0,0,751,752,5,110,0,0,752,753, - 5,101,0,0,753,134,1,0,0,0,754,755,5,101,0,0,755,756,5,120,0,0,756, - 757,5,97,0,0,757,758,5,99,0,0,758,759,5,116,0,0,759,760,5,108,0, - 0,760,761,5,121,0,0,761,762,5,45,0,0,762,763,5,111,0,0,763,764,5, - 110,0,0,764,765,5,101,0,0,765,136,1,0,0,0,766,767,5,109,0,0,767, - 768,5,97,0,0,768,769,5,110,0,0,769,770,5,121,0,0,770,771,5,45,0, - 0,771,772,5,117,0,0,772,773,5,110,0,0,773,774,5,105,0,0,774,775, - 5,113,0,0,775,776,5,117,0,0,776,777,5,101,0,0,777,138,1,0,0,0,778, - 779,5,109,0,0,779,780,5,97,0,0,780,781,5,110,0,0,781,782,5,121,0, - 0,782,140,1,0,0,0,783,784,5,111,0,0,784,785,5,114,0,0,785,786,5, - 100,0,0,786,787,5,101,0,0,787,788,5,114,0,0,788,789,5,101,0,0,789, - 790,5,100,0,0,790,142,1,0,0,0,791,792,5,117,0,0,792,793,5,110,0, - 0,793,794,5,105,0,0,794,795,5,116,0,0,795,144,1,0,0,0,796,797,5, - 119,0,0,797,798,5,97,0,0,798,799,5,116,0,0,799,800,5,99,0,0,800, - 801,5,104,0,0,801,802,5,45,0,0,802,803,5,104,0,0,803,804,5,97,0, - 0,804,805,5,110,0,0,805,806,5,100,0,0,806,807,5,108,0,0,807,808, - 5,101,0,0,808,146,1,0,0,0,809,810,5,109,0,0,810,811,5,101,0,0,811, - 812,5,115,0,0,812,813,5,115,0,0,813,814,5,97,0,0,814,815,5,103,0, - 0,815,816,5,101,0,0,816,148,1,0,0,0,817,818,5,97,0,0,818,819,5,116, - 0,0,819,820,5,111,0,0,820,821,5,109,0,0,821,822,5,45,0,0,822,823, - 5,114,0,0,823,824,5,101,0,0,824,825,5,102,0,0,825,150,1,0,0,0,826, - 827,5,105,0,0,827,828,5,110,0,0,828,829,5,116,0,0,829,830,5,101, - 0,0,830,831,5,114,0,0,831,832,5,102,0,0,832,833,5,97,0,0,833,834, - 5,99,0,0,834,835,5,101,0,0,835,836,5,45,0,0,836,837,5,114,0,0,837, - 838,5,101,0,0,838,839,5,102,0,0,839,152,1,0,0,0,840,841,5,111,0, - 0,841,842,5,112,0,0,842,843,5,116,0,0,843,844,5,105,0,0,844,845, - 5,111,0,0,845,846,5,110,0,0,846,847,5,97,0,0,847,848,5,108,0,0,848, - 154,1,0,0,0,849,850,5,108,0,0,850,851,5,105,0,0,851,852,5,115,0, - 0,852,853,5,116,0,0,853,156,1,0,0,0,854,855,5,114,0,0,855,856,5, - 101,0,0,856,857,5,99,0,0,857,858,5,111,0,0,858,859,5,114,0,0,859, - 860,5,100,0,0,860,158,1,0,0,0,861,862,5,98,0,0,862,863,5,111,0,0, - 863,864,5,111,0,0,864,865,5,108,0,0,865,160,1,0,0,0,866,867,5,98, - 0,0,867,868,5,121,0,0,868,869,5,116,0,0,869,870,5,101,0,0,870,871, - 5,115,0,0,871,162,1,0,0,0,872,873,5,100,0,0,873,874,5,111,0,0,874, - 875,5,117,0,0,875,876,5,98,0,0,876,877,5,108,0,0,877,878,5,101,0, - 0,878,164,1,0,0,0,879,880,5,105,0,0,880,881,5,110,0,0,881,882,5, - 116,0,0,882,883,5,51,0,0,883,884,5,50,0,0,884,166,1,0,0,0,885,886, - 5,105,0,0,886,887,5,110,0,0,887,888,5,116,0,0,888,889,5,54,0,0,889, - 890,5,52,0,0,890,168,1,0,0,0,891,892,5,115,0,0,892,893,5,116,0,0, - 893,894,5,114,0,0,894,895,5,105,0,0,895,896,5,110,0,0,896,897,5, - 103,0,0,897,170,1,0,0,0,898,899,5,117,0,0,899,900,5,105,0,0,900, - 901,5,110,0,0,901,902,5,116,0,0,902,903,5,51,0,0,903,904,5,50,0, - 0,904,172,1,0,0,0,905,906,5,117,0,0,906,907,5,105,0,0,907,908,5, - 110,0,0,908,909,5,116,0,0,909,910,5,54,0,0,910,911,5,52,0,0,911, - 174,1,0,0,0,912,913,5,116,0,0,913,914,5,114,0,0,914,915,5,117,0, - 0,915,916,5,101,0,0,916,176,1,0,0,0,917,918,5,102,0,0,918,919,5, - 97,0,0,919,920,5,108,0,0,920,921,5,115,0,0,921,922,5,101,0,0,922, - 178,1,0,0,0,923,924,5,110,0,0,924,925,5,117,0,0,925,926,5,108,0, - 0,926,927,5,108,0,0,927,180,1,0,0,0,928,929,5,45,0,0,929,930,5,62, - 0,0,930,182,1,0,0,0,931,932,5,58,0,0,932,184,1,0,0,0,933,934,5,59, - 0,0,934,186,1,0,0,0,935,936,5,44,0,0,936,188,1,0,0,0,937,938,5,46, - 0,0,938,190,1,0,0,0,939,940,5,123,0,0,940,192,1,0,0,0,941,942,5, - 125,0,0,942,194,1,0,0,0,943,944,5,91,0,0,944,196,1,0,0,0,945,946, - 5,93,0,0,946,198,1,0,0,0,947,948,5,40,0,0,948,200,1,0,0,0,949,950, - 5,41,0,0,950,202,1,0,0,0,951,952,5,60,0,0,952,204,1,0,0,0,953,954, - 5,62,0,0,954,206,1,0,0,0,955,957,5,45,0,0,956,955,1,0,0,0,956,957, - 1,0,0,0,957,959,1,0,0,0,958,960,7,0,0,0,959,958,1,0,0,0,960,961, - 1,0,0,0,961,959,1,0,0,0,961,962,1,0,0,0,962,208,1,0,0,0,963,965, - 5,45,0,0,964,963,1,0,0,0,964,965,1,0,0,0,965,974,1,0,0,0,966,975, - 5,48,0,0,967,971,7,1,0,0,968,970,7,0,0,0,969,968,1,0,0,0,970,973, - 1,0,0,0,971,969,1,0,0,0,971,972,1,0,0,0,972,975,1,0,0,0,973,971, - 1,0,0,0,974,966,1,0,0,0,974,967,1,0,0,0,975,982,1,0,0,0,976,978, - 5,46,0,0,977,979,7,0,0,0,978,977,1,0,0,0,979,980,1,0,0,0,980,978, - 1,0,0,0,980,981,1,0,0,0,981,983,1,0,0,0,982,976,1,0,0,0,982,983, - 1,0,0,0,983,993,1,0,0,0,984,986,7,2,0,0,985,987,7,3,0,0,986,985, - 1,0,0,0,986,987,1,0,0,0,987,989,1,0,0,0,988,990,7,0,0,0,989,988, - 1,0,0,0,990,991,1,0,0,0,991,989,1,0,0,0,991,992,1,0,0,0,992,994, - 1,0,0,0,993,984,1,0,0,0,993,994,1,0,0,0,994,210,1,0,0,0,995,999, - 7,4,0,0,996,998,7,5,0,0,997,996,1,0,0,0,998,1001,1,0,0,0,999,997, - 1,0,0,0,999,1000,1,0,0,0,1000,212,1,0,0,0,1001,999,1,0,0,0,1002, - 1007,5,34,0,0,1003,1006,3,215,107,0,1004,1006,8,6,0,0,1005,1003, - 1,0,0,0,1005,1004,1,0,0,0,1006,1009,1,0,0,0,1007,1005,1,0,0,0,1007, - 1008,1,0,0,0,1008,1010,1,0,0,0,1009,1007,1,0,0,0,1010,1011,5,34, - 0,0,1011,214,1,0,0,0,1012,1020,5,92,0,0,1013,1021,7,7,0,0,1014,1015, - 5,117,0,0,1015,1016,3,217,108,0,1016,1017,3,217,108,0,1017,1018, - 3,217,108,0,1018,1019,3,217,108,0,1019,1021,1,0,0,0,1020,1013,1, - 0,0,0,1020,1014,1,0,0,0,1021,216,1,0,0,0,1022,1023,7,8,0,0,1023, - 218,1,0,0,0,1024,1025,5,47,0,0,1025,1026,5,47,0,0,1026,1030,1,0, - 0,0,1027,1029,8,9,0,0,1028,1027,1,0,0,0,1029,1032,1,0,0,0,1030,1028, - 1,0,0,0,1030,1031,1,0,0,0,1031,1033,1,0,0,0,1032,1030,1,0,0,0,1033, - 1034,6,109,0,0,1034,220,1,0,0,0,1035,1036,5,47,0,0,1036,1037,5,42, - 0,0,1037,1041,1,0,0,0,1038,1040,9,0,0,0,1039,1038,1,0,0,0,1040,1043, - 1,0,0,0,1041,1042,1,0,0,0,1041,1039,1,0,0,0,1042,1044,1,0,0,0,1043, - 1041,1,0,0,0,1044,1045,5,42,0,0,1045,1046,5,47,0,0,1046,1047,1,0, - 0,0,1047,1048,6,110,0,0,1048,222,1,0,0,0,1049,1051,7,10,0,0,1050, - 1049,1,0,0,0,1051,1052,1,0,0,0,1052,1050,1,0,0,0,1052,1053,1,0,0, - 0,1053,1054,1,0,0,0,1054,1055,6,111,0,0,1055,224,1,0,0,0,18,0,956, - 961,964,971,974,980,982,986,991,993,999,1005,1007,1020,1030,1041, - 1052,1,0,1,0 + 40,1,40,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,42,1,42,1, + 42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1, + 43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,44,1,44,1,44,1, + 44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,45,1,45,1,45,1, + 45,1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1, + 46,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,48,1,48,1,48,1, + 48,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,50,1,51,1, + 51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1, + 52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,55,1, + 55,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1, + 57,1,57,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,60,1, + 60,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1, + 62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1, + 63,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1, + 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,66,1,66,1,66,1, + 66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,1, + 67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1, + 68,1,68,1,68,1,68,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1, + 69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1, + 70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1, + 71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1, + 72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1, + 73,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1, + 75,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1, + 77,1,77,1,77,1,77,1,77,1,77,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1, + 78,1,79,1,79,1,79,1,79,1,79,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1, + 80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,81,1,81,1, + 81,1,81,1,81,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,83,1, + 83,1,83,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,84,1,85,1,85,1, + 85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,87,1,87,1, + 87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1, + 89,1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,91,1,91,1, + 91,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,92,1,93,1,93,1,93,1, + 93,1,93,1,93,1,94,1,94,1,94,1,94,1,94,1,95,1,95,1,95,1,96,1,96,1, + 97,1,97,1,98,1,98,1,99,1,99,1,100,1,100,1,101,1,101,1,102,1,102, + 1,103,1,103,1,104,1,104,1,105,1,105,1,106,1,106,1,107,1,107,1,108, + 1,108,1,109,1,109,1,110,3,110,1011,8,110,1,110,4,110,1014,8,110, + 11,110,12,110,1015,1,111,3,111,1019,8,111,1,111,1,111,1,111,5,111, + 1024,8,111,10,111,12,111,1027,9,111,3,111,1029,8,111,1,111,1,111, + 4,111,1033,8,111,11,111,12,111,1034,3,111,1037,8,111,1,111,1,111, + 3,111,1041,8,111,1,111,4,111,1044,8,111,11,111,12,111,1045,3,111, + 1048,8,111,1,112,1,112,5,112,1052,8,112,10,112,12,112,1055,9,112, + 1,113,1,113,1,113,5,113,1060,8,113,10,113,12,113,1063,9,113,1,113, + 1,113,1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,114,3,114,1075, + 8,114,1,115,1,115,1,116,1,116,1,116,1,116,5,116,1083,8,116,10,116, + 12,116,1086,9,116,1,116,1,116,1,117,1,117,1,117,1,117,5,117,1094, + 8,117,10,117,12,117,1097,9,117,1,117,1,117,1,117,1,117,1,117,1,118, + 4,118,1105,8,118,11,118,12,118,1106,1,118,1,118,1,1095,0,119,1,1, + 3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14, + 29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,49,25, + 51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71,36, + 73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,93,47, + 95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56,113, + 57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131,66, + 133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74,149,75,151, + 76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,169,85, + 171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93,187,94,189, + 95,191,96,193,97,195,98,197,99,199,100,201,101,203,102,205,103,207, + 104,209,105,211,106,213,107,215,108,217,109,219,110,221,111,223, + 112,225,113,227,114,229,0,231,0,233,115,235,116,237,117,1,0,11,1, + 0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,65,90,95, + 95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,34,92, + 92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114,116,116,3, + 0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,1124,0, + 1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1, + 0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1, + 0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1, + 0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,1, + 0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51,1, + 0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0,0,61,1, + 0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,0,71,1, + 0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,0,81,1, + 0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0,0,0,91,1, + 0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,0,0,101, + 1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,0, + 0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,0,119,1, + 0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1,0,0,0,0, + 129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0,137,1,0, + 0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0,0,0,0,147, + 1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0,0,0,0,155,1,0,0,0, + 0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0,0,165,1, + 0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0,0,173,1,0,0,0,0, + 175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0,183,1,0, + 0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0,191,1,0,0,0,0,193, + 1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,199,1,0,0,0,0,201,1,0,0,0, + 0,203,1,0,0,0,0,205,1,0,0,0,0,207,1,0,0,0,0,209,1,0,0,0,0,211,1, + 0,0,0,0,213,1,0,0,0,0,215,1,0,0,0,0,217,1,0,0,0,0,219,1,0,0,0,0, + 221,1,0,0,0,0,223,1,0,0,0,0,225,1,0,0,0,0,227,1,0,0,0,0,233,1,0, + 0,0,0,235,1,0,0,0,0,237,1,0,0,0,1,239,1,0,0,0,3,249,1,0,0,0,5,254, + 1,0,0,0,7,261,1,0,0,0,9,270,1,0,0,0,11,281,1,0,0,0,13,285,1,0,0, + 0,15,294,1,0,0,0,17,301,1,0,0,0,19,310,1,0,0,0,21,315,1,0,0,0,23, + 325,1,0,0,0,25,336,1,0,0,0,27,344,1,0,0,0,29,350,1,0,0,0,31,359, + 1,0,0,0,33,369,1,0,0,0,35,378,1,0,0,0,37,390,1,0,0,0,39,401,1,0, + 0,0,41,407,1,0,0,0,43,415,1,0,0,0,45,418,1,0,0,0,47,423,1,0,0,0, + 49,426,1,0,0,0,51,434,1,0,0,0,53,441,1,0,0,0,55,447,1,0,0,0,57,452, + 1,0,0,0,59,463,1,0,0,0,61,468,1,0,0,0,63,474,1,0,0,0,65,478,1,0, + 0,0,67,490,1,0,0,0,69,493,1,0,0,0,71,500,1,0,0,0,73,503,1,0,0,0, + 75,510,1,0,0,0,77,518,1,0,0,0,79,525,1,0,0,0,81,536,1,0,0,0,83,543, + 1,0,0,0,85,552,1,0,0,0,87,567,1,0,0,0,89,577,1,0,0,0,91,590,1,0, + 0,0,93,596,1,0,0,0,95,613,1,0,0,0,97,616,1,0,0,0,99,620,1,0,0,0, + 101,625,1,0,0,0,103,631,1,0,0,0,105,640,1,0,0,0,107,649,1,0,0,0, + 109,653,1,0,0,0,111,657,1,0,0,0,113,661,1,0,0,0,115,667,1,0,0,0, + 117,673,1,0,0,0,119,678,1,0,0,0,121,683,1,0,0,0,123,689,1,0,0,0, + 125,697,1,0,0,0,127,705,1,0,0,0,129,716,1,0,0,0,131,721,1,0,0,0, + 133,733,1,0,0,0,135,744,1,0,0,0,137,754,1,0,0,0,139,766,1,0,0,0, + 141,786,1,0,0,0,143,791,1,0,0,0,145,804,1,0,0,0,147,816,1,0,0,0, + 149,828,1,0,0,0,151,833,1,0,0,0,153,841,1,0,0,0,155,846,1,0,0,0, + 157,859,1,0,0,0,159,867,1,0,0,0,161,876,1,0,0,0,163,890,1,0,0,0, + 165,899,1,0,0,0,167,904,1,0,0,0,169,911,1,0,0,0,171,916,1,0,0,0, + 173,922,1,0,0,0,175,929,1,0,0,0,177,935,1,0,0,0,179,941,1,0,0,0, + 181,948,1,0,0,0,183,955,1,0,0,0,185,962,1,0,0,0,187,967,1,0,0,0, + 189,973,1,0,0,0,191,978,1,0,0,0,193,981,1,0,0,0,195,983,1,0,0,0, + 197,985,1,0,0,0,199,987,1,0,0,0,201,989,1,0,0,0,203,991,1,0,0,0, + 205,993,1,0,0,0,207,995,1,0,0,0,209,997,1,0,0,0,211,999,1,0,0,0, + 213,1001,1,0,0,0,215,1003,1,0,0,0,217,1005,1,0,0,0,219,1007,1,0, + 0,0,221,1010,1,0,0,0,223,1018,1,0,0,0,225,1049,1,0,0,0,227,1056, + 1,0,0,0,229,1066,1,0,0,0,231,1076,1,0,0,0,233,1078,1,0,0,0,235,1089, + 1,0,0,0,237,1104,1,0,0,0,239,240,5,119,0,0,240,241,5,111,0,0,241, + 242,5,114,0,0,242,243,5,107,0,0,243,244,5,115,0,0,244,245,5,112, + 0,0,245,246,5,97,0,0,246,247,5,99,0,0,247,248,5,101,0,0,248,2,1, + 0,0,0,249,250,5,116,0,0,250,251,5,121,0,0,251,252,5,112,0,0,252, + 253,5,101,0,0,253,4,1,0,0,0,254,255,5,111,0,0,255,256,5,98,0,0,256, + 257,5,106,0,0,257,258,5,101,0,0,258,259,5,99,0,0,259,260,5,116,0, + 0,260,6,1,0,0,0,261,262,5,115,0,0,262,263,5,116,0,0,263,264,5,111, + 0,0,264,265,5,114,0,0,265,266,5,97,0,0,266,267,5,98,0,0,267,268, + 5,108,0,0,268,269,5,101,0,0,269,8,1,0,0,0,270,271,5,105,0,0,271, + 272,5,109,0,0,272,273,5,112,0,0,273,274,5,108,0,0,274,275,5,101, + 0,0,275,276,5,109,0,0,276,277,5,101,0,0,277,278,5,110,0,0,278,279, + 5,116,0,0,279,280,5,115,0,0,280,10,1,0,0,0,281,282,5,114,0,0,282, + 283,5,101,0,0,283,284,5,102,0,0,284,12,1,0,0,0,285,286,5,102,0,0, + 286,287,5,114,0,0,287,288,5,97,0,0,288,289,5,103,0,0,289,290,5,109, + 0,0,290,291,5,101,0,0,291,292,5,110,0,0,292,293,5,116,0,0,293,14, + 1,0,0,0,294,295,5,105,0,0,295,296,5,109,0,0,296,297,5,112,0,0,297, + 298,5,111,0,0,298,299,5,114,0,0,299,300,5,116,0,0,300,16,1,0,0,0, + 301,302,5,101,0,0,302,303,5,120,0,0,303,304,5,116,0,0,304,305,5, + 101,0,0,305,306,5,114,0,0,306,307,5,110,0,0,307,308,5,97,0,0,308, + 309,5,108,0,0,309,18,1,0,0,0,310,311,5,97,0,0,311,312,5,116,0,0, + 312,313,5,111,0,0,313,314,5,109,0,0,314,20,1,0,0,0,315,316,5,105, + 0,0,316,317,5,110,0,0,317,318,5,116,0,0,318,319,5,101,0,0,319,320, + 5,114,0,0,320,321,5,102,0,0,321,322,5,97,0,0,322,323,5,99,0,0,323, + 324,5,101,0,0,324,22,1,0,0,0,325,326,5,105,0,0,326,327,5,110,0,0, + 327,328,5,116,0,0,328,329,5,101,0,0,329,330,5,114,0,0,330,331,5, + 102,0,0,331,332,5,97,0,0,332,333,5,99,0,0,333,334,5,101,0,0,334, + 335,5,115,0,0,335,24,1,0,0,0,336,337,5,112,0,0,337,338,5,97,0,0, + 338,339,5,99,0,0,339,340,5,107,0,0,340,341,5,97,0,0,341,342,5,103, + 0,0,342,343,5,101,0,0,343,26,1,0,0,0,344,345,5,118,0,0,345,346,5, + 97,0,0,346,347,5,108,0,0,347,348,5,117,0,0,348,349,5,101,0,0,349, + 28,1,0,0,0,350,351,5,114,0,0,351,352,5,101,0,0,352,353,5,108,0,0, + 353,354,5,97,0,0,354,355,5,116,0,0,355,356,5,105,0,0,356,357,5,111, + 0,0,357,358,5,110,0,0,358,30,1,0,0,0,359,360,5,111,0,0,360,361,5, + 112,0,0,361,362,5,101,0,0,362,363,5,114,0,0,363,364,5,97,0,0,364, + 365,5,116,0,0,365,366,5,105,0,0,366,367,5,111,0,0,367,368,5,110, + 0,0,368,32,1,0,0,0,369,370,5,102,0,0,370,371,5,117,0,0,371,372,5, + 110,0,0,372,373,5,99,0,0,373,374,5,116,0,0,374,375,5,105,0,0,375, + 376,5,111,0,0,376,377,5,110,0,0,377,34,1,0,0,0,378,379,5,99,0,0, + 379,380,5,111,0,0,380,381,5,110,0,0,381,382,5,115,0,0,382,383,5, + 116,0,0,383,384,5,114,0,0,384,385,5,117,0,0,385,386,5,99,0,0,386, + 387,5,116,0,0,387,388,5,111,0,0,388,389,5,114,0,0,389,36,1,0,0,0, + 390,391,5,99,0,0,391,392,5,111,0,0,392,393,5,110,0,0,393,394,5,115, + 0,0,394,395,5,116,0,0,395,396,5,114,0,0,396,397,5,117,0,0,397,398, + 5,99,0,0,398,399,5,116,0,0,399,400,5,115,0,0,400,38,1,0,0,0,401, + 402,5,105,0,0,402,403,5,110,0,0,403,404,5,112,0,0,404,405,5,117, + 0,0,405,406,5,116,0,0,406,40,1,0,0,0,407,408,5,99,0,0,408,409,5, + 111,0,0,409,410,5,110,0,0,410,411,5,102,0,0,411,412,5,111,0,0,412, + 413,5,114,0,0,413,414,5,109,0,0,414,42,1,0,0,0,415,416,5,97,0,0, + 416,417,5,115,0,0,417,44,1,0,0,0,418,419,5,98,0,0,419,420,5,105, + 0,0,420,421,5,110,0,0,421,422,5,100,0,0,422,46,1,0,0,0,423,424,5, + 116,0,0,424,425,5,111,0,0,425,48,1,0,0,0,426,427,5,112,0,0,427,428, + 5,114,0,0,428,429,5,105,0,0,429,430,5,118,0,0,430,431,5,97,0,0,431, + 432,5,116,0,0,432,433,5,101,0,0,433,50,1,0,0,0,434,435,5,115,0,0, + 435,436,5,104,0,0,436,437,5,97,0,0,437,438,5,114,0,0,438,439,5,101, + 0,0,439,440,5,100,0,0,440,52,1,0,0,0,441,442,5,115,0,0,442,443,5, + 116,0,0,443,444,5,97,0,0,444,445,5,116,0,0,445,446,5,101,0,0,446, + 54,1,0,0,0,447,448,5,101,0,0,448,449,5,100,0,0,449,450,5,103,0,0, + 450,451,5,101,0,0,451,56,1,0,0,0,452,453,5,112,0,0,453,454,5,114, + 0,0,454,455,5,111,0,0,455,456,5,106,0,0,456,457,5,101,0,0,457,458, + 5,99,0,0,458,459,5,116,0,0,459,460,5,105,0,0,460,461,5,111,0,0,461, + 462,5,110,0,0,462,58,1,0,0,0,463,464,5,119,0,0,464,465,5,105,0,0, + 465,466,5,116,0,0,466,467,5,104,0,0,467,60,1,0,0,0,468,469,5,117, + 0,0,469,470,5,115,0,0,470,471,5,105,0,0,471,472,5,110,0,0,472,473, + 5,103,0,0,473,62,1,0,0,0,474,475,5,118,0,0,475,476,5,105,0,0,476, + 477,5,97,0,0,477,64,1,0,0,0,478,479,5,109,0,0,479,480,5,97,0,0,480, + 481,5,116,0,0,481,482,5,101,0,0,482,483,5,114,0,0,483,484,5,105, + 0,0,484,485,5,97,0,0,485,486,5,108,0,0,486,487,5,105,0,0,487,488, + 5,122,0,0,488,489,5,101,0,0,489,66,1,0,0,0,490,491,5,105,0,0,491, + 492,5,102,0,0,492,68,1,0,0,0,493,494,5,97,0,0,494,495,5,98,0,0,495, + 496,5,115,0,0,496,497,5,101,0,0,497,498,5,110,0,0,498,499,5,116, + 0,0,499,70,1,0,0,0,500,501,5,111,0,0,501,502,5,110,0,0,502,72,1, + 0,0,0,503,504,5,112,0,0,504,505,5,111,0,0,505,506,5,108,0,0,506, + 507,5,105,0,0,507,508,5,99,0,0,508,509,5,121,0,0,509,74,1,0,0,0, + 510,511,5,100,0,0,511,512,5,101,0,0,512,513,5,102,0,0,513,514,5, + 97,0,0,514,515,5,117,0,0,515,516,5,108,0,0,516,517,5,116,0,0,517, + 76,1,0,0,0,518,519,5,115,0,0,519,520,5,111,0,0,520,521,5,117,0,0, + 521,522,5,114,0,0,522,523,5,99,0,0,523,524,5,101,0,0,524,78,1,0, + 0,0,525,526,5,114,0,0,526,527,5,101,0,0,527,528,5,112,0,0,528,529, + 5,111,0,0,529,530,5,115,0,0,530,531,5,105,0,0,531,532,5,116,0,0, + 532,533,5,111,0,0,533,534,5,114,0,0,534,535,5,121,0,0,535,80,1,0, + 0,0,536,537,5,99,0,0,537,538,5,111,0,0,538,539,5,109,0,0,539,540, + 5,109,0,0,540,541,5,105,0,0,541,542,5,116,0,0,542,82,1,0,0,0,543, + 544,5,114,0,0,544,545,5,101,0,0,545,546,5,118,0,0,546,547,5,105, + 0,0,547,548,5,115,0,0,548,549,5,105,0,0,549,550,5,111,0,0,550,551, + 5,110,0,0,551,84,1,0,0,0,552,553,5,115,0,0,553,554,5,101,0,0,554, + 555,5,109,0,0,555,556,5,97,0,0,556,557,5,110,0,0,557,558,5,116,0, + 0,558,559,5,105,0,0,559,560,5,99,0,0,560,561,5,45,0,0,561,562,5, + 109,0,0,562,563,5,97,0,0,563,564,5,106,0,0,564,565,5,111,0,0,565, + 566,5,114,0,0,566,86,1,0,0,0,567,568,5,111,0,0,568,569,5,110,0,0, + 569,570,5,45,0,0,570,571,5,100,0,0,571,572,5,101,0,0,572,573,5,108, + 0,0,573,574,5,101,0,0,574,575,5,116,0,0,575,576,5,101,0,0,576,88, + 1,0,0,0,577,578,5,114,0,0,578,579,5,101,0,0,579,580,5,116,0,0,580, + 581,5,97,0,0,581,582,5,105,0,0,582,583,5,110,0,0,583,584,5,45,0, + 0,584,585,5,111,0,0,585,586,5,116,0,0,586,587,5,104,0,0,587,588, + 5,101,0,0,588,589,5,114,0,0,589,90,1,0,0,0,590,591,5,107,0,0,591, + 592,5,101,0,0,592,593,5,121,0,0,593,594,5,101,0,0,594,595,5,100, + 0,0,595,92,1,0,0,0,596,597,5,112,0,0,597,598,5,117,0,0,598,599,5, + 98,0,0,599,600,5,108,0,0,600,601,5,105,0,0,601,602,5,99,0,0,602, + 603,5,45,0,0,603,604,5,116,0,0,604,605,5,114,0,0,605,606,5,97,0, + 0,606,607,5,118,0,0,607,608,5,101,0,0,608,609,5,114,0,0,609,610, + 5,115,0,0,610,611,5,97,0,0,611,612,5,108,0,0,612,94,1,0,0,0,613, + 614,5,105,0,0,614,615,5,100,0,0,615,96,1,0,0,0,616,617,5,100,0,0, + 617,618,5,111,0,0,618,619,5,99,0,0,619,98,1,0,0,0,620,621,5,109, + 0,0,621,622,5,111,0,0,622,623,5,100,0,0,623,624,5,101,0,0,624,100, + 1,0,0,0,625,626,5,101,0,0,626,627,5,109,0,0,627,628,5,105,0,0,628, + 629,5,116,0,0,629,630,5,115,0,0,630,102,1,0,0,0,631,632,5,114,0, + 0,632,633,5,101,0,0,633,634,5,99,0,0,634,635,5,101,0,0,635,636,5, + 105,0,0,636,637,5,118,0,0,637,638,5,101,0,0,638,639,5,114,0,0,639, + 104,1,0,0,0,640,641,5,114,0,0,641,642,5,101,0,0,642,643,5,113,0, + 0,643,644,5,117,0,0,644,645,5,105,0,0,645,646,5,114,0,0,646,647, + 5,101,0,0,647,648,5,115,0,0,648,106,1,0,0,0,649,650,5,97,0,0,650, + 651,5,110,0,0,651,652,5,121,0,0,652,108,1,0,0,0,653,654,5,103,0, + 0,654,655,5,101,0,0,655,656,5,116,0,0,656,110,1,0,0,0,657,658,5, + 115,0,0,658,659,5,101,0,0,659,660,5,116,0,0,660,112,1,0,0,0,661, + 662,5,119,0,0,662,663,5,97,0,0,663,664,5,116,0,0,664,665,5,99,0, + 0,665,666,5,104,0,0,666,114,1,0,0,0,667,668,5,115,0,0,668,669,5, + 116,0,0,669,670,5,97,0,0,670,671,5,114,0,0,671,672,5,116,0,0,672, + 116,1,0,0,0,673,674,5,115,0,0,674,675,5,116,0,0,675,676,5,111,0, + 0,676,677,5,112,0,0,677,118,1,0,0,0,678,679,5,114,0,0,679,680,5, + 101,0,0,680,681,5,97,0,0,681,682,5,100,0,0,682,120,1,0,0,0,683,684, + 5,119,0,0,684,685,5,114,0,0,685,686,5,105,0,0,686,687,5,116,0,0, + 687,688,5,101,0,0,688,122,1,0,0,0,689,690,5,114,0,0,690,691,5,101, + 0,0,691,692,5,115,0,0,692,693,5,111,0,0,693,694,5,108,0,0,694,695, + 5,118,0,0,695,696,5,101,0,0,696,124,1,0,0,0,697,698,5,99,0,0,698, + 699,5,111,0,0,699,700,5,110,0,0,700,701,5,110,0,0,701,702,5,101, + 0,0,702,703,5,99,0,0,703,704,5,116,0,0,704,126,1,0,0,0,705,706,5, + 100,0,0,706,707,5,105,0,0,707,708,5,115,0,0,708,709,5,99,0,0,709, + 710,5,111,0,0,710,711,5,110,0,0,711,712,5,110,0,0,712,713,5,101, + 0,0,713,714,5,99,0,0,714,715,5,116,0,0,715,128,1,0,0,0,716,717,5, + 99,0,0,717,718,5,97,0,0,718,719,5,108,0,0,719,720,5,108,0,0,720, + 130,1,0,0,0,721,722,5,119,0,0,722,723,5,97,0,0,723,724,5,116,0,0, + 724,725,5,99,0,0,725,726,5,104,0,0,726,727,5,45,0,0,727,728,5,115, + 0,0,728,729,5,116,0,0,729,730,5,97,0,0,730,731,5,114,0,0,731,732, + 5,116,0,0,732,132,1,0,0,0,733,734,5,119,0,0,734,735,5,97,0,0,735, + 736,5,116,0,0,736,737,5,99,0,0,737,738,5,104,0,0,738,739,5,45,0, + 0,739,740,5,115,0,0,740,741,5,116,0,0,741,742,5,111,0,0,742,743, + 5,112,0,0,743,134,1,0,0,0,744,745,5,115,0,0,745,746,5,117,0,0,746, + 747,5,98,0,0,747,748,5,115,0,0,748,749,5,99,0,0,749,750,5,114,0, + 0,750,751,5,105,0,0,751,752,5,98,0,0,752,753,5,101,0,0,753,136,1, + 0,0,0,754,755,5,117,0,0,755,756,5,110,0,0,756,757,5,115,0,0,757, + 758,5,117,0,0,758,759,5,98,0,0,759,760,5,115,0,0,760,761,5,99,0, + 0,761,762,5,114,0,0,762,763,5,105,0,0,763,764,5,98,0,0,764,765,5, + 101,0,0,765,138,1,0,0,0,766,767,5,111,0,0,767,768,5,112,0,0,768, + 769,5,116,0,0,769,770,5,105,0,0,770,771,5,109,0,0,771,772,5,105, + 0,0,772,773,5,115,0,0,773,774,5,116,0,0,774,775,5,105,0,0,775,776, + 5,99,0,0,776,777,5,45,0,0,777,778,5,114,0,0,778,779,5,101,0,0,779, + 780,5,103,0,0,780,781,5,105,0,0,781,782,5,115,0,0,782,783,5,116, + 0,0,783,784,5,101,0,0,784,785,5,114,0,0,785,140,1,0,0,0,786,787, + 5,99,0,0,787,788,5,114,0,0,788,789,5,100,0,0,789,790,5,116,0,0,790, + 142,1,0,0,0,791,792,5,111,0,0,792,793,5,112,0,0,793,794,5,116,0, + 0,794,795,5,105,0,0,795,796,5,111,0,0,796,797,5,110,0,0,797,798, + 5,97,0,0,798,799,5,108,0,0,799,800,5,45,0,0,800,801,5,111,0,0,801, + 802,5,110,0,0,802,803,5,101,0,0,803,144,1,0,0,0,804,805,5,101,0, + 0,805,806,5,120,0,0,806,807,5,97,0,0,807,808,5,99,0,0,808,809,5, + 116,0,0,809,810,5,108,0,0,810,811,5,121,0,0,811,812,5,45,0,0,812, + 813,5,111,0,0,813,814,5,110,0,0,814,815,5,101,0,0,815,146,1,0,0, + 0,816,817,5,109,0,0,817,818,5,97,0,0,818,819,5,110,0,0,819,820,5, + 121,0,0,820,821,5,45,0,0,821,822,5,117,0,0,822,823,5,110,0,0,823, + 824,5,105,0,0,824,825,5,113,0,0,825,826,5,117,0,0,826,827,5,101, + 0,0,827,148,1,0,0,0,828,829,5,109,0,0,829,830,5,97,0,0,830,831,5, + 110,0,0,831,832,5,121,0,0,832,150,1,0,0,0,833,834,5,111,0,0,834, + 835,5,114,0,0,835,836,5,100,0,0,836,837,5,101,0,0,837,838,5,114, + 0,0,838,839,5,101,0,0,839,840,5,100,0,0,840,152,1,0,0,0,841,842, + 5,117,0,0,842,843,5,110,0,0,843,844,5,105,0,0,844,845,5,116,0,0, + 845,154,1,0,0,0,846,847,5,119,0,0,847,848,5,97,0,0,848,849,5,116, + 0,0,849,850,5,99,0,0,850,851,5,104,0,0,851,852,5,45,0,0,852,853, + 5,104,0,0,853,854,5,97,0,0,854,855,5,110,0,0,855,856,5,100,0,0,856, + 857,5,108,0,0,857,858,5,101,0,0,858,156,1,0,0,0,859,860,5,109,0, + 0,860,861,5,101,0,0,861,862,5,115,0,0,862,863,5,115,0,0,863,864, + 5,97,0,0,864,865,5,103,0,0,865,866,5,101,0,0,866,158,1,0,0,0,867, + 868,5,97,0,0,868,869,5,116,0,0,869,870,5,111,0,0,870,871,5,109,0, + 0,871,872,5,45,0,0,872,873,5,114,0,0,873,874,5,101,0,0,874,875,5, + 102,0,0,875,160,1,0,0,0,876,877,5,105,0,0,877,878,5,110,0,0,878, + 879,5,116,0,0,879,880,5,101,0,0,880,881,5,114,0,0,881,882,5,102, + 0,0,882,883,5,97,0,0,883,884,5,99,0,0,884,885,5,101,0,0,885,886, + 5,45,0,0,886,887,5,114,0,0,887,888,5,101,0,0,888,889,5,102,0,0,889, + 162,1,0,0,0,890,891,5,111,0,0,891,892,5,112,0,0,892,893,5,116,0, + 0,893,894,5,105,0,0,894,895,5,111,0,0,895,896,5,110,0,0,896,897, + 5,97,0,0,897,898,5,108,0,0,898,164,1,0,0,0,899,900,5,108,0,0,900, + 901,5,105,0,0,901,902,5,115,0,0,902,903,5,116,0,0,903,166,1,0,0, + 0,904,905,5,114,0,0,905,906,5,101,0,0,906,907,5,99,0,0,907,908,5, + 111,0,0,908,909,5,114,0,0,909,910,5,100,0,0,910,168,1,0,0,0,911, + 912,5,98,0,0,912,913,5,111,0,0,913,914,5,111,0,0,914,915,5,108,0, + 0,915,170,1,0,0,0,916,917,5,98,0,0,917,918,5,121,0,0,918,919,5,116, + 0,0,919,920,5,101,0,0,920,921,5,115,0,0,921,172,1,0,0,0,922,923, + 5,100,0,0,923,924,5,111,0,0,924,925,5,117,0,0,925,926,5,98,0,0,926, + 927,5,108,0,0,927,928,5,101,0,0,928,174,1,0,0,0,929,930,5,105,0, + 0,930,931,5,110,0,0,931,932,5,116,0,0,932,933,5,51,0,0,933,934,5, + 50,0,0,934,176,1,0,0,0,935,936,5,105,0,0,936,937,5,110,0,0,937,938, + 5,116,0,0,938,939,5,54,0,0,939,940,5,52,0,0,940,178,1,0,0,0,941, + 942,5,115,0,0,942,943,5,116,0,0,943,944,5,114,0,0,944,945,5,105, + 0,0,945,946,5,110,0,0,946,947,5,103,0,0,947,180,1,0,0,0,948,949, + 5,117,0,0,949,950,5,105,0,0,950,951,5,110,0,0,951,952,5,116,0,0, + 952,953,5,51,0,0,953,954,5,50,0,0,954,182,1,0,0,0,955,956,5,117, + 0,0,956,957,5,105,0,0,957,958,5,110,0,0,958,959,5,116,0,0,959,960, + 5,54,0,0,960,961,5,52,0,0,961,184,1,0,0,0,962,963,5,116,0,0,963, + 964,5,114,0,0,964,965,5,117,0,0,965,966,5,101,0,0,966,186,1,0,0, + 0,967,968,5,102,0,0,968,969,5,97,0,0,969,970,5,108,0,0,970,971,5, + 115,0,0,971,972,5,101,0,0,972,188,1,0,0,0,973,974,5,110,0,0,974, + 975,5,117,0,0,975,976,5,108,0,0,976,977,5,108,0,0,977,190,1,0,0, + 0,978,979,5,45,0,0,979,980,5,62,0,0,980,192,1,0,0,0,981,982,5,58, + 0,0,982,194,1,0,0,0,983,984,5,59,0,0,984,196,1,0,0,0,985,986,5,44, + 0,0,986,198,1,0,0,0,987,988,5,46,0,0,988,200,1,0,0,0,989,990,5,123, + 0,0,990,202,1,0,0,0,991,992,5,125,0,0,992,204,1,0,0,0,993,994,5, + 91,0,0,994,206,1,0,0,0,995,996,5,93,0,0,996,208,1,0,0,0,997,998, + 5,40,0,0,998,210,1,0,0,0,999,1000,5,41,0,0,1000,212,1,0,0,0,1001, + 1002,5,60,0,0,1002,214,1,0,0,0,1003,1004,5,62,0,0,1004,216,1,0,0, + 0,1005,1006,5,38,0,0,1006,218,1,0,0,0,1007,1008,5,61,0,0,1008,220, + 1,0,0,0,1009,1011,5,45,0,0,1010,1009,1,0,0,0,1010,1011,1,0,0,0,1011, + 1013,1,0,0,0,1012,1014,7,0,0,0,1013,1012,1,0,0,0,1014,1015,1,0,0, + 0,1015,1013,1,0,0,0,1015,1016,1,0,0,0,1016,222,1,0,0,0,1017,1019, + 5,45,0,0,1018,1017,1,0,0,0,1018,1019,1,0,0,0,1019,1028,1,0,0,0,1020, + 1029,5,48,0,0,1021,1025,7,1,0,0,1022,1024,7,0,0,0,1023,1022,1,0, + 0,0,1024,1027,1,0,0,0,1025,1023,1,0,0,0,1025,1026,1,0,0,0,1026,1029, + 1,0,0,0,1027,1025,1,0,0,0,1028,1020,1,0,0,0,1028,1021,1,0,0,0,1029, + 1036,1,0,0,0,1030,1032,5,46,0,0,1031,1033,7,0,0,0,1032,1031,1,0, + 0,0,1033,1034,1,0,0,0,1034,1032,1,0,0,0,1034,1035,1,0,0,0,1035,1037, + 1,0,0,0,1036,1030,1,0,0,0,1036,1037,1,0,0,0,1037,1047,1,0,0,0,1038, + 1040,7,2,0,0,1039,1041,7,3,0,0,1040,1039,1,0,0,0,1040,1041,1,0,0, + 0,1041,1043,1,0,0,0,1042,1044,7,0,0,0,1043,1042,1,0,0,0,1044,1045, + 1,0,0,0,1045,1043,1,0,0,0,1045,1046,1,0,0,0,1046,1048,1,0,0,0,1047, + 1038,1,0,0,0,1047,1048,1,0,0,0,1048,224,1,0,0,0,1049,1053,7,4,0, + 0,1050,1052,7,5,0,0,1051,1050,1,0,0,0,1052,1055,1,0,0,0,1053,1051, + 1,0,0,0,1053,1054,1,0,0,0,1054,226,1,0,0,0,1055,1053,1,0,0,0,1056, + 1061,5,34,0,0,1057,1060,3,229,114,0,1058,1060,8,6,0,0,1059,1057, + 1,0,0,0,1059,1058,1,0,0,0,1060,1063,1,0,0,0,1061,1059,1,0,0,0,1061, + 1062,1,0,0,0,1062,1064,1,0,0,0,1063,1061,1,0,0,0,1064,1065,5,34, + 0,0,1065,228,1,0,0,0,1066,1074,5,92,0,0,1067,1075,7,7,0,0,1068,1069, + 5,117,0,0,1069,1070,3,231,115,0,1070,1071,3,231,115,0,1071,1072, + 3,231,115,0,1072,1073,3,231,115,0,1073,1075,1,0,0,0,1074,1067,1, + 0,0,0,1074,1068,1,0,0,0,1075,230,1,0,0,0,1076,1077,7,8,0,0,1077, + 232,1,0,0,0,1078,1079,5,47,0,0,1079,1080,5,47,0,0,1080,1084,1,0, + 0,0,1081,1083,8,9,0,0,1082,1081,1,0,0,0,1083,1086,1,0,0,0,1084,1082, + 1,0,0,0,1084,1085,1,0,0,0,1085,1087,1,0,0,0,1086,1084,1,0,0,0,1087, + 1088,6,116,0,0,1088,234,1,0,0,0,1089,1090,5,47,0,0,1090,1091,5,42, + 0,0,1091,1095,1,0,0,0,1092,1094,9,0,0,0,1093,1092,1,0,0,0,1094,1097, + 1,0,0,0,1095,1096,1,0,0,0,1095,1093,1,0,0,0,1096,1098,1,0,0,0,1097, + 1095,1,0,0,0,1098,1099,5,42,0,0,1099,1100,5,47,0,0,1100,1101,1,0, + 0,0,1101,1102,6,117,0,0,1102,236,1,0,0,0,1103,1105,7,10,0,0,1104, + 1103,1,0,0,0,1105,1106,1,0,0,0,1106,1104,1,0,0,0,1106,1107,1,0,0, + 0,1107,1108,1,0,0,0,1108,1109,6,118,0,0,1109,238,1,0,0,0,18,0,1010, + 1015,1018,1025,1028,1034,1036,1040,1045,1047,1053,1059,1061,1074, + 1084,1095,1106,1,0,1,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index 791a471..2ab5291 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -11,115 +11,122 @@ type int = number; export class QuixosCapabilityParser extends antlr.Parser { public static readonly WORKSPACE = 1; - public static readonly FRAGMENT = 2; - public static readonly IMPORT = 3; - public static readonly EXTERNAL = 4; - public static readonly ATOM = 5; - public static readonly INTERFACE = 6; - public static readonly INTERFACES = 7; - public static readonly PACKAGE = 8; - public static readonly VALUE = 9; - public static readonly RELATION = 10; - public static readonly OPERATION = 11; - public static readonly FUNCTION = 12; - public static readonly CONSTRUCTOR = 13; - public static readonly CONSTRUCTS = 14; - public static readonly INPUT = 15; - public static readonly CONFORM = 16; - public static readonly AS = 17; - public static readonly BIND = 18; - public static readonly TO = 19; - public static readonly PRIVATE = 20; - public static readonly SHARED = 21; - public static readonly STATE = 22; - public static readonly EDGE = 23; - public static readonly PROJECTION = 24; - public static readonly WITH = 25; - public static readonly USING = 26; - public static readonly VIA = 27; - public static readonly MATERIALIZE = 28; - public static readonly IF = 29; - public static readonly ABSENT = 30; - public static readonly ON = 31; - public static readonly POLICY = 32; - public static readonly DEFAULT = 33; - public static readonly SOURCE = 34; - public static readonly REPOSITORY = 35; - public static readonly COMMIT = 36; - public static readonly REVISION = 37; - public static readonly SEMANTIC_MAJOR = 38; - public static readonly ON_DELETE = 39; - public static readonly RETAIN_OTHER = 40; - public static readonly KEYED = 41; - public static readonly PUBLIC_TRAVERSAL = 42; - public static readonly ID = 43; - public static readonly DOC = 44; - public static readonly MODE = 45; - public static readonly EMITS = 46; - public static readonly RECEIVER = 47; - public static readonly REQUIRES = 48; - public static readonly ANY = 49; - public static readonly GET = 50; - public static readonly SET = 51; - public static readonly WATCH = 52; - public static readonly START = 53; - public static readonly STOP = 54; - public static readonly READ = 55; - public static readonly WRITE = 56; - public static readonly RESOLVE = 57; - public static readonly CONNECT = 58; - public static readonly DISCONNECT = 59; - public static readonly CALL = 60; - public static readonly WATCH_START = 61; - public static readonly WATCH_STOP = 62; - public static readonly SUBSCRIBE = 63; - public static readonly UNSUBSCRIBE = 64; - public static readonly OPTIMISTIC_REGISTER = 65; - public static readonly CRDT = 66; - public static readonly OPTIONAL_ONE = 67; - public static readonly EXACTLY_ONE = 68; - public static readonly MANY_UNIQUE = 69; - public static readonly MANY = 70; - public static readonly ORDERED = 71; - public static readonly UNIT = 72; - public static readonly WATCH_HANDLE = 73; - public static readonly MESSAGE = 74; - public static readonly ATOM_REF = 75; - public static readonly INTERFACE_REF = 76; - public static readonly OPTIONAL = 77; - public static readonly LIST = 78; - public static readonly RECORD = 79; - public static readonly BOOL = 80; - public static readonly BYTES = 81; - public static readonly DOUBLE = 82; - public static readonly INT32 = 83; - public static readonly INT64 = 84; - public static readonly STRING = 85; - public static readonly UINT32 = 86; - public static readonly UINT64 = 87; - public static readonly TRUE = 88; - public static readonly FALSE = 89; - public static readonly NULL = 90; - public static readonly ARROW = 91; - public static readonly COLON = 92; - public static readonly SEMI = 93; - public static readonly COMMA = 94; - public static readonly DOT = 95; - public static readonly LBRACE = 96; - public static readonly RBRACE = 97; - public static readonly LBRACK = 98; - public static readonly RBRACK = 99; - public static readonly LPAREN = 100; - public static readonly RPAREN = 101; - public static readonly LT = 102; - public static readonly GT = 103; - public static readonly INTEGER = 104; - public static readonly JSON_NUMBER = 105; - public static readonly IDENTIFIER = 106; - public static readonly STRING_LITERAL = 107; - public static readonly LINE_COMMENT = 108; - public static readonly BLOCK_COMMENT = 109; - public static readonly WS = 110; + public static readonly TYPE = 2; + public static readonly OBJECT = 3; + public static readonly STORABLE = 4; + public static readonly IMPLEMENTS = 5; + public static readonly REF = 6; + public static readonly FRAGMENT = 7; + public static readonly IMPORT = 8; + public static readonly EXTERNAL = 9; + public static readonly ATOM = 10; + public static readonly INTERFACE = 11; + public static readonly INTERFACES = 12; + public static readonly PACKAGE = 13; + public static readonly VALUE = 14; + public static readonly RELATION = 15; + public static readonly OPERATION = 16; + public static readonly FUNCTION = 17; + public static readonly CONSTRUCTOR = 18; + public static readonly CONSTRUCTS = 19; + public static readonly INPUT = 20; + public static readonly CONFORM = 21; + public static readonly AS = 22; + public static readonly BIND = 23; + public static readonly TO = 24; + public static readonly PRIVATE = 25; + public static readonly SHARED = 26; + public static readonly STATE = 27; + public static readonly EDGE = 28; + public static readonly PROJECTION = 29; + public static readonly WITH = 30; + public static readonly USING = 31; + public static readonly VIA = 32; + public static readonly MATERIALIZE = 33; + public static readonly IF = 34; + public static readonly ABSENT = 35; + public static readonly ON = 36; + public static readonly POLICY = 37; + public static readonly DEFAULT = 38; + public static readonly SOURCE = 39; + public static readonly REPOSITORY = 40; + public static readonly COMMIT = 41; + public static readonly REVISION = 42; + public static readonly SEMANTIC_MAJOR = 43; + public static readonly ON_DELETE = 44; + public static readonly RETAIN_OTHER = 45; + public static readonly KEYED = 46; + public static readonly PUBLIC_TRAVERSAL = 47; + public static readonly ID = 48; + public static readonly DOC = 49; + public static readonly MODE = 50; + public static readonly EMITS = 51; + public static readonly RECEIVER = 52; + public static readonly REQUIRES = 53; + public static readonly ANY = 54; + public static readonly GET = 55; + public static readonly SET = 56; + public static readonly WATCH = 57; + public static readonly START = 58; + public static readonly STOP = 59; + public static readonly READ = 60; + public static readonly WRITE = 61; + public static readonly RESOLVE = 62; + public static readonly CONNECT = 63; + public static readonly DISCONNECT = 64; + public static readonly CALL = 65; + public static readonly WATCH_START = 66; + public static readonly WATCH_STOP = 67; + public static readonly SUBSCRIBE = 68; + public static readonly UNSUBSCRIBE = 69; + public static readonly OPTIMISTIC_REGISTER = 70; + public static readonly CRDT = 71; + public static readonly OPTIONAL_ONE = 72; + public static readonly EXACTLY_ONE = 73; + public static readonly MANY_UNIQUE = 74; + public static readonly MANY = 75; + public static readonly ORDERED = 76; + public static readonly UNIT = 77; + public static readonly WATCH_HANDLE = 78; + public static readonly MESSAGE = 79; + public static readonly ATOM_REF = 80; + public static readonly INTERFACE_REF = 81; + public static readonly OPTIONAL = 82; + public static readonly LIST = 83; + public static readonly RECORD = 84; + public static readonly BOOL = 85; + public static readonly BYTES = 86; + public static readonly DOUBLE = 87; + public static readonly INT32 = 88; + public static readonly INT64 = 89; + public static readonly STRING = 90; + public static readonly UINT32 = 91; + public static readonly UINT64 = 92; + public static readonly TRUE = 93; + public static readonly FALSE = 94; + public static readonly NULL = 95; + public static readonly ARROW = 96; + public static readonly COLON = 97; + public static readonly SEMI = 98; + public static readonly COMMA = 99; + public static readonly DOT = 100; + public static readonly LBRACE = 101; + public static readonly RBRACE = 102; + public static readonly LBRACK = 103; + public static readonly RBRACK = 104; + public static readonly LPAREN = 105; + public static readonly RPAREN = 106; + public static readonly LT = 107; + public static readonly GT = 108; + public static readonly AMP = 109; + public static readonly EQUAL = 110; + public static readonly INTEGER = 111; + public static readonly JSON_NUMBER = 112; + public static readonly IDENTIFIER = 113; + public static readonly STRING_LITERAL = 114; + public static readonly LINE_COMMENT = 115; + public static readonly BLOCK_COMMENT = 116; + public static readonly WS = 117; public static readonly RULE_document = 0; public static readonly RULE_fragmentDecl = 1; public static readonly RULE_sourceImportDecl = 2; @@ -131,110 +138,119 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly RULE_resourcePreamble = 8; public static readonly RULE_atomDecl = 9; public static readonly RULE_interfaceResourceDecl = 10; - public static readonly RULE_interfaceMember = 11; - public static readonly RULE_operationMember = 12; - public static readonly RULE_valueMember = 13; - public static readonly RULE_valueMemberOperation = 14; - public static readonly RULE_relationshipMember = 15; - public static readonly RULE_relationshipOperation = 16; - public static readonly RULE_targetConstraint = 17; - public static readonly RULE_packageResourceDecl = 18; - public static readonly RULE_packageExport = 19; - public static readonly RULE_packageOperationExport = 20; - public static readonly RULE_packageFunctionExport = 21; - public static readonly RULE_packageConstructorExport = 22; - public static readonly RULE_eventClause = 23; - public static readonly RULE_operationMode = 24; - public static readonly RULE_receiverRequirement = 25; - public static readonly RULE_identifierList = 26; - public static readonly RULE_dependencyBlock = 27; - public static readonly RULE_dependencyPort = 28; - public static readonly RULE_primitiveList = 29; - public static readonly RULE_primitive = 30; - public static readonly RULE_sharedAttachmentDecl = 31; - public static readonly RULE_attachmentDecl = 32; - public static readonly RULE_stateDecl = 33; - public static readonly RULE_storagePolicy = 34; - public static readonly RULE_edgeDecl = 35; - public static readonly RULE_edgeEndpoint = 36; - public static readonly RULE_conformanceDecl = 37; - public static readonly RULE_conformanceItem = 38; - public static readonly RULE_relationshipMaterializationDecl = 39; - public static readonly RULE_operationBindingDecl = 40; - public static readonly RULE_memberOperationRef = 41; - public static readonly RULE_operationName = 42; - public static readonly RULE_operationProvider = 43; - public static readonly RULE_statePrimitive = 44; - public static readonly RULE_edgePrimitive = 45; - public static readonly RULE_dependencyBindingBlock = 46; - public static readonly RULE_dependencyBinding = 47; - public static readonly RULE_constructorBindingDecl = 48; - public static readonly RULE_valueType = 49; - public static readonly RULE_recordField = 50; - public static readonly RULE_scalarType = 51; - public static readonly RULE_cardinality = 52; - public static readonly RULE_jsonLiteral = 53; - public static readonly RULE_jsonObject = 54; - public static readonly RULE_jsonMember = 55; - public static readonly RULE_jsonArray = 56; - public static readonly RULE_identifier = 57; - public static readonly RULE_stringLiteral = 58; + public static readonly RULE_typeParameters = 11; + public static readonly RULE_typeParameter = 12; + public static readonly RULE_interfaceType = 13; + public static readonly RULE_typeArguments = 14; + public static readonly RULE_typeArgument = 15; + public static readonly RULE_typeAliasDecl = 16; + public static readonly RULE_interfaceMember = 17; + public static readonly RULE_operationMember = 18; + public static readonly RULE_valueMember = 19; + public static readonly RULE_valueMemberOperation = 20; + public static readonly RULE_relationshipMember = 21; + public static readonly RULE_relationshipOperation = 22; + public static readonly RULE_targetConstraint = 23; + public static readonly RULE_packageResourceDecl = 24; + public static readonly RULE_packageExport = 25; + public static readonly RULE_packageOperationExport = 26; + public static readonly RULE_packageFunctionExport = 27; + public static readonly RULE_packageConstructorExport = 28; + public static readonly RULE_eventClause = 29; + public static readonly RULE_operationMode = 30; + public static readonly RULE_receiverRequirement = 31; + public static readonly RULE_identifierList = 32; + public static readonly RULE_dependencyBlock = 33; + public static readonly RULE_dependencyPort = 34; + public static readonly RULE_primitiveList = 35; + public static readonly RULE_primitive = 36; + public static readonly RULE_sharedAttachmentDecl = 37; + public static readonly RULE_attachmentDecl = 38; + public static readonly RULE_stateDecl = 39; + public static readonly RULE_storagePolicy = 40; + public static readonly RULE_edgeDecl = 41; + public static readonly RULE_edgeEndpoint = 42; + public static readonly RULE_conformanceDecl = 43; + public static readonly RULE_conformanceItem = 44; + public static readonly RULE_relationshipMaterializationDecl = 45; + public static readonly RULE_operationBindingDecl = 46; + public static readonly RULE_memberOperationRef = 47; + public static readonly RULE_operationName = 48; + public static readonly RULE_operationProvider = 49; + public static readonly RULE_statePrimitive = 50; + public static readonly RULE_edgePrimitive = 51; + public static readonly RULE_dependencyBindingBlock = 52; + public static readonly RULE_dependencyBinding = 53; + public static readonly RULE_constructorBindingDecl = 54; + public static readonly RULE_valueType = 55; + public static readonly RULE_recordField = 56; + public static readonly RULE_scalarType = 57; + public static readonly RULE_cardinality = 58; + public static readonly RULE_jsonLiteral = 59; + public static readonly RULE_jsonObject = 60; + public static readonly RULE_jsonMember = 61; + public static readonly RULE_jsonArray = 62; + public static readonly RULE_identifier = 63; + public static readonly RULE_stringLiteral = 64; public static readonly literalNames = [ - null, "'workspace'", "'fragment'", "'import'", "'external'", "'atom'", - "'interface'", "'interfaces'", "'package'", "'value'", "'relation'", - "'operation'", "'function'", "'constructor'", "'constructs'", "'input'", - "'conform'", "'as'", "'bind'", "'to'", "'private'", "'shared'", - "'state'", "'edge'", "'projection'", "'with'", "'using'", "'via'", - "'materialize'", "'if'", "'absent'", "'on'", "'policy'", "'default'", - "'source'", "'repository'", "'commit'", "'revision'", "'semantic-major'", - "'on-delete'", "'retain-other'", "'keyed'", "'public-traversal'", - "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", "'requires'", - "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", "'read'", - "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'", "'watch-start'", - "'watch-stop'", "'subscribe'", "'unsubscribe'", "'optimistic-register'", - "'crdt'", "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", - "'ordered'", "'unit'", "'watch-handle'", "'message'", "'atom-ref'", - "'interface-ref'", "'optional'", "'list'", "'record'", "'bool'", - "'bytes'", "'double'", "'int32'", "'int64'", "'string'", "'uint32'", - "'uint64'", "'true'", "'false'", "'null'", "'->'", "':'", "';'", - "','", "'.'", "'{'", "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'" + null, "'workspace'", "'type'", "'object'", "'storable'", "'implements'", + "'ref'", "'fragment'", "'import'", "'external'", "'atom'", "'interface'", + "'interfaces'", "'package'", "'value'", "'relation'", "'operation'", + "'function'", "'constructor'", "'constructs'", "'input'", "'conform'", + "'as'", "'bind'", "'to'", "'private'", "'shared'", "'state'", "'edge'", + "'projection'", "'with'", "'using'", "'via'", "'materialize'", "'if'", + "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", + "'commit'", "'revision'", "'semantic-major'", "'on-delete'", "'retain-other'", + "'keyed'", "'public-traversal'", "'id'", "'doc'", "'mode'", "'emits'", + "'receiver'", "'requires'", "'any'", "'get'", "'set'", "'watch'", + "'start'", "'stop'", "'read'", "'write'", "'resolve'", "'connect'", + "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", "'subscribe'", + "'unsubscribe'", "'optimistic-register'", "'crdt'", "'optional-one'", + "'exactly-one'", "'many-unique'", "'many'", "'ordered'", "'unit'", + "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", + "'optional'", "'list'", "'record'", "'bool'", "'bytes'", "'double'", + "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", "'true'", + "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", "'{'", + "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'", "'&'", "'='" ]; public static readonly symbolicNames = [ - null, "WORKSPACE", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", - "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", - "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "TO", - "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", - "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", - "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", - "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", - "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", - "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", - "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", - "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", - "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", - "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", - "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", - "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", - "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", - "LINE_COMMENT", "BLOCK_COMMENT", "WS" + null, "WORKSPACE", "TYPE", "OBJECT", "STORABLE", "IMPLEMENTS", "REF", + "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", + "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", + "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "TO", "PRIVATE", + "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", + "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", + "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", + "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", + "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", + "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", + "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", + "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", + "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", + "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", + "INT64", "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", + "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", + "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "AMP", "EQUAL", "INTEGER", + "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", + "WS" ]; public static readonly ruleNames = [ "document", "fragmentDecl", "sourceImportDecl", "workspaceDecl", "workspaceItem", "resourceImportDecl", "externalAtomDecl", "externalInterfaceDecl", - "resourcePreamble", "atomDecl", "interfaceResourceDecl", "interfaceMember", - "operationMember", "valueMember", "valueMemberOperation", "relationshipMember", - "relationshipOperation", "targetConstraint", "packageResourceDecl", - "packageExport", "packageOperationExport", "packageFunctionExport", - "packageConstructorExport", "eventClause", "operationMode", "receiverRequirement", - "identifierList", "dependencyBlock", "dependencyPort", "primitiveList", - "primitive", "sharedAttachmentDecl", "attachmentDecl", "stateDecl", - "storagePolicy", "edgeDecl", "edgeEndpoint", "conformanceDecl", - "conformanceItem", "relationshipMaterializationDecl", "operationBindingDecl", - "memberOperationRef", "operationName", "operationProvider", "statePrimitive", - "edgePrimitive", "dependencyBindingBlock", "dependencyBinding", + "resourcePreamble", "atomDecl", "interfaceResourceDecl", "typeParameters", + "typeParameter", "interfaceType", "typeArguments", "typeArgument", + "typeAliasDecl", "interfaceMember", "operationMember", "valueMember", + "valueMemberOperation", "relationshipMember", "relationshipOperation", + "targetConstraint", "packageResourceDecl", "packageExport", "packageOperationExport", + "packageFunctionExport", "packageConstructorExport", "eventClause", + "operationMode", "receiverRequirement", "identifierList", "dependencyBlock", + "dependencyPort", "primitiveList", "primitive", "sharedAttachmentDecl", + "attachmentDecl", "stateDecl", "storagePolicy", "edgeDecl", "edgeEndpoint", + "conformanceDecl", "conformanceItem", "relationshipMaterializationDecl", + "operationBindingDecl", "memberOperationRef", "operationName", "operationProvider", + "statePrimitive", "edgePrimitive", "dependencyBindingBlock", "dependencyBinding", "constructorBindingDecl", "valueType", "recordField", "scalarType", "cardinality", "jsonLiteral", "jsonObject", "jsonMember", "jsonArray", "identifier", "stringLiteral", @@ -258,42 +274,42 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new DocumentContext(this.context, this.state); this.enterRule(localContext, 0, QuixosCapabilityParser.RULE_document); try { - this.state = 130; + this.state = 142; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 0, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 118; + this.state = 130; this.workspaceDecl(); - this.state = 119; + this.state = 131; this.match(QuixosCapabilityParser.EOF); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 121; + this.state = 133; this.interfaceResourceDecl(); - this.state = 122; + this.state = 134; this.match(QuixosCapabilityParser.EOF); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 124; + this.state = 136; this.packageResourceDecl(); - this.state = 125; + this.state = 137; this.match(QuixosCapabilityParser.EOF); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 127; + this.state = 139; this.fragmentDecl(); - this.state = 128; + this.state = 140; this.match(QuixosCapabilityParser.EOF); } break; @@ -319,25 +335,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 132; + this.state = 144; this.match(QuixosCapabilityParser.FRAGMENT); - this.state = 133; + this.state = 145; this.match(QuixosCapabilityParser.LBRACE); - this.state = 137; + this.state = 149; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 2170920) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 69469444) !== 0)) { { { - this.state = 134; + this.state = 146; this.workspaceItem(); } } - this.state = 139; + this.state = 151; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 140; + this.state = 152; this.match(QuixosCapabilityParser.RBRACE); } } @@ -360,11 +376,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 142; + this.state = 154; this.match(QuixosCapabilityParser.IMPORT); - this.state = 143; + this.state = 155; this.stringLiteral(); - this.state = 144; + this.state = 156; this.match(QuixosCapabilityParser.SEMI); } } @@ -388,39 +404,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 146; - this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 147; - this.identifier(); - this.state = 148; - this.match(QuixosCapabilityParser.ID); - this.state = 149; - this.stringLiteral(); - this.state = 150; - this.match(QuixosCapabilityParser.REVISION); - this.state = 151; - this.stringLiteral(); - this.state = 152; - this.match(QuixosCapabilityParser.COMMIT); - this.state = 153; - this.stringLiteral(); - this.state = 154; - this.match(QuixosCapabilityParser.LBRACE); this.state = 158; + this.match(QuixosCapabilityParser.WORKSPACE); + this.state = 159; + this.identifier(); + this.state = 160; + this.match(QuixosCapabilityParser.ID); + this.state = 161; + this.stringLiteral(); + this.state = 162; + this.match(QuixosCapabilityParser.REVISION); + this.state = 163; + this.stringLiteral(); + this.state = 164; + this.match(QuixosCapabilityParser.COMMIT); + this.state = 165; + this.stringLiteral(); + this.state = 166; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 170; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 2170920) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 69469444) !== 0)) { { { - this.state = 155; + this.state = 167; this.workspaceItem(); } } - this.state = 160; + this.state = 172; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 161; + this.state = 173; this.match(QuixosCapabilityParser.RBRACE); } } @@ -441,51 +457,58 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new WorkspaceItemContext(this.context, this.state); this.enterRule(localContext, 8, QuixosCapabilityParser.RULE_workspaceItem); try { - this.state = 169; + this.state = 182; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 3, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 163; + this.state = 175; this.sourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 164; + this.state = 176; this.atomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 165; + this.state = 177; this.resourceImportDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 166; + this.state = 178; this.sharedAttachmentDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 167; + this.state = 179; this.conformanceDecl(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 168; + this.state = 180; this.constructorBindingDecl(); } break; + case 7: + this.enterOuterAlt(localContext, 7); + { + this.state = 181; + this.typeAliasDecl(); + } + break; } } catch (re) { @@ -505,32 +528,32 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourceImportDeclContext(this.context, this.state); this.enterRule(localContext, 10, QuixosCapabilityParser.RULE_resourceImportDecl); try { - this.state = 181; + this.state = 194; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 4, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 171; + this.state = 184; this.match(QuixosCapabilityParser.IMPORT); - this.state = 172; + this.state = 185; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 173; + this.state = 186; this.identifier(); - this.state = 174; + this.state = 187; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 176; + this.state = 189; this.match(QuixosCapabilityParser.IMPORT); - this.state = 177; + this.state = 190; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 178; + this.state = 191; this.identifier(); - this.state = 179; + this.state = 192; this.match(QuixosCapabilityParser.SEMI); } break; @@ -555,17 +578,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 183; + this.state = 196; this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 184; + this.state = 197; this.match(QuixosCapabilityParser.ATOM); - this.state = 185; + this.state = 198; this.identifier(); - this.state = 186; + this.state = 199; this.match(QuixosCapabilityParser.ID); - this.state = 187; + this.state = 200; this.stringLiteral(); - this.state = 188; + this.state = 201; this.match(QuixosCapabilityParser.SEMI); } } @@ -588,17 +611,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 190; + this.state = 203; this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 191; + this.state = 204; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 192; + this.state = 205; this.identifier(); - this.state = 193; + this.state = 206; this.match(QuixosCapabilityParser.REVISION); - this.state = 194; + this.state = 207; this.stringLiteral(); - this.state = 195; + this.state = 208; this.match(QuixosCapabilityParser.SEMI); } } @@ -619,30 +642,37 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourcePreambleContext(this.context, this.state); this.enterRule(localContext, 16, QuixosCapabilityParser.RULE_resourcePreamble); try { - this.state = 200; + this.state = 214; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 5, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 197; + this.state = 210; this.resourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 198; + this.state = 211; this.externalAtomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 199; + this.state = 212; this.externalInterfaceDecl(); } break; + case 4: + this.enterOuterAlt(localContext, 4); + { + this.state = 213; + this.typeAliasDecl(); + } + break; } } catch (re) { @@ -665,27 +695,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 202; + this.state = 216; this.match(QuixosCapabilityParser.ATOM); - this.state = 203; + this.state = 217; this.identifier(); - this.state = 204; + this.state = 218; this.match(QuixosCapabilityParser.ID); - this.state = 205; + this.state = 219; this.stringLiteral(); - this.state = 208; + this.state = 222; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 44) { + if (_la === 49) { { - this.state = 206; + this.state = 220; this.match(QuixosCapabilityParser.DOC); - this.state = 207; + this.state = 221; this.stringLiteral(); } } - this.state = 210; + this.state = 224; this.match(QuixosCapabilityParser.SEMI); } } @@ -709,49 +739,87 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 215; + this.state = 229; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 3 || _la === 4) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 772) !== 0)) { { { - this.state = 212; + this.state = 226; this.resourcePreamble(); } } - this.state = 217; + this.state = 231; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 218; + this.state = 232; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 219; + this.state = 233; this.identifier(); - this.state = 220; - this.match(QuixosCapabilityParser.ID); - this.state = 221; - this.stringLiteral(); - this.state = 222; - this.match(QuixosCapabilityParser.REVISION); - this.state = 223; - this.stringLiteral(); - this.state = 224; - this.match(QuixosCapabilityParser.LBRACE); - this.state = 228; + this.state = 235; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 3584) !== 0)) { + if (_la === 107) { + { + this.state = 234; + this.typeParameters(); + } + } + + this.state = 237; + this.match(QuixosCapabilityParser.ID); + this.state = 238; + this.stringLiteral(); + this.state = 239; + this.match(QuixosCapabilityParser.REVISION); + this.state = 240; + this.stringLiteral(); + this.state = 250; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 53) { + { + this.state = 241; + this.match(QuixosCapabilityParser.REQUIRES); + this.state = 242; + this.interfaceType(); + this.state = 247; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 99) { + { + { + this.state = 243; + this.match(QuixosCapabilityParser.COMMA); + this.state = 244; + this.interfaceType(); + } + } + this.state = 249; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + } + } + + this.state = 252; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 256; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 114688) !== 0)) { { { - this.state = 225; + this.state = 253; this.interfaceMember(); } } - this.state = 230; + this.state = 258; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 231; + this.state = 259; this.match(QuixosCapabilityParser.RBRACE); } } @@ -768,31 +836,354 @@ export class QuixosCapabilityParser extends antlr.Parser { } return localContext; } + public typeParameters(): TypeParametersContext { + let localContext = new TypeParametersContext(this.context, this.state); + this.enterRule(localContext, 22, QuixosCapabilityParser.RULE_typeParameters); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 261; + this.match(QuixosCapabilityParser.LT); + this.state = 262; + this.typeParameter(); + this.state = 267; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 99) { + { + { + this.state = 263; + this.match(QuixosCapabilityParser.COMMA); + this.state = 264; + this.typeParameter(); + } + } + this.state = 269; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 270; + this.match(QuixosCapabilityParser.GT); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public typeParameter(): TypeParameterContext { + let localContext = new TypeParameterContext(this.context, this.state); + this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_typeParameter); + let _la: number; + try { + this.state = 291; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case QuixosCapabilityParser.VALUE: + this.enterOuterAlt(localContext, 1); + { + this.state = 272; + this.match(QuixosCapabilityParser.VALUE); + this.state = 273; + this.identifier(); + this.state = 276; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 97) { + { + this.state = 274; + this.match(QuixosCapabilityParser.COLON); + this.state = 275; + this.match(QuixosCapabilityParser.STORABLE); + } + } + + } + break; + case QuixosCapabilityParser.OBJECT: + this.enterOuterAlt(localContext, 2); + { + this.state = 278; + this.match(QuixosCapabilityParser.OBJECT); + this.state = 279; + this.identifier(); + this.state = 289; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 5) { + { + this.state = 280; + this.match(QuixosCapabilityParser.IMPLEMENTS); + this.state = 281; + this.interfaceType(); + this.state = 286; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 109) { + { + { + this.state = 282; + this.match(QuixosCapabilityParser.AMP); + this.state = 283; + this.interfaceType(); + } + } + this.state = 288; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + } + } + + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public interfaceType(): InterfaceTypeContext { + let localContext = new InterfaceTypeContext(this.context, this.state); + this.enterRule(localContext, 26, QuixosCapabilityParser.RULE_interfaceType); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 293; + this.identifier(); + this.state = 295; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 107) { + { + this.state = 294; + this.typeArguments(); + } + } + + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public typeArguments(): TypeArgumentsContext { + let localContext = new TypeArgumentsContext(this.context, this.state); + this.enterRule(localContext, 28, QuixosCapabilityParser.RULE_typeArguments); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 297; + this.match(QuixosCapabilityParser.LT); + this.state = 298; + this.typeArgument(); + this.state = 303; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 99) { + { + { + this.state = 299; + this.match(QuixosCapabilityParser.COMMA); + this.state = 300; + this.typeArgument(); + } + } + this.state = 305; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 306; + this.match(QuixosCapabilityParser.GT); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public typeArgument(): TypeArgumentContext { + let localContext = new TypeArgumentContext(this.context, this.state); + this.enterRule(localContext, 30, QuixosCapabilityParser.RULE_typeArgument); + try { + this.state = 315; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case QuixosCapabilityParser.ATOM: + this.enterOuterAlt(localContext, 1); + { + this.state = 308; + this.match(QuixosCapabilityParser.ATOM); + this.state = 309; + this.identifier(); + } + break; + case QuixosCapabilityParser.INTERFACE: + this.enterOuterAlt(localContext, 2); + { + this.state = 310; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 311; + this.interfaceType(); + } + break; + case QuixosCapabilityParser.OBJECT: + this.enterOuterAlt(localContext, 3); + { + this.state = 312; + this.match(QuixosCapabilityParser.OBJECT); + this.state = 313; + this.identifier(); + } + break; + case QuixosCapabilityParser.REF: + case QuixosCapabilityParser.SOURCE: + case QuixosCapabilityParser.UNIT: + case QuixosCapabilityParser.WATCH_HANDLE: + case QuixosCapabilityParser.MESSAGE: + case QuixosCapabilityParser.ATOM_REF: + case QuixosCapabilityParser.INTERFACE_REF: + case QuixosCapabilityParser.OPTIONAL: + case QuixosCapabilityParser.LIST: + case QuixosCapabilityParser.RECORD: + case QuixosCapabilityParser.BOOL: + case QuixosCapabilityParser.BYTES: + case QuixosCapabilityParser.DOUBLE: + case QuixosCapabilityParser.INT32: + case QuixosCapabilityParser.INT64: + case QuixosCapabilityParser.STRING: + case QuixosCapabilityParser.UINT32: + case QuixosCapabilityParser.UINT64: + case QuixosCapabilityParser.IDENTIFIER: + this.enterOuterAlt(localContext, 4); + { + this.state = 314; + this.valueType(); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public typeAliasDecl(): TypeAliasDeclContext { + let localContext = new TypeAliasDeclContext(this.context, this.state); + this.enterRule(localContext, 32, QuixosCapabilityParser.RULE_typeAliasDecl); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 317; + this.match(QuixosCapabilityParser.TYPE); + this.state = 318; + this.identifier(); + this.state = 320; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 107) { + { + this.state = 319; + this.typeParameters(); + } + } + + this.state = 322; + this.match(QuixosCapabilityParser.EQUAL); + this.state = 323; + this.valueType(); + this.state = 324; + this.match(QuixosCapabilityParser.SEMI); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } public interfaceMember(): InterfaceMemberContext { let localContext = new InterfaceMemberContext(this.context, this.state); - this.enterRule(localContext, 22, QuixosCapabilityParser.RULE_interfaceMember); + this.enterRule(localContext, 34, QuixosCapabilityParser.RULE_interfaceMember); try { - this.state = 236; + this.state = 329; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VALUE: this.enterOuterAlt(localContext, 1); { - this.state = 233; + this.state = 326; this.valueMember(); } break; case QuixosCapabilityParser.RELATION: this.enterOuterAlt(localContext, 2); { - this.state = 234; + this.state = 327; this.relationshipMember(); } break; case QuixosCapabilityParser.OPERATION: this.enterOuterAlt(localContext, 3); { - this.state = 235; + this.state = 328; this.operationMember(); } break; @@ -815,37 +1206,37 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationMember(): OperationMemberContext { let localContext = new OperationMemberContext(this.context, this.state); - this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_operationMember); + this.enterRule(localContext, 36, QuixosCapabilityParser.RULE_operationMember); try { this.enterOuterAlt(localContext, 1); { - this.state = 238; + this.state = 331; this.match(QuixosCapabilityParser.OPERATION); - this.state = 239; + this.state = 332; this.identifier(); - this.state = 240; + this.state = 333; this.match(QuixosCapabilityParser.ID); - this.state = 241; + this.state = 334; this.stringLiteral(); - this.state = 242; + this.state = 335; this.match(QuixosCapabilityParser.COLON); - this.state = 243; + this.state = 336; this.valueType(); - this.state = 244; + this.state = 337; this.match(QuixosCapabilityParser.ARROW); - this.state = 245; + this.state = 338; this.valueType(); - this.state = 246; + this.state = 339; this.match(QuixosCapabilityParser.LBRACE); - this.state = 247; + this.state = 340; this.match(QuixosCapabilityParser.CALL); - this.state = 248; + this.state = 341; this.match(QuixosCapabilityParser.ID); - this.state = 249; + this.state = 342; this.stringLiteral(); - this.state = 250; + this.state = 343; this.match(QuixosCapabilityParser.SEMI); - this.state = 251; + this.state = 344; this.match(QuixosCapabilityParser.RBRACE); } } @@ -864,40 +1255,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueMember(): ValueMemberContext { let localContext = new ValueMemberContext(this.context, this.state); - this.enterRule(localContext, 26, QuixosCapabilityParser.RULE_valueMember); + this.enterRule(localContext, 38, QuixosCapabilityParser.RULE_valueMember); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 253; + this.state = 346; this.match(QuixosCapabilityParser.VALUE); - this.state = 254; + this.state = 347; this.identifier(); - this.state = 255; + this.state = 348; this.match(QuixosCapabilityParser.ID); - this.state = 256; + this.state = 349; this.stringLiteral(); - this.state = 257; + this.state = 350; this.match(QuixosCapabilityParser.COLON); - this.state = 258; + this.state = 351; this.valueType(); - this.state = 259; + this.state = 352; this.match(QuixosCapabilityParser.LBRACE); - this.state = 263; + this.state = 356; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 50)) & ~0x1F) === 0 && ((1 << (_la - 50)) & 7) !== 0)) { + while (((((_la - 55)) & ~0x1F) === 0 && ((1 << (_la - 55)) & 7) !== 0)) { { { - this.state = 260; + this.state = 353; this.valueMemberOperation(); } } - this.state = 265; + this.state = 358; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 266; + this.state = 359; this.match(QuixosCapabilityParser.RBRACE); } } @@ -916,55 +1307,55 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueMemberOperation(): ValueMemberOperationContext { let localContext = new ValueMemberOperationContext(this.context, this.state); - this.enterRule(localContext, 28, QuixosCapabilityParser.RULE_valueMemberOperation); + this.enterRule(localContext, 40, QuixosCapabilityParser.RULE_valueMemberOperation); try { - this.state = 287; + this.state = 380; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 1); { - this.state = 268; + this.state = 361; this.match(QuixosCapabilityParser.GET); - this.state = 269; + this.state = 362; this.match(QuixosCapabilityParser.ID); - this.state = 270; + this.state = 363; this.stringLiteral(); - this.state = 271; + this.state = 364; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 2); { - this.state = 273; + this.state = 366; this.match(QuixosCapabilityParser.SET); - this.state = 274; + this.state = 367; this.match(QuixosCapabilityParser.ID); - this.state = 275; + this.state = 368; this.stringLiteral(); - this.state = 276; + this.state = 369; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 3); { - this.state = 278; + this.state = 371; this.match(QuixosCapabilityParser.WATCH); - this.state = 279; + this.state = 372; this.match(QuixosCapabilityParser.START); - this.state = 280; + this.state = 373; this.match(QuixosCapabilityParser.ID); - this.state = 281; + this.state = 374; this.stringLiteral(); - this.state = 282; + this.state = 375; this.match(QuixosCapabilityParser.STOP); - this.state = 283; + this.state = 376; this.match(QuixosCapabilityParser.ID); - this.state = 284; + this.state = 377; this.stringLiteral(); - this.state = 285; + this.state = 378; this.match(QuixosCapabilityParser.SEMI); } break; @@ -987,52 +1378,52 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipMember(): RelationshipMemberContext { let localContext = new RelationshipMemberContext(this.context, this.state); - this.enterRule(localContext, 30, QuixosCapabilityParser.RULE_relationshipMember); + this.enterRule(localContext, 42, QuixosCapabilityParser.RULE_relationshipMember); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 289; + this.state = 382; this.match(QuixosCapabilityParser.RELATION); - this.state = 290; + this.state = 383; this.identifier(); - this.state = 291; + this.state = 384; this.match(QuixosCapabilityParser.ID); - this.state = 292; + this.state = 385; this.stringLiteral(); - this.state = 293; + this.state = 386; this.match(QuixosCapabilityParser.COLON); - this.state = 294; + this.state = 387; this.cardinality(); - this.state = 295; + this.state = 388; this.targetConstraint(); - this.state = 297; + this.state = 390; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 71) { + if (_la === 76) { { - this.state = 296; + this.state = 389; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 299; + this.state = 392; this.match(QuixosCapabilityParser.LBRACE); - this.state = 303; + this.state = 396; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & 225) !== 0)) { + while (((((_la - 57)) & ~0x1F) === 0 && ((1 << (_la - 57)) & 225) !== 0)) { { { - this.state = 300; + this.state = 393; this.relationshipOperation(); } } - this.state = 305; + this.state = 398; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 306; + this.state = 399; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1051,68 +1442,68 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipOperation(): RelationshipOperationContext { let localContext = new RelationshipOperationContext(this.context, this.state); - this.enterRule(localContext, 32, QuixosCapabilityParser.RULE_relationshipOperation); + this.enterRule(localContext, 44, QuixosCapabilityParser.RULE_relationshipOperation); try { - this.state = 332; + this.state = 425; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 1); { - this.state = 308; + this.state = 401; this.match(QuixosCapabilityParser.RESOLVE); - this.state = 309; + this.state = 402; this.match(QuixosCapabilityParser.ID); - this.state = 310; + this.state = 403; this.stringLiteral(); - this.state = 311; + this.state = 404; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 2); { - this.state = 313; + this.state = 406; this.match(QuixosCapabilityParser.CONNECT); - this.state = 314; + this.state = 407; this.match(QuixosCapabilityParser.ID); - this.state = 315; + this.state = 408; this.stringLiteral(); - this.state = 316; + this.state = 409; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 3); { - this.state = 318; + this.state = 411; this.match(QuixosCapabilityParser.DISCONNECT); - this.state = 319; + this.state = 412; this.match(QuixosCapabilityParser.ID); - this.state = 320; + this.state = 413; this.stringLiteral(); - this.state = 321; + this.state = 414; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 323; + this.state = 416; this.match(QuixosCapabilityParser.WATCH); - this.state = 324; + this.state = 417; this.match(QuixosCapabilityParser.START); - this.state = 325; + this.state = 418; this.match(QuixosCapabilityParser.ID); - this.state = 326; + this.state = 419; this.stringLiteral(); - this.state = 327; + this.state = 420; this.match(QuixosCapabilityParser.STOP); - this.state = 328; + this.state = 421; this.match(QuixosCapabilityParser.ID); - this.state = 329; + this.state = 422; this.stringLiteral(); - this.state = 330; + this.state = 423; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1135,26 +1526,46 @@ export class QuixosCapabilityParser extends antlr.Parser { } public targetConstraint(): TargetConstraintContext { let localContext = new TargetConstraintContext(this.context, this.state); - this.enterRule(localContext, 34, QuixosCapabilityParser.RULE_targetConstraint); + this.enterRule(localContext, 46, QuixosCapabilityParser.RULE_targetConstraint); + let _la: number; try { - this.state = 338; + this.state = 436; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 334; + this.state = 427; this.match(QuixosCapabilityParser.ATOM); - this.state = 335; + this.state = 428; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 336; + this.state = 429; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 337; + this.state = 430; + this.identifier(); + this.state = 432; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 107) { + { + this.state = 431; + this.typeArguments(); + } + } + + } + break; + case QuixosCapabilityParser.OBJECT: + this.enterOuterAlt(localContext, 3); + { + this.state = 434; + this.match(QuixosCapabilityParser.OBJECT); + this.state = 435; this.identifier(); } break; @@ -1177,66 +1588,66 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageResourceDecl(): PackageResourceDeclContext { let localContext = new PackageResourceDeclContext(this.context, this.state); - this.enterRule(localContext, 36, QuixosCapabilityParser.RULE_packageResourceDecl); + this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_packageResourceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 343; + this.state = 441; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 3 || _la === 4) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 772) !== 0)) { { { - this.state = 340; + this.state = 438; this.resourcePreamble(); } } - this.state = 345; + this.state = 443; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 346; + this.state = 444; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 347; + this.state = 445; this.identifier(); - this.state = 348; + this.state = 446; this.match(QuixosCapabilityParser.ID); - this.state = 349; + this.state = 447; this.stringLiteral(); - this.state = 350; + this.state = 448; this.match(QuixosCapabilityParser.REVISION); - this.state = 351; + this.state = 449; this.stringLiteral(); - this.state = 354; + this.state = 452; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 38) { + if (_la === 43) { { - this.state = 352; + this.state = 450; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 353; + this.state = 451; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 356; + this.state = 454; this.match(QuixosCapabilityParser.LBRACE); - this.state = 360; + this.state = 458; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 14336) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 458752) !== 0)) { { { - this.state = 357; + this.state = 455; this.packageExport(); } } - this.state = 362; + this.state = 460; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 363; + this.state = 461; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1255,29 +1666,29 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageExport(): PackageExportContext { let localContext = new PackageExportContext(this.context, this.state); - this.enterRule(localContext, 38, QuixosCapabilityParser.RULE_packageExport); + this.enterRule(localContext, 50, QuixosCapabilityParser.RULE_packageExport); try { - this.state = 368; + this.state = 466; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.OPERATION: this.enterOuterAlt(localContext, 1); { - this.state = 365; + this.state = 463; this.packageOperationExport(); } break; case QuixosCapabilityParser.FUNCTION: this.enterOuterAlt(localContext, 2); { - this.state = 366; + this.state = 464; this.packageFunctionExport(); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 3); { - this.state = 367; + this.state = 465; this.packageConstructorExport(); } break; @@ -1300,56 +1711,66 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageOperationExport(): PackageOperationExportContext { let localContext = new PackageOperationExportContext(this.context, this.state); - this.enterRule(localContext, 40, QuixosCapabilityParser.RULE_packageOperationExport); + this.enterRule(localContext, 52, QuixosCapabilityParser.RULE_packageOperationExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 370; + this.state = 468; this.match(QuixosCapabilityParser.OPERATION); - this.state = 371; + this.state = 469; this.identifier(); - this.state = 372; - this.match(QuixosCapabilityParser.ID); - this.state = 373; - this.stringLiteral(); - this.state = 374; - this.match(QuixosCapabilityParser.COLON); - this.state = 375; - this.valueType(); - this.state = 376; - this.match(QuixosCapabilityParser.ARROW); - this.state = 377; - this.valueType(); - this.state = 378; - this.match(QuixosCapabilityParser.MODE); - this.state = 379; - this.operationMode(); - this.state = 381; + this.state = 471; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 46) { + if (_la === 107) { { - this.state = 380; + this.state = 470; + this.typeParameters(); + } + } + + this.state = 473; + this.match(QuixosCapabilityParser.ID); + this.state = 474; + this.stringLiteral(); + this.state = 475; + this.match(QuixosCapabilityParser.COLON); + this.state = 476; + this.valueType(); + this.state = 477; + this.match(QuixosCapabilityParser.ARROW); + this.state = 478; + this.valueType(); + this.state = 479; + this.match(QuixosCapabilityParser.MODE); + this.state = 480; + this.operationMode(); + this.state = 482; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 51) { + { + this.state = 481; this.eventClause(); } } - this.state = 383; + this.state = 484; this.match(QuixosCapabilityParser.RECEIVER); - this.state = 384; + this.state = 485; this.receiverRequirement(); - this.state = 386; + this.state = 487; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 48) { + if (_la === 53) { { - this.state = 385; + this.state = 486; this.dependencyBlock(); } } - this.state = 388; + this.state = 489; this.match(QuixosCapabilityParser.SEMI); } } @@ -1368,38 +1789,48 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageFunctionExport(): PackageFunctionExportContext { let localContext = new PackageFunctionExportContext(this.context, this.state); - this.enterRule(localContext, 42, QuixosCapabilityParser.RULE_packageFunctionExport); + this.enterRule(localContext, 54, QuixosCapabilityParser.RULE_packageFunctionExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 390; + this.state = 491; this.match(QuixosCapabilityParser.FUNCTION); - this.state = 391; + this.state = 492; this.identifier(); - this.state = 392; - this.match(QuixosCapabilityParser.ID); - this.state = 393; - this.stringLiteral(); - this.state = 394; - this.match(QuixosCapabilityParser.COLON); - this.state = 395; - this.valueType(); - this.state = 396; - this.match(QuixosCapabilityParser.ARROW); - this.state = 397; - this.valueType(); - this.state = 399; + this.state = 494; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 48) { + if (_la === 107) { { - this.state = 398; + this.state = 493; + this.typeParameters(); + } + } + + this.state = 496; + this.match(QuixosCapabilityParser.ID); + this.state = 497; + this.stringLiteral(); + this.state = 498; + this.match(QuixosCapabilityParser.COLON); + this.state = 499; + this.valueType(); + this.state = 500; + this.match(QuixosCapabilityParser.ARROW); + this.state = 501; + this.valueType(); + this.state = 503; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 53) { + { + this.state = 502; this.dependencyBlock(); } } - this.state = 401; + this.state = 505; this.match(QuixosCapabilityParser.SEMI); } } @@ -1418,38 +1849,38 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageConstructorExport(): PackageConstructorExportContext { let localContext = new PackageConstructorExportContext(this.context, this.state); - this.enterRule(localContext, 44, QuixosCapabilityParser.RULE_packageConstructorExport); + this.enterRule(localContext, 56, QuixosCapabilityParser.RULE_packageConstructorExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 403; + this.state = 507; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 404; + this.state = 508; this.identifier(); - this.state = 405; + this.state = 509; this.match(QuixosCapabilityParser.ID); - this.state = 406; + this.state = 510; this.stringLiteral(); - this.state = 407; + this.state = 511; this.match(QuixosCapabilityParser.CONSTRUCTS); - this.state = 408; + this.state = 512; this.identifier(); - this.state = 409; + this.state = 513; this.match(QuixosCapabilityParser.COLON); - this.state = 410; + this.state = 514; this.valueType(); - this.state = 412; + this.state = 516; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 48) { + if (_la === 53) { { - this.state = 411; + this.state = 515; this.dependencyBlock(); } } - this.state = 414; + this.state = 518; this.match(QuixosCapabilityParser.SEMI); } } @@ -1468,13 +1899,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public eventClause(): EventClauseContext { let localContext = new EventClauseContext(this.context, this.state); - this.enterRule(localContext, 46, QuixosCapabilityParser.RULE_eventClause); + this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_eventClause); try { this.enterOuterAlt(localContext, 1); { - this.state = 416; + this.state = 520; this.match(QuixosCapabilityParser.EMITS); - this.state = 417; + this.state = 521; this.valueType(); } } @@ -1493,14 +1924,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationMode(): OperationModeContext { let localContext = new OperationModeContext(this.context, this.state); - this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_operationMode); + this.enterRule(localContext, 60, QuixosCapabilityParser.RULE_operationMode); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 419; + this.state = 523; _la = this.tokenStream.LA(1); - if(!(((((_la - 60)) & ~0x1F) === 0 && ((1 << (_la - 60)) & 31) !== 0))) { + if(!(((((_la - 65)) & ~0x1F) === 0 && ((1 << (_la - 65)) & 31) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -1524,46 +1955,71 @@ export class QuixosCapabilityParser extends antlr.Parser { } public receiverRequirement(): ReceiverRequirementContext { let localContext = new ReceiverRequirementContext(this.context, this.state); - this.enterRule(localContext, 50, QuixosCapabilityParser.RULE_receiverRequirement); + this.enterRule(localContext, 62, QuixosCapabilityParser.RULE_receiverRequirement); let _la: number; try { - this.state = 430; + this.state = 543; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ANY: this.enterOuterAlt(localContext, 1); { - this.state = 421; + this.state = 525; this.match(QuixosCapabilityParser.ANY); } break; case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 2); { - this.state = 422; + this.state = 526; this.match(QuixosCapabilityParser.ATOM); - this.state = 423; + this.state = 527; + this.identifier(); + } + break; + case QuixosCapabilityParser.OBJECT: + this.enterOuterAlt(localContext, 3); + { + this.state = 528; + this.match(QuixosCapabilityParser.OBJECT); + this.state = 529; this.identifier(); } break; case QuixosCapabilityParser.INTERFACES: - this.enterOuterAlt(localContext, 3); + this.enterOuterAlt(localContext, 4); { - this.state = 424; + this.state = 530; this.match(QuixosCapabilityParser.INTERFACES); - this.state = 425; + this.state = 531; this.match(QuixosCapabilityParser.LBRACK); - this.state = 427; + this.state = 540; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 34 || _la === 106) { + if (_la === 39 || _la === 113) { { - this.state = 426; - this.identifierList(); + this.state = 532; + this.interfaceType(); + this.state = 537; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 99) { + { + { + this.state = 533; + this.match(QuixosCapabilityParser.COMMA); + this.state = 534; + this.interfaceType(); + } + } + this.state = 539; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } } } - this.state = 429; + this.state = 542; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -1586,26 +2042,26 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifierList(): IdentifierListContext { let localContext = new IdentifierListContext(this.context, this.state); - this.enterRule(localContext, 52, QuixosCapabilityParser.RULE_identifierList); + this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_identifierList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 432; + this.state = 545; this.identifier(); - this.state = 437; + this.state = 550; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 94) { + while (_la === 99) { { { - this.state = 433; + this.state = 546; this.match(QuixosCapabilityParser.COMMA); - this.state = 434; + this.state = 547; this.identifier(); } } - this.state = 439; + this.state = 552; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -1626,30 +2082,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBlock(): DependencyBlockContext { let localContext = new DependencyBlockContext(this.context, this.state); - this.enterRule(localContext, 54, QuixosCapabilityParser.RULE_dependencyBlock); + this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_dependencyBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 440; + this.state = 553; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 441; + this.state = 554; this.match(QuixosCapabilityParser.LBRACE); - this.state = 445; + this.state = 558; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 12591168) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 402917376) !== 0)) { { { - this.state = 442; + this.state = 555; this.dependencyPort(); } } - this.state = 447; + this.state = 560; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 448; + this.state = 561; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1668,103 +2124,113 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyPort(): DependencyPortContext { let localContext = new DependencyPortContext(this.context, this.state); - this.enterRule(localContext, 56, QuixosCapabilityParser.RULE_dependencyPort); + this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_dependencyPort); let _la: number; try { - this.state = 489; + this.state = 605; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 450; + this.state = 563; this.match(QuixosCapabilityParser.STATE); - this.state = 451; + this.state = 564; this.identifier(); - this.state = 452; + this.state = 565; this.match(QuixosCapabilityParser.ID); - this.state = 453; + this.state = 566; this.stringLiteral(); - this.state = 454; + this.state = 567; this.match(QuixosCapabilityParser.COLON); - this.state = 455; + this.state = 568; this.valueType(); - this.state = 456; + this.state = 569; this.primitiveList(); - this.state = 457; + this.state = 570; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 459; + this.state = 572; this.match(QuixosCapabilityParser.EDGE); - this.state = 460; + this.state = 573; this.identifier(); - this.state = 461; + this.state = 574; this.match(QuixosCapabilityParser.ID); - this.state = 462; + this.state = 575; this.stringLiteral(); - this.state = 463; + this.state = 576; this.match(QuixosCapabilityParser.COLON); - this.state = 464; + this.state = 577; this.cardinality(); - this.state = 465; + this.state = 578; this.targetConstraint(); - this.state = 466; + this.state = 579; this.primitiveList(); - this.state = 467; + this.state = 580; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 3); { - this.state = 469; + this.state = 582; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 470; + this.state = 583; this.identifier(); - this.state = 471; + this.state = 584; this.match(QuixosCapabilityParser.ID); - this.state = 472; + this.state = 585; this.stringLiteral(); - this.state = 473; + this.state = 586; this.match(QuixosCapabilityParser.COLON); - this.state = 474; + this.state = 587; this.identifier(); - this.state = 475; + this.state = 589; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 107) { + { + this.state = 588; + this.typeArguments(); + } + } + + this.state = 591; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 4); { - this.state = 477; + this.state = 593; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 478; + this.state = 594; this.identifier(); - this.state = 479; + this.state = 595; this.match(QuixosCapabilityParser.ID); - this.state = 480; + this.state = 596; this.stringLiteral(); - this.state = 481; + this.state = 597; this.match(QuixosCapabilityParser.COLON); - this.state = 482; + this.state = 598; this.identifier(); - this.state = 485; + this.state = 601; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 15) { + if (_la === 20) { { - this.state = 483; + this.state = 599; this.match(QuixosCapabilityParser.INPUT); - this.state = 484; + this.state = 600; this.valueType(); } } - this.state = 487; + this.state = 603; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1787,32 +2253,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitiveList(): PrimitiveListContext { let localContext = new PrimitiveListContext(this.context, this.state); - this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_primitiveList); + this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_primitiveList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 491; + this.state = 607; this.match(QuixosCapabilityParser.LBRACK); - this.state = 492; + this.state = 608; this.primitive(); - this.state = 497; + this.state = 613; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 94) { + while (_la === 99) { { { - this.state = 493; + this.state = 609; this.match(QuixosCapabilityParser.COMMA); - this.state = 494; + this.state = 610; this.primitive(); } } - this.state = 499; + this.state = 615; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 500; + this.state = 616; this.match(QuixosCapabilityParser.RBRACK); } } @@ -1831,14 +2297,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitive(): PrimitiveContext { let localContext = new PrimitiveContext(this.context, this.state); - this.enterRule(localContext, 60, QuixosCapabilityParser.RULE_primitive); + this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_primitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 502; + this.state = 618; _la = this.tokenStream.LA(1); - if(!(((((_la - 55)) & ~0x1F) === 0 && ((1 << (_la - 55)) & 223) !== 0))) { + if(!(((((_la - 60)) & ~0x1F) === 0 && ((1 << (_la - 60)) & 223) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -1862,13 +2328,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public sharedAttachmentDecl(): SharedAttachmentDeclContext { let localContext = new SharedAttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 62, QuixosCapabilityParser.RULE_sharedAttachmentDecl); + this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_sharedAttachmentDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 504; + this.state = 620; this.match(QuixosCapabilityParser.SHARED); - this.state = 505; + this.state = 621; this.attachmentDecl(); } } @@ -1887,22 +2353,22 @@ export class QuixosCapabilityParser extends antlr.Parser { } public attachmentDecl(): AttachmentDeclContext { let localContext = new AttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_attachmentDecl); + this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 509; + this.state = 625; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 507; + this.state = 623; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 508; + this.state = 624; this.edgeDecl(); } break; @@ -1925,44 +2391,44 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateDecl(): StateDeclContext { let localContext = new StateDeclContext(this.context, this.state); - this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_stateDecl); + this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_stateDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 511; + this.state = 627; this.match(QuixosCapabilityParser.STATE); - this.state = 512; + this.state = 628; this.identifier(); - this.state = 513; + this.state = 629; this.match(QuixosCapabilityParser.ID); - this.state = 514; + this.state = 630; this.stringLiteral(); - this.state = 515; + this.state = 631; this.match(QuixosCapabilityParser.ON); - this.state = 516; + this.state = 632; this.identifier(); - this.state = 517; + this.state = 633; this.match(QuixosCapabilityParser.COLON); - this.state = 518; + this.state = 634; this.valueType(); - this.state = 519; + this.state = 635; this.match(QuixosCapabilityParser.POLICY); - this.state = 520; + this.state = 636; this.storagePolicy(); - this.state = 523; + this.state = 639; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 33) { + if (_la === 38) { { - this.state = 521; + this.state = 637; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 522; + this.state = 638; this.jsonLiteral(); } } - this.state = 525; + this.state = 641; this.match(QuixosCapabilityParser.SEMI); } } @@ -1981,28 +2447,28 @@ export class QuixosCapabilityParser extends antlr.Parser { } public storagePolicy(): StoragePolicyContext { let localContext = new StoragePolicyContext(this.context, this.state); - this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_storagePolicy); + this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 533; + this.state = 649; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.OPTIMISTIC_REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 527; + this.state = 643; this.match(QuixosCapabilityParser.OPTIMISTIC_REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 528; + this.state = 644; this.match(QuixosCapabilityParser.CRDT); - this.state = 529; + this.state = 645; this.match(QuixosCapabilityParser.LPAREN); - this.state = 530; + this.state = 646; this.valueType(); - this.state = 531; + this.state = 647; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -2025,25 +2491,25 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeDecl(): EdgeDeclContext { let localContext = new EdgeDeclContext(this.context, this.state); - this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_edgeDecl); + this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_edgeDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 535; + this.state = 651; this.match(QuixosCapabilityParser.EDGE); - this.state = 536; + this.state = 652; this.identifier(); - this.state = 537; + this.state = 653; this.match(QuixosCapabilityParser.ID); - this.state = 538; + this.state = 654; this.stringLiteral(); - this.state = 539; + this.state = 655; this.match(QuixosCapabilityParser.LBRACE); - this.state = 540; + this.state = 656; this.edgeEndpoint(); - this.state = 541; + this.state = 657; this.edgeEndpoint(); - this.state = 542; + this.state = 658; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2062,78 +2528,78 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeEndpoint(): EdgeEndpointContext { let localContext = new EdgeEndpointContext(this.context, this.state); - this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_edgeEndpoint); + this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_edgeEndpoint); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 544; + this.state = 660; this.targetConstraint(); - this.state = 545; + this.state = 661; this.match(QuixosCapabilityParser.PROJECTION); - this.state = 546; + this.state = 662; this.identifier(); - this.state = 547; + this.state = 663; this.match(QuixosCapabilityParser.ID); - this.state = 548; + this.state = 664; this.stringLiteral(); - this.state = 549; + this.state = 665; this.cardinality(); - this.state = 551; + this.state = 667; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 71) { + if (_la === 76) { { - this.state = 550; + this.state = 666; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 555; + this.state = 671; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 39) { + if (_la === 44) { { - this.state = 553; + this.state = 669; this.match(QuixosCapabilityParser.ON_DELETE); - this.state = 554; + this.state = 670; this.stringLiteral(); } } - this.state = 558; + this.state = 674; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 40) { + if (_la === 45) { { - this.state = 557; + this.state = 673; this.match(QuixosCapabilityParser.RETAIN_OTHER); } } - this.state = 562; + this.state = 678; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 41) { + if (_la === 46) { { - this.state = 560; + this.state = 676; this.match(QuixosCapabilityParser.KEYED); - this.state = 561; + this.state = 677; this.stringLiteral(); } } - this.state = 565; + this.state = 681; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 42) { + if (_la === 47) { { - this.state = 564; + this.state = 680; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); } } - this.state = 567; + this.state = 683; this.match(QuixosCapabilityParser.SEMI); } } @@ -2152,60 +2618,70 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceDecl(): ConformanceDeclContext { let localContext = new ConformanceDeclContext(this.context, this.state); - this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_conformanceDecl); + this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_conformanceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 569; + this.state = 685; this.match(QuixosCapabilityParser.CONFORM); - this.state = 570; + this.state = 686; this.identifier(); - this.state = 571; + this.state = 687; this.match(QuixosCapabilityParser.AS); - this.state = 572; + this.state = 688; this.identifier(); - this.state = 575; + this.state = 690; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 43) { + if (_la === 107) { { - this.state = 573; + this.state = 689; + this.typeArguments(); + } + } + + this.state = 694; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 48) { + { + this.state = 692; this.match(QuixosCapabilityParser.ID); - this.state = 574; + this.state = 693; this.stringLiteral(); } } - this.state = 579; + this.state = 698; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 38) { + if (_la === 43) { { - this.state = 577; + this.state = 696; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 578; + this.state = 697; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 581; + this.state = 700; this.match(QuixosCapabilityParser.LBRACE); - this.state = 585; + this.state = 704; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 269746176) !== 0)) { + while (((((_la - 23)) & ~0x1F) === 0 && ((1 << (_la - 23)) & 1029) !== 0)) { { { - this.state = 582; + this.state = 701; this.conformanceItem(); } } - this.state = 587; + this.state = 706; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 588; + this.state = 707; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2224,31 +2700,31 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceItem(): ConformanceItemContext { let localContext = new ConformanceItemContext(this.context, this.state); - this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_conformanceItem); + this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 594; + this.state = 713; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.PRIVATE: this.enterOuterAlt(localContext, 1); { - this.state = 590; + this.state = 709; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 591; + this.state = 710; this.attachmentDecl(); } break; case QuixosCapabilityParser.BIND: this.enterOuterAlt(localContext, 2); { - this.state = 592; + this.state = 711; this.operationBindingDecl(); } break; case QuixosCapabilityParser.MATERIALIZE: this.enterOuterAlt(localContext, 3); { - this.state = 593; + this.state = 712; this.relationshipMaterializationDecl(); } break; @@ -2271,35 +2747,35 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext { let localContext = new RelationshipMaterializationDeclContext(this.context, this.state); - this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); + this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 596; + this.state = 715; this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 597; + this.state = 716; this.identifier(); - this.state = 598; + this.state = 717; this.match(QuixosCapabilityParser.IF); - this.state = 599; + this.state = 718; this.match(QuixosCapabilityParser.ABSENT); - this.state = 600; + this.state = 719; this.match(QuixosCapabilityParser.USING); - this.state = 601; + this.state = 720; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 602; + this.state = 721; this.identifier(); - this.state = 603; + this.state = 722; this.match(QuixosCapabilityParser.VIA); - this.state = 604; + this.state = 723; this.match(QuixosCapabilityParser.EDGE); - this.state = 605; + this.state = 724; this.identifier(); - this.state = 606; + this.state = 725; this.match(QuixosCapabilityParser.DOT); - this.state = 607; + this.state = 726; this.identifier(); - this.state = 608; + this.state = 727; this.match(QuixosCapabilityParser.SEMI); } } @@ -2318,19 +2794,19 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationBindingDecl(): OperationBindingDeclContext { let localContext = new OperationBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_operationBindingDecl); + this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_operationBindingDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 610; + this.state = 729; this.match(QuixosCapabilityParser.BIND); - this.state = 611; + this.state = 730; this.memberOperationRef(); - this.state = 612; + this.state = 731; this.match(QuixosCapabilityParser.TO); - this.state = 613; + this.state = 732; this.operationProvider(); - this.state = 614; + this.state = 733; this.match(QuixosCapabilityParser.SEMI); } } @@ -2349,15 +2825,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public memberOperationRef(): MemberOperationRefContext { let localContext = new MemberOperationRefContext(this.context, this.state); - this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_memberOperationRef); + this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_memberOperationRef); try { this.enterOuterAlt(localContext, 1); { - this.state = 616; + this.state = 735; this.identifier(); - this.state = 617; + this.state = 736; this.match(QuixosCapabilityParser.DOT); - this.state = 618; + this.state = 737; this.operationName(); } } @@ -2376,86 +2852,86 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationName(): OperationNameContext { let localContext = new OperationNameContext(this.context, this.state); - this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_operationName); + this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_operationName); try { - this.state = 631; + this.state = 750; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.SOURCE: case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 1); { - this.state = 620; + this.state = 739; this.identifier(); } break; case QuixosCapabilityParser.CALL: this.enterOuterAlt(localContext, 2); { - this.state = 621; + this.state = 740; this.match(QuixosCapabilityParser.CALL); } break; case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 3); { - this.state = 622; + this.state = 741; this.match(QuixosCapabilityParser.GET); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 4); { - this.state = 623; + this.state = 742; this.match(QuixosCapabilityParser.SET); } break; case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 5); { - this.state = 624; + this.state = 743; this.match(QuixosCapabilityParser.RESOLVE); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 6); { - this.state = 625; + this.state = 744; this.match(QuixosCapabilityParser.CONNECT); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 7); { - this.state = 626; + this.state = 745; this.match(QuixosCapabilityParser.DISCONNECT); } break; case QuixosCapabilityParser.WATCH_START: this.enterOuterAlt(localContext, 8); { - this.state = 627; + this.state = 746; this.match(QuixosCapabilityParser.WATCH_START); } break; case QuixosCapabilityParser.WATCH_STOP: this.enterOuterAlt(localContext, 9); { - this.state = 628; + this.state = 747; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case QuixosCapabilityParser.SUBSCRIBE: this.enterOuterAlt(localContext, 10); { - this.state = 629; + this.state = 748; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case QuixosCapabilityParser.UNSUBSCRIBE: this.enterOuterAlt(localContext, 11); { - this.state = 630; + this.state = 749; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -2478,59 +2954,69 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationProvider(): OperationProviderContext { let localContext = new OperationProviderContext(this.context, this.state); - this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_operationProvider); + this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 652; + this.state = 774; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 633; + this.state = 752; this.match(QuixosCapabilityParser.STATE); - this.state = 634; + this.state = 753; this.identifier(); - this.state = 635; + this.state = 754; this.match(QuixosCapabilityParser.DOT); - this.state = 636; + this.state = 755; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 638; + this.state = 757; this.match(QuixosCapabilityParser.EDGE); - this.state = 639; + this.state = 758; this.identifier(); - this.state = 640; + this.state = 759; this.match(QuixosCapabilityParser.DOT); - this.state = 641; + this.state = 760; this.identifier(); - this.state = 642; + this.state = 761; this.match(QuixosCapabilityParser.DOT); - this.state = 643; + this.state = 762; this.edgePrimitive(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 3); { - this.state = 645; + this.state = 764; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 646; + this.state = 765; this.identifier(); - this.state = 647; + this.state = 766; this.match(QuixosCapabilityParser.DOT); - this.state = 648; + this.state = 767; this.identifier(); - this.state = 650; + this.state = 769; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 25) { + if (_la === 107) { { - this.state = 649; + this.state = 768; + this.typeArguments(); + } + } + + this.state = 772; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 30) { + { + this.state = 771; this.dependencyBindingBlock(); } } @@ -2556,14 +3042,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public statePrimitive(): StatePrimitiveContext { let localContext = new StatePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_statePrimitive); + this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_statePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 654; + this.state = 776; _la = this.tokenStream.LA(1); - if(!(((((_la - 55)) & ~0x1F) === 0 && ((1 << (_la - 55)) & 195) !== 0))) { + if(!(((((_la - 60)) & ~0x1F) === 0 && ((1 << (_la - 60)) & 195) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2587,14 +3073,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgePrimitive(): EdgePrimitiveContext { let localContext = new EdgePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_edgePrimitive); + this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_edgePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 656; + this.state = 778; _la = this.tokenStream.LA(1); - if(!(((((_la - 57)) & ~0x1F) === 0 && ((1 << (_la - 57)) & 55) !== 0))) { + if(!(((((_la - 62)) & ~0x1F) === 0 && ((1 << (_la - 62)) & 55) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2618,30 +3104,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBindingBlock(): DependencyBindingBlockContext { let localContext = new DependencyBindingBlockContext(this.context, this.state); - this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_dependencyBindingBlock); + this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_dependencyBindingBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 658; + this.state = 780; this.match(QuixosCapabilityParser.WITH); - this.state = 659; + this.state = 781; this.match(QuixosCapabilityParser.LBRACE); - this.state = 663; + this.state = 785; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 34 || _la === 106) { + while (_la === 39 || _la === 113) { { { - this.state = 660; + this.state = 782; this.dependencyBinding(); } } - this.state = 665; + this.state = 787; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 666; + this.state = 788; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2660,127 +3146,137 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBinding(): DependencyBindingContext { let localContext = new DependencyBindingContext(this.context, this.state); - this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_dependencyBinding); + this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 718; + this.state = 843; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 50, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 70, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 668; + this.state = 790; this.identifier(); - this.state = 669; + this.state = 791; this.match(QuixosCapabilityParser.TO); - this.state = 670; + this.state = 792; this.match(QuixosCapabilityParser.STATE); - this.state = 671; + this.state = 793; this.identifier(); - this.state = 678; + this.state = 800; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 27) { + if (_la === 32) { { - this.state = 672; + this.state = 794; this.match(QuixosCapabilityParser.VIA); - this.state = 673; + this.state = 795; this.match(QuixosCapabilityParser.EDGE); - this.state = 674; + this.state = 796; this.identifier(); - this.state = 675; + this.state = 797; this.match(QuixosCapabilityParser.DOT); - this.state = 676; + this.state = 798; this.identifier(); } } - this.state = 680; + this.state = 802; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 682; + this.state = 804; this.identifier(); - this.state = 683; + this.state = 805; this.match(QuixosCapabilityParser.TO); - this.state = 684; + this.state = 806; this.match(QuixosCapabilityParser.EDGE); - this.state = 685; + this.state = 807; this.identifier(); - this.state = 686; + this.state = 808; this.match(QuixosCapabilityParser.DOT); - this.state = 687; + this.state = 809; this.identifier(); - this.state = 694; + this.state = 816; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 27) { + if (_la === 32) { { - this.state = 688; + this.state = 810; this.match(QuixosCapabilityParser.VIA); - this.state = 689; + this.state = 811; this.match(QuixosCapabilityParser.EDGE); - this.state = 690; + this.state = 812; this.identifier(); - this.state = 691; + this.state = 813; this.match(QuixosCapabilityParser.DOT); - this.state = 692; + this.state = 814; this.identifier(); } } - this.state = 696; + this.state = 818; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 698; + this.state = 820; this.identifier(); - this.state = 699; + this.state = 821; this.match(QuixosCapabilityParser.TO); - this.state = 700; + this.state = 822; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 701; + this.state = 823; this.identifier(); - this.state = 708; + this.state = 825; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 27) { + if (_la === 107) { { - this.state = 702; + this.state = 824; + this.typeArguments(); + } + } + + this.state = 833; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 32) { + { + this.state = 827; this.match(QuixosCapabilityParser.VIA); - this.state = 703; + this.state = 828; this.match(QuixosCapabilityParser.EDGE); - this.state = 704; + this.state = 829; this.identifier(); - this.state = 705; + this.state = 830; this.match(QuixosCapabilityParser.DOT); - this.state = 706; + this.state = 831; this.identifier(); } } - this.state = 710; + this.state = 835; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 712; + this.state = 837; this.identifier(); - this.state = 713; + this.state = 838; this.match(QuixosCapabilityParser.TO); - this.state = 714; + this.state = 839; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 715; + this.state = 840; this.identifier(); - this.state = 716; + this.state = 841; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2801,34 +3297,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public constructorBindingDecl(): ConstructorBindingDeclContext { let localContext = new ConstructorBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_constructorBindingDecl); + this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_constructorBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 720; + this.state = 845; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 721; + this.state = 846; this.identifier(); - this.state = 722; + this.state = 847; this.match(QuixosCapabilityParser.TO); - this.state = 723; + this.state = 848; this.identifier(); - this.state = 724; + this.state = 849; this.match(QuixosCapabilityParser.DOT); - this.state = 725; + this.state = 850; this.identifier(); - this.state = 727; + this.state = 852; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 25) { + if (_la === 30) { { - this.state = 726; + this.state = 851; this.dependencyBindingBlock(); } } - this.state = 729; + this.state = 854; this.match(QuixosCapabilityParser.SEMI); } } @@ -2847,10 +3343,10 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueType(): ValueTypeContext { let localContext = new ValueTypeContext(this.context, this.state); - this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_valueType); + this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 765; + this.state = 902; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -2863,108 +3359,149 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 731; + this.state = 856; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 732; + this.state = 857; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 733; + this.state = 858; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 734; + this.state = 859; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 735; + this.state = 860; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 736; + this.state = 861; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 737; + this.state = 862; this.match(QuixosCapabilityParser.LT); - this.state = 738; + this.state = 863; this.identifier(); - this.state = 739; + this.state = 864; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 741; + this.state = 866; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 742; + this.state = 867; this.match(QuixosCapabilityParser.LT); - this.state = 743; + this.state = 868; this.identifier(); - this.state = 744; + this.state = 870; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 107) { + { + this.state = 869; + this.typeArguments(); + } + } + + this.state = 872; + this.match(QuixosCapabilityParser.GT); + } + break; + case QuixosCapabilityParser.REF: + this.enterOuterAlt(localContext, 7); + { + this.state = 874; + this.match(QuixosCapabilityParser.REF); + this.state = 875; + this.match(QuixosCapabilityParser.LT); + this.state = 876; + this.identifier(); + this.state = 877; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: - this.enterOuterAlt(localContext, 7); + this.enterOuterAlt(localContext, 8); { - this.state = 746; + this.state = 879; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 747; + this.state = 880; this.match(QuixosCapabilityParser.LT); - this.state = 748; + this.state = 881; this.valueType(); - this.state = 749; + this.state = 882; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: - this.enterOuterAlt(localContext, 8); + this.enterOuterAlt(localContext, 9); { - this.state = 751; + this.state = 884; this.match(QuixosCapabilityParser.LIST); - this.state = 752; + this.state = 885; this.match(QuixosCapabilityParser.LT); - this.state = 753; + this.state = 886; this.valueType(); - this.state = 754; + this.state = 887; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.RECORD: - this.enterOuterAlt(localContext, 9); + this.enterOuterAlt(localContext, 10); { - this.state = 756; + this.state = 889; this.match(QuixosCapabilityParser.RECORD); - this.state = 757; + this.state = 890; this.match(QuixosCapabilityParser.LBRACE); - this.state = 761; + this.state = 894; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 34 || _la === 106) { + while (_la === 39 || _la === 113) { { { - this.state = 758; + this.state = 891; this.recordField(); } } - this.state = 763; + this.state = 896; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 764; + this.state = 897; this.match(QuixosCapabilityParser.RBRACE); + } + break; + case QuixosCapabilityParser.SOURCE: + case QuixosCapabilityParser.IDENTIFIER: + this.enterOuterAlt(localContext, 11); + { + this.state = 898; + this.identifier(); + this.state = 900; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 107) { + { + this.state = 899; + this.typeArguments(); + } + } + } break; default: @@ -2986,17 +3523,17 @@ export class QuixosCapabilityParser extends antlr.Parser { } public recordField(): RecordFieldContext { let localContext = new RecordFieldContext(this.context, this.state); - this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_recordField); + this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_recordField); try { this.enterOuterAlt(localContext, 1); { - this.state = 767; + this.state = 904; this.identifier(); - this.state = 768; + this.state = 905; this.match(QuixosCapabilityParser.COLON); - this.state = 769; + this.state = 906; this.valueType(); - this.state = 770; + this.state = 907; this.match(QuixosCapabilityParser.SEMI); } } @@ -3015,14 +3552,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public scalarType(): ScalarTypeContext { let localContext = new ScalarTypeContext(this.context, this.state); - this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_scalarType); + this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_scalarType); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 772; + this.state = 909; _la = this.tokenStream.LA(1); - if(!(((((_la - 80)) & ~0x1F) === 0 && ((1 << (_la - 80)) & 255) !== 0))) { + if(!(((((_la - 85)) & ~0x1F) === 0 && ((1 << (_la - 85)) & 255) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3046,14 +3583,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public cardinality(): CardinalityContext { let localContext = new CardinalityContext(this.context, this.state); - this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_cardinality); + this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_cardinality); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 774; + this.state = 911; _la = this.tokenStream.LA(1); - if(!(((((_la - 67)) & ~0x1F) === 0 && ((1 << (_la - 67)) & 15) !== 0))) { + if(!(((((_la - 72)) & ~0x1F) === 0 && ((1 << (_la - 72)) & 15) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3077,64 +3614,64 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonLiteral(): JsonLiteralContext { let localContext = new JsonLiteralContext(this.context, this.state); - this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_jsonLiteral); + this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 784; + this.state = 921; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 776; + this.state = 913; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 777; + this.state = 914; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 778; + this.state = 915; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 779; + this.state = 916; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 780; + this.state = 917; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 781; + this.state = 918; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 782; + this.state = 919; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 783; + this.state = 920; this.jsonArray(); } break; @@ -3157,40 +3694,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonObject(): JsonObjectContext { let localContext = new JsonObjectContext(this.context, this.state); - this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_jsonObject); + this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_jsonObject); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 786; + this.state = 923; this.match(QuixosCapabilityParser.LBRACE); - this.state = 795; + this.state = 932; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 107) { + if (_la === 114) { { - this.state = 787; + this.state = 924; this.jsonMember(); - this.state = 792; + this.state = 929; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 94) { + while (_la === 99) { { { - this.state = 788; + this.state = 925; this.match(QuixosCapabilityParser.COMMA); - this.state = 789; + this.state = 926; this.jsonMember(); } } - this.state = 794; + this.state = 931; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 797; + this.state = 934; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3209,15 +3746,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonMember(): JsonMemberContext { let localContext = new JsonMemberContext(this.context, this.state); - this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_jsonMember); + this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_jsonMember); try { this.enterOuterAlt(localContext, 1); { - this.state = 799; + this.state = 936; this.stringLiteral(); - this.state = 800; + this.state = 937; this.match(QuixosCapabilityParser.COLON); - this.state = 801; + this.state = 938; this.jsonLiteral(); } } @@ -3236,40 +3773,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonArray(): JsonArrayContext { let localContext = new JsonArrayContext(this.context, this.state); - this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_jsonArray); + this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_jsonArray); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 803; + this.state = 940; this.match(QuixosCapabilityParser.LBRACK); - this.state = 812; + this.state = 949; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 722183) !== 0)) { + if (((((_la - 93)) & ~0x1F) === 0 && ((1 << (_la - 93)) & 2884871) !== 0)) { { - this.state = 804; + this.state = 941; this.jsonLiteral(); - this.state = 809; + this.state = 946; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 94) { + while (_la === 99) { { { - this.state = 805; + this.state = 942; this.match(QuixosCapabilityParser.COMMA); - this.state = 806; + this.state = 943; this.jsonLiteral(); } } - this.state = 811; + this.state = 948; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 814; + this.state = 951; this.match(QuixosCapabilityParser.RBRACK); } } @@ -3288,14 +3825,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifier(): IdentifierContext { let localContext = new IdentifierContext(this.context, this.state); - this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_identifier); + this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 816; + this.state = 953; _la = this.tokenStream.LA(1); - if(!(_la === 34 || _la === 106)) { + if(!(_la === 39 || _la === 113)) { this.errorHandler.recoverInline(this); } else { @@ -3319,11 +3856,11 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stringLiteral(): StringLiteralContext { let localContext = new StringLiteralContext(this.context, this.state); - this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_stringLiteral); + this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_stringLiteral); try { this.enterOuterAlt(localContext, 1); { - this.state = 818; + this.state = 955; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -3342,7 +3879,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,110,821,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, + 4,1,117,958,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, 7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7, 13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2, 20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7, @@ -3350,296 +3887,352 @@ export class QuixosCapabilityParser extends antlr.Parser { 33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38,2,39,7, 39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,45,2, 46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7, - 52,2,53,7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7,58,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,131,8,0,1,1,1, - 1,1,1,5,1,136,8,1,10,1,12,1,139,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,3, - 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,5,3,157,8,3,10,3,12,3,160,9, - 3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,3,4,170,8,4,1,5,1,5,1,5,1,5,1, - 5,1,5,1,5,1,5,1,5,1,5,3,5,182,8,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1, - 7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,3,8,201,8,8,1,9,1,9,1,9,1, - 9,1,9,1,9,3,9,209,8,9,1,9,1,9,1,10,5,10,214,8,10,10,10,12,10,217, - 9,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,5,10,227,8,10,10,10, - 12,10,230,9,10,1,10,1,10,1,11,1,11,1,11,3,11,237,8,11,1,12,1,12, - 1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12, - 1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,5,13,262,8,13,10,13,12,13, - 265,9,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14, - 1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,3,14,288,8,14, - 1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,3,15,298,8,15,1,15,1,15, - 5,15,302,8,15,10,15,12,15,305,9,15,1,15,1,15,1,16,1,16,1,16,1,16, - 1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16, - 1,16,1,16,1,16,1,16,1,16,1,16,1,16,3,16,333,8,16,1,17,1,17,1,17, - 1,17,3,17,339,8,17,1,18,5,18,342,8,18,10,18,12,18,345,9,18,1,18, - 1,18,1,18,1,18,1,18,1,18,1,18,1,18,3,18,355,8,18,1,18,1,18,5,18, - 359,8,18,10,18,12,18,362,9,18,1,18,1,18,1,19,1,19,1,19,3,19,369, - 8,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20, - 382,8,20,1,20,1,20,1,20,3,20,387,8,20,1,20,1,20,1,21,1,21,1,21,1, - 21,1,21,1,21,1,21,1,21,1,21,3,21,400,8,21,1,21,1,21,1,22,1,22,1, - 22,1,22,1,22,1,22,1,22,1,22,1,22,3,22,413,8,22,1,22,1,22,1,23,1, - 23,1,23,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,3,25,428,8,25,1, - 25,3,25,431,8,25,1,26,1,26,1,26,5,26,436,8,26,10,26,12,26,439,9, - 26,1,27,1,27,1,27,5,27,444,8,27,10,27,12,27,447,9,27,1,27,1,27,1, - 28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1, - 28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1, - 28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,3,28,486,8,28,1,28,1, - 28,3,28,490,8,28,1,29,1,29,1,29,1,29,5,29,496,8,29,10,29,12,29,499, - 9,29,1,29,1,29,1,30,1,30,1,31,1,31,1,31,1,32,1,32,3,32,510,8,32, - 1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33, - 524,8,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,3,34,534,8,34,1, - 35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1, - 36,1,36,1,36,3,36,552,8,36,1,36,1,36,3,36,556,8,36,1,36,3,36,559, - 8,36,1,36,1,36,3,36,563,8,36,1,36,3,36,566,8,36,1,36,1,36,1,37,1, - 37,1,37,1,37,1,37,1,37,3,37,576,8,37,1,37,1,37,3,37,580,8,37,1,37, - 1,37,5,37,584,8,37,10,37,12,37,587,9,37,1,37,1,37,1,38,1,38,1,38, - 1,38,3,38,595,8,38,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39, - 1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,41,1,41, - 1,41,1,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42, - 3,42,632,8,42,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43, - 1,43,1,43,1,43,1,43,1,43,1,43,1,43,3,43,651,8,43,3,43,653,8,43,1, - 44,1,44,1,45,1,45,1,46,1,46,1,46,5,46,662,8,46,10,46,12,46,665,9, - 46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,3, - 47,679,8,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1, - 47,1,47,1,47,1,47,3,47,695,8,47,1,47,1,47,1,47,1,47,1,47,1,47,1, - 47,1,47,1,47,1,47,1,47,1,47,3,47,709,8,47,1,47,1,47,1,47,1,47,1, - 47,1,47,1,47,1,47,3,47,719,8,47,1,48,1,48,1,48,1,48,1,48,1,48,1, - 48,3,48,728,8,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1, - 49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1, - 49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,5,49,760,8,49,10,49,12,49, - 763,9,49,1,49,3,49,766,8,49,1,50,1,50,1,50,1,50,1,50,1,51,1,51,1, - 52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,3,53,785,8,53,1, - 54,1,54,1,54,1,54,5,54,791,8,54,10,54,12,54,794,9,54,3,54,796,8, - 54,1,54,1,54,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,5,56,808,8, - 56,10,56,12,56,811,9,56,3,56,813,8,56,1,56,1,56,1,57,1,57,1,58,1, - 58,1,58,0,0,59,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34, - 36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78, - 80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116, - 0,7,1,0,60,64,2,0,55,59,61,62,2,0,55,56,61,62,2,0,57,59,61,62,1, - 0,80,87,1,0,67,70,2,0,34,34,106,106,861,0,130,1,0,0,0,2,132,1,0, - 0,0,4,142,1,0,0,0,6,146,1,0,0,0,8,169,1,0,0,0,10,181,1,0,0,0,12, - 183,1,0,0,0,14,190,1,0,0,0,16,200,1,0,0,0,18,202,1,0,0,0,20,215, - 1,0,0,0,22,236,1,0,0,0,24,238,1,0,0,0,26,253,1,0,0,0,28,287,1,0, - 0,0,30,289,1,0,0,0,32,332,1,0,0,0,34,338,1,0,0,0,36,343,1,0,0,0, - 38,368,1,0,0,0,40,370,1,0,0,0,42,390,1,0,0,0,44,403,1,0,0,0,46,416, - 1,0,0,0,48,419,1,0,0,0,50,430,1,0,0,0,52,432,1,0,0,0,54,440,1,0, - 0,0,56,489,1,0,0,0,58,491,1,0,0,0,60,502,1,0,0,0,62,504,1,0,0,0, - 64,509,1,0,0,0,66,511,1,0,0,0,68,533,1,0,0,0,70,535,1,0,0,0,72,544, - 1,0,0,0,74,569,1,0,0,0,76,594,1,0,0,0,78,596,1,0,0,0,80,610,1,0, - 0,0,82,616,1,0,0,0,84,631,1,0,0,0,86,652,1,0,0,0,88,654,1,0,0,0, - 90,656,1,0,0,0,92,658,1,0,0,0,94,718,1,0,0,0,96,720,1,0,0,0,98,765, - 1,0,0,0,100,767,1,0,0,0,102,772,1,0,0,0,104,774,1,0,0,0,106,784, - 1,0,0,0,108,786,1,0,0,0,110,799,1,0,0,0,112,803,1,0,0,0,114,816, - 1,0,0,0,116,818,1,0,0,0,118,119,3,6,3,0,119,120,5,0,0,1,120,131, - 1,0,0,0,121,122,3,20,10,0,122,123,5,0,0,1,123,131,1,0,0,0,124,125, - 3,36,18,0,125,126,5,0,0,1,126,131,1,0,0,0,127,128,3,2,1,0,128,129, - 5,0,0,1,129,131,1,0,0,0,130,118,1,0,0,0,130,121,1,0,0,0,130,124, - 1,0,0,0,130,127,1,0,0,0,131,1,1,0,0,0,132,133,5,2,0,0,133,137,5, - 96,0,0,134,136,3,8,4,0,135,134,1,0,0,0,136,139,1,0,0,0,137,135,1, - 0,0,0,137,138,1,0,0,0,138,140,1,0,0,0,139,137,1,0,0,0,140,141,5, - 97,0,0,141,3,1,0,0,0,142,143,5,3,0,0,143,144,3,116,58,0,144,145, - 5,93,0,0,145,5,1,0,0,0,146,147,5,1,0,0,147,148,3,114,57,0,148,149, - 5,43,0,0,149,150,3,116,58,0,150,151,5,37,0,0,151,152,3,116,58,0, - 152,153,5,36,0,0,153,154,3,116,58,0,154,158,5,96,0,0,155,157,3,8, - 4,0,156,155,1,0,0,0,157,160,1,0,0,0,158,156,1,0,0,0,158,159,1,0, - 0,0,159,161,1,0,0,0,160,158,1,0,0,0,161,162,5,97,0,0,162,7,1,0,0, - 0,163,170,3,4,2,0,164,170,3,18,9,0,165,170,3,10,5,0,166,170,3,62, - 31,0,167,170,3,74,37,0,168,170,3,96,48,0,169,163,1,0,0,0,169,164, - 1,0,0,0,169,165,1,0,0,0,169,166,1,0,0,0,169,167,1,0,0,0,169,168, - 1,0,0,0,170,9,1,0,0,0,171,172,5,3,0,0,172,173,5,6,0,0,173,174,3, - 114,57,0,174,175,5,93,0,0,175,182,1,0,0,0,176,177,5,3,0,0,177,178, - 5,8,0,0,178,179,3,114,57,0,179,180,5,93,0,0,180,182,1,0,0,0,181, - 171,1,0,0,0,181,176,1,0,0,0,182,11,1,0,0,0,183,184,5,4,0,0,184,185, - 5,5,0,0,185,186,3,114,57,0,186,187,5,43,0,0,187,188,3,116,58,0,188, - 189,5,93,0,0,189,13,1,0,0,0,190,191,5,4,0,0,191,192,5,6,0,0,192, - 193,3,114,57,0,193,194,5,37,0,0,194,195,3,116,58,0,195,196,5,93, - 0,0,196,15,1,0,0,0,197,201,3,10,5,0,198,201,3,12,6,0,199,201,3,14, - 7,0,200,197,1,0,0,0,200,198,1,0,0,0,200,199,1,0,0,0,201,17,1,0,0, - 0,202,203,5,5,0,0,203,204,3,114,57,0,204,205,5,43,0,0,205,208,3, - 116,58,0,206,207,5,44,0,0,207,209,3,116,58,0,208,206,1,0,0,0,208, - 209,1,0,0,0,209,210,1,0,0,0,210,211,5,93,0,0,211,19,1,0,0,0,212, - 214,3,16,8,0,213,212,1,0,0,0,214,217,1,0,0,0,215,213,1,0,0,0,215, - 216,1,0,0,0,216,218,1,0,0,0,217,215,1,0,0,0,218,219,5,6,0,0,219, - 220,3,114,57,0,220,221,5,43,0,0,221,222,3,116,58,0,222,223,5,37, - 0,0,223,224,3,116,58,0,224,228,5,96,0,0,225,227,3,22,11,0,226,225, - 1,0,0,0,227,230,1,0,0,0,228,226,1,0,0,0,228,229,1,0,0,0,229,231, - 1,0,0,0,230,228,1,0,0,0,231,232,5,97,0,0,232,21,1,0,0,0,233,237, - 3,26,13,0,234,237,3,30,15,0,235,237,3,24,12,0,236,233,1,0,0,0,236, - 234,1,0,0,0,236,235,1,0,0,0,237,23,1,0,0,0,238,239,5,11,0,0,239, - 240,3,114,57,0,240,241,5,43,0,0,241,242,3,116,58,0,242,243,5,92, - 0,0,243,244,3,98,49,0,244,245,5,91,0,0,245,246,3,98,49,0,246,247, - 5,96,0,0,247,248,5,60,0,0,248,249,5,43,0,0,249,250,3,116,58,0,250, - 251,5,93,0,0,251,252,5,97,0,0,252,25,1,0,0,0,253,254,5,9,0,0,254, - 255,3,114,57,0,255,256,5,43,0,0,256,257,3,116,58,0,257,258,5,92, - 0,0,258,259,3,98,49,0,259,263,5,96,0,0,260,262,3,28,14,0,261,260, - 1,0,0,0,262,265,1,0,0,0,263,261,1,0,0,0,263,264,1,0,0,0,264,266, - 1,0,0,0,265,263,1,0,0,0,266,267,5,97,0,0,267,27,1,0,0,0,268,269, - 5,50,0,0,269,270,5,43,0,0,270,271,3,116,58,0,271,272,5,93,0,0,272, - 288,1,0,0,0,273,274,5,51,0,0,274,275,5,43,0,0,275,276,3,116,58,0, - 276,277,5,93,0,0,277,288,1,0,0,0,278,279,5,52,0,0,279,280,5,53,0, - 0,280,281,5,43,0,0,281,282,3,116,58,0,282,283,5,54,0,0,283,284,5, - 43,0,0,284,285,3,116,58,0,285,286,5,93,0,0,286,288,1,0,0,0,287,268, - 1,0,0,0,287,273,1,0,0,0,287,278,1,0,0,0,288,29,1,0,0,0,289,290,5, - 10,0,0,290,291,3,114,57,0,291,292,5,43,0,0,292,293,3,116,58,0,293, - 294,5,92,0,0,294,295,3,104,52,0,295,297,3,34,17,0,296,298,5,71,0, - 0,297,296,1,0,0,0,297,298,1,0,0,0,298,299,1,0,0,0,299,303,5,96,0, - 0,300,302,3,32,16,0,301,300,1,0,0,0,302,305,1,0,0,0,303,301,1,0, - 0,0,303,304,1,0,0,0,304,306,1,0,0,0,305,303,1,0,0,0,306,307,5,97, - 0,0,307,31,1,0,0,0,308,309,5,57,0,0,309,310,5,43,0,0,310,311,3,116, - 58,0,311,312,5,93,0,0,312,333,1,0,0,0,313,314,5,58,0,0,314,315,5, - 43,0,0,315,316,3,116,58,0,316,317,5,93,0,0,317,333,1,0,0,0,318,319, - 5,59,0,0,319,320,5,43,0,0,320,321,3,116,58,0,321,322,5,93,0,0,322, - 333,1,0,0,0,323,324,5,52,0,0,324,325,5,53,0,0,325,326,5,43,0,0,326, - 327,3,116,58,0,327,328,5,54,0,0,328,329,5,43,0,0,329,330,3,116,58, - 0,330,331,5,93,0,0,331,333,1,0,0,0,332,308,1,0,0,0,332,313,1,0,0, - 0,332,318,1,0,0,0,332,323,1,0,0,0,333,33,1,0,0,0,334,335,5,5,0,0, - 335,339,3,114,57,0,336,337,5,6,0,0,337,339,3,114,57,0,338,334,1, - 0,0,0,338,336,1,0,0,0,339,35,1,0,0,0,340,342,3,16,8,0,341,340,1, - 0,0,0,342,345,1,0,0,0,343,341,1,0,0,0,343,344,1,0,0,0,344,346,1, - 0,0,0,345,343,1,0,0,0,346,347,5,8,0,0,347,348,3,114,57,0,348,349, - 5,43,0,0,349,350,3,116,58,0,350,351,5,37,0,0,351,354,3,116,58,0, - 352,353,5,38,0,0,353,355,5,104,0,0,354,352,1,0,0,0,354,355,1,0,0, - 0,355,356,1,0,0,0,356,360,5,96,0,0,357,359,3,38,19,0,358,357,1,0, - 0,0,359,362,1,0,0,0,360,358,1,0,0,0,360,361,1,0,0,0,361,363,1,0, - 0,0,362,360,1,0,0,0,363,364,5,97,0,0,364,37,1,0,0,0,365,369,3,40, - 20,0,366,369,3,42,21,0,367,369,3,44,22,0,368,365,1,0,0,0,368,366, - 1,0,0,0,368,367,1,0,0,0,369,39,1,0,0,0,370,371,5,11,0,0,371,372, - 3,114,57,0,372,373,5,43,0,0,373,374,3,116,58,0,374,375,5,92,0,0, - 375,376,3,98,49,0,376,377,5,91,0,0,377,378,3,98,49,0,378,379,5,45, - 0,0,379,381,3,48,24,0,380,382,3,46,23,0,381,380,1,0,0,0,381,382, - 1,0,0,0,382,383,1,0,0,0,383,384,5,47,0,0,384,386,3,50,25,0,385,387, - 3,54,27,0,386,385,1,0,0,0,386,387,1,0,0,0,387,388,1,0,0,0,388,389, - 5,93,0,0,389,41,1,0,0,0,390,391,5,12,0,0,391,392,3,114,57,0,392, - 393,5,43,0,0,393,394,3,116,58,0,394,395,5,92,0,0,395,396,3,98,49, - 0,396,397,5,91,0,0,397,399,3,98,49,0,398,400,3,54,27,0,399,398,1, - 0,0,0,399,400,1,0,0,0,400,401,1,0,0,0,401,402,5,93,0,0,402,43,1, - 0,0,0,403,404,5,13,0,0,404,405,3,114,57,0,405,406,5,43,0,0,406,407, - 3,116,58,0,407,408,5,14,0,0,408,409,3,114,57,0,409,410,5,92,0,0, - 410,412,3,98,49,0,411,413,3,54,27,0,412,411,1,0,0,0,412,413,1,0, - 0,0,413,414,1,0,0,0,414,415,5,93,0,0,415,45,1,0,0,0,416,417,5,46, - 0,0,417,418,3,98,49,0,418,47,1,0,0,0,419,420,7,0,0,0,420,49,1,0, - 0,0,421,431,5,49,0,0,422,423,5,5,0,0,423,431,3,114,57,0,424,425, - 5,7,0,0,425,427,5,98,0,0,426,428,3,52,26,0,427,426,1,0,0,0,427,428, - 1,0,0,0,428,429,1,0,0,0,429,431,5,99,0,0,430,421,1,0,0,0,430,422, - 1,0,0,0,430,424,1,0,0,0,431,51,1,0,0,0,432,437,3,114,57,0,433,434, - 5,94,0,0,434,436,3,114,57,0,435,433,1,0,0,0,436,439,1,0,0,0,437, - 435,1,0,0,0,437,438,1,0,0,0,438,53,1,0,0,0,439,437,1,0,0,0,440,441, - 5,48,0,0,441,445,5,96,0,0,442,444,3,56,28,0,443,442,1,0,0,0,444, - 447,1,0,0,0,445,443,1,0,0,0,445,446,1,0,0,0,446,448,1,0,0,0,447, - 445,1,0,0,0,448,449,5,97,0,0,449,55,1,0,0,0,450,451,5,22,0,0,451, - 452,3,114,57,0,452,453,5,43,0,0,453,454,3,116,58,0,454,455,5,92, - 0,0,455,456,3,98,49,0,456,457,3,58,29,0,457,458,5,93,0,0,458,490, - 1,0,0,0,459,460,5,23,0,0,460,461,3,114,57,0,461,462,5,43,0,0,462, - 463,3,116,58,0,463,464,5,92,0,0,464,465,3,104,52,0,465,466,3,34, - 17,0,466,467,3,58,29,0,467,468,5,93,0,0,468,490,1,0,0,0,469,470, - 5,6,0,0,470,471,3,114,57,0,471,472,5,43,0,0,472,473,3,116,58,0,473, - 474,5,92,0,0,474,475,3,114,57,0,475,476,5,93,0,0,476,490,1,0,0,0, - 477,478,5,13,0,0,478,479,3,114,57,0,479,480,5,43,0,0,480,481,3,116, - 58,0,481,482,5,92,0,0,482,485,3,114,57,0,483,484,5,15,0,0,484,486, - 3,98,49,0,485,483,1,0,0,0,485,486,1,0,0,0,486,487,1,0,0,0,487,488, - 5,93,0,0,488,490,1,0,0,0,489,450,1,0,0,0,489,459,1,0,0,0,489,469, - 1,0,0,0,489,477,1,0,0,0,490,57,1,0,0,0,491,492,5,98,0,0,492,497, - 3,60,30,0,493,494,5,94,0,0,494,496,3,60,30,0,495,493,1,0,0,0,496, - 499,1,0,0,0,497,495,1,0,0,0,497,498,1,0,0,0,498,500,1,0,0,0,499, - 497,1,0,0,0,500,501,5,99,0,0,501,59,1,0,0,0,502,503,7,1,0,0,503, - 61,1,0,0,0,504,505,5,21,0,0,505,506,3,64,32,0,506,63,1,0,0,0,507, - 510,3,66,33,0,508,510,3,70,35,0,509,507,1,0,0,0,509,508,1,0,0,0, - 510,65,1,0,0,0,511,512,5,22,0,0,512,513,3,114,57,0,513,514,5,43, - 0,0,514,515,3,116,58,0,515,516,5,31,0,0,516,517,3,114,57,0,517,518, - 5,92,0,0,518,519,3,98,49,0,519,520,5,32,0,0,520,523,3,68,34,0,521, - 522,5,33,0,0,522,524,3,106,53,0,523,521,1,0,0,0,523,524,1,0,0,0, - 524,525,1,0,0,0,525,526,5,93,0,0,526,67,1,0,0,0,527,534,5,65,0,0, - 528,529,5,66,0,0,529,530,5,100,0,0,530,531,3,98,49,0,531,532,5,101, - 0,0,532,534,1,0,0,0,533,527,1,0,0,0,533,528,1,0,0,0,534,69,1,0,0, - 0,535,536,5,23,0,0,536,537,3,114,57,0,537,538,5,43,0,0,538,539,3, - 116,58,0,539,540,5,96,0,0,540,541,3,72,36,0,541,542,3,72,36,0,542, - 543,5,97,0,0,543,71,1,0,0,0,544,545,3,34,17,0,545,546,5,24,0,0,546, - 547,3,114,57,0,547,548,5,43,0,0,548,549,3,116,58,0,549,551,3,104, - 52,0,550,552,5,71,0,0,551,550,1,0,0,0,551,552,1,0,0,0,552,555,1, - 0,0,0,553,554,5,39,0,0,554,556,3,116,58,0,555,553,1,0,0,0,555,556, - 1,0,0,0,556,558,1,0,0,0,557,559,5,40,0,0,558,557,1,0,0,0,558,559, - 1,0,0,0,559,562,1,0,0,0,560,561,5,41,0,0,561,563,3,116,58,0,562, - 560,1,0,0,0,562,563,1,0,0,0,563,565,1,0,0,0,564,566,5,42,0,0,565, - 564,1,0,0,0,565,566,1,0,0,0,566,567,1,0,0,0,567,568,5,93,0,0,568, - 73,1,0,0,0,569,570,5,16,0,0,570,571,3,114,57,0,571,572,5,17,0,0, - 572,575,3,114,57,0,573,574,5,43,0,0,574,576,3,116,58,0,575,573,1, - 0,0,0,575,576,1,0,0,0,576,579,1,0,0,0,577,578,5,38,0,0,578,580,5, - 104,0,0,579,577,1,0,0,0,579,580,1,0,0,0,580,581,1,0,0,0,581,585, - 5,96,0,0,582,584,3,76,38,0,583,582,1,0,0,0,584,587,1,0,0,0,585,583, - 1,0,0,0,585,586,1,0,0,0,586,588,1,0,0,0,587,585,1,0,0,0,588,589, - 5,97,0,0,589,75,1,0,0,0,590,591,5,20,0,0,591,595,3,64,32,0,592,595, - 3,80,40,0,593,595,3,78,39,0,594,590,1,0,0,0,594,592,1,0,0,0,594, - 593,1,0,0,0,595,77,1,0,0,0,596,597,5,28,0,0,597,598,3,114,57,0,598, - 599,5,29,0,0,599,600,5,30,0,0,600,601,5,26,0,0,601,602,5,13,0,0, - 602,603,3,114,57,0,603,604,5,27,0,0,604,605,5,23,0,0,605,606,3,114, - 57,0,606,607,5,95,0,0,607,608,3,114,57,0,608,609,5,93,0,0,609,79, - 1,0,0,0,610,611,5,18,0,0,611,612,3,82,41,0,612,613,5,19,0,0,613, - 614,3,86,43,0,614,615,5,93,0,0,615,81,1,0,0,0,616,617,3,114,57,0, - 617,618,5,95,0,0,618,619,3,84,42,0,619,83,1,0,0,0,620,632,3,114, - 57,0,621,632,5,60,0,0,622,632,5,50,0,0,623,632,5,51,0,0,624,632, - 5,57,0,0,625,632,5,58,0,0,626,632,5,59,0,0,627,632,5,61,0,0,628, - 632,5,62,0,0,629,632,5,63,0,0,630,632,5,64,0,0,631,620,1,0,0,0,631, - 621,1,0,0,0,631,622,1,0,0,0,631,623,1,0,0,0,631,624,1,0,0,0,631, - 625,1,0,0,0,631,626,1,0,0,0,631,627,1,0,0,0,631,628,1,0,0,0,631, - 629,1,0,0,0,631,630,1,0,0,0,632,85,1,0,0,0,633,634,5,22,0,0,634, - 635,3,114,57,0,635,636,5,95,0,0,636,637,3,88,44,0,637,653,1,0,0, - 0,638,639,5,23,0,0,639,640,3,114,57,0,640,641,5,95,0,0,641,642,3, - 114,57,0,642,643,5,95,0,0,643,644,3,90,45,0,644,653,1,0,0,0,645, - 646,5,8,0,0,646,647,3,114,57,0,647,648,5,95,0,0,648,650,3,114,57, - 0,649,651,3,92,46,0,650,649,1,0,0,0,650,651,1,0,0,0,651,653,1,0, - 0,0,652,633,1,0,0,0,652,638,1,0,0,0,652,645,1,0,0,0,653,87,1,0,0, - 0,654,655,7,2,0,0,655,89,1,0,0,0,656,657,7,3,0,0,657,91,1,0,0,0, - 658,659,5,25,0,0,659,663,5,96,0,0,660,662,3,94,47,0,661,660,1,0, - 0,0,662,665,1,0,0,0,663,661,1,0,0,0,663,664,1,0,0,0,664,666,1,0, - 0,0,665,663,1,0,0,0,666,667,5,97,0,0,667,93,1,0,0,0,668,669,3,114, - 57,0,669,670,5,19,0,0,670,671,5,22,0,0,671,678,3,114,57,0,672,673, - 5,27,0,0,673,674,5,23,0,0,674,675,3,114,57,0,675,676,5,95,0,0,676, - 677,3,114,57,0,677,679,1,0,0,0,678,672,1,0,0,0,678,679,1,0,0,0,679, - 680,1,0,0,0,680,681,5,93,0,0,681,719,1,0,0,0,682,683,3,114,57,0, - 683,684,5,19,0,0,684,685,5,23,0,0,685,686,3,114,57,0,686,687,5,95, - 0,0,687,694,3,114,57,0,688,689,5,27,0,0,689,690,5,23,0,0,690,691, - 3,114,57,0,691,692,5,95,0,0,692,693,3,114,57,0,693,695,1,0,0,0,694, - 688,1,0,0,0,694,695,1,0,0,0,695,696,1,0,0,0,696,697,5,93,0,0,697, - 719,1,0,0,0,698,699,3,114,57,0,699,700,5,19,0,0,700,701,5,6,0,0, - 701,708,3,114,57,0,702,703,5,27,0,0,703,704,5,23,0,0,704,705,3,114, - 57,0,705,706,5,95,0,0,706,707,3,114,57,0,707,709,1,0,0,0,708,702, - 1,0,0,0,708,709,1,0,0,0,709,710,1,0,0,0,710,711,5,93,0,0,711,719, - 1,0,0,0,712,713,3,114,57,0,713,714,5,19,0,0,714,715,5,13,0,0,715, - 716,3,114,57,0,716,717,5,93,0,0,717,719,1,0,0,0,718,668,1,0,0,0, - 718,682,1,0,0,0,718,698,1,0,0,0,718,712,1,0,0,0,719,95,1,0,0,0,720, - 721,5,13,0,0,721,722,3,114,57,0,722,723,5,19,0,0,723,724,3,114,57, - 0,724,725,5,95,0,0,725,727,3,114,57,0,726,728,3,92,46,0,727,726, - 1,0,0,0,727,728,1,0,0,0,728,729,1,0,0,0,729,730,5,93,0,0,730,97, - 1,0,0,0,731,766,3,102,51,0,732,766,5,72,0,0,733,766,5,73,0,0,734, - 735,5,74,0,0,735,766,3,116,58,0,736,737,5,75,0,0,737,738,5,102,0, - 0,738,739,3,114,57,0,739,740,5,103,0,0,740,766,1,0,0,0,741,742,5, - 76,0,0,742,743,5,102,0,0,743,744,3,114,57,0,744,745,5,103,0,0,745, - 766,1,0,0,0,746,747,5,77,0,0,747,748,5,102,0,0,748,749,3,98,49,0, - 749,750,5,103,0,0,750,766,1,0,0,0,751,752,5,78,0,0,752,753,5,102, - 0,0,753,754,3,98,49,0,754,755,5,103,0,0,755,766,1,0,0,0,756,757, - 5,79,0,0,757,761,5,96,0,0,758,760,3,100,50,0,759,758,1,0,0,0,760, - 763,1,0,0,0,761,759,1,0,0,0,761,762,1,0,0,0,762,764,1,0,0,0,763, - 761,1,0,0,0,764,766,5,97,0,0,765,731,1,0,0,0,765,732,1,0,0,0,765, - 733,1,0,0,0,765,734,1,0,0,0,765,736,1,0,0,0,765,741,1,0,0,0,765, - 746,1,0,0,0,765,751,1,0,0,0,765,756,1,0,0,0,766,99,1,0,0,0,767,768, - 3,114,57,0,768,769,5,92,0,0,769,770,3,98,49,0,770,771,5,93,0,0,771, - 101,1,0,0,0,772,773,7,4,0,0,773,103,1,0,0,0,774,775,7,5,0,0,775, - 105,1,0,0,0,776,785,3,116,58,0,777,785,5,104,0,0,778,785,5,105,0, - 0,779,785,5,88,0,0,780,785,5,89,0,0,781,785,5,90,0,0,782,785,3,108, - 54,0,783,785,3,112,56,0,784,776,1,0,0,0,784,777,1,0,0,0,784,778, - 1,0,0,0,784,779,1,0,0,0,784,780,1,0,0,0,784,781,1,0,0,0,784,782, - 1,0,0,0,784,783,1,0,0,0,785,107,1,0,0,0,786,795,5,96,0,0,787,792, - 3,110,55,0,788,789,5,94,0,0,789,791,3,110,55,0,790,788,1,0,0,0,791, - 794,1,0,0,0,792,790,1,0,0,0,792,793,1,0,0,0,793,796,1,0,0,0,794, - 792,1,0,0,0,795,787,1,0,0,0,795,796,1,0,0,0,796,797,1,0,0,0,797, - 798,5,97,0,0,798,109,1,0,0,0,799,800,3,116,58,0,800,801,5,92,0,0, - 801,802,3,106,53,0,802,111,1,0,0,0,803,812,5,98,0,0,804,809,3,106, - 53,0,805,806,5,94,0,0,806,808,3,106,53,0,807,805,1,0,0,0,808,811, - 1,0,0,0,809,807,1,0,0,0,809,810,1,0,0,0,810,813,1,0,0,0,811,809, - 1,0,0,0,812,804,1,0,0,0,812,813,1,0,0,0,813,814,1,0,0,0,814,815, - 5,99,0,0,815,113,1,0,0,0,816,817,7,6,0,0,817,115,1,0,0,0,818,819, - 5,107,0,0,819,117,1,0,0,0,59,130,137,158,169,181,200,208,215,228, - 236,263,287,297,303,332,338,343,354,360,368,381,386,399,412,427, - 430,437,445,485,489,497,509,523,533,551,555,558,562,565,575,579, - 585,594,631,650,652,663,678,694,708,718,727,761,765,784,792,795, - 809,812 + 52,2,53,7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7,58,2, + 59,7,59,2,60,7,60,2,61,7,61,2,62,7,62,2,63,7,63,2,64,7,64,1,0,1, + 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,143,8,0,1,1,1,1,1, + 1,5,1,148,8,1,10,1,12,1,151,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,3,1,3, + 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,5,3,169,8,3,10,3,12,3,172,9,3,1, + 3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,3,4,183,8,4,1,5,1,5,1,5,1,5,1, + 5,1,5,1,5,1,5,1,5,1,5,3,5,195,8,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1, + 7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,3,8,215,8,8,1,9,1,9,1, + 9,1,9,1,9,1,9,3,9,223,8,9,1,9,1,9,1,10,5,10,228,8,10,10,10,12,10, + 231,9,10,1,10,1,10,1,10,3,10,236,8,10,1,10,1,10,1,10,1,10,1,10,1, + 10,1,10,1,10,5,10,246,8,10,10,10,12,10,249,9,10,3,10,251,8,10,1, + 10,1,10,5,10,255,8,10,10,10,12,10,258,9,10,1,10,1,10,1,11,1,11,1, + 11,1,11,5,11,266,8,11,10,11,12,11,269,9,11,1,11,1,11,1,12,1,12,1, + 12,1,12,3,12,277,8,12,1,12,1,12,1,12,1,12,1,12,1,12,5,12,285,8,12, + 10,12,12,12,288,9,12,3,12,290,8,12,3,12,292,8,12,1,13,1,13,3,13, + 296,8,13,1,14,1,14,1,14,1,14,5,14,302,8,14,10,14,12,14,305,9,14, + 1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,3,15,316,8,15,1,16, + 1,16,1,16,3,16,321,8,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,3,17, + 330,8,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18, + 1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,5,19, + 355,8,19,10,19,12,19,358,9,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20, + 1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, + 1,20,3,20,381,8,20,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21, + 391,8,21,1,21,1,21,5,21,395,8,21,10,21,12,21,398,9,21,1,21,1,21, + 1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22, + 1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,3,22,426, + 8,22,1,23,1,23,1,23,1,23,1,23,3,23,433,8,23,1,23,1,23,3,23,437,8, + 23,1,24,5,24,440,8,24,10,24,12,24,443,9,24,1,24,1,24,1,24,1,24,1, + 24,1,24,1,24,1,24,3,24,453,8,24,1,24,1,24,5,24,457,8,24,10,24,12, + 24,460,9,24,1,24,1,24,1,25,1,25,1,25,3,25,467,8,25,1,26,1,26,1,26, + 3,26,472,8,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,3,26, + 483,8,26,1,26,1,26,1,26,3,26,488,8,26,1,26,1,26,1,27,1,27,1,27,3, + 27,495,8,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,3,27,504,8,27,1,27, + 1,27,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,3,28,517,8,28, + 1,28,1,28,1,29,1,29,1,29,1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,31, + 1,31,1,31,1,31,1,31,5,31,536,8,31,10,31,12,31,539,9,31,3,31,541, + 8,31,1,31,3,31,544,8,31,1,32,1,32,1,32,5,32,549,8,32,10,32,12,32, + 552,9,32,1,33,1,33,1,33,5,33,557,8,33,10,33,12,33,560,9,33,1,33, + 1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, + 1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, + 1,34,3,34,590,8,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, + 1,34,3,34,602,8,34,1,34,1,34,3,34,606,8,34,1,35,1,35,1,35,1,35,5, + 35,612,8,35,10,35,12,35,615,9,35,1,35,1,35,1,36,1,36,1,37,1,37,1, + 37,1,38,1,38,3,38,626,8,38,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1, + 39,1,39,1,39,1,39,1,39,3,39,640,8,39,1,39,1,39,1,40,1,40,1,40,1, + 40,1,40,1,40,3,40,650,8,40,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1, + 41,1,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,3,42,668,8,42,1,42,1, + 42,3,42,672,8,42,1,42,3,42,675,8,42,1,42,1,42,3,42,679,8,42,1,42, + 3,42,682,8,42,1,42,1,42,1,43,1,43,1,43,1,43,1,43,3,43,691,8,43,1, + 43,1,43,3,43,695,8,43,1,43,1,43,3,43,699,8,43,1,43,1,43,5,43,703, + 8,43,10,43,12,43,706,9,43,1,43,1,43,1,44,1,44,1,44,1,44,3,44,714, + 8,44,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45, + 1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,47,1,48, + 1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,3,48,751,8,48, + 1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49, + 1,49,1,49,1,49,1,49,3,49,770,8,49,1,49,3,49,773,8,49,3,49,775,8, + 49,1,50,1,50,1,51,1,51,1,52,1,52,1,52,5,52,784,8,52,10,52,12,52, + 787,9,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53, + 1,53,3,53,801,8,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53, + 1,53,1,53,1,53,1,53,1,53,3,53,817,8,53,1,53,1,53,1,53,1,53,1,53, + 1,53,1,53,3,53,826,8,53,1,53,1,53,1,53,1,53,1,53,1,53,3,53,834,8, + 53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,3,53,844,8,53,1,54,1, + 54,1,54,1,54,1,54,1,54,1,54,3,54,853,8,54,1,54,1,54,1,55,1,55,1, + 55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,3,55,871, + 8,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55, + 1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,5,55,893,8,55,10,55,12,55, + 896,9,55,1,55,1,55,1,55,3,55,901,8,55,3,55,903,8,55,1,56,1,56,1, + 56,1,56,1,56,1,57,1,57,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,59,1, + 59,1,59,3,59,922,8,59,1,60,1,60,1,60,1,60,5,60,928,8,60,10,60,12, + 60,931,9,60,3,60,933,8,60,1,60,1,60,1,61,1,61,1,61,1,61,1,62,1,62, + 1,62,1,62,5,62,945,8,62,10,62,12,62,948,9,62,3,62,950,8,62,1,62, + 1,62,1,63,1,63,1,64,1,64,1,64,0,0,65,0,2,4,6,8,10,12,14,16,18,20, + 22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64, + 66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106, + 108,110,112,114,116,118,120,122,124,126,128,0,7,1,0,65,69,2,0,60, + 64,66,67,2,0,60,61,66,67,2,0,62,64,66,67,1,0,85,92,1,0,72,75,2,0, + 39,39,113,113,1022,0,142,1,0,0,0,2,144,1,0,0,0,4,154,1,0,0,0,6,158, + 1,0,0,0,8,182,1,0,0,0,10,194,1,0,0,0,12,196,1,0,0,0,14,203,1,0,0, + 0,16,214,1,0,0,0,18,216,1,0,0,0,20,229,1,0,0,0,22,261,1,0,0,0,24, + 291,1,0,0,0,26,293,1,0,0,0,28,297,1,0,0,0,30,315,1,0,0,0,32,317, + 1,0,0,0,34,329,1,0,0,0,36,331,1,0,0,0,38,346,1,0,0,0,40,380,1,0, + 0,0,42,382,1,0,0,0,44,425,1,0,0,0,46,436,1,0,0,0,48,441,1,0,0,0, + 50,466,1,0,0,0,52,468,1,0,0,0,54,491,1,0,0,0,56,507,1,0,0,0,58,520, + 1,0,0,0,60,523,1,0,0,0,62,543,1,0,0,0,64,545,1,0,0,0,66,553,1,0, + 0,0,68,605,1,0,0,0,70,607,1,0,0,0,72,618,1,0,0,0,74,620,1,0,0,0, + 76,625,1,0,0,0,78,627,1,0,0,0,80,649,1,0,0,0,82,651,1,0,0,0,84,660, + 1,0,0,0,86,685,1,0,0,0,88,713,1,0,0,0,90,715,1,0,0,0,92,729,1,0, + 0,0,94,735,1,0,0,0,96,750,1,0,0,0,98,774,1,0,0,0,100,776,1,0,0,0, + 102,778,1,0,0,0,104,780,1,0,0,0,106,843,1,0,0,0,108,845,1,0,0,0, + 110,902,1,0,0,0,112,904,1,0,0,0,114,909,1,0,0,0,116,911,1,0,0,0, + 118,921,1,0,0,0,120,923,1,0,0,0,122,936,1,0,0,0,124,940,1,0,0,0, + 126,953,1,0,0,0,128,955,1,0,0,0,130,131,3,6,3,0,131,132,5,0,0,1, + 132,143,1,0,0,0,133,134,3,20,10,0,134,135,5,0,0,1,135,143,1,0,0, + 0,136,137,3,48,24,0,137,138,5,0,0,1,138,143,1,0,0,0,139,140,3,2, + 1,0,140,141,5,0,0,1,141,143,1,0,0,0,142,130,1,0,0,0,142,133,1,0, + 0,0,142,136,1,0,0,0,142,139,1,0,0,0,143,1,1,0,0,0,144,145,5,7,0, + 0,145,149,5,101,0,0,146,148,3,8,4,0,147,146,1,0,0,0,148,151,1,0, + 0,0,149,147,1,0,0,0,149,150,1,0,0,0,150,152,1,0,0,0,151,149,1,0, + 0,0,152,153,5,102,0,0,153,3,1,0,0,0,154,155,5,8,0,0,155,156,3,128, + 64,0,156,157,5,98,0,0,157,5,1,0,0,0,158,159,5,1,0,0,159,160,3,126, + 63,0,160,161,5,48,0,0,161,162,3,128,64,0,162,163,5,42,0,0,163,164, + 3,128,64,0,164,165,5,41,0,0,165,166,3,128,64,0,166,170,5,101,0,0, + 167,169,3,8,4,0,168,167,1,0,0,0,169,172,1,0,0,0,170,168,1,0,0,0, + 170,171,1,0,0,0,171,173,1,0,0,0,172,170,1,0,0,0,173,174,5,102,0, + 0,174,7,1,0,0,0,175,183,3,4,2,0,176,183,3,18,9,0,177,183,3,10,5, + 0,178,183,3,74,37,0,179,183,3,86,43,0,180,183,3,108,54,0,181,183, + 3,32,16,0,182,175,1,0,0,0,182,176,1,0,0,0,182,177,1,0,0,0,182,178, + 1,0,0,0,182,179,1,0,0,0,182,180,1,0,0,0,182,181,1,0,0,0,183,9,1, + 0,0,0,184,185,5,8,0,0,185,186,5,11,0,0,186,187,3,126,63,0,187,188, + 5,98,0,0,188,195,1,0,0,0,189,190,5,8,0,0,190,191,5,13,0,0,191,192, + 3,126,63,0,192,193,5,98,0,0,193,195,1,0,0,0,194,184,1,0,0,0,194, + 189,1,0,0,0,195,11,1,0,0,0,196,197,5,9,0,0,197,198,5,10,0,0,198, + 199,3,126,63,0,199,200,5,48,0,0,200,201,3,128,64,0,201,202,5,98, + 0,0,202,13,1,0,0,0,203,204,5,9,0,0,204,205,5,11,0,0,205,206,3,126, + 63,0,206,207,5,42,0,0,207,208,3,128,64,0,208,209,5,98,0,0,209,15, + 1,0,0,0,210,215,3,10,5,0,211,215,3,12,6,0,212,215,3,14,7,0,213,215, + 3,32,16,0,214,210,1,0,0,0,214,211,1,0,0,0,214,212,1,0,0,0,214,213, + 1,0,0,0,215,17,1,0,0,0,216,217,5,10,0,0,217,218,3,126,63,0,218,219, + 5,48,0,0,219,222,3,128,64,0,220,221,5,49,0,0,221,223,3,128,64,0, + 222,220,1,0,0,0,222,223,1,0,0,0,223,224,1,0,0,0,224,225,5,98,0,0, + 225,19,1,0,0,0,226,228,3,16,8,0,227,226,1,0,0,0,228,231,1,0,0,0, + 229,227,1,0,0,0,229,230,1,0,0,0,230,232,1,0,0,0,231,229,1,0,0,0, + 232,233,5,11,0,0,233,235,3,126,63,0,234,236,3,22,11,0,235,234,1, + 0,0,0,235,236,1,0,0,0,236,237,1,0,0,0,237,238,5,48,0,0,238,239,3, + 128,64,0,239,240,5,42,0,0,240,250,3,128,64,0,241,242,5,53,0,0,242, + 247,3,26,13,0,243,244,5,99,0,0,244,246,3,26,13,0,245,243,1,0,0,0, + 246,249,1,0,0,0,247,245,1,0,0,0,247,248,1,0,0,0,248,251,1,0,0,0, + 249,247,1,0,0,0,250,241,1,0,0,0,250,251,1,0,0,0,251,252,1,0,0,0, + 252,256,5,101,0,0,253,255,3,34,17,0,254,253,1,0,0,0,255,258,1,0, + 0,0,256,254,1,0,0,0,256,257,1,0,0,0,257,259,1,0,0,0,258,256,1,0, + 0,0,259,260,5,102,0,0,260,21,1,0,0,0,261,262,5,107,0,0,262,267,3, + 24,12,0,263,264,5,99,0,0,264,266,3,24,12,0,265,263,1,0,0,0,266,269, + 1,0,0,0,267,265,1,0,0,0,267,268,1,0,0,0,268,270,1,0,0,0,269,267, + 1,0,0,0,270,271,5,108,0,0,271,23,1,0,0,0,272,273,5,14,0,0,273,276, + 3,126,63,0,274,275,5,97,0,0,275,277,5,4,0,0,276,274,1,0,0,0,276, + 277,1,0,0,0,277,292,1,0,0,0,278,279,5,3,0,0,279,289,3,126,63,0,280, + 281,5,5,0,0,281,286,3,26,13,0,282,283,5,109,0,0,283,285,3,26,13, + 0,284,282,1,0,0,0,285,288,1,0,0,0,286,284,1,0,0,0,286,287,1,0,0, + 0,287,290,1,0,0,0,288,286,1,0,0,0,289,280,1,0,0,0,289,290,1,0,0, + 0,290,292,1,0,0,0,291,272,1,0,0,0,291,278,1,0,0,0,292,25,1,0,0,0, + 293,295,3,126,63,0,294,296,3,28,14,0,295,294,1,0,0,0,295,296,1,0, + 0,0,296,27,1,0,0,0,297,298,5,107,0,0,298,303,3,30,15,0,299,300,5, + 99,0,0,300,302,3,30,15,0,301,299,1,0,0,0,302,305,1,0,0,0,303,301, + 1,0,0,0,303,304,1,0,0,0,304,306,1,0,0,0,305,303,1,0,0,0,306,307, + 5,108,0,0,307,29,1,0,0,0,308,309,5,10,0,0,309,316,3,126,63,0,310, + 311,5,11,0,0,311,316,3,26,13,0,312,313,5,3,0,0,313,316,3,126,63, + 0,314,316,3,110,55,0,315,308,1,0,0,0,315,310,1,0,0,0,315,312,1,0, + 0,0,315,314,1,0,0,0,316,31,1,0,0,0,317,318,5,2,0,0,318,320,3,126, + 63,0,319,321,3,22,11,0,320,319,1,0,0,0,320,321,1,0,0,0,321,322,1, + 0,0,0,322,323,5,110,0,0,323,324,3,110,55,0,324,325,5,98,0,0,325, + 33,1,0,0,0,326,330,3,38,19,0,327,330,3,42,21,0,328,330,3,36,18,0, + 329,326,1,0,0,0,329,327,1,0,0,0,329,328,1,0,0,0,330,35,1,0,0,0,331, + 332,5,16,0,0,332,333,3,126,63,0,333,334,5,48,0,0,334,335,3,128,64, + 0,335,336,5,97,0,0,336,337,3,110,55,0,337,338,5,96,0,0,338,339,3, + 110,55,0,339,340,5,101,0,0,340,341,5,65,0,0,341,342,5,48,0,0,342, + 343,3,128,64,0,343,344,5,98,0,0,344,345,5,102,0,0,345,37,1,0,0,0, + 346,347,5,14,0,0,347,348,3,126,63,0,348,349,5,48,0,0,349,350,3,128, + 64,0,350,351,5,97,0,0,351,352,3,110,55,0,352,356,5,101,0,0,353,355, + 3,40,20,0,354,353,1,0,0,0,355,358,1,0,0,0,356,354,1,0,0,0,356,357, + 1,0,0,0,357,359,1,0,0,0,358,356,1,0,0,0,359,360,5,102,0,0,360,39, + 1,0,0,0,361,362,5,55,0,0,362,363,5,48,0,0,363,364,3,128,64,0,364, + 365,5,98,0,0,365,381,1,0,0,0,366,367,5,56,0,0,367,368,5,48,0,0,368, + 369,3,128,64,0,369,370,5,98,0,0,370,381,1,0,0,0,371,372,5,57,0,0, + 372,373,5,58,0,0,373,374,5,48,0,0,374,375,3,128,64,0,375,376,5,59, + 0,0,376,377,5,48,0,0,377,378,3,128,64,0,378,379,5,98,0,0,379,381, + 1,0,0,0,380,361,1,0,0,0,380,366,1,0,0,0,380,371,1,0,0,0,381,41,1, + 0,0,0,382,383,5,15,0,0,383,384,3,126,63,0,384,385,5,48,0,0,385,386, + 3,128,64,0,386,387,5,97,0,0,387,388,3,116,58,0,388,390,3,46,23,0, + 389,391,5,76,0,0,390,389,1,0,0,0,390,391,1,0,0,0,391,392,1,0,0,0, + 392,396,5,101,0,0,393,395,3,44,22,0,394,393,1,0,0,0,395,398,1,0, + 0,0,396,394,1,0,0,0,396,397,1,0,0,0,397,399,1,0,0,0,398,396,1,0, + 0,0,399,400,5,102,0,0,400,43,1,0,0,0,401,402,5,62,0,0,402,403,5, + 48,0,0,403,404,3,128,64,0,404,405,5,98,0,0,405,426,1,0,0,0,406,407, + 5,63,0,0,407,408,5,48,0,0,408,409,3,128,64,0,409,410,5,98,0,0,410, + 426,1,0,0,0,411,412,5,64,0,0,412,413,5,48,0,0,413,414,3,128,64,0, + 414,415,5,98,0,0,415,426,1,0,0,0,416,417,5,57,0,0,417,418,5,58,0, + 0,418,419,5,48,0,0,419,420,3,128,64,0,420,421,5,59,0,0,421,422,5, + 48,0,0,422,423,3,128,64,0,423,424,5,98,0,0,424,426,1,0,0,0,425,401, + 1,0,0,0,425,406,1,0,0,0,425,411,1,0,0,0,425,416,1,0,0,0,426,45,1, + 0,0,0,427,428,5,10,0,0,428,437,3,126,63,0,429,430,5,11,0,0,430,432, + 3,126,63,0,431,433,3,28,14,0,432,431,1,0,0,0,432,433,1,0,0,0,433, + 437,1,0,0,0,434,435,5,3,0,0,435,437,3,126,63,0,436,427,1,0,0,0,436, + 429,1,0,0,0,436,434,1,0,0,0,437,47,1,0,0,0,438,440,3,16,8,0,439, + 438,1,0,0,0,440,443,1,0,0,0,441,439,1,0,0,0,441,442,1,0,0,0,442, + 444,1,0,0,0,443,441,1,0,0,0,444,445,5,13,0,0,445,446,3,126,63,0, + 446,447,5,48,0,0,447,448,3,128,64,0,448,449,5,42,0,0,449,452,3,128, + 64,0,450,451,5,43,0,0,451,453,5,111,0,0,452,450,1,0,0,0,452,453, + 1,0,0,0,453,454,1,0,0,0,454,458,5,101,0,0,455,457,3,50,25,0,456, + 455,1,0,0,0,457,460,1,0,0,0,458,456,1,0,0,0,458,459,1,0,0,0,459, + 461,1,0,0,0,460,458,1,0,0,0,461,462,5,102,0,0,462,49,1,0,0,0,463, + 467,3,52,26,0,464,467,3,54,27,0,465,467,3,56,28,0,466,463,1,0,0, + 0,466,464,1,0,0,0,466,465,1,0,0,0,467,51,1,0,0,0,468,469,5,16,0, + 0,469,471,3,126,63,0,470,472,3,22,11,0,471,470,1,0,0,0,471,472,1, + 0,0,0,472,473,1,0,0,0,473,474,5,48,0,0,474,475,3,128,64,0,475,476, + 5,97,0,0,476,477,3,110,55,0,477,478,5,96,0,0,478,479,3,110,55,0, + 479,480,5,50,0,0,480,482,3,60,30,0,481,483,3,58,29,0,482,481,1,0, + 0,0,482,483,1,0,0,0,483,484,1,0,0,0,484,485,5,52,0,0,485,487,3,62, + 31,0,486,488,3,66,33,0,487,486,1,0,0,0,487,488,1,0,0,0,488,489,1, + 0,0,0,489,490,5,98,0,0,490,53,1,0,0,0,491,492,5,17,0,0,492,494,3, + 126,63,0,493,495,3,22,11,0,494,493,1,0,0,0,494,495,1,0,0,0,495,496, + 1,0,0,0,496,497,5,48,0,0,497,498,3,128,64,0,498,499,5,97,0,0,499, + 500,3,110,55,0,500,501,5,96,0,0,501,503,3,110,55,0,502,504,3,66, + 33,0,503,502,1,0,0,0,503,504,1,0,0,0,504,505,1,0,0,0,505,506,5,98, + 0,0,506,55,1,0,0,0,507,508,5,18,0,0,508,509,3,126,63,0,509,510,5, + 48,0,0,510,511,3,128,64,0,511,512,5,19,0,0,512,513,3,126,63,0,513, + 514,5,97,0,0,514,516,3,110,55,0,515,517,3,66,33,0,516,515,1,0,0, + 0,516,517,1,0,0,0,517,518,1,0,0,0,518,519,5,98,0,0,519,57,1,0,0, + 0,520,521,5,51,0,0,521,522,3,110,55,0,522,59,1,0,0,0,523,524,7,0, + 0,0,524,61,1,0,0,0,525,544,5,54,0,0,526,527,5,10,0,0,527,544,3,126, + 63,0,528,529,5,3,0,0,529,544,3,126,63,0,530,531,5,12,0,0,531,540, + 5,103,0,0,532,537,3,26,13,0,533,534,5,99,0,0,534,536,3,26,13,0,535, + 533,1,0,0,0,536,539,1,0,0,0,537,535,1,0,0,0,537,538,1,0,0,0,538, + 541,1,0,0,0,539,537,1,0,0,0,540,532,1,0,0,0,540,541,1,0,0,0,541, + 542,1,0,0,0,542,544,5,104,0,0,543,525,1,0,0,0,543,526,1,0,0,0,543, + 528,1,0,0,0,543,530,1,0,0,0,544,63,1,0,0,0,545,550,3,126,63,0,546, + 547,5,99,0,0,547,549,3,126,63,0,548,546,1,0,0,0,549,552,1,0,0,0, + 550,548,1,0,0,0,550,551,1,0,0,0,551,65,1,0,0,0,552,550,1,0,0,0,553, + 554,5,53,0,0,554,558,5,101,0,0,555,557,3,68,34,0,556,555,1,0,0,0, + 557,560,1,0,0,0,558,556,1,0,0,0,558,559,1,0,0,0,559,561,1,0,0,0, + 560,558,1,0,0,0,561,562,5,102,0,0,562,67,1,0,0,0,563,564,5,27,0, + 0,564,565,3,126,63,0,565,566,5,48,0,0,566,567,3,128,64,0,567,568, + 5,97,0,0,568,569,3,110,55,0,569,570,3,70,35,0,570,571,5,98,0,0,571, + 606,1,0,0,0,572,573,5,28,0,0,573,574,3,126,63,0,574,575,5,48,0,0, + 575,576,3,128,64,0,576,577,5,97,0,0,577,578,3,116,58,0,578,579,3, + 46,23,0,579,580,3,70,35,0,580,581,5,98,0,0,581,606,1,0,0,0,582,583, + 5,11,0,0,583,584,3,126,63,0,584,585,5,48,0,0,585,586,3,128,64,0, + 586,587,5,97,0,0,587,589,3,126,63,0,588,590,3,28,14,0,589,588,1, + 0,0,0,589,590,1,0,0,0,590,591,1,0,0,0,591,592,5,98,0,0,592,606,1, + 0,0,0,593,594,5,18,0,0,594,595,3,126,63,0,595,596,5,48,0,0,596,597, + 3,128,64,0,597,598,5,97,0,0,598,601,3,126,63,0,599,600,5,20,0,0, + 600,602,3,110,55,0,601,599,1,0,0,0,601,602,1,0,0,0,602,603,1,0,0, + 0,603,604,5,98,0,0,604,606,1,0,0,0,605,563,1,0,0,0,605,572,1,0,0, + 0,605,582,1,0,0,0,605,593,1,0,0,0,606,69,1,0,0,0,607,608,5,103,0, + 0,608,613,3,72,36,0,609,610,5,99,0,0,610,612,3,72,36,0,611,609,1, + 0,0,0,612,615,1,0,0,0,613,611,1,0,0,0,613,614,1,0,0,0,614,616,1, + 0,0,0,615,613,1,0,0,0,616,617,5,104,0,0,617,71,1,0,0,0,618,619,7, + 1,0,0,619,73,1,0,0,0,620,621,5,26,0,0,621,622,3,76,38,0,622,75,1, + 0,0,0,623,626,3,78,39,0,624,626,3,82,41,0,625,623,1,0,0,0,625,624, + 1,0,0,0,626,77,1,0,0,0,627,628,5,27,0,0,628,629,3,126,63,0,629,630, + 5,48,0,0,630,631,3,128,64,0,631,632,5,36,0,0,632,633,3,126,63,0, + 633,634,5,97,0,0,634,635,3,110,55,0,635,636,5,37,0,0,636,639,3,80, + 40,0,637,638,5,38,0,0,638,640,3,118,59,0,639,637,1,0,0,0,639,640, + 1,0,0,0,640,641,1,0,0,0,641,642,5,98,0,0,642,79,1,0,0,0,643,650, + 5,70,0,0,644,645,5,71,0,0,645,646,5,105,0,0,646,647,3,110,55,0,647, + 648,5,106,0,0,648,650,1,0,0,0,649,643,1,0,0,0,649,644,1,0,0,0,650, + 81,1,0,0,0,651,652,5,28,0,0,652,653,3,126,63,0,653,654,5,48,0,0, + 654,655,3,128,64,0,655,656,5,101,0,0,656,657,3,84,42,0,657,658,3, + 84,42,0,658,659,5,102,0,0,659,83,1,0,0,0,660,661,3,46,23,0,661,662, + 5,29,0,0,662,663,3,126,63,0,663,664,5,48,0,0,664,665,3,128,64,0, + 665,667,3,116,58,0,666,668,5,76,0,0,667,666,1,0,0,0,667,668,1,0, + 0,0,668,671,1,0,0,0,669,670,5,44,0,0,670,672,3,128,64,0,671,669, + 1,0,0,0,671,672,1,0,0,0,672,674,1,0,0,0,673,675,5,45,0,0,674,673, + 1,0,0,0,674,675,1,0,0,0,675,678,1,0,0,0,676,677,5,46,0,0,677,679, + 3,128,64,0,678,676,1,0,0,0,678,679,1,0,0,0,679,681,1,0,0,0,680,682, + 5,47,0,0,681,680,1,0,0,0,681,682,1,0,0,0,682,683,1,0,0,0,683,684, + 5,98,0,0,684,85,1,0,0,0,685,686,5,21,0,0,686,687,3,126,63,0,687, + 688,5,22,0,0,688,690,3,126,63,0,689,691,3,28,14,0,690,689,1,0,0, + 0,690,691,1,0,0,0,691,694,1,0,0,0,692,693,5,48,0,0,693,695,3,128, + 64,0,694,692,1,0,0,0,694,695,1,0,0,0,695,698,1,0,0,0,696,697,5,43, + 0,0,697,699,5,111,0,0,698,696,1,0,0,0,698,699,1,0,0,0,699,700,1, + 0,0,0,700,704,5,101,0,0,701,703,3,88,44,0,702,701,1,0,0,0,703,706, + 1,0,0,0,704,702,1,0,0,0,704,705,1,0,0,0,705,707,1,0,0,0,706,704, + 1,0,0,0,707,708,5,102,0,0,708,87,1,0,0,0,709,710,5,25,0,0,710,714, + 3,76,38,0,711,714,3,92,46,0,712,714,3,90,45,0,713,709,1,0,0,0,713, + 711,1,0,0,0,713,712,1,0,0,0,714,89,1,0,0,0,715,716,5,33,0,0,716, + 717,3,126,63,0,717,718,5,34,0,0,718,719,5,35,0,0,719,720,5,31,0, + 0,720,721,5,18,0,0,721,722,3,126,63,0,722,723,5,32,0,0,723,724,5, + 28,0,0,724,725,3,126,63,0,725,726,5,100,0,0,726,727,3,126,63,0,727, + 728,5,98,0,0,728,91,1,0,0,0,729,730,5,23,0,0,730,731,3,94,47,0,731, + 732,5,24,0,0,732,733,3,98,49,0,733,734,5,98,0,0,734,93,1,0,0,0,735, + 736,3,126,63,0,736,737,5,100,0,0,737,738,3,96,48,0,738,95,1,0,0, + 0,739,751,3,126,63,0,740,751,5,65,0,0,741,751,5,55,0,0,742,751,5, + 56,0,0,743,751,5,62,0,0,744,751,5,63,0,0,745,751,5,64,0,0,746,751, + 5,66,0,0,747,751,5,67,0,0,748,751,5,68,0,0,749,751,5,69,0,0,750, + 739,1,0,0,0,750,740,1,0,0,0,750,741,1,0,0,0,750,742,1,0,0,0,750, + 743,1,0,0,0,750,744,1,0,0,0,750,745,1,0,0,0,750,746,1,0,0,0,750, + 747,1,0,0,0,750,748,1,0,0,0,750,749,1,0,0,0,751,97,1,0,0,0,752,753, + 5,27,0,0,753,754,3,126,63,0,754,755,5,100,0,0,755,756,3,100,50,0, + 756,775,1,0,0,0,757,758,5,28,0,0,758,759,3,126,63,0,759,760,5,100, + 0,0,760,761,3,126,63,0,761,762,5,100,0,0,762,763,3,102,51,0,763, + 775,1,0,0,0,764,765,5,13,0,0,765,766,3,126,63,0,766,767,5,100,0, + 0,767,769,3,126,63,0,768,770,3,28,14,0,769,768,1,0,0,0,769,770,1, + 0,0,0,770,772,1,0,0,0,771,773,3,104,52,0,772,771,1,0,0,0,772,773, + 1,0,0,0,773,775,1,0,0,0,774,752,1,0,0,0,774,757,1,0,0,0,774,764, + 1,0,0,0,775,99,1,0,0,0,776,777,7,2,0,0,777,101,1,0,0,0,778,779,7, + 3,0,0,779,103,1,0,0,0,780,781,5,30,0,0,781,785,5,101,0,0,782,784, + 3,106,53,0,783,782,1,0,0,0,784,787,1,0,0,0,785,783,1,0,0,0,785,786, + 1,0,0,0,786,788,1,0,0,0,787,785,1,0,0,0,788,789,5,102,0,0,789,105, + 1,0,0,0,790,791,3,126,63,0,791,792,5,24,0,0,792,793,5,27,0,0,793, + 800,3,126,63,0,794,795,5,32,0,0,795,796,5,28,0,0,796,797,3,126,63, + 0,797,798,5,100,0,0,798,799,3,126,63,0,799,801,1,0,0,0,800,794,1, + 0,0,0,800,801,1,0,0,0,801,802,1,0,0,0,802,803,5,98,0,0,803,844,1, + 0,0,0,804,805,3,126,63,0,805,806,5,24,0,0,806,807,5,28,0,0,807,808, + 3,126,63,0,808,809,5,100,0,0,809,816,3,126,63,0,810,811,5,32,0,0, + 811,812,5,28,0,0,812,813,3,126,63,0,813,814,5,100,0,0,814,815,3, + 126,63,0,815,817,1,0,0,0,816,810,1,0,0,0,816,817,1,0,0,0,817,818, + 1,0,0,0,818,819,5,98,0,0,819,844,1,0,0,0,820,821,3,126,63,0,821, + 822,5,24,0,0,822,823,5,11,0,0,823,825,3,126,63,0,824,826,3,28,14, + 0,825,824,1,0,0,0,825,826,1,0,0,0,826,833,1,0,0,0,827,828,5,32,0, + 0,828,829,5,28,0,0,829,830,3,126,63,0,830,831,5,100,0,0,831,832, + 3,126,63,0,832,834,1,0,0,0,833,827,1,0,0,0,833,834,1,0,0,0,834,835, + 1,0,0,0,835,836,5,98,0,0,836,844,1,0,0,0,837,838,3,126,63,0,838, + 839,5,24,0,0,839,840,5,18,0,0,840,841,3,126,63,0,841,842,5,98,0, + 0,842,844,1,0,0,0,843,790,1,0,0,0,843,804,1,0,0,0,843,820,1,0,0, + 0,843,837,1,0,0,0,844,107,1,0,0,0,845,846,5,18,0,0,846,847,3,126, + 63,0,847,848,5,24,0,0,848,849,3,126,63,0,849,850,5,100,0,0,850,852, + 3,126,63,0,851,853,3,104,52,0,852,851,1,0,0,0,852,853,1,0,0,0,853, + 854,1,0,0,0,854,855,5,98,0,0,855,109,1,0,0,0,856,903,3,114,57,0, + 857,903,5,77,0,0,858,903,5,78,0,0,859,860,5,79,0,0,860,903,3,128, + 64,0,861,862,5,80,0,0,862,863,5,107,0,0,863,864,3,126,63,0,864,865, + 5,108,0,0,865,903,1,0,0,0,866,867,5,81,0,0,867,868,5,107,0,0,868, + 870,3,126,63,0,869,871,3,28,14,0,870,869,1,0,0,0,870,871,1,0,0,0, + 871,872,1,0,0,0,872,873,5,108,0,0,873,903,1,0,0,0,874,875,5,6,0, + 0,875,876,5,107,0,0,876,877,3,126,63,0,877,878,5,108,0,0,878,903, + 1,0,0,0,879,880,5,82,0,0,880,881,5,107,0,0,881,882,3,110,55,0,882, + 883,5,108,0,0,883,903,1,0,0,0,884,885,5,83,0,0,885,886,5,107,0,0, + 886,887,3,110,55,0,887,888,5,108,0,0,888,903,1,0,0,0,889,890,5,84, + 0,0,890,894,5,101,0,0,891,893,3,112,56,0,892,891,1,0,0,0,893,896, + 1,0,0,0,894,892,1,0,0,0,894,895,1,0,0,0,895,897,1,0,0,0,896,894, + 1,0,0,0,897,903,5,102,0,0,898,900,3,126,63,0,899,901,3,28,14,0,900, + 899,1,0,0,0,900,901,1,0,0,0,901,903,1,0,0,0,902,856,1,0,0,0,902, + 857,1,0,0,0,902,858,1,0,0,0,902,859,1,0,0,0,902,861,1,0,0,0,902, + 866,1,0,0,0,902,874,1,0,0,0,902,879,1,0,0,0,902,884,1,0,0,0,902, + 889,1,0,0,0,902,898,1,0,0,0,903,111,1,0,0,0,904,905,3,126,63,0,905, + 906,5,97,0,0,906,907,3,110,55,0,907,908,5,98,0,0,908,113,1,0,0,0, + 909,910,7,4,0,0,910,115,1,0,0,0,911,912,7,5,0,0,912,117,1,0,0,0, + 913,922,3,128,64,0,914,922,5,111,0,0,915,922,5,112,0,0,916,922,5, + 93,0,0,917,922,5,94,0,0,918,922,5,95,0,0,919,922,3,120,60,0,920, + 922,3,124,62,0,921,913,1,0,0,0,921,914,1,0,0,0,921,915,1,0,0,0,921, + 916,1,0,0,0,921,917,1,0,0,0,921,918,1,0,0,0,921,919,1,0,0,0,921, + 920,1,0,0,0,922,119,1,0,0,0,923,932,5,101,0,0,924,929,3,122,61,0, + 925,926,5,99,0,0,926,928,3,122,61,0,927,925,1,0,0,0,928,931,1,0, + 0,0,929,927,1,0,0,0,929,930,1,0,0,0,930,933,1,0,0,0,931,929,1,0, + 0,0,932,924,1,0,0,0,932,933,1,0,0,0,933,934,1,0,0,0,934,935,5,102, + 0,0,935,121,1,0,0,0,936,937,3,128,64,0,937,938,5,97,0,0,938,939, + 3,118,59,0,939,123,1,0,0,0,940,949,5,103,0,0,941,946,3,118,59,0, + 942,943,5,99,0,0,943,945,3,118,59,0,944,942,1,0,0,0,945,948,1,0, + 0,0,946,944,1,0,0,0,946,947,1,0,0,0,947,950,1,0,0,0,948,946,1,0, + 0,0,949,941,1,0,0,0,949,950,1,0,0,0,950,951,1,0,0,0,951,952,5,104, + 0,0,952,125,1,0,0,0,953,954,7,6,0,0,954,127,1,0,0,0,955,956,5,114, + 0,0,956,129,1,0,0,0,81,142,149,170,182,194,214,222,229,235,247,250, + 256,267,276,286,289,291,295,303,315,320,329,356,380,390,396,425, + 432,436,441,452,458,466,471,482,487,494,503,516,537,540,543,550, + 558,589,601,605,613,625,639,649,667,671,674,678,681,690,694,698, + 704,713,750,769,772,774,785,800,816,825,833,843,852,870,894,900, + 902,921,929,932,946,949 ]; private static __ATN: antlr.ATN; @@ -3832,6 +4425,9 @@ export class WorkspaceItemContext extends antlr.ParserRuleContext { public constructorBindingDecl(): ConstructorBindingDeclContext | null { return this.getRuleContext(0, ConstructorBindingDeclContext); } + public typeAliasDecl(): TypeAliasDeclContext | null { + return this.getRuleContext(0, TypeAliasDeclContext); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_workspaceItem; } @@ -3960,6 +4556,9 @@ export class ResourcePreambleContext extends antlr.ParserRuleContext { public externalInterfaceDecl(): ExternalInterfaceDeclContext | null { return this.getRuleContext(0, ExternalInterfaceDeclContext); } + public typeAliasDecl(): TypeAliasDeclContext | null { + return this.getRuleContext(0, TypeAliasDeclContext); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_resourcePreamble; } @@ -4054,6 +4653,21 @@ export class InterfaceResourceDeclContext extends antlr.ParserRuleContext { return this.getRuleContext(i, ResourcePreambleContext); } + public typeParameters(): TypeParametersContext | null { + return this.getRuleContext(0, TypeParametersContext); + } + public REQUIRES(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.REQUIRES, 0); + } + public interfaceType(): InterfaceTypeContext[]; + public interfaceType(i: number): InterfaceTypeContext | null; + public interfaceType(i?: number): InterfaceTypeContext[] | InterfaceTypeContext | null { + if (i === undefined) { + return this.getRuleContexts(InterfaceTypeContext); + } + + return this.getRuleContext(i, InterfaceTypeContext); + } public interfaceMember(): InterfaceMemberContext[]; public interfaceMember(i: number): InterfaceMemberContext | null; public interfaceMember(i?: number): InterfaceMemberContext[] | InterfaceMemberContext | null { @@ -4063,6 +4677,15 @@ export class InterfaceResourceDeclContext extends antlr.ParserRuleContext { return this.getRuleContext(i, InterfaceMemberContext); } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(QuixosCapabilityParser.COMMA); + } else { + return this.getToken(QuixosCapabilityParser.COMMA, i); + } + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_interfaceResourceDecl; } @@ -4076,6 +4699,234 @@ export class InterfaceResourceDeclContext extends antlr.ParserRuleContext { } +export class TypeParametersContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public LT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.LT, 0)!; + } + public typeParameter(): TypeParameterContext[]; + public typeParameter(i: number): TypeParameterContext | null; + public typeParameter(i?: number): TypeParameterContext[] | TypeParameterContext | null { + if (i === undefined) { + return this.getRuleContexts(TypeParameterContext); + } + + return this.getRuleContext(i, TypeParameterContext); + } + public GT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.GT, 0)!; + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(QuixosCapabilityParser.COMMA); + } else { + return this.getToken(QuixosCapabilityParser.COMMA, i); + } + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_typeParameters; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitTypeParameters) { + return visitor.visitTypeParameters(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TypeParameterContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public VALUE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.VALUE, 0); + } + public identifier(): IdentifierContext { + return this.getRuleContext(0, IdentifierContext)!; + } + public COLON(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.COLON, 0); + } + public STORABLE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.STORABLE, 0); + } + public OBJECT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.OBJECT, 0); + } + public IMPLEMENTS(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.IMPLEMENTS, 0); + } + public interfaceType(): InterfaceTypeContext[]; + public interfaceType(i: number): InterfaceTypeContext | null; + public interfaceType(i?: number): InterfaceTypeContext[] | InterfaceTypeContext | null { + if (i === undefined) { + return this.getRuleContexts(InterfaceTypeContext); + } + + return this.getRuleContext(i, InterfaceTypeContext); + } + public AMP(): antlr.TerminalNode[]; + public AMP(i: number): antlr.TerminalNode | null; + public AMP(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(QuixosCapabilityParser.AMP); + } else { + return this.getToken(QuixosCapabilityParser.AMP, i); + } + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_typeParameter; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitTypeParameter) { + return visitor.visitTypeParameter(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class InterfaceTypeContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public identifier(): IdentifierContext { + return this.getRuleContext(0, IdentifierContext)!; + } + public typeArguments(): TypeArgumentsContext | null { + return this.getRuleContext(0, TypeArgumentsContext); + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_interfaceType; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitInterfaceType) { + return visitor.visitInterfaceType(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TypeArgumentsContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public LT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.LT, 0)!; + } + public typeArgument(): TypeArgumentContext[]; + public typeArgument(i: number): TypeArgumentContext | null; + public typeArgument(i?: number): TypeArgumentContext[] | TypeArgumentContext | null { + if (i === undefined) { + return this.getRuleContexts(TypeArgumentContext); + } + + return this.getRuleContext(i, TypeArgumentContext); + } + public GT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.GT, 0)!; + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(QuixosCapabilityParser.COMMA); + } else { + return this.getToken(QuixosCapabilityParser.COMMA, i); + } + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_typeArguments; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitTypeArguments) { + return visitor.visitTypeArguments(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TypeArgumentContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public ATOM(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.ATOM, 0); + } + public identifier(): IdentifierContext | null { + return this.getRuleContext(0, IdentifierContext); + } + public INTERFACE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.INTERFACE, 0); + } + public interfaceType(): InterfaceTypeContext | null { + return this.getRuleContext(0, InterfaceTypeContext); + } + public OBJECT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.OBJECT, 0); + } + public valueType(): ValueTypeContext | null { + return this.getRuleContext(0, ValueTypeContext); + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_typeArgument; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitTypeArgument) { + return visitor.visitTypeArgument(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TypeAliasDeclContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public TYPE(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.TYPE, 0)!; + } + public identifier(): IdentifierContext { + return this.getRuleContext(0, IdentifierContext)!; + } + public EQUAL(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.EQUAL, 0)!; + } + public valueType(): ValueTypeContext { + return this.getRuleContext(0, ValueTypeContext)!; + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public typeParameters(): TypeParametersContext | null { + return this.getRuleContext(0, TypeParametersContext); + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_typeAliasDecl; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitTypeAliasDecl) { + return visitor.visitTypeAliasDecl(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class InterfaceMemberContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); @@ -4398,6 +5249,12 @@ export class TargetConstraintContext extends antlr.ParserRuleContext { public INTERFACE(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.INTERFACE, 0); } + public typeArguments(): TypeArgumentsContext | null { + return this.getRuleContext(0, TypeArgumentsContext); + } + public OBJECT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.OBJECT, 0); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_targetConstraint; } @@ -4551,6 +5408,9 @@ export class PackageOperationExportContext extends antlr.ParserRuleContext { public SEMI(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.SEMI, 0)!; } + public typeParameters(): TypeParametersContext | null { + return this.getRuleContext(0, TypeParametersContext); + } public eventClause(): EventClauseContext | null { return this.getRuleContext(0, EventClauseContext); } @@ -4604,6 +5464,9 @@ export class PackageFunctionExportContext extends antlr.ParserRuleContext { public SEMI(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.SEMI, 0)!; } + public typeParameters(): TypeParametersContext | null { + return this.getRuleContext(0, TypeParametersContext); + } public dependencyBlock(): DependencyBlockContext | null { return this.getRuleContext(0, DependencyBlockContext); } @@ -4738,6 +5601,9 @@ export class ReceiverRequirementContext extends antlr.ParserRuleContext { public identifier(): IdentifierContext | null { return this.getRuleContext(0, IdentifierContext); } + public OBJECT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.OBJECT, 0); + } public INTERFACES(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.INTERFACES, 0); } @@ -4747,8 +5613,23 @@ export class ReceiverRequirementContext extends antlr.ParserRuleContext { public RBRACK(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.RBRACK, 0); } - public identifierList(): IdentifierListContext | null { - return this.getRuleContext(0, IdentifierListContext); + public interfaceType(): InterfaceTypeContext[]; + public interfaceType(i: number): InterfaceTypeContext | null; + public interfaceType(i?: number): InterfaceTypeContext[] | InterfaceTypeContext | null { + if (i === undefined) { + return this.getRuleContexts(InterfaceTypeContext); + } + + return this.getRuleContext(i, InterfaceTypeContext); + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(QuixosCapabilityParser.COMMA); + } else { + return this.getToken(QuixosCapabilityParser.COMMA, i); + } } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_receiverRequirement; @@ -4879,6 +5760,9 @@ export class DependencyPortContext extends antlr.ParserRuleContext { public INTERFACE(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.INTERFACE, 0); } + public typeArguments(): TypeArgumentsContext | null { + return this.getRuleContext(0, TypeArgumentsContext); + } public CONSTRUCTOR(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.CONSTRUCTOR, 0); } @@ -5242,6 +6126,9 @@ export class ConformanceDeclContext extends antlr.ParserRuleContext { public RBRACE(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.RBRACE, 0)!; } + public typeArguments(): TypeArgumentsContext | null { + return this.getRuleContext(0, TypeArgumentsContext); + } public ID(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.ID, 0); } @@ -5503,6 +6390,9 @@ export class OperationProviderContext extends antlr.ParserRuleContext { public PACKAGE(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.PACKAGE, 0); } + public typeArguments(): TypeArgumentsContext | null { + return this.getRuleContext(0, TypeArgumentsContext); + } public dependencyBindingBlock(): DependencyBindingBlockContext | null { return this.getRuleContext(0, DependencyBindingBlockContext); } @@ -5661,6 +6551,9 @@ export class DependencyBindingContext extends antlr.ParserRuleContext { public INTERFACE(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.INTERFACE, 0); } + public typeArguments(): TypeArgumentsContext | null { + return this.getRuleContext(0, TypeArgumentsContext); + } public CONSTRUCTOR(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.CONSTRUCTOR, 0); } @@ -5752,6 +6645,12 @@ export class ValueTypeContext extends antlr.ParserRuleContext { public INTERFACE_REF(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.INTERFACE_REF, 0); } + public typeArguments(): TypeArgumentsContext | null { + return this.getRuleContext(0, TypeArgumentsContext); + } + public REF(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.REF, 0); + } public OPTIONAL(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.OPTIONAL, 0); } diff --git a/src/capability-language/generated/QuixosCapabilityVisitor.ts b/src/capability-language/generated/QuixosCapabilityVisitor.ts index e2b66ef..83fca76 100644 --- a/src/capability-language/generated/QuixosCapabilityVisitor.ts +++ b/src/capability-language/generated/QuixosCapabilityVisitor.ts @@ -13,6 +13,12 @@ import { ExternalInterfaceDeclContext } from "./QuixosCapabilityParser.js"; import { ResourcePreambleContext } from "./QuixosCapabilityParser.js"; import { AtomDeclContext } from "./QuixosCapabilityParser.js"; import { InterfaceResourceDeclContext } from "./QuixosCapabilityParser.js"; +import { TypeParametersContext } from "./QuixosCapabilityParser.js"; +import { TypeParameterContext } from "./QuixosCapabilityParser.js"; +import { InterfaceTypeContext } from "./QuixosCapabilityParser.js"; +import { TypeArgumentsContext } from "./QuixosCapabilityParser.js"; +import { TypeArgumentContext } from "./QuixosCapabilityParser.js"; +import { TypeAliasDeclContext } from "./QuixosCapabilityParser.js"; import { InterfaceMemberContext } from "./QuixosCapabilityParser.js"; import { OperationMemberContext } from "./QuixosCapabilityParser.js"; import { ValueMemberContext } from "./QuixosCapabilityParser.js"; @@ -137,6 +143,42 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.typeParameters`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeParameters?: (ctx: TypeParametersContext) => Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.typeParameter`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeParameter?: (ctx: TypeParameterContext) => Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.interfaceType`. + * @param ctx the parse tree + * @return the visitor result + */ + visitInterfaceType?: (ctx: InterfaceTypeContext) => Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.typeArguments`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeArguments?: (ctx: TypeArgumentsContext) => Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.typeArgument`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeArgument?: (ctx: TypeArgumentContext) => Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.typeAliasDecl`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeAliasDecl?: (ctx: TypeAliasDeclContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.interfaceMember`. * @param ctx the parse tree diff --git a/src/capability-language/generic-types.ts b/src/capability-language/generic-types.ts new file mode 100644 index 0000000..4a3f83b --- /dev/null +++ b/src/capability-language/generic-types.ts @@ -0,0 +1,392 @@ +import { + TypeSubstitution, + GenericTypeError, + instantiateInterface, + appliedInterfaceId, + valueType, + type AtomId, + type ClosedTypeArgument, + type GenericTypeEnvironment, + type InterfaceApplicationExpression, + type InterfaceRevision, + type ObjectTypeExpression, + type TypeArgumentExpression, + type TypeParameter, + type ValueAliasDefinition, + type ValueType, + type ValueTypeExpression, +} from "../capability-model/index.js"; +import type { + InterfaceTypeContext, + TargetConstraintContext, + TypeArgumentsContext, + TypeParametersContext, + TypeAliasDeclContext, + ValueTypeContext, +} from "./generated/QuixosCapabilityParser.js"; + +const literal = (context: { getText(): string }) => JSON.parse(context.getText()) as string; + +/** Lexical authoring scope; only `value`/`target` return installed types. */ +export class GenericSourceTypes { + readonly interfaces = new Map(); + readonly definitions = new Map(); + readonly applications = new Map(); + readonly aliases = new Map(); + parameters = new Map(); + self?: AtomId; + private active: string[] = []; + private applicationCount = 0; + + constructor(readonly atoms: Map) {} + + environment(): GenericTypeEnvironment { + return { + arguments: new Map(), + aliases: this.aliases, + self: this.self, + applyInterface: (id, args) => this.apply(id, args).revisionId, + // Obligations are retained on the application and discharged by workspace + // validation, where all atom conformances are known (not source order). + implementsInterface: () => true, + }; + } + + register(name: string, definition: InterfaceRevision) { + this.interfaces.set(name, definition); + this.definitions.set(definition.revisionId, definition); + } + + /** Check authored applications even when nobody has instantiated this template yet. */ + validateTemplate(definition: InterfaceRevision) { + const template = definition.template; + if (!template) return; + const aliases = new Map((template.aliases ?? []).map((alias) => [alias.id, alias])); + const parametersById = new Map( + [...template.parameters, ...(template.aliases ?? []).flatMap((alias) => alias.parameters)].map((parameter) => [ + parameter.id, + parameter, + ]), + ); + const replace = (node: unknown, arguments_: Map): unknown => { + if (!node || typeof node !== "object") return node; + if ("kind" in node && node.kind === "parameter" && "parameterId" in node) { + const arg = arguments_.get(String(node.parameterId)); + if (arg) return arg.kind === "value" ? arg.type : arg.target; + } + if (Array.isArray(node)) return node.map((entry) => replace(entry, arguments_)); + return Object.fromEntries(Object.entries(node).map(([key, value]) => [key, replace(value, arguments_)])); + }; + const implies = ( + actual: InterfaceApplicationExpression, + required: InterfaceApplicationExpression, + seen = new Set(), + ): boolean => { + const key = JSON.stringify(actual); + if (key === JSON.stringify(required)) return true; + if (seen.has(key) || seen.size > 128) return false; + seen.add(key); + const contract = this.definitions.get(actual.definitionId); + if (!contract?.template) + return (contract?.requiredInterfaces ?? []).includes(required.definitionId) && required.arguments.length === 0; + const args = new Map( + contract.template.parameters.map((parameter, index) => [parameter.id, actual.arguments[index]]), + ); + return contract.template.requires.some((parent) => + implies(replace(parent, args) as InterfaceApplicationExpression, required, seen), + ); + }; + const storable = (type: ValueTypeExpression, depth = 0): boolean => { + if (depth > 128) + throw new GenericTypeError( + "type-complexity-limit", + definition.displayName, + "Storable alias expansion exceeds depth limit", + ); + if (type.kind === "parameter") { + const parameter = parametersById.get(type.parameterId); + return parameter?.kind === "value" && Boolean(parameter.storable); + } + if (type.kind === "list" || type.kind === "optional") return storable(type.value, depth + 1); + if (type.kind === "alias") { + const alias = aliases.get(type.definitionId); + if (!alias || alias.parameters.length !== type.arguments.length) return false; + return storable( + replace( + alias.body, + new Map(alias.parameters.map((parameter, index) => [parameter.id, type.arguments[index]])), + ) as ValueTypeExpression, + depth + 1, + ); + } + return type.kind === "scalar" || (type.kind === "builtin" && type.name === "unit"); + }; + let remaining = 10000; + const visit = (node: unknown, path: string, depth = 0): void => { + if (depth > 128 || --remaining < 0) + throw new GenericTypeError("type-complexity-limit", path, "Type exceeds the depth or expansion budget"); + if (!node || typeof node !== "object") return; + if ("definitionId" in node && "arguments" in node) { + const application = node as InterfaceApplicationExpression | Extract; + const alias = "kind" in application && application.kind === "alias"; + const target = alias ? aliases.get(application.definitionId) : this.definitions.get(application.definitionId); + if (!target) + throw new GenericTypeError( + alias ? "unknown-alias" : "unknown-interface", + path, + `Unknown definition ${application.definitionId}`, + ); + if ("template" in target && target.template?.usesSelf) template.usesSelf = true; + const parameters = "parameters" in target ? target.parameters : (target.template?.parameters ?? []); + if (parameters.length !== application.arguments.length) + throw new GenericTypeError( + "type-arity", + path, + `Expected ${parameters.length} type arguments, received ${application.arguments.length}`, + ); + parameters.forEach((parameter, index) => { + if (parameter.kind !== application.arguments[index].kind) + throw new GenericTypeError( + "parameter-kind", + path, + `Expected ${parameter.kind}, received ${application.arguments[index].kind}`, + ); + const argument = application.arguments[index]; + if (parameter.kind === "value" && parameter.storable && argument.kind === "value" && !storable(argument.type)) + throw new GenericTypeError( + "non-storable-argument", + path, + "Generic application cannot prove its value argument is storable", + ); + if (parameter.kind === "object" && argument.kind === "object" && argument.target.kind === "parameter") { + const offered = parametersById.get(argument.target.parameterId); + const mapping = new Map(parameters.map((p, i) => [p.id, application.arguments[i]])); + for (const bound of parameter.implements) { + const required = replace(bound, mapping) as InterfaceApplicationExpression; + if (offered?.kind !== "object" || !offered.implements.some((evidence) => implies(evidence, required))) + throw new GenericTypeError( + "unsatisfied-bound", + path, + `Object parameter does not prove ${required.definitionId}`, + ); + } + } + }); + } + for (const [name, child] of Object.entries(node)) visit(child, `${path}.${name}`, depth + 1); + }; + visit(template, definition.displayName); + const active = new Set(); + const done = new Set(); + const checkAlias = (id: string) => { + if (done.has(id)) return; + if (active.has(id)) + throw new GenericTypeError("recursive-alias", id, `Recursive value alias: ${[...active, id].join(" -> ")}`); + active.add(id); + const walk = (node: unknown): void => { + if (!node || typeof node !== "object") return; + if ("kind" in node && node.kind === "alias") + checkAlias((node as ValueAliasDefinition["body"] & { definitionId: string }).definitionId); + Object.values(node).forEach(walk); + }; + walk(aliases.get(id)?.body); + active.delete(id); + done.add(id); + }; + for (const id of aliases.keys()) checkAlias(id); + } + + apply(id: string, arguments_: readonly ClosedTypeArgument[]): InterfaceRevision { + const definition = this.definitions.get(id); + if (!definition) throw new GenericTypeError("unknown-interface", id, "Unknown interface definition"); + const application = { + definitionId: definition.revisionId, + source: definition.source, + arguments: [...arguments_], + ...(definition.template?.usesSelf ? { self: this.self } : {}), + }; + const appliedId = definition.template ? appliedInterfaceId(application) : definition.revisionId; + const cached = this.applications.get(appliedId); + if (cached) return cached; + if (this.active.includes(id)) + throw new GenericTypeError( + "recursive-application", + id, + `Expanding recursive interface application: ${[...this.active, id].join(" -> ")}`, + ); + if (++this.applicationCount > 10000) + throw new GenericTypeError("type-complexity-limit", id, "Too many interface applications"); + this.active.push(id); + if (definition.template) + this.applications.set(appliedId, { + interfaceId: definition.interfaceId, + revisionId: appliedId, + displayName: definition.displayName, + source: definition.source, + members: [], + application, + }); + try { + const obligations: NonNullable = []; + const instance = instantiateInterface(definition, arguments_, { + ...this.environment(), + implementsInterface: (target, required) => { + obligations.push({ target, required }); + return true; + }, + }); + if (instance === definition) return definition; + instance.argumentRequirements = obligations; + this.applications.set(instance.revisionId, instance); + this.definitions.set(instance.revisionId, instance); + return instance; + } catch (error) { + this.applications.delete(appliedId); + throw error; + } finally { + this.active.pop(); + } + } + + interface(context: InterfaceTypeContext): InterfaceApplicationExpression { + return this.interfaceByName(context.identifier().getText(), context.typeArguments()); + } + + interfaceByName(name: string, arguments_: TypeArgumentsContext | null): InterfaceApplicationExpression { + const definition = this.interfaces.get(name); + if (!definition) throw new GenericTypeError("unknown-interface", name, "Unknown interface"); + return { definitionId: definition.revisionId, arguments: this.arguments(arguments_) }; + } + + arguments(context: TypeArgumentsContext | null): TypeArgumentExpression[] { + return (context?.typeArgument() ?? []).map((argument): TypeArgumentExpression => { + if (argument.INTERFACE()) + return { + kind: "object", + target: { kind: "application", application: this.interface(argument.interfaceType()!) }, + }; + if (argument.ATOM()) return { kind: "object", target: this.atom(argument.identifier()!.getText()) }; + if (argument.OBJECT()) return { kind: "object", target: this.objectParameter(argument.identifier()!.getText()) }; + const type = argument.valueType()!; + if (type.getText() === "Self") return { kind: "object", target: { kind: "self" } }; + const parameter = type.identifier() && this.parameters.get(type.identifier()!.getText()); + if (parameter?.kind === "object" && !type.typeArguments()) + return { kind: "object", target: { kind: "parameter", parameterId: parameter.id } }; + return { kind: "value", type: this.expression(type) }; + }); + } + + private atom(name: string): ObjectTypeExpression { + if (name === "Self") return { kind: "self" }; + const atomId = this.atoms.get(name); + if (!atomId) throw new GenericTypeError("unknown-atom", name, "Unknown atom"); + return { kind: "atom", atomId }; + } + + private objectParameter(name: string): ObjectTypeExpression { + if (name === "Self") return { kind: "self" }; + const parameter = this.parameters.get(name); + if (!parameter || parameter.kind !== "object") + throw new GenericTypeError("parameter-kind", name, "Expected an object parameter"); + return { kind: "parameter", parameterId: parameter.id }; + } + + targetExpression(context: TargetConstraintContext): ObjectTypeExpression { + const name = context.identifier().getText(); + if (context.ATOM()) return this.atom(name); + if (context.OBJECT()) return this.objectParameter(name); + return { kind: "application", application: this.interfaceByName(name, context.typeArguments()) }; + } + + expression(context: ValueTypeContext): ValueTypeExpression { + if (context.scalarType()) + return { + kind: "scalar", + name: context.scalarType()!.getText() as Extract["name"], + }; + if (context.UNIT()) return valueType.unit; + if (context.WATCH_HANDLE()) return valueType.watchHandle; + if (context.MESSAGE()) return valueType.message(literal(context.stringLiteral()!)); + if (context.OPTIONAL() || context.LIST()) + return { kind: context.LIST() ? "list" : "optional", value: this.expression(context.valueType()!) }; + if (context.RECORD()) { + const fields = context + .recordField() + .map((field) => [field.identifier().getText(), this.expression(field.valueType())] as const); + if (new Set(fields.map(([name]) => name)).size !== fields.length) + throw new GenericTypeError("duplicate-field", "record", "Duplicate record field"); + return { kind: "record", fields: Object.fromEntries(fields) }; + } + const name = context.identifier()!.getText(); + if (context.ATOM_REF()) return { kind: "object-ref", expectation: this.atom(name) }; + if (context.INTERFACE_REF()) + return { + kind: "object-ref", + expectation: { kind: "application", application: this.interfaceByName(name, context.typeArguments()) }, + }; + if (context.REF()) return { kind: "object-ref", expectation: this.objectParameter(name) }; + const parameter = this.parameters.get(name); + if (parameter) { + if (parameter.kind !== "value" || context.typeArguments()) + throw new GenericTypeError("parameter-kind", name, "Expected a value parameter; object parameters need ref"); + return { kind: "parameter", parameterId: parameter.id }; + } + if (!this.aliases.has(name)) throw new GenericTypeError("unknown-type", name, "Unknown value type"); + return { kind: "alias", definitionId: name, arguments: this.arguments(context.typeArguments()) }; + } + + value(context: ValueTypeContext): ValueType { + return new TypeSubstitution(this.environment()).value(this.expression(context)); + } + + target(context: TargetConstraintContext) { + return new TypeSubstitution(this.environment()).object(this.targetExpression(context)); + } + + declareParameters(context: TypeParametersContext | null, owner: string): TypeParameter[] { + const entries = context?.typeParameter() ?? []; + const result: TypeParameter[] = entries.map((parameter, index) => { + const name = parameter.identifier().getText(); + if (name === "Self" || this.parameters.has(name)) + throw new GenericTypeError("duplicate-parameter", owner, `Duplicate or reserved parameter ${name}`); + const declaration: TypeParameter = parameter.VALUE() + ? { + id: `${owner}/parameter/${index}`, + name, + kind: "value", + ...(parameter.STORABLE() ? { storable: true } : {}), + } + : { id: `${owner}/parameter/${index}`, name, kind: "object", implements: [] }; + this.parameters.set(name, declaration); + return declaration; + }); + entries.forEach((entry, index) => { + const parameter = result[index]; + if (parameter.kind === "object") + parameter.implements = entry.interfaceType().map((bound) => this.interface(bound)); + }); + return result; + } + + declareAliases(contexts: readonly TypeAliasDeclContext[]) { + for (const context of contexts) { + const name = context.identifier().getText(); + if (this.aliases.has(name)) throw new GenericTypeError("duplicate-alias", name, "Duplicate type alias"); + this.aliases.set(name, { id: name, parameters: [], body: valueType.unit }); + } + for (const context of contexts) { + const name = context.identifier().getText(); + const previous = this.parameters; + this.parameters = new Map(); + try { + this.aliases.set(name, { + id: name, + parameters: this.declareParameters(context.typeParameters(), JSON.stringify(["alias", name])), + body: this.expression(context.valueType()), + }); + } finally { + this.parameters = previous; + } + } + } +} diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index d928e0b..d8f1747 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -37,7 +37,15 @@ import { type StateSlotDefinition, type ValueType, type WorkspaceRevision, + GenericTypeError, + TypeSubstitution, + type ValueTypeExpression, + type ObjectTypeExpression, + type GenericPackageExport, + type GenericDependencyPort, + specializePackageExport, } from "../capability-model/index.js"; +import { GenericSourceTypes } from "./generic-types.js"; import { QuixosCapabilityLexer } from "./generated/QuixosCapabilityLexer.js"; import { QuixosCapabilityParser, @@ -69,6 +77,17 @@ import { export type CapabilityResourceKind = "interface" | "package"; +const genericLocations = new WeakMap(); +const atGenericSource = (context: ParserRuleContext, lower: () => T): T => { + try { + return lower(); + } catch (error) { + if (error instanceof GenericTypeError && !genericLocations.has(error)) + genericLocations.set(error, { line: context.start?.line ?? 0, column: context.start?.column ?? 0 }); + throw error; + } +}; + export type CapabilityResourceImport = { kind: CapabilityResourceKind; binding: string; @@ -98,6 +117,7 @@ export type CapabilityResource = externalAtoms: AtomDefinition[]; externalInterfaces: CapabilityExternalInterface[]; revision: InterfaceRevision; + specializations?: InterfaceRevision[]; } | { kind: "package"; @@ -105,6 +125,7 @@ export type CapabilityResource = externalAtoms: AtomDefinition[]; externalInterfaces: CapabilityExternalInterface[]; revision: PackageRevision; + specializations?: InterfaceRevision[]; }; export type CapabilityResourceCompileResult = @@ -137,6 +158,7 @@ export type CapabilitySourceCompileResult = }; interface InterfaceSymbol { + definition?: InterfaceRevision; revisionId: InterfaceRevision["revisionId"]; contractAvailable: boolean; members: Map< @@ -154,6 +176,7 @@ interface PackageExportSymbol { } interface PackageSymbol { + definition?: PackageRevision; revisionId: PackageRevision["revisionId"]; exports: Map; } @@ -164,6 +187,7 @@ interface AttachmentSymbol { } interface LoweringState { + types: GenericSourceTypes; fileName: string; diagnostics: CapabilitySourceDiagnostic[]; atoms: Map; @@ -263,6 +287,8 @@ const lowerConstraint = ( throw new Error("Missing target constraint after a successful parse"); } const name = identifier(context.identifier()); + if (context.OBJECT() || context.typeArguments() || name === "Self" || state.types.interfaces.get(name)?.template) + return state.types.target(context); if (context.ATOM()) { const atomId = requireSymbol(state, state.atoms, name, context, "atom"); return atomId ? { kind: "atom", atomId } : undefined; @@ -275,6 +301,16 @@ const lowerValueType = (state: LoweringState, context: ValueTypeContext | null): if (!context) { throw new Error("Missing value type after a successful parse"); } + if ( + context.REF() || + context.typeArguments() || + (context.identifier() && !context.ATOM_REF() && !context.INTERFACE_REF()) + ) + return state.types.value(context); + if (context.INTERFACE_REF() && state.types.interfaces.get(context.identifier()!.getText())?.template) + return state.types.value(context); + if ((context.ATOM_REF() || context.INTERFACE_REF()) && context.identifier()?.getText() === "Self") + return state.types.value(context); const scalar = context.scalarType(); if (scalar) { return { kind: "scalar", name: text(scalar) as never }; @@ -559,6 +595,188 @@ const lowerInterface = ( displayName: alias, source, members, + ...(context.interfaceType().length + ? { + requiredInterfaces: context + .interfaceType() + .map((entry) => new TypeSubstitution(state.types.environment()).application(state.types.interface(entry))), + } + : {}), + }; +}; + +const hasSelfIdentifier = (context: ParserRuleContext, state: LoweringState): boolean => { + if (context.ruleIndex === QuixosCapabilityParser.RULE_identifier && context.getText() === "Self") return true; + if (context.ruleIndex === QuixosCapabilityParser.RULE_valueType) { + const aliasName = context.children + .find((child) => "ruleIndex" in child && child.ruleIndex === QuixosCapabilityParser.RULE_identifier) + ?.getText(); + const seen = new Set(); + const containsSelf = (value: unknown): boolean => { + if (!value || typeof value !== "object") return false; + if ("kind" in value && value.kind === "self") return true; + if ("kind" in value && value.kind === "alias" && "definitionId" in value) { + const id = String(value.definitionId); + if (!seen.has(id)) { + seen.add(id); + if (containsSelf(state.types.aliases.get(id)?.body)) return true; + } + } + return Object.values(value).some(containsSelf); + }; + if (aliasName && containsSelf(state.types.aliases.get(aliasName)?.body)) return true; + } + if ( + context.ruleIndex === QuixosCapabilityParser.RULE_interfaceType || + ((context.ruleIndex === QuixosCapabilityParser.RULE_valueType || + context.ruleIndex === QuixosCapabilityParser.RULE_targetConstraint) && + ["interface", "interface-ref"].includes(context.getChild(0)?.getText() ?? "")) + ) { + const name = context.children + .find((child) => "ruleIndex" in child && child.ruleIndex === QuixosCapabilityParser.RULE_identifier) + ?.getText(); + if (name && state.types.interfaces.get(name)?.template?.usesSelf) return true; + } + return context.children.some((child) => "ruleIndex" in child && hasSelfIdentifier(child as ParserRuleContext, state)); +}; + +const lowerInterfaceTemplate = ( + state: LoweringState, + context: InterfaceResourceDeclContext, + source: SourceRevision, +): InterfaceRevision => { + const types = state.types; + const revisionId = capabilityId.interfaceRevision(stringValue(context.stringLiteral(1))); + const parameters = types.declareParameters(context.typeParameters(), JSON.stringify(["interface", revisionId])); + const signature = ( + name: string, + id: InterfaceOperation["id"], + input: ValueTypeExpression, + output: ValueTypeExpression, + mode: InterfaceOperationMode = "call", + eventType?: ValueTypeExpression, + ): InterfaceOperation => ({ + id, + displayName: name, + inputType: input, + outputType: output, + mode, + ...(eventType ? { eventType } : {}), + }); + const members: InterfaceMember[] = context + .interfaceMember() + .map((entry) => { + const value = entry.valueMember(); + if (value) { + const type = types.expression(value.valueType()); + return { + kind: "value", + id: capabilityId.member(stringValue(value.stringLiteral())), + displayName: identifier(value.identifier()), + valueType: type, + operations: value.valueMemberOperation().flatMap((operation) => { + const id = capabilityId.operation(stringValue(operation.stringLiteral(0))); + if (operation.GET()) return [signature("get", id, valueType.unit, type)]; + if (operation.SET()) return [signature("set", id, type, valueType.unit)]; + return [ + signature("watch-start", id, valueType.unit, valueType.watchHandle, "watch-start", type), + signature( + "watch-stop", + capabilityId.operation(stringValue(operation.stringLiteral(1))), + valueType.watchHandle, + valueType.unit, + "watch-stop", + ), + ]; + }), + }; + } + const operation = entry.operationMember(); + if (operation) { + const inputType = types.expression(operation.valueType(0)!); + const outputType = types.expression(operation.valueType(1)!); + return { + kind: "operation", + id: capabilityId.member(stringValue(operation.stringLiteral(0))), + displayName: identifier(operation.identifier()), + inputType, + outputType, + operations: [ + signature("call", capabilityId.operation(stringValue(operation.stringLiteral(1))), inputType, outputType), + ], + }; + } + const relationship = entry.relationshipMember()!; + const target = types.targetExpression(relationship.targetConstraint()); + const targetType: ValueTypeExpression = { kind: "object-ref", expectation: target }; + const cardinality = lowerCardinality(relationship.cardinality()); + const resolved: ValueTypeExpression = + cardinality === "exactly-one" + ? targetType + : { kind: cardinality === "optional-one" ? "optional" : "list", value: targetType }; + return { + kind: "relationship", + id: capabilityId.member(stringValue(relationship.stringLiteral())), + displayName: identifier(relationship.identifier()), + target, + cardinality, + ordered: Boolean(relationship.ORDERED()), + operations: relationship.relationshipOperation().flatMap((operation) => { + const id = capabilityId.operation(stringValue(operation.stringLiteral(0))); + if (operation.RESOLVE()) return [signature("resolve", id, valueType.unit, resolved)]; + if (operation.CONNECT() || operation.DISCONNECT()) + return [signature(operation.CONNECT() ? "connect" : "disconnect", id, targetType, valueType.unit)]; + return [ + signature("watch-start", id, valueType.unit, valueType.watchHandle, "watch-start", resolved), + signature( + "watch-stop", + capabilityId.operation(stringValue(operation.stringLiteral(1))), + valueType.watchHandle, + valueType.unit, + "watch-stop", + ), + ]; + }), + }; + }); + const requires = context.interfaceType().map((requirement) => types.interface(requirement)); + const memberIds = new Set(); + const memberNames = new Set(); + const operationIds = new Set(); + for (const member of members) { + if (!member.id || memberIds.has(member.id) || memberNames.has(member.displayName)) + throw new GenericTypeError( + "duplicate-interface-member", + revisionId, + `Invalid or duplicate member ${member.displayName}`, + ); + memberIds.add(member.id); + memberNames.add(member.displayName); + const operationNames = new Set(); + for (const operation of member.operations) { + if (!operation.id || operationIds.has(operation.id) || operationNames.has(operation.displayName)) + throw new GenericTypeError( + "duplicate-interface-operation", + revisionId, + `Invalid or duplicate operation ${member.displayName}.${operation.displayName}`, + ); + operationIds.add(operation.id); + operationNames.add(operation.displayName); + } + } + const hasSelf = (value: unknown): boolean => + value !== null && + typeof value === "object" && + (("kind" in value && value.kind === "self") || Object.values(value).some(hasSelf)); + const aliases = [...types.aliases.values()]; + types.parameters = new Map(); + return { + interfaceId: capabilityId.interface(stringValue(context.stringLiteral(0))), + revisionId, + displayName: identifier(context.identifier()), + source, + members: [], + template: { parameters, members, requires, aliases, usesSelf: hasSelf([parameters, members, requires, aliases]) }, }; }; @@ -612,7 +830,12 @@ const lowerDependencyPort = (state: LoweringState, context: DependencyPortContex } const targetName = identifier(context.identifier(1)); if (context.INTERFACE()) { - const target = requireSymbol(state, state.interfaces, targetName, context, "interface"); + let target = requireSymbol(state, state.interfaces, targetName, context, "interface"); + if (target && (context.typeArguments() || target.definition?.template)) { + const expression = state.types.interfaceByName(targetName, context.typeArguments()); + const id = new TypeSubstitution(state.types.environment()).application(expression); + target = interfaceSymbolFor(state.types.definitions.get(id)!); + } if (target && !target.contractAvailable) { loweringIssue( state, @@ -665,6 +888,12 @@ const lowerReceiver = ( state: LoweringState, context: PackageOperationExportContext["receiverRequirement"] extends () => infer Result ? Result : never, ): PackageReceiverRequirement => { + if (context.OBJECT()) + throw new GenericTypeError( + "unbound-parameter", + context.getText(), + "An object-parameter receiver requires a generic operation declaration", + ); if (context.ANY()) { return { kind: "any-object" }; } @@ -675,11 +904,12 @@ const lowerReceiver = ( atomId: requireSymbol(state, state.atoms, name, context, "atom") ?? capabilityId.atom(`unresolved:${name}`), }; } - const list = context.identifierList(); return { kind: "all-interfaces", - interfaceRevisionIds: (list?.identifier() ?? []).map((entry) => { - const name = identifier(entry); + interfaceRevisionIds: context.interfaceType().map((entry) => { + const name = identifier(entry.identifier()); + if (entry.typeArguments() || state.types.interfaces.get(name)?.template) + return new TypeSubstitution(state.types.environment()).application(state.types.interface(entry)); return ( requireSymbol(state, state.interfaces, name, entry, "interface")?.revisionId ?? capabilityId.interfaceRevision(`unresolved:${name}`) @@ -773,22 +1003,148 @@ const lowerPackageConstructor = ( return entry; }; +const lowerGenericPackageExport = ( + state: LoweringState, + context: PackageOperationExportContext | PackageFunctionExportContext, +): GenericPackageExport => { + const previous = state.types.parameters; + state.types.parameters = new Map(); + const id = capabilityId.packageExport(stringValue(context.stringLiteral())); + try { + const parameters = state.types.declareParameters(context.typeParameters(), JSON.stringify(["export", id])); + const dependencyPorts = (context.dependencyBlock()?.dependencyPort() ?? []).map((port): GenericDependencyPort => { + const base = { + id: capabilityId.dependencyPort(stringValue(port.stringLiteral())), + displayName: identifier(port.identifier(0)), + }; + const primitives = + port + .primitiveList() + ?.primitive() + .map((item) => text(item)) ?? []; + if (port.STATE()) + return { + ...base, + requirement: { + kind: "state", + valueType: state.types.expression(port.valueType()!), + primitives: primitives as StatePrimitive[], + }, + }; + if (port.EDGE()) + return { + ...base, + requirement: { + kind: "edge", + target: state.types.targetExpression(port.targetConstraint()!), + cardinality: lowerCardinality(port.cardinality()!), + primitives: primitives as EdgePrimitive[], + }, + }; + if (port.INTERFACE()) + return { + ...base, + requirement: { + kind: "interface", + application: state.types.interfaceByName(identifier(port.identifier(1)), port.typeArguments()), + }, + }; + const name = identifier(port.identifier(1)), + parameter = state.types.parameters.get(name); + const target: ObjectTypeExpression = + parameter?.kind === "object" + ? { kind: "parameter", parameterId: parameter.id } + : { kind: "atom", atomId: requireSymbol(state, state.atoms, name, port, "atom")! }; + if (!port.valueType()) + throw new GenericTypeError("missing-constructor-input", id, "Constructor ports require an explicit input type"); + return { + ...base, + requirement: { kind: "constructor", target, inputType: state.types.expression(port.valueType()!) }, + }; + }); + const operation = "receiverRequirement" in context ? context : undefined; + const receiver = operation?.receiverRequirement(); + let receiverRequirement: GenericPackageExport["receiverRequirement"] = { kind: "any-object" }; + if (receiver?.ATOM()) + receiverRequirement = { + kind: "target", + target: { + kind: "atom", + atomId: requireSymbol(state, state.atoms, identifier(receiver.identifier()), receiver, "atom")!, + }, + }; + if (receiver?.OBJECT()) { + const name = identifier(receiver.identifier()); + const parameter = state.types.parameters.get(name); + if (parameter?.kind !== "object") + throw new GenericTypeError("parameter-kind", id, "Receiver needs an object parameter"); + receiverRequirement = { kind: "target", target: { kind: "parameter", parameterId: parameter.id } }; + } + if (receiver?.INTERFACES()) + receiverRequirement = { + kind: "interfaces", + interfaces: receiver.interfaceType().map((item) => state.types.interface(item)), + }; + const definition: GenericPackageExport = { + id, + displayName: identifier(context.identifier()), + parameters, + kind: operation ? "operation" : "function", + inputType: state.types.expression(context.valueType(0)!), + outputType: state.types.expression(context.valueType(1)!), + dependencyPorts, + receiverRequirement, + ...(operation ? { mode: text(operation.operationMode()) as InterfaceOperationMode } : {}), + ...(operation?.eventClause() ? { eventType: state.types.expression(operation.eventClause()!.valueType()) } : {}), + aliases: [...state.types.aliases.values()], + }; + const bindSelf = (value: unknown): unknown => { + if (!value || typeof value !== "object") return value; + if ("kind" in value && value.kind === "self") { + if (receiverRequirement.kind !== "target") + throw new GenericTypeError("unbound-self", id, "Generic Self requires an exact or object-parameter receiver"); + return receiverRequirement.target; + } + if (Array.isArray(value)) return value.map(bindSelf); + return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, bindSelf(child)])); + }; + return bindSelf(definition) as GenericPackageExport; + } finally { + state.types.parameters = previous; + } +}; + const lowerPackage = ( state: LoweringState, context: PackageResourceDeclContext, source: SourceRevision, ): PackageRevision => { const alias = identifier(context.identifier()); - const exports = context.packageExport().map((exportContext) => { + const genericExports: GenericPackageExport[] = []; + const exports = context.packageExport().flatMap((exportContext): PackageExport[] => { const operation = exportContext.packageOperationExport(); - if (operation) { - return lowerPackageOperation(state, alias, operation); + const generic = operation ?? exportContext.packageFunctionExport(); + if (generic?.typeParameters()) { + genericExports.push(atGenericSource(generic, () => lowerGenericPackageExport(state, generic))); + return []; } - const fn = exportContext.packageFunctionExport(); - if (fn) { - return lowerPackageFunction(state, alias, fn); + const constructor = exportContext.packageConstructorExport(); + const receiver = operation?.receiverRequirement(); + const selfName = constructor + ? identifier(constructor.identifier(1)) + : receiver?.ATOM() + ? identifier(receiver.identifier()) + : undefined; + const previousSelf = state.types.self; + state.types.self = selfName ? state.atoms.get(selfName) : undefined; + try { + if (operation) return [lowerPackageOperation(state, alias, operation)]; + const fn = exportContext.packageFunctionExport(); + if (fn) return [lowerPackageFunction(state, alias, fn)]; + return [lowerPackageConstructor(state, alias, constructor!)]; + } finally { + state.types.self = previousSelf; } - return lowerPackageConstructor(state, alias, exportContext.packageConstructorExport()!); }); return { packageId: capabilityId.package(stringValue(context.stringLiteral(0))), @@ -797,6 +1153,7 @@ const lowerPackage = ( displayName: alias, source, exports, + ...(genericExports.length ? { genericExports } : {}), }; }; @@ -978,7 +1335,13 @@ const lowerBoundDependencies = ( } if (entry.INTERFACE()) { const interfaceName = identifier(entry.identifier(1)); - const interfaceSymbol = requireSymbol(state, state.interfaces, interfaceName, entry, "interface"); + let interfaceSymbol = requireSymbol(state, state.interfaces, interfaceName, entry, "interface"); + if (interfaceSymbol && (entry.typeArguments() || interfaceSymbol.definition?.template)) { + const id = new TypeSubstitution(state.types.environment()).application( + state.types.interfaceByName(interfaceName, entry.typeArguments()), + ); + interfaceSymbol = interfaceSymbolFor(state.types.definitions.get(id)!); + } const via = entry.VIA() ? traversal(identifier(entry.identifier(2)), identifier(entry.identifier(3))) : undefined; if (entry.VIA() && !via) return []; return interfaceSymbol @@ -1047,10 +1410,23 @@ const lowerConformance = ( const atomName = identifier(context.identifier(0)); const interfaceName = identifier(context.identifier(1)); const atomId = requireSymbol(state, state.atoms, atomName, context, "atom"); - const interfaceSymbol = requireSymbol(state, state.interfaces, interfaceName, context, "interface"); + let interfaceSymbol = requireSymbol(state, state.interfaces, interfaceName, context, "interface"); if (!atomId || !interfaceSymbol) { return undefined; } + const originalSymbol = interfaceSymbol; + if (context.typeArguments() || interfaceSymbol.definition?.template) { + const previousSelf = state.types.self; + state.types.self = atomId; + try { + const expression = state.types.interfaceByName(interfaceName, context.typeArguments()); + const id = new TypeSubstitution(state.types.environment()).application(expression); + interfaceSymbol = interfaceSymbolFor(state.types.definitions.get(id)!); + state.interfaces.set(interfaceName, interfaceSymbol); + } finally { + state.types.self = previousSelf; + } + } const operationBindings = context .conformanceItem() .flatMap((item) => { @@ -1119,9 +1495,30 @@ const lowerConformance = ( const packageName = identifier(provider.identifier(0)); const exportName = identifier(provider.identifier(1)); const packageSymbol = requireSymbol(state, state.packages, packageName, provider, "package"); - const exportSymbol = packageSymbol + let exportSymbol = packageSymbol ? requireSymbol(state, packageSymbol.exports, exportName, provider, `export on ${packageName}`) : undefined; + const generic = packageSymbol?.definition?.genericExports?.find((entry) => entry.displayName === exportName); + if (packageSymbol?.definition && generic) { + const arguments_ = state.types + .arguments(provider.typeArguments()) + .map((entry) => new TypeSubstitution({ ...state.types.environment(), self: atomId }).argument(entry)); + const pkg = packageSymbol.definition; + const specialized = specializePackageExport(pkg, generic, arguments_, { + ...state.types.environment(), + implementsInterface: (target, required) => { + (pkg.argumentRequirements ??= []).push({ target, required }); + return true; + }, + }); + if (!pkg.exports.some((entry) => entry.id === specialized.id)) pkg.exports.push(specialized); + exportSymbol = { + exportId: specialized.id, + ports: new Map(specialized.dependencyPorts.map((entry) => [entry.displayName, entry.id])), + }; + } else if (provider.typeArguments()) { + throw new GenericTypeError("type-arity", exportName, "Non-generic export takes no type arguments"); + } return packageSymbol && exportSymbol ? [ { @@ -1146,6 +1543,7 @@ const lowerConformance = ( const lowered = lowerRelationshipMaterialization(state, interfaceName, materialization); return lowered ? [lowered] : []; }); + state.interfaces.set(interfaceName, originalSymbol); return { atomId, interfaceRevisionId: interfaceSymbol.revisionId, @@ -1158,6 +1556,7 @@ const lowerConformance = ( }; const interfaceSymbolFor = (revision: InterfaceRevision): InterfaceSymbol => ({ + definition: revision, revisionId: revision.revisionId, contractAvailable: true, members: new Map( @@ -1172,9 +1571,10 @@ const interfaceSymbolFor = (revision: InterfaceRevision): InterfaceSymbol => ({ }); const packageSymbolFor = (revision: PackageRevision): PackageSymbol => ({ + definition: structuredClone(revision), revisionId: revision.revisionId, exports: new Map( - revision.exports.map((entry) => [ + [...revision.exports, ...(revision.genericExports ?? [])].map((entry) => [ entry.displayName, { exportId: entry.id, @@ -1193,8 +1593,10 @@ const registerImports = ( state: LoweringState, contexts: readonly ResourceImportDeclContext[], environment: CapabilityImportEnvironment, -) => - contexts.map((context) => { +) => { + for (const definition of environment.interfaceClosure ?? []) + state.types.definitions.set(definition.revisionId, definition); + return contexts.map((context) => { const imported = resourceImport(context); if (imported.kind === "interface") { const revision = environment.interfaces?.get(imported.binding); @@ -1207,6 +1609,7 @@ const registerImports = ( ); } else { declareSymbol(state, state.interfaces, imported.binding, interfaceSymbolFor(revision), context, "interface"); + state.types.register(imported.binding, revision); } } else { const revision = environment.packages?.get(imported.binding); @@ -1223,6 +1626,7 @@ const registerImports = ( } return imported; }); +}; const uniqueExactRevisions = < Revision extends { @@ -1295,6 +1699,8 @@ const lowerWorkspace = ( : []; }); + state.types.declareAliases(items.flatMap((item) => item.typeAliasDecl() ?? [])); + const interfaceImports = uniqueExactRevisions([ ...(environment.interfaceClosure ?? []), ...[...(environment.interfaces?.values() ?? [])], @@ -1319,6 +1725,7 @@ const lowerWorkspace = ( } const conformance = item.conformanceDecl(); if (conformance) { + state.types.self = state.atoms.get(identifier(conformance.identifier(0))); const attachments = conformance.conformanceItem().flatMap((entry) => { const declaration = entry.attachmentDecl(); if (!declaration) { @@ -1332,6 +1739,7 @@ const lowerWorkspace = ( return [attachment]; }); privateAttachments.set(conformance, attachments); + state.types.self = undefined; } } @@ -1340,7 +1748,9 @@ const lowerWorkspace = ( if (!context) { return []; } - const conformance = lowerConformance(state, context, privateAttachments.get(context) ?? []); + const conformance = atGenericSource(context, () => + lowerConformance(state, context, privateAttachments.get(context) ?? []), + ); return conformance ? [conformance] : []; }); @@ -1382,8 +1792,15 @@ const lowerWorkspace = ( sourceRootCommit: stringValue(context.stringLiteral(2)), atoms, sharedAttachments, - interfaceImports, - packageImports, + interfaceImports: uniqueExactRevisions([ + ...interfaceImports.filter((entry) => !entry.template), + ...state.types.applications.values(), + ]), + packageImports: packageImports.map( + (revision) => + [...state.packages.values()].find((entry) => entry.revisionId === revision.revisionId)?.definition ?? + revision, + ), conformances, constructors, }, @@ -1408,14 +1825,18 @@ export const parseDocument = ( return { tree, tokens, diagnostics }; }; -const newLoweringState = (fileName: string, diagnostics: CapabilitySourceDiagnostic[]): LoweringState => ({ - fileName, - diagnostics, - atoms: new Map(), - interfaces: new Map(), - packages: new Map(), - attachments: new Map(), -}); +const newLoweringState = (fileName: string, diagnostics: CapabilitySourceDiagnostic[]): LoweringState => { + const atoms = new Map(); + return { + fileName, + diagnostics, + atoms, + types: new GenericSourceTypes(atoms), + interfaces: new Map(), + packages: new Map(), + attachments: new Map(), + }; +}; const validationDiagnostics = ( fileName: string, @@ -1471,6 +1892,7 @@ const resourcePreambleParts = (contexts: readonly ResourcePreambleContext[]) => imports: contexts.flatMap((context) => context.resourceImportDecl() ?? []), atoms: contexts.flatMap((context) => context.externalAtomDecl() ?? []), interfaces: contexts.flatMap((context) => context.externalInterfaceDecl() ?? []), + aliases: contexts.flatMap((context) => context.typeAliasDecl() ?? []), }); const resourceValidationWorkspace = ( @@ -1493,6 +1915,7 @@ const resourceValidationWorkspace = ( ...(environment.interfaceClosure ?? []), ...[...(environment.interfaces?.values() ?? [])], ...(resource.kind === "interface" ? [resource.revision] : []), + ...(resource.specializations ?? []), ...resource.externalInterfaces .filter((requirement) => !resolvedInterfaceIds.has(requirement.revisionId)) .map( @@ -1507,7 +1930,9 @@ const resourceValidationWorkspace = ( members: [], }), ), - ]), + ]) + .filter((entry) => !entry.template) + .map((entry) => ({ ...entry, argumentRequirements: [] })), packageImports: uniqueExactRevisions([ ...(environment.packageClosure ?? []), ...[...(environment.packages?.values() ?? [])], @@ -1518,7 +1943,7 @@ const resourceValidationWorkspace = ( }; }; -export const compileCapabilityResourceSource = ( +const compileCapabilityResourceSourceInternal = ( sourceText: string, options: { source: SourceRevision; @@ -1556,10 +1981,18 @@ export const compileCapabilityResourceSource = ( const externalAtoms = externalAtomsFrom(state, preamble.atoms); const imports = registerImports(state, preamble.imports, environment); const externalInterfaces = externalInterfacesFrom(state, preamble.interfaces); + state.types.declareAliases(preamble.aliases); let resource: CapabilityResource; if (interfaceContext) { const alias = identifier(interfaceContext.identifier()); + state.types.register(alias, { + interfaceId: capabilityId.interface(stringValue(interfaceContext.stringLiteral(0))), + revisionId: capabilityId.interfaceRevision(stringValue(interfaceContext.stringLiteral(1))), + displayName: alias, + source: options.source, + members: [], + }); declareSymbol( state, state.interfaces, @@ -1577,7 +2010,10 @@ export const compileCapabilityResourceSource = ( imports, externalAtoms, externalInterfaces, - revision: lowerInterface(state, interfaceContext, options.source), + revision: + interfaceContext.typeParameters() || hasSelfIdentifier(interfaceContext, state) + ? atGenericSource(interfaceContext, () => lowerInterfaceTemplate(state, interfaceContext, options.source)) + : lowerInterface(state, interfaceContext, options.source), }; } else { const context = packageContext!; @@ -1602,6 +2038,77 @@ export const compileCapabilityResourceSource = ( }; } + if (resource.kind === "interface") { + state.types.register(identifier(interfaceContext!.identifier()), resource.revision); + atGenericSource(interfaceContext!, () => state.types.validateTemplate(resource.revision)); + } else { + const names = new Set(resource.revision.exports.map((entry) => entry.displayName)); + const ids = new Set(resource.revision.exports.map((entry) => entry.id)); + for (const entry of resource.revision.genericExports ?? []) { + if (names.has(entry.displayName) || ids.has(entry.id)) + throw new GenericTypeError("duplicate-package-export", entry.displayName, "Duplicate generic export"); + names.add(entry.displayName); + ids.add(entry.id); + if ( + entry.kind === "operation" && + (entry.mode === "watch-start" || entry.mode === "subscribe") !== Boolean(entry.eventType) + ) + throw new GenericTypeError( + "invalid-operation", + entry.displayName, + "Only watch-start/subscribe operations must declare an event type", + ); + const portIds = new Set(), + portNames = new Set(); + const types: ValueTypeExpression[] = [ + entry.inputType, + entry.outputType, + ...(entry.eventType ? [entry.eventType] : []), + ]; + const requires = entry.parameters.flatMap((parameter) => + parameter.kind === "object" ? parameter.implements : [], + ); + for (const port of entry.dependencyPorts) { + if (portIds.has(port.id) || portNames.has(port.displayName)) + throw new GenericTypeError("duplicate-dependency-port", entry.displayName, "Duplicate port"); + portIds.add(port.id); + portNames.add(port.displayName); + const requirement = port.requirement; + if (requirement.kind === "state") { + if (requirement.primitives.some((p) => !["read", "write", "watch-start", "watch-stop"].includes(p))) + throw new GenericTypeError("invalid-port-primitive", port.displayName, "Invalid state primitive"); + types.push(requirement.valueType); + } + if (requirement.kind === "edge") types.push({ kind: "object-ref", expectation: requirement.target }); + if (requirement.kind === "constructor") + types.push(requirement.inputType, { kind: "object-ref", expectation: requirement.target }); + if (requirement.kind === "interface") requires.push(requirement.application); + } + if (entry.receiverRequirement.kind === "interfaces") requires.push(...entry.receiverRequirement.interfaces); + state.types.validateTemplate({ + interfaceId: capabilityId.interface(entry.id), + revisionId: capabilityId.interfaceRevision(entry.id), + displayName: entry.displayName, + source: resource.revision.source, + members: [], + template: { + parameters: entry.parameters, + aliases: entry.aliases, + usesSelf: false, + requires, + members: types.map((type, index) => ({ + kind: "value", + id: capabilityId.member(String(index)), + displayName: String(index), + valueType: type, + operations: [], + })), + }, + }); + } + } + resource.specializations = [...state.types.applications.values()]; + if (diagnostics.length > 0) { return { ok: false, diagnostics }; } @@ -1615,7 +2122,7 @@ export const compileCapabilityResourceSource = ( return { ok: true, resource, diagnostics: [] }; }; -export const compileCapabilitySource = ( +const compileCapabilitySourceInternal = ( source: string, fileName = "", environment: CapabilityImportEnvironment = {}, @@ -1666,3 +2173,35 @@ export const compileCapabilitySource = ( diagnostics: [], }; }; + +const genericDiagnostic = (error: GenericTypeError, fileName: string): CapabilitySourceDiagnostic => ({ + phase: "lowering", + code: error.code, + message: error.message, + fileName, + line: genericLocations.get(error)?.line ?? 0, + column: genericLocations.get(error)?.column ?? 0, + path: error.path, +}); + +export const compileCapabilityResourceSource = ( + ...args: Parameters +): CapabilityResourceCompileResult => { + try { + return compileCapabilityResourceSourceInternal(...args); + } catch (error) { + if (!(error instanceof GenericTypeError)) throw error; + return { ok: false, diagnostics: [genericDiagnostic(error, args[1].fileName ?? "")] }; + } +}; + +export const compileCapabilitySource = ( + ...args: Parameters +): CapabilitySourceCompileResult => { + try { + return compileCapabilitySourceInternal(...args); + } catch (error) { + if (!(error instanceof GenericTypeError)) throw error; + return { ok: false, diagnostics: [genericDiagnostic(error, args[1] ?? "")] }; + } +}; diff --git a/src/capability-language/structural-plan.ts b/src/capability-language/structural-plan.ts index e2ce3d3..e389fcb 100644 --- a/src/capability-language/structural-plan.ts +++ b/src/capability-language/structural-plan.ts @@ -28,7 +28,7 @@ type Change = { file: string; before: string | null; after: string; mode: number type Journal = { schemaVersion: 1; id: string; root: string; phase: "prepared" | "complete"; changes: Change[] }; const safeFile = (file: string) => { if ( - !/^(?:[A-Za-z0-9_-][A-Za-z0-9_.-]*\/)*(?:\.gitignore|\.yarnrc.yml|[A-Za-z0-9_-][A-Za-z0-9_.-]*\.(?:qx|lock|ts|tsx|css|mjs|json|nix|txtpb))$/.test( + !/^(?:[A-Za-z0-9_-][A-Za-z0-9_.-]*\/)*(?:\.gitignore|\.yarnrc.yml|[A-Za-z0-9_-][A-Za-z0-9_.-]*\.(?:qx|lock|ts|tsx|css|mjs|json|nix|txtpb|md))$/.test( file, ) || file.split("/").some((part) => [".git", ".jj", ".quixos", "node_modules"].includes(part)) diff --git a/src/capability-language/workspace-cli.ts b/src/capability-language/workspace-cli.ts index bf870b8..f56f80b 100644 --- a/src/capability-language/workspace-cli.ts +++ b/src/capability-language/workspace-cli.ts @@ -4,6 +4,7 @@ import { readFile, writeFile } from "node:fs/promises"; import process from "node:process"; import { compileWorkspaceRepository } from "./assembly.js"; import { createGitCapabilityResolver } from "./git-resolver.js"; +import { bindingSchema, specializeBindingSchema } from "../bindings/index.js"; import { planEvolution, runtimeContracts, @@ -14,7 +15,7 @@ import { const usage = `usage: quixos-workspace-compile --root DIRECTORY --checkout-root DIRECTORY [--snapshot-map PATH] [--graph-out PATH] [--workspace-id ID] [--workspace-revision-id ID] [--source-root-commit GIT_REV] [--baseline PLAN_JSON] [--evolution-out PATH] - [--reviews REVIEW_JSON] + [--reviews REVIEW_JSON] [--schemas-out PATH] Resolves a workspace's recursive resource-lock graph, clones every exact resource revision, validates standalone interface/package manifests, and emits @@ -35,6 +36,7 @@ const parseArgs = (args: string[]) => { rootDirectory, checkoutRoot, graphOut: values.get("--graph-out"), + schemasOut: values.get("--schemas-out"), snapshotMap: values.get("--snapshot-map"), workspaceId: values.get("--workspace-id"), workspaceRevisionId: values.get("--workspace-revision-id"), @@ -96,6 +98,24 @@ const main = async () => { ); } const candidate = { ...assembled.workspace, executionContracts: runtimeContracts(assembled.workspace) }; + if (options.schemasOut) { + const schemas: Record = {}; + for (const node of assembled.resources.filter((entry) => entry.kind === "package")) { + const closure = new Map(); + const visit = (entry: typeof node) => { + if (closure.has(entry.key)) return; + closure.set(entry.key, entry); + entry.dependencies.forEach(visit); + }; + visit(node); + schemas[node.resource.revision.revisionId] = specializeBindingSchema( + bindingSchema({ resources: [...closure.values()] }), + candidate, + node.resource.revision.revisionId, + ); + } + await writeFile(options.schemasOut, JSON.stringify(schemas)); + } if (options.evolutionOut) { const baseline = options.baseline ? (JSON.parse(await readFile(options.baseline, "utf8")) as WorkspaceRevision) diff --git a/src/capability-model/evolution.ts b/src/capability-model/evolution.ts index 31873f8..e9b1747 100644 --- a/src/capability-model/evolution.ts +++ b/src/capability-model/evolution.ts @@ -184,6 +184,9 @@ export const runtimeContracts = (workspace: WorkspaceRevision): RuntimeContract[ materializations: sorted(conformance.relationshipMaterializations, (entry) => entry.memberId), }); parent.dependencies.add(`interface:${conformance.interfaceRevisionId}`); + const contract = workspace.interfaceImports.find((entry) => entry.revisionId === conformance.interfaceRevisionId); + for (const required of contract?.requiredInterfaces ?? []) + parent.dependencies.add(conformanceKey(conformance.atomId, required)); for (const attachment of conformance.privateAttachments) parent.dependencies.add(`attachment:${attachment.id}`); for (const operation of conformance.operationBindings) binding(parent, operation.binding, conformance.atomId, { diff --git a/src/capability-model/generic-packages.ts b/src/capability-model/generic-packages.ts new file mode 100644 index 0000000..5bcb0fc --- /dev/null +++ b/src/capability-model/generic-packages.ts @@ -0,0 +1,141 @@ +import { createHash } from "node:crypto"; +import { + capabilityId, + type PackageExport, + type PackageExportId, + type DependencyPort, + type PackageRevision, +} from "./types.js"; +import { + TypeSubstitution, + GenericTypeError, + bindTypeParameters, + canonicalTypeArgument, + type TypeParameter, + type ValueTypeExpression, + type ObjectTypeExpression, + type InterfaceApplicationExpression, + type GenericTypeEnvironment, + type ClosedTypeArgument, + type ValueAliasDefinition, +} from "./generics.js"; + +export type GenericDependencyPort = Omit & { + requirement: + | { + kind: "state"; + valueType: ValueTypeExpression; + primitives: Extract["primitives"]; + } + | { + kind: "edge"; + target: ObjectTypeExpression; + cardinality: Extract["cardinality"]; + primitives: Extract["primitives"]; + } + | { kind: "interface"; application: InterfaceApplicationExpression } + | { kind: "constructor"; target: ObjectTypeExpression; inputType: ValueTypeExpression }; +}; + +export interface GenericPackageExport { + id: PackageExportId; + displayName: string; + parameters: TypeParameter[]; + kind: "operation" | "function"; + inputType: ValueTypeExpression; + outputType: ValueTypeExpression; + eventType?: ValueTypeExpression; + mode?: Extract["mode"]; + receiverRequirement: + | { kind: "any-object" } + | { kind: "target"; target: ObjectTypeExpression } + | { kind: "interfaces"; interfaces: InterfaceApplicationExpression[] }; + dependencyPorts: GenericDependencyPort[]; + aliases: ValueAliasDefinition[]; +} + +/** A closed manifest is a Nix build input, never a mutable source checkout. */ +export const specializePackageExport = ( + pkg: PackageRevision, + definition: GenericPackageExport, + arguments_: ClosedTypeArgument[], + environment: GenericTypeEnvironment, +): PackageExport => { + const lexical = { ...environment, aliases: new Map(definition.aliases.map((alias) => [alias.id, alias])) }; + const bindings = bindTypeParameters(definition.parameters, arguments_, lexical, definition.displayName); + const substitution = new TypeSubstitution({ ...lexical, arguments: bindings }); + const digest = createHash("sha256") + .update( + JSON.stringify([ + "quixos-package-specialization-v1", + pkg.revisionId, + [pkg.source.repository, pkg.source.commit], + definition.id, + arguments_.map(canonicalTypeArgument), + environment.self ?? null, + ]), + ) + .digest("hex"); + const ports: DependencyPort[] = definition.dependencyPorts.map((port) => { + const requirement = port.requirement; + switch (requirement.kind) { + case "state": + return { ...port, requirement: { ...requirement, valueType: substitution.value(requirement.valueType) } }; + case "edge": + return { ...port, requirement: { ...requirement, target: substitution.object(requirement.target) } }; + case "interface": + return { + ...port, + requirement: { kind: "interface", interfaceRevisionId: substitution.application(requirement.application) }, + }; + case "constructor": { + const target = substitution.object(requirement.target); + if (target.kind !== "atom") + throw new GenericTypeError( + "constructor-target", + port.displayName, + "Constructor ports require a concrete atom argument, not an interface view", + ); + return { + ...port, + requirement: { + kind: "constructor", + atomId: target.atomId, + inputType: substitution.value(requirement.inputType), + }, + }; + } + } + }); + const common = { + id: capabilityId.packageExport(`export-application:sha256:${digest}`), + displayName: `${definition.displayName}$${digest}`, + inputType: substitution.value(definition.inputType), + outputType: substitution.value(definition.outputType), + dependencyPorts: ports, + application: { + exportId: definition.id, + arguments: structuredClone(arguments_), + ...(environment.self ? { self: environment.self } : {}), + }, + }; + if (definition.kind === "function") return { ...common, kind: "function" }; + const receiver = definition.receiverRequirement; + const target = receiver.kind === "target" ? substitution.object(receiver.target) : undefined; + return { + ...common, + kind: "operation", + mode: definition.mode!, + ...(definition.eventType ? { eventType: substitution.value(definition.eventType) } : {}), + receiverRequirement: target + ? target.kind === "atom" + ? { kind: "exact-atom", atomId: target.atomId } + : { kind: "all-interfaces", interfaceRevisionIds: [target.interfaceRevisionId] } + : receiver.kind === "interfaces" + ? { + kind: "all-interfaces", + interfaceRevisionIds: receiver.interfaces.map((value) => substitution.application(value)), + } + : { kind: "any-object" }, + }; +}; diff --git a/src/capability-model/generics.ts b/src/capability-model/generics.ts new file mode 100644 index 0000000..3b592aa --- /dev/null +++ b/src/capability-model/generics.ts @@ -0,0 +1,420 @@ +import { createHash } from "node:crypto"; +import { + capabilityId, + type AtomId, + type InterfaceMember, + type InterfaceOperation, + type InterfaceRevision, + type InterfaceRevisionId, + type ObjectExpectation, + type SourceRevision, + type ValueType, +} from "./types.js"; + +/** Authoring-only expressions. Installed ValueType deliberately has no variable case. */ +export type ValueTypeExpression = + | Extract + | { kind: "parameter"; parameterId: string } + | { kind: "record"; fields: Record } + | { kind: "list" | "optional"; value: ValueTypeExpression } + | { kind: "object-ref"; expectation: ObjectTypeExpression } + | { kind: "alias"; definitionId: string; arguments: TypeArgumentExpression[] }; + +export type ObjectTypeExpression = + | { kind: "atom"; atomId: AtomId } + | { kind: "interface"; interfaceRevisionId: InterfaceRevisionId } + | { kind: "parameter"; parameterId: string } + | { kind: "self" } + | { kind: "application"; application: InterfaceApplicationExpression }; + +export type TypeArgumentExpression = + | { kind: "value"; type: ValueTypeExpression } + | { kind: "object"; target: ObjectTypeExpression }; + +export type ClosedTypeArgument = { kind: "value"; type: ValueType } | { kind: "object"; target: ObjectExpectation }; + +export interface InterfaceApplicationExpression { + definitionId: InterfaceRevisionId; + arguments: TypeArgumentExpression[]; +} + +export type TypeParameter = + | { id: string; name: string; kind: "value"; storable?: boolean } + | { id: string; name: string; kind: "object"; implements: InterfaceApplicationExpression[] }; + +export interface ValueAliasDefinition { + id: string; + parameters: TypeParameter[]; + body: ValueTypeExpression; +} + +export interface GenericInterfaceTemplate { + parameters: TypeParameter[]; + members: InterfaceMember[]; + requires: InterfaceApplicationExpression[]; + usesSelf: boolean; + aliases?: ValueAliasDefinition[]; +} + +/** Instantiation produces the existing closed runtime IR, with explicit provenance. */ +export const instantiateInterface = ( + definition: InterfaceRevision, + arguments_: readonly ClosedTypeArgument[], + environment: GenericTypeEnvironment, +): InterfaceRevision => { + const template = definition.template; + if (!template) { + if (arguments_.length) fail("type-arity", definition.displayName, "Non-generic interface takes no type arguments"); + return definition; + } + const lexicalEnvironment = { + ...environment, + aliases: new Map((template.aliases ?? []).map((alias) => [alias.id, alias])), + }; + const argumentsMap = bindTypeParameters(template.parameters, arguments_, lexicalEnvironment, definition.displayName); + if (template.usesSelf && !environment.self) + fail("unbound-self", definition.displayName, "Self requires an implementing atom"); + const substitution = new TypeSubstitution({ ...lexicalEnvironment, arguments: argumentsMap }); + const operation = (entry: InterfaceOperation): InterfaceOperation => ({ + ...entry, + inputType: substitution.value(entry.inputType, `${definition.displayName}.${entry.displayName}.input`), + outputType: substitution.value(entry.outputType, `${definition.displayName}.${entry.displayName}.output`), + eventType: entry.eventType + ? substitution.value(entry.eventType, `${definition.displayName}.${entry.displayName}.event`) + : undefined, + }); + const members: InterfaceMember[] = template.members.map((member) => { + const common = { id: member.id, displayName: member.displayName, operations: member.operations.map(operation) }; + switch (member.kind) { + case "value": + return { ...common, kind: "value", valueType: substitution.value(member.valueType, member.displayName) }; + case "relationship": + return { + ...common, + kind: "relationship", + target: substitution.object(member.target, member.displayName), + cardinality: member.cardinality, + ordered: member.ordered, + }; + case "operation": + return { + ...common, + kind: "operation", + inputType: substitution.value(member.inputType, member.displayName), + outputType: substitution.value(member.outputType, member.displayName), + }; + } + }); + const application: AppliedInterfaceIdentity = { + definitionId: definition.revisionId, + source: definition.source, + arguments: structuredClone([...arguments_]), + ...(template.usesSelf ? { self: environment.self } : {}), + }; + return { + interfaceId: definition.interfaceId, + revisionId: appliedInterfaceId(application), + displayName: definition.displayName, + source: definition.source, + members, + application, + requiredInterfaces: template.requires.map((required) => substitution.application(required)), + }; +}; + +export interface GenericTypeEnvironment { + arguments: ReadonlyMap; + self?: AtomId; + aliases?: ReadonlyMap; + /** Resolves only checked declarations, never a caller-supplied runtime type string. */ + applyInterface: (definitionId: InterfaceRevisionId, arguments_: readonly ClosedTypeArgument[]) => InterfaceRevisionId; + /** Proof in the candidate, not an authorization grant. */ + implementsInterface: (target: ObjectExpectation, required: InterfaceRevisionId) => boolean; + /** External codecs must explicitly declare reference-free persistence support. */ + storableMessage?: (descriptorId: string) => boolean; +} + +export class GenericTypeError extends Error { + constructor( + readonly code: string, + readonly path: string, + message: string, + ) { + super(`${path}: ${message}`); + this.name = "GenericTypeError"; + } +} + +const fail = (code: string, path: string, message: string): never => { + throw new GenericTypeError(code, path, message); +}; + +/** One budget across nested aliases/substitutions, including concrete arguments. */ +class Budget { + private remaining = 10000; + enter(path: string, depth: number) { + if (depth > 128 || --this.remaining < 0) + fail("type-complexity-limit", path, "Type exceeds the depth or expansion budget"); + } +} + +export const isStorableType = ( + type: ValueType, + storableMessage: (descriptorId: string) => boolean = () => false, +): boolean => { + const budget = new Budget(); + const visit = (value: ValueType, depth: number): boolean => { + budget.enter("storable", depth); + switch (value.kind) { + case "scalar": + return true; + case "builtin": + return value.name === "unit"; + case "message": + return storableMessage(value.descriptorId); + case "object-ref": + return false; + case "list": + case "optional": + return visit(value.value, depth + 1); + // Records currently have RPC codecs, not ordinary-state persistence codecs. + // A generic bound must not promise storage that the installed model rejects. + case "record": + return false; + } + }; + return visit(type, 0); +}; + +/** Canonical closed-type encoding, independent of record insertion order. */ +export const canonicalTypeArgument = (argument: ClosedTypeArgument): string => { + const budget = new Budget(); + const target = (value: ObjectExpectation): unknown => { + switch (value.kind) { + case "atom": + return ["atom", value.atomId]; + case "interface": + return ["interface", value.interfaceRevisionId]; + default: + return fail("unresolved-type", "argument", "Expected a closed object target"); + } + }; + const type = (value: ValueType, depth: number): unknown => { + budget.enter("argument", depth); + switch (value.kind) { + case "builtin": + case "scalar": + return [value.kind, value.name]; + case "message": + return ["message", value.descriptorId]; + case "object-ref": + return ["object-ref", target(value.expectation)]; + case "list": + case "optional": + return [value.kind, type(value.value, depth + 1)]; + case "record": + return [ + "record", + Object.keys(value.fields) + .sort() + .map((key) => [key, type(value.fields[key], depth + 1)]), + ]; + default: + return fail("unresolved-type", "argument", "Expected a closed value type"); + } + }; + switch (argument.kind) { + case "value": + return JSON.stringify(["value", type(argument.type, 0)]); + case "object": + return JSON.stringify(["object", target(argument.target)]); + default: + return fail("invalid-kind", "argument", "Expected a value or object type argument"); + } +}; + +export interface AppliedInterfaceIdentity { + definitionId: InterfaceRevisionId; + source: SourceRevision; + arguments: ClosedTypeArgument[]; + /** Only include Self when it is actually part of the closed contract. */ + self?: AtomId; +} + +export const appliedInterfaceId = (application: AppliedInterfaceIdentity): InterfaceRevisionId => { + const encoding = JSON.stringify([ + "quixos-applied-interface-v1", + application.definitionId, + application.source.repository, + application.source.commit.toLowerCase(), + application.arguments.map(canonicalTypeArgument), + application.self ?? null, + ]); + return capabilityId.interfaceRevision( + `interface-application:sha256:${createHash("sha256").update(encoding).digest("hex")}`, + ); +}; + +export class TypeSubstitution { + private readonly budget = new Budget(); + private readonly aliases: string[] = []; + + constructor(private environment: GenericTypeEnvironment) {} + + argument(expression: TypeArgumentExpression, path = "argument", depth = 0): ClosedTypeArgument { + this.budget.enter(path, depth); + switch (expression.kind) { + case "value": + return { kind: "value", type: this.value(expression.type, path, depth + 1) }; + case "object": + return { kind: "object", target: this.object(expression.target, path, depth + 1) }; + default: + return fail("invalid-kind", path, "Expected a value or object type argument"); + } + } + + application(expression: InterfaceApplicationExpression, path = "interface", depth = 0): InterfaceRevisionId { + this.budget.enter(path, depth); + return this.environment.applyInterface( + expression.definitionId, + expression.arguments.map((argument, index) => this.argument(argument, `${path}.arguments[${index}]`, depth + 1)), + ); + } + + object(expression: ObjectTypeExpression, path = "target", depth = 0): ObjectExpectation { + this.budget.enter(path, depth); + switch (expression.kind) { + case "atom": + return { kind: "atom", atomId: expression.atomId }; + case "interface": + return { kind: "interface", interfaceRevisionId: expression.interfaceRevisionId }; + case "self": + return this.environment.self + ? { kind: "atom", atomId: this.environment.self } + : fail("unbound-self", path, "Self requires an implementing atom"); + case "parameter": { + const argument = this.environment.arguments.get(expression.parameterId); + if (!argument) return fail("unbound-parameter", path, `Unbound parameter ${expression.parameterId}`); + if (argument.kind !== "object") + return fail("parameter-kind", path, `Parameter ${expression.parameterId} is a value, not an object target`); + canonicalTypeArgument(argument); + return structuredClone(argument.target); + } + case "application": + return { kind: "interface", interfaceRevisionId: this.application(expression.application, path, depth + 1) }; + default: + return fail("invalid-type", path, "Unknown object type expression"); + } + } + + value(expression: ValueTypeExpression, path = "type", depth = 0): ValueType { + this.budget.enter(path, depth); + switch (expression.kind) { + case "builtin": + return { kind: "builtin", name: expression.name }; + case "scalar": + return { kind: "scalar", name: expression.name }; + case "message": + return { kind: "message", descriptorId: expression.descriptorId }; + case "list": + case "optional": + return { kind: expression.kind, value: this.value(expression.value, `${path}.${expression.kind}`, depth + 1) }; + case "record": + return { + kind: "record", + fields: Object.fromEntries( + Object.entries(expression.fields).map(([name, field]) => [ + name, + this.value(field, `${path}.${name}`, depth + 1), + ]), + ), + }; + case "object-ref": + return { kind: "object-ref", expectation: this.object(expression.expectation, `${path}.ref`, depth + 1) }; + case "parameter": { + const argument = this.environment.arguments.get(expression.parameterId); + if (!argument) return fail("unbound-parameter", path, `Unbound parameter ${expression.parameterId}`); + if (argument.kind !== "value") + return fail("parameter-kind", path, `Parameter ${expression.parameterId} is an object target; use ref`); + canonicalTypeArgument(argument); + return this.value(argument.type, path, depth + 1); + } + case "alias": { + const alias = this.environment.aliases?.get(expression.definitionId); + if (!alias) return fail("unknown-alias", path, `Unknown type alias ${expression.definitionId}`); + if (this.aliases.includes(alias.id)) + return fail("recursive-alias", path, `Recursive value alias: ${[...this.aliases, alias.id].join(" -> ")}`); + const arguments_ = expression.arguments.map((argument, index) => + this.argument(argument, `${path}.arguments[${index}]`, depth + 1), + ); + const bindings = bindTypeParameters(alias.parameters, arguments_, this.environment, path); + this.aliases.push(alias.id); + try { + // Reuse this expansion budget/stack; lexical parameter maps are restored. + const previous = this.environment; + this.environment = { ...previous, arguments: bindings }; + try { + return this.value(alias.body, `${path}.${alias.id}`, depth + 1); + } finally { + this.environment = previous; + } + } finally { + this.aliases.pop(); + } + } + default: + return fail("invalid-type", path, "Unknown value type expression"); + } + } +} + +export const bindTypeParameters = ( + parameters: readonly TypeParameter[], + arguments_: readonly ClosedTypeArgument[], + environment: GenericTypeEnvironment, + path = "parameters", +): ReadonlyMap => { + if (parameters.length !== arguments_.length) + fail("type-arity", path, `Expected ${parameters.length} type arguments, received ${arguments_.length}`); + const bindings = new Map(); + const names = new Set(); + for (const [index, parameter] of parameters.entries()) { + if ( + !parameter.id || + !parameter.name || + parameter.name === "Self" || + bindings.has(parameter.id) || + names.has(parameter.name) + ) + fail("duplicate-parameter", path, `Invalid or duplicate parameter ${parameter.name}`); + names.add(parameter.name); + const argument = arguments_[index]; + if (parameter.kind !== argument.kind) + fail("parameter-kind", `${path}.${parameter.name}`, `Expected ${parameter.kind}, received ${argument.kind}`); + canonicalTypeArgument(argument); + bindings.set(parameter.id, structuredClone(argument)); + } + const substitution = new TypeSubstitution({ ...environment, arguments: bindings }); + for (const parameter of parameters) { + const argument = bindings.get(parameter.id)!; + if ( + parameter.kind === "value" && + argument.kind === "value" && + parameter.storable && + !isStorableType(argument.type, environment.storableMessage) + ) + fail( + "non-storable-argument", + `${path}.${parameter.name}`, + "State values cannot contain managed references or unsupported transport values", + ); + if (parameter.kind === "object" && argument.kind === "object") { + for (const bound of parameter.implements) { + const required = substitution.application(bound, `${path}.${parameter.name}.implements`); + if (!environment.implementsInterface(argument.target, required)) + fail("unsatisfied-bound", `${path}.${parameter.name}`, `Object target does not implement ${required}`); + } + } + } + return bindings; +}; diff --git a/src/capability-model/index.ts b/src/capability-model/index.ts index d1055f3..30449d6 100644 --- a/src/capability-model/index.ts +++ b/src/capability-model/index.ts @@ -2,3 +2,5 @@ export * from "./types.js"; export * from "./validation.js"; export * from "./evolution.js"; export * from "./migrations.js"; +export * from "./generics.js"; +export * from "./generic-packages.js"; diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index b5ef4c1..2f2c7aa 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -104,25 +104,25 @@ export interface AtomDefinition { export type InterfaceOperationMode = "call" | "watch-start" | "watch-stop" | "subscribe" | "unsubscribe"; -export interface InterfaceOperation { +export interface InterfaceOperation { id: OperationId; displayName: string; - inputType: ValueType; - outputType: ValueType; + inputType: Type; + outputType: Type; mode: InterfaceOperationMode; /** Required for watch-start/subscribe and absent for other modes. */ - eventType?: ValueType; + eventType?: Type; } -interface InterfaceMemberBase { +interface InterfaceMemberBase { id: MemberId; displayName: string; - operations: InterfaceOperation[]; + operations: InterfaceOperation[]; } -export interface ValueInterfaceMember extends InterfaceMemberBase { +export interface ValueInterfaceMember extends InterfaceMemberBase { kind: "value"; - valueType: ValueType; + valueType: Type; } export type EdgeCardinality = "optional-one" | "exactly-one" | "many" | "many-unique"; @@ -134,21 +134,27 @@ export type EdgeEndpointConstraint = interfaceRevisionId: InterfaceRevisionId; }; -export interface RelationshipInterfaceMember extends InterfaceMemberBase { +export interface RelationshipInterfaceMember< + Type = ValueType, + Target = EdgeEndpointConstraint, +> extends InterfaceMemberBase { kind: "relationship"; - target: EdgeEndpointConstraint; + target: Target; cardinality: EdgeCardinality; ordered: boolean; } /** A named callable capability that is not value or relationship sugar. */ -export interface OperationInterfaceMember extends InterfaceMemberBase { +export interface OperationInterfaceMember extends InterfaceMemberBase { kind: "operation"; - inputType: ValueType; - outputType: ValueType; + inputType: Type; + outputType: Type; } -export type InterfaceMember = ValueInterfaceMember | RelationshipInterfaceMember | OperationInterfaceMember; +export type InterfaceMember = + | ValueInterfaceMember + | RelationshipInterfaceMember + | OperationInterfaceMember; export interface InterfaceRevision { interfaceId: InterfaceId; @@ -156,6 +162,12 @@ export interface InterfaceRevision { displayName: string; source: SourceRevision; members: InterfaceMember[]; + /** Authored generic definition; never an executable contract by itself. */ + template?: import("./generics.js").GenericInterfaceTemplate; + /** Immutable provenance of a closed generic application. */ + application?: import("./generics.js").AppliedInterfaceIdentity; + requiredInterfaces?: InterfaceRevisionId[]; + argumentRequirements?: { target: ObjectExpectation; required: InterfaceRevisionId }[]; } export type StoragePolicy = { kind: "optimistic-register" } | { kind: "crdt-document"; updateType: ValueType }; @@ -233,6 +245,8 @@ interface PackageExportBase { inputType: ValueType; outputType: ValueType; dependencyPorts: DependencyPort[]; + /** Closed adapter served by the same immutable package build. */ + application?: { exportId: PackageExportId; arguments: import("./generics.js").ClosedTypeArgument[]; self?: AtomId }; } export interface PackageOperationExport extends PackageExportBase { @@ -254,6 +268,8 @@ export interface PackageConstructorExport extends PackageExportBase { export type PackageExport = PackageOperationExport | PackageFunctionExport | PackageConstructorExport; export interface PackageRevision { + genericExports?: import("./generic-packages.js").GenericPackageExport[]; + argumentRequirements?: { target: ObjectExpectation; required: InterfaceRevisionId }[]; migrationCatalog?: import("./migrations.js").MigrationCatalog; packageId: PackageId; revisionId: PackageRevisionId; diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 6597082..65c1b47 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -34,6 +34,9 @@ import type { WorkspaceRevision, } from "./types.js"; import { valueType } from "./types.js"; +import { appliedInterfaceId, GenericTypeError } from "./generics.js"; +import { specializePackageExport } from "./generic-packages.js"; +import { isDeepStrictEqual } from "node:util"; export type CapabilityValidationIssueCode = | "invalid-semantic-major" @@ -217,7 +220,12 @@ const validateValueType = ( } return; case "builtin": + if (!["unit", "watch-handle"].includes(type.name)) + issue(issues, "invalid-value-type", path, "Unknown builtin value type"); + return; case "scalar": + if (!["bool", "bytes", "double", "int32", "int64", "string", "uint32", "uint64"].includes(type.name)) + issue(issues, "invalid-value-type", path, "Unknown scalar value type"); return; case "message": requireText(issues, type.descriptorId, `${path}.descriptorId`, "Message descriptor identity"); @@ -244,6 +252,14 @@ const validateValueType = ( `Unknown interface revision ${type.expectation.interfaceRevisionId}`, ); } + return; + default: + issue( + issues, + "invalid-value-type", + path, + "Installed contracts require closed value types; unresolved authoring expressions are not executable", + ); } }; @@ -458,9 +474,29 @@ const collectIdentityIndexes = ( for (const [interfaceIndex, revision] of workspace.interfaceImports.entries()) { const path = `interfaceImports[${interfaceIndex}]`; requireText(issues, revision.interfaceId, `${path}.interfaceId`, "Interface ID"); + if (revision.template) + issue(issues, "invalid-value-type", path, "Unapplied generic interface cannot enter an installed workspace"); requireText(issues, revision.revisionId, `${path}.revisionId`, "Interface revision ID"); requireText(issues, revision.displayName, `${path}.displayName`, "Interface name"); validateSource(issues, revision.source, `${path}.source`); + if (revision.application) { + try { + if ( + appliedInterfaceId(revision.application) !== revision.revisionId || + revision.application.source.repository !== revision.source.repository || + revision.application.source.commit !== revision.source.commit + ) + issue( + issues, + "invalid-value-type", + path, + "Applied interface identity does not match its exact provenance and arguments", + ); + } catch (error) { + if (!(error instanceof GenericTypeError)) throw error; + issue(issues, "invalid-value-type", path, error.message); + } + } const memberIds = new Set(); const operations = new Map(); for (const [memberIndex, member] of revision.members.entries()) { @@ -516,6 +552,35 @@ const collectIdentityIndexes = ( const exports = new Map(); for (const [exportIndex, entry] of revision.exports.entries()) { const exportPath = `${path}.exports[${exportIndex}]`; + if (entry.application) { + try { + const definition = revision.genericExports?.find((candidate) => candidate.id === entry.application!.exportId); + if (!definition) throw new Error("Missing generic export definition"); + const expected = specializePackageExport(revision, definition, entry.application.arguments, { + arguments: new Map(), + self: entry.application.self, + applyInterface: (id, args) => { + const applied = workspace.interfaceImports.find( + (contract) => + contract.application?.definitionId === id && isDeepStrictEqual(contract.application.arguments, args), + ); + if (applied) return applied.revisionId; + const concrete = workspace.interfaceImports.find((contract) => contract.revisionId === id); + if (concrete && !concrete.template && args.length === 0) return id; + throw new Error(`Missing closed interface application ${id}`); + }, + // Retained obligations are discharged against candidate conformances below. + implementsInterface: (target, required) => + (revision.argumentRequirements ?? []).some( + (obligation) => obligation.required === required && isDeepStrictEqual(obligation.target, target), + ), + }); + if (!isDeepStrictEqual(entry, expected)) + throw new Error("Specialized export differs from its definition, source or arguments"); + } catch (error) { + issue(issues, "invalid-operation", exportPath, error instanceof Error ? error.message : String(error)); + } + } requireText(issues, entry.id, `${exportPath}.id`, "Package export ID"); requireText(issues, entry.displayName, `${exportPath}.displayName`, "Package export name"); if (exports.has(entry.id)) { @@ -655,8 +720,54 @@ const validateInterfaces = ( issues: CapabilityValidationIssue[], indexes: ValidationIndexes, ) => { + const implies = ( + actual: InterfaceRevisionId, + required: InterfaceRevisionId, + visited = new Set(), + ): boolean => { + if (actual === required) return true; + if (visited.has(actual)) return false; + visited.add(actual); + return (indexes.interfaces.get(actual)?.revision.requiredInterfaces ?? []).some((entry) => + implies(entry, required, visited), + ); + }; + for (const [packageIndex, pkg] of workspace.packageImports.entries()) { + for (const obligation of pkg.argumentRequirements ?? []) { + const satisfied = + obligation.target.kind === "atom" + ? indexes.conformances.has(conformanceKey(obligation.target.atomId, obligation.required)) + : implies(obligation.target.interfaceRevisionId, obligation.required); + if (!satisfied) + issue( + issues, + "unsatisfied-interface", + `packageImports[${packageIndex}]`, + `Generic argument does not implement ${obligation.required}`, + ); + } + } for (const [interfaceIndex, revision] of workspace.interfaceImports.entries()) { const path = `interfaceImports[${interfaceIndex}]`; + for (const required of revision.requiredInterfaces ?? []) { + if (!indexes.interfaces.has(required)) + issue(issues, "unresolved-reference", path, `Unknown prerequisite interface ${required}`); + else if (implies(required, revision.revisionId)) + issue( + issues, + "cyclic-conformance-requirement", + path, + `Cyclic prerequisite involving ${revision.revisionId} and ${required}`, + ); + } + for (const obligation of revision.argumentRequirements ?? []) { + const satisfied = + obligation.target.kind === "atom" + ? indexes.conformances.has(conformanceKey(obligation.target.atomId, obligation.required)) + : implies(obligation.target.interfaceRevisionId, obligation.required); + if (!satisfied) + issue(issues, "unsatisfied-interface", path, `Generic argument does not implement ${obligation.required}`); + } for (const [memberIndex, member] of revision.members.entries()) { const memberPath = `${path}.members[${memberIndex}]`; if (member.kind === "value") { @@ -1282,6 +1393,12 @@ const validateConformances = ( } const bindings = new Map(); + for (const required of interfaceEntry.revision.requiredInterfaces ?? []) { + const requiredKey = conformanceKey(conformance.atomId, required); + if (!indexes.conformances.has(requiredKey)) + issue(issues, "unsatisfied-interface", path, `Conformance requires ${conformance.atomId} as ${required}`); + else requirementGraph.get(key)?.add(requiredKey); + } for (const [bindingIndex, entry] of conformance.operationBindings.entries()) { const bindingPath = `${path}.operationBindings[${bindingIndex}]`; if (bindings.has(entry.operationId)) { @@ -1957,6 +2074,9 @@ export const computeCapabilityClosure = ( atomId: conformance.source.atomId, interfaceRevisionId: conformance.source.interfaceRevisionId, }); + for (const interfaceRevisionId of plan.interfaces.get(root.interfaceRevisionId)?.requiredInterfaces ?? []) { + queued.push({ atomId: root.atomId, interfaceRevisionId }); + } for (const binding of conformance.operationBindings.values()) { if (binding.kind === "state") { attachments.add(binding.slotId); diff --git a/test/generic-packages.test.ts b/test/generic-packages.test.ts new file mode 100644 index 0000000..1d8525c --- /dev/null +++ b/test/generic-packages.test.ts @@ -0,0 +1,199 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { execFile } from "node:child_process"; +import { promisify } from "node:util"; +import { createRequire } from "node:module"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; +import { generateTypeScriptBindings, generatePackageDescriptor } from "../src/bindings/index.js"; +import { genericImplementationType } from "../src/bindings/generics.js"; +import { compileWorkspaceRevision, runtimeContracts } from "../src/capability-model/index.js"; +import { generateAppliedClientContracts } from "../src/bindings/client.js"; +const source = { repository: "https://example.test/generic.git", commit: "a".repeat(40) }; +test("generic port aliases retain their defining scope, including shadowed alias names", () => { + const iface = compileCapabilityResourceSource( + 'type Box = list; interface Data id "data" revision "data@1" {value payload id "payload" : Box {get id "payload:get";}}', + { source }, + ); + assert.ok(iface.ok, JSON.stringify(iface.diagnostics)); + if (iface.resource.kind !== "interface") throw new Error("expected interface"); + const pkg = compileCapabilityResourceSource( + 'import interface Data; type Box = optional; package P id "p" revision "p@1" {operation fetch id "data@1" : unit -> list> mode call receiver any requires {interface data id "data" : Data>;};}', + { source, environment: { interfaces: new Map([["Data", iface.resource.revision]]) } }, + ); + assert.ok(pkg.ok, JSON.stringify(pkg.diagnostics)); + if (pkg.resource.kind !== "package") throw new Error("expected package"); + const generated = generateTypeScriptBindings( + { + format: "quixos-bindings", + version: 1, + interfaces: [], + interfaceTemplates: [iface.resource.revision], + packages: [pkg.resource.revision], + }, + pkg.resource.revision.revisionId, + ); + assert.match(generated, /"payload.get":\(\)=>Promise>/); +}); +const definition = () => { + const result = compileCapabilityResourceSource( + `package Generic id "generic" revision "generic@1" { + operation echo id "echo" : T -> T mode call receiver any; + }`, + { source }, + ); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + if (result.resource.kind !== "package") throw new Error("expected package"); + return result.resource.revision; +}; +test("generic package exports specialize per binding without changing immutable source identity", () => { + const iface = compileCapabilityResourceSource( + `interface Echo id "echo-interface" revision "echo-interface@1" { + operation echo id "echo-member" : T -> T {call id "echo-call";} + }`, + { source }, + ); + assert.ok(iface.ok); + if (iface.resource.kind !== "interface") throw new Error("expected interface"); + const pkg = definition(); + const result = compileCapabilitySource( + `workspace W id "w" revision "w@1" commit "${source.commit}" { + import interface Echo; import package Generic; atom Thing id "thing"; + conform Thing as Echo id "string-echo" {bind echo.call to package Generic.echo;} + conform Thing as Echo> id "list-echo" {bind echo.call to package Generic.echo>;} + }`, + "workspace.qx", + { interfaces: new Map([["Echo", iface.resource.revision]]), packages: new Map([["Generic", pkg]]) }, + ); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + assert.equal(pkg.exports.length, 0, "source definition was not mutated"); + const closed = result.workspace.packageImports[0]; + assert.equal(closed.revisionId, pkg.revisionId); + assert.equal(closed.exports.length, 2); + assert.notEqual(closed.exports[0].id, closed.exports[1].id); + const oneApplication = structuredClone(result.workspace); + oneApplication.packageImports[0].exports.splice(1); + oneApplication.conformances.splice(1); + assert.notDeepEqual( + runtimeContracts(oneApplication), + runtimeContracts(result.workspace), + "New specializations invalidate the executable contract even with unchanged package source", + ); + const schema = { + format: "quixos-bindings" as const, + version: 1 as const, + interfaces: result.workspace.interfaceImports, + packages: [closed], + }; + const generated = generateTypeScriptBindings(schema, pkg.revisionId); + assert.match(generated, /"echo":\s*\(/); + for (const entry of closed.exports) { + assert.ok(generated.includes(entry.id)); + assert.ok(generatePackageDescriptor(schema, pkg.revisionId).includes(entry.id)); + } + const forged = structuredClone(result.workspace); + forged.packageImports[0].exports[0].outputType = { kind: "scalar", name: "bool" }; + const rejected = compileWorkspaceRevision(forged); + assert.equal(rejected.ok, false); + if (!rejected.ok) assert.ok(rejected.issues.some((issue) => issue.message.includes("Specialized export differs"))); +}); +test("generated universal implementations compile and cannot assume a concrete value type", async () => { + const pkg = definition(); + const signature = genericImplementationType(pkg.genericExports![0], [], () => { + throw new Error("unexpected concrete type"); + }); + const directory = await fs.mkdtemp(path.join(os.tmpdir(), "qx-generic-ts-")); + const require = createRequire(import.meta.url); + const compiler = path.join(path.dirname(require.resolve("typescript/package.json")), "bin/tsc"); + const run = promisify(execFile); + const preamble = `type QxObjectRef={readonly identity:T}; type QxContextLifecycle={signal?:AbortSignal}; type Handler=${signature};\n`; + try { + const file = path.join(directory, "generic.ts"); + await fs.writeFile(file, preamble + `const handler:Handler=({input})=>input;`); + await run(process.execPath, [compiler, "--ignoreConfig", "--noEmit", "--strict", "--target", "es2023", file]); + await fs.writeFile(file, preamble + `const handler:Handler=({input})=>"not universally T";`); + await assert.rejects( + run(process.execPath, [compiler, "--ignoreConfig", "--noEmit", "--strict", "--target", "es2023", file]), + (error) => { + assert.match(String((error as { stdout: string }).stdout), /not assignable/); + return true; + }, + ); + } finally { + await fs.rm(directory, { recursive: true, force: true }); + } +}); + +test("generic Self follows the receiver parameter, never a preceding export", () => { + const compile = (declaration: string) => + compileCapabilityResourceSource(`package P id "p" revision "p@1" {${declaration}}`, { source }); + const valid = compile('operation identity id "identity" : unit -> ref mode call receiver object T;'); + assert.ok(valid.ok, JSON.stringify(valid.diagnostics)); + if (valid.resource.kind !== "package") throw new Error("expected package"); + const definition = valid.resource.revision.genericExports![0]; + assert.deepEqual(definition.outputType, { + kind: "object-ref", + expectation: { kind: "parameter", parameterId: definition.parameters[0].id }, + }); + assert.equal(compile('function identity id "identity" : T -> ref;').ok, false); + assert.equal( + compile('operation events id "events" : unit -> watch-handle mode watch-start receiver any;').ok, + false, + ); +}); + +test("typed presentation and factory consumers preserve distinct closed applications and return targets", async () => { + const interfaces = new Map(); + for (const text of [ + 'interface Presentation id "presentation" revision "presentation@1" {operation props id "props" : unit -> Props {call id "props:get";}}', + 'interface Factory id "factory" revision "factory@1" {operation create id "create" : unit -> ref {call id "create:call";}}', + ]) { + const result = compileCapabilityResourceSource(text, { source }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + interfaces.set(result.resource.revision.displayName, result.resource.revision); + } + const pkg = compileCapabilityResourceSource( + `import interface Presentation; import interface Factory; + external atom Note id "note"; external atom Notebook id "notebook"; + package Views id "views" revision "views@1" { + operation note id "note-view" : unit -> unit mode call receiver any requires {interface props id "props" : Presentation;}>;}; + operation notebook id "notebook-view" : unit -> unit mode call receiver any requires {interface props id "props" : Presentation;}; + operation factory id "factory-view" : unit -> unit mode call receiver any requires {interface factory id "factory" : Factory;}; + }`, + { source, environment: { interfaces } }, + ); + assert.ok(pkg.ok, JSON.stringify(pkg.diagnostics)); + const closed = pkg.resource.specializations!; + const presentation = closed.find( + (contract) => + contract.application?.definitionId === "presentation@1" && JSON.stringify(contract).includes('"title"'), + )!; + const factory = closed.find((contract) => contract.application?.definitionId === "factory@1")!; + const contracts = generateAppliedClientContracts(closed); + const directory = await fs.mkdtemp(path.join(os.tmpdir(), "qx-presentation-types-")); + const compiler = path.join( + path.dirname(createRequire(import.meta.url).resolve("typescript/package.json")), + "bin/tsc", + ); + const run = promisify(execFile); + const usage = `type Props=CapabilityOutput<${JSON.stringify(presentation.revisionId)},"props:get">; + type Created=CapabilityOutput<${JSON.stringify(factory.revisionId)},"create:call">; + const render=({camino,render}:{camino:Props;render:{onSelect:(note:Created)=>void;compact:boolean}})=>{render.onSelect(camino.note);return camino.title;};\n`; + try { + const file = path.join(directory, "consumer.ts"); + await fs.writeFile(file, contracts + usage); + await run(process.execPath, [compiler, "--ignoreConfig", "--noEmit", "--strict", "--target", "es2023", file]); + await fs.writeFile(file, contracts + usage + "const wrong=(props:Props)=>props.count;"); + await assert.rejects( + run(process.execPath, [compiler, "--ignoreConfig", "--noEmit", "--strict", "--target", "es2023", file]), + (error) => { + assert.match(String((error as { stdout: string }).stdout), /count.*does not exist/); + return true; + }, + ); + } finally { + await fs.rm(directory, { recursive: true, force: true }); + } +}); diff --git a/test/generics.test.ts b/test/generics.test.ts new file mode 100644 index 0000000..b2e86ba --- /dev/null +++ b/test/generics.test.ts @@ -0,0 +1,601 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; +import { generateTypeScriptBindings } from "../src/bindings/index.js"; +import { generateClientContracts } from "../src/bindings/client.js"; +import { + TypeSubstitution, + appliedInterfaceId, + bindTypeParameters, + canonicalTypeArgument, + instantiateInterface, + capabilityId, + isStorableType, + valueType, + computeCapabilityClosure, + compileWorkspaceRevision, + type ClosedTypeArgument, + type GenericTypeEnvironment, + type ValueTypeExpression, +} from "../src/capability-model/index.js"; + +test("unused generic definitions prove symbolic bounds and storable aliases", () => { + const source = { repository: "https://example.test/bounds.git", commit: "a".repeat(40) }; + const interfaces = new Map(); + for (const text of [ + 'interface Named id "named" revision "named@1" {}', + 'import interface Named; interface Detailed id "detailed" revision "detailed@1" requires Named {}', + 'import interface Named; interface Requires id "requires" revision "requires@1" {}', + 'interface Stored id "stored" revision "stored@1" {}', + ]) { + const result = compileCapabilityResourceSource(text, { source, environment: { interfaces } }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + assert.equal(result.resource.kind, "interface"); + interfaces.set(result.resource.revision.displayName, result.resource.revision); + } + const compile = (body: string) => compileCapabilityResourceSource(body, { source, environment: { interfaces } }); + const bad = compile( + 'import interface Requires; interface Bad id "bad" revision "bad@1" requires Requires {}', + ); + assert.equal(bad.ok, false); + assert.match(JSON.stringify(bad.diagnostics), /does not prove/); + const good = compile( + 'import interface Detailed; import interface Requires; interface Good id "good" revision "good@1" requires Requires {}', + ); + assert.ok(good.ok, JSON.stringify(good.diagnostics)); + const alias = compile( + 'import interface Stored; type Values = list>; interface Good id "good" revision "good@1" requires Stored> {}', + ); + assert.ok(alias.ok, JSON.stringify(alias.diagnostics)); + const nonstorable = compile( + 'import interface Stored; interface Bad id "bad" revision "bad@1" requires Stored {}', + ); + assert.equal(nonstorable.ok, false); +}); + +const note = capabilityId.atom("atom:note"); +test("Self remains contextual through local aliases", () => { + const result = compileCapabilityResourceSource( + 'type Me = ref; type Mine = optional; interface Identity id "identity" revision "identity@1" {value mine id "mine" : Mine {get id "mine:get";}}', + { source: { repository: "https://example.test/self.git", commit: "a".repeat(40) } }, + ); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + if (result.resource.kind !== "interface") throw new Error("expected interface"); + assert.equal(result.resource.revision.template?.usesSelf, true); + const closed = instantiateInterface(result.resource.revision, [], { ...environment(), self: note }); + assert.deepEqual(closed.members[0].operations[0].outputType, valueType.optional(valueType.atomRef(note))); +}); +const named = capabilityId.interfaceRevision("interface:named@1"); +const environment = (arguments_: [string, ClosedTypeArgument][] = []): GenericTypeEnvironment => ({ + arguments: new Map(arguments_), + applyInterface: (id, args) => { + assert.equal(args.length, 0); + return id; + }, + implementsInterface: (target, required) => target.kind === "atom" && target.atomId === note && required === named, +}); + +test("substitution reaches nested records, lists, optionals and object references", () => { + const substitute = new TypeSubstitution( + environment([ + ["scope/value", { kind: "value", type: valueType.int64 }], + ["scope/object", { kind: "object", target: { kind: "atom", atomId: note } }], + ]), + ); + const result = substitute.value({ + kind: "record", + fields: { + values: { kind: "list", value: { kind: "optional", value: { kind: "parameter", parameterId: "scope/value" } } }, + target: { kind: "object-ref", expectation: { kind: "parameter", parameterId: "scope/object" } }, + }, + }); + assert.deepEqual(result, { + kind: "record", + fields: { + values: valueType.list(valueType.optional(valueType.int64)), + target: valueType.atomRef(note), + }, + }); + assert.equal(isStorableType(result), false); +}); + +test("Self is the exact implementing atom and cannot be unbound", () => { + const expression = { kind: "object-ref", expectation: { kind: "self" } } as const; + assert.throws(() => new TypeSubstitution(environment()).value(expression), /Self requires an implementing atom/); + assert.deepEqual(new TypeSubstitution({ ...environment(), self: note }).value(expression), valueType.atomRef(note)); +}); + +test("parameter kinds and missing parameters fail closed", () => { + const substitute = new TypeSubstitution( + environment([["T", { kind: "object", target: { kind: "atom", atomId: note } }]]), + ); + assert.throws(() => substitute.value({ kind: "parameter", parameterId: "T" }), /use ref/); + assert.throws(() => substitute.value({ kind: "parameter", parameterId: "unknown" }), /Unbound parameter/); + assert.throws( + () => bindTypeParameters([{ id: "T", name: "T", kind: "value" }], [], environment()), + /Expected 1 type arguments/, + ); + assert.throws( + () => + bindTypeParameters( + [{ id: "T", name: "T", kind: "value" }], + [{ kind: "object", target: { kind: "atom", atomId: note } }], + environment(), + ), + /Expected value, received object/, + ); +}); + +test("bounds require evidence and storable constraints inspect nested values", () => { + const parameters = [ + { id: "T", name: "T", kind: "object", implements: [{ definitionId: named, arguments: [] }] }, + ] as const; + const mutableParameters = parameters.map((p) => ({ + ...p, + implements: p.implements.map((b) => ({ ...b, arguments: [] })), + })); + assert.equal( + bindTypeParameters(mutableParameters, [{ kind: "object", target: { kind: "atom", atomId: note } }], environment()) + .size, + 1, + ); + assert.throws( + () => + bindTypeParameters( + mutableParameters, + [{ kind: "object", target: { kind: "atom", atomId: capabilityId.atom("person") } }], + environment(), + ), + /does not implement/, + ); + assert.throws( + () => + bindTypeParameters( + [{ kind: "value", id: "V", name: "V", storable: true }], + [{ kind: "value", type: valueType.list(valueType.optional(valueType.atomRef(note))) }], + environment(), + ), + /cannot contain managed references/, + ); + assert.equal(isStorableType(valueType.message("opaque")), false); + assert.equal(isStorableType(valueType.watchHandle), false); + assert.equal( + isStorableType(valueType.message("checked"), (id) => id === "checked"), + true, + ); +}); + +test("closed applications canonicalize records without erasing nominal identity or provenance", () => { + const a: ClosedTypeArgument = { + kind: "value", + type: { kind: "record", fields: { b: valueType.int64, a: valueType.string } }, + }; + const b: ClosedTypeArgument = { + kind: "value", + type: { kind: "record", fields: { a: valueType.string, b: valueType.int64 } }, + }; + assert.equal(canonicalTypeArgument(a), canonicalTypeArgument(b)); + const application = { + definitionId: named, + source: { repository: "https://example.test/named.git", commit: "a".repeat(40) }, + arguments: [a], + }; + assert.equal(appliedInterfaceId(application), appliedInterfaceId({ ...application, arguments: [b] })); + assert.notEqual(appliedInterfaceId(application), appliedInterfaceId({ ...application, self: note })); + assert.notEqual( + appliedInterfaceId(application), + appliedInterfaceId({ ...application, source: { ...application.source, commit: "b".repeat(40) } }), + ); + assert.throws( + () => + canonicalTypeArgument({ + kind: "value", + type: { kind: "parameter", parameterId: "T" }, + } as unknown as ClosedTypeArgument), + /Expected a closed value type/, + ); +}); + +test("aliases use lexical parameter identities, preserve outer bindings and reject cycles", () => { + const env = environment([["outer/T", { kind: "value", type: valueType.string }]]); + env.aliases = new Map([ + [ + "Box", + { + id: "Box", + parameters: [{ id: "box/T", name: "T", kind: "value" }], + body: { kind: "list", value: { kind: "parameter", parameterId: "box/T" } }, + }, + ], + ["Loop", { id: "Loop", parameters: [], body: { kind: "alias", definitionId: "Loop", arguments: [] } }], + ]); + const substitute = new TypeSubstitution(env); + assert.deepEqual( + substitute.value({ + kind: "alias", + definitionId: "Box", + arguments: [{ kind: "value", type: { kind: "parameter", parameterId: "outer/T" } }], + }), + valueType.list(valueType.string), + ); + assert.deepEqual(substitute.value({ kind: "parameter", parameterId: "outer/T" }), valueType.string); + assert.throws(() => substitute.value({ kind: "alias", definitionId: "Loop", arguments: [] }), /Loop -> Loop/); +}); + +test("excessively deep types produce a bounded diagnostic", () => { + let expression: ValueTypeExpression = valueType.string; + for (let index = 0; index < 200; index++) expression = { kind: "list", value: expression }; + assert.throws(() => new TypeSubstitution(environment()).value(expression), /depth or expansion budget/); +}); + +const source = { repository: "https://example.test/contracts.git", commit: "a".repeat(40) }; +const reader = () => { + const result = compileCapabilityResourceSource( + `interface Reader id "reader" revision "reader@1" { + value values id "values" : list> { get id "values:get"; watch start id "values:watch" stop id "values:stop"; } + }`, + { source }, + ); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + assert.equal(result.resource.kind, "interface"); + if (result.resource.kind !== "interface") throw new Error("expected interface"); + return result.resource.revision; +}; + +test("generic interface source retains its template and produces closed package/codegen contracts", () => { + const definition = reader(); + assert.equal(definition.template?.parameters[0].name, "V"); + const result = compileCapabilityResourceSource( + `import interface Reader; + package Client id "client" revision "client@1" { + function run id "run" : unit -> list> requires { interface reader id "reader-port" : Reader; }; + }`, + { source, environment: { interfaces: new Map([["Reader", definition]]) } }, + ); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + if (result.resource.kind !== "package") throw new Error("expected package"); + assert.equal(result.resource.specializations?.length, 1); + const closed = result.resource.specializations![0]; + assert.deepEqual(closed.members[0].operations[0].outputType, valueType.list(valueType.optional(valueType.string))); + assert.deepEqual(closed.members[0].operations[1].eventType, closed.members[0].operations[0].outputType); + const generated = generateTypeScriptBindings( + { format: "quixos-bindings", version: 1, interfaces: [closed], packages: [result.resource.revision] }, + "client@1", + ); + assert.match(generated, /Array<\(string \| null\)>/); + assert.ok(generated.includes(closed.revisionId)); +}); + +test("generic conformances bind state against specialized signatures", () => { + const result = compileCapabilitySource( + `workspace Demo id "ws" revision "ws@1" commit "${source.commit}" { + atom Document id "document"; + import interface Reader; + conform Document as Reader id "reader-conformance" { + private state Values id "values-slot" on Document : list> policy optimistic-register; + bind values.get to state Values.read; + bind values.watch-start to state Values.watch-start; + bind values.watch-stop to state Values.watch-stop; + } + }`, + "workspace.qx", + { interfaces: new Map([["Reader", reader()]]) }, + ); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + assert.equal(result.workspace.interfaceImports.length, 1); + assert.equal(result.workspace.interfaceImports[0].template, undefined); + assert.equal(result.workspace.conformances[0].interfaceRevisionId, result.workspace.interfaceImports[0].revisionId); +}); + +test("source rejects wrong generic arity and an unapplied interface", () => { + for (const input of [ + "interface-ref", + "interface-ref>", + "interface-ref>", + ]) { + const result = compileCapabilityResourceSource( + `import interface Reader; external atom Note id "note"; + package P id "p" revision "p@1" { function f id "f" : ${input} -> unit; }`, + { source, environment: { interfaces: new Map([["Reader", reader()]]) } }, + ); + assert.equal(result.ok, false, input); + assert.match(result.diagnostics[0].code, /type-arity|parameter-kind/); + } +}); + +test("package receivers and injected dependencies select exact applications", () => { + const definition = reader(); + const summary = compileCapabilityResourceSource( + `interface Summary id "summary" revision "summary@1" { + value summary id "summary-value" : list> { get id "summary:get"; } + }`, + { source }, + ); + assert.ok(summary.ok); + if (summary.resource.kind !== "interface") throw new Error("expected interface"); + const pkg = compileCapabilityResourceSource( + `import interface Reader; + package P id "p" revision "p@1" { + operation summarize id "summarize" : unit -> list> mode call receiver interfaces [Reader] + requires { interface reader id "reader-port" : Reader; }; + }`, + { source, environment: { interfaces: new Map([["Reader", definition]]) } }, + ); + assert.ok(pkg.ok, JSON.stringify(pkg.diagnostics)); + if (pkg.resource.kind !== "package") throw new Error("expected package"); + const result = compileCapabilitySource( + `workspace W id "w" revision "w@1" commit "${source.commit}" { + import interface Reader; import interface Summary; import package P; + atom Note id "note"; + conform Note as Reader id "reader-conformance" { + private state Values id "values" on Note : list> policy optimistic-register; + bind values.get to state Values.read; + bind values.watch-start to state Values.watch-start; + bind values.watch-stop to state Values.watch-stop; + } + conform Note as Summary id "summary-conformance" { + bind summary.get to package P.summarize with { reader to interface Reader; }; + } + }`, + "workspace.qx", + { + interfaces: new Map([ + ["Reader", definition], + ["Summary", summary.resource.revision], + ]), + interfaceClosure: pkg.resource.specializations, + packages: new Map([["P", pkg.resource.revision]]), + }, + ); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); +}); + +test("named generic value aliases elaborate through nested lists", () => { + const result = compileCapabilityResourceSource( + `type Page = record { items: list; next: optional; }; + package P id "p" revision "p@1" { function f id "f" : unit -> Page; }`, + { source }, + ); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + if (result.resource.kind !== "package") throw new Error("expected package"); + assert.deepEqual(result.resource.revision.exports[0].outputType, { + kind: "record", + fields: { items: valueType.list(valueType.int64), next: valueType.optional(valueType.string) }, + }); +}); + +test("Self specializes to the implementing atom rather than an erased interface", () => { + const definition = compileCapabilityResourceSource( + `interface Identity id "identity" revision "identity@1" { + operation identity id "identity-member" : ref -> ref { call id "identity-call"; } + }`, + { source }, + ); + assert.ok(definition.ok, JSON.stringify(definition.diagnostics)); + if (definition.resource.kind !== "interface") throw new Error("expected interface"); + assert.equal(definition.resource.revision.template?.usesSelf, true); + const { revision } = definition.resource; + const first = instantiateInterface(revision, [], { ...environment(), self: note }); + const second = instantiateInterface(revision, [], { ...environment(), self: capabilityId.atom("other") }); + assert.deepEqual(first.members[0].operations[0].outputType, valueType.atomRef(note)); + assert.notEqual(first.revisionId, second.revisionId); +}); + +test("package Self comes from an exact receiver, never a previous export", () => { + const valid = compileCapabilityResourceSource( + `type Owned = ref; external atom Note id "note"; + package P id "p" revision "p@1" { + operation identity id "identity" : ref -> Owned mode call receiver atom Note; + }`, + { source }, + ); + assert.ok(valid.ok, JSON.stringify(valid.diagnostics)); + if (valid.resource.kind !== "package") throw new Error("expected package"); + assert.deepEqual(valid.resource.revision.exports[0].outputType, valueType.atomRef(capabilityId.atom("note"))); + const invalid = compileCapabilityResourceSource( + `external atom Note id "note"; + package P id "p" revision "p@1" { + operation identity id "identity" : ref -> ref mode call receiver atom Note; + function bad id "bad" : unit -> ref; + }`, + { source }, + ); + assert.equal(invalid.ok, false); + assert.equal(invalid.diagnostics[0].code, "unbound-self"); +}); + +test("host generation rejects unresolved definitions and operation-only dispatch ambiguity", () => { + const definition = reader(); + assert.throws(() => generateClientContracts([definition], {}), /closed interface/); + const first = instantiateInterface(definition, [{ kind: "value", type: valueType.string }], environment()); + const second = instantiateInterface(definition, [{ kind: "value", type: valueType.int32 }], environment()); + assert.throws(() => generateClientContracts([first, second], {}), /ambiguous/); +}); + +test("finite recursive generic interface references share the same closed application", () => { + const definition = compileCapabilityResourceSource( + `interface Node id "node" revision "node@1" { + value next id "next" : optional>> { get id "next:get"; } + }`, + { source }, + ); + assert.ok(definition.ok, JSON.stringify(definition.diagnostics)); + if (definition.resource.kind !== "interface") throw new Error("expected interface"); + const result = compileCapabilityResourceSource( + `import interface Node; + package P id "p" revision "p@1" { function f id "f" : interface-ref> -> unit; } + `, + { source, environment: { interfaces: new Map([["Node", definition.resource.revision]]) } }, + ); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const [closed] = result.resource.specializations!; + assert.equal(result.resource.specializations!.length, 1); + assert.deepEqual( + closed.members[0].operations[0].outputType, + valueType.optional(valueType.interfaceRef(closed.revisionId)), + ); +}); + +test("expanding recursive generic interfaces fail with a bounded diagnostic", () => { + const definition = compileCapabilityResourceSource( + `interface Node id "node" revision "node@1" { + value next id "next" : interface-ref>> { get id "next:get"; } + }`, + { source }, + ); + assert.ok(definition.ok, JSON.stringify(definition.diagnostics)); + if (definition.resource.kind !== "interface") throw new Error("expected interface"); + const result = compileCapabilityResourceSource( + `import interface Node; + package P id "p" revision "p@1" { function f id "f" : interface-ref> -> unit; } + `, + { source, environment: { interfaces: new Map([["Node", definition.resource.revision]]) } }, + ); + assert.equal(result.ok, false); + assert.equal(result.diagnostics[0].code, "recursive-application"); +}); + +test("storable parameters do not imply support for RPC-only records", () => { + assert.equal(isStorableType({ kind: "record", fields: { name: valueType.string } }), false); + assert.equal(isStorableType(valueType.list(valueType.optional(valueType.string))), true); +}); + +test("generic declarations reject duplicate members before specialization", () => { + const result = compileCapabilityResourceSource( + `interface Bad id "bad" revision "bad@1" { + value first id "duplicate" : V { get id "first:get"; } + value second id "duplicate" : V { get id "second:get"; } + }`, + { source }, + ); + assert.equal(result.ok, false); + assert.equal(result.diagnostics[0].code, "duplicate-interface-member"); +}); + +test("unused templates still check nested application arity and alias cycles", () => { + const malformed = compileCapabilityResourceSource( + `import interface Reader; + interface Bad id "bad" revision "bad@1" { + value item id "item" : interface-ref> { get id "get"; } + }`, + { source, environment: { interfaces: new Map([["Reader", reader()]]) } }, + ); + assert.equal(malformed.ok, false); + assert.equal(malformed.diagnostics[0].code, "type-arity"); + const cycle = compileCapabilityResourceSource( + `type Loop = list>; + interface Bad id "bad" revision "bad@1" { + value item id "item" : Loop { get id "get"; } + }`, + { source }, + ); + assert.equal(cycle.ok, false); + assert.equal(cycle.diagnostics[0].code, "recursive-alias"); +}); + +test("Self in a prerequisite contributes to the outer application identity", () => { + const identity = compileCapabilityResourceSource( + `interface Identity id "identity" revision "identity@1" { + value self id "self" : ref { get id "self:get"; } + }`, + { source }, + ); + assert.ok(identity.ok); + if (identity.resource.kind !== "interface") throw new Error("expected interface"); + const outer = compileCapabilityResourceSource( + `import interface Identity; + interface Outer id "outer" revision "outer@1" requires Identity {}`, + { source, environment: { interfaces: new Map([["Identity", identity.resource.revision]]) } }, + ); + assert.ok(outer.ok, JSON.stringify(outer.diagnostics)); + if (outer.resource.kind !== "interface") throw new Error("expected interface"); + assert.equal(outer.resource.revision.template?.usesSelf, true); +}); + +test("object bounds are discharged against the complete candidate, not source order", () => { + const namedResult = compileCapabilityResourceSource(`interface Named id "named" revision "named@1" {}`, { source }); + assert.ok(namedResult.ok); + if (namedResult.resource.kind !== "interface") throw new Error("expected interface"); + const named = namedResult.resource.revision; + const bounded = compileCapabilityResourceSource( + `import interface Named; + interface Container id "container" revision "container@1" {}`, + { source, environment: { interfaces: new Map([["Named", named]]) } }, + ); + assert.ok(bounded.ok, JSON.stringify(bounded.diagnostics)); + if (bounded.resource.kind !== "interface") throw new Error("expected interface"); + const container = bounded.resource.revision; + const compile = (evidence: string) => + compileCapabilitySource( + `workspace W id "w" revision "w@1" commit "${source.commit}" { + import interface Named; import interface Container; + atom Note id "note"; atom Index id "index"; + conform Index as Container id "index-container" {} + ${evidence} + }`, + "workspace.qx", + { + interfaces: new Map([ + ["Named", named], + ["Container", container], + ]), + }, + ); + const missing = compile(""); + assert.equal(missing.ok, false); + assert.ok(missing.diagnostics.some((issue) => issue.code === "unsatisfied-interface")); + const valid = compile('conform Note as Named id "note-named" {}'); + assert.ok(valid.ok, JSON.stringify(valid.diagnostics)); +}); + +test("prerequisites require explicit conformances and remain in the capability closure", () => { + const baseResult = compileCapabilityResourceSource(`interface Base id "base" revision "base@1" {}`, { source }); + assert.ok(baseResult.ok); + if (baseResult.resource.kind !== "interface") throw new Error("expected interface"); + const base = baseResult.resource.revision; + const derivedResult = compileCapabilityResourceSource( + `import interface Base; + interface Derived id "derived" revision "derived@1" requires Base {}`, + { + source, + environment: { interfaces: new Map([["Base", base]]) }, + }, + ); + assert.ok(derivedResult.ok, JSON.stringify(derivedResult.diagnostics)); + if (derivedResult.resource.kind !== "interface") throw new Error("expected interface"); + const derived = derivedResult.resource.revision; + const compile = (evidence: string) => + compileCapabilitySource( + `workspace W id "w" revision "w@1" commit "${source.commit}" { + import interface Base; import interface Derived; atom Note id "note"; + conform Note as Derived id "derived-conformance" {} + ${evidence} + }`, + "workspace.qx", + { + interfaces: new Map([ + ["Base", base], + ["Derived", derived], + ]), + }, + ); + assert.equal(compile("").ok, false); + const result = compile('conform Note as Base id "base-conformance" {}'); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const root = result.workspace.conformances[0]; + const closure = computeCapabilityClosure(result.plan, [root]); + assert.equal(closure.conformances.length, 2); + const unresolved = structuredClone(result.workspace); + unresolved.interfaceImports[0].members.push({ + kind: "value", + id: capabilityId.member("unresolved"), + displayName: "unresolved", + operations: [], + valueType: { kind: "parameter", parameterId: "T" } as unknown as typeof valueType.string, + }); + assert.equal(compileWorkspaceRevision(unresolved).ok, false); + const forged = structuredClone(result.workspace); + const applied = forged.interfaceImports.find((entry) => entry.application)!; + applied.application!.arguments = [{ kind: "value", type: valueType.int64 }]; + assert.equal(compileWorkspaceRevision(forged).ok, false); +});