From 3c6b48da62a8696e36fa2592a1498df1f844e0e5 Mon Sep 17 00:00:00 2001 From: Galdormin Date: Tue, 3 Feb 2026 21:45:36 +0100 Subject: [PATCH 01/14] migrate YarnSpinner.Compiler/Compiler.cs --- crates/compiler/src/compilation_steps.rs | 10 +-- .../add_error_for_empty_nodes.rs | 69 +++++++++++++++++++ .../src/compilation_steps/generate_code.rs | 5 ++ .../validate_unique_inferred_variable.rs | 52 ++++++++++++++ .../compiler/src/compiler/run_compilation.rs | 4 ++ .../src/listeners/compiler_listener.rs | 7 +- 6 files changed, 142 insertions(+), 5 deletions(-) create mode 100644 crates/compiler/src/compilation_steps/add_error_for_empty_nodes.rs create mode 100644 crates/compiler/src/compilation_steps/validate_unique_inferred_variable.rs diff --git a/crates/compiler/src/compilation_steps.rs b/crates/compiler/src/compilation_steps.rs index 705252734..abebad1d2 100644 --- a/crates/compiler/src/compilation_steps.rs +++ b/crates/compiler/src/compilation_steps.rs @@ -1,3 +1,4 @@ +mod add_error_for_empty_nodes; mod add_initial_value_registrations; mod add_tracking_declarations; mod check_types; @@ -11,12 +12,13 @@ mod parse_files; mod register_initial_variables; mod register_strings; mod resolve_deferred_type_diagnostic; +mod validate_unique_inferred_variable; mod validate_unique_node_names; pub(crate) use self::{ - add_initial_value_registrations::*, add_tracking_declarations::*, check_types::*, - clean_up_diagnostics::*, create_declarations_for_tracking_nodes::*, early_breaks::*, - find_tracking_nodes::*, generate_code::*, get_declarations::*, parse_files::*, + add_error_for_empty_nodes::*, add_initial_value_registrations::*, add_tracking_declarations::*, + check_types::*, clean_up_diagnostics::*, create_declarations_for_tracking_nodes::*, + early_breaks::*, find_tracking_nodes::*, generate_code::*, get_declarations::*, parse_files::*, register_initial_variables::*, register_strings::*, resolve_deferred_type_diagnostic::*, - validate_unique_node_names::*, + validate_unique_inferred_variable::*, validate_unique_node_names::*, }; diff --git a/crates/compiler/src/compilation_steps/add_error_for_empty_nodes.rs b/crates/compiler/src/compilation_steps/add_error_for_empty_nodes.rs new file mode 100644 index 000000000..dd14d9caa --- /dev/null +++ b/crates/compiler/src/compilation_steps/add_error_for_empty_nodes.rs @@ -0,0 +1,69 @@ +//! Replace the method AddErrorsForEmptyNodes of https://github.com/YarnSpinnerTool/YarnSpinner/blob/838761ad55d8d08be3b46e6f2bea2d017208e445/YarnSpinner.Compiler/Compiler.cs#L657 + +use std::collections::HashSet; + +use antlr_rust::token::Token; + +use crate::parser::generated::yarnspinnerparser::{ + BodyContextAttrs, DialogueContextAttrs, NodeContextAttrs, +}; +use crate::prelude::CompilationIntermediate; +use crate::prelude::*; + +pub(crate) fn add_error_for_empty_nodes( + mut state: CompilationIntermediate, +) -> CompilationIntermediate { + let mut empty_nodes: HashSet = HashSet::new(); + + let empties = state + .parsed_files + .iter() + .flat_map(|(file, _)| { + file.tree + .node_all() + .iter() + .map(|node| (node.clone(), file)) + .collect::>() + }) + .filter(|(node, _)| { + if let Some(body) = node.body() { + body.statement_all().is_empty() + } else { + false + } + }); + + for (node, file) in empties { + let (title, title_header) = node + .header_all() + .iter() + .find(|header| header.header_key.as_ref().unwrap().get_text() == "title") + .map(|title_header| { + let title = title_header + .header_value + .as_ref() + .unwrap() + .get_text() + .to_owned(); + (title, Some(title_header.clone())) + }) + .unwrap_or_default(); + + let mut diag = Diagnostic::from_message(format!( + "Node \"{title}\" is empty and will not be included in the compiled output.", + )) + .with_file_name(file.name.clone()) + .with_severity(DiagnosticSeverity::Warning); + + if let Some(context) = title_header { + diag = diag.with_parser_context(context.as_ref(), file.tokens()); + } + + state.diagnostics.push(diag); + + empty_nodes.insert(title); + } + + state.skip_nodes = empty_nodes; + state +} diff --git a/crates/compiler/src/compilation_steps/generate_code.rs b/crates/compiler/src/compilation_steps/generate_code.rs index 2094c4c0a..04b688937 100644 --- a/crates/compiler/src/compilation_steps/generate_code.rs +++ b/crates/compiler/src/compilation_steps/generate_code.rs @@ -22,8 +22,11 @@ pub(crate) fn generate_code(mut state: CompilationIntermediate) -> CompilationIn .parsed_files .iter() .map(|(file, known_types)| { + let skip_nodes = state.skip_nodes.clone(); + generate_code_for_file( &mut state.tracking_nodes, + skip_nodes, known_types.clone(), template.clone(), file, @@ -55,12 +58,14 @@ pub(crate) fn generate_code(mut state: CompilationIntermediate) -> CompilationIn fn generate_code_for_file<'a, 'b: 'a, 'input: 'a + 'b>( tracking_nodes: &mut HashSet, + skip_nodes: HashSet, known_types: KnownTypes, result_template: Compilation, file: &'a FileParseResult<'input>, ) -> Result { let compiler_listener = Box::new(CompilerListener::new( tracking_nodes.clone(), + skip_nodes.clone(), known_types, file.clone(), )); diff --git a/crates/compiler/src/compilation_steps/validate_unique_inferred_variable.rs b/crates/compiler/src/compilation_steps/validate_unique_inferred_variable.rs new file mode 100644 index 000000000..ee90c2ac1 --- /dev/null +++ b/crates/compiler/src/compilation_steps/validate_unique_inferred_variable.rs @@ -0,0 +1,52 @@ +use crate::prelude::*; +use std::collections::HashMap; + +pub(crate) fn validate_unique_inferred_variables( + mut state: CompilationIntermediate, +) -> CompilationIntermediate { + // TODO: I am pretty sure this is made redundant by the v3 type system, will need to check if it's still needed. + // determining if there are any duplicate inferred variables + // at this point this shouldn't happen, but if it has we need to error out now + + let duplicate_inferred_vars = state + .known_variable_declarations + .iter() + .filter(|&d| !matches!(d.r#type, Type::Function(_))) + .fold(HashMap::<&str, Vec<&Declaration>>::new(), |mut acc, d| { + acc.entry(&d.name).or_default().push(d); + acc + }) + .into_iter() + .filter(|(_, group)| group.len() > 1) + .collect::)>>(); + + for (key, group) in duplicate_inferred_vars { + let group_message = group + .iter() + .map(|d| { + format!( + "\"{}\" on line {}", + d.source_file_name, + d.source_file_line().unwrap_or_default() + ) + }) + .collect::>() + .join(", "); + + state.diagnostics.push( + Diagnostic::from_message(format!( + "\"{key}\" has had its default value inferred in multiple places: {group_message}" + )) + .with_severity(DiagnosticSeverity::Error), + ); + } + + // Note from da39c71 -> 2.5.0 migration + // The line below don't do anything therefore no Rust code has been migrated + + // removing all the duplicate keys + // var duplicateKeys = duplicateInferredVars.Select(g => g.Key); + // knownVariableDeclarations.Where(d => duplicateKeys.Contains(d.Name)); + + state +} diff --git a/crates/compiler/src/compiler/run_compilation.rs b/crates/compiler/src/compiler/run_compilation.rs index 48deccbf2..8a7f19773 100644 --- a/crates/compiler/src/compiler/run_compilation.rs +++ b/crates/compiler/src/compiler/run_compilation.rs @@ -20,6 +20,8 @@ pub(crate) fn compile(compiler: &Compiler) -> Result { &create_declarations_for_tracking_nodes, &add_tracking_declarations, &resolve_deferred_type_diagnostic, + &validate_unique_inferred_variables, + &add_error_for_empty_nodes, &break_on_job_with_only_declarations, &generate_code, &add_initial_value_registrations, @@ -68,6 +70,7 @@ pub(crate) struct CompilationIntermediate<'input> { pub(crate) potential_issues: Vec, pub(crate) parsed_files: Vec<(FileParseResult<'input>, KnownTypes)>, pub(crate) tracking_nodes: HashSet, + pub(crate) skip_nodes: HashSet, pub(crate) string_table: StringTableManager, pub(crate) diagnostics: Vec, pub(crate) file_tags: HashMap>, @@ -85,6 +88,7 @@ impl<'input> CompilationIntermediate<'input> { potential_issues: Default::default(), parsed_files: Default::default(), tracking_nodes: Default::default(), + skip_nodes: Default::default(), string_table: Default::default(), diagnostics: Default::default(), file_tags: Default::default(), diff --git a/crates/compiler/src/listeners/compiler_listener.rs b/crates/compiler/src/listeners/compiler_listener.rs index e0006aca8..a4f603731 100644 --- a/crates/compiler/src/listeners/compiler_listener.rs +++ b/crates/compiler/src/listeners/compiler_listener.rs @@ -25,6 +25,8 @@ pub(crate) struct CompilerListener<'input> { pub(crate) program: Rc>, /// the list of nodes we have to ensure we track visitation pub(crate) tracking_nodes: Rc>>, + /// the list of the names of nodes we have said to skip + pub(crate) skip_nodes: Rc>>, pub(crate) diagnostics: Rc>>, pub(crate) types: KnownTypes, /// The current node to which instructions are being added. @@ -41,6 +43,7 @@ pub(crate) struct CompilerListener<'input> { impl<'input> CompilerListener<'input> { pub(crate) fn new( tracking_nodes: HashSet, + skip_nodes: HashSet, types: KnownTypes, file: FileParseResult<'input>, ) -> Self { @@ -48,6 +51,7 @@ impl<'input> CompilerListener<'input> { file, types, tracking_nodes: Rc::new(RefCell::new(tracking_nodes)), + skip_nodes: Rc::new(RefCell::new(skip_nodes)), current_node: Default::default(), current_debug_info: Default::default(), is_current_node_raw_text: Default::default(), @@ -89,7 +93,7 @@ impl<'input> YarnSpinnerParserListener<'input> for CompilerListener<'input> { .with_file_name(self.file.name.clone()) .with_parser_context(ctx, self.file.tokens()), ); - } else { + } else if !self.skip_nodes.borrow().contains(name) { if !self.program.borrow().nodes.contains_key(name) { self.program .borrow_mut() @@ -107,6 +111,7 @@ impl<'input> YarnSpinnerParserListener<'input> for CompilerListener<'input> { .borrow_mut() .push(self.current_debug_info.clone()); } + self.current_node = None; self.is_current_node_raw_text = false; } From 6608a683113dcc733d79ed3fb171c5a2c16bc5bb Mon Sep 17 00:00:00 2001 From: Galdormin Date: Wed, 4 Feb 2026 18:06:45 +0100 Subject: [PATCH 02/14] migrate few files + submodule - YarnSpinner.Compiler/Declaration.cs - YarnSpinner.Compiler/DeclarationVisitor.cs - YarnSpinner.Compiler/StringTableManager.cs - YarnSpinner.Compiler/Utility.cs --- Cargo.lock | 1 + crates/compiler/Cargo.toml | 15 ++-- .../validate_unique_inferred_variable.rs | 2 +- .../src/compiler/add_tags_to_lines.rs | 70 ++++++++++++++++++- .../src/listeners/untagged_line_listener.rs | 2 +- crates/compiler/src/output/declaration.rs | 5 ++ crates/compiler/src/string_table_manager.rs | 26 +++++-- .../src/visitors/declaration_visitor.rs | 5 +- readme.md | 19 ++--- third-party/YarnSpinner | 2 +- 10 files changed, 122 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6db03d744..098f7411d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6575,6 +6575,7 @@ dependencies = [ "antlr-rust", "better_any", "bevy", + "crc32fast", "instant", "rand", "regex", diff --git a/crates/compiler/Cargo.toml b/crates/compiler/Cargo.toml index 53b13c689..add21e755 100644 --- a/crates/compiler/Cargo.toml +++ b/crates/compiler/Cargo.toml @@ -4,15 +4,15 @@ version = "0.7.0" edition = "2024" repository = "https://github.com/YarnSpinnerTool/YarnSpinner-Rust" homepage = "https://docs.yarnspinner.dev/" -categories = ["game-development", "compilers"] -authors = ["Jan Hohenheim "] +categories = [ "game-development", "compilers" ] +authors = [ "Jan Hohenheim " ] license = "MIT OR Apache-2.0" description = "Compiler for Yarn Spinner for Rust, the friendly tool for writing game dialogue" [features] -default = [] -serde = ["dep:serde", "bevy?/serialize", "yarnspinner_core/serde"] -bevy = ["dep:bevy", "yarnspinner_core/bevy"] +default = [ ] +serde = [ "dep:serde", "bevy?/serialize", "yarnspinner_core/serde" ] +bevy = [ "dep:bevy", "yarnspinner_core/bevy" ] [dependencies] antlr-rust = "=0.3.0-beta" @@ -21,9 +21,10 @@ regex = "1" yarnspinner_internal_shared = { path = "../internal_shared", version = "0.1.0" } yarnspinner_core = { path = "../core", version = "0.7.0" } annotate-snippets = "0.10" -serde = { version = "1", features = ["derive"], optional = true } +serde = { version = "1", features = [ "derive" ], optional = true } bevy = { version = "0.18", default-features = false, optional = true } -rand = { version = "0.9", features = ["small_rng"] } +rand = { version = "0.9", features = [ "small_rng" ] } +crc32fast = "1.5.0" [target.'cfg(target_arch = "wasm32")'.dependencies] instant = { version = "0.1.12", features = [ diff --git a/crates/compiler/src/compilation_steps/validate_unique_inferred_variable.rs b/crates/compiler/src/compilation_steps/validate_unique_inferred_variable.rs index ee90c2ac1..e04df0e5e 100644 --- a/crates/compiler/src/compilation_steps/validate_unique_inferred_variable.rs +++ b/crates/compiler/src/compilation_steps/validate_unique_inferred_variable.rs @@ -11,7 +11,7 @@ pub(crate) fn validate_unique_inferred_variables( let duplicate_inferred_vars = state .known_variable_declarations .iter() - .filter(|&d| !matches!(d.r#type, Type::Function(_))) + .filter(|&d| d.is_variable()) .fold(HashMap::<&str, Vec<&Declaration>>::new(), |mut acc, d| { acc.entry(&d.name).or_default().push(d); acc diff --git a/crates/compiler/src/compiler/add_tags_to_lines.rs b/crates/compiler/src/compiler/add_tags_to_lines.rs index a314c5452..dee692c25 100644 --- a/crates/compiler/src/compiler/add_tags_to_lines.rs +++ b/crates/compiler/src/compiler/add_tags_to_lines.rs @@ -26,8 +26,11 @@ impl Compiler { /// collection. /// /// ## Return value - /// Returns he modified source code, with line tags added. + /// Returns the modified source code, with line tags added. /// If all nodes already have line tags, returns `None`. + #[deprecated( + note = "This method doesn't return the new tags, just the modified text which can cause issues with multiple files. Please use TagLines instead" + )] pub fn add_tags_to_lines( contents: impl Into, existing_line_tags: Vec, @@ -66,6 +69,71 @@ impl Compiler { Ok(None) } } + + /// Given Yarn source code, adds line tags to the ends of all lines + /// that need one and do not already have one. + /// + /// This method ensures that it does not generate line + /// tags that are already present in the file, or present in the + /// `existing_line_tags` collection. + /// + /// Line tags are added to any line of source code that contains + /// user-visible text: lines, options, and shortcut options. + /// + /// ## Parameters + /// + /// `contents`: The source code to add line tags + /// to. + /// `existing_line_tags`: The collection of line tags + /// already exist elsewhere in the source code; the newly added + /// line tags will not be duplicates of any in this + /// collection. + /// + /// ## Return value + /// Returns Tuple of the modified source code, with line tags + /// added and the list of new line tags generated. + pub fn tag_lines( + contents: impl Into, + existing_line_tags: Vec, + ) -> crate::Result)>> { + let contents = contents.into(); + let chars: Vec<_> = contents.chars().map(|c| c as u32).collect(); + // First, get the parse tree for this source code. + let file = File { + file_name: "".to_string(), + source: contents, + }; + let (parse_source, diagnostics) = parse_source(&file, &chars); + let tree = parse_source.tree.clone(); + // Were there any error-level diagnostics? + if diagnostics.has_errors() { + // We encountered a parse error. Bail here; we aren't confident in our ability to correctly insert a line tag. + return Err(CompilerError(diagnostics)); + } + + // Create the line listener, which will produce TextReplacements for each new line tag. + let untagged_line_listener = + Box::new(UntaggedLineListener::new(existing_line_tags, parse_source)); + let rewritten_nodes = untagged_line_listener.rewritten_lines.clone(); + let rewrote_anything = untagged_line_listener.rewrote_anything.clone(); + + // Walk the tree with this listener, and generate text replacements containing line tags. + let untagged_line_listener = + YarnSpinnerParserTreeWalker::walk(untagged_line_listener, tree.as_ref()); + // Apply these text replacements to the original source and return it. + + if rewrote_anything.load(Ordering::Relaxed) { + let result = rewritten_nodes.take(); + let mut string = result.join("\n"); + string.push('\n'); + Ok(Some(( + string, + untagged_line_listener.existing_line_tags.clone(), + ))) + } else { + Ok(None) + } + } } /// Parses a string of Yarn source code, and produces a [`FileParseResult`] diff --git a/crates/compiler/src/listeners/untagged_line_listener.rs b/crates/compiler/src/listeners/untagged_line_listener.rs index d0ac7116e..43f23aa64 100644 --- a/crates/compiler/src/listeners/untagged_line_listener.rs +++ b/crates/compiler/src/listeners/untagged_line_listener.rs @@ -18,7 +18,7 @@ use std::rc::Rc; use std::sync::atomic::AtomicBool; pub(crate) struct UntaggedLineListener<'input> { - existing_line_tags: Vec, + pub(crate) existing_line_tags: Vec, file: FileParseResult<'input>, pub(crate) rewritten_lines: Rc>>, pub(crate) rewrote_anything: Rc, diff --git a/crates/compiler/src/output/declaration.rs b/crates/compiler/src/output/declaration.rs index ef365cb6a..35bfea14d 100644 --- a/crates/compiler/src/output/declaration.rs +++ b/crates/compiler/src/output/declaration.rs @@ -171,6 +171,11 @@ impl Declaration { _ => false, } } + + /// Gets a value indicating whether this Declaration represents a variable. + pub fn is_variable(&self) -> bool { + !matches!(self.r#type, Type::Function(_)) + } } /// The source of a declaration. diff --git a/crates/compiler/src/string_table_manager.rs b/crates/compiler/src/string_table_manager.rs index cb8b4ede2..baed1953c 100644 --- a/crates/compiler/src/string_table_manager.rs +++ b/crates/compiler/src/string_table_manager.rs @@ -2,10 +2,13 @@ use crate::output::StringInfo; use crate::prelude::*; +use crc32fast; use std::collections::HashMap; use std::ops::{Deref, DerefMut}; use yarnspinner_core::prelude::*; +const MAX_ATTEMPTS: usize = 1000; + #[derive(Debug, Clone, Default)] pub(crate) struct StringTableManager(pub HashMap); @@ -33,13 +36,28 @@ impl StringTableManager { }; (line_id, string_info) } else { - let line_id = format!( - "{LINE_ID_PREFIX}{}-{}-{}", + let candidate_seed = format!( + "{}{}{}", string_info.file_name, string_info.node_name, self.len() - ) - .into(); + ); + + let line_id = (0..=MAX_ATTEMPTS) + .find_map(|count| { + let with_suffix = if count == 0 { + candidate_seed.as_str().to_owned() + } else { + format!("{candidate_seed}{count}") + }; + + let id = + format!("{LINE_ID_PREFIX}{}", crc32fast::hash(with_suffix.as_bytes())).into(); + + (!self.contains_key(&id)).then_some(id) + }) + .expect(&format!("Internal error: string table failed to find a non-colliding hash for \"{candidate_seed}\" after {MAX_ATTEMPTS} attempts")); + let string_info = StringInfo { is_implicit_tag: true, ..string_info diff --git a/crates/compiler/src/visitors/declaration_visitor.rs b/crates/compiler/src/visitors/declaration_visitor.rs index 12b425c54..07c25452a 100644 --- a/crates/compiler/src/visitors/declaration_visitor.rs +++ b/crates/compiler/src/visitors/declaration_visitor.rs @@ -142,7 +142,10 @@ impl<'input> YarnSpinnerParserVisitorCompat<'input> for DeclarationVisitor<'inpu // Figure out the value and its type let mut constant_value_visitor = ConstantValueVisitor::new(self.diagnostics.clone(), self.file.clone()); - let value_context = ctx.value().unwrap(); + let Some(value_context) = ctx.value() else { + // no value was provided, declare as undefined and continue + return; + }; let value = constant_value_visitor.visit(value_context.as_ref()); self.diagnostics .extend_from_slice(&constant_value_visitor.diagnostics); diff --git a/readme.md b/readme.md index 2c417117e..df2bf93cb 100644 --- a/readme.md +++ b/readme.md @@ -135,12 +135,13 @@ cargo run ## Version Table -| Bevy | Yarn Spinner for Rust | -|-------------|---------------------- | -| 0.18 | 0.7 | -| 0.17 | 0.6 | -| 0.16 | 0.5 | -| 0.15 | 0.4 | -| 0.14 | 0.3 | -| 0.13 | 0.2 | -| 0.12 | 0.1 | +| Bevy | Yarn Spinner for Rust | Yarn Spinner | +|-------------|---------------------- |--------------| +| 0.18 | main | 2.5.0 | +| 0.18 | 0.7 | 2.3.0 | +| 0.17 | 0.6 | 2.3.0 | +| 0.16 | 0.5 | 2.3.0 | +| 0.15 | 0.4 | 2.3.0 | +| 0.14 | 0.3 | 2.3.0 | +| 0.13 | 0.2 | 2.3.0 | +| 0.12 | 0.1 | 2.3.0 | diff --git a/third-party/YarnSpinner b/third-party/YarnSpinner index f217a2d46..838761ad5 160000 --- a/third-party/YarnSpinner +++ b/third-party/YarnSpinner @@ -1 +1 @@ -Subproject commit f217a2d4613bd2d092703b00321401964bc6df77 +Subproject commit 838761ad55d8d08be3b46e6f2bea2d017208e445 From fcf602fc46a08f1778c7b0c4c2e93d40e6e86353 Mon Sep 17 00:00:00 2001 From: Galdormin Date: Wed, 4 Feb 2026 19:02:08 +0100 Subject: [PATCH 03/14] migrate ANTLR + fix lint previous commit --- .../parser/generated/YarnSpinnerLexer.interp | 13 +- .../parser/generated/YarnSpinnerLexer.tokens | 53 +- .../parser/generated/YarnSpinnerParser.interp | 8 +- .../parser/generated/YarnSpinnerParser.tokens | 53 +- .../compiler/src/parser/generated/readme.md | 1 + .../src/parser/generated/yarnspinnerlexer.rs | 1568 +++++++---------- .../src/parser/generated/yarnspinnerparser.rs | 113 +- .../generated/yarnspinnerparserlistener.rs | 2 +- .../generated/yarnspinnerparservisitor.rs | 2 +- crates/compiler/src/string_table_manager.rs | 3 +- 10 files changed, 826 insertions(+), 990 deletions(-) diff --git a/crates/compiler/src/parser/generated/YarnSpinnerLexer.interp b/crates/compiler/src/parser/generated/YarnSpinnerLexer.interp index 4b965470b..3ff176982 100644 --- a/crates/compiler/src/parser/generated/YarnSpinnerLexer.interp +++ b/crates/compiler/src/parser/generated/YarnSpinnerLexer.interp @@ -66,6 +66,7 @@ null null null null +null 'endif' null null @@ -76,8 +77,10 @@ null null null null +null '{' null +null 'string' 'number' 'bool' @@ -145,6 +148,7 @@ EXPRESSION_END VAR_ID DOT NUMBER +COMMAND_NEWLINE COMMAND_WS COMMAND_IF COMMAND_ELSEIF @@ -159,9 +163,11 @@ COMMAND_CASE COMMAND_ENDENUM COMMAND_LOCAL COMMAND_END +COMMAND_TEXT_NEWLINE COMMAND_TEXT_END COMMAND_EXPRESSION_START COMMAND_TEXT +COMMAND_ID_NEWLINE TYPE_STRING TYPE_NUMBER TYPE_BOOL @@ -187,6 +193,7 @@ SHORTCUT_ARROW COMMAND_START BODY_HASHTAG EXPRESSION_START +ESCAPED_BRACKET_START ESCAPED_ANY ANY TEXT_NEWLINE @@ -250,6 +257,7 @@ DOT NUMBER INT DIGIT +COMMAND_NEWLINE COMMAND_WS COMMAND_IF COMMAND_ELSEIF @@ -264,10 +272,13 @@ COMMAND_CASE COMMAND_ENDENUM COMMAND_LOCAL COMMAND_END +COMMAND_EXPRESSION_AT_START COMMAND_ARBITRARY +COMMAND_TEXT_NEWLINE COMMAND_TEXT_END COMMAND_EXPRESSION_START COMMAND_TEXT +COMMAND_ID_NEWLINE COMMAND_ID COMMAND_ID_END COMMAND_ID_OR_EXPRESSION_ID @@ -297,4 +308,4 @@ CommandIDMode CommandIDOrExpressionMode atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 83, 808, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 3, 2, 6, 2, 228, 10, 2, 13, 2, 14, 2, 229, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 238, 10, 3, 12, 3, 14, 3, 241, 11, 3, 3, 3, 3, 3, 3, 4, 5, 4, 246, 10, 4, 3, 4, 3, 4, 5, 4, 250, 10, 4, 3, 4, 7, 4, 253, 10, 4, 12, 4, 14, 4, 256, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 5, 5, 262, 10, 5, 3, 6, 5, 6, 265, 10, 6, 3, 7, 3, 7, 5, 7, 269, 10, 7, 3, 8, 6, 8, 272, 10, 8, 13, 8, 14, 8, 273, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 7, 10, 284, 10, 10, 12, 10, 14, 10, 287, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 6, 12, 296, 10, 12, 13, 12, 14, 12, 297, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 365, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 6, 31, 397, 10, 31, 13, 31, 14, 31, 398, 3, 31, 5, 31, 402, 10, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 6, 43, 450, 10, 43, 13, 43, 14, 43, 451, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 5, 48, 479, 10, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 486, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 493, 10, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 5, 51, 501, 10, 51, 3, 52, 3, 52, 3, 52, 5, 52, 506, 10, 52, 3, 53, 3, 53, 3, 53, 5, 53, 511, 10, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 5, 54, 518, 10, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 525, 10, 55, 3, 56, 3, 56, 3, 56, 3, 56, 5, 56, 531, 10, 56, 3, 57, 3, 57, 3, 57, 3, 57, 5, 57, 537, 10, 57, 3, 58, 3, 58, 3, 58, 3, 58, 5, 58, 543, 10, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 65, 3, 65, 3, 66, 3, 66, 3, 67, 3, 67, 3, 68, 3, 68, 3, 69, 3, 69, 3, 70, 3, 70, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 7, 76, 608, 10, 76, 12, 76, 14, 76, 611, 11, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 638, 10, 82, 3, 83, 6, 83, 641, 10, 83, 13, 83, 14, 83, 642, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 5, 88, 675, 10, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 748, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 6, 102, 778, 10, 102, 13, 102, 14, 102, 779, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 2, 2, 108, 14, 6, 16, 7, 18, 8, 20, 9, 22, 2, 24, 2, 26, 2, 28, 10, 30, 11, 32, 12, 34, 13, 36, 2, 38, 14, 40, 2, 42, 2, 44, 15, 46, 16, 48, 17, 50, 2, 52, 18, 54, 19, 56, 2, 58, 2, 60, 2, 62, 20, 64, 2, 66, 2, 68, 2, 70, 21, 72, 22, 74, 2, 76, 2, 78, 23, 80, 24, 82, 25, 84, 2, 86, 2, 88, 2, 90, 26, 92, 27, 94, 2, 96, 28, 98, 29, 100, 30, 102, 31, 104, 32, 106, 33, 108, 34, 110, 35, 112, 36, 114, 37, 116, 38, 118, 39, 120, 40, 122, 41, 124, 42, 126, 43, 128, 44, 130, 45, 132, 46, 134, 47, 136, 48, 138, 49, 140, 50, 142, 51, 144, 52, 146, 53, 148, 54, 150, 55, 152, 56, 154, 57, 156, 81, 158, 82, 160, 83, 162, 58, 164, 59, 166, 60, 168, 2, 170, 61, 172, 62, 174, 63, 176, 2, 178, 2, 180, 64, 182, 65, 184, 66, 186, 67, 188, 68, 190, 69, 192, 70, 194, 71, 196, 72, 198, 73, 200, 74, 202, 75, 204, 76, 206, 77, 208, 2, 210, 78, 212, 79, 214, 80, 216, 2, 218, 2, 220, 2, 222, 2, 224, 2, 14, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 4, 2, 11, 11, 34, 34, 4, 2, 12, 12, 15, 15, 7, 2, 50, 59, 770, 881, 7618, 7681, 8402, 8449, 65058, 65073, 3, 2, 34, 34, 4, 2, 49, 49, 62, 62, 9, 2, 12, 12, 15, 15, 37, 37, 49, 49, 62, 62, 94, 94, 125, 125, 9, 2, 37, 37, 49, 49, 62, 62, 64, 64, 94, 94, 125, 125, 127, 127, 7, 2, 11, 12, 15, 15, 34, 34, 37, 38, 62, 62, 6, 2, 12, 12, 15, 15, 36, 36, 94, 94, 4, 2, 36, 36, 94, 94, 3, 2, 50, 59, 12, 2, 11, 15, 34, 34, 135, 135, 162, 162, 5762, 5762, 8194, 8204, 8234, 8235, 8241, 8241, 8289, 8289, 12290, 12290, 4, 2, 64, 64, 125, 125, 3, 51, 2, 67, 2, 92, 2, 97, 2, 97, 2, 99, 2, 124, 2, 170, 2, 170, 2, 172, 2, 172, 2, 175, 2, 175, 2, 177, 2, 177, 2, 180, 2, 183, 2, 185, 2, 188, 2, 190, 2, 192, 2, 194, 2, 216, 2, 218, 2, 248, 2, 250, 2, 769, 2, 882, 2, 5761, 2, 5763, 2, 6159, 2, 6161, 2, 7617, 2, 7682, 2, 8193, 2, 8205, 2, 8207, 2, 8236, 2, 8240, 2, 8257, 2, 8258, 2, 8278, 2, 8278, 2, 8290, 2, 8401, 2, 8450, 2, 8593, 2, 9314, 2, 9473, 2, 10104, 2, 10133, 2, 11266, 2, 11777, 2, 11906, 2, 12289, 2, 12294, 2, 12297, 2, 12323, 2, 12337, 2, 12339, 2, 55297, 2, 63746, 2, 64831, 2, 64834, 2, 64977, 2, 65010, 2, 65057, 2, 65074, 2, 65094, 2, 65097, 2, 65535, 2, 2, 3, 65535, 3, 2, 4, 65535, 4, 2, 5, 65535, 5, 2, 6, 65535, 6, 2, 7, 65535, 7, 2, 8, 65535, 8, 2, 9, 65535, 9, 2, 10, 65535, 10, 2, 11, 65535, 11, 2, 12, 65535, 12, 2, 13, 65535, 13, 2, 14, 65535, 14, 2, 15, 65535, 15, 2, 16, 65535, 16, 823, 2, 14, 3, 2, 2, 2, 2, 16, 3, 2, 2, 2, 2, 18, 3, 2, 2, 2, 2, 20, 3, 2, 2, 2, 2, 28, 3, 2, 2, 2, 2, 30, 3, 2, 2, 2, 2, 32, 3, 2, 2, 2, 3, 34, 3, 2, 2, 2, 3, 36, 3, 2, 2, 2, 4, 38, 3, 2, 2, 2, 4, 40, 3, 2, 2, 2, 4, 42, 3, 2, 2, 2, 4, 44, 3, 2, 2, 2, 4, 46, 3, 2, 2, 2, 4, 48, 3, 2, 2, 2, 4, 50, 3, 2, 2, 2, 4, 52, 3, 2, 2, 2, 4, 54, 3, 2, 2, 2, 4, 56, 3, 2, 2, 2, 5, 58, 3, 2, 2, 2, 5, 60, 3, 2, 2, 2, 5, 62, 3, 2, 2, 2, 5, 64, 3, 2, 2, 2, 5, 66, 3, 2, 2, 2, 5, 68, 3, 2, 2, 2, 5, 70, 3, 2, 2, 2, 5, 72, 3, 2, 2, 2, 6, 76, 3, 2, 2, 2, 6, 78, 3, 2, 2, 2, 7, 80, 3, 2, 2, 2, 7, 82, 3, 2, 2, 2, 7, 84, 3, 2, 2, 2, 7, 86, 3, 2, 2, 2, 7, 88, 3, 2, 2, 2, 7, 90, 3, 2, 2, 2, 8, 92, 3, 2, 2, 2, 8, 94, 3, 2, 2, 2, 8, 96, 3, 2, 2, 2, 9, 98, 3, 2, 2, 2, 9, 100, 3, 2, 2, 2, 9, 102, 3, 2, 2, 2, 9, 104, 3, 2, 2, 2, 9, 106, 3, 2, 2, 2, 9, 108, 3, 2, 2, 2, 9, 110, 3, 2, 2, 2, 9, 112, 3, 2, 2, 2, 9, 114, 3, 2, 2, 2, 9, 116, 3, 2, 2, 2, 9, 118, 3, 2, 2, 2, 9, 120, 3, 2, 2, 2, 9, 122, 3, 2, 2, 2, 9, 124, 3, 2, 2, 2, 9, 126, 3, 2, 2, 2, 9, 128, 3, 2, 2, 2, 9, 130, 3, 2, 2, 2, 9, 132, 3, 2, 2, 2, 9, 134, 3, 2, 2, 2, 9, 136, 3, 2, 2, 2, 9, 138, 3, 2, 2, 2, 9, 140, 3, 2, 2, 2, 9, 142, 3, 2, 2, 2, 9, 144, 3, 2, 2, 2, 9, 146, 3, 2, 2, 2, 9, 148, 3, 2, 2, 2, 9, 150, 3, 2, 2, 2, 9, 152, 3, 2, 2, 2, 9, 154, 3, 2, 2, 2, 9, 156, 3, 2, 2, 2, 9, 158, 3, 2, 2, 2, 9, 160, 3, 2, 2, 2, 9, 162, 3, 2, 2, 2, 9, 164, 3, 2, 2, 2, 9, 166, 3, 2, 2, 2, 9, 168, 3, 2, 2, 2, 9, 170, 3, 2, 2, 2, 9, 172, 3, 2, 2, 2, 9, 174, 3, 2, 2, 2, 10, 180, 3, 2, 2, 2, 10, 182, 3, 2, 2, 2, 10, 184, 3, 2, 2, 2, 10, 186, 3, 2, 2, 2, 10, 188, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 10, 192, 3, 2, 2, 2, 10, 194, 3, 2, 2, 2, 10, 196, 3, 2, 2, 2, 10, 198, 3, 2, 2, 2, 10, 200, 3, 2, 2, 2, 10, 202, 3, 2, 2, 2, 10, 204, 3, 2, 2, 2, 10, 206, 3, 2, 2, 2, 10, 208, 3, 2, 2, 2, 11, 210, 3, 2, 2, 2, 11, 212, 3, 2, 2, 2, 11, 214, 3, 2, 2, 2, 12, 216, 3, 2, 2, 2, 12, 218, 3, 2, 2, 2, 13, 220, 3, 2, 2, 2, 13, 222, 3, 2, 2, 2, 13, 224, 3, 2, 2, 2, 14, 227, 3, 2, 2, 2, 16, 233, 3, 2, 2, 2, 18, 249, 3, 2, 2, 2, 20, 259, 3, 2, 2, 2, 22, 264, 3, 2, 2, 2, 24, 268, 3, 2, 2, 2, 26, 271, 3, 2, 2, 2, 28, 275, 3, 2, 2, 2, 30, 281, 3, 2, 2, 2, 32, 290, 3, 2, 2, 2, 34, 295, 3, 2, 2, 2, 36, 299, 3, 2, 2, 2, 38, 305, 3, 2, 2, 2, 40, 309, 3, 2, 2, 2, 42, 314, 3, 2, 2, 2, 44, 319, 3, 2, 2, 2, 46, 325, 3, 2, 2, 2, 48, 328, 3, 2, 2, 2, 50, 333, 3, 2, 2, 2, 52, 339, 3, 2, 2, 2, 54, 344, 3, 2, 2, 2, 56, 350, 3, 2, 2, 2, 58, 355, 3, 2, 2, 2, 60, 364, 3, 2, 2, 2, 62, 368, 3, 2, 2, 2, 64, 373, 3, 2, 2, 2, 66, 379, 3, 2, 2, 2, 68, 384, 3, 2, 2, 2, 70, 391, 3, 2, 2, 2, 72, 401, 3, 2, 2, 2, 74, 403, 3, 2, 2, 2, 76, 405, 3, 2, 2, 2, 78, 410, 3, 2, 2, 2, 80, 414, 3, 2, 2, 2, 82, 418, 3, 2, 2, 2, 84, 422, 3, 2, 2, 2, 86, 428, 3, 2, 2, 2, 88, 433, 3, 2, 2, 2, 90, 438, 3, 2, 2, 2, 92, 440, 3, 2, 2, 2, 94, 444, 3, 2, 2, 2, 96, 449, 3, 2, 2, 2, 98, 455, 3, 2, 2, 2, 100, 459, 3, 2, 2, 2, 102, 464, 3, 2, 2, 2, 104, 470, 3, 2, 2, 2, 106, 478, 3, 2, 2, 2, 108, 485, 3, 2, 2, 2, 110, 492, 3, 2, 2, 2, 112, 500, 3, 2, 2, 2, 114, 505, 3, 2, 2, 2, 116, 510, 3, 2, 2, 2, 118, 517, 3, 2, 2, 2, 120, 524, 3, 2, 2, 2, 122, 530, 3, 2, 2, 2, 124, 536, 3, 2, 2, 2, 126, 542, 3, 2, 2, 2, 128, 544, 3, 2, 2, 2, 130, 547, 3, 2, 2, 2, 132, 550, 3, 2, 2, 2, 134, 553, 3, 2, 2, 2, 136, 556, 3, 2, 2, 2, 138, 559, 3, 2, 2, 2, 140, 561, 3, 2, 2, 2, 142, 563, 3, 2, 2, 2, 144, 565, 3, 2, 2, 2, 146, 567, 3, 2, 2, 2, 148, 569, 3, 2, 2, 2, 150, 571, 3, 2, 2, 2, 152, 573, 3, 2, 2, 2, 154, 575, 3, 2, 2, 2, 156, 578, 3, 2, 2, 2, 158, 587, 3, 2, 2, 2, 160, 596, 3, 2, 2, 2, 162, 603, 3, 2, 2, 2, 164, 614, 3, 2, 2, 2, 166, 616, 3, 2, 2, 2, 168, 620, 3, 2, 2, 2, 170, 627, 3, 2, 2, 2, 172, 630, 3, 2, 2, 2, 174, 637, 3, 2, 2, 2, 176, 640, 3, 2, 2, 2, 178, 644, 3, 2, 2, 2, 180, 646, 3, 2, 2, 2, 182, 650, 3, 2, 2, 2, 184, 657, 3, 2, 2, 2, 186, 668, 3, 2, 2, 2, 188, 676, 3, 2, 2, 2, 190, 684, 3, 2, 2, 2, 192, 690, 3, 2, 2, 2, 194, 699, 3, 2, 2, 2, 196, 711, 3, 2, 2, 2, 198, 720, 3, 2, 2, 2, 200, 729, 3, 2, 2, 2, 202, 738, 3, 2, 2, 2, 204, 749, 3, 2, 2, 2, 206, 757, 3, 2, 2, 2, 208, 762, 3, 2, 2, 2, 210, 767, 3, 2, 2, 2, 212, 772, 3, 2, 2, 2, 214, 777, 3, 2, 2, 2, 216, 781, 3, 2, 2, 2, 218, 786, 3, 2, 2, 2, 220, 792, 3, 2, 2, 2, 222, 797, 3, 2, 2, 2, 224, 802, 3, 2, 2, 2, 226, 228, 9, 2, 2, 2, 227, 226, 3, 2, 2, 2, 228, 229, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 232, 8, 2, 2, 2, 232, 15, 3, 2, 2, 2, 233, 234, 7, 49, 2, 2, 234, 235, 7, 49, 2, 2, 235, 239, 3, 2, 2, 2, 236, 238, 10, 3, 2, 2, 237, 236, 3, 2, 2, 2, 238, 241, 3, 2, 2, 2, 239, 237, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 242, 3, 2, 2, 2, 241, 239, 3, 2, 2, 2, 242, 243, 8, 3, 3, 2, 243, 17, 3, 2, 2, 2, 244, 246, 7, 15, 2, 2, 245, 244, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 250, 7, 12, 2, 2, 248, 250, 7, 15, 2, 2, 249, 245, 3, 2, 2, 2, 249, 248, 3, 2, 2, 2, 250, 254, 3, 2, 2, 2, 251, 253, 9, 2, 2, 2, 252, 251, 3, 2, 2, 2, 253, 256, 3, 2, 2, 2, 254, 252, 3, 2, 2, 2, 254, 255, 3, 2, 2, 2, 255, 257, 3, 2, 2, 2, 256, 254, 3, 2, 2, 2, 257, 258, 8, 4, 4, 2, 258, 19, 3, 2, 2, 2, 259, 261, 5, 22, 6, 2, 260, 262, 5, 26, 8, 2, 261, 260, 3, 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 21, 3, 2, 2, 2, 263, 265, 9, 15, 2, 2, 264, 263, 3, 2, 2, 2, 265, 23, 3, 2, 2, 2, 266, 269, 9, 4, 2, 2, 267, 269, 5, 22, 6, 2, 268, 266, 3, 2, 2, 2, 268, 267, 3, 2, 2, 2, 269, 25, 3, 2, 2, 2, 270, 272, 5, 24, 7, 2, 271, 270, 3, 2, 2, 2, 272, 273, 3, 2, 2, 2, 273, 271, 3, 2, 2, 2, 273, 274, 3, 2, 2, 2, 274, 27, 3, 2, 2, 2, 275, 276, 7, 47, 2, 2, 276, 277, 7, 47, 2, 2, 277, 278, 7, 47, 2, 2, 278, 279, 3, 2, 2, 2, 279, 280, 8, 9, 5, 2, 280, 29, 3, 2, 2, 2, 281, 285, 7, 60, 2, 2, 282, 284, 9, 5, 2, 2, 283, 282, 3, 2, 2, 2, 284, 287, 3, 2, 2, 2, 285, 283, 3, 2, 2, 2, 285, 286, 3, 2, 2, 2, 286, 288, 3, 2, 2, 2, 287, 285, 3, 2, 2, 2, 288, 289, 8, 10, 6, 2, 289, 31, 3, 2, 2, 2, 290, 291, 7, 37, 2, 2, 291, 292, 3, 2, 2, 2, 292, 293, 8, 11, 7, 2, 293, 33, 3, 2, 2, 2, 294, 296, 10, 3, 2, 2, 295, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 295, 3, 2, 2, 2, 297, 298, 3, 2, 2, 2, 298, 35, 3, 2, 2, 2, 299, 300, 5, 18, 4, 2, 300, 301, 3, 2, 2, 2, 301, 302, 8, 13, 8, 2, 302, 303, 8, 13, 4, 2, 303, 304, 8, 13, 9, 2, 304, 37, 3, 2, 2, 2, 305, 306, 5, 14, 2, 2, 306, 307, 3, 2, 2, 2, 307, 308, 8, 14, 2, 2, 308, 39, 3, 2, 2, 2, 309, 310, 5, 18, 4, 2, 310, 311, 3, 2, 2, 2, 311, 312, 8, 15, 8, 2, 312, 313, 8, 15, 4, 2, 313, 41, 3, 2, 2, 2, 314, 315, 5, 16, 3, 2, 315, 316, 3, 2, 2, 2, 316, 317, 8, 16, 10, 2, 317, 318, 8, 16, 3, 2, 318, 43, 3, 2, 2, 2, 319, 320, 7, 63, 2, 2, 320, 321, 7, 63, 2, 2, 321, 322, 7, 63, 2, 2, 322, 323, 3, 2, 2, 2, 323, 324, 8, 17, 9, 2, 324, 45, 3, 2, 2, 2, 325, 326, 7, 47, 2, 2, 326, 327, 7, 64, 2, 2, 327, 47, 3, 2, 2, 2, 328, 329, 7, 62, 2, 2, 329, 330, 7, 62, 2, 2, 330, 331, 3, 2, 2, 2, 331, 332, 8, 19, 11, 2, 332, 49, 3, 2, 2, 2, 333, 334, 7, 37, 2, 2, 334, 335, 3, 2, 2, 2, 335, 336, 8, 20, 12, 2, 336, 337, 8, 20, 13, 2, 337, 338, 8, 20, 7, 2, 338, 51, 3, 2, 2, 2, 339, 340, 7, 125, 2, 2, 340, 341, 3, 2, 2, 2, 341, 342, 8, 21, 14, 2, 342, 343, 8, 21, 15, 2, 343, 53, 3, 2, 2, 2, 344, 345, 7, 94, 2, 2, 345, 346, 3, 2, 2, 2, 346, 347, 8, 22, 16, 2, 347, 348, 8, 22, 14, 2, 348, 349, 8, 22, 17, 2, 349, 55, 3, 2, 2, 2, 350, 351, 11, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 353, 8, 23, 18, 2, 353, 354, 8, 23, 14, 2, 354, 57, 3, 2, 2, 2, 355, 356, 5, 18, 4, 2, 356, 357, 3, 2, 2, 2, 357, 358, 8, 24, 8, 2, 358, 359, 8, 24, 9, 2, 359, 59, 3, 2, 2, 2, 360, 361, 7, 94, 2, 2, 361, 365, 7, 93, 2, 2, 362, 363, 7, 94, 2, 2, 363, 365, 7, 95, 2, 2, 364, 360, 3, 2, 2, 2, 364, 362, 3, 2, 2, 2, 365, 366, 3, 2, 2, 2, 366, 367, 8, 25, 18, 2, 367, 61, 3, 2, 2, 2, 368, 369, 7, 94, 2, 2, 369, 370, 3, 2, 2, 2, 370, 371, 8, 26, 16, 2, 371, 372, 8, 26, 17, 2, 372, 63, 3, 2, 2, 2, 373, 374, 5, 32, 11, 2, 374, 375, 3, 2, 2, 2, 375, 376, 8, 27, 12, 2, 376, 377, 8, 27, 19, 2, 377, 378, 8, 27, 7, 2, 378, 65, 3, 2, 2, 2, 379, 380, 7, 125, 2, 2, 380, 381, 3, 2, 2, 2, 381, 382, 8, 28, 20, 2, 382, 383, 8, 28, 15, 2, 383, 67, 3, 2, 2, 2, 384, 385, 7, 62, 2, 2, 385, 386, 7, 62, 2, 2, 386, 387, 3, 2, 2, 2, 387, 388, 8, 29, 21, 2, 388, 389, 8, 29, 19, 2, 389, 390, 8, 29, 11, 2, 390, 69, 3, 2, 2, 2, 391, 392, 5, 16, 3, 2, 392, 393, 3, 2, 2, 2, 393, 394, 8, 30, 3, 2, 394, 71, 3, 2, 2, 2, 395, 397, 5, 74, 32, 2, 396, 395, 3, 2, 2, 2, 397, 398, 3, 2, 2, 2, 398, 396, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 402, 3, 2, 2, 2, 400, 402, 9, 6, 2, 2, 401, 396, 3, 2, 2, 2, 401, 400, 3, 2, 2, 2, 402, 73, 3, 2, 2, 2, 403, 404, 10, 7, 2, 2, 404, 75, 3, 2, 2, 2, 405, 406, 9, 8, 2, 2, 406, 407, 3, 2, 2, 2, 407, 408, 8, 33, 18, 2, 408, 409, 8, 33, 9, 2, 409, 77, 3, 2, 2, 2, 410, 411, 11, 2, 2, 2, 411, 412, 3, 2, 2, 2, 412, 413, 8, 34, 9, 2, 413, 79, 3, 2, 2, 2, 414, 415, 5, 14, 2, 2, 415, 416, 3, 2, 2, 2, 416, 417, 8, 35, 2, 2, 417, 81, 3, 2, 2, 2, 418, 419, 5, 16, 3, 2, 419, 420, 3, 2, 2, 2, 420, 421, 8, 36, 3, 2, 421, 83, 3, 2, 2, 2, 422, 423, 7, 62, 2, 2, 423, 424, 7, 62, 2, 2, 424, 425, 3, 2, 2, 2, 425, 426, 8, 37, 21, 2, 426, 427, 8, 37, 11, 2, 427, 85, 3, 2, 2, 2, 428, 429, 7, 37, 2, 2, 429, 430, 3, 2, 2, 2, 430, 431, 8, 38, 12, 2, 431, 432, 8, 38, 7, 2, 432, 87, 3, 2, 2, 2, 433, 434, 5, 18, 4, 2, 434, 435, 3, 2, 2, 2, 435, 436, 8, 39, 8, 2, 436, 437, 8, 39, 9, 2, 437, 89, 3, 2, 2, 2, 438, 439, 11, 2, 2, 2, 439, 91, 3, 2, 2, 2, 440, 441, 5, 14, 2, 2, 441, 442, 3, 2, 2, 2, 442, 443, 8, 41, 2, 2, 443, 93, 3, 2, 2, 2, 444, 445, 5, 32, 11, 2, 445, 446, 3, 2, 2, 2, 446, 447, 8, 42, 12, 2, 447, 95, 3, 2, 2, 2, 448, 450, 10, 9, 2, 2, 449, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 453, 3, 2, 2, 2, 453, 454, 8, 43, 9, 2, 454, 97, 3, 2, 2, 2, 455, 456, 5, 14, 2, 2, 456, 457, 3, 2, 2, 2, 457, 458, 8, 44, 2, 2, 458, 99, 3, 2, 2, 2, 459, 460, 7, 118, 2, 2, 460, 461, 7, 116, 2, 2, 461, 462, 7, 119, 2, 2, 462, 463, 7, 103, 2, 2, 463, 101, 3, 2, 2, 2, 464, 465, 7, 104, 2, 2, 465, 466, 7, 99, 2, 2, 466, 467, 7, 110, 2, 2, 467, 468, 7, 117, 2, 2, 468, 469, 7, 103, 2, 2, 469, 103, 3, 2, 2, 2, 470, 471, 7, 112, 2, 2, 471, 472, 7, 119, 2, 2, 472, 473, 7, 110, 2, 2, 473, 474, 7, 110, 2, 2, 474, 105, 3, 2, 2, 2, 475, 479, 7, 63, 2, 2, 476, 477, 7, 118, 2, 2, 477, 479, 7, 113, 2, 2, 478, 475, 3, 2, 2, 2, 478, 476, 3, 2, 2, 2, 479, 107, 3, 2, 2, 2, 480, 481, 7, 62, 2, 2, 481, 486, 7, 63, 2, 2, 482, 483, 7, 110, 2, 2, 483, 484, 7, 118, 2, 2, 484, 486, 7, 103, 2, 2, 485, 480, 3, 2, 2, 2, 485, 482, 3, 2, 2, 2, 486, 109, 3, 2, 2, 2, 487, 488, 7, 64, 2, 2, 488, 493, 7, 63, 2, 2, 489, 490, 7, 105, 2, 2, 490, 491, 7, 118, 2, 2, 491, 493, 7, 103, 2, 2, 492, 487, 3, 2, 2, 2, 492, 489, 3, 2, 2, 2, 493, 111, 3, 2, 2, 2, 494, 495, 7, 63, 2, 2, 495, 501, 7, 63, 2, 2, 496, 497, 7, 107, 2, 2, 497, 501, 7, 117, 2, 2, 498, 499, 7, 103, 2, 2, 499, 501, 7, 115, 2, 2, 500, 494, 3, 2, 2, 2, 500, 496, 3, 2, 2, 2, 500, 498, 3, 2, 2, 2, 501, 113, 3, 2, 2, 2, 502, 506, 7, 62, 2, 2, 503, 504, 7, 110, 2, 2, 504, 506, 7, 118, 2, 2, 505, 502, 3, 2, 2, 2, 505, 503, 3, 2, 2, 2, 506, 115, 3, 2, 2, 2, 507, 511, 7, 64, 2, 2, 508, 509, 7, 105, 2, 2, 509, 511, 7, 118, 2, 2, 510, 507, 3, 2, 2, 2, 510, 508, 3, 2, 2, 2, 511, 117, 3, 2, 2, 2, 512, 513, 7, 35, 2, 2, 513, 518, 7, 63, 2, 2, 514, 515, 7, 112, 2, 2, 515, 516, 7, 103, 2, 2, 516, 518, 7, 115, 2, 2, 517, 512, 3, 2, 2, 2, 517, 514, 3, 2, 2, 2, 518, 119, 3, 2, 2, 2, 519, 520, 7, 99, 2, 2, 520, 521, 7, 112, 2, 2, 521, 525, 7, 102, 2, 2, 522, 523, 7, 40, 2, 2, 523, 525, 7, 40, 2, 2, 524, 519, 3, 2, 2, 2, 524, 522, 3, 2, 2, 2, 525, 121, 3, 2, 2, 2, 526, 527, 7, 113, 2, 2, 527, 531, 7, 116, 2, 2, 528, 529, 7, 126, 2, 2, 529, 531, 7, 126, 2, 2, 530, 526, 3, 2, 2, 2, 530, 528, 3, 2, 2, 2, 531, 123, 3, 2, 2, 2, 532, 533, 7, 122, 2, 2, 533, 534, 7, 113, 2, 2, 534, 537, 7, 116, 2, 2, 535, 537, 7, 96, 2, 2, 536, 532, 3, 2, 2, 2, 536, 535, 3, 2, 2, 2, 537, 125, 3, 2, 2, 2, 538, 539, 7, 112, 2, 2, 539, 540, 7, 113, 2, 2, 540, 543, 7, 118, 2, 2, 541, 543, 7, 35, 2, 2, 542, 538, 3, 2, 2, 2, 542, 541, 3, 2, 2, 2, 543, 127, 3, 2, 2, 2, 544, 545, 7, 45, 2, 2, 545, 546, 7, 63, 2, 2, 546, 129, 3, 2, 2, 2, 547, 548, 7, 47, 2, 2, 548, 549, 7, 63, 2, 2, 549, 131, 3, 2, 2, 2, 550, 551, 7, 44, 2, 2, 551, 552, 7, 63, 2, 2, 552, 133, 3, 2, 2, 2, 553, 554, 7, 39, 2, 2, 554, 555, 7, 63, 2, 2, 555, 135, 3, 2, 2, 2, 556, 557, 7, 49, 2, 2, 557, 558, 7, 63, 2, 2, 558, 137, 3, 2, 2, 2, 559, 560, 7, 45, 2, 2, 560, 139, 3, 2, 2, 2, 561, 562, 7, 47, 2, 2, 562, 141, 3, 2, 2, 2, 563, 564, 7, 44, 2, 2, 564, 143, 3, 2, 2, 2, 565, 566, 7, 49, 2, 2, 566, 145, 3, 2, 2, 2, 567, 568, 7, 39, 2, 2, 568, 147, 3, 2, 2, 2, 569, 570, 7, 42, 2, 2, 570, 149, 3, 2, 2, 2, 571, 572, 7, 43, 2, 2, 572, 151, 3, 2, 2, 2, 573, 574, 7, 46, 2, 2, 574, 153, 3, 2, 2, 2, 575, 576, 7, 99, 2, 2, 576, 577, 7, 117, 2, 2, 577, 155, 3, 2, 2, 2, 578, 579, 7, 117, 2, 2, 579, 580, 7, 118, 2, 2, 580, 581, 7, 116, 2, 2, 581, 582, 7, 107, 2, 2, 582, 583, 7, 112, 2, 2, 583, 584, 7, 105, 2, 2, 584, 585, 3, 2, 2, 2, 585, 586, 8, 73, 22, 2, 586, 157, 3, 2, 2, 2, 587, 588, 7, 112, 2, 2, 588, 589, 7, 119, 2, 2, 589, 590, 7, 111, 2, 2, 590, 591, 7, 100, 2, 2, 591, 592, 7, 103, 2, 2, 592, 593, 7, 116, 2, 2, 593, 594, 3, 2, 2, 2, 594, 595, 8, 74, 22, 2, 595, 159, 3, 2, 2, 2, 596, 597, 7, 100, 2, 2, 597, 598, 7, 113, 2, 2, 598, 599, 7, 113, 2, 2, 599, 600, 7, 110, 2, 2, 600, 601, 3, 2, 2, 2, 601, 602, 8, 75, 22, 2, 602, 161, 3, 2, 2, 2, 603, 609, 7, 36, 2, 2, 604, 608, 10, 10, 2, 2, 605, 606, 7, 94, 2, 2, 606, 608, 9, 11, 2, 2, 607, 604, 3, 2, 2, 2, 607, 605, 3, 2, 2, 2, 608, 611, 3, 2, 2, 2, 609, 607, 3, 2, 2, 2, 609, 610, 3, 2, 2, 2, 610, 612, 3, 2, 2, 2, 611, 609, 3, 2, 2, 2, 612, 613, 7, 36, 2, 2, 613, 163, 3, 2, 2, 2, 614, 615, 5, 20, 5, 2, 615, 165, 3, 2, 2, 2, 616, 617, 7, 127, 2, 2, 617, 618, 3, 2, 2, 2, 618, 619, 8, 78, 9, 2, 619, 167, 3, 2, 2, 2, 620, 621, 7, 64, 2, 2, 621, 622, 7, 64, 2, 2, 622, 623, 3, 2, 2, 2, 623, 624, 8, 79, 23, 2, 624, 625, 8, 79, 9, 2, 625, 626, 8, 79, 9, 2, 626, 169, 3, 2, 2, 2, 627, 628, 7, 38, 2, 2, 628, 629, 5, 20, 5, 2, 629, 171, 3, 2, 2, 2, 630, 631, 7, 48, 2, 2, 631, 173, 3, 2, 2, 2, 632, 638, 5, 176, 83, 2, 633, 634, 5, 176, 83, 2, 634, 635, 7, 48, 2, 2, 635, 636, 5, 176, 83, 2, 636, 638, 3, 2, 2, 2, 637, 632, 3, 2, 2, 2, 637, 633, 3, 2, 2, 2, 638, 175, 3, 2, 2, 2, 639, 641, 5, 178, 84, 2, 640, 639, 3, 2, 2, 2, 641, 642, 3, 2, 2, 2, 642, 640, 3, 2, 2, 2, 642, 643, 3, 2, 2, 2, 643, 177, 3, 2, 2, 2, 644, 645, 9, 12, 2, 2, 645, 179, 3, 2, 2, 2, 646, 647, 5, 14, 2, 2, 647, 648, 3, 2, 2, 2, 648, 649, 8, 85, 2, 2, 649, 181, 3, 2, 2, 2, 650, 651, 7, 107, 2, 2, 651, 652, 7, 104, 2, 2, 652, 653, 3, 2, 2, 2, 653, 654, 9, 13, 2, 2, 654, 655, 3, 2, 2, 2, 655, 656, 8, 86, 15, 2, 656, 183, 3, 2, 2, 2, 657, 658, 7, 103, 2, 2, 658, 659, 7, 110, 2, 2, 659, 660, 7, 117, 2, 2, 660, 661, 7, 103, 2, 2, 661, 662, 7, 107, 2, 2, 662, 663, 7, 104, 2, 2, 663, 664, 3, 2, 2, 2, 664, 665, 9, 13, 2, 2, 665, 666, 3, 2, 2, 2, 666, 667, 8, 87, 15, 2, 667, 185, 3, 2, 2, 2, 668, 669, 7, 103, 2, 2, 669, 670, 7, 110, 2, 2, 670, 671, 7, 117, 2, 2, 671, 672, 7, 103, 2, 2, 672, 674, 3, 2, 2, 2, 673, 675, 9, 13, 2, 2, 674, 673, 3, 2, 2, 2, 674, 675, 3, 2, 2, 2, 675, 187, 3, 2, 2, 2, 676, 677, 7, 117, 2, 2, 677, 678, 7, 103, 2, 2, 678, 679, 7, 118, 2, 2, 679, 680, 3, 2, 2, 2, 680, 681, 9, 13, 2, 2, 681, 682, 3, 2, 2, 2, 682, 683, 8, 89, 15, 2, 683, 189, 3, 2, 2, 2, 684, 685, 7, 103, 2, 2, 685, 686, 7, 112, 2, 2, 686, 687, 7, 102, 2, 2, 687, 688, 7, 107, 2, 2, 688, 689, 7, 104, 2, 2, 689, 191, 3, 2, 2, 2, 690, 691, 7, 101, 2, 2, 691, 692, 7, 99, 2, 2, 692, 693, 7, 110, 2, 2, 693, 694, 7, 110, 2, 2, 694, 695, 3, 2, 2, 2, 695, 696, 9, 13, 2, 2, 696, 697, 3, 2, 2, 2, 697, 698, 8, 91, 15, 2, 698, 193, 3, 2, 2, 2, 699, 700, 7, 102, 2, 2, 700, 701, 7, 103, 2, 2, 701, 702, 7, 101, 2, 2, 702, 703, 7, 110, 2, 2, 703, 704, 7, 99, 2, 2, 704, 705, 7, 116, 2, 2, 705, 706, 7, 103, 2, 2, 706, 707, 3, 2, 2, 2, 707, 708, 9, 13, 2, 2, 708, 709, 3, 2, 2, 2, 709, 710, 8, 92, 15, 2, 710, 195, 3, 2, 2, 2, 711, 712, 7, 108, 2, 2, 712, 713, 7, 119, 2, 2, 713, 714, 7, 111, 2, 2, 714, 715, 7, 114, 2, 2, 715, 716, 3, 2, 2, 2, 716, 717, 9, 13, 2, 2, 717, 718, 3, 2, 2, 2, 718, 719, 8, 93, 24, 2, 719, 197, 3, 2, 2, 2, 720, 721, 7, 103, 2, 2, 721, 722, 7, 112, 2, 2, 722, 723, 7, 119, 2, 2, 723, 724, 7, 111, 2, 2, 724, 725, 3, 2, 2, 2, 725, 726, 9, 13, 2, 2, 726, 727, 3, 2, 2, 2, 727, 728, 8, 94, 25, 2, 728, 199, 3, 2, 2, 2, 729, 730, 7, 101, 2, 2, 730, 731, 7, 99, 2, 2, 731, 732, 7, 117, 2, 2, 732, 733, 7, 103, 2, 2, 733, 734, 3, 2, 2, 2, 734, 735, 9, 13, 2, 2, 735, 736, 3, 2, 2, 2, 736, 737, 8, 95, 25, 2, 737, 201, 3, 2, 2, 2, 738, 739, 7, 103, 2, 2, 739, 740, 7, 112, 2, 2, 740, 741, 7, 102, 2, 2, 741, 742, 7, 103, 2, 2, 742, 743, 7, 112, 2, 2, 743, 744, 7, 119, 2, 2, 744, 745, 7, 111, 2, 2, 745, 747, 3, 2, 2, 2, 746, 748, 9, 13, 2, 2, 747, 746, 3, 2, 2, 2, 747, 748, 3, 2, 2, 2, 748, 203, 3, 2, 2, 2, 749, 750, 7, 110, 2, 2, 750, 751, 7, 113, 2, 2, 751, 752, 7, 101, 2, 2, 752, 753, 7, 99, 2, 2, 753, 754, 7, 110, 2, 2, 754, 755, 3, 2, 2, 2, 755, 756, 9, 13, 2, 2, 756, 205, 3, 2, 2, 2, 757, 758, 7, 64, 2, 2, 758, 759, 7, 64, 2, 2, 759, 760, 3, 2, 2, 2, 760, 761, 8, 98, 9, 2, 761, 207, 3, 2, 2, 2, 762, 763, 11, 2, 2, 2, 763, 764, 3, 2, 2, 2, 764, 765, 8, 99, 26, 2, 765, 766, 8, 99, 27, 2, 766, 209, 3, 2, 2, 2, 767, 768, 7, 64, 2, 2, 768, 769, 7, 64, 2, 2, 769, 770, 3, 2, 2, 2, 770, 771, 8, 100, 9, 2, 771, 211, 3, 2, 2, 2, 772, 773, 7, 125, 2, 2, 773, 774, 3, 2, 2, 2, 774, 775, 8, 101, 15, 2, 775, 213, 3, 2, 2, 2, 776, 778, 10, 14, 2, 2, 777, 776, 3, 2, 2, 2, 778, 779, 3, 2, 2, 2, 779, 777, 3, 2, 2, 2, 779, 780, 3, 2, 2, 2, 780, 215, 3, 2, 2, 2, 781, 782, 5, 20, 5, 2, 782, 783, 3, 2, 2, 2, 783, 784, 8, 103, 28, 2, 784, 785, 8, 103, 9, 2, 785, 217, 3, 2, 2, 2, 786, 787, 7, 64, 2, 2, 787, 788, 7, 64, 2, 2, 788, 789, 3, 2, 2, 2, 789, 790, 8, 104, 23, 2, 790, 791, 8, 104, 9, 2, 791, 219, 3, 2, 2, 2, 792, 793, 5, 20, 5, 2, 793, 794, 3, 2, 2, 2, 794, 795, 8, 105, 28, 2, 795, 796, 8, 105, 9, 2, 796, 221, 3, 2, 2, 2, 797, 798, 5, 52, 21, 2, 798, 799, 3, 2, 2, 2, 799, 800, 8, 106, 20, 2, 800, 801, 8, 106, 29, 2, 801, 223, 3, 2, 2, 2, 802, 803, 7, 64, 2, 2, 803, 804, 7, 64, 2, 2, 804, 805, 3, 2, 2, 2, 805, 806, 8, 107, 23, 2, 806, 807, 8, 107, 9, 2, 807, 225, 3, 2, 2, 2, 47, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 229, 239, 245, 249, 254, 261, 264, 268, 273, 285, 297, 364, 398, 401, 451, 478, 485, 492, 500, 505, 510, 517, 524, 530, 536, 542, 607, 609, 637, 642, 674, 747, 779, 30, 2, 3, 2, 2, 5, 2, 2, 4, 2, 7, 4, 2, 7, 3, 2, 7, 8, 2, 9, 8, 2, 6, 2, 2, 9, 7, 2, 7, 10, 2, 9, 12, 2, 7, 7, 2, 7, 5, 2, 7, 9, 2, 8, 2, 2, 7, 6, 2, 9, 22, 2, 4, 7, 2, 9, 18, 2, 9, 17, 2, 9, 59, 2, 9, 77, 2, 7, 13, 2, 7, 12, 2, 9, 80, 2, 4, 11, 2, 9, 9, 2, 4, 9, 2] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 86, 836, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 3, 2, 6, 2, 238, 10, 2, 13, 2, 14, 2, 239, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 248, 10, 3, 12, 3, 14, 3, 251, 11, 3, 3, 3, 3, 3, 3, 4, 5, 4, 256, 10, 4, 3, 4, 3, 4, 5, 4, 260, 10, 4, 3, 4, 7, 4, 263, 10, 4, 12, 4, 14, 4, 266, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 5, 5, 272, 10, 5, 3, 6, 5, 6, 275, 10, 6, 3, 7, 3, 7, 5, 7, 279, 10, 7, 3, 8, 6, 8, 282, 10, 8, 13, 8, 14, 8, 283, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 7, 10, 294, 10, 10, 12, 10, 14, 10, 297, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 6, 12, 306, 10, 12, 13, 12, 14, 12, 307, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 381, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 6, 32, 413, 10, 32, 13, 32, 14, 32, 414, 3, 32, 5, 32, 418, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 6, 44, 466, 10, 44, 13, 44, 14, 44, 467, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 5, 49, 495, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 502, 10, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 5, 51, 509, 10, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 5, 52, 517, 10, 52, 3, 53, 3, 53, 3, 53, 5, 53, 522, 10, 53, 3, 54, 3, 54, 3, 54, 5, 54, 527, 10, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 534, 10, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 5, 56, 541, 10, 56, 3, 57, 3, 57, 3, 57, 3, 57, 5, 57, 547, 10, 57, 3, 58, 3, 58, 3, 58, 3, 58, 5, 58, 553, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 559, 10, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 66, 3, 66, 3, 67, 3, 67, 3, 68, 3, 68, 3, 69, 3, 69, 3, 70, 3, 70, 3, 71, 3, 71, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 7, 77, 624, 10, 77, 12, 77, 14, 77, 627, 11, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 654, 10, 83, 3, 84, 6, 84, 657, 10, 84, 13, 84, 14, 84, 658, 3, 85, 3, 85, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 5, 90, 693, 10, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 5, 98, 766, 10, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 6, 106, 804, 10, 106, 13, 106, 14, 106, 805, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 2, 2, 113, 14, 6, 16, 7, 18, 8, 20, 9, 22, 2, 24, 2, 26, 2, 28, 10, 30, 11, 32, 12, 34, 13, 36, 2, 38, 14, 40, 2, 42, 2, 44, 15, 46, 16, 48, 17, 50, 2, 52, 18, 54, 2, 56, 19, 58, 2, 60, 2, 62, 2, 64, 20, 66, 2, 68, 2, 70, 2, 72, 21, 74, 22, 76, 2, 78, 2, 80, 23, 82, 24, 84, 25, 86, 2, 88, 2, 90, 2, 92, 26, 94, 27, 96, 2, 98, 28, 100, 29, 102, 30, 104, 31, 106, 32, 108, 33, 110, 34, 112, 35, 114, 36, 116, 37, 118, 38, 120, 39, 122, 40, 124, 41, 126, 42, 128, 43, 130, 44, 132, 45, 134, 46, 136, 47, 138, 48, 140, 49, 142, 50, 144, 51, 146, 52, 148, 53, 150, 54, 152, 55, 154, 56, 156, 57, 158, 84, 160, 85, 162, 86, 164, 58, 166, 59, 168, 60, 170, 2, 172, 61, 174, 62, 176, 63, 178, 2, 180, 2, 182, 64, 184, 65, 186, 66, 188, 67, 190, 68, 192, 69, 194, 70, 196, 71, 198, 72, 200, 73, 202, 74, 204, 75, 206, 76, 208, 77, 210, 78, 212, 2, 214, 2, 216, 79, 218, 80, 220, 81, 222, 82, 224, 83, 226, 2, 228, 2, 230, 2, 232, 2, 234, 2, 14, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 4, 2, 11, 11, 34, 34, 4, 2, 12, 12, 15, 15, 7, 2, 50, 59, 770, 881, 7618, 7681, 8402, 8449, 65058, 65073, 3, 2, 34, 34, 4, 2, 49, 49, 62, 62, 9, 2, 12, 12, 15, 15, 37, 37, 49, 49, 62, 62, 94, 94, 125, 125, 9, 2, 37, 37, 49, 49, 62, 62, 64, 64, 94, 94, 125, 125, 127, 127, 7, 2, 11, 12, 15, 15, 34, 34, 37, 38, 62, 62, 6, 2, 12, 12, 15, 15, 36, 36, 94, 94, 4, 2, 36, 36, 94, 94, 3, 2, 50, 59, 12, 2, 11, 15, 34, 34, 135, 135, 162, 162, 5762, 5762, 8194, 8204, 8234, 8235, 8241, 8241, 8289, 8289, 12290, 12290, 6, 2, 12, 12, 15, 15, 64, 64, 125, 125, 3, 51, 2, 67, 2, 92, 2, 97, 2, 97, 2, 99, 2, 124, 2, 170, 2, 170, 2, 172, 2, 172, 2, 175, 2, 175, 2, 177, 2, 177, 2, 180, 2, 183, 2, 185, 2, 188, 2, 190, 2, 192, 2, 194, 2, 216, 2, 218, 2, 248, 2, 250, 2, 769, 2, 882, 2, 5761, 2, 5763, 2, 6159, 2, 6161, 2, 7617, 2, 7682, 2, 8193, 2, 8205, 2, 8207, 2, 8236, 2, 8240, 2, 8257, 2, 8258, 2, 8278, 2, 8278, 2, 8290, 2, 8401, 2, 8450, 2, 8593, 2, 9314, 2, 9473, 2, 10104, 2, 10133, 2, 11266, 2, 11777, 2, 11906, 2, 12289, 2, 12294, 2, 12297, 2, 12323, 2, 12337, 2, 12339, 2, 55297, 2, 63746, 2, 64831, 2, 64834, 2, 64977, 2, 65010, 2, 65057, 2, 65074, 2, 65094, 2, 65097, 2, 65535, 2, 2, 3, 65535, 3, 2, 4, 65535, 4, 2, 5, 65535, 5, 2, 6, 65535, 6, 2, 7, 65535, 7, 2, 8, 65535, 8, 2, 9, 65535, 9, 2, 10, 65535, 10, 2, 11, 65535, 11, 2, 12, 65535, 12, 2, 13, 65535, 13, 2, 14, 65535, 14, 2, 15, 65535, 15, 2, 16, 65535, 16, 851, 2, 14, 3, 2, 2, 2, 2, 16, 3, 2, 2, 2, 2, 18, 3, 2, 2, 2, 2, 20, 3, 2, 2, 2, 2, 28, 3, 2, 2, 2, 2, 30, 3, 2, 2, 2, 2, 32, 3, 2, 2, 2, 3, 34, 3, 2, 2, 2, 3, 36, 3, 2, 2, 2, 4, 38, 3, 2, 2, 2, 4, 40, 3, 2, 2, 2, 4, 42, 3, 2, 2, 2, 4, 44, 3, 2, 2, 2, 4, 46, 3, 2, 2, 2, 4, 48, 3, 2, 2, 2, 4, 50, 3, 2, 2, 2, 4, 52, 3, 2, 2, 2, 4, 54, 3, 2, 2, 2, 4, 56, 3, 2, 2, 2, 4, 58, 3, 2, 2, 2, 5, 60, 3, 2, 2, 2, 5, 62, 3, 2, 2, 2, 5, 64, 3, 2, 2, 2, 5, 66, 3, 2, 2, 2, 5, 68, 3, 2, 2, 2, 5, 70, 3, 2, 2, 2, 5, 72, 3, 2, 2, 2, 5, 74, 3, 2, 2, 2, 6, 78, 3, 2, 2, 2, 6, 80, 3, 2, 2, 2, 7, 82, 3, 2, 2, 2, 7, 84, 3, 2, 2, 2, 7, 86, 3, 2, 2, 2, 7, 88, 3, 2, 2, 2, 7, 90, 3, 2, 2, 2, 7, 92, 3, 2, 2, 2, 8, 94, 3, 2, 2, 2, 8, 96, 3, 2, 2, 2, 8, 98, 3, 2, 2, 2, 9, 100, 3, 2, 2, 2, 9, 102, 3, 2, 2, 2, 9, 104, 3, 2, 2, 2, 9, 106, 3, 2, 2, 2, 9, 108, 3, 2, 2, 2, 9, 110, 3, 2, 2, 2, 9, 112, 3, 2, 2, 2, 9, 114, 3, 2, 2, 2, 9, 116, 3, 2, 2, 2, 9, 118, 3, 2, 2, 2, 9, 120, 3, 2, 2, 2, 9, 122, 3, 2, 2, 2, 9, 124, 3, 2, 2, 2, 9, 126, 3, 2, 2, 2, 9, 128, 3, 2, 2, 2, 9, 130, 3, 2, 2, 2, 9, 132, 3, 2, 2, 2, 9, 134, 3, 2, 2, 2, 9, 136, 3, 2, 2, 2, 9, 138, 3, 2, 2, 2, 9, 140, 3, 2, 2, 2, 9, 142, 3, 2, 2, 2, 9, 144, 3, 2, 2, 2, 9, 146, 3, 2, 2, 2, 9, 148, 3, 2, 2, 2, 9, 150, 3, 2, 2, 2, 9, 152, 3, 2, 2, 2, 9, 154, 3, 2, 2, 2, 9, 156, 3, 2, 2, 2, 9, 158, 3, 2, 2, 2, 9, 160, 3, 2, 2, 2, 9, 162, 3, 2, 2, 2, 9, 164, 3, 2, 2, 2, 9, 166, 3, 2, 2, 2, 9, 168, 3, 2, 2, 2, 9, 170, 3, 2, 2, 2, 9, 172, 3, 2, 2, 2, 9, 174, 3, 2, 2, 2, 9, 176, 3, 2, 2, 2, 10, 182, 3, 2, 2, 2, 10, 184, 3, 2, 2, 2, 10, 186, 3, 2, 2, 2, 10, 188, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 10, 192, 3, 2, 2, 2, 10, 194, 3, 2, 2, 2, 10, 196, 3, 2, 2, 2, 10, 198, 3, 2, 2, 2, 10, 200, 3, 2, 2, 2, 10, 202, 3, 2, 2, 2, 10, 204, 3, 2, 2, 2, 10, 206, 3, 2, 2, 2, 10, 208, 3, 2, 2, 2, 10, 210, 3, 2, 2, 2, 10, 212, 3, 2, 2, 2, 10, 214, 3, 2, 2, 2, 11, 216, 3, 2, 2, 2, 11, 218, 3, 2, 2, 2, 11, 220, 3, 2, 2, 2, 11, 222, 3, 2, 2, 2, 12, 224, 3, 2, 2, 2, 12, 226, 3, 2, 2, 2, 12, 228, 3, 2, 2, 2, 13, 230, 3, 2, 2, 2, 13, 232, 3, 2, 2, 2, 13, 234, 3, 2, 2, 2, 14, 237, 3, 2, 2, 2, 16, 243, 3, 2, 2, 2, 18, 259, 3, 2, 2, 2, 20, 269, 3, 2, 2, 2, 22, 274, 3, 2, 2, 2, 24, 278, 3, 2, 2, 2, 26, 281, 3, 2, 2, 2, 28, 285, 3, 2, 2, 2, 30, 291, 3, 2, 2, 2, 32, 300, 3, 2, 2, 2, 34, 305, 3, 2, 2, 2, 36, 309, 3, 2, 2, 2, 38, 315, 3, 2, 2, 2, 40, 319, 3, 2, 2, 2, 42, 324, 3, 2, 2, 2, 44, 329, 3, 2, 2, 2, 46, 335, 3, 2, 2, 2, 48, 338, 3, 2, 2, 2, 50, 343, 3, 2, 2, 2, 52, 349, 3, 2, 2, 2, 54, 354, 3, 2, 2, 2, 56, 360, 3, 2, 2, 2, 58, 366, 3, 2, 2, 2, 60, 371, 3, 2, 2, 2, 62, 380, 3, 2, 2, 2, 64, 384, 3, 2, 2, 2, 66, 389, 3, 2, 2, 2, 68, 395, 3, 2, 2, 2, 70, 400, 3, 2, 2, 2, 72, 407, 3, 2, 2, 2, 74, 417, 3, 2, 2, 2, 76, 419, 3, 2, 2, 2, 78, 421, 3, 2, 2, 2, 80, 426, 3, 2, 2, 2, 82, 430, 3, 2, 2, 2, 84, 434, 3, 2, 2, 2, 86, 438, 3, 2, 2, 2, 88, 444, 3, 2, 2, 2, 90, 449, 3, 2, 2, 2, 92, 454, 3, 2, 2, 2, 94, 456, 3, 2, 2, 2, 96, 460, 3, 2, 2, 2, 98, 465, 3, 2, 2, 2, 100, 471, 3, 2, 2, 2, 102, 475, 3, 2, 2, 2, 104, 480, 3, 2, 2, 2, 106, 486, 3, 2, 2, 2, 108, 494, 3, 2, 2, 2, 110, 501, 3, 2, 2, 2, 112, 508, 3, 2, 2, 2, 114, 516, 3, 2, 2, 2, 116, 521, 3, 2, 2, 2, 118, 526, 3, 2, 2, 2, 120, 533, 3, 2, 2, 2, 122, 540, 3, 2, 2, 2, 124, 546, 3, 2, 2, 2, 126, 552, 3, 2, 2, 2, 128, 558, 3, 2, 2, 2, 130, 560, 3, 2, 2, 2, 132, 563, 3, 2, 2, 2, 134, 566, 3, 2, 2, 2, 136, 569, 3, 2, 2, 2, 138, 572, 3, 2, 2, 2, 140, 575, 3, 2, 2, 2, 142, 577, 3, 2, 2, 2, 144, 579, 3, 2, 2, 2, 146, 581, 3, 2, 2, 2, 148, 583, 3, 2, 2, 2, 150, 585, 3, 2, 2, 2, 152, 587, 3, 2, 2, 2, 154, 589, 3, 2, 2, 2, 156, 591, 3, 2, 2, 2, 158, 594, 3, 2, 2, 2, 160, 603, 3, 2, 2, 2, 162, 612, 3, 2, 2, 2, 164, 619, 3, 2, 2, 2, 166, 630, 3, 2, 2, 2, 168, 632, 3, 2, 2, 2, 170, 636, 3, 2, 2, 2, 172, 643, 3, 2, 2, 2, 174, 646, 3, 2, 2, 2, 176, 653, 3, 2, 2, 2, 178, 656, 3, 2, 2, 2, 180, 660, 3, 2, 2, 2, 182, 662, 3, 2, 2, 2, 184, 664, 3, 2, 2, 2, 186, 668, 3, 2, 2, 2, 188, 675, 3, 2, 2, 2, 190, 686, 3, 2, 2, 2, 192, 694, 3, 2, 2, 2, 194, 702, 3, 2, 2, 2, 196, 708, 3, 2, 2, 2, 198, 717, 3, 2, 2, 2, 200, 729, 3, 2, 2, 2, 202, 738, 3, 2, 2, 2, 204, 747, 3, 2, 2, 2, 206, 756, 3, 2, 2, 2, 208, 767, 3, 2, 2, 2, 210, 775, 3, 2, 2, 2, 212, 780, 3, 2, 2, 2, 214, 786, 3, 2, 2, 2, 216, 791, 3, 2, 2, 2, 218, 793, 3, 2, 2, 2, 220, 798, 3, 2, 2, 2, 222, 803, 3, 2, 2, 2, 224, 807, 3, 2, 2, 2, 226, 809, 3, 2, 2, 2, 228, 814, 3, 2, 2, 2, 230, 820, 3, 2, 2, 2, 232, 825, 3, 2, 2, 2, 234, 830, 3, 2, 2, 2, 236, 238, 9, 2, 2, 2, 237, 236, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 237, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 241, 3, 2, 2, 2, 241, 242, 8, 2, 2, 2, 242, 15, 3, 2, 2, 2, 243, 244, 7, 49, 2, 2, 244, 245, 7, 49, 2, 2, 245, 249, 3, 2, 2, 2, 246, 248, 10, 3, 2, 2, 247, 246, 3, 2, 2, 2, 248, 251, 3, 2, 2, 2, 249, 247, 3, 2, 2, 2, 249, 250, 3, 2, 2, 2, 250, 252, 3, 2, 2, 2, 251, 249, 3, 2, 2, 2, 252, 253, 8, 3, 3, 2, 253, 17, 3, 2, 2, 2, 254, 256, 7, 15, 2, 2, 255, 254, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 260, 7, 12, 2, 2, 258, 260, 7, 15, 2, 2, 259, 255, 3, 2, 2, 2, 259, 258, 3, 2, 2, 2, 260, 264, 3, 2, 2, 2, 261, 263, 9, 2, 2, 2, 262, 261, 3, 2, 2, 2, 263, 266, 3, 2, 2, 2, 264, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 267, 3, 2, 2, 2, 266, 264, 3, 2, 2, 2, 267, 268, 8, 4, 4, 2, 268, 19, 3, 2, 2, 2, 269, 271, 5, 22, 6, 2, 270, 272, 5, 26, 8, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 21, 3, 2, 2, 2, 273, 275, 9, 15, 2, 2, 274, 273, 3, 2, 2, 2, 275, 23, 3, 2, 2, 2, 276, 279, 9, 4, 2, 2, 277, 279, 5, 22, 6, 2, 278, 276, 3, 2, 2, 2, 278, 277, 3, 2, 2, 2, 279, 25, 3, 2, 2, 2, 280, 282, 5, 24, 7, 2, 281, 280, 3, 2, 2, 2, 282, 283, 3, 2, 2, 2, 283, 281, 3, 2, 2, 2, 283, 284, 3, 2, 2, 2, 284, 27, 3, 2, 2, 2, 285, 286, 7, 47, 2, 2, 286, 287, 7, 47, 2, 2, 287, 288, 7, 47, 2, 2, 288, 289, 3, 2, 2, 2, 289, 290, 8, 9, 5, 2, 290, 29, 3, 2, 2, 2, 291, 295, 7, 60, 2, 2, 292, 294, 9, 5, 2, 2, 293, 292, 3, 2, 2, 2, 294, 297, 3, 2, 2, 2, 295, 293, 3, 2, 2, 2, 295, 296, 3, 2, 2, 2, 296, 298, 3, 2, 2, 2, 297, 295, 3, 2, 2, 2, 298, 299, 8, 10, 6, 2, 299, 31, 3, 2, 2, 2, 300, 301, 7, 37, 2, 2, 301, 302, 3, 2, 2, 2, 302, 303, 8, 11, 7, 2, 303, 33, 3, 2, 2, 2, 304, 306, 10, 3, 2, 2, 305, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 35, 3, 2, 2, 2, 309, 310, 5, 18, 4, 2, 310, 311, 3, 2, 2, 2, 311, 312, 8, 13, 8, 2, 312, 313, 8, 13, 4, 2, 313, 314, 8, 13, 9, 2, 314, 37, 3, 2, 2, 2, 315, 316, 5, 14, 2, 2, 316, 317, 3, 2, 2, 2, 317, 318, 8, 14, 2, 2, 318, 39, 3, 2, 2, 2, 319, 320, 5, 18, 4, 2, 320, 321, 3, 2, 2, 2, 321, 322, 8, 15, 8, 2, 322, 323, 8, 15, 4, 2, 323, 41, 3, 2, 2, 2, 324, 325, 5, 16, 3, 2, 325, 326, 3, 2, 2, 2, 326, 327, 8, 16, 10, 2, 327, 328, 8, 16, 3, 2, 328, 43, 3, 2, 2, 2, 329, 330, 7, 63, 2, 2, 330, 331, 7, 63, 2, 2, 331, 332, 7, 63, 2, 2, 332, 333, 3, 2, 2, 2, 333, 334, 8, 17, 9, 2, 334, 45, 3, 2, 2, 2, 335, 336, 7, 47, 2, 2, 336, 337, 7, 64, 2, 2, 337, 47, 3, 2, 2, 2, 338, 339, 7, 62, 2, 2, 339, 340, 7, 62, 2, 2, 340, 341, 3, 2, 2, 2, 341, 342, 8, 19, 11, 2, 342, 49, 3, 2, 2, 2, 343, 344, 7, 37, 2, 2, 344, 345, 3, 2, 2, 2, 345, 346, 8, 20, 12, 2, 346, 347, 8, 20, 13, 2, 347, 348, 8, 20, 7, 2, 348, 51, 3, 2, 2, 2, 349, 350, 7, 125, 2, 2, 350, 351, 3, 2, 2, 2, 351, 352, 8, 21, 14, 2, 352, 353, 8, 21, 15, 2, 353, 53, 3, 2, 2, 2, 354, 355, 7, 94, 2, 2, 355, 356, 7, 93, 2, 2, 356, 357, 3, 2, 2, 2, 357, 358, 8, 22, 16, 2, 358, 359, 8, 22, 14, 2, 359, 55, 3, 2, 2, 2, 360, 361, 7, 94, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 8, 23, 2, 2, 363, 364, 8, 23, 14, 2, 364, 365, 8, 23, 17, 2, 365, 57, 3, 2, 2, 2, 366, 367, 11, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 369, 8, 24, 16, 2, 369, 370, 8, 24, 14, 2, 370, 59, 3, 2, 2, 2, 371, 372, 5, 18, 4, 2, 372, 373, 3, 2, 2, 2, 373, 374, 8, 25, 8, 2, 374, 375, 8, 25, 9, 2, 375, 61, 3, 2, 2, 2, 376, 377, 7, 94, 2, 2, 377, 381, 7, 93, 2, 2, 378, 379, 7, 94, 2, 2, 379, 381, 7, 95, 2, 2, 380, 376, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 381, 382, 3, 2, 2, 2, 382, 383, 8, 26, 16, 2, 383, 63, 3, 2, 2, 2, 384, 385, 7, 94, 2, 2, 385, 386, 3, 2, 2, 2, 386, 387, 8, 27, 18, 2, 387, 388, 8, 27, 17, 2, 388, 65, 3, 2, 2, 2, 389, 390, 5, 32, 11, 2, 390, 391, 3, 2, 2, 2, 391, 392, 8, 28, 12, 2, 392, 393, 8, 28, 19, 2, 393, 394, 8, 28, 7, 2, 394, 67, 3, 2, 2, 2, 395, 396, 7, 125, 2, 2, 396, 397, 3, 2, 2, 2, 397, 398, 8, 29, 20, 2, 398, 399, 8, 29, 15, 2, 399, 69, 3, 2, 2, 2, 400, 401, 7, 62, 2, 2, 401, 402, 7, 62, 2, 2, 402, 403, 3, 2, 2, 2, 403, 404, 8, 30, 21, 2, 404, 405, 8, 30, 19, 2, 405, 406, 8, 30, 11, 2, 406, 71, 3, 2, 2, 2, 407, 408, 5, 16, 3, 2, 408, 409, 3, 2, 2, 2, 409, 410, 8, 31, 3, 2, 410, 73, 3, 2, 2, 2, 411, 413, 5, 76, 33, 2, 412, 411, 3, 2, 2, 2, 413, 414, 3, 2, 2, 2, 414, 412, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 418, 3, 2, 2, 2, 416, 418, 9, 6, 2, 2, 417, 412, 3, 2, 2, 2, 417, 416, 3, 2, 2, 2, 418, 75, 3, 2, 2, 2, 419, 420, 10, 7, 2, 2, 420, 77, 3, 2, 2, 2, 421, 422, 9, 8, 2, 2, 422, 423, 3, 2, 2, 2, 423, 424, 8, 34, 16, 2, 424, 425, 8, 34, 9, 2, 425, 79, 3, 2, 2, 2, 426, 427, 11, 2, 2, 2, 427, 428, 3, 2, 2, 2, 428, 429, 8, 35, 9, 2, 429, 81, 3, 2, 2, 2, 430, 431, 5, 14, 2, 2, 431, 432, 3, 2, 2, 2, 432, 433, 8, 36, 2, 2, 433, 83, 3, 2, 2, 2, 434, 435, 5, 16, 3, 2, 435, 436, 3, 2, 2, 2, 436, 437, 8, 37, 3, 2, 437, 85, 3, 2, 2, 2, 438, 439, 7, 62, 2, 2, 439, 440, 7, 62, 2, 2, 440, 441, 3, 2, 2, 2, 441, 442, 8, 38, 21, 2, 442, 443, 8, 38, 11, 2, 443, 87, 3, 2, 2, 2, 444, 445, 7, 37, 2, 2, 445, 446, 3, 2, 2, 2, 446, 447, 8, 39, 12, 2, 447, 448, 8, 39, 7, 2, 448, 89, 3, 2, 2, 2, 449, 450, 5, 18, 4, 2, 450, 451, 3, 2, 2, 2, 451, 452, 8, 40, 8, 2, 452, 453, 8, 40, 9, 2, 453, 91, 3, 2, 2, 2, 454, 455, 11, 2, 2, 2, 455, 93, 3, 2, 2, 2, 456, 457, 5, 14, 2, 2, 457, 458, 3, 2, 2, 2, 458, 459, 8, 42, 2, 2, 459, 95, 3, 2, 2, 2, 460, 461, 5, 32, 11, 2, 461, 462, 3, 2, 2, 2, 462, 463, 8, 43, 12, 2, 463, 97, 3, 2, 2, 2, 464, 466, 10, 9, 2, 2, 465, 464, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 465, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 470, 8, 44, 9, 2, 470, 99, 3, 2, 2, 2, 471, 472, 5, 14, 2, 2, 472, 473, 3, 2, 2, 2, 473, 474, 8, 45, 2, 2, 474, 101, 3, 2, 2, 2, 475, 476, 7, 118, 2, 2, 476, 477, 7, 116, 2, 2, 477, 478, 7, 119, 2, 2, 478, 479, 7, 103, 2, 2, 479, 103, 3, 2, 2, 2, 480, 481, 7, 104, 2, 2, 481, 482, 7, 99, 2, 2, 482, 483, 7, 110, 2, 2, 483, 484, 7, 117, 2, 2, 484, 485, 7, 103, 2, 2, 485, 105, 3, 2, 2, 2, 486, 487, 7, 112, 2, 2, 487, 488, 7, 119, 2, 2, 488, 489, 7, 110, 2, 2, 489, 490, 7, 110, 2, 2, 490, 107, 3, 2, 2, 2, 491, 495, 7, 63, 2, 2, 492, 493, 7, 118, 2, 2, 493, 495, 7, 113, 2, 2, 494, 491, 3, 2, 2, 2, 494, 492, 3, 2, 2, 2, 495, 109, 3, 2, 2, 2, 496, 497, 7, 62, 2, 2, 497, 502, 7, 63, 2, 2, 498, 499, 7, 110, 2, 2, 499, 500, 7, 118, 2, 2, 500, 502, 7, 103, 2, 2, 501, 496, 3, 2, 2, 2, 501, 498, 3, 2, 2, 2, 502, 111, 3, 2, 2, 2, 503, 504, 7, 64, 2, 2, 504, 509, 7, 63, 2, 2, 505, 506, 7, 105, 2, 2, 506, 507, 7, 118, 2, 2, 507, 509, 7, 103, 2, 2, 508, 503, 3, 2, 2, 2, 508, 505, 3, 2, 2, 2, 509, 113, 3, 2, 2, 2, 510, 511, 7, 63, 2, 2, 511, 517, 7, 63, 2, 2, 512, 513, 7, 107, 2, 2, 513, 517, 7, 117, 2, 2, 514, 515, 7, 103, 2, 2, 515, 517, 7, 115, 2, 2, 516, 510, 3, 2, 2, 2, 516, 512, 3, 2, 2, 2, 516, 514, 3, 2, 2, 2, 517, 115, 3, 2, 2, 2, 518, 522, 7, 62, 2, 2, 519, 520, 7, 110, 2, 2, 520, 522, 7, 118, 2, 2, 521, 518, 3, 2, 2, 2, 521, 519, 3, 2, 2, 2, 522, 117, 3, 2, 2, 2, 523, 527, 7, 64, 2, 2, 524, 525, 7, 105, 2, 2, 525, 527, 7, 118, 2, 2, 526, 523, 3, 2, 2, 2, 526, 524, 3, 2, 2, 2, 527, 119, 3, 2, 2, 2, 528, 529, 7, 35, 2, 2, 529, 534, 7, 63, 2, 2, 530, 531, 7, 112, 2, 2, 531, 532, 7, 103, 2, 2, 532, 534, 7, 115, 2, 2, 533, 528, 3, 2, 2, 2, 533, 530, 3, 2, 2, 2, 534, 121, 3, 2, 2, 2, 535, 536, 7, 99, 2, 2, 536, 537, 7, 112, 2, 2, 537, 541, 7, 102, 2, 2, 538, 539, 7, 40, 2, 2, 539, 541, 7, 40, 2, 2, 540, 535, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 541, 123, 3, 2, 2, 2, 542, 543, 7, 113, 2, 2, 543, 547, 7, 116, 2, 2, 544, 545, 7, 126, 2, 2, 545, 547, 7, 126, 2, 2, 546, 542, 3, 2, 2, 2, 546, 544, 3, 2, 2, 2, 547, 125, 3, 2, 2, 2, 548, 549, 7, 122, 2, 2, 549, 550, 7, 113, 2, 2, 550, 553, 7, 116, 2, 2, 551, 553, 7, 96, 2, 2, 552, 548, 3, 2, 2, 2, 552, 551, 3, 2, 2, 2, 553, 127, 3, 2, 2, 2, 554, 555, 7, 112, 2, 2, 555, 556, 7, 113, 2, 2, 556, 559, 7, 118, 2, 2, 557, 559, 7, 35, 2, 2, 558, 554, 3, 2, 2, 2, 558, 557, 3, 2, 2, 2, 559, 129, 3, 2, 2, 2, 560, 561, 7, 45, 2, 2, 561, 562, 7, 63, 2, 2, 562, 131, 3, 2, 2, 2, 563, 564, 7, 47, 2, 2, 564, 565, 7, 63, 2, 2, 565, 133, 3, 2, 2, 2, 566, 567, 7, 44, 2, 2, 567, 568, 7, 63, 2, 2, 568, 135, 3, 2, 2, 2, 569, 570, 7, 39, 2, 2, 570, 571, 7, 63, 2, 2, 571, 137, 3, 2, 2, 2, 572, 573, 7, 49, 2, 2, 573, 574, 7, 63, 2, 2, 574, 139, 3, 2, 2, 2, 575, 576, 7, 45, 2, 2, 576, 141, 3, 2, 2, 2, 577, 578, 7, 47, 2, 2, 578, 143, 3, 2, 2, 2, 579, 580, 7, 44, 2, 2, 580, 145, 3, 2, 2, 2, 581, 582, 7, 49, 2, 2, 582, 147, 3, 2, 2, 2, 583, 584, 7, 39, 2, 2, 584, 149, 3, 2, 2, 2, 585, 586, 7, 42, 2, 2, 586, 151, 3, 2, 2, 2, 587, 588, 7, 43, 2, 2, 588, 153, 3, 2, 2, 2, 589, 590, 7, 46, 2, 2, 590, 155, 3, 2, 2, 2, 591, 592, 7, 99, 2, 2, 592, 593, 7, 117, 2, 2, 593, 157, 3, 2, 2, 2, 594, 595, 7, 117, 2, 2, 595, 596, 7, 118, 2, 2, 596, 597, 7, 116, 2, 2, 597, 598, 7, 107, 2, 2, 598, 599, 7, 112, 2, 2, 599, 600, 7, 105, 2, 2, 600, 601, 3, 2, 2, 2, 601, 602, 8, 74, 22, 2, 602, 159, 3, 2, 2, 2, 603, 604, 7, 112, 2, 2, 604, 605, 7, 119, 2, 2, 605, 606, 7, 111, 2, 2, 606, 607, 7, 100, 2, 2, 607, 608, 7, 103, 2, 2, 608, 609, 7, 116, 2, 2, 609, 610, 3, 2, 2, 2, 610, 611, 8, 75, 22, 2, 611, 161, 3, 2, 2, 2, 612, 613, 7, 100, 2, 2, 613, 614, 7, 113, 2, 2, 614, 615, 7, 113, 2, 2, 615, 616, 7, 110, 2, 2, 616, 617, 3, 2, 2, 2, 617, 618, 8, 76, 22, 2, 618, 163, 3, 2, 2, 2, 619, 625, 7, 36, 2, 2, 620, 624, 10, 10, 2, 2, 621, 622, 7, 94, 2, 2, 622, 624, 9, 11, 2, 2, 623, 620, 3, 2, 2, 2, 623, 621, 3, 2, 2, 2, 624, 627, 3, 2, 2, 2, 625, 623, 3, 2, 2, 2, 625, 626, 3, 2, 2, 2, 626, 628, 3, 2, 2, 2, 627, 625, 3, 2, 2, 2, 628, 629, 7, 36, 2, 2, 629, 165, 3, 2, 2, 2, 630, 631, 5, 20, 5, 2, 631, 167, 3, 2, 2, 2, 632, 633, 7, 127, 2, 2, 633, 634, 3, 2, 2, 2, 634, 635, 8, 79, 9, 2, 635, 169, 3, 2, 2, 2, 636, 637, 7, 64, 2, 2, 637, 638, 7, 64, 2, 2, 638, 639, 3, 2, 2, 2, 639, 640, 8, 80, 23, 2, 640, 641, 8, 80, 9, 2, 641, 642, 8, 80, 9, 2, 642, 171, 3, 2, 2, 2, 643, 644, 7, 38, 2, 2, 644, 645, 5, 20, 5, 2, 645, 173, 3, 2, 2, 2, 646, 647, 7, 48, 2, 2, 647, 175, 3, 2, 2, 2, 648, 654, 5, 178, 84, 2, 649, 650, 5, 178, 84, 2, 650, 651, 7, 48, 2, 2, 651, 652, 5, 178, 84, 2, 652, 654, 3, 2, 2, 2, 653, 648, 3, 2, 2, 2, 653, 649, 3, 2, 2, 2, 654, 177, 3, 2, 2, 2, 655, 657, 5, 180, 85, 2, 656, 655, 3, 2, 2, 2, 657, 658, 3, 2, 2, 2, 658, 656, 3, 2, 2, 2, 658, 659, 3, 2, 2, 2, 659, 179, 3, 2, 2, 2, 660, 661, 9, 12, 2, 2, 661, 181, 3, 2, 2, 2, 662, 663, 5, 18, 4, 2, 663, 183, 3, 2, 2, 2, 664, 665, 5, 14, 2, 2, 665, 666, 3, 2, 2, 2, 666, 667, 8, 87, 2, 2, 667, 185, 3, 2, 2, 2, 668, 669, 7, 107, 2, 2, 669, 670, 7, 104, 2, 2, 670, 671, 3, 2, 2, 2, 671, 672, 9, 13, 2, 2, 672, 673, 3, 2, 2, 2, 673, 674, 8, 88, 15, 2, 674, 187, 3, 2, 2, 2, 675, 676, 7, 103, 2, 2, 676, 677, 7, 110, 2, 2, 677, 678, 7, 117, 2, 2, 678, 679, 7, 103, 2, 2, 679, 680, 7, 107, 2, 2, 680, 681, 7, 104, 2, 2, 681, 682, 3, 2, 2, 2, 682, 683, 9, 13, 2, 2, 683, 684, 3, 2, 2, 2, 684, 685, 8, 89, 15, 2, 685, 189, 3, 2, 2, 2, 686, 687, 7, 103, 2, 2, 687, 688, 7, 110, 2, 2, 688, 689, 7, 117, 2, 2, 689, 690, 7, 103, 2, 2, 690, 692, 3, 2, 2, 2, 691, 693, 9, 13, 2, 2, 692, 691, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 191, 3, 2, 2, 2, 694, 695, 7, 117, 2, 2, 695, 696, 7, 103, 2, 2, 696, 697, 7, 118, 2, 2, 697, 698, 3, 2, 2, 2, 698, 699, 9, 13, 2, 2, 699, 700, 3, 2, 2, 2, 700, 701, 8, 91, 15, 2, 701, 193, 3, 2, 2, 2, 702, 703, 7, 103, 2, 2, 703, 704, 7, 112, 2, 2, 704, 705, 7, 102, 2, 2, 705, 706, 7, 107, 2, 2, 706, 707, 7, 104, 2, 2, 707, 195, 3, 2, 2, 2, 708, 709, 7, 101, 2, 2, 709, 710, 7, 99, 2, 2, 710, 711, 7, 110, 2, 2, 711, 712, 7, 110, 2, 2, 712, 713, 3, 2, 2, 2, 713, 714, 9, 13, 2, 2, 714, 715, 3, 2, 2, 2, 715, 716, 8, 93, 15, 2, 716, 197, 3, 2, 2, 2, 717, 718, 7, 102, 2, 2, 718, 719, 7, 103, 2, 2, 719, 720, 7, 101, 2, 2, 720, 721, 7, 110, 2, 2, 721, 722, 7, 99, 2, 2, 722, 723, 7, 116, 2, 2, 723, 724, 7, 103, 2, 2, 724, 725, 3, 2, 2, 2, 725, 726, 9, 13, 2, 2, 726, 727, 3, 2, 2, 2, 727, 728, 8, 94, 15, 2, 728, 199, 3, 2, 2, 2, 729, 730, 7, 108, 2, 2, 730, 731, 7, 119, 2, 2, 731, 732, 7, 111, 2, 2, 732, 733, 7, 114, 2, 2, 733, 734, 3, 2, 2, 2, 734, 735, 9, 13, 2, 2, 735, 736, 3, 2, 2, 2, 736, 737, 8, 95, 24, 2, 737, 201, 3, 2, 2, 2, 738, 739, 7, 103, 2, 2, 739, 740, 7, 112, 2, 2, 740, 741, 7, 119, 2, 2, 741, 742, 7, 111, 2, 2, 742, 743, 3, 2, 2, 2, 743, 744, 9, 13, 2, 2, 744, 745, 3, 2, 2, 2, 745, 746, 8, 96, 25, 2, 746, 203, 3, 2, 2, 2, 747, 748, 7, 101, 2, 2, 748, 749, 7, 99, 2, 2, 749, 750, 7, 117, 2, 2, 750, 751, 7, 103, 2, 2, 751, 752, 3, 2, 2, 2, 752, 753, 9, 13, 2, 2, 753, 754, 3, 2, 2, 2, 754, 755, 8, 97, 25, 2, 755, 205, 3, 2, 2, 2, 756, 757, 7, 103, 2, 2, 757, 758, 7, 112, 2, 2, 758, 759, 7, 102, 2, 2, 759, 760, 7, 103, 2, 2, 760, 761, 7, 112, 2, 2, 761, 762, 7, 119, 2, 2, 762, 763, 7, 111, 2, 2, 763, 765, 3, 2, 2, 2, 764, 766, 9, 13, 2, 2, 765, 764, 3, 2, 2, 2, 765, 766, 3, 2, 2, 2, 766, 207, 3, 2, 2, 2, 767, 768, 7, 110, 2, 2, 768, 769, 7, 113, 2, 2, 769, 770, 7, 101, 2, 2, 770, 771, 7, 99, 2, 2, 771, 772, 7, 110, 2, 2, 772, 773, 3, 2, 2, 2, 773, 774, 9, 13, 2, 2, 774, 209, 3, 2, 2, 2, 775, 776, 7, 64, 2, 2, 776, 777, 7, 64, 2, 2, 777, 778, 3, 2, 2, 2, 778, 779, 8, 100, 9, 2, 779, 211, 3, 2, 2, 2, 780, 781, 7, 125, 2, 2, 781, 782, 3, 2, 2, 2, 782, 783, 8, 101, 26, 2, 783, 784, 8, 101, 27, 2, 784, 785, 8, 101, 15, 2, 785, 213, 3, 2, 2, 2, 786, 787, 11, 2, 2, 2, 787, 788, 3, 2, 2, 2, 788, 789, 8, 102, 28, 2, 789, 790, 8, 102, 27, 2, 790, 215, 3, 2, 2, 2, 791, 792, 5, 18, 4, 2, 792, 217, 3, 2, 2, 2, 793, 794, 7, 64, 2, 2, 794, 795, 7, 64, 2, 2, 795, 796, 3, 2, 2, 2, 796, 797, 8, 104, 9, 2, 797, 219, 3, 2, 2, 2, 798, 799, 7, 125, 2, 2, 799, 800, 3, 2, 2, 2, 800, 801, 8, 105, 15, 2, 801, 221, 3, 2, 2, 2, 802, 804, 10, 14, 2, 2, 803, 802, 3, 2, 2, 2, 804, 805, 3, 2, 2, 2, 805, 803, 3, 2, 2, 2, 805, 806, 3, 2, 2, 2, 806, 223, 3, 2, 2, 2, 807, 808, 5, 18, 4, 2, 808, 225, 3, 2, 2, 2, 809, 810, 5, 20, 5, 2, 810, 811, 3, 2, 2, 2, 811, 812, 8, 108, 29, 2, 812, 813, 8, 108, 9, 2, 813, 227, 3, 2, 2, 2, 814, 815, 7, 64, 2, 2, 815, 816, 7, 64, 2, 2, 816, 817, 3, 2, 2, 2, 817, 818, 8, 109, 23, 2, 818, 819, 8, 109, 9, 2, 819, 229, 3, 2, 2, 2, 820, 821, 5, 20, 5, 2, 821, 822, 3, 2, 2, 2, 822, 823, 8, 110, 29, 2, 823, 824, 8, 110, 9, 2, 824, 231, 3, 2, 2, 2, 825, 826, 5, 52, 21, 2, 826, 827, 3, 2, 2, 2, 827, 828, 8, 111, 20, 2, 828, 829, 8, 111, 30, 2, 829, 233, 3, 2, 2, 2, 830, 831, 7, 64, 2, 2, 831, 832, 7, 64, 2, 2, 832, 833, 3, 2, 2, 2, 833, 834, 8, 112, 23, 2, 834, 835, 8, 112, 9, 2, 835, 235, 3, 2, 2, 2, 47, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 239, 249, 255, 259, 264, 271, 274, 278, 283, 295, 307, 380, 414, 417, 467, 494, 501, 508, 516, 521, 526, 533, 540, 546, 552, 558, 623, 625, 653, 658, 692, 765, 805, 31, 2, 3, 2, 2, 5, 2, 2, 4, 2, 7, 4, 2, 7, 3, 2, 7, 8, 2, 9, 8, 2, 6, 2, 2, 9, 7, 2, 7, 10, 2, 9, 12, 2, 7, 7, 2, 7, 5, 2, 7, 9, 2, 9, 22, 2, 7, 6, 2, 8, 2, 2, 4, 7, 2, 9, 18, 2, 9, 17, 2, 9, 59, 2, 9, 78, 2, 7, 13, 2, 7, 12, 2, 9, 81, 2, 4, 11, 2, 9, 82, 2, 9, 9, 2, 4, 9, 2] \ No newline at end of file diff --git a/crates/compiler/src/parser/generated/YarnSpinnerLexer.tokens b/crates/compiler/src/parser/generated/YarnSpinnerLexer.tokens index 3070e43ad..72d448475 100644 --- a/crates/compiler/src/parser/generated/YarnSpinnerLexer.tokens +++ b/crates/compiler/src/parser/generated/YarnSpinnerLexer.tokens @@ -59,26 +59,29 @@ EXPRESSION_END=58 VAR_ID=59 DOT=60 NUMBER=61 -COMMAND_WS=62 -COMMAND_IF=63 -COMMAND_ELSEIF=64 -COMMAND_ELSE=65 -COMMAND_SET=66 -COMMAND_ENDIF=67 -COMMAND_CALL=68 -COMMAND_DECLARE=69 -COMMAND_JUMP=70 -COMMAND_ENUM=71 -COMMAND_CASE=72 -COMMAND_ENDENUM=73 -COMMAND_LOCAL=74 -COMMAND_END=75 -COMMAND_TEXT_END=76 -COMMAND_EXPRESSION_START=77 -COMMAND_TEXT=78 -TYPE_STRING=79 -TYPE_NUMBER=80 -TYPE_BOOL=81 +COMMAND_NEWLINE=62 +COMMAND_WS=63 +COMMAND_IF=64 +COMMAND_ELSEIF=65 +COMMAND_ELSE=66 +COMMAND_SET=67 +COMMAND_ENDIF=68 +COMMAND_CALL=69 +COMMAND_DECLARE=70 +COMMAND_JUMP=71 +COMMAND_ENUM=72 +COMMAND_CASE=73 +COMMAND_ENDENUM=74 +COMMAND_LOCAL=75 +COMMAND_END=76 +COMMAND_TEXT_NEWLINE=77 +COMMAND_TEXT_END=78 +COMMAND_EXPRESSION_START=79 +COMMAND_TEXT=80 +COMMAND_ID_NEWLINE=81 +TYPE_STRING=82 +TYPE_NUMBER=83 +TYPE_BOOL=84 '---'=8 '#'=10 '==='=13 @@ -102,10 +105,10 @@ TYPE_BOOL=81 ')'=53 ','=54 'as'=55 -'string'=79 -'number'=80 -'bool'=81 +'string'=82 +'number'=83 +'bool'=84 '}'=58 '.'=60 -'endif'=67 -'{'=77 +'endif'=68 +'{'=79 diff --git a/crates/compiler/src/parser/generated/YarnSpinnerParser.interp b/crates/compiler/src/parser/generated/YarnSpinnerParser.interp index 13f80dc33..b0e2f168c 100644 --- a/crates/compiler/src/parser/generated/YarnSpinnerParser.interp +++ b/crates/compiler/src/parser/generated/YarnSpinnerParser.interp @@ -66,6 +66,7 @@ null null null null +null 'endif' null null @@ -76,8 +77,10 @@ null null null null +null '{' null +null 'string' 'number' 'bool' @@ -145,6 +148,7 @@ EXPRESSION_END VAR_ID DOT NUMBER +COMMAND_NEWLINE COMMAND_WS COMMAND_IF COMMAND_ELSEIF @@ -159,9 +163,11 @@ COMMAND_CASE COMMAND_ENDENUM COMMAND_LOCAL COMMAND_END +COMMAND_TEXT_NEWLINE COMMAND_TEXT_END COMMAND_EXPRESSION_START COMMAND_TEXT +COMMAND_ID_NEWLINE TYPE_STRING TYPE_NUMBER TYPE_BOOL @@ -196,4 +202,4 @@ jump_statement atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 83, 317, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 3, 2, 7, 2, 56, 10, 2, 12, 2, 14, 2, 59, 11, 2, 3, 2, 6, 2, 62, 10, 2, 13, 2, 14, 2, 63, 3, 3, 3, 3, 3, 3, 3, 4, 6, 4, 70, 10, 4, 13, 4, 14, 4, 71, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 5, 5, 81, 10, 5, 3, 6, 7, 6, 84, 10, 6, 12, 6, 14, 6, 87, 11, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 99, 10, 7, 12, 7, 14, 7, 102, 11, 7, 3, 7, 5, 7, 105, 10, 7, 3, 8, 3, 8, 5, 8, 109, 10, 8, 3, 8, 7, 8, 112, 10, 8, 12, 8, 14, 8, 115, 11, 8, 3, 8, 3, 8, 3, 9, 6, 9, 120, 10, 9, 13, 9, 14, 9, 121, 3, 9, 3, 9, 3, 9, 3, 9, 6, 9, 128, 10, 9, 13, 9, 14, 9, 129, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 150, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 7, 12, 167, 10, 12, 12, 12, 14, 12, 170, 11, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 179, 10, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 5, 15, 186, 10, 15, 3, 15, 3, 15, 7, 15, 190, 10, 15, 12, 15, 14, 15, 193, 11, 15, 3, 15, 3, 15, 3, 16, 3, 16, 7, 16, 199, 10, 16, 12, 16, 14, 16, 202, 11, 16, 3, 16, 5, 16, 205, 10, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 7, 17, 216, 10, 17, 12, 17, 14, 17, 219, 11, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 226, 10, 18, 12, 18, 14, 18, 229, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 235, 10, 19, 12, 19, 14, 19, 238, 11, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 256, 10, 22, 12, 22, 14, 22, 259, 11, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 266, 10, 23, 12, 23, 14, 23, 269, 11, 23, 3, 24, 7, 24, 272, 10, 24, 12, 24, 14, 24, 275, 11, 24, 3, 24, 3, 24, 5, 24, 279, 10, 24, 3, 25, 3, 25, 3, 25, 3, 25, 7, 25, 285, 10, 25, 12, 25, 14, 25, 288, 11, 25, 3, 25, 5, 25, 291, 10, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 300, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 315, 10, 27, 3, 27, 2, 3, 22, 28, 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, 2, 8, 3, 2, 51, 53, 3, 2, 49, 50, 4, 2, 34, 35, 37, 38, 4, 2, 36, 36, 39, 39, 3, 2, 40, 42, 4, 2, 33, 33, 44, 48, 2, 339, 2, 57, 3, 2, 2, 2, 4, 65, 3, 2, 2, 2, 6, 69, 3, 2, 2, 2, 8, 77, 3, 2, 2, 2, 10, 85, 3, 2, 2, 2, 12, 104, 3, 2, 2, 2, 14, 106, 3, 2, 2, 2, 16, 127, 3, 2, 2, 2, 18, 131, 3, 2, 2, 2, 20, 134, 3, 2, 2, 2, 22, 149, 3, 2, 2, 2, 24, 178, 3, 2, 2, 2, 26, 180, 3, 2, 2, 2, 28, 182, 3, 2, 2, 2, 30, 196, 3, 2, 2, 2, 32, 210, 3, 2, 2, 2, 34, 220, 3, 2, 2, 2, 36, 230, 3, 2, 2, 2, 38, 239, 3, 2, 2, 2, 40, 246, 3, 2, 2, 2, 42, 251, 3, 2, 2, 2, 44, 267, 3, 2, 2, 2, 46, 273, 3, 2, 2, 2, 48, 280, 3, 2, 2, 2, 50, 292, 3, 2, 2, 2, 52, 314, 3, 2, 2, 2, 54, 56, 5, 4, 3, 2, 55, 54, 3, 2, 2, 2, 56, 59, 3, 2, 2, 2, 57, 55, 3, 2, 2, 2, 57, 58, 3, 2, 2, 2, 58, 61, 3, 2, 2, 2, 59, 57, 3, 2, 2, 2, 60, 62, 5, 6, 4, 2, 61, 60, 3, 2, 2, 2, 62, 63, 3, 2, 2, 2, 63, 61, 3, 2, 2, 2, 63, 64, 3, 2, 2, 2, 64, 3, 3, 2, 2, 2, 65, 66, 7, 12, 2, 2, 66, 67, 7, 28, 2, 2, 67, 5, 3, 2, 2, 2, 68, 70, 5, 8, 5, 2, 69, 68, 3, 2, 2, 2, 70, 71, 3, 2, 2, 2, 71, 69, 3, 2, 2, 2, 71, 72, 3, 2, 2, 2, 72, 73, 3, 2, 2, 2, 73, 74, 7, 10, 2, 2, 74, 75, 5, 10, 6, 2, 75, 76, 7, 15, 2, 2, 76, 7, 3, 2, 2, 2, 77, 78, 7, 9, 2, 2, 78, 80, 7, 11, 2, 2, 79, 81, 7, 13, 2, 2, 80, 79, 3, 2, 2, 2, 80, 81, 3, 2, 2, 2, 81, 9, 3, 2, 2, 2, 82, 84, 5, 12, 7, 2, 83, 82, 3, 2, 2, 2, 84, 87, 3, 2, 2, 2, 85, 83, 3, 2, 2, 2, 85, 86, 3, 2, 2, 2, 86, 11, 3, 2, 2, 2, 87, 85, 3, 2, 2, 2, 88, 105, 5, 14, 8, 2, 89, 105, 5, 30, 16, 2, 90, 105, 5, 38, 20, 2, 91, 105, 5, 46, 24, 2, 92, 105, 5, 40, 21, 2, 93, 105, 5, 42, 22, 2, 94, 105, 5, 50, 26, 2, 95, 105, 5, 52, 27, 2, 96, 100, 7, 3, 2, 2, 97, 99, 5, 12, 7, 2, 98, 97, 3, 2, 2, 2, 99, 102, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 100, 101, 3, 2, 2, 2, 101, 103, 3, 2, 2, 2, 102, 100, 3, 2, 2, 2, 103, 105, 7, 4, 2, 2, 104, 88, 3, 2, 2, 2, 104, 89, 3, 2, 2, 2, 104, 90, 3, 2, 2, 2, 104, 91, 3, 2, 2, 2, 104, 92, 3, 2, 2, 2, 104, 93, 3, 2, 2, 2, 104, 94, 3, 2, 2, 2, 104, 95, 3, 2, 2, 2, 104, 96, 3, 2, 2, 2, 105, 13, 3, 2, 2, 2, 106, 108, 5, 16, 9, 2, 107, 109, 5, 20, 11, 2, 108, 107, 3, 2, 2, 2, 108, 109, 3, 2, 2, 2, 109, 113, 3, 2, 2, 2, 110, 112, 5, 18, 10, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 116, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 7, 8, 2, 2, 117, 15, 3, 2, 2, 2, 118, 120, 7, 22, 2, 2, 119, 118, 3, 2, 2, 2, 120, 121, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 121, 122, 3, 2, 2, 2, 122, 128, 3, 2, 2, 2, 123, 124, 7, 18, 2, 2, 124, 125, 5, 22, 12, 2, 125, 126, 7, 60, 2, 2, 126, 128, 3, 2, 2, 2, 127, 119, 3, 2, 2, 2, 127, 123, 3, 2, 2, 2, 128, 129, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 129, 130, 3, 2, 2, 2, 130, 17, 3, 2, 2, 2, 131, 132, 7, 12, 2, 2, 132, 133, 7, 28, 2, 2, 133, 19, 3, 2, 2, 2, 134, 135, 7, 17, 2, 2, 135, 136, 7, 65, 2, 2, 136, 137, 5, 22, 12, 2, 137, 138, 7, 77, 2, 2, 138, 21, 3, 2, 2, 2, 139, 140, 8, 12, 1, 2, 140, 141, 7, 54, 2, 2, 141, 142, 5, 22, 12, 2, 142, 143, 7, 55, 2, 2, 143, 150, 3, 2, 2, 2, 144, 145, 7, 50, 2, 2, 145, 150, 5, 22, 12, 10, 146, 147, 7, 43, 2, 2, 147, 150, 5, 22, 12, 9, 148, 150, 5, 24, 13, 2, 149, 139, 3, 2, 2, 2, 149, 144, 3, 2, 2, 2, 149, 146, 3, 2, 2, 2, 149, 148, 3, 2, 2, 2, 150, 168, 3, 2, 2, 2, 151, 152, 12, 8, 2, 2, 152, 153, 9, 2, 2, 2, 153, 167, 5, 22, 12, 9, 154, 155, 12, 7, 2, 2, 155, 156, 9, 3, 2, 2, 156, 167, 5, 22, 12, 8, 157, 158, 12, 6, 2, 2, 158, 159, 9, 4, 2, 2, 159, 167, 5, 22, 12, 7, 160, 161, 12, 5, 2, 2, 161, 162, 9, 5, 2, 2, 162, 167, 5, 22, 12, 6, 163, 164, 12, 4, 2, 2, 164, 165, 9, 6, 2, 2, 165, 167, 5, 22, 12, 5, 166, 151, 3, 2, 2, 2, 166, 154, 3, 2, 2, 2, 166, 157, 3, 2, 2, 2, 166, 160, 3, 2, 2, 2, 166, 163, 3, 2, 2, 2, 167, 170, 3, 2, 2, 2, 168, 166, 3, 2, 2, 2, 168, 169, 3, 2, 2, 2, 169, 23, 3, 2, 2, 2, 170, 168, 3, 2, 2, 2, 171, 179, 7, 63, 2, 2, 172, 179, 7, 30, 2, 2, 173, 179, 7, 31, 2, 2, 174, 179, 5, 26, 14, 2, 175, 179, 7, 58, 2, 2, 176, 179, 7, 32, 2, 2, 177, 179, 5, 28, 15, 2, 178, 171, 3, 2, 2, 2, 178, 172, 3, 2, 2, 2, 178, 173, 3, 2, 2, 2, 178, 174, 3, 2, 2, 2, 178, 175, 3, 2, 2, 2, 178, 176, 3, 2, 2, 2, 178, 177, 3, 2, 2, 2, 179, 25, 3, 2, 2, 2, 180, 181, 7, 61, 2, 2, 181, 27, 3, 2, 2, 2, 182, 183, 7, 59, 2, 2, 183, 185, 7, 54, 2, 2, 184, 186, 5, 22, 12, 2, 185, 184, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 191, 3, 2, 2, 2, 187, 188, 7, 56, 2, 2, 188, 190, 5, 22, 12, 2, 189, 187, 3, 2, 2, 2, 190, 193, 3, 2, 2, 2, 191, 189, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 194, 3, 2, 2, 2, 193, 191, 3, 2, 2, 2, 194, 195, 7, 55, 2, 2, 195, 29, 3, 2, 2, 2, 196, 200, 5, 32, 17, 2, 197, 199, 5, 34, 18, 2, 198, 197, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 204, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 203, 205, 5, 36, 19, 2, 204, 203, 3, 2, 2, 2, 204, 205, 3, 2, 2, 2, 205, 206, 3, 2, 2, 2, 206, 207, 7, 17, 2, 2, 207, 208, 7, 69, 2, 2, 208, 209, 7, 77, 2, 2, 209, 31, 3, 2, 2, 2, 210, 211, 7, 17, 2, 2, 211, 212, 7, 65, 2, 2, 212, 213, 5, 22, 12, 2, 213, 217, 7, 77, 2, 2, 214, 216, 5, 12, 7, 2, 215, 214, 3, 2, 2, 2, 216, 219, 3, 2, 2, 2, 217, 215, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 33, 3, 2, 2, 2, 219, 217, 3, 2, 2, 2, 220, 221, 7, 17, 2, 2, 221, 222, 7, 66, 2, 2, 222, 223, 5, 22, 12, 2, 223, 227, 7, 77, 2, 2, 224, 226, 5, 12, 7, 2, 225, 224, 3, 2, 2, 2, 226, 229, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 35, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 230, 231, 7, 17, 2, 2, 231, 232, 7, 67, 2, 2, 232, 236, 7, 77, 2, 2, 233, 235, 5, 12, 7, 2, 234, 233, 3, 2, 2, 2, 235, 238, 3, 2, 2, 2, 236, 234, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 37, 3, 2, 2, 2, 238, 236, 3, 2, 2, 2, 239, 240, 7, 17, 2, 2, 240, 241, 7, 68, 2, 2, 241, 242, 5, 26, 14, 2, 242, 243, 9, 7, 2, 2, 243, 244, 5, 22, 12, 2, 244, 245, 7, 77, 2, 2, 245, 39, 3, 2, 2, 2, 246, 247, 7, 17, 2, 2, 247, 248, 7, 70, 2, 2, 248, 249, 5, 28, 15, 2, 249, 250, 7, 77, 2, 2, 250, 41, 3, 2, 2, 2, 251, 252, 7, 17, 2, 2, 252, 253, 5, 44, 23, 2, 253, 257, 7, 78, 2, 2, 254, 256, 5, 18, 10, 2, 255, 254, 3, 2, 2, 2, 256, 259, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 258, 3, 2, 2, 2, 258, 43, 3, 2, 2, 2, 259, 257, 3, 2, 2, 2, 260, 266, 7, 80, 2, 2, 261, 262, 7, 79, 2, 2, 262, 263, 5, 22, 12, 2, 263, 264, 7, 60, 2, 2, 264, 266, 3, 2, 2, 2, 265, 260, 3, 2, 2, 2, 265, 261, 3, 2, 2, 2, 266, 269, 3, 2, 2, 2, 267, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 45, 3, 2, 2, 2, 269, 267, 3, 2, 2, 2, 270, 272, 5, 48, 25, 2, 271, 270, 3, 2, 2, 2, 272, 275, 3, 2, 2, 2, 273, 271, 3, 2, 2, 2, 273, 274, 3, 2, 2, 2, 274, 276, 3, 2, 2, 2, 275, 273, 3, 2, 2, 2, 276, 278, 5, 48, 25, 2, 277, 279, 7, 5, 2, 2, 278, 277, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 47, 3, 2, 2, 2, 280, 281, 7, 16, 2, 2, 281, 290, 5, 14, 8, 2, 282, 286, 7, 3, 2, 2, 283, 285, 5, 12, 7, 2, 284, 283, 3, 2, 2, 2, 285, 288, 3, 2, 2, 2, 286, 284, 3, 2, 2, 2, 286, 287, 3, 2, 2, 2, 287, 289, 3, 2, 2, 2, 288, 286, 3, 2, 2, 2, 289, 291, 7, 4, 2, 2, 290, 282, 3, 2, 2, 2, 290, 291, 3, 2, 2, 2, 291, 49, 3, 2, 2, 2, 292, 293, 7, 17, 2, 2, 293, 294, 7, 71, 2, 2, 294, 295, 5, 26, 14, 2, 295, 296, 7, 33, 2, 2, 296, 299, 5, 24, 13, 2, 297, 298, 7, 57, 2, 2, 298, 300, 7, 59, 2, 2, 299, 297, 3, 2, 2, 2, 299, 300, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 302, 7, 77, 2, 2, 302, 51, 3, 2, 2, 2, 303, 304, 7, 17, 2, 2, 304, 305, 7, 72, 2, 2, 305, 306, 7, 9, 2, 2, 306, 315, 7, 77, 2, 2, 307, 308, 7, 17, 2, 2, 308, 309, 7, 72, 2, 2, 309, 310, 7, 18, 2, 2, 310, 311, 5, 22, 12, 2, 311, 312, 7, 60, 2, 2, 312, 313, 7, 77, 2, 2, 313, 315, 3, 2, 2, 2, 314, 303, 3, 2, 2, 2, 314, 307, 3, 2, 2, 2, 315, 53, 3, 2, 2, 2, 34, 57, 63, 71, 80, 85, 100, 104, 108, 113, 121, 127, 129, 149, 166, 168, 178, 185, 191, 200, 204, 217, 227, 236, 257, 265, 267, 273, 278, 286, 290, 299, 314] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 86, 317, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 3, 2, 7, 2, 56, 10, 2, 12, 2, 14, 2, 59, 11, 2, 3, 2, 6, 2, 62, 10, 2, 13, 2, 14, 2, 63, 3, 3, 3, 3, 3, 3, 3, 4, 6, 4, 70, 10, 4, 13, 4, 14, 4, 71, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 5, 5, 81, 10, 5, 3, 6, 7, 6, 84, 10, 6, 12, 6, 14, 6, 87, 11, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 99, 10, 7, 12, 7, 14, 7, 102, 11, 7, 3, 7, 5, 7, 105, 10, 7, 3, 8, 3, 8, 5, 8, 109, 10, 8, 3, 8, 7, 8, 112, 10, 8, 12, 8, 14, 8, 115, 11, 8, 3, 8, 3, 8, 3, 9, 6, 9, 120, 10, 9, 13, 9, 14, 9, 121, 3, 9, 3, 9, 3, 9, 3, 9, 6, 9, 128, 10, 9, 13, 9, 14, 9, 129, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 150, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 7, 12, 167, 10, 12, 12, 12, 14, 12, 170, 11, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 179, 10, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 5, 15, 186, 10, 15, 3, 15, 3, 15, 7, 15, 190, 10, 15, 12, 15, 14, 15, 193, 11, 15, 3, 15, 3, 15, 3, 16, 3, 16, 7, 16, 199, 10, 16, 12, 16, 14, 16, 202, 11, 16, 3, 16, 5, 16, 205, 10, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 7, 17, 216, 10, 17, 12, 17, 14, 17, 219, 11, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 226, 10, 18, 12, 18, 14, 18, 229, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 235, 10, 19, 12, 19, 14, 19, 238, 11, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 256, 10, 22, 12, 22, 14, 22, 259, 11, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 266, 10, 23, 12, 23, 14, 23, 269, 11, 23, 3, 24, 7, 24, 272, 10, 24, 12, 24, 14, 24, 275, 11, 24, 3, 24, 3, 24, 5, 24, 279, 10, 24, 3, 25, 3, 25, 3, 25, 3, 25, 7, 25, 285, 10, 25, 12, 25, 14, 25, 288, 11, 25, 3, 25, 5, 25, 291, 10, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 300, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 315, 10, 27, 3, 27, 2, 3, 22, 28, 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, 2, 8, 3, 2, 51, 53, 3, 2, 49, 50, 4, 2, 34, 35, 37, 38, 4, 2, 36, 36, 39, 39, 3, 2, 40, 42, 4, 2, 33, 33, 44, 48, 2, 339, 2, 57, 3, 2, 2, 2, 4, 65, 3, 2, 2, 2, 6, 69, 3, 2, 2, 2, 8, 77, 3, 2, 2, 2, 10, 85, 3, 2, 2, 2, 12, 104, 3, 2, 2, 2, 14, 106, 3, 2, 2, 2, 16, 127, 3, 2, 2, 2, 18, 131, 3, 2, 2, 2, 20, 134, 3, 2, 2, 2, 22, 149, 3, 2, 2, 2, 24, 178, 3, 2, 2, 2, 26, 180, 3, 2, 2, 2, 28, 182, 3, 2, 2, 2, 30, 196, 3, 2, 2, 2, 32, 210, 3, 2, 2, 2, 34, 220, 3, 2, 2, 2, 36, 230, 3, 2, 2, 2, 38, 239, 3, 2, 2, 2, 40, 246, 3, 2, 2, 2, 42, 251, 3, 2, 2, 2, 44, 267, 3, 2, 2, 2, 46, 273, 3, 2, 2, 2, 48, 280, 3, 2, 2, 2, 50, 292, 3, 2, 2, 2, 52, 314, 3, 2, 2, 2, 54, 56, 5, 4, 3, 2, 55, 54, 3, 2, 2, 2, 56, 59, 3, 2, 2, 2, 57, 55, 3, 2, 2, 2, 57, 58, 3, 2, 2, 2, 58, 61, 3, 2, 2, 2, 59, 57, 3, 2, 2, 2, 60, 62, 5, 6, 4, 2, 61, 60, 3, 2, 2, 2, 62, 63, 3, 2, 2, 2, 63, 61, 3, 2, 2, 2, 63, 64, 3, 2, 2, 2, 64, 3, 3, 2, 2, 2, 65, 66, 7, 12, 2, 2, 66, 67, 7, 28, 2, 2, 67, 5, 3, 2, 2, 2, 68, 70, 5, 8, 5, 2, 69, 68, 3, 2, 2, 2, 70, 71, 3, 2, 2, 2, 71, 69, 3, 2, 2, 2, 71, 72, 3, 2, 2, 2, 72, 73, 3, 2, 2, 2, 73, 74, 7, 10, 2, 2, 74, 75, 5, 10, 6, 2, 75, 76, 7, 15, 2, 2, 76, 7, 3, 2, 2, 2, 77, 78, 7, 9, 2, 2, 78, 80, 7, 11, 2, 2, 79, 81, 7, 13, 2, 2, 80, 79, 3, 2, 2, 2, 80, 81, 3, 2, 2, 2, 81, 9, 3, 2, 2, 2, 82, 84, 5, 12, 7, 2, 83, 82, 3, 2, 2, 2, 84, 87, 3, 2, 2, 2, 85, 83, 3, 2, 2, 2, 85, 86, 3, 2, 2, 2, 86, 11, 3, 2, 2, 2, 87, 85, 3, 2, 2, 2, 88, 105, 5, 14, 8, 2, 89, 105, 5, 30, 16, 2, 90, 105, 5, 38, 20, 2, 91, 105, 5, 46, 24, 2, 92, 105, 5, 40, 21, 2, 93, 105, 5, 42, 22, 2, 94, 105, 5, 50, 26, 2, 95, 105, 5, 52, 27, 2, 96, 100, 7, 3, 2, 2, 97, 99, 5, 12, 7, 2, 98, 97, 3, 2, 2, 2, 99, 102, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 100, 101, 3, 2, 2, 2, 101, 103, 3, 2, 2, 2, 102, 100, 3, 2, 2, 2, 103, 105, 7, 4, 2, 2, 104, 88, 3, 2, 2, 2, 104, 89, 3, 2, 2, 2, 104, 90, 3, 2, 2, 2, 104, 91, 3, 2, 2, 2, 104, 92, 3, 2, 2, 2, 104, 93, 3, 2, 2, 2, 104, 94, 3, 2, 2, 2, 104, 95, 3, 2, 2, 2, 104, 96, 3, 2, 2, 2, 105, 13, 3, 2, 2, 2, 106, 108, 5, 16, 9, 2, 107, 109, 5, 20, 11, 2, 108, 107, 3, 2, 2, 2, 108, 109, 3, 2, 2, 2, 109, 113, 3, 2, 2, 2, 110, 112, 5, 18, 10, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 116, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 7, 8, 2, 2, 117, 15, 3, 2, 2, 2, 118, 120, 7, 22, 2, 2, 119, 118, 3, 2, 2, 2, 120, 121, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 121, 122, 3, 2, 2, 2, 122, 128, 3, 2, 2, 2, 123, 124, 7, 18, 2, 2, 124, 125, 5, 22, 12, 2, 125, 126, 7, 60, 2, 2, 126, 128, 3, 2, 2, 2, 127, 119, 3, 2, 2, 2, 127, 123, 3, 2, 2, 2, 128, 129, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 129, 130, 3, 2, 2, 2, 130, 17, 3, 2, 2, 2, 131, 132, 7, 12, 2, 2, 132, 133, 7, 28, 2, 2, 133, 19, 3, 2, 2, 2, 134, 135, 7, 17, 2, 2, 135, 136, 7, 66, 2, 2, 136, 137, 5, 22, 12, 2, 137, 138, 7, 78, 2, 2, 138, 21, 3, 2, 2, 2, 139, 140, 8, 12, 1, 2, 140, 141, 7, 54, 2, 2, 141, 142, 5, 22, 12, 2, 142, 143, 7, 55, 2, 2, 143, 150, 3, 2, 2, 2, 144, 145, 7, 50, 2, 2, 145, 150, 5, 22, 12, 10, 146, 147, 7, 43, 2, 2, 147, 150, 5, 22, 12, 9, 148, 150, 5, 24, 13, 2, 149, 139, 3, 2, 2, 2, 149, 144, 3, 2, 2, 2, 149, 146, 3, 2, 2, 2, 149, 148, 3, 2, 2, 2, 150, 168, 3, 2, 2, 2, 151, 152, 12, 8, 2, 2, 152, 153, 9, 2, 2, 2, 153, 167, 5, 22, 12, 9, 154, 155, 12, 7, 2, 2, 155, 156, 9, 3, 2, 2, 156, 167, 5, 22, 12, 8, 157, 158, 12, 6, 2, 2, 158, 159, 9, 4, 2, 2, 159, 167, 5, 22, 12, 7, 160, 161, 12, 5, 2, 2, 161, 162, 9, 5, 2, 2, 162, 167, 5, 22, 12, 6, 163, 164, 12, 4, 2, 2, 164, 165, 9, 6, 2, 2, 165, 167, 5, 22, 12, 5, 166, 151, 3, 2, 2, 2, 166, 154, 3, 2, 2, 2, 166, 157, 3, 2, 2, 2, 166, 160, 3, 2, 2, 2, 166, 163, 3, 2, 2, 2, 167, 170, 3, 2, 2, 2, 168, 166, 3, 2, 2, 2, 168, 169, 3, 2, 2, 2, 169, 23, 3, 2, 2, 2, 170, 168, 3, 2, 2, 2, 171, 179, 7, 63, 2, 2, 172, 179, 7, 30, 2, 2, 173, 179, 7, 31, 2, 2, 174, 179, 5, 26, 14, 2, 175, 179, 7, 58, 2, 2, 176, 179, 7, 32, 2, 2, 177, 179, 5, 28, 15, 2, 178, 171, 3, 2, 2, 2, 178, 172, 3, 2, 2, 2, 178, 173, 3, 2, 2, 2, 178, 174, 3, 2, 2, 2, 178, 175, 3, 2, 2, 2, 178, 176, 3, 2, 2, 2, 178, 177, 3, 2, 2, 2, 179, 25, 3, 2, 2, 2, 180, 181, 7, 61, 2, 2, 181, 27, 3, 2, 2, 2, 182, 183, 7, 59, 2, 2, 183, 185, 7, 54, 2, 2, 184, 186, 5, 22, 12, 2, 185, 184, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 191, 3, 2, 2, 2, 187, 188, 7, 56, 2, 2, 188, 190, 5, 22, 12, 2, 189, 187, 3, 2, 2, 2, 190, 193, 3, 2, 2, 2, 191, 189, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 194, 3, 2, 2, 2, 193, 191, 3, 2, 2, 2, 194, 195, 7, 55, 2, 2, 195, 29, 3, 2, 2, 2, 196, 200, 5, 32, 17, 2, 197, 199, 5, 34, 18, 2, 198, 197, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 204, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 203, 205, 5, 36, 19, 2, 204, 203, 3, 2, 2, 2, 204, 205, 3, 2, 2, 2, 205, 206, 3, 2, 2, 2, 206, 207, 7, 17, 2, 2, 207, 208, 7, 70, 2, 2, 208, 209, 7, 78, 2, 2, 209, 31, 3, 2, 2, 2, 210, 211, 7, 17, 2, 2, 211, 212, 7, 66, 2, 2, 212, 213, 5, 22, 12, 2, 213, 217, 7, 78, 2, 2, 214, 216, 5, 12, 7, 2, 215, 214, 3, 2, 2, 2, 216, 219, 3, 2, 2, 2, 217, 215, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 33, 3, 2, 2, 2, 219, 217, 3, 2, 2, 2, 220, 221, 7, 17, 2, 2, 221, 222, 7, 67, 2, 2, 222, 223, 5, 22, 12, 2, 223, 227, 7, 78, 2, 2, 224, 226, 5, 12, 7, 2, 225, 224, 3, 2, 2, 2, 226, 229, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 35, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 230, 231, 7, 17, 2, 2, 231, 232, 7, 68, 2, 2, 232, 236, 7, 78, 2, 2, 233, 235, 5, 12, 7, 2, 234, 233, 3, 2, 2, 2, 235, 238, 3, 2, 2, 2, 236, 234, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 37, 3, 2, 2, 2, 238, 236, 3, 2, 2, 2, 239, 240, 7, 17, 2, 2, 240, 241, 7, 69, 2, 2, 241, 242, 5, 26, 14, 2, 242, 243, 9, 7, 2, 2, 243, 244, 5, 22, 12, 2, 244, 245, 7, 78, 2, 2, 245, 39, 3, 2, 2, 2, 246, 247, 7, 17, 2, 2, 247, 248, 7, 71, 2, 2, 248, 249, 5, 28, 15, 2, 249, 250, 7, 78, 2, 2, 250, 41, 3, 2, 2, 2, 251, 252, 7, 17, 2, 2, 252, 253, 5, 44, 23, 2, 253, 257, 7, 80, 2, 2, 254, 256, 5, 18, 10, 2, 255, 254, 3, 2, 2, 2, 256, 259, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 258, 3, 2, 2, 2, 258, 43, 3, 2, 2, 2, 259, 257, 3, 2, 2, 2, 260, 266, 7, 82, 2, 2, 261, 262, 7, 81, 2, 2, 262, 263, 5, 22, 12, 2, 263, 264, 7, 60, 2, 2, 264, 266, 3, 2, 2, 2, 265, 260, 3, 2, 2, 2, 265, 261, 3, 2, 2, 2, 266, 269, 3, 2, 2, 2, 267, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 45, 3, 2, 2, 2, 269, 267, 3, 2, 2, 2, 270, 272, 5, 48, 25, 2, 271, 270, 3, 2, 2, 2, 272, 275, 3, 2, 2, 2, 273, 271, 3, 2, 2, 2, 273, 274, 3, 2, 2, 2, 274, 276, 3, 2, 2, 2, 275, 273, 3, 2, 2, 2, 276, 278, 5, 48, 25, 2, 277, 279, 7, 5, 2, 2, 278, 277, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 47, 3, 2, 2, 2, 280, 281, 7, 16, 2, 2, 281, 290, 5, 14, 8, 2, 282, 286, 7, 3, 2, 2, 283, 285, 5, 12, 7, 2, 284, 283, 3, 2, 2, 2, 285, 288, 3, 2, 2, 2, 286, 284, 3, 2, 2, 2, 286, 287, 3, 2, 2, 2, 287, 289, 3, 2, 2, 2, 288, 286, 3, 2, 2, 2, 289, 291, 7, 4, 2, 2, 290, 282, 3, 2, 2, 2, 290, 291, 3, 2, 2, 2, 291, 49, 3, 2, 2, 2, 292, 293, 7, 17, 2, 2, 293, 294, 7, 72, 2, 2, 294, 295, 5, 26, 14, 2, 295, 296, 7, 33, 2, 2, 296, 299, 5, 24, 13, 2, 297, 298, 7, 57, 2, 2, 298, 300, 7, 59, 2, 2, 299, 297, 3, 2, 2, 2, 299, 300, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 302, 7, 78, 2, 2, 302, 51, 3, 2, 2, 2, 303, 304, 7, 17, 2, 2, 304, 305, 7, 73, 2, 2, 305, 306, 7, 9, 2, 2, 306, 315, 7, 78, 2, 2, 307, 308, 7, 17, 2, 2, 308, 309, 7, 73, 2, 2, 309, 310, 7, 18, 2, 2, 310, 311, 5, 22, 12, 2, 311, 312, 7, 60, 2, 2, 312, 313, 7, 78, 2, 2, 313, 315, 3, 2, 2, 2, 314, 303, 3, 2, 2, 2, 314, 307, 3, 2, 2, 2, 315, 53, 3, 2, 2, 2, 34, 57, 63, 71, 80, 85, 100, 104, 108, 113, 121, 127, 129, 149, 166, 168, 178, 185, 191, 200, 204, 217, 227, 236, 257, 265, 267, 273, 278, 286, 290, 299, 314] \ No newline at end of file diff --git a/crates/compiler/src/parser/generated/YarnSpinnerParser.tokens b/crates/compiler/src/parser/generated/YarnSpinnerParser.tokens index 3070e43ad..72d448475 100644 --- a/crates/compiler/src/parser/generated/YarnSpinnerParser.tokens +++ b/crates/compiler/src/parser/generated/YarnSpinnerParser.tokens @@ -59,26 +59,29 @@ EXPRESSION_END=58 VAR_ID=59 DOT=60 NUMBER=61 -COMMAND_WS=62 -COMMAND_IF=63 -COMMAND_ELSEIF=64 -COMMAND_ELSE=65 -COMMAND_SET=66 -COMMAND_ENDIF=67 -COMMAND_CALL=68 -COMMAND_DECLARE=69 -COMMAND_JUMP=70 -COMMAND_ENUM=71 -COMMAND_CASE=72 -COMMAND_ENDENUM=73 -COMMAND_LOCAL=74 -COMMAND_END=75 -COMMAND_TEXT_END=76 -COMMAND_EXPRESSION_START=77 -COMMAND_TEXT=78 -TYPE_STRING=79 -TYPE_NUMBER=80 -TYPE_BOOL=81 +COMMAND_NEWLINE=62 +COMMAND_WS=63 +COMMAND_IF=64 +COMMAND_ELSEIF=65 +COMMAND_ELSE=66 +COMMAND_SET=67 +COMMAND_ENDIF=68 +COMMAND_CALL=69 +COMMAND_DECLARE=70 +COMMAND_JUMP=71 +COMMAND_ENUM=72 +COMMAND_CASE=73 +COMMAND_ENDENUM=74 +COMMAND_LOCAL=75 +COMMAND_END=76 +COMMAND_TEXT_NEWLINE=77 +COMMAND_TEXT_END=78 +COMMAND_EXPRESSION_START=79 +COMMAND_TEXT=80 +COMMAND_ID_NEWLINE=81 +TYPE_STRING=82 +TYPE_NUMBER=83 +TYPE_BOOL=84 '---'=8 '#'=10 '==='=13 @@ -102,10 +105,10 @@ TYPE_BOOL=81 ')'=53 ','=54 'as'=55 -'string'=79 -'number'=80 -'bool'=81 +'string'=82 +'number'=83 +'bool'=84 '}'=58 '.'=60 -'endif'=67 -'{'=77 +'endif'=68 +'{'=79 diff --git a/crates/compiler/src/parser/generated/readme.md b/crates/compiler/src/parser/generated/readme.md index 6befee744..d9948501b 100644 --- a/crates/compiler/src/parser/generated/readme.md +++ b/crates/compiler/src/parser/generated/readme.md @@ -21,3 +21,4 @@ All files in this directory were autogenerated by ANTLR with minimal manual adju * Replace `antlr_rust::tree::VisitChildren::visit_node(visitor, self);` by `YarnSpinnerParserVisitor::visit_node(visitor, self);`. The issue there is that `node` already means something in the ANTLR world, thus there is an ambiguity when calling `visit_node`, which antlr4rust resolved the wrong way here, resulting in an infinite recursion * Add the `new_with_text` function to allow creating a context with a specific text, which is possible in the C# version of ANTLR. +* Rename `type` field to `declaration_type` of `Declare_statementContextExt`. diff --git a/crates/compiler/src/parser/generated/yarnspinnerlexer.rs b/crates/compiler/src/parser/generated/yarnspinnerlexer.rs index 605034ff9..03e23de8a 100644 --- a/crates/compiler/src/parser/generated/yarnspinnerlexer.rs +++ b/crates/compiler/src/parser/generated/yarnspinnerlexer.rs @@ -1,457 +1,245 @@ -// Generated from .\YarnSpinnerLexer.g4 by ANTLR 4.8 +// Generated from third-party\YarnSpinner\YarnSpinner.Compiler\YarnSpinnerLexer.g4 by ANTLR 4.8 #![allow(dead_code)] #![allow(nonstandard_style)] #![allow(unused_imports)] #![allow(unused_variables)] use antlr_rust::atn::ATN; -use antlr_rust::atn_deserializer::ATNDeserializer; use antlr_rust::char_stream::CharStream; -use antlr_rust::dfa::DFA; -use antlr_rust::error_listener::ErrorListener; use antlr_rust::int_stream::IntStream; use antlr_rust::lexer::{BaseLexer, Lexer, LexerRecog}; -use antlr_rust::lexer_atn_simulator::{ILexerATNSimulator, LexerATNSimulator}; -use antlr_rust::parser_rule_context::{cast, BaseParserRuleContext, ParserRuleContext}; -use antlr_rust::recognizer::{Actions, Recognizer}; -use antlr_rust::rule_context::{BaseRuleContext, EmptyContext, EmptyCustomRuleContext}; -use antlr_rust::token::*; -use antlr_rust::token_factory::{CommonTokenFactory, TokenAware, TokenFactory}; -use antlr_rust::vocabulary::{Vocabulary, VocabularyImpl}; +use antlr_rust::atn_deserializer::ATNDeserializer; +use antlr_rust::dfa::DFA; +use antlr_rust::lexer_atn_simulator::{LexerATNSimulator, ILexerATNSimulator}; use antlr_rust::PredictionContextCache; +use antlr_rust::recognizer::{Recognizer,Actions}; +use antlr_rust::error_listener::ErrorListener; use antlr_rust::TokenSource; -use antlr_rust::{lazy_static, Tid, TidAble, TidExt}; +use antlr_rust::token_factory::{TokenFactory,CommonTokenFactory,TokenAware}; +use antlr_rust::token::*; +use antlr_rust::rule_context::{BaseRuleContext,EmptyCustomRuleContext,EmptyContext}; +use antlr_rust::parser_rule_context::{ParserRuleContext,BaseParserRuleContext,cast}; +use antlr_rust::vocabulary::{Vocabulary,VocabularyImpl}; + +use antlr_rust::{lazy_static,Tid,TidAble,TidExt}; + +use std::sync::Arc; use std::cell::RefCell; +use std::rc::Rc; use std::marker::PhantomData; use std::ops::{Deref, DerefMut}; -use std::rc::Rc; -use std::sync::Arc; -pub const INDENT: isize = 1; -pub const DEDENT: isize = 2; -pub const BLANK_LINE_FOLLOWING_OPTION: isize = 3; -pub const WS: isize = 4; -pub const COMMENT: isize = 5; -pub const NEWLINE: isize = 6; -pub const ID: isize = 7; -pub const BODY_START: isize = 8; -pub const HEADER_DELIMITER: isize = 9; -pub const HASHTAG: isize = 10; -pub const REST_OF_LINE: isize = 11; -pub const BODY_WS: isize = 12; -pub const BODY_END: isize = 13; -pub const SHORTCUT_ARROW: isize = 14; -pub const COMMAND_START: isize = 15; -pub const EXPRESSION_START: isize = 16; -pub const ESCAPED_ANY: isize = 17; -pub const TEXT_ESCAPE: isize = 18; -pub const TEXT_COMMENT: isize = 19; -pub const TEXT: isize = 20; -pub const UNESCAPABLE_CHARACTER: isize = 21; -pub const TEXT_COMMANDHASHTAG_WS: isize = 22; -pub const TEXT_COMMANDHASHTAG_COMMENT: isize = 23; -pub const TEXT_COMMANDHASHTAG_ERROR: isize = 24; -pub const HASHTAG_WS: isize = 25; -pub const HASHTAG_TEXT: isize = 26; -pub const EXPR_WS: isize = 27; -pub const KEYWORD_TRUE: isize = 28; -pub const KEYWORD_FALSE: isize = 29; -pub const KEYWORD_NULL: isize = 30; -pub const OPERATOR_ASSIGNMENT: isize = 31; -pub const OPERATOR_LOGICAL_LESS_THAN_EQUALS: isize = 32; -pub const OPERATOR_LOGICAL_GREATER_THAN_EQUALS: isize = 33; -pub const OPERATOR_LOGICAL_EQUALS: isize = 34; -pub const OPERATOR_LOGICAL_LESS: isize = 35; -pub const OPERATOR_LOGICAL_GREATER: isize = 36; -pub const OPERATOR_LOGICAL_NOT_EQUALS: isize = 37; -pub const OPERATOR_LOGICAL_AND: isize = 38; -pub const OPERATOR_LOGICAL_OR: isize = 39; -pub const OPERATOR_LOGICAL_XOR: isize = 40; -pub const OPERATOR_LOGICAL_NOT: isize = 41; -pub const OPERATOR_MATHS_ADDITION_EQUALS: isize = 42; -pub const OPERATOR_MATHS_SUBTRACTION_EQUALS: isize = 43; -pub const OPERATOR_MATHS_MULTIPLICATION_EQUALS: isize = 44; -pub const OPERATOR_MATHS_MODULUS_EQUALS: isize = 45; -pub const OPERATOR_MATHS_DIVISION_EQUALS: isize = 46; -pub const OPERATOR_MATHS_ADDITION: isize = 47; -pub const OPERATOR_MATHS_SUBTRACTION: isize = 48; -pub const OPERATOR_MATHS_MULTIPLICATION: isize = 49; -pub const OPERATOR_MATHS_DIVISION: isize = 50; -pub const OPERATOR_MATHS_MODULUS: isize = 51; -pub const LPAREN: isize = 52; -pub const RPAREN: isize = 53; -pub const COMMA: isize = 54; -pub const EXPRESSION_AS: isize = 55; -pub const STRING: isize = 56; -pub const FUNC_ID: isize = 57; -pub const EXPRESSION_END: isize = 58; -pub const VAR_ID: isize = 59; -pub const DOT: isize = 60; -pub const NUMBER: isize = 61; -pub const COMMAND_WS: isize = 62; -pub const COMMAND_IF: isize = 63; -pub const COMMAND_ELSEIF: isize = 64; -pub const COMMAND_ELSE: isize = 65; -pub const COMMAND_SET: isize = 66; -pub const COMMAND_ENDIF: isize = 67; -pub const COMMAND_CALL: isize = 68; -pub const COMMAND_DECLARE: isize = 69; -pub const COMMAND_JUMP: isize = 70; -pub const COMMAND_ENUM: isize = 71; -pub const COMMAND_CASE: isize = 72; -pub const COMMAND_ENDENUM: isize = 73; -pub const COMMAND_LOCAL: isize = 74; -pub const COMMAND_END: isize = 75; -pub const COMMAND_TEXT_END: isize = 76; -pub const COMMAND_EXPRESSION_START: isize = 77; -pub const COMMAND_TEXT: isize = 78; -pub const TYPE_STRING: isize = 79; -pub const TYPE_NUMBER: isize = 80; -pub const TYPE_BOOL: isize = 81; -pub const WHITESPACE: usize = 2; -pub const COMMENTS: usize = 3; -pub const HeaderMode: usize = 1; -pub const BodyMode: usize = 2; -pub const TextMode: usize = 3; -pub const TextEscapedMode: usize = 4; -pub const TextCommandOrHashtagMode: usize = 5; -pub const HashtagMode: usize = 6; -pub const ExpressionMode: usize = 7; -pub const CommandMode: usize = 8; -pub const CommandTextMode: usize = 9; -pub const CommandIDMode: usize = 10; -pub const CommandIDOrExpressionMode: usize = 11; -pub const channelNames: [&'static str; 2 + 2] = - ["DEFAULT_TOKEN_CHANNEL", "HIDDEN", "WHITESPACE", "COMMENTS"]; -pub const modeNames: [&'static str; 12] = [ - "DEFAULT_MODE", - "HeaderMode", - "BodyMode", - "TextMode", - "TextEscapedMode", - "TextCommandOrHashtagMode", - "HashtagMode", - "ExpressionMode", - "CommandMode", - "CommandTextMode", - "CommandIDMode", - "CommandIDOrExpressionMode", -]; + pub const INDENT:isize=1; + pub const DEDENT:isize=2; + pub const BLANK_LINE_FOLLOWING_OPTION:isize=3; + pub const WS:isize=4; + pub const COMMENT:isize=5; + pub const NEWLINE:isize=6; + pub const ID:isize=7; + pub const BODY_START:isize=8; + pub const HEADER_DELIMITER:isize=9; + pub const HASHTAG:isize=10; + pub const REST_OF_LINE:isize=11; + pub const BODY_WS:isize=12; + pub const BODY_END:isize=13; + pub const SHORTCUT_ARROW:isize=14; + pub const COMMAND_START:isize=15; + pub const EXPRESSION_START:isize=16; + pub const ESCAPED_ANY:isize=17; + pub const TEXT_ESCAPE:isize=18; + pub const TEXT_COMMENT:isize=19; + pub const TEXT:isize=20; + pub const UNESCAPABLE_CHARACTER:isize=21; + pub const TEXT_COMMANDHASHTAG_WS:isize=22; + pub const TEXT_COMMANDHASHTAG_COMMENT:isize=23; + pub const TEXT_COMMANDHASHTAG_ERROR:isize=24; + pub const HASHTAG_WS:isize=25; + pub const HASHTAG_TEXT:isize=26; + pub const EXPR_WS:isize=27; + pub const KEYWORD_TRUE:isize=28; + pub const KEYWORD_FALSE:isize=29; + pub const KEYWORD_NULL:isize=30; + pub const OPERATOR_ASSIGNMENT:isize=31; + pub const OPERATOR_LOGICAL_LESS_THAN_EQUALS:isize=32; + pub const OPERATOR_LOGICAL_GREATER_THAN_EQUALS:isize=33; + pub const OPERATOR_LOGICAL_EQUALS:isize=34; + pub const OPERATOR_LOGICAL_LESS:isize=35; + pub const OPERATOR_LOGICAL_GREATER:isize=36; + pub const OPERATOR_LOGICAL_NOT_EQUALS:isize=37; + pub const OPERATOR_LOGICAL_AND:isize=38; + pub const OPERATOR_LOGICAL_OR:isize=39; + pub const OPERATOR_LOGICAL_XOR:isize=40; + pub const OPERATOR_LOGICAL_NOT:isize=41; + pub const OPERATOR_MATHS_ADDITION_EQUALS:isize=42; + pub const OPERATOR_MATHS_SUBTRACTION_EQUALS:isize=43; + pub const OPERATOR_MATHS_MULTIPLICATION_EQUALS:isize=44; + pub const OPERATOR_MATHS_MODULUS_EQUALS:isize=45; + pub const OPERATOR_MATHS_DIVISION_EQUALS:isize=46; + pub const OPERATOR_MATHS_ADDITION:isize=47; + pub const OPERATOR_MATHS_SUBTRACTION:isize=48; + pub const OPERATOR_MATHS_MULTIPLICATION:isize=49; + pub const OPERATOR_MATHS_DIVISION:isize=50; + pub const OPERATOR_MATHS_MODULUS:isize=51; + pub const LPAREN:isize=52; + pub const RPAREN:isize=53; + pub const COMMA:isize=54; + pub const EXPRESSION_AS:isize=55; + pub const STRING:isize=56; + pub const FUNC_ID:isize=57; + pub const EXPRESSION_END:isize=58; + pub const VAR_ID:isize=59; + pub const DOT:isize=60; + pub const NUMBER:isize=61; + pub const COMMAND_NEWLINE:isize=62; + pub const COMMAND_WS:isize=63; + pub const COMMAND_IF:isize=64; + pub const COMMAND_ELSEIF:isize=65; + pub const COMMAND_ELSE:isize=66; + pub const COMMAND_SET:isize=67; + pub const COMMAND_ENDIF:isize=68; + pub const COMMAND_CALL:isize=69; + pub const COMMAND_DECLARE:isize=70; + pub const COMMAND_JUMP:isize=71; + pub const COMMAND_ENUM:isize=72; + pub const COMMAND_CASE:isize=73; + pub const COMMAND_ENDENUM:isize=74; + pub const COMMAND_LOCAL:isize=75; + pub const COMMAND_END:isize=76; + pub const COMMAND_TEXT_NEWLINE:isize=77; + pub const COMMAND_TEXT_END:isize=78; + pub const COMMAND_EXPRESSION_START:isize=79; + pub const COMMAND_TEXT:isize=80; + pub const COMMAND_ID_NEWLINE:isize=81; + pub const TYPE_STRING:isize=82; + pub const TYPE_NUMBER:isize=83; + pub const TYPE_BOOL:isize=84; + pub const WHITESPACE: usize=2; + pub const COMMENTS: usize=3; + pub const HeaderMode: usize=1; + pub const BodyMode: usize=2; + pub const TextMode: usize=3; + pub const TextEscapedMode: usize=4; + pub const TextCommandOrHashtagMode: usize=5; + pub const HashtagMode: usize=6; + pub const ExpressionMode: usize=7; + pub const CommandMode: usize=8; + pub const CommandTextMode: usize=9; + pub const CommandIDMode: usize=10; + pub const CommandIDOrExpressionMode: usize=11; + pub const channelNames: [&'static str;2+2] = [ + "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "WHITESPACE", "COMMENTS" + ]; -pub const ruleNames: [&'static str; 106] = [ - "WS", - "COMMENT", - "NEWLINE", - "ID", - "IDENTIFIER_HEAD", - "IDENTIFIER_CHARACTER", - "IDENTIFIER_CHARACTERS", - "BODY_START", - "HEADER_DELIMITER", - "HASHTAG", - "REST_OF_LINE", - "HEADER_NEWLINE", - "BODY_WS", - "BODY_NEWLINE", - "BODY_COMMENT", - "BODY_END", - "SHORTCUT_ARROW", - "COMMAND_START", - "BODY_HASHTAG", - "EXPRESSION_START", - "ESCAPED_ANY", - "ANY", - "TEXT_NEWLINE", - "TEXT_ESCAPED_MARKUP_BRACKET", - "TEXT_ESCAPE", - "TEXT_HASHTAG", - "TEXT_EXPRESSION_START", - "TEXT_COMMAND_START", - "TEXT_COMMENT", - "TEXT", - "TEXT_FRAG", - "TEXT_ESCAPED_CHARACTER", - "UNESCAPABLE_CHARACTER", - "TEXT_COMMANDHASHTAG_WS", - "TEXT_COMMANDHASHTAG_COMMENT", - "TEXT_COMMANDHASHTAG_COMMAND_START", - "TEXT_COMMANDHASHTAG_HASHTAG", - "TEXT_COMMANDHASHTAG_NEWLINE", - "TEXT_COMMANDHASHTAG_ERROR", - "HASHTAG_WS", - "HASHTAG_TAG", - "HASHTAG_TEXT", - "EXPR_WS", - "KEYWORD_TRUE", - "KEYWORD_FALSE", - "KEYWORD_NULL", - "OPERATOR_ASSIGNMENT", - "OPERATOR_LOGICAL_LESS_THAN_EQUALS", - "OPERATOR_LOGICAL_GREATER_THAN_EQUALS", - "OPERATOR_LOGICAL_EQUALS", - "OPERATOR_LOGICAL_LESS", - "OPERATOR_LOGICAL_GREATER", - "OPERATOR_LOGICAL_NOT_EQUALS", - "OPERATOR_LOGICAL_AND", - "OPERATOR_LOGICAL_OR", - "OPERATOR_LOGICAL_XOR", - "OPERATOR_LOGICAL_NOT", - "OPERATOR_MATHS_ADDITION_EQUALS", - "OPERATOR_MATHS_SUBTRACTION_EQUALS", - "OPERATOR_MATHS_MULTIPLICATION_EQUALS", - "OPERATOR_MATHS_MODULUS_EQUALS", - "OPERATOR_MATHS_DIVISION_EQUALS", - "OPERATOR_MATHS_ADDITION", - "OPERATOR_MATHS_SUBTRACTION", - "OPERATOR_MATHS_MULTIPLICATION", - "OPERATOR_MATHS_DIVISION", - "OPERATOR_MATHS_MODULUS", - "LPAREN", - "RPAREN", - "COMMA", - "EXPRESSION_AS", - "TYPE_STRING", - "TYPE_NUMBER", - "TYPE_BOOL", - "STRING", - "FUNC_ID", - "EXPRESSION_END", - "EXPRESSION_COMMAND_END", - "VAR_ID", - "DOT", - "NUMBER", - "INT", - "DIGIT", - "COMMAND_WS", - "COMMAND_IF", - "COMMAND_ELSEIF", - "COMMAND_ELSE", - "COMMAND_SET", - "COMMAND_ENDIF", - "COMMAND_CALL", - "COMMAND_DECLARE", - "COMMAND_JUMP", - "COMMAND_ENUM", - "COMMAND_CASE", - "COMMAND_ENDENUM", - "COMMAND_LOCAL", - "COMMAND_END", - "COMMAND_ARBITRARY", - "COMMAND_TEXT_END", - "COMMAND_EXPRESSION_START", - "COMMAND_TEXT", - "COMMAND_ID", - "COMMAND_ID_END", - "COMMAND_ID_OR_EXPRESSION_ID", - "COMMAND_ID_OR_EXPRESSION_START", - "COMMAND_ID_OR_EXPRESSION_END", -]; + pub const modeNames: [&'static str;12] = [ + "DEFAULT_MODE", "HeaderMode", "BodyMode", "TextMode", "TextEscapedMode", + "TextCommandOrHashtagMode", "HashtagMode", "ExpressionMode", "CommandMode", + "CommandTextMode", "CommandIDMode", "CommandIDOrExpressionMode" + ]; -pub const _LITERAL_NAMES: [Option<&'static str>; 82] = [ - None, - None, - None, - None, - None, - None, - None, - None, - Some("'---'"), - None, - Some("'#'"), - None, - None, - Some("'==='"), - Some("'->'"), - Some("'<<'"), - None, - None, - Some("'\\'"), - None, - None, - None, - None, - None, - None, - None, - None, - None, - Some("'true'"), - Some("'false'"), - Some("'null'"), - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - Some("'+='"), - Some("'-='"), - Some("'*='"), - Some("'%='"), - Some("'/='"), - Some("'+'"), - Some("'-'"), - Some("'*'"), - Some("'/'"), - Some("'%'"), - Some("'('"), - Some("')'"), - Some("','"), - Some("'as'"), - None, - None, - Some("'}'"), - None, - Some("'.'"), - None, - None, - None, - None, - None, - None, - Some("'endif'"), - None, - None, - None, - None, - None, - None, - None, - None, - None, - Some("'{'"), - None, - Some("'string'"), - Some("'number'"), - Some("'bool'"), -]; -pub const _SYMBOLIC_NAMES: [Option<&'static str>; 82] = [ - None, - Some("INDENT"), - Some("DEDENT"), - Some("BLANK_LINE_FOLLOWING_OPTION"), - Some("WS"), - Some("COMMENT"), - Some("NEWLINE"), - Some("ID"), - Some("BODY_START"), - Some("HEADER_DELIMITER"), - Some("HASHTAG"), - Some("REST_OF_LINE"), - Some("BODY_WS"), - Some("BODY_END"), - Some("SHORTCUT_ARROW"), - Some("COMMAND_START"), - Some("EXPRESSION_START"), - Some("ESCAPED_ANY"), - Some("TEXT_ESCAPE"), - Some("TEXT_COMMENT"), - Some("TEXT"), - Some("UNESCAPABLE_CHARACTER"), - Some("TEXT_COMMANDHASHTAG_WS"), - Some("TEXT_COMMANDHASHTAG_COMMENT"), - Some("TEXT_COMMANDHASHTAG_ERROR"), - Some("HASHTAG_WS"), - Some("HASHTAG_TEXT"), - Some("EXPR_WS"), - Some("KEYWORD_TRUE"), - Some("KEYWORD_FALSE"), - Some("KEYWORD_NULL"), - Some("OPERATOR_ASSIGNMENT"), - Some("OPERATOR_LOGICAL_LESS_THAN_EQUALS"), - Some("OPERATOR_LOGICAL_GREATER_THAN_EQUALS"), - Some("OPERATOR_LOGICAL_EQUALS"), - Some("OPERATOR_LOGICAL_LESS"), - Some("OPERATOR_LOGICAL_GREATER"), - Some("OPERATOR_LOGICAL_NOT_EQUALS"), - Some("OPERATOR_LOGICAL_AND"), - Some("OPERATOR_LOGICAL_OR"), - Some("OPERATOR_LOGICAL_XOR"), - Some("OPERATOR_LOGICAL_NOT"), - Some("OPERATOR_MATHS_ADDITION_EQUALS"), - Some("OPERATOR_MATHS_SUBTRACTION_EQUALS"), - Some("OPERATOR_MATHS_MULTIPLICATION_EQUALS"), - Some("OPERATOR_MATHS_MODULUS_EQUALS"), - Some("OPERATOR_MATHS_DIVISION_EQUALS"), - Some("OPERATOR_MATHS_ADDITION"), - Some("OPERATOR_MATHS_SUBTRACTION"), - Some("OPERATOR_MATHS_MULTIPLICATION"), - Some("OPERATOR_MATHS_DIVISION"), - Some("OPERATOR_MATHS_MODULUS"), - Some("LPAREN"), - Some("RPAREN"), - Some("COMMA"), - Some("EXPRESSION_AS"), - Some("STRING"), - Some("FUNC_ID"), - Some("EXPRESSION_END"), - Some("VAR_ID"), - Some("DOT"), - Some("NUMBER"), - Some("COMMAND_WS"), - Some("COMMAND_IF"), - Some("COMMAND_ELSEIF"), - Some("COMMAND_ELSE"), - Some("COMMAND_SET"), - Some("COMMAND_ENDIF"), - Some("COMMAND_CALL"), - Some("COMMAND_DECLARE"), - Some("COMMAND_JUMP"), - Some("COMMAND_ENUM"), - Some("COMMAND_CASE"), - Some("COMMAND_ENDENUM"), - Some("COMMAND_LOCAL"), - Some("COMMAND_END"), - Some("COMMAND_TEXT_END"), - Some("COMMAND_EXPRESSION_START"), - Some("COMMAND_TEXT"), - Some("TYPE_STRING"), - Some("TYPE_NUMBER"), - Some("TYPE_BOOL"), -]; -lazy_static! { - static ref _shared_context_cache: Arc = - Arc::new(PredictionContextCache::new()); - static ref VOCABULARY: Box = Box::new(VocabularyImpl::new( - _LITERAL_NAMES.iter(), - _SYMBOLIC_NAMES.iter(), - None - )); -} + pub const ruleNames: [&'static str;111] = [ + "WS", "COMMENT", "NEWLINE", "ID", "IDENTIFIER_HEAD", "IDENTIFIER_CHARACTER", + "IDENTIFIER_CHARACTERS", "BODY_START", "HEADER_DELIMITER", "HASHTAG", + "REST_OF_LINE", "HEADER_NEWLINE", "BODY_WS", "BODY_NEWLINE", "BODY_COMMENT", + "BODY_END", "SHORTCUT_ARROW", "COMMAND_START", "BODY_HASHTAG", "EXPRESSION_START", + "ESCAPED_BRACKET_START", "ESCAPED_ANY", "ANY", "TEXT_NEWLINE", "TEXT_ESCAPED_MARKUP_BRACKET", + "TEXT_ESCAPE", "TEXT_HASHTAG", "TEXT_EXPRESSION_START", "TEXT_COMMAND_START", + "TEXT_COMMENT", "TEXT", "TEXT_FRAG", "TEXT_ESCAPED_CHARACTER", "UNESCAPABLE_CHARACTER", + "TEXT_COMMANDHASHTAG_WS", "TEXT_COMMANDHASHTAG_COMMENT", "TEXT_COMMANDHASHTAG_COMMAND_START", + "TEXT_COMMANDHASHTAG_HASHTAG", "TEXT_COMMANDHASHTAG_NEWLINE", "TEXT_COMMANDHASHTAG_ERROR", + "HASHTAG_WS", "HASHTAG_TAG", "HASHTAG_TEXT", "EXPR_WS", "KEYWORD_TRUE", + "KEYWORD_FALSE", "KEYWORD_NULL", "OPERATOR_ASSIGNMENT", "OPERATOR_LOGICAL_LESS_THAN_EQUALS", + "OPERATOR_LOGICAL_GREATER_THAN_EQUALS", "OPERATOR_LOGICAL_EQUALS", "OPERATOR_LOGICAL_LESS", + "OPERATOR_LOGICAL_GREATER", "OPERATOR_LOGICAL_NOT_EQUALS", "OPERATOR_LOGICAL_AND", + "OPERATOR_LOGICAL_OR", "OPERATOR_LOGICAL_XOR", "OPERATOR_LOGICAL_NOT", + "OPERATOR_MATHS_ADDITION_EQUALS", "OPERATOR_MATHS_SUBTRACTION_EQUALS", + "OPERATOR_MATHS_MULTIPLICATION_EQUALS", "OPERATOR_MATHS_MODULUS_EQUALS", + "OPERATOR_MATHS_DIVISION_EQUALS", "OPERATOR_MATHS_ADDITION", "OPERATOR_MATHS_SUBTRACTION", + "OPERATOR_MATHS_MULTIPLICATION", "OPERATOR_MATHS_DIVISION", "OPERATOR_MATHS_MODULUS", + "LPAREN", "RPAREN", "COMMA", "EXPRESSION_AS", "TYPE_STRING", "TYPE_NUMBER", + "TYPE_BOOL", "STRING", "FUNC_ID", "EXPRESSION_END", "EXPRESSION_COMMAND_END", + "VAR_ID", "DOT", "NUMBER", "INT", "DIGIT", "COMMAND_NEWLINE", "COMMAND_WS", + "COMMAND_IF", "COMMAND_ELSEIF", "COMMAND_ELSE", "COMMAND_SET", "COMMAND_ENDIF", + "COMMAND_CALL", "COMMAND_DECLARE", "COMMAND_JUMP", "COMMAND_ENUM", "COMMAND_CASE", + "COMMAND_ENDENUM", "COMMAND_LOCAL", "COMMAND_END", "COMMAND_EXPRESSION_AT_START", + "COMMAND_ARBITRARY", "COMMAND_TEXT_NEWLINE", "COMMAND_TEXT_END", "COMMAND_EXPRESSION_START", + "COMMAND_TEXT", "COMMAND_ID_NEWLINE", "COMMAND_ID", "COMMAND_ID_END", + "COMMAND_ID_OR_EXPRESSION_ID", "COMMAND_ID_OR_EXPRESSION_START", "COMMAND_ID_OR_EXPRESSION_END" + ]; + + + pub const _LITERAL_NAMES: [Option<&'static str>;85] = [ + None, None, None, None, None, None, None, None, Some("'---'"), None, Some("'#'"), + None, None, Some("'==='"), Some("'->'"), Some("'<<'"), None, None, Some("'\\'"), + None, None, None, None, None, None, None, None, None, Some("'true'"), + Some("'false'"), Some("'null'"), None, None, None, None, None, None, None, + None, None, None, None, Some("'+='"), Some("'-='"), Some("'*='"), Some("'%='"), + Some("'/='"), Some("'+'"), Some("'-'"), Some("'*'"), Some("'/'"), Some("'%'"), + Some("'('"), Some("')'"), Some("','"), Some("'as'"), None, None, Some("'}'"), + None, Some("'.'"), None, None, None, None, None, None, None, Some("'endif'"), + None, None, None, None, None, None, None, None, None, None, Some("'{'"), + None, None, Some("'string'"), Some("'number'"), Some("'bool'") + ]; + pub const _SYMBOLIC_NAMES: [Option<&'static str>;85] = [ + None, Some("INDENT"), Some("DEDENT"), Some("BLANK_LINE_FOLLOWING_OPTION"), + Some("WS"), Some("COMMENT"), Some("NEWLINE"), Some("ID"), Some("BODY_START"), + Some("HEADER_DELIMITER"), Some("HASHTAG"), Some("REST_OF_LINE"), Some("BODY_WS"), + Some("BODY_END"), Some("SHORTCUT_ARROW"), Some("COMMAND_START"), Some("EXPRESSION_START"), + Some("ESCAPED_ANY"), Some("TEXT_ESCAPE"), Some("TEXT_COMMENT"), Some("TEXT"), + Some("UNESCAPABLE_CHARACTER"), Some("TEXT_COMMANDHASHTAG_WS"), Some("TEXT_COMMANDHASHTAG_COMMENT"), + Some("TEXT_COMMANDHASHTAG_ERROR"), Some("HASHTAG_WS"), Some("HASHTAG_TEXT"), + Some("EXPR_WS"), Some("KEYWORD_TRUE"), Some("KEYWORD_FALSE"), Some("KEYWORD_NULL"), + Some("OPERATOR_ASSIGNMENT"), Some("OPERATOR_LOGICAL_LESS_THAN_EQUALS"), + Some("OPERATOR_LOGICAL_GREATER_THAN_EQUALS"), Some("OPERATOR_LOGICAL_EQUALS"), + Some("OPERATOR_LOGICAL_LESS"), Some("OPERATOR_LOGICAL_GREATER"), Some("OPERATOR_LOGICAL_NOT_EQUALS"), + Some("OPERATOR_LOGICAL_AND"), Some("OPERATOR_LOGICAL_OR"), Some("OPERATOR_LOGICAL_XOR"), + Some("OPERATOR_LOGICAL_NOT"), Some("OPERATOR_MATHS_ADDITION_EQUALS"), + Some("OPERATOR_MATHS_SUBTRACTION_EQUALS"), Some("OPERATOR_MATHS_MULTIPLICATION_EQUALS"), + Some("OPERATOR_MATHS_MODULUS_EQUALS"), Some("OPERATOR_MATHS_DIVISION_EQUALS"), + Some("OPERATOR_MATHS_ADDITION"), Some("OPERATOR_MATHS_SUBTRACTION"), Some("OPERATOR_MATHS_MULTIPLICATION"), + Some("OPERATOR_MATHS_DIVISION"), Some("OPERATOR_MATHS_MODULUS"), Some("LPAREN"), + Some("RPAREN"), Some("COMMA"), Some("EXPRESSION_AS"), Some("STRING"), + Some("FUNC_ID"), Some("EXPRESSION_END"), Some("VAR_ID"), Some("DOT"), + Some("NUMBER"), Some("COMMAND_NEWLINE"), Some("COMMAND_WS"), Some("COMMAND_IF"), + Some("COMMAND_ELSEIF"), Some("COMMAND_ELSE"), Some("COMMAND_SET"), Some("COMMAND_ENDIF"), + Some("COMMAND_CALL"), Some("COMMAND_DECLARE"), Some("COMMAND_JUMP"), Some("COMMAND_ENUM"), + Some("COMMAND_CASE"), Some("COMMAND_ENDENUM"), Some("COMMAND_LOCAL"), + Some("COMMAND_END"), Some("COMMAND_TEXT_NEWLINE"), Some("COMMAND_TEXT_END"), + Some("COMMAND_EXPRESSION_START"), Some("COMMAND_TEXT"), Some("COMMAND_ID_NEWLINE"), + Some("TYPE_STRING"), Some("TYPE_NUMBER"), Some("TYPE_BOOL") + ]; + lazy_static!{ + static ref _shared_context_cache: Arc = Arc::new(PredictionContextCache::new()); + static ref VOCABULARY: Box = Box::new(VocabularyImpl::new(_LITERAL_NAMES.iter(), _SYMBOLIC_NAMES.iter(), None)); + } -pub type LexerContext<'input> = - BaseRuleContext<'input, EmptyCustomRuleContext<'input, LocalTokenFactory<'input>>>; + +pub type LexerContext<'input> = BaseRuleContext<'input,EmptyCustomRuleContext<'input,LocalTokenFactory<'input> >>; pub type LocalTokenFactory<'input> = CommonTokenFactory; -type From<'a> = as TokenFactory<'a>>::From; +type From<'a> = as TokenFactory<'a> >::From; -pub struct YarnSpinnerLexer<'input, Input: CharStream>> { - base: BaseLexer<'input, YarnSpinnerLexerActions, Input, LocalTokenFactory<'input>>, +pub struct YarnSpinnerLexer<'input, Input:CharStream >> { + base: BaseLexer<'input,YarnSpinnerLexerActions,Input,LocalTokenFactory<'input>>, } antlr_rust::tid! { impl<'input,Input> TidAble<'input> for YarnSpinnerLexer<'input,Input> where Input:CharStream > } -impl<'input, Input: CharStream>> Deref for YarnSpinnerLexer<'input, Input> { - type Target = BaseLexer<'input, YarnSpinnerLexerActions, Input, LocalTokenFactory<'input>>; +impl<'input, Input:CharStream >> Deref for YarnSpinnerLexer<'input,Input>{ + type Target = BaseLexer<'input,YarnSpinnerLexerActions,Input,LocalTokenFactory<'input>>; - fn deref(&self) -> &Self::Target { - &self.base - } + fn deref(&self) -> &Self::Target { + &self.base + } } -impl<'input, Input: CharStream>> DerefMut for YarnSpinnerLexer<'input, Input> { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.base - } +impl<'input, Input:CharStream >> DerefMut for YarnSpinnerLexer<'input,Input>{ + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.base + } } -impl<'input, Input: CharStream>> YarnSpinnerLexer<'input, Input> { + +impl<'input, Input:CharStream >> YarnSpinnerLexer<'input,Input>{ fn get_rule_names(&self) -> &'static [&'static str] { &ruleNames } @@ -467,60 +255,50 @@ impl<'input, Input: CharStream>> YarnSpinnerLexer<'input, Input> { "YarnSpinnerLexer.g4" } - pub fn new_with_token_factory(input: Input, tf: &'input LocalTokenFactory<'input>) -> Self { - antlr_rust::recognizer::check_version("0", "3"); - Self { - base: BaseLexer::new_base_lexer( - input, - LexerATNSimulator::new_lexer_atnsimulator( - _ATN.clone(), - _decision_to_DFA.clone(), - _shared_context_cache.clone(), - ), - YarnSpinnerLexerActions {}, - tf, - ), - } - } + pub fn new_with_token_factory(input: Input, tf: &'input LocalTokenFactory<'input>) -> Self { + antlr_rust::recognizer::check_version("0","3"); + Self { + base: BaseLexer::new_base_lexer( + input, + LexerATNSimulator::new_lexer_atnsimulator( + _ATN.clone(), + _decision_to_DFA.clone(), + _shared_context_cache.clone(), + ), + YarnSpinnerLexerActions{}, + tf + ) + } + } } -impl<'input, Input: CharStream>> YarnSpinnerLexer<'input, Input> -where - &'input LocalTokenFactory<'input>: Default, -{ - pub fn new(input: Input) -> Self { - YarnSpinnerLexer::new_with_token_factory( - input, - <&LocalTokenFactory<'input> as Default>::default(), - ) - } +impl<'input, Input:CharStream >> YarnSpinnerLexer<'input,Input> where &'input LocalTokenFactory<'input>:Default{ + pub fn new(input: Input) -> Self{ + YarnSpinnerLexer::new_with_token_factory(input, <&LocalTokenFactory<'input> as Default>::default()) + } } -pub struct YarnSpinnerLexerActions {} - -impl YarnSpinnerLexerActions {} +pub struct YarnSpinnerLexerActions { +} -impl<'input, Input: CharStream>> - Actions<'input, BaseLexer<'input, YarnSpinnerLexerActions, Input, LocalTokenFactory<'input>>> - for YarnSpinnerLexerActions -{ +impl YarnSpinnerLexerActions{ } -impl<'input, Input: CharStream>> YarnSpinnerLexer<'input, Input> {} +impl<'input, Input:CharStream >> Actions<'input,BaseLexer<'input,YarnSpinnerLexerActions,Input,LocalTokenFactory<'input>>> for YarnSpinnerLexerActions{ + } + + impl<'input, Input:CharStream >> YarnSpinnerLexer<'input,Input>{ -impl<'input, Input: CharStream>> - LexerRecog<'input, BaseLexer<'input, YarnSpinnerLexerActions, Input, LocalTokenFactory<'input>>> - for YarnSpinnerLexerActions -{ } -impl<'input> TokenAware<'input> for YarnSpinnerLexerActions { - type TF = LocalTokenFactory<'input>; + +impl<'input, Input:CharStream >> LexerRecog<'input,BaseLexer<'input,YarnSpinnerLexerActions,Input,LocalTokenFactory<'input>>> for YarnSpinnerLexerActions{ +} +impl<'input> TokenAware<'input> for YarnSpinnerLexerActions{ + type TF = LocalTokenFactory<'input>; } -impl<'input, Input: CharStream>> TokenSource<'input> - for YarnSpinnerLexer<'input, Input> -{ - type TF = LocalTokenFactory<'input>; +impl<'input, Input:CharStream >> TokenSource<'input> for YarnSpinnerLexer<'input,Input>{ + type TF = LocalTokenFactory<'input>; fn next_token(&mut self) -> >::Tok { self.base.next_token() @@ -538,31 +316,39 @@ impl<'input, Input: CharStream>> TokenSource<'input> self.base.get_input_stream() } - fn get_source_name(&self) -> String { - self.base.get_source_name() - } + fn get_source_name(&self) -> String { + self.base.get_source_name() + } fn get_token_factory(&self) -> &'input Self::TF { self.base.get_token_factory() } } -lazy_static! { - static ref _ATN: Arc = - Arc::new(ATNDeserializer::new(None).deserialize(_serializedATN.chars())); - static ref _decision_to_DFA: Arc>> = { - let mut dfa = Vec::new(); - let size = _ATN.decision_to_state.len(); - for i in 0..size { - dfa.push(DFA::new(_ATN.clone(), _ATN.get_decision_state(i), i as isize).into()) - } - Arc::new(dfa) - }; -} -const _serializedATN: &'static str = - "\x03\u{608b}\u{a72a}\u{8133}\u{b9ed}\u{417c}\u{3be7}\u{7786}\u{5964}\x02\ - \x53\u{328}\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\ + + lazy_static! { + static ref _ATN: Arc = + Arc::new(ATNDeserializer::new(None).deserialize(_serializedATN.chars())); + static ref _decision_to_DFA: Arc>> = { + let mut dfa = Vec::new(); + let size = _ATN.decision_to_state.len(); + for i in 0..size { + dfa.push(DFA::new( + _ATN.clone(), + _ATN.get_decision_state(i), + i as isize, + ).into()) + } + Arc::new(dfa) + }; + } + + + + const _serializedATN:&'static str = + "\x03\u{608b}\u{a72a}\u{8133}\u{b9ed}\u{417c}\u{3be7}\u{7786}\u{5964}\x02\ + \x56\u{344}\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\ \x01\x08\x01\x08\x01\x08\x01\x08\x01\x04\x02\x09\x02\x04\x03\x09\x03\x04\ \x04\x09\x04\x04\x05\x09\x05\x04\x06\x09\x06\x04\x07\x09\x07\x04\x08\x09\ \x08\x04\x09\x09\x09\x04\x0a\x09\x0a\x04\x0b\x09\x0b\x04\x0c\x09\x0c\x04\ @@ -587,98 +373,102 @@ const _serializedATN: &'static str = \x5e\x09\x5e\x04\x5f\x09\x5f\x04\x60\x09\x60\x04\x61\x09\x61\x04\x62\x09\ \x62\x04\x63\x09\x63\x04\x64\x09\x64\x04\x65\x09\x65\x04\x66\x09\x66\x04\ \x67\x09\x67\x04\x68\x09\x68\x04\x69\x09\x69\x04\x6a\x09\x6a\x04\x6b\x09\ - \x6b\x03\x02\x06\x02\u{e4}\x0a\x02\x0d\x02\x0e\x02\u{e5}\x03\x02\x03\x02\ - \x03\x03\x03\x03\x03\x03\x03\x03\x07\x03\u{ee}\x0a\x03\x0c\x03\x0e\x03\ - \u{f1}\x0b\x03\x03\x03\x03\x03\x03\x04\x05\x04\u{f6}\x0a\x04\x03\x04\x03\ - \x04\x05\x04\u{fa}\x0a\x04\x03\x04\x07\x04\u{fd}\x0a\x04\x0c\x04\x0e\x04\ - \u{100}\x0b\x04\x03\x04\x03\x04\x03\x05\x03\x05\x05\x05\u{106}\x0a\x05\ - \x03\x06\x05\x06\u{109}\x0a\x06\x03\x07\x03\x07\x05\x07\u{10d}\x0a\x07\ - \x03\x08\x06\x08\u{110}\x0a\x08\x0d\x08\x0e\x08\u{111}\x03\x09\x03\x09\ - \x03\x09\x03\x09\x03\x09\x03\x09\x03\x0a\x03\x0a\x07\x0a\u{11c}\x0a\x0a\ - \x0c\x0a\x0e\x0a\u{11f}\x0b\x0a\x03\x0a\x03\x0a\x03\x0b\x03\x0b\x03\x0b\ - \x03\x0b\x03\x0c\x06\x0c\u{128}\x0a\x0c\x0d\x0c\x0e\x0c\u{129}\x03\x0d\ - \x03\x0d\x03\x0d\x03\x0d\x03\x0d\x03\x0d\x03\x0e\x03\x0e\x03\x0e\x03\x0e\ - \x03\x0f\x03\x0f\x03\x0f\x03\x0f\x03\x0f\x03\x10\x03\x10\x03\x10\x03\x10\ - \x03\x10\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x12\x03\x12\ - \x03\x12\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\ - \x03\x14\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x16\ - \x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x17\x03\x17\x03\x17\x03\x17\ - \x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x19\x03\x19\x03\x19\ - \x03\x19\x05\x19\u{16d}\x0a\x19\x03\x19\x03\x19\x03\x1a\x03\x1a\x03\x1a\ - \x03\x1a\x03\x1a\x03\x1b\x03\x1b\x03\x1b\x03\x1b\x03\x1b\x03\x1b\x03\x1c\ - \x03\x1c\x03\x1c\x03\x1c\x03\x1c\x03\x1d\x03\x1d\x03\x1d\x03\x1d\x03\x1d\ - \x03\x1d\x03\x1d\x03\x1e\x03\x1e\x03\x1e\x03\x1e\x03\x1f\x06\x1f\u{18d}\ - \x0a\x1f\x0d\x1f\x0e\x1f\u{18e}\x03\x1f\x05\x1f\u{192}\x0a\x1f\x03\x20\ - \x03\x20\x03\x21\x03\x21\x03\x21\x03\x21\x03\x21\x03\x22\x03\x22\x03\x22\ - \x03\x22\x03\x23\x03\x23\x03\x23\x03\x23\x03\x24\x03\x24\x03\x24\x03\x24\ - \x03\x25\x03\x25\x03\x25\x03\x25\x03\x25\x03\x25\x03\x26\x03\x26\x03\x26\ - \x03\x26\x03\x26\x03\x27\x03\x27\x03\x27\x03\x27\x03\x27\x03\x28\x03\x28\ - \x03\x29\x03\x29\x03\x29\x03\x29\x03\x2a\x03\x2a\x03\x2a\x03\x2a\x03\x2b\ - \x06\x2b\u{1c2}\x0a\x2b\x0d\x2b\x0e\x2b\u{1c3}\x03\x2b\x03\x2b\x03\x2c\ - \x03\x2c\x03\x2c\x03\x2c\x03\x2d\x03\x2d\x03\x2d\x03\x2d\x03\x2d\x03\x2e\ - \x03\x2e\x03\x2e\x03\x2e\x03\x2e\x03\x2e\x03\x2f\x03\x2f\x03\x2f\x03\x2f\ - \x03\x2f\x03\x30\x03\x30\x03\x30\x05\x30\u{1df}\x0a\x30\x03\x31\x03\x31\ - \x03\x31\x03\x31\x03\x31\x05\x31\u{1e6}\x0a\x31\x03\x32\x03\x32\x03\x32\ - \x03\x32\x03\x32\x05\x32\u{1ed}\x0a\x32\x03\x33\x03\x33\x03\x33\x03\x33\ - \x03\x33\x03\x33\x05\x33\u{1f5}\x0a\x33\x03\x34\x03\x34\x03\x34\x05\x34\ - \u{1fa}\x0a\x34\x03\x35\x03\x35\x03\x35\x05\x35\u{1ff}\x0a\x35\x03\x36\ - \x03\x36\x03\x36\x03\x36\x03\x36\x05\x36\u{206}\x0a\x36\x03\x37\x03\x37\ - \x03\x37\x03\x37\x03\x37\x05\x37\u{20d}\x0a\x37\x03\x38\x03\x38\x03\x38\ - \x03\x38\x05\x38\u{213}\x0a\x38\x03\x39\x03\x39\x03\x39\x03\x39\x05\x39\ - \u{219}\x0a\x39\x03\x3a\x03\x3a\x03\x3a\x03\x3a\x05\x3a\u{21f}\x0a\x3a\ - \x03\x3b\x03\x3b\x03\x3b\x03\x3c\x03\x3c\x03\x3c\x03\x3d\x03\x3d\x03\x3d\ - \x03\x3e\x03\x3e\x03\x3e\x03\x3f\x03\x3f\x03\x3f\x03\x40\x03\x40\x03\x41\ - \x03\x41\x03\x42\x03\x42\x03\x43\x03\x43\x03\x44\x03\x44\x03\x45\x03\x45\ - \x03\x46\x03\x46\x03\x47\x03\x47\x03\x48\x03\x48\x03\x48\x03\x49\x03\x49\ - \x03\x49\x03\x49\x03\x49\x03\x49\x03\x49\x03\x49\x03\x49\x03\x4a\x03\x4a\ - \x03\x4a\x03\x4a\x03\x4a\x03\x4a\x03\x4a\x03\x4a\x03\x4a\x03\x4b\x03\x4b\ + \x6b\x04\x6c\x09\x6c\x04\x6d\x09\x6d\x04\x6e\x09\x6e\x04\x6f\x09\x6f\x04\ + \x70\x09\x70\x03\x02\x06\x02\u{ee}\x0a\x02\x0d\x02\x0e\x02\u{ef}\x03\x02\ + \x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03\u{f8}\x0a\x03\x0c\x03\ + \x0e\x03\u{fb}\x0b\x03\x03\x03\x03\x03\x03\x04\x05\x04\u{100}\x0a\x04\x03\ + \x04\x03\x04\x05\x04\u{104}\x0a\x04\x03\x04\x07\x04\u{107}\x0a\x04\x0c\ + \x04\x0e\x04\u{10a}\x0b\x04\x03\x04\x03\x04\x03\x05\x03\x05\x05\x05\u{110}\ + \x0a\x05\x03\x06\x05\x06\u{113}\x0a\x06\x03\x07\x03\x07\x05\x07\u{117}\ + \x0a\x07\x03\x08\x06\x08\u{11a}\x0a\x08\x0d\x08\x0e\x08\u{11b}\x03\x09\ + \x03\x09\x03\x09\x03\x09\x03\x09\x03\x09\x03\x0a\x03\x0a\x07\x0a\u{126}\ + \x0a\x0a\x0c\x0a\x0e\x0a\u{129}\x0b\x0a\x03\x0a\x03\x0a\x03\x0b\x03\x0b\ + \x03\x0b\x03\x0b\x03\x0c\x06\x0c\u{132}\x0a\x0c\x0d\x0c\x0e\x0c\u{133}\ + \x03\x0d\x03\x0d\x03\x0d\x03\x0d\x03\x0d\x03\x0d\x03\x0e\x03\x0e\x03\x0e\ + \x03\x0e\x03\x0f\x03\x0f\x03\x0f\x03\x0f\x03\x0f\x03\x10\x03\x10\x03\x10\ + \x03\x10\x03\x10\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x12\ + \x03\x12\x03\x12\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\ + \x03\x14\x03\x14\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\ + \x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x17\x03\x17\x03\x17\ + \x03\x17\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x19\ + \x03\x19\x03\x19\x03\x19\x03\x19\x03\x1a\x03\x1a\x03\x1a\x03\x1a\x05\x1a\ + \u{17d}\x0a\x1a\x03\x1a\x03\x1a\x03\x1b\x03\x1b\x03\x1b\x03\x1b\x03\x1b\ + \x03\x1c\x03\x1c\x03\x1c\x03\x1c\x03\x1c\x03\x1c\x03\x1d\x03\x1d\x03\x1d\ + \x03\x1d\x03\x1d\x03\x1e\x03\x1e\x03\x1e\x03\x1e\x03\x1e\x03\x1e\x03\x1e\ + \x03\x1f\x03\x1f\x03\x1f\x03\x1f\x03\x20\x06\x20\u{19d}\x0a\x20\x0d\x20\ + \x0e\x20\u{19e}\x03\x20\x05\x20\u{1a2}\x0a\x20\x03\x21\x03\x21\x03\x22\ + \x03\x22\x03\x22\x03\x22\x03\x22\x03\x23\x03\x23\x03\x23\x03\x23\x03\x24\ + \x03\x24\x03\x24\x03\x24\x03\x25\x03\x25\x03\x25\x03\x25\x03\x26\x03\x26\ + \x03\x26\x03\x26\x03\x26\x03\x26\x03\x27\x03\x27\x03\x27\x03\x27\x03\x27\ + \x03\x28\x03\x28\x03\x28\x03\x28\x03\x28\x03\x29\x03\x29\x03\x2a\x03\x2a\ + \x03\x2a\x03\x2a\x03\x2b\x03\x2b\x03\x2b\x03\x2b\x03\x2c\x06\x2c\u{1d2}\ + \x0a\x2c\x0d\x2c\x0e\x2c\u{1d3}\x03\x2c\x03\x2c\x03\x2d\x03\x2d\x03\x2d\ + \x03\x2d\x03\x2e\x03\x2e\x03\x2e\x03\x2e\x03\x2e\x03\x2f\x03\x2f\x03\x2f\ + \x03\x2f\x03\x2f\x03\x2f\x03\x30\x03\x30\x03\x30\x03\x30\x03\x30\x03\x31\ + \x03\x31\x03\x31\x05\x31\u{1ef}\x0a\x31\x03\x32\x03\x32\x03\x32\x03\x32\ + \x03\x32\x05\x32\u{1f6}\x0a\x32\x03\x33\x03\x33\x03\x33\x03\x33\x03\x33\ + \x05\x33\u{1fd}\x0a\x33\x03\x34\x03\x34\x03\x34\x03\x34\x03\x34\x03\x34\ + \x05\x34\u{205}\x0a\x34\x03\x35\x03\x35\x03\x35\x05\x35\u{20a}\x0a\x35\ + \x03\x36\x03\x36\x03\x36\x05\x36\u{20f}\x0a\x36\x03\x37\x03\x37\x03\x37\ + \x03\x37\x03\x37\x05\x37\u{216}\x0a\x37\x03\x38\x03\x38\x03\x38\x03\x38\ + \x03\x38\x05\x38\u{21d}\x0a\x38\x03\x39\x03\x39\x03\x39\x03\x39\x05\x39\ + \u{223}\x0a\x39\x03\x3a\x03\x3a\x03\x3a\x03\x3a\x05\x3a\u{229}\x0a\x3a\ + \x03\x3b\x03\x3b\x03\x3b\x03\x3b\x05\x3b\u{22f}\x0a\x3b\x03\x3c\x03\x3c\ + \x03\x3c\x03\x3d\x03\x3d\x03\x3d\x03\x3e\x03\x3e\x03\x3e\x03\x3f\x03\x3f\ + \x03\x3f\x03\x40\x03\x40\x03\x40\x03\x41\x03\x41\x03\x42\x03\x42\x03\x43\ + \x03\x43\x03\x44\x03\x44\x03\x45\x03\x45\x03\x46\x03\x46\x03\x47\x03\x47\ + \x03\x48\x03\x48\x03\x49\x03\x49\x03\x49\x03\x4a\x03\x4a\x03\x4a\x03\x4a\ + \x03\x4a\x03\x4a\x03\x4a\x03\x4a\x03\x4a\x03\x4b\x03\x4b\x03\x4b\x03\x4b\ \x03\x4b\x03\x4b\x03\x4b\x03\x4b\x03\x4b\x03\x4c\x03\x4c\x03\x4c\x03\x4c\ - \x07\x4c\u{260}\x0a\x4c\x0c\x4c\x0e\x4c\u{263}\x0b\x4c\x03\x4c\x03\x4c\ - \x03\x4d\x03\x4d\x03\x4e\x03\x4e\x03\x4e\x03\x4e\x03\x4f\x03\x4f\x03\x4f\ - \x03\x4f\x03\x4f\x03\x4f\x03\x4f\x03\x50\x03\x50\x03\x50\x03\x51\x03\x51\ - \x03\x52\x03\x52\x03\x52\x03\x52\x03\x52\x05\x52\u{27e}\x0a\x52\x03\x53\ - \x06\x53\u{281}\x0a\x53\x0d\x53\x0e\x53\u{282}\x03\x54\x03\x54\x03\x55\ - \x03\x55\x03\x55\x03\x55\x03\x56\x03\x56\x03\x56\x03\x56\x03\x56\x03\x56\ - \x03\x56\x03\x57\x03\x57\x03\x57\x03\x57\x03\x57\x03\x57\x03\x57\x03\x57\ + \x03\x4c\x03\x4c\x03\x4c\x03\x4d\x03\x4d\x03\x4d\x03\x4d\x07\x4d\u{270}\ + \x0a\x4d\x0c\x4d\x0e\x4d\u{273}\x0b\x4d\x03\x4d\x03\x4d\x03\x4e\x03\x4e\ + \x03\x4f\x03\x4f\x03\x4f\x03\x4f\x03\x50\x03\x50\x03\x50\x03\x50\x03\x50\ + \x03\x50\x03\x50\x03\x51\x03\x51\x03\x51\x03\x52\x03\x52\x03\x53\x03\x53\ + \x03\x53\x03\x53\x03\x53\x05\x53\u{28e}\x0a\x53\x03\x54\x06\x54\u{291}\ + \x0a\x54\x0d\x54\x0e\x54\u{292}\x03\x55\x03\x55\x03\x56\x03\x56\x03\x57\ \x03\x57\x03\x57\x03\x57\x03\x58\x03\x58\x03\x58\x03\x58\x03\x58\x03\x58\ - \x05\x58\u{2a3}\x0a\x58\x03\x59\x03\x59\x03\x59\x03\x59\x03\x59\x03\x59\ - \x03\x59\x03\x59\x03\x5a\x03\x5a\x03\x5a\x03\x5a\x03\x5a\x03\x5a\x03\x5b\ - \x03\x5b\x03\x5b\x03\x5b\x03\x5b\x03\x5b\x03\x5b\x03\x5b\x03\x5b\x03\x5c\ - \x03\x5c\x03\x5c\x03\x5c\x03\x5c\x03\x5c\x03\x5c\x03\x5c\x03\x5c\x03\x5c\ - \x03\x5c\x03\x5c\x03\x5d\x03\x5d\x03\x5d\x03\x5d\x03\x5d\x03\x5d\x03\x5d\ - \x03\x5d\x03\x5d\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\ + \x03\x58\x03\x59\x03\x59\x03\x59\x03\x59\x03\x59\x03\x59\x03\x59\x03\x59\ + \x03\x59\x03\x59\x03\x59\x03\x5a\x03\x5a\x03\x5a\x03\x5a\x03\x5a\x03\x5a\ + \x05\x5a\u{2b5}\x0a\x5a\x03\x5b\x03\x5b\x03\x5b\x03\x5b\x03\x5b\x03\x5b\ + \x03\x5b\x03\x5b\x03\x5c\x03\x5c\x03\x5c\x03\x5c\x03\x5c\x03\x5c\x03\x5d\ + \x03\x5d\x03\x5d\x03\x5d\x03\x5d\x03\x5d\x03\x5d\x03\x5d\x03\x5d\x03\x5e\ + \x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\ \x03\x5e\x03\x5e\x03\x5f\x03\x5f\x03\x5f\x03\x5f\x03\x5f\x03\x5f\x03\x5f\ \x03\x5f\x03\x5f\x03\x60\x03\x60\x03\x60\x03\x60\x03\x60\x03\x60\x03\x60\ - \x03\x60\x03\x60\x05\x60\u{2ec}\x0a\x60\x03\x61\x03\x61\x03\x61\x03\x61\ - \x03\x61\x03\x61\x03\x61\x03\x61\x03\x62\x03\x62\x03\x62\x03\x62\x03\x62\ - \x03\x63\x03\x63\x03\x63\x03\x63\x03\x63\x03\x64\x03\x64\x03\x64\x03\x64\ - \x03\x64\x03\x65\x03\x65\x03\x65\x03\x65\x03\x66\x06\x66\u{30a}\x0a\x66\ - \x0d\x66\x0e\x66\u{30b}\x03\x67\x03\x67\x03\x67\x03\x67\x03\x67\x03\x68\ - \x03\x68\x03\x68\x03\x68\x03\x68\x03\x68\x03\x69\x03\x69\x03\x69\x03\x69\ - \x03\x69\x03\x6a\x03\x6a\x03\x6a\x03\x6a\x03\x6a\x03\x6b\x03\x6b\x03\x6b\ - \x03\x6b\x03\x6b\x03\x6b\x02\x02\x6c\x0e\x06\x10\x07\x12\x08\x14\x09\x16\ - \x02\x18\x02\x1a\x02\x1c\x0a\x1e\x0b\x20\x0c\x22\x0d\x24\x02\x26\x0e\x28\ - \x02\x2a\x02\x2c\x0f\x2e\x10\x30\x11\x32\x02\x34\x12\x36\x13\x38\x02\x3a\ - \x02\x3c\x02\x3e\x14\x40\x02\x42\x02\x44\x02\x46\x15\x48\x16\x4a\x02\x4c\ - \x02\x4e\x17\x50\x18\x52\x19\x54\x02\x56\x02\x58\x02\x5a\x1a\x5c\x1b\x5e\ - \x02\x60\x1c\x62\x1d\x64\x1e\x66\x1f\x68\x20\x6a\x21\x6c\x22\x6e\x23\x70\ - \x24\x72\x25\x74\x26\x76\x27\x78\x28\x7a\x29\x7c\x2a\x7e\x2b\u{80}\x2c\ - \u{82}\x2d\u{84}\x2e\u{86}\x2f\u{88}\x30\u{8a}\x31\u{8c}\x32\u{8e}\x33\ - \u{90}\x34\u{92}\x35\u{94}\x36\u{96}\x37\u{98}\x38\u{9a}\x39\u{9c}\x51\ - \u{9e}\x52\u{a0}\x53\u{a2}\x3a\u{a4}\x3b\u{a6}\x3c\u{a8}\x02\u{aa}\x3d\ - \u{ac}\x3e\u{ae}\x3f\u{b0}\x02\u{b2}\x02\u{b4}\x40\u{b6}\x41\u{b8}\x42\ - \u{ba}\x43\u{bc}\x44\u{be}\x45\u{c0}\x46\u{c2}\x47\u{c4}\x48\u{c6}\x49\ - \u{c8}\x4a\u{ca}\x4b\u{cc}\x4c\u{ce}\x4d\u{d0}\x02\u{d2}\x4e\u{d4}\x4f\ - \u{d6}\x50\u{d8}\x02\u{da}\x02\u{dc}\x02\u{de}\x02\u{e0}\x02\x0e\x02\x03\ - \x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0f\x04\x02\x0b\x0b\x22\x22\x04\ - \x02\x0c\x0c\x0f\x0f\x07\x02\x32\x3b\u{302}\u{371}\u{1dc2}\u{1e01}\u{20d2}\ - \u{2101}\u{fe22}\u{fe31}\x03\x02\x22\x22\x04\x02\x31\x31\x3e\x3e\x09\x02\ - \x0c\x0c\x0f\x0f\x25\x25\x31\x31\x3e\x3e\x5e\x5e\x7d\x7d\x09\x02\x25\x25\ - \x31\x31\x3e\x3e\x40\x40\x5e\x5e\x7d\x7d\x7f\x7f\x07\x02\x0b\x0c\x0f\x0f\ - \x22\x22\x25\x26\x3e\x3e\x06\x02\x0c\x0c\x0f\x0f\x24\x24\x5e\x5e\x04\x02\ - \x24\x24\x5e\x5e\x03\x02\x32\x3b\x0c\x02\x0b\x0f\x22\x22\u{87}\u{87}\u{a2}\ - \u{a2}\u{1682}\u{1682}\u{2002}\u{200c}\u{202a}\u{202b}\u{2031}\u{2031}\ - \u{2061}\u{2061}\u{3002}\u{3002}\x04\x02\x40\x40\x7d\x7d\x03\x33\x02\x43\ + \x03\x60\x03\x60\x03\x61\x03\x61\x03\x61\x03\x61\x03\x61\x03\x61\x03\x61\ + \x03\x61\x03\x61\x03\x62\x03\x62\x03\x62\x03\x62\x03\x62\x03\x62\x03\x62\ + \x03\x62\x03\x62\x05\x62\u{2fe}\x0a\x62\x03\x63\x03\x63\x03\x63\x03\x63\ + \x03\x63\x03\x63\x03\x63\x03\x63\x03\x64\x03\x64\x03\x64\x03\x64\x03\x64\ + \x03\x65\x03\x65\x03\x65\x03\x65\x03\x65\x03\x65\x03\x66\x03\x66\x03\x66\ + \x03\x66\x03\x66\x03\x67\x03\x67\x03\x68\x03\x68\x03\x68\x03\x68\x03\x68\ + \x03\x69\x03\x69\x03\x69\x03\x69\x03\x6a\x06\x6a\u{324}\x0a\x6a\x0d\x6a\ + \x0e\x6a\u{325}\x03\x6b\x03\x6b\x03\x6c\x03\x6c\x03\x6c\x03\x6c\x03\x6c\ + \x03\x6d\x03\x6d\x03\x6d\x03\x6d\x03\x6d\x03\x6d\x03\x6e\x03\x6e\x03\x6e\ + \x03\x6e\x03\x6e\x03\x6f\x03\x6f\x03\x6f\x03\x6f\x03\x6f\x03\x70\x03\x70\ + \x03\x70\x03\x70\x03\x70\x03\x70\x02\x02\x71\x0e\x06\x10\x07\x12\x08\x14\ + \x09\x16\x02\x18\x02\x1a\x02\x1c\x0a\x1e\x0b\x20\x0c\x22\x0d\x24\x02\x26\ + \x0e\x28\x02\x2a\x02\x2c\x0f\x2e\x10\x30\x11\x32\x02\x34\x12\x36\x02\x38\ + \x13\x3a\x02\x3c\x02\x3e\x02\x40\x14\x42\x02\x44\x02\x46\x02\x48\x15\x4a\ + \x16\x4c\x02\x4e\x02\x50\x17\x52\x18\x54\x19\x56\x02\x58\x02\x5a\x02\x5c\ + \x1a\x5e\x1b\x60\x02\x62\x1c\x64\x1d\x66\x1e\x68\x1f\x6a\x20\x6c\x21\x6e\ + \x22\x70\x23\x72\x24\x74\x25\x76\x26\x78\x27\x7a\x28\x7c\x29\x7e\x2a\u{80}\ + \x2b\u{82}\x2c\u{84}\x2d\u{86}\x2e\u{88}\x2f\u{8a}\x30\u{8c}\x31\u{8e}\ + \x32\u{90}\x33\u{92}\x34\u{94}\x35\u{96}\x36\u{98}\x37\u{9a}\x38\u{9c}\ + \x39\u{9e}\x54\u{a0}\x55\u{a2}\x56\u{a4}\x3a\u{a6}\x3b\u{a8}\x3c\u{aa}\ + \x02\u{ac}\x3d\u{ae}\x3e\u{b0}\x3f\u{b2}\x02\u{b4}\x02\u{b6}\x40\u{b8}\ + \x41\u{ba}\x42\u{bc}\x43\u{be}\x44\u{c0}\x45\u{c2}\x46\u{c4}\x47\u{c6}\ + \x48\u{c8}\x49\u{ca}\x4a\u{cc}\x4b\u{ce}\x4c\u{d0}\x4d\u{d2}\x4e\u{d4}\ + \x02\u{d6}\x02\u{d8}\x4f\u{da}\x50\u{dc}\x51\u{de}\x52\u{e0}\x53\u{e2}\ + \x02\u{e4}\x02\u{e6}\x02\u{e8}\x02\u{ea}\x02\x0e\x02\x03\x04\x05\x06\x07\ + \x08\x09\x0a\x0b\x0c\x0d\x0f\x04\x02\x0b\x0b\x22\x22\x04\x02\x0c\x0c\x0f\ + \x0f\x07\x02\x32\x3b\u{302}\u{371}\u{1dc2}\u{1e01}\u{20d2}\u{2101}\u{fe22}\ + \u{fe31}\x03\x02\x22\x22\x04\x02\x31\x31\x3e\x3e\x09\x02\x0c\x0c\x0f\x0f\ + \x25\x25\x31\x31\x3e\x3e\x5e\x5e\x7d\x7d\x09\x02\x25\x25\x31\x31\x3e\x3e\ + \x40\x40\x5e\x5e\x7d\x7d\x7f\x7f\x07\x02\x0b\x0c\x0f\x0f\x22\x22\x25\x26\ + \x3e\x3e\x06\x02\x0c\x0c\x0f\x0f\x24\x24\x5e\x5e\x04\x02\x24\x24\x5e\x5e\ + \x03\x02\x32\x3b\x0c\x02\x0b\x0f\x22\x22\u{87}\u{87}\u{a2}\u{a2}\u{1682}\ + \u{1682}\u{2002}\u{200c}\u{202a}\u{202b}\u{2031}\u{2031}\u{2061}\u{2061}\ + \u{3002}\u{3002}\x06\x02\x0c\x0c\x0f\x0f\x40\x40\x7d\x7d\x03\x33\x02\x43\ \x02\x5c\x02\x61\x02\x61\x02\x63\x02\x7c\x02\u{aa}\x02\u{aa}\x02\u{ac}\ \x02\u{ac}\x02\u{af}\x02\u{af}\x02\u{b1}\x02\u{b1}\x02\u{b4}\x02\u{b7}\ \x02\u{b9}\x02\u{bc}\x02\u{be}\x02\u{c0}\x02\u{c2}\x02\u{d8}\x02\u{da}\ @@ -693,20 +483,20 @@ const _serializedATN: &'static str = \x03\x02\x04\u{ffff}\x04\x02\x05\u{ffff}\x05\x02\x06\u{ffff}\x06\x02\x07\ \u{ffff}\x07\x02\x08\u{ffff}\x08\x02\x09\u{ffff}\x09\x02\x0a\u{ffff}\x0a\ \x02\x0b\u{ffff}\x0b\x02\x0c\u{ffff}\x0c\x02\x0d\u{ffff}\x0d\x02\x0e\u{ffff}\ - \x0e\x02\x0f\u{ffff}\x0f\x02\x10\u{ffff}\x10\u{337}\x02\x0e\x03\x02\x02\ + \x0e\x02\x0f\u{ffff}\x0f\x02\x10\u{ffff}\x10\u{353}\x02\x0e\x03\x02\x02\ \x02\x02\x10\x03\x02\x02\x02\x02\x12\x03\x02\x02\x02\x02\x14\x03\x02\x02\ \x02\x02\x1c\x03\x02\x02\x02\x02\x1e\x03\x02\x02\x02\x02\x20\x03\x02\x02\ \x02\x03\x22\x03\x02\x02\x02\x03\x24\x03\x02\x02\x02\x04\x26\x03\x02\x02\ \x02\x04\x28\x03\x02\x02\x02\x04\x2a\x03\x02\x02\x02\x04\x2c\x03\x02\x02\ \x02\x04\x2e\x03\x02\x02\x02\x04\x30\x03\x02\x02\x02\x04\x32\x03\x02\x02\ \x02\x04\x34\x03\x02\x02\x02\x04\x36\x03\x02\x02\x02\x04\x38\x03\x02\x02\ - \x02\x05\x3a\x03\x02\x02\x02\x05\x3c\x03\x02\x02\x02\x05\x3e\x03\x02\x02\ + \x02\x04\x3a\x03\x02\x02\x02\x05\x3c\x03\x02\x02\x02\x05\x3e\x03\x02\x02\ \x02\x05\x40\x03\x02\x02\x02\x05\x42\x03\x02\x02\x02\x05\x44\x03\x02\x02\ - \x02\x05\x46\x03\x02\x02\x02\x05\x48\x03\x02\x02\x02\x06\x4c\x03\x02\x02\ - \x02\x06\x4e\x03\x02\x02\x02\x07\x50\x03\x02\x02\x02\x07\x52\x03\x02\x02\ + \x02\x05\x46\x03\x02\x02\x02\x05\x48\x03\x02\x02\x02\x05\x4a\x03\x02\x02\ + \x02\x06\x4e\x03\x02\x02\x02\x06\x50\x03\x02\x02\x02\x07\x52\x03\x02\x02\ \x02\x07\x54\x03\x02\x02\x02\x07\x56\x03\x02\x02\x02\x07\x58\x03\x02\x02\ - \x02\x07\x5a\x03\x02\x02\x02\x08\x5c\x03\x02\x02\x02\x08\x5e\x03\x02\x02\ - \x02\x08\x60\x03\x02\x02\x02\x09\x62\x03\x02\x02\x02\x09\x64\x03\x02\x02\ + \x02\x07\x5a\x03\x02\x02\x02\x07\x5c\x03\x02\x02\x02\x08\x5e\x03\x02\x02\ + \x02\x08\x60\x03\x02\x02\x02\x08\x62\x03\x02\x02\x02\x09\x64\x03\x02\x02\ \x02\x09\x66\x03\x02\x02\x02\x09\x68\x03\x02\x02\x02\x09\x6a\x03\x02\x02\ \x02\x09\x6c\x03\x02\x02\x02\x09\x6e\x03\x02\x02\x02\x09\x70\x03\x02\x02\ \x02\x09\x72\x03\x02\x02\x02\x09\x74\x03\x02\x02\x02\x09\x76\x03\x02\x02\ @@ -720,313 +510,325 @@ const _serializedATN: &'static str = \x03\x02\x02\x02\x09\u{a0}\x03\x02\x02\x02\x09\u{a2}\x03\x02\x02\x02\x09\ \u{a4}\x03\x02\x02\x02\x09\u{a6}\x03\x02\x02\x02\x09\u{a8}\x03\x02\x02\ \x02\x09\u{aa}\x03\x02\x02\x02\x09\u{ac}\x03\x02\x02\x02\x09\u{ae}\x03\ - \x02\x02\x02\x0a\u{b4}\x03\x02\x02\x02\x0a\u{b6}\x03\x02\x02\x02\x0a\u{b8}\ + \x02\x02\x02\x09\u{b0}\x03\x02\x02\x02\x0a\u{b6}\x03\x02\x02\x02\x0a\u{b8}\ \x03\x02\x02\x02\x0a\u{ba}\x03\x02\x02\x02\x0a\u{bc}\x03\x02\x02\x02\x0a\ \u{be}\x03\x02\x02\x02\x0a\u{c0}\x03\x02\x02\x02\x0a\u{c2}\x03\x02\x02\ \x02\x0a\u{c4}\x03\x02\x02\x02\x0a\u{c6}\x03\x02\x02\x02\x0a\u{c8}\x03\ \x02\x02\x02\x0a\u{ca}\x03\x02\x02\x02\x0a\u{cc}\x03\x02\x02\x02\x0a\u{ce}\ - \x03\x02\x02\x02\x0a\u{d0}\x03\x02\x02\x02\x0b\u{d2}\x03\x02\x02\x02\x0b\ - \u{d4}\x03\x02\x02\x02\x0b\u{d6}\x03\x02\x02\x02\x0c\u{d8}\x03\x02\x02\ - \x02\x0c\u{da}\x03\x02\x02\x02\x0d\u{dc}\x03\x02\x02\x02\x0d\u{de}\x03\ - \x02\x02\x02\x0d\u{e0}\x03\x02\x02\x02\x0e\u{e3}\x03\x02\x02\x02\x10\u{e9}\ - \x03\x02\x02\x02\x12\u{f9}\x03\x02\x02\x02\x14\u{103}\x03\x02\x02\x02\x16\ - \u{108}\x03\x02\x02\x02\x18\u{10c}\x03\x02\x02\x02\x1a\u{10f}\x03\x02\x02\ - \x02\x1c\u{113}\x03\x02\x02\x02\x1e\u{119}\x03\x02\x02\x02\x20\u{122}\x03\ - \x02\x02\x02\x22\u{127}\x03\x02\x02\x02\x24\u{12b}\x03\x02\x02\x02\x26\ - \u{131}\x03\x02\x02\x02\x28\u{135}\x03\x02\x02\x02\x2a\u{13a}\x03\x02\x02\ - \x02\x2c\u{13f}\x03\x02\x02\x02\x2e\u{145}\x03\x02\x02\x02\x30\u{148}\x03\ - \x02\x02\x02\x32\u{14d}\x03\x02\x02\x02\x34\u{153}\x03\x02\x02\x02\x36\ - \u{158}\x03\x02\x02\x02\x38\u{15e}\x03\x02\x02\x02\x3a\u{163}\x03\x02\x02\ - \x02\x3c\u{16c}\x03\x02\x02\x02\x3e\u{170}\x03\x02\x02\x02\x40\u{175}\x03\ - \x02\x02\x02\x42\u{17b}\x03\x02\x02\x02\x44\u{180}\x03\x02\x02\x02\x46\ - \u{187}\x03\x02\x02\x02\x48\u{191}\x03\x02\x02\x02\x4a\u{193}\x03\x02\x02\ - \x02\x4c\u{195}\x03\x02\x02\x02\x4e\u{19a}\x03\x02\x02\x02\x50\u{19e}\x03\ - \x02\x02\x02\x52\u{1a2}\x03\x02\x02\x02\x54\u{1a6}\x03\x02\x02\x02\x56\ - \u{1ac}\x03\x02\x02\x02\x58\u{1b1}\x03\x02\x02\x02\x5a\u{1b6}\x03\x02\x02\ - \x02\x5c\u{1b8}\x03\x02\x02\x02\x5e\u{1bc}\x03\x02\x02\x02\x60\u{1c1}\x03\ - \x02\x02\x02\x62\u{1c7}\x03\x02\x02\x02\x64\u{1cb}\x03\x02\x02\x02\x66\ - \u{1d0}\x03\x02\x02\x02\x68\u{1d6}\x03\x02\x02\x02\x6a\u{1de}\x03\x02\x02\ - \x02\x6c\u{1e5}\x03\x02\x02\x02\x6e\u{1ec}\x03\x02\x02\x02\x70\u{1f4}\x03\ - \x02\x02\x02\x72\u{1f9}\x03\x02\x02\x02\x74\u{1fe}\x03\x02\x02\x02\x76\ - \u{205}\x03\x02\x02\x02\x78\u{20c}\x03\x02\x02\x02\x7a\u{212}\x03\x02\x02\ - \x02\x7c\u{218}\x03\x02\x02\x02\x7e\u{21e}\x03\x02\x02\x02\u{80}\u{220}\ - \x03\x02\x02\x02\u{82}\u{223}\x03\x02\x02\x02\u{84}\u{226}\x03\x02\x02\ - \x02\u{86}\u{229}\x03\x02\x02\x02\u{88}\u{22c}\x03\x02\x02\x02\u{8a}\u{22f}\ - \x03\x02\x02\x02\u{8c}\u{231}\x03\x02\x02\x02\u{8e}\u{233}\x03\x02\x02\ - \x02\u{90}\u{235}\x03\x02\x02\x02\u{92}\u{237}\x03\x02\x02\x02\u{94}\u{239}\ - \x03\x02\x02\x02\u{96}\u{23b}\x03\x02\x02\x02\u{98}\u{23d}\x03\x02\x02\ - \x02\u{9a}\u{23f}\x03\x02\x02\x02\u{9c}\u{242}\x03\x02\x02\x02\u{9e}\u{24b}\ - \x03\x02\x02\x02\u{a0}\u{254}\x03\x02\x02\x02\u{a2}\u{25b}\x03\x02\x02\ - \x02\u{a4}\u{266}\x03\x02\x02\x02\u{a6}\u{268}\x03\x02\x02\x02\u{a8}\u{26c}\ - \x03\x02\x02\x02\u{aa}\u{273}\x03\x02\x02\x02\u{ac}\u{276}\x03\x02\x02\ - \x02\u{ae}\u{27d}\x03\x02\x02\x02\u{b0}\u{280}\x03\x02\x02\x02\u{b2}\u{284}\ - \x03\x02\x02\x02\u{b4}\u{286}\x03\x02\x02\x02\u{b6}\u{28a}\x03\x02\x02\ - \x02\u{b8}\u{291}\x03\x02\x02\x02\u{ba}\u{29c}\x03\x02\x02\x02\u{bc}\u{2a4}\ - \x03\x02\x02\x02\u{be}\u{2ac}\x03\x02\x02\x02\u{c0}\u{2b2}\x03\x02\x02\ - \x02\u{c2}\u{2bb}\x03\x02\x02\x02\u{c4}\u{2c7}\x03\x02\x02\x02\u{c6}\u{2d0}\ - \x03\x02\x02\x02\u{c8}\u{2d9}\x03\x02\x02\x02\u{ca}\u{2e2}\x03\x02\x02\ - \x02\u{cc}\u{2ed}\x03\x02\x02\x02\u{ce}\u{2f5}\x03\x02\x02\x02\u{d0}\u{2fa}\ - \x03\x02\x02\x02\u{d2}\u{2ff}\x03\x02\x02\x02\u{d4}\u{304}\x03\x02\x02\ - \x02\u{d6}\u{309}\x03\x02\x02\x02\u{d8}\u{30d}\x03\x02\x02\x02\u{da}\u{312}\ - \x03\x02\x02\x02\u{dc}\u{318}\x03\x02\x02\x02\u{de}\u{31d}\x03\x02\x02\ - \x02\u{e0}\u{322}\x03\x02\x02\x02\u{e2}\u{e4}\x09\x02\x02\x02\u{e3}\u{e2}\ - \x03\x02\x02\x02\u{e4}\u{e5}\x03\x02\x02\x02\u{e5}\u{e3}\x03\x02\x02\x02\ - \u{e5}\u{e6}\x03\x02\x02\x02\u{e6}\u{e7}\x03\x02\x02\x02\u{e7}\u{e8}\x08\ - \x02\x02\x02\u{e8}\x0f\x03\x02\x02\x02\u{e9}\u{ea}\x07\x31\x02\x02\u{ea}\ - \u{eb}\x07\x31\x02\x02\u{eb}\u{ef}\x03\x02\x02\x02\u{ec}\u{ee}\x0a\x03\ - \x02\x02\u{ed}\u{ec}\x03\x02\x02\x02\u{ee}\u{f1}\x03\x02\x02\x02\u{ef}\ - \u{ed}\x03\x02\x02\x02\u{ef}\u{f0}\x03\x02\x02\x02\u{f0}\u{f2}\x03\x02\ - \x02\x02\u{f1}\u{ef}\x03\x02\x02\x02\u{f2}\u{f3}\x08\x03\x03\x02\u{f3}\ - \x11\x03\x02\x02\x02\u{f4}\u{f6}\x07\x0f\x02\x02\u{f5}\u{f4}\x03\x02\x02\ - \x02\u{f5}\u{f6}\x03\x02\x02\x02\u{f6}\u{f7}\x03\x02\x02\x02\u{f7}\u{fa}\ - \x07\x0c\x02\x02\u{f8}\u{fa}\x07\x0f\x02\x02\u{f9}\u{f5}\x03\x02\x02\x02\ - \u{f9}\u{f8}\x03\x02\x02\x02\u{fa}\u{fe}\x03\x02\x02\x02\u{fb}\u{fd}\x09\ - \x02\x02\x02\u{fc}\u{fb}\x03\x02\x02\x02\u{fd}\u{100}\x03\x02\x02\x02\u{fe}\ - \u{fc}\x03\x02\x02\x02\u{fe}\u{ff}\x03\x02\x02\x02\u{ff}\u{101}\x03\x02\ - \x02\x02\u{100}\u{fe}\x03\x02\x02\x02\u{101}\u{102}\x08\x04\x04\x02\u{102}\ - \x13\x03\x02\x02\x02\u{103}\u{105}\x05\x16\x06\x02\u{104}\u{106}\x05\x1a\ - \x08\x02\u{105}\u{104}\x03\x02\x02\x02\u{105}\u{106}\x03\x02\x02\x02\u{106}\ - \x15\x03\x02\x02\x02\u{107}\u{109}\x09\x0f\x02\x02\u{108}\u{107}\x03\x02\ - \x02\x02\u{109}\x17\x03\x02\x02\x02\u{10a}\u{10d}\x09\x04\x02\x02\u{10b}\ - \u{10d}\x05\x16\x06\x02\u{10c}\u{10a}\x03\x02\x02\x02\u{10c}\u{10b}\x03\ - \x02\x02\x02\u{10d}\x19\x03\x02\x02\x02\u{10e}\u{110}\x05\x18\x07\x02\u{10f}\ - \u{10e}\x03\x02\x02\x02\u{110}\u{111}\x03\x02\x02\x02\u{111}\u{10f}\x03\ - \x02\x02\x02\u{111}\u{112}\x03\x02\x02\x02\u{112}\x1b\x03\x02\x02\x02\u{113}\ - \u{114}\x07\x2f\x02\x02\u{114}\u{115}\x07\x2f\x02\x02\u{115}\u{116}\x07\ - \x2f\x02\x02\u{116}\u{117}\x03\x02\x02\x02\u{117}\u{118}\x08\x09\x05\x02\ - \u{118}\x1d\x03\x02\x02\x02\u{119}\u{11d}\x07\x3c\x02\x02\u{11a}\u{11c}\ - \x09\x05\x02\x02\u{11b}\u{11a}\x03\x02\x02\x02\u{11c}\u{11f}\x03\x02\x02\ - \x02\u{11d}\u{11b}\x03\x02\x02\x02\u{11d}\u{11e}\x03\x02\x02\x02\u{11e}\ - \u{120}\x03\x02\x02\x02\u{11f}\u{11d}\x03\x02\x02\x02\u{120}\u{121}\x08\ - \x0a\x06\x02\u{121}\x1f\x03\x02\x02\x02\u{122}\u{123}\x07\x25\x02\x02\u{123}\ - \u{124}\x03\x02\x02\x02\u{124}\u{125}\x08\x0b\x07\x02\u{125}\x21\x03\x02\ - \x02\x02\u{126}\u{128}\x0a\x03\x02\x02\u{127}\u{126}\x03\x02\x02\x02\u{128}\ - \u{129}\x03\x02\x02\x02\u{129}\u{127}\x03\x02\x02\x02\u{129}\u{12a}\x03\ - \x02\x02\x02\u{12a}\x23\x03\x02\x02\x02\u{12b}\u{12c}\x05\x12\x04\x02\u{12c}\ - \u{12d}\x03\x02\x02\x02\u{12d}\u{12e}\x08\x0d\x08\x02\u{12e}\u{12f}\x08\ - \x0d\x04\x02\u{12f}\u{130}\x08\x0d\x09\x02\u{130}\x25\x03\x02\x02\x02\u{131}\ - \u{132}\x05\x0e\x02\x02\u{132}\u{133}\x03\x02\x02\x02\u{133}\u{134}\x08\ - \x0e\x02\x02\u{134}\x27\x03\x02\x02\x02\u{135}\u{136}\x05\x12\x04\x02\u{136}\ - \u{137}\x03\x02\x02\x02\u{137}\u{138}\x08\x0f\x08\x02\u{138}\u{139}\x08\ - \x0f\x04\x02\u{139}\x29\x03\x02\x02\x02\u{13a}\u{13b}\x05\x10\x03\x02\u{13b}\ - \u{13c}\x03\x02\x02\x02\u{13c}\u{13d}\x08\x10\x0a\x02\u{13d}\u{13e}\x08\ - \x10\x03\x02\u{13e}\x2b\x03\x02\x02\x02\u{13f}\u{140}\x07\x3f\x02\x02\u{140}\ - \u{141}\x07\x3f\x02\x02\u{141}\u{142}\x07\x3f\x02\x02\u{142}\u{143}\x03\ - \x02\x02\x02\u{143}\u{144}\x08\x11\x09\x02\u{144}\x2d\x03\x02\x02\x02\u{145}\ - \u{146}\x07\x2f\x02\x02\u{146}\u{147}\x07\x40\x02\x02\u{147}\x2f\x03\x02\ - \x02\x02\u{148}\u{149}\x07\x3e\x02\x02\u{149}\u{14a}\x07\x3e\x02\x02\u{14a}\ - \u{14b}\x03\x02\x02\x02\u{14b}\u{14c}\x08\x13\x0b\x02\u{14c}\x31\x03\x02\ - \x02\x02\u{14d}\u{14e}\x07\x25\x02\x02\u{14e}\u{14f}\x03\x02\x02\x02\u{14f}\ - \u{150}\x08\x14\x0c\x02\u{150}\u{151}\x08\x14\x0d\x02\u{151}\u{152}\x08\ - \x14\x07\x02\u{152}\x33\x03\x02\x02\x02\u{153}\u{154}\x07\x7d\x02\x02\u{154}\ - \u{155}\x03\x02\x02\x02\u{155}\u{156}\x08\x15\x0e\x02\u{156}\u{157}\x08\ - \x15\x0f\x02\u{157}\x35\x03\x02\x02\x02\u{158}\u{159}\x07\x5e\x02\x02\u{159}\ - \u{15a}\x03\x02\x02\x02\u{15a}\u{15b}\x08\x16\x10\x02\u{15b}\u{15c}\x08\ - \x16\x0e\x02\u{15c}\u{15d}\x08\x16\x11\x02\u{15d}\x37\x03\x02\x02\x02\u{15e}\ - \u{15f}\x0b\x02\x02\x02\u{15f}\u{160}\x03\x02\x02\x02\u{160}\u{161}\x08\ - \x17\x12\x02\u{161}\u{162}\x08\x17\x0e\x02\u{162}\x39\x03\x02\x02\x02\u{163}\ - \u{164}\x05\x12\x04\x02\u{164}\u{165}\x03\x02\x02\x02\u{165}\u{166}\x08\ - \x18\x08\x02\u{166}\u{167}\x08\x18\x09\x02\u{167}\x3b\x03\x02\x02\x02\u{168}\ - \u{169}\x07\x5e\x02\x02\u{169}\u{16d}\x07\x5d\x02\x02\u{16a}\u{16b}\x07\ - \x5e\x02\x02\u{16b}\u{16d}\x07\x5f\x02\x02\u{16c}\u{168}\x03\x02\x02\x02\ - \u{16c}\u{16a}\x03\x02\x02\x02\u{16d}\u{16e}\x03\x02\x02\x02\u{16e}\u{16f}\ - \x08\x19\x12\x02\u{16f}\x3d\x03\x02\x02\x02\u{170}\u{171}\x07\x5e\x02\x02\ - \u{171}\u{172}\x03\x02\x02\x02\u{172}\u{173}\x08\x1a\x10\x02\u{173}\u{174}\ - \x08\x1a\x11\x02\u{174}\x3f\x03\x02\x02\x02\u{175}\u{176}\x05\x20\x0b\x02\ - \u{176}\u{177}\x03\x02\x02\x02\u{177}\u{178}\x08\x1b\x0c\x02\u{178}\u{179}\ - \x08\x1b\x13\x02\u{179}\u{17a}\x08\x1b\x07\x02\u{17a}\x41\x03\x02\x02\x02\ - \u{17b}\u{17c}\x07\x7d\x02\x02\u{17c}\u{17d}\x03\x02\x02\x02\u{17d}\u{17e}\ - \x08\x1c\x14\x02\u{17e}\u{17f}\x08\x1c\x0f\x02\u{17f}\x43\x03\x02\x02\x02\ - \u{180}\u{181}\x07\x3e\x02\x02\u{181}\u{182}\x07\x3e\x02\x02\u{182}\u{183}\ - \x03\x02\x02\x02\u{183}\u{184}\x08\x1d\x15\x02\u{184}\u{185}\x08\x1d\x13\ - \x02\u{185}\u{186}\x08\x1d\x0b\x02\u{186}\x45\x03\x02\x02\x02\u{187}\u{188}\ - \x05\x10\x03\x02\u{188}\u{189}\x03\x02\x02\x02\u{189}\u{18a}\x08\x1e\x03\ - \x02\u{18a}\x47\x03\x02\x02\x02\u{18b}\u{18d}\x05\x4a\x20\x02\u{18c}\u{18b}\ - \x03\x02\x02\x02\u{18d}\u{18e}\x03\x02\x02\x02\u{18e}\u{18c}\x03\x02\x02\ - \x02\u{18e}\u{18f}\x03\x02\x02\x02\u{18f}\u{192}\x03\x02\x02\x02\u{190}\ - \u{192}\x09\x06\x02\x02\u{191}\u{18c}\x03\x02\x02\x02\u{191}\u{190}\x03\ - \x02\x02\x02\u{192}\x49\x03\x02\x02\x02\u{193}\u{194}\x0a\x07\x02\x02\u{194}\ - \x4b\x03\x02\x02\x02\u{195}\u{196}\x09\x08\x02\x02\u{196}\u{197}\x03\x02\ - \x02\x02\u{197}\u{198}\x08\x21\x12\x02\u{198}\u{199}\x08\x21\x09\x02\u{199}\ - \x4d\x03\x02\x02\x02\u{19a}\u{19b}\x0b\x02\x02\x02\u{19b}\u{19c}\x03\x02\ - \x02\x02\u{19c}\u{19d}\x08\x22\x09\x02\u{19d}\x4f\x03\x02\x02\x02\u{19e}\ - \u{19f}\x05\x0e\x02\x02\u{19f}\u{1a0}\x03\x02\x02\x02\u{1a0}\u{1a1}\x08\ - \x23\x02\x02\u{1a1}\x51\x03\x02\x02\x02\u{1a2}\u{1a3}\x05\x10\x03\x02\u{1a3}\ - \u{1a4}\x03\x02\x02\x02\u{1a4}\u{1a5}\x08\x24\x03\x02\u{1a5}\x53\x03\x02\ - \x02\x02\u{1a6}\u{1a7}\x07\x3e\x02\x02\u{1a7}\u{1a8}\x07\x3e\x02\x02\u{1a8}\ - \u{1a9}\x03\x02\x02\x02\u{1a9}\u{1aa}\x08\x25\x15\x02\u{1aa}\u{1ab}\x08\ - \x25\x0b\x02\u{1ab}\x55\x03\x02\x02\x02\u{1ac}\u{1ad}\x07\x25\x02\x02\u{1ad}\ - \u{1ae}\x03\x02\x02\x02\u{1ae}\u{1af}\x08\x26\x0c\x02\u{1af}\u{1b0}\x08\ - \x26\x07\x02\u{1b0}\x57\x03\x02\x02\x02\u{1b1}\u{1b2}\x05\x12\x04\x02\u{1b2}\ - \u{1b3}\x03\x02\x02\x02\u{1b3}\u{1b4}\x08\x27\x08\x02\u{1b4}\u{1b5}\x08\ - \x27\x09\x02\u{1b5}\x59\x03\x02\x02\x02\u{1b6}\u{1b7}\x0b\x02\x02\x02\u{1b7}\ - \x5b\x03\x02\x02\x02\u{1b8}\u{1b9}\x05\x0e\x02\x02\u{1b9}\u{1ba}\x03\x02\ - \x02\x02\u{1ba}\u{1bb}\x08\x29\x02\x02\u{1bb}\x5d\x03\x02\x02\x02\u{1bc}\ - \u{1bd}\x05\x20\x0b\x02\u{1bd}\u{1be}\x03\x02\x02\x02\u{1be}\u{1bf}\x08\ - \x2a\x0c\x02\u{1bf}\x5f\x03\x02\x02\x02\u{1c0}\u{1c2}\x0a\x09\x02\x02\u{1c1}\ - \u{1c0}\x03\x02\x02\x02\u{1c2}\u{1c3}\x03\x02\x02\x02\u{1c3}\u{1c1}\x03\ - \x02\x02\x02\u{1c3}\u{1c4}\x03\x02\x02\x02\u{1c4}\u{1c5}\x03\x02\x02\x02\ - \u{1c5}\u{1c6}\x08\x2b\x09\x02\u{1c6}\x61\x03\x02\x02\x02\u{1c7}\u{1c8}\ - \x05\x0e\x02\x02\u{1c8}\u{1c9}\x03\x02\x02\x02\u{1c9}\u{1ca}\x08\x2c\x02\ - \x02\u{1ca}\x63\x03\x02\x02\x02\u{1cb}\u{1cc}\x07\x76\x02\x02\u{1cc}\u{1cd}\ - \x07\x74\x02\x02\u{1cd}\u{1ce}\x07\x77\x02\x02\u{1ce}\u{1cf}\x07\x67\x02\ - \x02\u{1cf}\x65\x03\x02\x02\x02\u{1d0}\u{1d1}\x07\x68\x02\x02\u{1d1}\u{1d2}\ - \x07\x63\x02\x02\u{1d2}\u{1d3}\x07\x6e\x02\x02\u{1d3}\u{1d4}\x07\x75\x02\ - \x02\u{1d4}\u{1d5}\x07\x67\x02\x02\u{1d5}\x67\x03\x02\x02\x02\u{1d6}\u{1d7}\ - \x07\x70\x02\x02\u{1d7}\u{1d8}\x07\x77\x02\x02\u{1d8}\u{1d9}\x07\x6e\x02\ - \x02\u{1d9}\u{1da}\x07\x6e\x02\x02\u{1da}\x69\x03\x02\x02\x02\u{1db}\u{1df}\ - \x07\x3f\x02\x02\u{1dc}\u{1dd}\x07\x76\x02\x02\u{1dd}\u{1df}\x07\x71\x02\ - \x02\u{1de}\u{1db}\x03\x02\x02\x02\u{1de}\u{1dc}\x03\x02\x02\x02\u{1df}\ - \x6b\x03\x02\x02\x02\u{1e0}\u{1e1}\x07\x3e\x02\x02\u{1e1}\u{1e6}\x07\x3f\ - \x02\x02\u{1e2}\u{1e3}\x07\x6e\x02\x02\u{1e3}\u{1e4}\x07\x76\x02\x02\u{1e4}\ - \u{1e6}\x07\x67\x02\x02\u{1e5}\u{1e0}\x03\x02\x02\x02\u{1e5}\u{1e2}\x03\ - \x02\x02\x02\u{1e6}\x6d\x03\x02\x02\x02\u{1e7}\u{1e8}\x07\x40\x02\x02\u{1e8}\ - \u{1ed}\x07\x3f\x02\x02\u{1e9}\u{1ea}\x07\x69\x02\x02\u{1ea}\u{1eb}\x07\ - \x76\x02\x02\u{1eb}\u{1ed}\x07\x67\x02\x02\u{1ec}\u{1e7}\x03\x02\x02\x02\ - \u{1ec}\u{1e9}\x03\x02\x02\x02\u{1ed}\x6f\x03\x02\x02\x02\u{1ee}\u{1ef}\ - \x07\x3f\x02\x02\u{1ef}\u{1f5}\x07\x3f\x02\x02\u{1f0}\u{1f1}\x07\x6b\x02\ - \x02\u{1f1}\u{1f5}\x07\x75\x02\x02\u{1f2}\u{1f3}\x07\x67\x02\x02\u{1f3}\ - \u{1f5}\x07\x73\x02\x02\u{1f4}\u{1ee}\x03\x02\x02\x02\u{1f4}\u{1f0}\x03\ - \x02\x02\x02\u{1f4}\u{1f2}\x03\x02\x02\x02\u{1f5}\x71\x03\x02\x02\x02\u{1f6}\ - \u{1fa}\x07\x3e\x02\x02\u{1f7}\u{1f8}\x07\x6e\x02\x02\u{1f8}\u{1fa}\x07\ - \x76\x02\x02\u{1f9}\u{1f6}\x03\x02\x02\x02\u{1f9}\u{1f7}\x03\x02\x02\x02\ - \u{1fa}\x73\x03\x02\x02\x02\u{1fb}\u{1ff}\x07\x40\x02\x02\u{1fc}\u{1fd}\ - \x07\x69\x02\x02\u{1fd}\u{1ff}\x07\x76\x02\x02\u{1fe}\u{1fb}\x03\x02\x02\ - \x02\u{1fe}\u{1fc}\x03\x02\x02\x02\u{1ff}\x75\x03\x02\x02\x02\u{200}\u{201}\ - \x07\x23\x02\x02\u{201}\u{206}\x07\x3f\x02\x02\u{202}\u{203}\x07\x70\x02\ - \x02\u{203}\u{204}\x07\x67\x02\x02\u{204}\u{206}\x07\x73\x02\x02\u{205}\ - \u{200}\x03\x02\x02\x02\u{205}\u{202}\x03\x02\x02\x02\u{206}\x77\x03\x02\ - \x02\x02\u{207}\u{208}\x07\x63\x02\x02\u{208}\u{209}\x07\x70\x02\x02\u{209}\ - \u{20d}\x07\x66\x02\x02\u{20a}\u{20b}\x07\x28\x02\x02\u{20b}\u{20d}\x07\ - \x28\x02\x02\u{20c}\u{207}\x03\x02\x02\x02\u{20c}\u{20a}\x03\x02\x02\x02\ - \u{20d}\x79\x03\x02\x02\x02\u{20e}\u{20f}\x07\x71\x02\x02\u{20f}\u{213}\ - \x07\x74\x02\x02\u{210}\u{211}\x07\x7e\x02\x02\u{211}\u{213}\x07\x7e\x02\ - \x02\u{212}\u{20e}\x03\x02\x02\x02\u{212}\u{210}\x03\x02\x02\x02\u{213}\ - \x7b\x03\x02\x02\x02\u{214}\u{215}\x07\x7a\x02\x02\u{215}\u{216}\x07\x71\ - \x02\x02\u{216}\u{219}\x07\x74\x02\x02\u{217}\u{219}\x07\x60\x02\x02\u{218}\ - \u{214}\x03\x02\x02\x02\u{218}\u{217}\x03\x02\x02\x02\u{219}\x7d\x03\x02\ - \x02\x02\u{21a}\u{21b}\x07\x70\x02\x02\u{21b}\u{21c}\x07\x71\x02\x02\u{21c}\ - \u{21f}\x07\x76\x02\x02\u{21d}\u{21f}\x07\x23\x02\x02\u{21e}\u{21a}\x03\ - \x02\x02\x02\u{21e}\u{21d}\x03\x02\x02\x02\u{21f}\x7f\x03\x02\x02\x02\u{220}\ - \u{221}\x07\x2d\x02\x02\u{221}\u{222}\x07\x3f\x02\x02\u{222}\u{81}\x03\ - \x02\x02\x02\u{223}\u{224}\x07\x2f\x02\x02\u{224}\u{225}\x07\x3f\x02\x02\ - \u{225}\u{83}\x03\x02\x02\x02\u{226}\u{227}\x07\x2c\x02\x02\u{227}\u{228}\ - \x07\x3f\x02\x02\u{228}\u{85}\x03\x02\x02\x02\u{229}\u{22a}\x07\x27\x02\ - \x02\u{22a}\u{22b}\x07\x3f\x02\x02\u{22b}\u{87}\x03\x02\x02\x02\u{22c}\ - \u{22d}\x07\x31\x02\x02\u{22d}\u{22e}\x07\x3f\x02\x02\u{22e}\u{89}\x03\ - \x02\x02\x02\u{22f}\u{230}\x07\x2d\x02\x02\u{230}\u{8b}\x03\x02\x02\x02\ - \u{231}\u{232}\x07\x2f\x02\x02\u{232}\u{8d}\x03\x02\x02\x02\u{233}\u{234}\ - \x07\x2c\x02\x02\u{234}\u{8f}\x03\x02\x02\x02\u{235}\u{236}\x07\x31\x02\ - \x02\u{236}\u{91}\x03\x02\x02\x02\u{237}\u{238}\x07\x27\x02\x02\u{238}\ - \u{93}\x03\x02\x02\x02\u{239}\u{23a}\x07\x2a\x02\x02\u{23a}\u{95}\x03\x02\ - \x02\x02\u{23b}\u{23c}\x07\x2b\x02\x02\u{23c}\u{97}\x03\x02\x02\x02\u{23d}\ - \u{23e}\x07\x2e\x02\x02\u{23e}\u{99}\x03\x02\x02\x02\u{23f}\u{240}\x07\ - \x63\x02\x02\u{240}\u{241}\x07\x75\x02\x02\u{241}\u{9b}\x03\x02\x02\x02\ - \u{242}\u{243}\x07\x75\x02\x02\u{243}\u{244}\x07\x76\x02\x02\u{244}\u{245}\ - \x07\x74\x02\x02\u{245}\u{246}\x07\x6b\x02\x02\u{246}\u{247}\x07\x70\x02\ - \x02\u{247}\u{248}\x07\x69\x02\x02\u{248}\u{249}\x03\x02\x02\x02\u{249}\ - \u{24a}\x08\x49\x16\x02\u{24a}\u{9d}\x03\x02\x02\x02\u{24b}\u{24c}\x07\ - \x70\x02\x02\u{24c}\u{24d}\x07\x77\x02\x02\u{24d}\u{24e}\x07\x6f\x02\x02\ - \u{24e}\u{24f}\x07\x64\x02\x02\u{24f}\u{250}\x07\x67\x02\x02\u{250}\u{251}\ - \x07\x74\x02\x02\u{251}\u{252}\x03\x02\x02\x02\u{252}\u{253}\x08\x4a\x16\ - \x02\u{253}\u{9f}\x03\x02\x02\x02\u{254}\u{255}\x07\x64\x02\x02\u{255}\ - \u{256}\x07\x71\x02\x02\u{256}\u{257}\x07\x71\x02\x02\u{257}\u{258}\x07\ - \x6e\x02\x02\u{258}\u{259}\x03\x02\x02\x02\u{259}\u{25a}\x08\x4b\x16\x02\ - \u{25a}\u{a1}\x03\x02\x02\x02\u{25b}\u{261}\x07\x24\x02\x02\u{25c}\u{260}\ - \x0a\x0a\x02\x02\u{25d}\u{25e}\x07\x5e\x02\x02\u{25e}\u{260}\x09\x0b\x02\ - \x02\u{25f}\u{25c}\x03\x02\x02\x02\u{25f}\u{25d}\x03\x02\x02\x02\u{260}\ - \u{263}\x03\x02\x02\x02\u{261}\u{25f}\x03\x02\x02\x02\u{261}\u{262}\x03\ - \x02\x02\x02\u{262}\u{264}\x03\x02\x02\x02\u{263}\u{261}\x03\x02\x02\x02\ - \u{264}\u{265}\x07\x24\x02\x02\u{265}\u{a3}\x03\x02\x02\x02\u{266}\u{267}\ - \x05\x14\x05\x02\u{267}\u{a5}\x03\x02\x02\x02\u{268}\u{269}\x07\x7f\x02\ - \x02\u{269}\u{26a}\x03\x02\x02\x02\u{26a}\u{26b}\x08\x4e\x09\x02\u{26b}\ - \u{a7}\x03\x02\x02\x02\u{26c}\u{26d}\x07\x40\x02\x02\u{26d}\u{26e}\x07\ - \x40\x02\x02\u{26e}\u{26f}\x03\x02\x02\x02\u{26f}\u{270}\x08\x4f\x17\x02\ - \u{270}\u{271}\x08\x4f\x09\x02\u{271}\u{272}\x08\x4f\x09\x02\u{272}\u{a9}\ - \x03\x02\x02\x02\u{273}\u{274}\x07\x26\x02\x02\u{274}\u{275}\x05\x14\x05\ - \x02\u{275}\u{ab}\x03\x02\x02\x02\u{276}\u{277}\x07\x30\x02\x02\u{277}\ - \u{ad}\x03\x02\x02\x02\u{278}\u{27e}\x05\u{b0}\x53\x02\u{279}\u{27a}\x05\ - \u{b0}\x53\x02\u{27a}\u{27b}\x07\x30\x02\x02\u{27b}\u{27c}\x05\u{b0}\x53\ - \x02\u{27c}\u{27e}\x03\x02\x02\x02\u{27d}\u{278}\x03\x02\x02\x02\u{27d}\ - \u{279}\x03\x02\x02\x02\u{27e}\u{af}\x03\x02\x02\x02\u{27f}\u{281}\x05\ - \u{b2}\x54\x02\u{280}\u{27f}\x03\x02\x02\x02\u{281}\u{282}\x03\x02\x02\ - \x02\u{282}\u{280}\x03\x02\x02\x02\u{282}\u{283}\x03\x02\x02\x02\u{283}\ - \u{b1}\x03\x02\x02\x02\u{284}\u{285}\x09\x0c\x02\x02\u{285}\u{b3}\x03\x02\ - \x02\x02\u{286}\u{287}\x05\x0e\x02\x02\u{287}\u{288}\x03\x02\x02\x02\u{288}\ - \u{289}\x08\x55\x02\x02\u{289}\u{b5}\x03\x02\x02\x02\u{28a}\u{28b}\x07\ - \x6b\x02\x02\u{28b}\u{28c}\x07\x68\x02\x02\u{28c}\u{28d}\x03\x02\x02\x02\ - \u{28d}\u{28e}\x09\x0d\x02\x02\u{28e}\u{28f}\x03\x02\x02\x02\u{28f}\u{290}\ - \x08\x56\x0f\x02\u{290}\u{b7}\x03\x02\x02\x02\u{291}\u{292}\x07\x67\x02\ - \x02\u{292}\u{293}\x07\x6e\x02\x02\u{293}\u{294}\x07\x75\x02\x02\u{294}\ - \u{295}\x07\x67\x02\x02\u{295}\u{296}\x07\x6b\x02\x02\u{296}\u{297}\x07\ - \x68\x02\x02\u{297}\u{298}\x03\x02\x02\x02\u{298}\u{299}\x09\x0d\x02\x02\ - \u{299}\u{29a}\x03\x02\x02\x02\u{29a}\u{29b}\x08\x57\x0f\x02\u{29b}\u{b9}\ - \x03\x02\x02\x02\u{29c}\u{29d}\x07\x67\x02\x02\u{29d}\u{29e}\x07\x6e\x02\ - \x02\u{29e}\u{29f}\x07\x75\x02\x02\u{29f}\u{2a0}\x07\x67\x02\x02\u{2a0}\ - \u{2a2}\x03\x02\x02\x02\u{2a1}\u{2a3}\x09\x0d\x02\x02\u{2a2}\u{2a1}\x03\ - \x02\x02\x02\u{2a2}\u{2a3}\x03\x02\x02\x02\u{2a3}\u{bb}\x03\x02\x02\x02\ - \u{2a4}\u{2a5}\x07\x75\x02\x02\u{2a5}\u{2a6}\x07\x67\x02\x02\u{2a6}\u{2a7}\ - \x07\x76\x02\x02\u{2a7}\u{2a8}\x03\x02\x02\x02\u{2a8}\u{2a9}\x09\x0d\x02\ - \x02\u{2a9}\u{2aa}\x03\x02\x02\x02\u{2aa}\u{2ab}\x08\x59\x0f\x02\u{2ab}\ - \u{bd}\x03\x02\x02\x02\u{2ac}\u{2ad}\x07\x67\x02\x02\u{2ad}\u{2ae}\x07\ - \x70\x02\x02\u{2ae}\u{2af}\x07\x66\x02\x02\u{2af}\u{2b0}\x07\x6b\x02\x02\ - \u{2b0}\u{2b1}\x07\x68\x02\x02\u{2b1}\u{bf}\x03\x02\x02\x02\u{2b2}\u{2b3}\ - \x07\x65\x02\x02\u{2b3}\u{2b4}\x07\x63\x02\x02\u{2b4}\u{2b5}\x07\x6e\x02\ - \x02\u{2b5}\u{2b6}\x07\x6e\x02\x02\u{2b6}\u{2b7}\x03\x02\x02\x02\u{2b7}\ - \u{2b8}\x09\x0d\x02\x02\u{2b8}\u{2b9}\x03\x02\x02\x02\u{2b9}\u{2ba}\x08\ - \x5b\x0f\x02\u{2ba}\u{c1}\x03\x02\x02\x02\u{2bb}\u{2bc}\x07\x66\x02\x02\ - \u{2bc}\u{2bd}\x07\x67\x02\x02\u{2bd}\u{2be}\x07\x65\x02\x02\u{2be}\u{2bf}\ - \x07\x6e\x02\x02\u{2bf}\u{2c0}\x07\x63\x02\x02\u{2c0}\u{2c1}\x07\x74\x02\ - \x02\u{2c1}\u{2c2}\x07\x67\x02\x02\u{2c2}\u{2c3}\x03\x02\x02\x02\u{2c3}\ - \u{2c4}\x09\x0d\x02\x02\u{2c4}\u{2c5}\x03\x02\x02\x02\u{2c5}\u{2c6}\x08\ - \x5c\x0f\x02\u{2c6}\u{c3}\x03\x02\x02\x02\u{2c7}\u{2c8}\x07\x6c\x02\x02\ - \u{2c8}\u{2c9}\x07\x77\x02\x02\u{2c9}\u{2ca}\x07\x6f\x02\x02\u{2ca}\u{2cb}\ - \x07\x72\x02\x02\u{2cb}\u{2cc}\x03\x02\x02\x02\u{2cc}\u{2cd}\x09\x0d\x02\ - \x02\u{2cd}\u{2ce}\x03\x02\x02\x02\u{2ce}\u{2cf}\x08\x5d\x18\x02\u{2cf}\ - \u{c5}\x03\x02\x02\x02\u{2d0}\u{2d1}\x07\x67\x02\x02\u{2d1}\u{2d2}\x07\ - \x70\x02\x02\u{2d2}\u{2d3}\x07\x77\x02\x02\u{2d3}\u{2d4}\x07\x6f\x02\x02\ + \x03\x02\x02\x02\x0a\u{d0}\x03\x02\x02\x02\x0a\u{d2}\x03\x02\x02\x02\x0a\ + \u{d4}\x03\x02\x02\x02\x0a\u{d6}\x03\x02\x02\x02\x0b\u{d8}\x03\x02\x02\ + \x02\x0b\u{da}\x03\x02\x02\x02\x0b\u{dc}\x03\x02\x02\x02\x0b\u{de}\x03\ + \x02\x02\x02\x0c\u{e0}\x03\x02\x02\x02\x0c\u{e2}\x03\x02\x02\x02\x0c\u{e4}\ + \x03\x02\x02\x02\x0d\u{e6}\x03\x02\x02\x02\x0d\u{e8}\x03\x02\x02\x02\x0d\ + \u{ea}\x03\x02\x02\x02\x0e\u{ed}\x03\x02\x02\x02\x10\u{f3}\x03\x02\x02\ + \x02\x12\u{103}\x03\x02\x02\x02\x14\u{10d}\x03\x02\x02\x02\x16\u{112}\x03\ + \x02\x02\x02\x18\u{116}\x03\x02\x02\x02\x1a\u{119}\x03\x02\x02\x02\x1c\ + \u{11d}\x03\x02\x02\x02\x1e\u{123}\x03\x02\x02\x02\x20\u{12c}\x03\x02\x02\ + \x02\x22\u{131}\x03\x02\x02\x02\x24\u{135}\x03\x02\x02\x02\x26\u{13b}\x03\ + \x02\x02\x02\x28\u{13f}\x03\x02\x02\x02\x2a\u{144}\x03\x02\x02\x02\x2c\ + \u{149}\x03\x02\x02\x02\x2e\u{14f}\x03\x02\x02\x02\x30\u{152}\x03\x02\x02\ + \x02\x32\u{157}\x03\x02\x02\x02\x34\u{15d}\x03\x02\x02\x02\x36\u{162}\x03\ + \x02\x02\x02\x38\u{168}\x03\x02\x02\x02\x3a\u{16e}\x03\x02\x02\x02\x3c\ + \u{173}\x03\x02\x02\x02\x3e\u{17c}\x03\x02\x02\x02\x40\u{180}\x03\x02\x02\ + \x02\x42\u{185}\x03\x02\x02\x02\x44\u{18b}\x03\x02\x02\x02\x46\u{190}\x03\ + \x02\x02\x02\x48\u{197}\x03\x02\x02\x02\x4a\u{1a1}\x03\x02\x02\x02\x4c\ + \u{1a3}\x03\x02\x02\x02\x4e\u{1a5}\x03\x02\x02\x02\x50\u{1aa}\x03\x02\x02\ + \x02\x52\u{1ae}\x03\x02\x02\x02\x54\u{1b2}\x03\x02\x02\x02\x56\u{1b6}\x03\ + \x02\x02\x02\x58\u{1bc}\x03\x02\x02\x02\x5a\u{1c1}\x03\x02\x02\x02\x5c\ + \u{1c6}\x03\x02\x02\x02\x5e\u{1c8}\x03\x02\x02\x02\x60\u{1cc}\x03\x02\x02\ + \x02\x62\u{1d1}\x03\x02\x02\x02\x64\u{1d7}\x03\x02\x02\x02\x66\u{1db}\x03\ + \x02\x02\x02\x68\u{1e0}\x03\x02\x02\x02\x6a\u{1e6}\x03\x02\x02\x02\x6c\ + \u{1ee}\x03\x02\x02\x02\x6e\u{1f5}\x03\x02\x02\x02\x70\u{1fc}\x03\x02\x02\ + \x02\x72\u{204}\x03\x02\x02\x02\x74\u{209}\x03\x02\x02\x02\x76\u{20e}\x03\ + \x02\x02\x02\x78\u{215}\x03\x02\x02\x02\x7a\u{21c}\x03\x02\x02\x02\x7c\ + \u{222}\x03\x02\x02\x02\x7e\u{228}\x03\x02\x02\x02\u{80}\u{22e}\x03\x02\ + \x02\x02\u{82}\u{230}\x03\x02\x02\x02\u{84}\u{233}\x03\x02\x02\x02\u{86}\ + \u{236}\x03\x02\x02\x02\u{88}\u{239}\x03\x02\x02\x02\u{8a}\u{23c}\x03\x02\ + \x02\x02\u{8c}\u{23f}\x03\x02\x02\x02\u{8e}\u{241}\x03\x02\x02\x02\u{90}\ + \u{243}\x03\x02\x02\x02\u{92}\u{245}\x03\x02\x02\x02\u{94}\u{247}\x03\x02\ + \x02\x02\u{96}\u{249}\x03\x02\x02\x02\u{98}\u{24b}\x03\x02\x02\x02\u{9a}\ + \u{24d}\x03\x02\x02\x02\u{9c}\u{24f}\x03\x02\x02\x02\u{9e}\u{252}\x03\x02\ + \x02\x02\u{a0}\u{25b}\x03\x02\x02\x02\u{a2}\u{264}\x03\x02\x02\x02\u{a4}\ + \u{26b}\x03\x02\x02\x02\u{a6}\u{276}\x03\x02\x02\x02\u{a8}\u{278}\x03\x02\ + \x02\x02\u{aa}\u{27c}\x03\x02\x02\x02\u{ac}\u{283}\x03\x02\x02\x02\u{ae}\ + \u{286}\x03\x02\x02\x02\u{b0}\u{28d}\x03\x02\x02\x02\u{b2}\u{290}\x03\x02\ + \x02\x02\u{b4}\u{294}\x03\x02\x02\x02\u{b6}\u{296}\x03\x02\x02\x02\u{b8}\ + \u{298}\x03\x02\x02\x02\u{ba}\u{29c}\x03\x02\x02\x02\u{bc}\u{2a3}\x03\x02\ + \x02\x02\u{be}\u{2ae}\x03\x02\x02\x02\u{c0}\u{2b6}\x03\x02\x02\x02\u{c2}\ + \u{2be}\x03\x02\x02\x02\u{c4}\u{2c4}\x03\x02\x02\x02\u{c6}\u{2cd}\x03\x02\ + \x02\x02\u{c8}\u{2d9}\x03\x02\x02\x02\u{ca}\u{2e2}\x03\x02\x02\x02\u{cc}\ + \u{2eb}\x03\x02\x02\x02\u{ce}\u{2f4}\x03\x02\x02\x02\u{d0}\u{2ff}\x03\x02\ + \x02\x02\u{d2}\u{307}\x03\x02\x02\x02\u{d4}\u{30c}\x03\x02\x02\x02\u{d6}\ + \u{312}\x03\x02\x02\x02\u{d8}\u{317}\x03\x02\x02\x02\u{da}\u{319}\x03\x02\ + \x02\x02\u{dc}\u{31e}\x03\x02\x02\x02\u{de}\u{323}\x03\x02\x02\x02\u{e0}\ + \u{327}\x03\x02\x02\x02\u{e2}\u{329}\x03\x02\x02\x02\u{e4}\u{32e}\x03\x02\ + \x02\x02\u{e6}\u{334}\x03\x02\x02\x02\u{e8}\u{339}\x03\x02\x02\x02\u{ea}\ + \u{33e}\x03\x02\x02\x02\u{ec}\u{ee}\x09\x02\x02\x02\u{ed}\u{ec}\x03\x02\ + \x02\x02\u{ee}\u{ef}\x03\x02\x02\x02\u{ef}\u{ed}\x03\x02\x02\x02\u{ef}\ + \u{f0}\x03\x02\x02\x02\u{f0}\u{f1}\x03\x02\x02\x02\u{f1}\u{f2}\x08\x02\ + \x02\x02\u{f2}\x0f\x03\x02\x02\x02\u{f3}\u{f4}\x07\x31\x02\x02\u{f4}\u{f5}\ + \x07\x31\x02\x02\u{f5}\u{f9}\x03\x02\x02\x02\u{f6}\u{f8}\x0a\x03\x02\x02\ + \u{f7}\u{f6}\x03\x02\x02\x02\u{f8}\u{fb}\x03\x02\x02\x02\u{f9}\u{f7}\x03\ + \x02\x02\x02\u{f9}\u{fa}\x03\x02\x02\x02\u{fa}\u{fc}\x03\x02\x02\x02\u{fb}\ + \u{f9}\x03\x02\x02\x02\u{fc}\u{fd}\x08\x03\x03\x02\u{fd}\x11\x03\x02\x02\ + \x02\u{fe}\u{100}\x07\x0f\x02\x02\u{ff}\u{fe}\x03\x02\x02\x02\u{ff}\u{100}\ + \x03\x02\x02\x02\u{100}\u{101}\x03\x02\x02\x02\u{101}\u{104}\x07\x0c\x02\ + \x02\u{102}\u{104}\x07\x0f\x02\x02\u{103}\u{ff}\x03\x02\x02\x02\u{103}\ + \u{102}\x03\x02\x02\x02\u{104}\u{108}\x03\x02\x02\x02\u{105}\u{107}\x09\ + \x02\x02\x02\u{106}\u{105}\x03\x02\x02\x02\u{107}\u{10a}\x03\x02\x02\x02\ + \u{108}\u{106}\x03\x02\x02\x02\u{108}\u{109}\x03\x02\x02\x02\u{109}\u{10b}\ + \x03\x02\x02\x02\u{10a}\u{108}\x03\x02\x02\x02\u{10b}\u{10c}\x08\x04\x04\ + \x02\u{10c}\x13\x03\x02\x02\x02\u{10d}\u{10f}\x05\x16\x06\x02\u{10e}\u{110}\ + \x05\x1a\x08\x02\u{10f}\u{10e}\x03\x02\x02\x02\u{10f}\u{110}\x03\x02\x02\ + \x02\u{110}\x15\x03\x02\x02\x02\u{111}\u{113}\x09\x0f\x02\x02\u{112}\u{111}\ + \x03\x02\x02\x02\u{113}\x17\x03\x02\x02\x02\u{114}\u{117}\x09\x04\x02\x02\ + \u{115}\u{117}\x05\x16\x06\x02\u{116}\u{114}\x03\x02\x02\x02\u{116}\u{115}\ + \x03\x02\x02\x02\u{117}\x19\x03\x02\x02\x02\u{118}\u{11a}\x05\x18\x07\x02\ + \u{119}\u{118}\x03\x02\x02\x02\u{11a}\u{11b}\x03\x02\x02\x02\u{11b}\u{119}\ + \x03\x02\x02\x02\u{11b}\u{11c}\x03\x02\x02\x02\u{11c}\x1b\x03\x02\x02\x02\ + \u{11d}\u{11e}\x07\x2f\x02\x02\u{11e}\u{11f}\x07\x2f\x02\x02\u{11f}\u{120}\ + \x07\x2f\x02\x02\u{120}\u{121}\x03\x02\x02\x02\u{121}\u{122}\x08\x09\x05\ + \x02\u{122}\x1d\x03\x02\x02\x02\u{123}\u{127}\x07\x3c\x02\x02\u{124}\u{126}\ + \x09\x05\x02\x02\u{125}\u{124}\x03\x02\x02\x02\u{126}\u{129}\x03\x02\x02\ + \x02\u{127}\u{125}\x03\x02\x02\x02\u{127}\u{128}\x03\x02\x02\x02\u{128}\ + \u{12a}\x03\x02\x02\x02\u{129}\u{127}\x03\x02\x02\x02\u{12a}\u{12b}\x08\ + \x0a\x06\x02\u{12b}\x1f\x03\x02\x02\x02\u{12c}\u{12d}\x07\x25\x02\x02\u{12d}\ + \u{12e}\x03\x02\x02\x02\u{12e}\u{12f}\x08\x0b\x07\x02\u{12f}\x21\x03\x02\ + \x02\x02\u{130}\u{132}\x0a\x03\x02\x02\u{131}\u{130}\x03\x02\x02\x02\u{132}\ + \u{133}\x03\x02\x02\x02\u{133}\u{131}\x03\x02\x02\x02\u{133}\u{134}\x03\ + \x02\x02\x02\u{134}\x23\x03\x02\x02\x02\u{135}\u{136}\x05\x12\x04\x02\u{136}\ + \u{137}\x03\x02\x02\x02\u{137}\u{138}\x08\x0d\x08\x02\u{138}\u{139}\x08\ + \x0d\x04\x02\u{139}\u{13a}\x08\x0d\x09\x02\u{13a}\x25\x03\x02\x02\x02\u{13b}\ + \u{13c}\x05\x0e\x02\x02\u{13c}\u{13d}\x03\x02\x02\x02\u{13d}\u{13e}\x08\ + \x0e\x02\x02\u{13e}\x27\x03\x02\x02\x02\u{13f}\u{140}\x05\x12\x04\x02\u{140}\ + \u{141}\x03\x02\x02\x02\u{141}\u{142}\x08\x0f\x08\x02\u{142}\u{143}\x08\ + \x0f\x04\x02\u{143}\x29\x03\x02\x02\x02\u{144}\u{145}\x05\x10\x03\x02\u{145}\ + \u{146}\x03\x02\x02\x02\u{146}\u{147}\x08\x10\x0a\x02\u{147}\u{148}\x08\ + \x10\x03\x02\u{148}\x2b\x03\x02\x02\x02\u{149}\u{14a}\x07\x3f\x02\x02\u{14a}\ + \u{14b}\x07\x3f\x02\x02\u{14b}\u{14c}\x07\x3f\x02\x02\u{14c}\u{14d}\x03\ + \x02\x02\x02\u{14d}\u{14e}\x08\x11\x09\x02\u{14e}\x2d\x03\x02\x02\x02\u{14f}\ + \u{150}\x07\x2f\x02\x02\u{150}\u{151}\x07\x40\x02\x02\u{151}\x2f\x03\x02\ + \x02\x02\u{152}\u{153}\x07\x3e\x02\x02\u{153}\u{154}\x07\x3e\x02\x02\u{154}\ + \u{155}\x03\x02\x02\x02\u{155}\u{156}\x08\x13\x0b\x02\u{156}\x31\x03\x02\ + \x02\x02\u{157}\u{158}\x07\x25\x02\x02\u{158}\u{159}\x03\x02\x02\x02\u{159}\ + \u{15a}\x08\x14\x0c\x02\u{15a}\u{15b}\x08\x14\x0d\x02\u{15b}\u{15c}\x08\ + \x14\x07\x02\u{15c}\x33\x03\x02\x02\x02\u{15d}\u{15e}\x07\x7d\x02\x02\u{15e}\ + \u{15f}\x03\x02\x02\x02\u{15f}\u{160}\x08\x15\x0e\x02\u{160}\u{161}\x08\ + \x15\x0f\x02\u{161}\x35\x03\x02\x02\x02\u{162}\u{163}\x07\x5e\x02\x02\u{163}\ + \u{164}\x07\x5d\x02\x02\u{164}\u{165}\x03\x02\x02\x02\u{165}\u{166}\x08\ + \x16\x10\x02\u{166}\u{167}\x08\x16\x0e\x02\u{167}\x37\x03\x02\x02\x02\u{168}\ + \u{169}\x07\x5e\x02\x02\u{169}\u{16a}\x03\x02\x02\x02\u{16a}\u{16b}\x08\ + \x17\x02\x02\u{16b}\u{16c}\x08\x17\x0e\x02\u{16c}\u{16d}\x08\x17\x11\x02\ + \u{16d}\x39\x03\x02\x02\x02\u{16e}\u{16f}\x0b\x02\x02\x02\u{16f}\u{170}\ + \x03\x02\x02\x02\u{170}\u{171}\x08\x18\x10\x02\u{171}\u{172}\x08\x18\x0e\ + \x02\u{172}\x3b\x03\x02\x02\x02\u{173}\u{174}\x05\x12\x04\x02\u{174}\u{175}\ + \x03\x02\x02\x02\u{175}\u{176}\x08\x19\x08\x02\u{176}\u{177}\x08\x19\x09\ + \x02\u{177}\x3d\x03\x02\x02\x02\u{178}\u{179}\x07\x5e\x02\x02\u{179}\u{17d}\ + \x07\x5d\x02\x02\u{17a}\u{17b}\x07\x5e\x02\x02\u{17b}\u{17d}\x07\x5f\x02\ + \x02\u{17c}\u{178}\x03\x02\x02\x02\u{17c}\u{17a}\x03\x02\x02\x02\u{17d}\ + \u{17e}\x03\x02\x02\x02\u{17e}\u{17f}\x08\x1a\x10\x02\u{17f}\x3f\x03\x02\ + \x02\x02\u{180}\u{181}\x07\x5e\x02\x02\u{181}\u{182}\x03\x02\x02\x02\u{182}\ + \u{183}\x08\x1b\x12\x02\u{183}\u{184}\x08\x1b\x11\x02\u{184}\x41\x03\x02\ + \x02\x02\u{185}\u{186}\x05\x20\x0b\x02\u{186}\u{187}\x03\x02\x02\x02\u{187}\ + \u{188}\x08\x1c\x0c\x02\u{188}\u{189}\x08\x1c\x13\x02\u{189}\u{18a}\x08\ + \x1c\x07\x02\u{18a}\x43\x03\x02\x02\x02\u{18b}\u{18c}\x07\x7d\x02\x02\u{18c}\ + \u{18d}\x03\x02\x02\x02\u{18d}\u{18e}\x08\x1d\x14\x02\u{18e}\u{18f}\x08\ + \x1d\x0f\x02\u{18f}\x45\x03\x02\x02\x02\u{190}\u{191}\x07\x3e\x02\x02\u{191}\ + \u{192}\x07\x3e\x02\x02\u{192}\u{193}\x03\x02\x02\x02\u{193}\u{194}\x08\ + \x1e\x15\x02\u{194}\u{195}\x08\x1e\x13\x02\u{195}\u{196}\x08\x1e\x0b\x02\ + \u{196}\x47\x03\x02\x02\x02\u{197}\u{198}\x05\x10\x03\x02\u{198}\u{199}\ + \x03\x02\x02\x02\u{199}\u{19a}\x08\x1f\x03\x02\u{19a}\x49\x03\x02\x02\x02\ + \u{19b}\u{19d}\x05\x4c\x21\x02\u{19c}\u{19b}\x03\x02\x02\x02\u{19d}\u{19e}\ + \x03\x02\x02\x02\u{19e}\u{19c}\x03\x02\x02\x02\u{19e}\u{19f}\x03\x02\x02\ + \x02\u{19f}\u{1a2}\x03\x02\x02\x02\u{1a0}\u{1a2}\x09\x06\x02\x02\u{1a1}\ + \u{19c}\x03\x02\x02\x02\u{1a1}\u{1a0}\x03\x02\x02\x02\u{1a2}\x4b\x03\x02\ + \x02\x02\u{1a3}\u{1a4}\x0a\x07\x02\x02\u{1a4}\x4d\x03\x02\x02\x02\u{1a5}\ + \u{1a6}\x09\x08\x02\x02\u{1a6}\u{1a7}\x03\x02\x02\x02\u{1a7}\u{1a8}\x08\ + \x22\x10\x02\u{1a8}\u{1a9}\x08\x22\x09\x02\u{1a9}\x4f\x03\x02\x02\x02\u{1aa}\ + \u{1ab}\x0b\x02\x02\x02\u{1ab}\u{1ac}\x03\x02\x02\x02\u{1ac}\u{1ad}\x08\ + \x23\x09\x02\u{1ad}\x51\x03\x02\x02\x02\u{1ae}\u{1af}\x05\x0e\x02\x02\u{1af}\ + \u{1b0}\x03\x02\x02\x02\u{1b0}\u{1b1}\x08\x24\x02\x02\u{1b1}\x53\x03\x02\ + \x02\x02\u{1b2}\u{1b3}\x05\x10\x03\x02\u{1b3}\u{1b4}\x03\x02\x02\x02\u{1b4}\ + \u{1b5}\x08\x25\x03\x02\u{1b5}\x55\x03\x02\x02\x02\u{1b6}\u{1b7}\x07\x3e\ + \x02\x02\u{1b7}\u{1b8}\x07\x3e\x02\x02\u{1b8}\u{1b9}\x03\x02\x02\x02\u{1b9}\ + \u{1ba}\x08\x26\x15\x02\u{1ba}\u{1bb}\x08\x26\x0b\x02\u{1bb}\x57\x03\x02\ + \x02\x02\u{1bc}\u{1bd}\x07\x25\x02\x02\u{1bd}\u{1be}\x03\x02\x02\x02\u{1be}\ + \u{1bf}\x08\x27\x0c\x02\u{1bf}\u{1c0}\x08\x27\x07\x02\u{1c0}\x59\x03\x02\ + \x02\x02\u{1c1}\u{1c2}\x05\x12\x04\x02\u{1c2}\u{1c3}\x03\x02\x02\x02\u{1c3}\ + \u{1c4}\x08\x28\x08\x02\u{1c4}\u{1c5}\x08\x28\x09\x02\u{1c5}\x5b\x03\x02\ + \x02\x02\u{1c6}\u{1c7}\x0b\x02\x02\x02\u{1c7}\x5d\x03\x02\x02\x02\u{1c8}\ + \u{1c9}\x05\x0e\x02\x02\u{1c9}\u{1ca}\x03\x02\x02\x02\u{1ca}\u{1cb}\x08\ + \x2a\x02\x02\u{1cb}\x5f\x03\x02\x02\x02\u{1cc}\u{1cd}\x05\x20\x0b\x02\u{1cd}\ + \u{1ce}\x03\x02\x02\x02\u{1ce}\u{1cf}\x08\x2b\x0c\x02\u{1cf}\x61\x03\x02\ + \x02\x02\u{1d0}\u{1d2}\x0a\x09\x02\x02\u{1d1}\u{1d0}\x03\x02\x02\x02\u{1d2}\ + \u{1d3}\x03\x02\x02\x02\u{1d3}\u{1d1}\x03\x02\x02\x02\u{1d3}\u{1d4}\x03\ + \x02\x02\x02\u{1d4}\u{1d5}\x03\x02\x02\x02\u{1d5}\u{1d6}\x08\x2c\x09\x02\ + \u{1d6}\x63\x03\x02\x02\x02\u{1d7}\u{1d8}\x05\x0e\x02\x02\u{1d8}\u{1d9}\ + \x03\x02\x02\x02\u{1d9}\u{1da}\x08\x2d\x02\x02\u{1da}\x65\x03\x02\x02\x02\ + \u{1db}\u{1dc}\x07\x76\x02\x02\u{1dc}\u{1dd}\x07\x74\x02\x02\u{1dd}\u{1de}\ + \x07\x77\x02\x02\u{1de}\u{1df}\x07\x67\x02\x02\u{1df}\x67\x03\x02\x02\x02\ + \u{1e0}\u{1e1}\x07\x68\x02\x02\u{1e1}\u{1e2}\x07\x63\x02\x02\u{1e2}\u{1e3}\ + \x07\x6e\x02\x02\u{1e3}\u{1e4}\x07\x75\x02\x02\u{1e4}\u{1e5}\x07\x67\x02\ + \x02\u{1e5}\x69\x03\x02\x02\x02\u{1e6}\u{1e7}\x07\x70\x02\x02\u{1e7}\u{1e8}\ + \x07\x77\x02\x02\u{1e8}\u{1e9}\x07\x6e\x02\x02\u{1e9}\u{1ea}\x07\x6e\x02\ + \x02\u{1ea}\x6b\x03\x02\x02\x02\u{1eb}\u{1ef}\x07\x3f\x02\x02\u{1ec}\u{1ed}\ + \x07\x76\x02\x02\u{1ed}\u{1ef}\x07\x71\x02\x02\u{1ee}\u{1eb}\x03\x02\x02\ + \x02\u{1ee}\u{1ec}\x03\x02\x02\x02\u{1ef}\x6d\x03\x02\x02\x02\u{1f0}\u{1f1}\ + \x07\x3e\x02\x02\u{1f1}\u{1f6}\x07\x3f\x02\x02\u{1f2}\u{1f3}\x07\x6e\x02\ + \x02\u{1f3}\u{1f4}\x07\x76\x02\x02\u{1f4}\u{1f6}\x07\x67\x02\x02\u{1f5}\ + \u{1f0}\x03\x02\x02\x02\u{1f5}\u{1f2}\x03\x02\x02\x02\u{1f6}\x6f\x03\x02\ + \x02\x02\u{1f7}\u{1f8}\x07\x40\x02\x02\u{1f8}\u{1fd}\x07\x3f\x02\x02\u{1f9}\ + \u{1fa}\x07\x69\x02\x02\u{1fa}\u{1fb}\x07\x76\x02\x02\u{1fb}\u{1fd}\x07\ + \x67\x02\x02\u{1fc}\u{1f7}\x03\x02\x02\x02\u{1fc}\u{1f9}\x03\x02\x02\x02\ + \u{1fd}\x71\x03\x02\x02\x02\u{1fe}\u{1ff}\x07\x3f\x02\x02\u{1ff}\u{205}\ + \x07\x3f\x02\x02\u{200}\u{201}\x07\x6b\x02\x02\u{201}\u{205}\x07\x75\x02\ + \x02\u{202}\u{203}\x07\x67\x02\x02\u{203}\u{205}\x07\x73\x02\x02\u{204}\ + \u{1fe}\x03\x02\x02\x02\u{204}\u{200}\x03\x02\x02\x02\u{204}\u{202}\x03\ + \x02\x02\x02\u{205}\x73\x03\x02\x02\x02\u{206}\u{20a}\x07\x3e\x02\x02\u{207}\ + \u{208}\x07\x6e\x02\x02\u{208}\u{20a}\x07\x76\x02\x02\u{209}\u{206}\x03\ + \x02\x02\x02\u{209}\u{207}\x03\x02\x02\x02\u{20a}\x75\x03\x02\x02\x02\u{20b}\ + \u{20f}\x07\x40\x02\x02\u{20c}\u{20d}\x07\x69\x02\x02\u{20d}\u{20f}\x07\ + \x76\x02\x02\u{20e}\u{20b}\x03\x02\x02\x02\u{20e}\u{20c}\x03\x02\x02\x02\ + \u{20f}\x77\x03\x02\x02\x02\u{210}\u{211}\x07\x23\x02\x02\u{211}\u{216}\ + \x07\x3f\x02\x02\u{212}\u{213}\x07\x70\x02\x02\u{213}\u{214}\x07\x67\x02\ + \x02\u{214}\u{216}\x07\x73\x02\x02\u{215}\u{210}\x03\x02\x02\x02\u{215}\ + \u{212}\x03\x02\x02\x02\u{216}\x79\x03\x02\x02\x02\u{217}\u{218}\x07\x63\ + \x02\x02\u{218}\u{219}\x07\x70\x02\x02\u{219}\u{21d}\x07\x66\x02\x02\u{21a}\ + \u{21b}\x07\x28\x02\x02\u{21b}\u{21d}\x07\x28\x02\x02\u{21c}\u{217}\x03\ + \x02\x02\x02\u{21c}\u{21a}\x03\x02\x02\x02\u{21d}\x7b\x03\x02\x02\x02\u{21e}\ + \u{21f}\x07\x71\x02\x02\u{21f}\u{223}\x07\x74\x02\x02\u{220}\u{221}\x07\ + \x7e\x02\x02\u{221}\u{223}\x07\x7e\x02\x02\u{222}\u{21e}\x03\x02\x02\x02\ + \u{222}\u{220}\x03\x02\x02\x02\u{223}\x7d\x03\x02\x02\x02\u{224}\u{225}\ + \x07\x7a\x02\x02\u{225}\u{226}\x07\x71\x02\x02\u{226}\u{229}\x07\x74\x02\ + \x02\u{227}\u{229}\x07\x60\x02\x02\u{228}\u{224}\x03\x02\x02\x02\u{228}\ + \u{227}\x03\x02\x02\x02\u{229}\x7f\x03\x02\x02\x02\u{22a}\u{22b}\x07\x70\ + \x02\x02\u{22b}\u{22c}\x07\x71\x02\x02\u{22c}\u{22f}\x07\x76\x02\x02\u{22d}\ + \u{22f}\x07\x23\x02\x02\u{22e}\u{22a}\x03\x02\x02\x02\u{22e}\u{22d}\x03\ + \x02\x02\x02\u{22f}\u{81}\x03\x02\x02\x02\u{230}\u{231}\x07\x2d\x02\x02\ + \u{231}\u{232}\x07\x3f\x02\x02\u{232}\u{83}\x03\x02\x02\x02\u{233}\u{234}\ + \x07\x2f\x02\x02\u{234}\u{235}\x07\x3f\x02\x02\u{235}\u{85}\x03\x02\x02\ + \x02\u{236}\u{237}\x07\x2c\x02\x02\u{237}\u{238}\x07\x3f\x02\x02\u{238}\ + \u{87}\x03\x02\x02\x02\u{239}\u{23a}\x07\x27\x02\x02\u{23a}\u{23b}\x07\ + \x3f\x02\x02\u{23b}\u{89}\x03\x02\x02\x02\u{23c}\u{23d}\x07\x31\x02\x02\ + \u{23d}\u{23e}\x07\x3f\x02\x02\u{23e}\u{8b}\x03\x02\x02\x02\u{23f}\u{240}\ + \x07\x2d\x02\x02\u{240}\u{8d}\x03\x02\x02\x02\u{241}\u{242}\x07\x2f\x02\ + \x02\u{242}\u{8f}\x03\x02\x02\x02\u{243}\u{244}\x07\x2c\x02\x02\u{244}\ + \u{91}\x03\x02\x02\x02\u{245}\u{246}\x07\x31\x02\x02\u{246}\u{93}\x03\x02\ + \x02\x02\u{247}\u{248}\x07\x27\x02\x02\u{248}\u{95}\x03\x02\x02\x02\u{249}\ + \u{24a}\x07\x2a\x02\x02\u{24a}\u{97}\x03\x02\x02\x02\u{24b}\u{24c}\x07\ + \x2b\x02\x02\u{24c}\u{99}\x03\x02\x02\x02\u{24d}\u{24e}\x07\x2e\x02\x02\ + \u{24e}\u{9b}\x03\x02\x02\x02\u{24f}\u{250}\x07\x63\x02\x02\u{250}\u{251}\ + \x07\x75\x02\x02\u{251}\u{9d}\x03\x02\x02\x02\u{252}\u{253}\x07\x75\x02\ + \x02\u{253}\u{254}\x07\x76\x02\x02\u{254}\u{255}\x07\x74\x02\x02\u{255}\ + \u{256}\x07\x6b\x02\x02\u{256}\u{257}\x07\x70\x02\x02\u{257}\u{258}\x07\ + \x69\x02\x02\u{258}\u{259}\x03\x02\x02\x02\u{259}\u{25a}\x08\x4a\x16\x02\ + \u{25a}\u{9f}\x03\x02\x02\x02\u{25b}\u{25c}\x07\x70\x02\x02\u{25c}\u{25d}\ + \x07\x77\x02\x02\u{25d}\u{25e}\x07\x6f\x02\x02\u{25e}\u{25f}\x07\x64\x02\ + \x02\u{25f}\u{260}\x07\x67\x02\x02\u{260}\u{261}\x07\x74\x02\x02\u{261}\ + \u{262}\x03\x02\x02\x02\u{262}\u{263}\x08\x4b\x16\x02\u{263}\u{a1}\x03\ + \x02\x02\x02\u{264}\u{265}\x07\x64\x02\x02\u{265}\u{266}\x07\x71\x02\x02\ + \u{266}\u{267}\x07\x71\x02\x02\u{267}\u{268}\x07\x6e\x02\x02\u{268}\u{269}\ + \x03\x02\x02\x02\u{269}\u{26a}\x08\x4c\x16\x02\u{26a}\u{a3}\x03\x02\x02\ + \x02\u{26b}\u{271}\x07\x24\x02\x02\u{26c}\u{270}\x0a\x0a\x02\x02\u{26d}\ + \u{26e}\x07\x5e\x02\x02\u{26e}\u{270}\x09\x0b\x02\x02\u{26f}\u{26c}\x03\ + \x02\x02\x02\u{26f}\u{26d}\x03\x02\x02\x02\u{270}\u{273}\x03\x02\x02\x02\ + \u{271}\u{26f}\x03\x02\x02\x02\u{271}\u{272}\x03\x02\x02\x02\u{272}\u{274}\ + \x03\x02\x02\x02\u{273}\u{271}\x03\x02\x02\x02\u{274}\u{275}\x07\x24\x02\ + \x02\u{275}\u{a5}\x03\x02\x02\x02\u{276}\u{277}\x05\x14\x05\x02\u{277}\ + \u{a7}\x03\x02\x02\x02\u{278}\u{279}\x07\x7f\x02\x02\u{279}\u{27a}\x03\ + \x02\x02\x02\u{27a}\u{27b}\x08\x4f\x09\x02\u{27b}\u{a9}\x03\x02\x02\x02\ + \u{27c}\u{27d}\x07\x40\x02\x02\u{27d}\u{27e}\x07\x40\x02\x02\u{27e}\u{27f}\ + \x03\x02\x02\x02\u{27f}\u{280}\x08\x50\x17\x02\u{280}\u{281}\x08\x50\x09\ + \x02\u{281}\u{282}\x08\x50\x09\x02\u{282}\u{ab}\x03\x02\x02\x02\u{283}\ + \u{284}\x07\x26\x02\x02\u{284}\u{285}\x05\x14\x05\x02\u{285}\u{ad}\x03\ + \x02\x02\x02\u{286}\u{287}\x07\x30\x02\x02\u{287}\u{af}\x03\x02\x02\x02\ + \u{288}\u{28e}\x05\u{b2}\x54\x02\u{289}\u{28a}\x05\u{b2}\x54\x02\u{28a}\ + \u{28b}\x07\x30\x02\x02\u{28b}\u{28c}\x05\u{b2}\x54\x02\u{28c}\u{28e}\x03\ + \x02\x02\x02\u{28d}\u{288}\x03\x02\x02\x02\u{28d}\u{289}\x03\x02\x02\x02\ + \u{28e}\u{b1}\x03\x02\x02\x02\u{28f}\u{291}\x05\u{b4}\x55\x02\u{290}\u{28f}\ + \x03\x02\x02\x02\u{291}\u{292}\x03\x02\x02\x02\u{292}\u{290}\x03\x02\x02\ + \x02\u{292}\u{293}\x03\x02\x02\x02\u{293}\u{b3}\x03\x02\x02\x02\u{294}\ + \u{295}\x09\x0c\x02\x02\u{295}\u{b5}\x03\x02\x02\x02\u{296}\u{297}\x05\ + \x12\x04\x02\u{297}\u{b7}\x03\x02\x02\x02\u{298}\u{299}\x05\x0e\x02\x02\ + \u{299}\u{29a}\x03\x02\x02\x02\u{29a}\u{29b}\x08\x57\x02\x02\u{29b}\u{b9}\ + \x03\x02\x02\x02\u{29c}\u{29d}\x07\x6b\x02\x02\u{29d}\u{29e}\x07\x68\x02\ + \x02\u{29e}\u{29f}\x03\x02\x02\x02\u{29f}\u{2a0}\x09\x0d\x02\x02\u{2a0}\ + \u{2a1}\x03\x02\x02\x02\u{2a1}\u{2a2}\x08\x58\x0f\x02\u{2a2}\u{bb}\x03\ + \x02\x02\x02\u{2a3}\u{2a4}\x07\x67\x02\x02\u{2a4}\u{2a5}\x07\x6e\x02\x02\ + \u{2a5}\u{2a6}\x07\x75\x02\x02\u{2a6}\u{2a7}\x07\x67\x02\x02\u{2a7}\u{2a8}\ + \x07\x6b\x02\x02\u{2a8}\u{2a9}\x07\x68\x02\x02\u{2a9}\u{2aa}\x03\x02\x02\ + \x02\u{2aa}\u{2ab}\x09\x0d\x02\x02\u{2ab}\u{2ac}\x03\x02\x02\x02\u{2ac}\ + \u{2ad}\x08\x59\x0f\x02\u{2ad}\u{bd}\x03\x02\x02\x02\u{2ae}\u{2af}\x07\ + \x67\x02\x02\u{2af}\u{2b0}\x07\x6e\x02\x02\u{2b0}\u{2b1}\x07\x75\x02\x02\ + \u{2b1}\u{2b2}\x07\x67\x02\x02\u{2b2}\u{2b4}\x03\x02\x02\x02\u{2b3}\u{2b5}\ + \x09\x0d\x02\x02\u{2b4}\u{2b3}\x03\x02\x02\x02\u{2b4}\u{2b5}\x03\x02\x02\ + \x02\u{2b5}\u{bf}\x03\x02\x02\x02\u{2b6}\u{2b7}\x07\x75\x02\x02\u{2b7}\ + \u{2b8}\x07\x67\x02\x02\u{2b8}\u{2b9}\x07\x76\x02\x02\u{2b9}\u{2ba}\x03\ + \x02\x02\x02\u{2ba}\u{2bb}\x09\x0d\x02\x02\u{2bb}\u{2bc}\x03\x02\x02\x02\ + \u{2bc}\u{2bd}\x08\x5b\x0f\x02\u{2bd}\u{c1}\x03\x02\x02\x02\u{2be}\u{2bf}\ + \x07\x67\x02\x02\u{2bf}\u{2c0}\x07\x70\x02\x02\u{2c0}\u{2c1}\x07\x66\x02\ + \x02\u{2c1}\u{2c2}\x07\x6b\x02\x02\u{2c2}\u{2c3}\x07\x68\x02\x02\u{2c3}\ + \u{c3}\x03\x02\x02\x02\u{2c4}\u{2c5}\x07\x65\x02\x02\u{2c5}\u{2c6}\x07\ + \x63\x02\x02\u{2c6}\u{2c7}\x07\x6e\x02\x02\u{2c7}\u{2c8}\x07\x6e\x02\x02\ + \u{2c8}\u{2c9}\x03\x02\x02\x02\u{2c9}\u{2ca}\x09\x0d\x02\x02\u{2ca}\u{2cb}\ + \x03\x02\x02\x02\u{2cb}\u{2cc}\x08\x5d\x0f\x02\u{2cc}\u{c5}\x03\x02\x02\ + \x02\u{2cd}\u{2ce}\x07\x66\x02\x02\u{2ce}\u{2cf}\x07\x67\x02\x02\u{2cf}\ + \u{2d0}\x07\x65\x02\x02\u{2d0}\u{2d1}\x07\x6e\x02\x02\u{2d1}\u{2d2}\x07\ + \x63\x02\x02\u{2d2}\u{2d3}\x07\x74\x02\x02\u{2d3}\u{2d4}\x07\x67\x02\x02\ \u{2d4}\u{2d5}\x03\x02\x02\x02\u{2d5}\u{2d6}\x09\x0d\x02\x02\u{2d6}\u{2d7}\ - \x03\x02\x02\x02\u{2d7}\u{2d8}\x08\x5e\x19\x02\u{2d8}\u{c7}\x03\x02\x02\ - \x02\u{2d9}\u{2da}\x07\x65\x02\x02\u{2da}\u{2db}\x07\x63\x02\x02\u{2db}\ - \u{2dc}\x07\x75\x02\x02\u{2dc}\u{2dd}\x07\x67\x02\x02\u{2dd}\u{2de}\x03\ + \x03\x02\x02\x02\u{2d7}\u{2d8}\x08\x5e\x0f\x02\u{2d8}\u{c7}\x03\x02\x02\ + \x02\u{2d9}\u{2da}\x07\x6c\x02\x02\u{2da}\u{2db}\x07\x77\x02\x02\u{2db}\ + \u{2dc}\x07\x6f\x02\x02\u{2dc}\u{2dd}\x07\x72\x02\x02\u{2dd}\u{2de}\x03\ \x02\x02\x02\u{2de}\u{2df}\x09\x0d\x02\x02\u{2df}\u{2e0}\x03\x02\x02\x02\ - \u{2e0}\u{2e1}\x08\x5f\x19\x02\u{2e1}\u{c9}\x03\x02\x02\x02\u{2e2}\u{2e3}\ - \x07\x67\x02\x02\u{2e3}\u{2e4}\x07\x70\x02\x02\u{2e4}\u{2e5}\x07\x66\x02\ - \x02\u{2e5}\u{2e6}\x07\x67\x02\x02\u{2e6}\u{2e7}\x07\x70\x02\x02\u{2e7}\ - \u{2e8}\x07\x77\x02\x02\u{2e8}\u{2e9}\x07\x6f\x02\x02\u{2e9}\u{2eb}\x03\ - \x02\x02\x02\u{2ea}\u{2ec}\x09\x0d\x02\x02\u{2eb}\u{2ea}\x03\x02\x02\x02\ - \u{2eb}\u{2ec}\x03\x02\x02\x02\u{2ec}\u{cb}\x03\x02\x02\x02\u{2ed}\u{2ee}\ - \x07\x6e\x02\x02\u{2ee}\u{2ef}\x07\x71\x02\x02\u{2ef}\u{2f0}\x07\x65\x02\ - \x02\u{2f0}\u{2f1}\x07\x63\x02\x02\u{2f1}\u{2f2}\x07\x6e\x02\x02\u{2f2}\ - \u{2f3}\x03\x02\x02\x02\u{2f3}\u{2f4}\x09\x0d\x02\x02\u{2f4}\u{cd}\x03\ - \x02\x02\x02\u{2f5}\u{2f6}\x07\x40\x02\x02\u{2f6}\u{2f7}\x07\x40\x02\x02\ - \u{2f7}\u{2f8}\x03\x02\x02\x02\u{2f8}\u{2f9}\x08\x62\x09\x02\u{2f9}\u{cf}\ - \x03\x02\x02\x02\u{2fa}\u{2fb}\x0b\x02\x02\x02\u{2fb}\u{2fc}\x03\x02\x02\ - \x02\u{2fc}\u{2fd}\x08\x63\x1a\x02\u{2fd}\u{2fe}\x08\x63\x1b\x02\u{2fe}\ - \u{d1}\x03\x02\x02\x02\u{2ff}\u{300}\x07\x40\x02\x02\u{300}\u{301}\x07\ - \x40\x02\x02\u{301}\u{302}\x03\x02\x02\x02\u{302}\u{303}\x08\x64\x09\x02\ - \u{303}\u{d3}\x03\x02\x02\x02\u{304}\u{305}\x07\x7d\x02\x02\u{305}\u{306}\ - \x03\x02\x02\x02\u{306}\u{307}\x08\x65\x0f\x02\u{307}\u{d5}\x03\x02\x02\ - \x02\u{308}\u{30a}\x0a\x0e\x02\x02\u{309}\u{308}\x03\x02\x02\x02\u{30a}\ - \u{30b}\x03\x02\x02\x02\u{30b}\u{309}\x03\x02\x02\x02\u{30b}\u{30c}\x03\ - \x02\x02\x02\u{30c}\u{d7}\x03\x02\x02\x02\u{30d}\u{30e}\x05\x14\x05\x02\ - \u{30e}\u{30f}\x03\x02\x02\x02\u{30f}\u{310}\x08\x67\x1c\x02\u{310}\u{311}\ - \x08\x67\x09\x02\u{311}\u{d9}\x03\x02\x02\x02\u{312}\u{313}\x07\x40\x02\ - \x02\u{313}\u{314}\x07\x40\x02\x02\u{314}\u{315}\x03\x02\x02\x02\u{315}\ - \u{316}\x08\x68\x17\x02\u{316}\u{317}\x08\x68\x09\x02\u{317}\u{db}\x03\ - \x02\x02\x02\u{318}\u{319}\x05\x14\x05\x02\u{319}\u{31a}\x03\x02\x02\x02\ - \u{31a}\u{31b}\x08\x69\x1c\x02\u{31b}\u{31c}\x08\x69\x09\x02\u{31c}\u{dd}\ - \x03\x02\x02\x02\u{31d}\u{31e}\x05\x34\x15\x02\u{31e}\u{31f}\x03\x02\x02\ - \x02\u{31f}\u{320}\x08\x6a\x14\x02\u{320}\u{321}\x08\x6a\x1d\x02\u{321}\ - \u{df}\x03\x02\x02\x02\u{322}\u{323}\x07\x40\x02\x02\u{323}\u{324}\x07\ - \x40\x02\x02\u{324}\u{325}\x03\x02\x02\x02\u{325}\u{326}\x08\x6b\x17\x02\ - \u{326}\u{327}\x08\x6b\x09\x02\u{327}\u{e1}\x03\x02\x02\x02\x2f\x02\x03\ - \x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\u{e5}\u{ef}\u{f5}\u{f9}\u{fe}\ - \u{105}\u{108}\u{10c}\u{111}\u{11d}\u{129}\u{16c}\u{18e}\u{191}\u{1c3}\ - \u{1de}\u{1e5}\u{1ec}\u{1f4}\u{1f9}\u{1fe}\u{205}\u{20c}\u{212}\u{218}\ - \u{21e}\u{25f}\u{261}\u{27d}\u{282}\u{2a2}\u{2eb}\u{30b}\x1e\x02\x03\x02\ - \x02\x05\x02\x02\x04\x02\x07\x04\x02\x07\x03\x02\x07\x08\x02\x09\x08\x02\ - \x06\x02\x02\x09\x07\x02\x07\x0a\x02\x09\x0c\x02\x07\x07\x02\x07\x05\x02\ - \x07\x09\x02\x08\x02\x02\x07\x06\x02\x09\x16\x02\x04\x07\x02\x09\x12\x02\ - \x09\x11\x02\x09\x3b\x02\x09\x4d\x02\x07\x0d\x02\x07\x0c\x02\x09\x50\x02\ - \x04\x0b\x02\x09\x09\x02\x04\x09\x02"; + \u{2e0}\u{2e1}\x08\x5f\x18\x02\u{2e1}\u{c9}\x03\x02\x02\x02\u{2e2}\u{2e3}\ + \x07\x67\x02\x02\u{2e3}\u{2e4}\x07\x70\x02\x02\u{2e4}\u{2e5}\x07\x77\x02\ + \x02\u{2e5}\u{2e6}\x07\x6f\x02\x02\u{2e6}\u{2e7}\x03\x02\x02\x02\u{2e7}\ + \u{2e8}\x09\x0d\x02\x02\u{2e8}\u{2e9}\x03\x02\x02\x02\u{2e9}\u{2ea}\x08\ + \x60\x19\x02\u{2ea}\u{cb}\x03\x02\x02\x02\u{2eb}\u{2ec}\x07\x65\x02\x02\ + \u{2ec}\u{2ed}\x07\x63\x02\x02\u{2ed}\u{2ee}\x07\x75\x02\x02\u{2ee}\u{2ef}\ + \x07\x67\x02\x02\u{2ef}\u{2f0}\x03\x02\x02\x02\u{2f0}\u{2f1}\x09\x0d\x02\ + \x02\u{2f1}\u{2f2}\x03\x02\x02\x02\u{2f2}\u{2f3}\x08\x61\x19\x02\u{2f3}\ + \u{cd}\x03\x02\x02\x02\u{2f4}\u{2f5}\x07\x67\x02\x02\u{2f5}\u{2f6}\x07\ + \x70\x02\x02\u{2f6}\u{2f7}\x07\x66\x02\x02\u{2f7}\u{2f8}\x07\x67\x02\x02\ + \u{2f8}\u{2f9}\x07\x70\x02\x02\u{2f9}\u{2fa}\x07\x77\x02\x02\u{2fa}\u{2fb}\ + \x07\x6f\x02\x02\u{2fb}\u{2fd}\x03\x02\x02\x02\u{2fc}\u{2fe}\x09\x0d\x02\ + \x02\u{2fd}\u{2fc}\x03\x02\x02\x02\u{2fd}\u{2fe}\x03\x02\x02\x02\u{2fe}\ + \u{cf}\x03\x02\x02\x02\u{2ff}\u{300}\x07\x6e\x02\x02\u{300}\u{301}\x07\ + \x71\x02\x02\u{301}\u{302}\x07\x65\x02\x02\u{302}\u{303}\x07\x63\x02\x02\ + \u{303}\u{304}\x07\x6e\x02\x02\u{304}\u{305}\x03\x02\x02\x02\u{305}\u{306}\ + \x09\x0d\x02\x02\u{306}\u{d1}\x03\x02\x02\x02\u{307}\u{308}\x07\x40\x02\ + \x02\u{308}\u{309}\x07\x40\x02\x02\u{309}\u{30a}\x03\x02\x02\x02\u{30a}\ + \u{30b}\x08\x64\x09\x02\u{30b}\u{d3}\x03\x02\x02\x02\u{30c}\u{30d}\x07\ + \x7d\x02\x02\u{30d}\u{30e}\x03\x02\x02\x02\u{30e}\u{30f}\x08\x65\x1a\x02\ + \u{30f}\u{310}\x08\x65\x1b\x02\u{310}\u{311}\x08\x65\x0f\x02\u{311}\u{d5}\ + \x03\x02\x02\x02\u{312}\u{313}\x0b\x02\x02\x02\u{313}\u{314}\x03\x02\x02\ + \x02\u{314}\u{315}\x08\x66\x1c\x02\u{315}\u{316}\x08\x66\x1b\x02\u{316}\ + \u{d7}\x03\x02\x02\x02\u{317}\u{318}\x05\x12\x04\x02\u{318}\u{d9}\x03\x02\ + \x02\x02\u{319}\u{31a}\x07\x40\x02\x02\u{31a}\u{31b}\x07\x40\x02\x02\u{31b}\ + \u{31c}\x03\x02\x02\x02\u{31c}\u{31d}\x08\x68\x09\x02\u{31d}\u{db}\x03\ + \x02\x02\x02\u{31e}\u{31f}\x07\x7d\x02\x02\u{31f}\u{320}\x03\x02\x02\x02\ + \u{320}\u{321}\x08\x69\x0f\x02\u{321}\u{dd}\x03\x02\x02\x02\u{322}\u{324}\ + \x0a\x0e\x02\x02\u{323}\u{322}\x03\x02\x02\x02\u{324}\u{325}\x03\x02\x02\ + \x02\u{325}\u{323}\x03\x02\x02\x02\u{325}\u{326}\x03\x02\x02\x02\u{326}\ + \u{df}\x03\x02\x02\x02\u{327}\u{328}\x05\x12\x04\x02\u{328}\u{e1}\x03\x02\ + \x02\x02\u{329}\u{32a}\x05\x14\x05\x02\u{32a}\u{32b}\x03\x02\x02\x02\u{32b}\ + \u{32c}\x08\x6c\x1d\x02\u{32c}\u{32d}\x08\x6c\x09\x02\u{32d}\u{e3}\x03\ + \x02\x02\x02\u{32e}\u{32f}\x07\x40\x02\x02\u{32f}\u{330}\x07\x40\x02\x02\ + \u{330}\u{331}\x03\x02\x02\x02\u{331}\u{332}\x08\x6d\x17\x02\u{332}\u{333}\ + \x08\x6d\x09\x02\u{333}\u{e5}\x03\x02\x02\x02\u{334}\u{335}\x05\x14\x05\ + \x02\u{335}\u{336}\x03\x02\x02\x02\u{336}\u{337}\x08\x6e\x1d\x02\u{337}\ + \u{338}\x08\x6e\x09\x02\u{338}\u{e7}\x03\x02\x02\x02\u{339}\u{33a}\x05\ + \x34\x15\x02\u{33a}\u{33b}\x03\x02\x02\x02\u{33b}\u{33c}\x08\x6f\x14\x02\ + \u{33c}\u{33d}\x08\x6f\x1e\x02\u{33d}\u{e9}\x03\x02\x02\x02\u{33e}\u{33f}\ + \x07\x40\x02\x02\u{33f}\u{340}\x07\x40\x02\x02\u{340}\u{341}\x03\x02\x02\ + \x02\u{341}\u{342}\x08\x70\x17\x02\u{342}\u{343}\x08\x70\x09\x02\u{343}\ + \u{eb}\x03\x02\x02\x02\x2f\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\ + \x0d\u{ef}\u{f9}\u{ff}\u{103}\u{108}\u{10f}\u{112}\u{116}\u{11b}\u{127}\ + \u{133}\u{17c}\u{19e}\u{1a1}\u{1d3}\u{1ee}\u{1f5}\u{1fc}\u{204}\u{209}\ + \u{20e}\u{215}\u{21c}\u{222}\u{228}\u{22e}\u{26f}\u{271}\u{28d}\u{292}\ + \u{2b4}\u{2fd}\u{325}\x1f\x02\x03\x02\x02\x05\x02\x02\x04\x02\x07\x04\x02\ + \x07\x03\x02\x07\x08\x02\x09\x08\x02\x06\x02\x02\x09\x07\x02\x07\x0a\x02\ + \x09\x0c\x02\x07\x07\x02\x07\x05\x02\x07\x09\x02\x09\x16\x02\x07\x06\x02\ + \x08\x02\x02\x04\x07\x02\x09\x12\x02\x09\x11\x02\x09\x3b\x02\x09\x4e\x02\ + \x07\x0d\x02\x07\x0c\x02\x09\x51\x02\x04\x0b\x02\x09\x52\x02\x09\x09\x02\ + \x04\x09\x02"; diff --git a/crates/compiler/src/parser/generated/yarnspinnerparser.rs b/crates/compiler/src/parser/generated/yarnspinnerparser.rs index d840cf73e..c213fb19e 100644 --- a/crates/compiler/src/parser/generated/yarnspinnerparser.rs +++ b/crates/compiler/src/parser/generated/yarnspinnerparser.rs @@ -1,4 +1,4 @@ -// Generated from .\YarnSpinnerParser.g4 by ANTLR 4.8 +// Generated from third-party\YarnSpinner\YarnSpinner.Compiler\YarnSpinnerParser.g4 by ANTLR 4.8 #![allow(dead_code)] #![allow(non_snake_case)] #![allow(non_upper_case_globals)] @@ -8,26 +8,28 @@ #![allow(unused_braces)] use super::yarnspinnerparserlistener::*; use super::yarnspinnerparservisitor::*; +use antlr_rust::PredictionContextCache; +use antlr_rust::TokenSource; use antlr_rust::atn::{ATN, INVALID_ALT}; use antlr_rust::atn_deserializer::ATNDeserializer; use antlr_rust::dfa::DFA; use antlr_rust::error_strategy::{DefaultErrorStrategy, ErrorStrategy}; use antlr_rust::errors::*; use antlr_rust::int_stream::EOF; -use antlr_rust::lazy_static; use antlr_rust::parser::{BaseParser, Parser, ParserNodeType, ParserRecog}; use antlr_rust::parser_atn_simulator::ParserATNSimulator; -use antlr_rust::parser_rule_context::{cast, cast_mut, BaseParserRuleContext, ParserRuleContext}; +use antlr_rust::parser_rule_context::{BaseParserRuleContext, ParserRuleContext, cast, cast_mut}; use antlr_rust::recognizer::{Actions, Recognizer}; use antlr_rust::rule_context::{BaseRuleContext, CustomRuleContext, RuleContext}; -use antlr_rust::token::{CommonToken, OwningToken, Token, TOKEN_EOF}; +use antlr_rust::token::{OwningToken, TOKEN_EOF, Token}; use antlr_rust::token_factory::{CommonTokenFactory, TokenAware, TokenFactory}; use antlr_rust::token_stream::TokenStream; use antlr_rust::tree::*; use antlr_rust::vocabulary::{Vocabulary, VocabularyImpl}; -use antlr_rust::TokenSource; -use antlr_rust::{InputStream, PredictionContextCache}; + +use antlr_rust::lazy_static; use antlr_rust::{TidAble, TidExt}; + use std::any::{Any, TypeId}; use std::borrow::{Borrow, BorrowMut}; use std::cell::RefCell; @@ -98,26 +100,29 @@ pub const EXPRESSION_END: isize = 58; pub const VAR_ID: isize = 59; pub const DOT: isize = 60; pub const NUMBER: isize = 61; -pub const COMMAND_WS: isize = 62; -pub const COMMAND_IF: isize = 63; -pub const COMMAND_ELSEIF: isize = 64; -pub const COMMAND_ELSE: isize = 65; -pub const COMMAND_SET: isize = 66; -pub const COMMAND_ENDIF: isize = 67; -pub const COMMAND_CALL: isize = 68; -pub const COMMAND_DECLARE: isize = 69; -pub const COMMAND_JUMP: isize = 70; -pub const COMMAND_ENUM: isize = 71; -pub const COMMAND_CASE: isize = 72; -pub const COMMAND_ENDENUM: isize = 73; -pub const COMMAND_LOCAL: isize = 74; -pub const COMMAND_END: isize = 75; -pub const COMMAND_TEXT_END: isize = 76; -pub const COMMAND_EXPRESSION_START: isize = 77; -pub const COMMAND_TEXT: isize = 78; -pub const TYPE_STRING: isize = 79; -pub const TYPE_NUMBER: isize = 80; -pub const TYPE_BOOL: isize = 81; +pub const COMMAND_NEWLINE: isize = 62; +pub const COMMAND_WS: isize = 63; +pub const COMMAND_IF: isize = 64; +pub const COMMAND_ELSEIF: isize = 65; +pub const COMMAND_ELSE: isize = 66; +pub const COMMAND_SET: isize = 67; +pub const COMMAND_ENDIF: isize = 68; +pub const COMMAND_CALL: isize = 69; +pub const COMMAND_DECLARE: isize = 70; +pub const COMMAND_JUMP: isize = 71; +pub const COMMAND_ENUM: isize = 72; +pub const COMMAND_CASE: isize = 73; +pub const COMMAND_ENDENUM: isize = 74; +pub const COMMAND_LOCAL: isize = 75; +pub const COMMAND_END: isize = 76; +pub const COMMAND_TEXT_NEWLINE: isize = 77; +pub const COMMAND_TEXT_END: isize = 78; +pub const COMMAND_EXPRESSION_START: isize = 79; +pub const COMMAND_TEXT: isize = 80; +pub const COMMAND_ID_NEWLINE: isize = 81; +pub const TYPE_STRING: isize = 82; +pub const TYPE_NUMBER: isize = 83; +pub const TYPE_BOOL: isize = 84; pub const RULE_dialogue: usize = 0; pub const RULE_file_hashtag: usize = 1; pub const RULE_node: usize = 2; @@ -173,7 +178,7 @@ pub const ruleNames: [&'static str; 26] = [ "jump_statement", ]; -pub const _LITERAL_NAMES: [Option<&'static str>; 82] = [ +pub const _LITERAL_NAMES: [Option<&'static str>; 85] = [ None, None, None, @@ -241,6 +246,7 @@ pub const _LITERAL_NAMES: [Option<&'static str>; 82] = [ None, None, None, + None, Some("'endif'"), None, None, @@ -251,13 +257,15 @@ pub const _LITERAL_NAMES: [Option<&'static str>; 82] = [ None, None, None, + None, Some("'{'"), None, + None, Some("'string'"), Some("'number'"), Some("'bool'"), ]; -pub const _SYMBOLIC_NAMES: [Option<&'static str>; 82] = [ +pub const _SYMBOLIC_NAMES: [Option<&'static str>; 85] = [ None, Some("INDENT"), Some("DEDENT"), @@ -320,6 +328,7 @@ pub const _SYMBOLIC_NAMES: [Option<&'static str>; 82] = [ Some("VAR_ID"), Some("DOT"), Some("NUMBER"), + Some("COMMAND_NEWLINE"), Some("COMMAND_WS"), Some("COMMAND_IF"), Some("COMMAND_ELSEIF"), @@ -334,9 +343,11 @@ pub const _SYMBOLIC_NAMES: [Option<&'static str>; 82] = [ Some("COMMAND_ENDENUM"), Some("COMMAND_LOCAL"), Some("COMMAND_END"), + Some("COMMAND_TEXT_NEWLINE"), Some("COMMAND_TEXT_END"), Some("COMMAND_EXPRESSION_START"), Some("COMMAND_TEXT"), + Some("COMMAND_ID_NEWLINE"), Some("TYPE_STRING"), Some("TYPE_NUMBER"), Some("TYPE_BOOL"), @@ -1992,6 +2003,7 @@ impl<'input> HashtagContextExt<'input> { }, )) } + fn new( parent: Option + 'input>>, invoking_state: isize, @@ -7255,9 +7267,8 @@ lazy_static! { }; } -const _serializedATN: &'static str = - "\x03\u{608b}\u{a72a}\u{8133}\u{b9ed}\u{417c}\u{3be7}\u{7786}\u{5964}\x03\ - \x53\u{13d}\x04\x02\x09\x02\x04\x03\x09\x03\x04\x04\x09\x04\x04\x05\x09\ +const _serializedATN: &'static str = "\x03\u{608b}\u{a72a}\u{8133}\u{b9ed}\u{417c}\u{3be7}\u{7786}\u{5964}\x03\ + \x56\u{13d}\x04\x02\x09\x02\x04\x03\x09\x03\x04\x04\x09\x04\x04\x05\x09\ \x05\x04\x06\x09\x06\x04\x07\x09\x07\x04\x08\x09\x08\x04\x09\x09\x09\x04\ \x0a\x09\x0a\x04\x0b\x09\x0b\x04\x0c\x09\x0c\x04\x0d\x09\x0d\x04\x0e\x09\ \x0e\x04\x0f\x09\x0f\x04\x10\x09\x10\x04\x11\x09\x11\x04\x12\x09\x12\x04\ @@ -7341,8 +7352,8 @@ const _serializedATN: &'static str = \x02\x7f\x77\x03\x02\x02\x02\x7f\x7b\x03\x02\x02\x02\u{80}\u{81}\x03\x02\ \x02\x02\u{81}\x7f\x03\x02\x02\x02\u{81}\u{82}\x03\x02\x02\x02\u{82}\x11\ \x03\x02\x02\x02\u{83}\u{84}\x07\x0c\x02\x02\u{84}\u{85}\x07\x1c\x02\x02\ - \u{85}\x13\x03\x02\x02\x02\u{86}\u{87}\x07\x11\x02\x02\u{87}\u{88}\x07\x41\ - \x02\x02\u{88}\u{89}\x05\x16\x0c\x02\u{89}\u{8a}\x07\x4d\x02\x02\u{8a}\x15\ + \u{85}\x13\x03\x02\x02\x02\u{86}\u{87}\x07\x11\x02\x02\u{87}\u{88}\x07\x42\ + \x02\x02\u{88}\u{89}\x05\x16\x0c\x02\u{89}\u{8a}\x07\x4e\x02\x02\u{8a}\x15\ \x03\x02\x02\x02\u{8b}\u{8c}\x08\x0c\x01\x02\u{8c}\u{8d}\x07\x36\x02\x02\ \u{8d}\u{8e}\x05\x16\x0c\x02\u{8e}\u{8f}\x07\x37\x02\x02\u{8f}\u{96}\x03\ \x02\x02\x02\u{90}\u{91}\x07\x32\x02\x02\u{91}\u{96}\x05\x16\x0c\x0a\u{92}\ @@ -7376,29 +7387,29 @@ const _serializedATN: &'static str = \u{c8}\u{c9}\x03\x02\x02\x02\u{c9}\u{cc}\x03\x02\x02\x02\u{ca}\u{c8}\x03\ \x02\x02\x02\u{cb}\u{cd}\x05\x24\x13\x02\u{cc}\u{cb}\x03\x02\x02\x02\u{cc}\ \u{cd}\x03\x02\x02\x02\u{cd}\u{ce}\x03\x02\x02\x02\u{ce}\u{cf}\x07\x11\x02\ - \x02\u{cf}\u{d0}\x07\x45\x02\x02\u{d0}\u{d1}\x07\x4d\x02\x02\u{d1}\x1f\x03\ - \x02\x02\x02\u{d2}\u{d3}\x07\x11\x02\x02\u{d3}\u{d4}\x07\x41\x02\x02\u{d4}\ - \u{d5}\x05\x16\x0c\x02\u{d5}\u{d9}\x07\x4d\x02\x02\u{d6}\u{d8}\x05\x0c\x07\ + \x02\u{cf}\u{d0}\x07\x46\x02\x02\u{d0}\u{d1}\x07\x4e\x02\x02\u{d1}\x1f\x03\ + \x02\x02\x02\u{d2}\u{d3}\x07\x11\x02\x02\u{d3}\u{d4}\x07\x42\x02\x02\u{d4}\ + \u{d5}\x05\x16\x0c\x02\u{d5}\u{d9}\x07\x4e\x02\x02\u{d6}\u{d8}\x05\x0c\x07\ \x02\u{d7}\u{d6}\x03\x02\x02\x02\u{d8}\u{db}\x03\x02\x02\x02\u{d9}\u{d7}\ \x03\x02\x02\x02\u{d9}\u{da}\x03\x02\x02\x02\u{da}\x21\x03\x02\x02\x02\u{db}\ - \u{d9}\x03\x02\x02\x02\u{dc}\u{dd}\x07\x11\x02\x02\u{dd}\u{de}\x07\x42\x02\ - \x02\u{de}\u{df}\x05\x16\x0c\x02\u{df}\u{e3}\x07\x4d\x02\x02\u{e0}\u{e2}\ + \u{d9}\x03\x02\x02\x02\u{dc}\u{dd}\x07\x11\x02\x02\u{dd}\u{de}\x07\x43\x02\ + \x02\u{de}\u{df}\x05\x16\x0c\x02\u{df}\u{e3}\x07\x4e\x02\x02\u{e0}\u{e2}\ \x05\x0c\x07\x02\u{e1}\u{e0}\x03\x02\x02\x02\u{e2}\u{e5}\x03\x02\x02\x02\ \u{e3}\u{e1}\x03\x02\x02\x02\u{e3}\u{e4}\x03\x02\x02\x02\u{e4}\x23\x03\x02\ \x02\x02\u{e5}\u{e3}\x03\x02\x02\x02\u{e6}\u{e7}\x07\x11\x02\x02\u{e7}\u{e8}\ - \x07\x43\x02\x02\u{e8}\u{ec}\x07\x4d\x02\x02\u{e9}\u{eb}\x05\x0c\x07\x02\ + \x07\x44\x02\x02\u{e8}\u{ec}\x07\x4e\x02\x02\u{e9}\u{eb}\x05\x0c\x07\x02\ \u{ea}\u{e9}\x03\x02\x02\x02\u{eb}\u{ee}\x03\x02\x02\x02\u{ec}\u{ea}\x03\ \x02\x02\x02\u{ec}\u{ed}\x03\x02\x02\x02\u{ed}\x25\x03\x02\x02\x02\u{ee}\ - \u{ec}\x03\x02\x02\x02\u{ef}\u{f0}\x07\x11\x02\x02\u{f0}\u{f1}\x07\x44\x02\ + \u{ec}\x03\x02\x02\x02\u{ef}\u{f0}\x07\x11\x02\x02\u{f0}\u{f1}\x07\x45\x02\ \x02\u{f1}\u{f2}\x05\x1a\x0e\x02\u{f2}\u{f3}\x09\x07\x02\x02\u{f3}\u{f4}\ - \x05\x16\x0c\x02\u{f4}\u{f5}\x07\x4d\x02\x02\u{f5}\x27\x03\x02\x02\x02\u{f6}\ - \u{f7}\x07\x11\x02\x02\u{f7}\u{f8}\x07\x46\x02\x02\u{f8}\u{f9}\x05\x1c\x0f\ - \x02\u{f9}\u{fa}\x07\x4d\x02\x02\u{fa}\x29\x03\x02\x02\x02\u{fb}\u{fc}\x07\ - \x11\x02\x02\u{fc}\u{fd}\x05\x2c\x17\x02\u{fd}\u{101}\x07\x4e\x02\x02\u{fe}\ + \x05\x16\x0c\x02\u{f4}\u{f5}\x07\x4e\x02\x02\u{f5}\x27\x03\x02\x02\x02\u{f6}\ + \u{f7}\x07\x11\x02\x02\u{f7}\u{f8}\x07\x47\x02\x02\u{f8}\u{f9}\x05\x1c\x0f\ + \x02\u{f9}\u{fa}\x07\x4e\x02\x02\u{fa}\x29\x03\x02\x02\x02\u{fb}\u{fc}\x07\ + \x11\x02\x02\u{fc}\u{fd}\x05\x2c\x17\x02\u{fd}\u{101}\x07\x50\x02\x02\u{fe}\ \u{100}\x05\x12\x0a\x02\u{ff}\u{fe}\x03\x02\x02\x02\u{100}\u{103}\x03\x02\ \x02\x02\u{101}\u{ff}\x03\x02\x02\x02\u{101}\u{102}\x03\x02\x02\x02\u{102}\ - \x2b\x03\x02\x02\x02\u{103}\u{101}\x03\x02\x02\x02\u{104}\u{10a}\x07\x50\ - \x02\x02\u{105}\u{106}\x07\x4f\x02\x02\u{106}\u{107}\x05\x16\x0c\x02\u{107}\ + \x2b\x03\x02\x02\x02\u{103}\u{101}\x03\x02\x02\x02\u{104}\u{10a}\x07\x52\ + \x02\x02\u{105}\u{106}\x07\x51\x02\x02\u{106}\u{107}\x05\x16\x0c\x02\u{107}\ \u{108}\x07\x3c\x02\x02\u{108}\u{10a}\x03\x02\x02\x02\u{109}\u{104}\x03\ \x02\x02\x02\u{109}\u{105}\x03\x02\x02\x02\u{10a}\u{10d}\x03\x02\x02\x02\ \u{10b}\u{109}\x03\x02\x02\x02\u{10b}\u{10c}\x03\x02\x02\x02\u{10c}\x2d\ @@ -7414,15 +7425,15 @@ const _serializedATN: &'static str = \u{121}\x03\x02\x02\x02\u{120}\u{11e}\x03\x02\x02\x02\u{121}\u{123}\x07\ \x04\x02\x02\u{122}\u{11a}\x03\x02\x02\x02\u{122}\u{123}\x03\x02\x02\x02\ \u{123}\x31\x03\x02\x02\x02\u{124}\u{125}\x07\x11\x02\x02\u{125}\u{126}\ - \x07\x47\x02\x02\u{126}\u{127}\x05\x1a\x0e\x02\u{127}\u{128}\x07\x21\x02\ + \x07\x48\x02\x02\u{126}\u{127}\x05\x1a\x0e\x02\u{127}\u{128}\x07\x21\x02\ \x02\u{128}\u{12b}\x05\x18\x0d\x02\u{129}\u{12a}\x07\x39\x02\x02\u{12a}\ \u{12c}\x07\x3b\x02\x02\u{12b}\u{129}\x03\x02\x02\x02\u{12b}\u{12c}\x03\ - \x02\x02\x02\u{12c}\u{12d}\x03\x02\x02\x02\u{12d}\u{12e}\x07\x4d\x02\x02\ + \x02\x02\x02\u{12c}\u{12d}\x03\x02\x02\x02\u{12d}\u{12e}\x07\x4e\x02\x02\ \u{12e}\x33\x03\x02\x02\x02\u{12f}\u{130}\x07\x11\x02\x02\u{130}\u{131}\ - \x07\x48\x02\x02\u{131}\u{132}\x07\x09\x02\x02\u{132}\u{13b}\x07\x4d\x02\ - \x02\u{133}\u{134}\x07\x11\x02\x02\u{134}\u{135}\x07\x48\x02\x02\u{135}\ + \x07\x49\x02\x02\u{131}\u{132}\x07\x09\x02\x02\u{132}\u{13b}\x07\x4e\x02\ + \x02\u{133}\u{134}\x07\x11\x02\x02\u{134}\u{135}\x07\x49\x02\x02\u{135}\ \u{136}\x07\x12\x02\x02\u{136}\u{137}\x05\x16\x0c\x02\u{137}\u{138}\x07\ - \x3c\x02\x02\u{138}\u{139}\x07\x4d\x02\x02\u{139}\u{13b}\x03\x02\x02\x02\ + \x3c\x02\x02\u{138}\u{139}\x07\x4e\x02\x02\u{139}\u{13b}\x03\x02\x02\x02\ \u{13a}\u{12f}\x03\x02\x02\x02\u{13a}\u{133}\x03\x02\x02\x02\u{13b}\x35\ \x03\x02\x02\x02\x22\x39\x3f\x47\x50\x55\x64\x68\x6c\x71\x79\x7f\u{81}\u{95}\ \u{a6}\u{a8}\u{b2}\u{b9}\u{bf}\u{c8}\u{cc}\u{d9}\u{e3}\u{ec}\u{101}\u{109}\ diff --git a/crates/compiler/src/parser/generated/yarnspinnerparserlistener.rs b/crates/compiler/src/parser/generated/yarnspinnerparserlistener.rs index 92a9c0163..02ccf1599 100644 --- a/crates/compiler/src/parser/generated/yarnspinnerparserlistener.rs +++ b/crates/compiler/src/parser/generated/yarnspinnerparserlistener.rs @@ -1,5 +1,5 @@ #![allow(nonstandard_style)] -// Generated from .\YarnSpinnerParser.g4 by ANTLR 4.8 +// Generated from third-party\YarnSpinner\YarnSpinner.Compiler\YarnSpinnerParser.g4 by ANTLR 4.8 use antlr_rust::tree::ParseTreeListener; use super::yarnspinnerparser::*; diff --git a/crates/compiler/src/parser/generated/yarnspinnerparservisitor.rs b/crates/compiler/src/parser/generated/yarnspinnerparservisitor.rs index aabeb35f1..2825d4a57 100644 --- a/crates/compiler/src/parser/generated/yarnspinnerparservisitor.rs +++ b/crates/compiler/src/parser/generated/yarnspinnerparservisitor.rs @@ -1,5 +1,5 @@ #![allow(nonstandard_style)] -// Generated from .\YarnSpinnerParser.g4 by ANTLR 4.8 +// Generated from third-party\YarnSpinner\YarnSpinner.Compiler\YarnSpinnerParser.g4 by ANTLR 4.8 use antlr_rust::tree::{ParseTreeVisitor,ParseTreeVisitorCompat}; use super::yarnspinnerparser::*; diff --git a/crates/compiler/src/string_table_manager.rs b/crates/compiler/src/string_table_manager.rs index baed1953c..68a5caf1c 100644 --- a/crates/compiler/src/string_table_manager.rs +++ b/crates/compiler/src/string_table_manager.rs @@ -2,7 +2,6 @@ use crate::output::StringInfo; use crate::prelude::*; -use crc32fast; use std::collections::HashMap; use std::ops::{Deref, DerefMut}; use yarnspinner_core::prelude::*; @@ -56,7 +55,7 @@ impl StringTableManager { (!self.contains_key(&id)).then_some(id) }) - .expect(&format!("Internal error: string table failed to find a non-colliding hash for \"{candidate_seed}\" after {MAX_ATTEMPTS} attempts")); + .unwrap_or_else(|| panic!("Internal error: string table failed to find a non-colliding hash for \"{candidate_seed}\" after {MAX_ATTEMPTS} attempts")); let string_info = StringInfo { is_implicit_tag: true, From 03aa0a1f9fddbac4328676d27b688a4ac21e5830 Mon Sep 17 00:00:00 2001 From: Galdormin Date: Wed, 4 Feb 2026 20:02:44 +0100 Subject: [PATCH 04/14] update tag_lines + remove validate_unique_inferred_variable - validate_unique_inferred_variable seems to break the tests and was removed in the 3.0 --- .../src/localization/line_id_generation.rs | 6 +-- crates/compiler/src/compilation_steps.rs | 3 +- .../validate_unique_inferred_variable.rs | 52 ------------------- .../compiler/src/compiler/run_compilation.rs | 1 - crates/yarnspinner/tests/project_tests.rs | 2 +- 5 files changed, 5 insertions(+), 59 deletions(-) delete mode 100644 crates/compiler/src/compilation_steps/validate_unique_inferred_variable.rs diff --git a/crates/bevy_plugin/src/localization/line_id_generation.rs b/crates/bevy_plugin/src/localization/line_id_generation.rs index 1430ca930..adf4a8ee3 100644 --- a/crates/bevy_plugin/src/localization/line_id_generation.rs +++ b/crates/bevy_plugin/src/localization/line_id_generation.rs @@ -90,7 +90,7 @@ fn handle_yarn_file_events( yarn_file.string_table.clone(), )); - let Some(source_with_added_ids) = add_tags_to_lines(yarn_file)? else { + let Some((source_with_added_ids, _)) = add_tags_to_lines(yarn_file)? else { if matches!(event, AssetEvent::LoadedWithDependencies { .. }) { continue; } @@ -155,12 +155,12 @@ fn handle_yarn_file_events( } /// Adapted from -fn add_tags_to_lines(yarn_file: &YarnFile) -> YarnCompilerResult> { +fn add_tags_to_lines(yarn_file: &YarnFile) -> YarnCompilerResult)>> { let existing_tags = yarn_file .string_table .iter() .filter(|(_, string_info)| !string_info.is_implicit_tag) .map(|(key, _)| key.clone()) .collect(); - YarnCompiler::add_tags_to_lines(yarn_file.file.source.clone(), existing_tags) + YarnCompiler::tag_lines(yarn_file.file.source.clone(), existing_tags) } diff --git a/crates/compiler/src/compilation_steps.rs b/crates/compiler/src/compilation_steps.rs index abebad1d2..1c2069cb7 100644 --- a/crates/compiler/src/compilation_steps.rs +++ b/crates/compiler/src/compilation_steps.rs @@ -12,7 +12,6 @@ mod parse_files; mod register_initial_variables; mod register_strings; mod resolve_deferred_type_diagnostic; -mod validate_unique_inferred_variable; mod validate_unique_node_names; pub(crate) use self::{ @@ -20,5 +19,5 @@ pub(crate) use self::{ check_types::*, clean_up_diagnostics::*, create_declarations_for_tracking_nodes::*, early_breaks::*, find_tracking_nodes::*, generate_code::*, get_declarations::*, parse_files::*, register_initial_variables::*, register_strings::*, resolve_deferred_type_diagnostic::*, - validate_unique_inferred_variable::*, validate_unique_node_names::*, + validate_unique_node_names::*, }; diff --git a/crates/compiler/src/compilation_steps/validate_unique_inferred_variable.rs b/crates/compiler/src/compilation_steps/validate_unique_inferred_variable.rs deleted file mode 100644 index e04df0e5e..000000000 --- a/crates/compiler/src/compilation_steps/validate_unique_inferred_variable.rs +++ /dev/null @@ -1,52 +0,0 @@ -use crate::prelude::*; -use std::collections::HashMap; - -pub(crate) fn validate_unique_inferred_variables( - mut state: CompilationIntermediate, -) -> CompilationIntermediate { - // TODO: I am pretty sure this is made redundant by the v3 type system, will need to check if it's still needed. - // determining if there are any duplicate inferred variables - // at this point this shouldn't happen, but if it has we need to error out now - - let duplicate_inferred_vars = state - .known_variable_declarations - .iter() - .filter(|&d| d.is_variable()) - .fold(HashMap::<&str, Vec<&Declaration>>::new(), |mut acc, d| { - acc.entry(&d.name).or_default().push(d); - acc - }) - .into_iter() - .filter(|(_, group)| group.len() > 1) - .collect::)>>(); - - for (key, group) in duplicate_inferred_vars { - let group_message = group - .iter() - .map(|d| { - format!( - "\"{}\" on line {}", - d.source_file_name, - d.source_file_line().unwrap_or_default() - ) - }) - .collect::>() - .join(", "); - - state.diagnostics.push( - Diagnostic::from_message(format!( - "\"{key}\" has had its default value inferred in multiple places: {group_message}" - )) - .with_severity(DiagnosticSeverity::Error), - ); - } - - // Note from da39c71 -> 2.5.0 migration - // The line below don't do anything therefore no Rust code has been migrated - - // removing all the duplicate keys - // var duplicateKeys = duplicateInferredVars.Select(g => g.Key); - // knownVariableDeclarations.Where(d => duplicateKeys.Contains(d.Name)); - - state -} diff --git a/crates/compiler/src/compiler/run_compilation.rs b/crates/compiler/src/compiler/run_compilation.rs index 8a7f19773..7d58e52fc 100644 --- a/crates/compiler/src/compiler/run_compilation.rs +++ b/crates/compiler/src/compiler/run_compilation.rs @@ -20,7 +20,6 @@ pub(crate) fn compile(compiler: &Compiler) -> Result { &create_declarations_for_tracking_nodes, &add_tracking_declarations, &resolve_deferred_type_diagnostic, - &validate_unique_inferred_variables, &add_error_for_empty_nodes, &break_on_job_with_only_declarations, &generate_code, diff --git a/crates/yarnspinner/tests/project_tests.rs b/crates/yarnspinner/tests/project_tests.rs index ff6711b5b..19b686f02 100644 --- a/crates/yarnspinner/tests/project_tests.rs +++ b/crates/yarnspinner/tests/project_tests.rs @@ -110,7 +110,7 @@ before 🧑🏾‍❤️‍💋‍🧑🏻after #line:abc130 // with a comment // Act - let output = Compiler::add_tags_to_lines(original_text, Vec::new()) + let (output, _) = Compiler::tag_lines(original_text, Vec::new()) .unwrap() .unwrap(); From add48720e58ffc856ef1be240b124c871ca59e19 Mon Sep 17 00:00:00 2001 From: Galdormin Date: Thu, 5 Feb 2026 20:10:59 +0100 Subject: [PATCH 05/14] migrate few tests - YarnSpinner.Tests/ErrorHandlingTests.cs - YarnSpinner.Tests/ProjectTests.cs - YarnSpinner.Tests/TagTests.cs --- .../yarnspinner/tests/error_handling_tests.rs | 17 +++++ crates/yarnspinner/tests/project_tests.rs | 75 +++++++++++++++++++ crates/yarnspinner/tests/tag_tests.rs | 22 ++++++ 3 files changed, 114 insertions(+) diff --git a/crates/yarnspinner/tests/error_handling_tests.rs b/crates/yarnspinner/tests/error_handling_tests.rs index a1ade894f..4be4edb48 100644 --- a/crates/yarnspinner/tests/error_handling_tests.rs +++ b/crates/yarnspinner/tests/error_handling_tests.rs @@ -113,3 +113,20 @@ fn test_compiling_same_file_twice_fails() { .any(|d| d.message.contains("Duplicate line ID line:794945")) ); } + +#[test] +fn test_empty_nodes_generate_warnings() { + let result = Compiler::from_test_source("").compile().unwrap(); + + let warnings = result + .warnings + .iter() + .filter(|d| matches!(d.severity, DiagnosticSeverity::Warning)) + .collect::>(); + + assert_eq!(warnings.len(), 1); + assert_eq!( + warnings.first().unwrap().message, + "Node \"Start\" is empty and will not be included in the compiled output." + ); +} diff --git a/crates/yarnspinner/tests/project_tests.rs b/crates/yarnspinner/tests/project_tests.rs index 19b686f02..c6cf7808b 100644 --- a/crates/yarnspinner/tests/project_tests.rs +++ b/crates/yarnspinner/tests/project_tests.rs @@ -292,3 +292,78 @@ fn test_debug_output_is_produced() { assert_eq!(2, first_line_info.position.unwrap().line); assert_eq!(0, first_line_info.position.unwrap().character); } + +/// Quite a slow text (few seconds), it tagged over 30_000 lines. +#[test] +fn test_line_collision_tagging() { + let path_0 = test_data_path().join("TestCases/Duplicates/lipsum1.yarn"); + let path_1 = test_data_path().join("TestCases/Duplicates/lipsum2.yarn"); + let path_2 = test_data_path().join("TestCases/Duplicates/lipsum3.yarn"); + + // compiling the untagged but heavily duped files + // there should be no errors and no tags + let result = Compiler::new() + .read_file(&path_0) + .read_file(&path_1) + .read_file(&path_2) + .with_compilation_type(CompilationType::StringsOnly) + .compile() + .unwrap(); + + let total_lines = result.string_table.len(); + let total_untagged_lines = result + .string_table + .iter() + .filter(|(_, s)| s.is_implicit_tag) + .count(); + + // at this stage these should be the same + assert_eq!(total_untagged_lines, total_lines); + + let mut existing_tags = result + .string_table + .iter() + .filter(|(_, s)| !s.is_implicit_tag) + .map(|(id, _)| id) + .cloned() + .collect::>(); + + assert_eq!(existing_tags.len(), 0); + + // now we tag every line + // combine that into a new compilation job + // and see if there are any dupes + let mut tagged_line_content: Vec = Vec::new(); + for path in [path_0, path_1, path_2] { + let mut content = std::fs::read_to_string(path).unwrap(); + + // File may be in UTF-8 with BOM encoding + if content.starts_with('\u{FEFF}') { + content = content.strip_prefix('\u{FEFF}').unwrap().to_owned(); + } + + let (tagged_version, new_existing_tags) = Compiler::tag_lines(content, existing_tags) + .unwrap() + .unwrap(); + + tagged_line_content.push(tagged_version); + existing_tags = new_existing_tags + } + + let tagged_file = File { + file_name: "tagged".to_string(), + source: tagged_line_content.join("\n"), + }; + let result = Compiler::new().add_file(tagged_file).compile().unwrap(); + + let tagged_lines_count = result.string_table.len(); + assert_eq!(tagged_lines_count, total_lines); + + let total_untagged_lines = result + .string_table + .iter() + .filter(|(_, s)| s.is_implicit_tag) + .count(); + + assert_eq!(total_untagged_lines, 0); +} diff --git a/crates/yarnspinner/tests/tag_tests.rs b/crates/yarnspinner/tests/tag_tests.rs index 793fccd25..d47d2dbe1 100644 --- a/crates/yarnspinner/tests/tag_tests.rs +++ b/crates/yarnspinner/tests/tag_tests.rs @@ -174,3 +174,25 @@ fn test_line_is_last_before_another_node_not_tagged() { fn contains_last_line_tag(info: &StringInfo) -> bool { info.metadata.contains(&"lastline".to_owned()) } + +#[test] +fn test_comments_arent_tagged() { + let source = "title: Start\n---\n\\\\\n==="; + + // ensuring the base text compiles fine as is + let result = Compiler::from_test_source(source) + .with_compilation_type(CompilationType::StringsOnly) + .compile(); + + assert!(matches!(result, Ok(_))); + + // Tagging the lines + let (tagged_version, _) = Compiler::tag_lines(source, vec![]).unwrap().unwrap(); + + // recompiling, we should have no errors + let result = Compiler::from_test_source(&tagged_version) + .with_compilation_type(CompilationType::StringsOnly) + .compile(); + + assert!(matches!(result, Ok(_))); +} From 261c95b758ca74f472c9a3ade64f06d29aea01f4 Mon Sep 17 00:00:00 2001 From: Galdormin Date: Thu, 12 Feb 2026 23:08:32 +0100 Subject: [PATCH 06/14] migrate part of test_base and test_plan --- crates/yarnspinner/tests/tag_tests.rs | 4 +- crates/yarnspinner/tests/test_base/step.rs | 39 +++++++++++++++ .../tests/test_base/step/reader.rs | 10 ++-- .../yarnspinner/tests/test_base/test_plan.rs | 50 ++++++++++++++----- 4 files changed, 84 insertions(+), 19 deletions(-) diff --git a/crates/yarnspinner/tests/tag_tests.rs b/crates/yarnspinner/tests/tag_tests.rs index d47d2dbe1..d31edd251 100644 --- a/crates/yarnspinner/tests/tag_tests.rs +++ b/crates/yarnspinner/tests/tag_tests.rs @@ -184,7 +184,7 @@ fn test_comments_arent_tagged() { .with_compilation_type(CompilationType::StringsOnly) .compile(); - assert!(matches!(result, Ok(_))); + assert!(result.is_ok()); // Tagging the lines let (tagged_version, _) = Compiler::tag_lines(source, vec![]).unwrap().unwrap(); @@ -194,5 +194,5 @@ fn test_comments_arent_tagged() { .with_compilation_type(CompilationType::StringsOnly) .compile(); - assert!(matches!(result, Ok(_))); + assert!(result.is_ok()); } diff --git a/crates/yarnspinner/tests/test_base/step.rs b/crates/yarnspinner/tests/test_base/step.rs index 784a6a060..21f342502 100644 --- a/crates/yarnspinner/tests/test_base/step.rs +++ b/crates/yarnspinner/tests/test_base/step.rs @@ -17,6 +17,7 @@ pub(crate) struct Step { pub enum StepValue { String(String), Number(usize), + StringPair(String, String), } impl Step { @@ -53,6 +54,19 @@ impl Step { Self::with_value_and_type(value, expected_step_type) } ExpectedStepType::Stop => Self::with_expected_step_type(expected_step_type), + ExpectedStepType::Set => { + let variable_name = reader.read_next::(); + let value = reader.read_next::(); + + Self::with_value_and_type( + StepValue::StringPair(variable_name, value), + expected_step_type, + ) + } + ExpectedStepType::Run => { + let node_name = reader.read_next::(); + Self::with_value_and_type(node_name, expected_step_type) + } } } @@ -76,6 +90,17 @@ impl Step { Self::with_expected_step_type(ExpectedStepType::Stop) } + pub(crate) fn from_set(variable_name: impl Into, value: impl Into) -> Self { + Self::with_value_and_type( + StepValue::StringPair(variable_name.into(), value.into()), + ExpectedStepType::Set, + ) + } + + pub(crate) fn from_run(node_name: impl Into) -> Self { + Self::with_value_and_type(node_name.into(), ExpectedStepType::Run) + } + fn with_value_and_type( value: impl Into, expected_step_type: ExpectedStepType, @@ -155,6 +180,18 @@ pub enum ExpectedStepType { // expecting to stop the test here (this is optional - a // 'stop' at the end of a test plan is assumed) Stop, + + /// sets a variable to a value + Set, + + /// runs a new node. + Run, +} + +impl ExpectedStepType { + pub(crate) fn is_blocking(&self) -> bool { + !matches!(self, Self::Set | Self::Run) + } } impl FromStr for ExpectedStepType { @@ -167,6 +204,8 @@ impl FromStr for ExpectedStepType { "select" => Ok(Self::Select), "command" => Ok(Self::Command), "stop" => Ok(Self::Stop), + "set" => Ok(Self::Set), + "run" => Ok(Self::Run), _ => Err(()), } } diff --git a/crates/yarnspinner/tests/test_base/step/reader.rs b/crates/yarnspinner/tests/test_base/step/reader.rs index fb1940984..92c7333a1 100644 --- a/crates/yarnspinner/tests/test_base/step/reader.rs +++ b/crates/yarnspinner/tests/test_base/step/reader.rs @@ -42,11 +42,13 @@ impl<'a> Reader<'a> { continue; } string.push(character); - if let Some(next) = self.peek_char() - && !next.is_alphanumeric() - { - break; + + if let Some(next) = self.peek_char() { + if next.is_alphanumeric() || next == '_' { + continue; + } } + break; } string } diff --git a/crates/yarnspinner/tests/test_base/test_plan.rs b/crates/yarnspinner/tests/test_base/test_plan.rs index 15cce09aa..cc48724eb 100644 --- a/crates/yarnspinner/tests/test_base/test_plan.rs +++ b/crates/yarnspinner/tests/test_base/test_plan.rs @@ -55,19 +55,29 @@ impl TestPlan { for current_step in self.steps.iter().skip(self.current_test_plan_step) { self.current_test_plan_step += 1; - if current_step.expected_step_type == ExpectedStepType::Option { - let Some(StepValue::String(line)) = current_step.value.clone() else { - panic!("Expected option line to be a string"); - }; - - self.next_expected_options.push(ProcessedOption { - line, - enabled: current_step.expect_option_enabled, - }); - } else { - self.next_expected_step = current_step.expected_step_type; - self.next_step_value.clone_from(¤t_step.value); - return; + + match current_step.expected_step_type { + ExpectedStepType::Option => { + let Some(StepValue::String(line)) = current_step.value.clone() else { + panic!("Expected option line to be a string"); + }; + + self.next_expected_options.push(ProcessedOption { + line, + enabled: current_step.expect_option_enabled, + }); + } + ExpectedStepType::Line | ExpectedStepType::Command | ExpectedStepType::Select => { + self.next_expected_step = current_step.expected_step_type; + self.next_step_value.clone_from(¤t_step.value); + return; + } + ExpectedStepType::Stop => { + self.next_expected_step = current_step.expected_step_type; + return; + } + ExpectedStepType::Set => todo!(), + ExpectedStepType::Run => todo!(), } } @@ -76,6 +86,10 @@ impl TestPlan { self.next_expected_step = ExpectedStepType::Stop; } + pub fn current_step(self) -> Step { + self.steps[self.current_test_plan_step].clone() + } + pub fn expect_line(mut self, line: impl Into) -> Self { self.steps.push(Step::from_line(line)); self @@ -96,6 +110,16 @@ impl TestPlan { self } + pub fn then_set(mut self, variable_name: impl Into, value: impl Into) -> Self { + self.steps.push(Step::from_set(variable_name, value)); + self + } + + pub fn then_run(mut self, node_name: impl Into) -> Self { + self.steps.push(Step::from_run(node_name)); + self + } + pub fn expect_stop(mut self) -> Self { self.steps.push(Step::from_stop()); self From cb1bbfd6ae55b5dfd3d04933e46ec97ab4b75905 Mon Sep 17 00:00:00 2001 From: Galdormin Date: Sat, 28 Feb 2026 10:25:28 +0100 Subject: [PATCH 07/14] migrate YarnSpinner.Compiler/Project.cs --- Cargo.lock | 28 ++- crates/compiler/Cargo.toml | 7 +- crates/compiler/src/lib.rs | 2 + crates/compiler/src/project.rs | 233 ++++++++++++++++++ .../yarnspinner/tests/project_file_tests.rs | 157 ++++++++++++ .../tests/test_base/step/reader.rs | 8 +- 6 files changed, 428 insertions(+), 7 deletions(-) create mode 100644 crates/compiler/src/project.rs create mode 100644 crates/yarnspinner/tests/project_file_tests.rs diff --git a/Cargo.lock b/Cargo.lock index 098f7411d..a4e0f60da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1786,6 +1786,16 @@ dependencies = [ "piper", ] +[[package]] +name = "bstr" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "bumpalo" version = "3.19.0" @@ -2795,6 +2805,19 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +[[package]] +name = "globset" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + [[package]] name = "glow" version = "0.16.0" @@ -3118,7 +3141,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown 0.15.5", + "hashbrown 0.16.1", "serde", "serde_core", ] @@ -6576,10 +6599,13 @@ dependencies = [ "better_any", "bevy", "crc32fast", + "globset", "instant", "rand", "regex", "serde", + "serde_json", + "walkdir", "yarnspinner_core", "yarnspinner_internal_shared", ] diff --git a/crates/compiler/Cargo.toml b/crates/compiler/Cargo.toml index add21e755..c844d5f21 100644 --- a/crates/compiler/Cargo.toml +++ b/crates/compiler/Cargo.toml @@ -11,7 +11,7 @@ description = "Compiler for Yarn Spinner for Rust, the friendly tool for writing [features] default = [ ] -serde = [ "dep:serde", "bevy?/serialize", "yarnspinner_core/serde" ] +serde = [ "dep:serde", "dep:serde_json", "bevy?/serialize", "yarnspinner_core/serde" ] bevy = [ "dep:bevy", "yarnspinner_core/bevy" ] [dependencies] @@ -22,9 +22,12 @@ yarnspinner_internal_shared = { path = "../internal_shared", version = "0.1.0" } yarnspinner_core = { path = "../core", version = "0.7.0" } annotate-snippets = "0.10" serde = { version = "1", features = [ "derive" ], optional = true } +serde_json = { version = "1", optional = true } bevy = { version = "0.18", default-features = false, optional = true } rand = { version = "0.9", features = [ "small_rng" ] } -crc32fast = "1.5.0" +crc32fast = "1.5" +globset = "0.4" +walkdir = "2.5" [target.'cfg(target_arch = "wasm32")'.dependencies] instant = { version = "0.1.12", features = [ diff --git a/crates/compiler/src/lib.rs b/crates/compiler/src/lib.rs index 26c1925ee..8d64c4636 100644 --- a/crates/compiler/src/lib.rs +++ b/crates/compiler/src/lib.rs @@ -17,6 +17,7 @@ pub(crate) mod listeners; mod output; mod parser; pub(crate) mod parser_rule_context_ext; +pub mod project; mod string_table_manager; pub(crate) mod token_ext; pub(crate) mod visitors; @@ -34,6 +35,7 @@ pub mod prelude { compiler::{CompilationType, Compiler, File}, listeners::{Diagnostic, DiagnosticSeverity, DiagnosticVec}, output::*, + project::*, }; pub(crate) use yarnspinner_core::prelude::*; pub(crate) use yarnspinner_internal_shared::prelude::*; diff --git a/crates/compiler/src/project.rs b/crates/compiler/src/project.rs new file mode 100644 index 000000000..230c7a646 --- /dev/null +++ b/crates/compiler/src/project.rs @@ -0,0 +1,233 @@ +//! Adapted from + +use std::path::Path; +use std::{collections::HashMap, path::PathBuf}; + +use globset::{Glob, GlobSet, GlobSetBuilder}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; +use walkdir::WalkDir; + +/// Current version of the .yarnproject +pub const CURRENT_PROJECT_FILE_VERSION: u32 = 2; + +/// Yarn Projects represent instructions on where to find Yarn scripts and +/// associated assets, and how they should be compiled. +#[derive(Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] +pub struct Project { + /// Gets or sets the file version of the project. + /// + /// This value is required to be equal to [`CURRENT_PROJECT_FILE_VERSION`] + pub project_file_version: u32, + + /// Gets the path that the [`Project`]` was loaded from. + /// + /// This value is not stored when the file is saved, but is instead + /// determined when the file is loaded by [`self::load_from_file()`] + #[cfg_attr(feature = "serde", serde(skip))] + pub path: Option, + + /// Gets or sets the collection of file search patterns used to locate + /// Yarn files that form this project. + #[cfg_attr( + feature = "serde", + serde(rename = "sourceFiles", default = "default_source_files") + )] + pub source_file_patterns: Vec, + + /// Gets or sets the collection of file search patterns that should be + /// excluded from this project. + /// + /// If a file is matched by a pattern in `source_file_patterns`, and is also matched + /// by a pattern in `exclude_file_patterns`, then it is not included in the value + /// returned by `source_files()` + #[cfg_attr(feature = "serde", serde(rename = "excludeFiles", default))] + pub exclude_file_patterns: Vec, + + /// Gets or sets the collection of [`LocalizationInfo`] + /// objects that store information about where localized data for this + /// project is found. + #[cfg_attr(feature = "serde", serde(default))] + pub localisation: HashMap, + + /// Gets or sets the base language of the project, as an IETF BCP-47 + /// language tag. + /// + /// The base language is the language that the Yarn scripts is written in + pub base_language: String, + + /// Gets or sets the path to a JSON file containing command and function + /// definitions that this project references. + /// + /// Definitions files are used by editing tools to provide type + /// information and other externally-defined data used by the Yarn scripts. + #[cfg_attr(feature = "serde", serde(default))] + pub definitions: Option, + + /// Gets or sets a dictionary containing instructions that control how + /// the Yarn Spinner compiler should compile a project. + /// + /// Note: Unsure about the type of options. No documentation in v2.5.0. + #[cfg_attr(feature = "serde", serde(default))] + pub compiler_options: HashMap, +} + +fn default_source_files() -> Vec { + vec!["**/*.yarn".to_owned()] +} + +/// Stores the locations of where localized assets and a localized +/// string table for a Yarn Project may be found. +#[derive(Debug, Clone, PartialEq)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +pub struct LocalizationInfo { + /// Gets or sets the location at which localized assets may be found. + #[cfg_attr(feature = "serde", serde(default))] + pub assets: Option, + /// Gets or sets the location at which the localized string table may be found. + #[cfg_attr(feature = "serde", serde(default))] + pub strings: Option, +} + +impl Default for Project { + fn default() -> Self { + Self { + project_file_version: CURRENT_PROJECT_FILE_VERSION, + path: Default::default(), + source_file_patterns: default_source_files(), + exclude_file_patterns: Default::default(), + localisation: Default::default(), + base_language: Default::default(), + definitions: Default::default(), + compiler_options: Default::default(), + } + } +} + +impl Project { + /// Replaces the path used by the [`Project`]. + pub fn with_path(mut self, path: PathBuf) -> Self { + self.path = Some(path); + self + } + + /// Replaces the source files used by the [`Project`]. + pub fn with_source_files(mut self, source_files: Vec) -> Self { + self.source_file_patterns = source_files; + self + } + + /// Loads and parses a [`Project`] from a file on disk. + #[cfg(feature = "serde")] + pub fn load_from_file>(path: P) -> Result { + let text = + std::fs::read_to_string(&path).map_err(|e| format!("Cannot open project file: {e}"))?; + + let mut project: Project = + serde_json::from_str(&text).map_err(|e| format!("Invalid JSON: {e}"))?; + + if project.project_file_version != CURRENT_PROJECT_FILE_VERSION { + return Err(format!( + "Incorrect project file version (expected {}, got {})", + CURRENT_PROJECT_FILE_VERSION, project.project_file_version + )); + } + + project.path = Some(path.as_ref().to_path_buf()); + Ok(project) + } + + /// Gets a string containing JSON-formatted text that represents this [`Project`] + #[cfg(feature = "serde")] + pub fn to_json(&self) -> String { + serde_json::to_string_pretty(self).unwrap() + } + + /// Saves a [`Project`] as JSON-formatted text to a file on disk + #[cfg(feature = "serde")] + pub fn save_to_file>(&self, path: P) -> Result<(), String> { + std::fs::write(path, self.to_json()).map_err(|e| format!("Cannot write project file: {e}")) + } + + /// Gets the path of the directory from which to start searching for .yarn + /// files. This value is null if the directory does not exist on disk. + fn search_directory(&self) -> Option { + let path = self.path.as_ref()?; + + if path.is_dir() { + // This project refers to a directory on disk. + Some(path.clone()) + } else if path.is_file() { + // This project refers to a .yarnproject on disk. + path.parent().map(|p| p.to_path_buf()) + } else { + // This project does not refer to a file on disk or to a directory. + None + } + } + + /// Build the [`GlobSet`] based on source files. + fn build_source_globset(&self) -> GlobSet { + let mut builder = GlobSetBuilder::new(); + + for pattern in &self.source_file_patterns { + builder.add(Glob::new(pattern).unwrap()); + } + + builder.build().unwrap() + } + + /// Build the [`GlobSet`] based on exclude files. + fn build_exclude_globset(&self) -> GlobSet { + let mut builder = GlobSetBuilder::new(); + + for pattern in &self.exclude_file_patterns { + builder.add(Glob::new(pattern).unwrap()); + } + + builder.build().unwrap() + } + + /// Gets the collection of Yarn files that should be used to compile the project. + /// + /// This collection uses a [`GlobSet`] to find all files specified by `source_files`, + /// excluding those that are specified by `exclude_files`. + pub fn source_files(&self) -> Vec { + let Some(root) = self.search_directory() else { + return Vec::new(); + }; + + let source_matcher = self.build_source_globset(); + let exclude_matcher = self.build_exclude_globset(); + + WalkDir::new(&root) + .into_iter() + .filter_map(Result::ok) + .map(|e| e.path().to_path_buf()) + .filter(|path| source_matcher.is_match(path) && !exclude_matcher.is_match(path)) + .collect() + } + + /// Gets the path to the Definitions file, relative to this project's location. + pub fn definitions_path(&self) -> Option { + let root = self.search_directory()?; + let defs = self.definitions.as_ref()?; + Some(root.join(defs)) + } + + /// Gets a value indicating whether the given path is a path + /// that is included in this project. + pub fn is_matching_path>(&self, path: P) -> bool { + let Some(root) = self.search_directory() else { + return false; + }; + + let full_path = root.join(path); + + let source_matcher = self.build_source_globset(); + let exclude_matcher = self.build_exclude_globset(); + source_matcher.is_match(&full_path) && !exclude_matcher.is_match(&full_path) + } +} diff --git a/crates/yarnspinner/tests/project_file_tests.rs b/crates/yarnspinner/tests/project_file_tests.rs new file mode 100644 index 000000000..6582b1dc4 --- /dev/null +++ b/crates/yarnspinner/tests/project_file_tests.rs @@ -0,0 +1,157 @@ +//! Adapted from +#![cfg(feature = "serde")] + +use std::env; + +use test_base::prelude::*; +use yarnspinner::compiler::*; + +mod test_base; + +#[test] +fn test_project_file_can_be_loaded() { + // Given + let path = space_demo_scripts_path().join("Space.yarnproject"); + let project = Project::load_from_file(path.clone()).unwrap(); + + // Then + assert_eq!(project.project_file_version, 2); + assert_eq!(project.path, Some(path)); + assert_eq!(project.source_file_patterns, vec!["**/*.yarn"]); + + assert_eq!(project.base_language, "en"); + assert_eq!(project.definitions, Some("Functions.ysls.json".to_owned())); + + assert!(project.localisation.contains_key("en")); + assert_eq!( + *project.localisation.get("en").unwrap(), + LocalizationInfo { + assets: Some("../LocalisedAssets/English".to_owned()), + strings: None + } + ); + + assert!(project.localisation.contains_key("de")); + assert_eq!( + *project.localisation.get("de").unwrap(), + LocalizationInfo { + assets: Some("../LocalisedAssets/German".to_owned()), + strings: Some("../German.csv".to_owned()) + } + ); +} + +#[test] +fn test_projects_can_find_files() { + // Given + let path = space_demo_scripts_path().join("Space.yarnproject"); + let project = Project::load_from_file(path.clone()).unwrap(); + + // When + let relative_files = project + .source_files() + .iter() + .map(|f| f.file_name().unwrap().to_owned()) + .collect::>(); + + //Then + assert!(relative_files.contains(&"Sally.yarn".to_string().into())); + assert!(relative_files.contains(&"Ship.yarn".to_string().into())); + assert!(!relative_files.contains(&"Space.yarnproject".to_string().into())); +} + +#[test] +fn test_projects_can_exclude_files() { + // Given + let path = space_demo_scripts_path().join("Space.yarnproject"); + let mut project = Project::load_from_file(path.clone()).unwrap(); + project.exclude_file_patterns.push("Sally.yarn".to_owned()); + + // When + let relative_files = project + .source_files() + .iter() + .map(|f| f.file_name().unwrap().to_owned()) + .collect::>(); + + //Then + assert!(relative_files.contains(&"Sally.yarn".to_string().into())); + assert!(!relative_files.contains(&"Ship.yarn".to_string().into())); + assert!(!relative_files.contains(&"Space.yarnproject".to_string().into())); +} + +#[test] +fn test_projects_can_save() { + // Given + let project = Project::default(); + let path = env::temp_dir().join("test_projects_can_save.yarnproject"); + println!( + "Temporary file for test_projects_can_save is {}", + path.to_str().unwrap() + ); + + // When + project.save_to_file(&path).unwrap(); + let loaded_project = Project::load_from_file(&path).unwrap(); + + // Then + assert_eq!( + project.project_file_version, + loaded_project.project_file_version + ); + assert_eq!( + project.source_file_patterns, + loaded_project.source_file_patterns + ); + assert_eq!( + project.exclude_file_patterns, + loaded_project.exclude_file_patterns + ); + assert_eq!(project.localisation, loaded_project.localisation); + assert_eq!(project.base_language, loaded_project.base_language); + assert_eq!(project.definitions, loaded_project.definitions); + assert_eq!(project.compiler_options, loaded_project.compiler_options); +} + +#[test] +fn test_projects_can_be_modified_and_saved() { + // Given + let path = space_demo_scripts_path().join("Space.yarnproject"); + let mut project = Project::load_from_file(path.clone()).unwrap(); + + project.localisation.insert( + "fr".to_owned(), + LocalizationInfo { + assets: Some("./French/".to_owned()), + strings: Some("French.csv".to_owned()), + }, + ); + + // When + + let path = env::temp_dir().join("test_projects_can_be_modified_and_saved.yarnproject"); + println!( + "Temporary file for test_projects_can_be_modified_and_saved is {}", + path.to_str().unwrap() + ); + project.save_to_file(&path).unwrap(); + let loaded_project = Project::load_from_file(&path).unwrap(); + + // Then + assert_eq!( + project.project_file_version, + loaded_project.project_file_version + ); + assert_eq!( + project.source_file_patterns, + loaded_project.source_file_patterns + ); + assert_eq!( + project.exclude_file_patterns, + loaded_project.exclude_file_patterns + ); + assert_eq!(project.localisation, loaded_project.localisation); + assert_eq!(project.base_language, loaded_project.base_language); + assert_eq!(project.definitions, loaded_project.definitions); + assert_eq!(project.compiler_options, loaded_project.compiler_options); +} diff --git a/crates/yarnspinner/tests/test_base/step/reader.rs b/crates/yarnspinner/tests/test_base/step/reader.rs index 92c7333a1..c23ff1dc3 100644 --- a/crates/yarnspinner/tests/test_base/step/reader.rs +++ b/crates/yarnspinner/tests/test_base/step/reader.rs @@ -43,10 +43,10 @@ impl<'a> Reader<'a> { } string.push(character); - if let Some(next) = self.peek_char() { - if next.is_alphanumeric() || next == '_' { - continue; - } + if let Some(next) = self.peek_char() + && (next.is_alphanumeric() || next == '_') + { + continue; } break; } From 246ad07056d6de2c4f350c7917ab62a3b45b1e5b Mon Sep 17 00:00:00 2001 From: Galdormin Date: Sat, 28 Feb 2026 12:00:31 +0100 Subject: [PATCH 08/14] update CI to include serde a feature + --no-fail-test --- .github/workflows/ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2b6d60001..562d293a1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -101,7 +101,8 @@ jobs: LD_LIBRARY_PATH="$(rustc --print target-libdir)" \ cargo test --workspace --features=bevy/dynamic_linking \ --lib --bins --tests --examples \ - --exclude yarnspinner_without_bevy_examples + --exclude yarnspinner_without_bevy_examples \ + --no-fail-test test-bevy-docs: name: Test Docs with Bevy @@ -151,7 +152,7 @@ jobs: - name: Install alsa and udev run: sudo apt-get update; sudo apt-get install --no-install-recommends libasound2-dev libudev-dev libwayland-dev libxkbcommon-dev - name: Run cargo test for non-bevy - run: cargo test --no-default-features -p yarnspinner -p yarnspinner_without_bevy_examples + run: cargo test --no-default-features --features=serde -p yarnspinner -p yarnspinner_without_bevy_examples --no-fail-test - name: Run doc tests for non-bevy run: LD_LIBRARY_PATH="$(rustc --print target-libdir)" cargo test --doc --no-default-features -p yarnspinner -p yarnspinner_without_bevy_examples From 68a3466907a41f869304cbf7e001d68c8b49722e Mon Sep 17 00:00:00 2001 From: Galdormin Date: Sat, 28 Feb 2026 12:03:29 +0100 Subject: [PATCH 09/14] fix typo in --no-fail-fast --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 562d293a1..8da3c6326 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -102,7 +102,7 @@ jobs: cargo test --workspace --features=bevy/dynamic_linking \ --lib --bins --tests --examples \ --exclude yarnspinner_without_bevy_examples \ - --no-fail-test + --no-fail-fast test-bevy-docs: name: Test Docs with Bevy @@ -152,7 +152,7 @@ jobs: - name: Install alsa and udev run: sudo apt-get update; sudo apt-get install --no-install-recommends libasound2-dev libudev-dev libwayland-dev libxkbcommon-dev - name: Run cargo test for non-bevy - run: cargo test --no-default-features --features=serde -p yarnspinner -p yarnspinner_without_bevy_examples --no-fail-test + run: cargo test --no-default-features --features=serde -p yarnspinner -p yarnspinner_without_bevy_examples --no-fail-fast - name: Run doc tests for non-bevy run: LD_LIBRARY_PATH="$(rustc --print target-libdir)" cargo test --doc --no-default-features -p yarnspinner -p yarnspinner_without_bevy_examples From d8a427327e254dc5f35c1b4ad49b1f21e7febabe Mon Sep 17 00:00:00 2001 From: Galdormin Date: Sat, 28 Feb 2026 12:30:31 +0100 Subject: [PATCH 10/14] fix populates_string_table test --- .../compiler/src/visitors/string_table_generator_visitor.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/compiler/src/visitors/string_table_generator_visitor.rs b/crates/compiler/src/visitors/string_table_generator_visitor.rs index dde252ab9..c0d7ef7fb 100644 --- a/crates/compiler/src/visitors/string_table_generator_visitor.rs +++ b/crates/compiler/src/visitors/string_table_generator_visitor.rs @@ -266,7 +266,7 @@ a {1 + 3} cool expression let string_table = result.string_table; assert_eq!(string_table.len(), 3); assert_eq!( - string_table[&"line:test.yarn-test-0".into()], + string_table[&"line:1337986088".into()], StringInfo { text: "foo".to_string(), node_name: "test".to_string(), @@ -277,7 +277,7 @@ a {1 + 3} cool expression } ); assert_eq!( - string_table[&"line:test.yarn-test-1".into()], + string_table[&"line:952581310".into()], StringInfo { text: "bar".to_string(), node_name: "test".to_string(), @@ -288,7 +288,7 @@ a {1 + 3} cool expression } ); assert_eq!( - string_table[&"line:test.yarn-test-2".into()], + string_table[&"line:2714660100".into()], StringInfo { text: "a {0} cool expression".to_string(), node_name: "test".to_string(), From 28430a75131ddc9d527c567c34bad06440d8b533 Mon Sep 17 00:00:00 2001 From: Galdormin Date: Sat, 28 Feb 2026 15:14:09 +0100 Subject: [PATCH 11/14] migrate Dialogue.cs --- Cargo.lock | 231 ++++++++++++++++++++++++-- crates/core/Cargo.toml | 25 ++- crates/core/src/library.rs | 14 ++ crates/runtime/src/virtual_machine.rs | 5 + 4 files changed, 246 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a4e0f60da..bff3d404f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -92,7 +92,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.3.3", "once_cell", "version_check", "zerocopy", @@ -1033,7 +1033,7 @@ dependencies = [ "glam", "itertools 0.14.0", "libm", - "rand", + "rand 0.9.2", "rand_distr", "serde", "thiserror 2.0.17", @@ -1642,7 +1642,7 @@ dependencies = [ "bevy", "csv", "glob", - "rand", + "rand 0.9.2", "serde", "sha2", "static_assertions", @@ -1660,7 +1660,7 @@ dependencies = [ "bevy_sprite3d", "bevy_yarnspinner", "bevy_yarnspinner_example_dialogue_view", - "getrandom", + "getrandom 0.3.3", ] [[package]] @@ -1920,6 +1920,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.0", +] + [[package]] name = "clang-sys" version = "1.8.1" @@ -2167,6 +2178,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -2741,6 +2761,20 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "rand_core 0.10.0", + "wasip2", + "wasip3", +] + [[package]] name = "gilrs" version = "0.11.0" @@ -2795,7 +2829,7 @@ dependencies = [ "bytemuck", "encase", "libm", - "rand", + "rand 0.9.2", "serde_core", ] @@ -3121,6 +3155,12 @@ dependencies = [ "syn", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "image" version = "0.25.8" @@ -3264,7 +3304,7 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom", + "getrandom 0.3.3", "libc", ] @@ -3330,6 +3370,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "lewton" version = "0.10.2" @@ -4426,7 +4472,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha", - "rand_core", + "rand_core 0.9.3", +] + +[[package]] +name = "rand" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +dependencies = [ + "chacha20", + "getrandom 0.4.1", + "rand_core 0.10.0", ] [[package]] @@ -4436,7 +4493,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.9.3", ] [[package]] @@ -4445,9 +4502,15 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom", + "getrandom 0.3.3", ] +[[package]] +name = "rand_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" + [[package]] name = "rand_distr" version = "0.5.1" @@ -4455,7 +4518,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand", + "rand 0.9.2", ] [[package]] @@ -4714,6 +4777,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + [[package]] name = "send_wrapper" version = "0.6.0" @@ -4770,7 +4839,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -5058,7 +5127,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom", + "getrandom 0.3.3", "once_cell", "rustix 1.1.2", "windows-sys 0.61.2", @@ -5406,7 +5475,7 @@ version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom", + "getrandom 0.3.3", "js-sys", "serde", "wasm-bindgen", @@ -5472,7 +5541,16 @@ version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.46.0", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", ] [[package]] @@ -5534,6 +5612,40 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.9.4", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + [[package]] name = "wayland-backend" version = "0.3.11" @@ -6499,6 +6611,94 @@ version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.9.4", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + [[package]] name = "writeable" version = "0.5.5" @@ -6601,7 +6801,7 @@ dependencies = [ "crc32fast", "globset", "instant", - "rand", + "rand 0.9.2", "regex", "serde", "serde_json", @@ -6617,6 +6817,7 @@ dependencies = [ "bevy", "hashbrown 0.15.5", "prost", + "rand 0.10.0", "serde", "static_assertions", "variadics_please", diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 0fb097244..3ffc517b7 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -4,28 +4,25 @@ version = "0.7.0" edition = "2024" repository = "https://github.com/YarnSpinnerTool/YarnSpinner-Rust" homepage = "https://docs.yarnspinner.dev/" -categories = ["game-development", "compilers"] -authors = ["Jan Hohenheim "] +categories = [ "game-development", "compilers" ] +authors = [ "Jan Hohenheim " ] license = "MIT OR Apache-2.0" description = "Core concepts for Yarn Spinner for Rust, the friendly tool for writing game dialogue" [features] -default = ["std"] -std = ["prost/std"] -serde = ["dep:serde", "bevy?/serialize", "hashbrown/serde"] -bevy = ["dep:bevy"] +default = [ "std" ] +std = [ "prost/std" ] +serde = [ "dep:serde", "bevy?/serialize", "hashbrown/serde" ] +bevy = [ "dep:bevy" ] [dependencies] -prost = { version = "0.12", default-features = false, features = [ - "prost-derive", -] } -serde = { version = "1", features = ["derive"], optional = true } -bevy = { version = "0.18", default-features = false, optional = true, features = [ - "std", -] } +rand = { version = "0.10", default-features = false, features = [ "thread_rng" ] } +prost = { version = "0.12", default-features = false, features = [ "prost-derive" ] } +serde = { version = "1", features = [ "derive" ], optional = true } +bevy = { version = "0.18", default-features = false, optional = true, features = [ "std" ] } variadics_please = "1.1.0" hashbrown = "0.15.2" -yarnspinner_internal_shared = {path = "../internal_shared", version = "0.1.0"} +yarnspinner_internal_shared = { path = "../internal_shared", version = "0.1.0" } [dev-dependencies] static_assertions = "1.1.0" diff --git a/crates/core/src/library.rs b/crates/core/src/library.rs index 1e8ef7765..5cae8946c 100644 --- a/crates/core/src/library.rs +++ b/crates/core/src/library.rs @@ -76,6 +76,20 @@ impl Library { "string" => >::from, "number" => |value: YarnValue| f32::try_from(value).expect("Failed to convert a Yarn value to a number"), "bool" => |value: YarnValue| bool::try_from(value).expect("Failed to convert a Yarn value to a bool"), + "format_invariant" => |value: f32| value.to_string(), + "random" => || rand::random::(), + "random_range" => |min: i32, max: i32| rand::random_range::(min..max), + "random_range_float" => |min: f32, max: f32| rand::random_range::(min..=max), + "dice" => |sides: u32| rand::random_range::(1..=sides), + "round" => |value: f32| value.round(), + // "round_places" => Cannot round_places in rust + "floor" => |value: f32| value.floor(), + "ceil" => |value: f32| value.ceil(), + "inc" => |value: f32| value.floor() as i32 + 1, + "dec" => |value: f32| value.ceil() as i32 - 1, + "decimal" => |value: f32| value.fract(), + "int" => |value: f32| value.trunc(), + // "format" => TODO: Need to implement an equivalent to C# formatter ); for r#type in [Type::Number, Type::String, Type::Boolean] { library.add_methods(r#type); diff --git a/crates/runtime/src/virtual_machine.rs b/crates/runtime/src/virtual_machine.rs index 6a5a26d94..430b26883 100644 --- a/crates/runtime/src/virtual_machine.rs +++ b/crates/runtime/src/virtual_machine.rs @@ -653,6 +653,11 @@ fn assert_up_to_date_compiler(predicate: bool) { /// ignored. #[must_use] fn expand_substitutions(text: &str, substitutions: &[String]) -> String { + if substitutions.is_empty() { + // if we have no substitutions we want to just return the text as is + return text.to_owned(); + } + substitutions .iter() .enumerate() From 9778fc42148a971f617cd862e6e945dfd883f9bb Mon Sep 17 00:00:00 2001 From: Galdormin Date: Sun, 1 Mar 2026 08:31:32 +0100 Subject: [PATCH 12/14] use rust globset syntax for exclude file patterns --- crates/compiler/src/project.rs | 3 +++ crates/core/src/library.rs | 2 +- crates/yarnspinner/tests/project_file_tests.rs | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/compiler/src/project.rs b/crates/compiler/src/project.rs index 230c7a646..7cc036084 100644 --- a/crates/compiler/src/project.rs +++ b/crates/compiler/src/project.rs @@ -43,6 +43,9 @@ pub struct Project { /// If a file is matched by a pattern in `source_file_patterns`, and is also matched /// by a pattern in `exclude_file_patterns`, then it is not included in the value /// returned by `source_files()` + /// + /// Note: Unlike what is done in the C# version, you need to use the [`globset`] syntax to exclude a file. + /// `**/Ship.yarn`` to exclude all files named *Ship.yarn*. #[cfg_attr(feature = "serde", serde(rename = "excludeFiles", default))] pub exclude_file_patterns: Vec, diff --git a/crates/core/src/library.rs b/crates/core/src/library.rs index 5cae8946c..32cba35bf 100644 --- a/crates/core/src/library.rs +++ b/crates/core/src/library.rs @@ -77,7 +77,7 @@ impl Library { "number" => |value: YarnValue| f32::try_from(value).expect("Failed to convert a Yarn value to a number"), "bool" => |value: YarnValue| bool::try_from(value).expect("Failed to convert a Yarn value to a bool"), "format_invariant" => |value: f32| value.to_string(), - "random" => || rand::random::(), + "random" => rand::random::, "random_range" => |min: i32, max: i32| rand::random_range::(min..max), "random_range_float" => |min: f32, max: f32| rand::random_range::(min..=max), "dice" => |sides: u32| rand::random_range::(1..=sides), diff --git a/crates/yarnspinner/tests/project_file_tests.rs b/crates/yarnspinner/tests/project_file_tests.rs index 6582b1dc4..cb379cfa3 100644 --- a/crates/yarnspinner/tests/project_file_tests.rs +++ b/crates/yarnspinner/tests/project_file_tests.rs @@ -65,7 +65,9 @@ fn test_projects_can_exclude_files() { // Given let path = space_demo_scripts_path().join("Space.yarnproject"); let mut project = Project::load_from_file(path.clone()).unwrap(); - project.exclude_file_patterns.push("Sally.yarn".to_owned()); + project + .exclude_file_patterns + .push("**/Ship.yarn".to_owned()); // When let relative_files = project From 63c94d7f5eea9d464e0e8d64ba906fe3a18add45 Mon Sep 17 00:00:00 2001 From: Galdormin Date: Sun, 1 Mar 2026 14:05:12 +0100 Subject: [PATCH 13/14] migrate TestPlan + TestBase --- crates/yarnspinner/tests/dialogue_tests.rs | 10 ++++-- crates/yarnspinner/tests/language_tests.rs | 2 +- crates/yarnspinner/tests/test_base/mod.rs | 19 ++++++++--- crates/yarnspinner/tests/test_base/step.rs | 5 +++ .../yarnspinner/tests/test_base/test_plan.rs | 32 ++++++++++++++++--- 5 files changed, 55 insertions(+), 13 deletions(-) diff --git a/crates/yarnspinner/tests/dialogue_tests.rs b/crates/yarnspinner/tests/dialogue_tests.rs index 3e182dfea..92151232b 100644 --- a/crates/yarnspinner/tests/dialogue_tests.rs +++ b/crates/yarnspinner/tests/dialogue_tests.rs @@ -306,7 +306,7 @@ fn test_selecting_option_from_inside_option_callback() { match event { DialogueEvent::Line(line) => { let test_plan = test_base.test_plan.as_mut().unwrap(); - test_plan.next(); + test_plan.next(&mut test_base.dialogue); let expected_step = test_plan.next_expected_step; let expected_value = test_plan.next_step_value.clone().unwrap(); @@ -314,7 +314,11 @@ fn test_selecting_option_from_inside_option_callback() { assert_eq!(StepValue::String(line.text), expected_value); } DialogueEvent::Options(options) => { - test_base.test_plan.as_mut().unwrap().next(); + test_base + .test_plan + .as_mut() + .unwrap() + .next(&mut test_base.dialogue); let actual_options: Vec<_> = options .into_iter() .map(|o| ProcessedOption { @@ -332,7 +336,7 @@ fn test_selecting_option_from_inside_option_callback() { } DialogueEvent::DialogueComplete => { let test_plan = test_base.test_plan.as_mut().unwrap(); - test_plan.next(); + test_plan.next(&mut test_base.dialogue); let expected_step = test_plan.next_expected_step; assert_eq!(ExpectedStepType::Stop, expected_step); } diff --git a/crates/yarnspinner/tests/language_tests.rs b/crates/yarnspinner/tests/language_tests.rs index ee700ef1a..3d17db9e0 100644 --- a/crates/yarnspinner/tests/language_tests.rs +++ b/crates/yarnspinner/tests/language_tests.rs @@ -232,7 +232,7 @@ fn test_sources() { #[test] #[should_panic] fn crashes_on_command_expression_evaluating_whitespace() { - let result = Compiler::from_test_source("<<{0} {\" \"}>>") + let result = Compiler::from_test_source("<<{\"\"}{\" \"}>>") .compile() .unwrap(); TestBase::new() diff --git a/crates/yarnspinner/tests/test_base/mod.rs b/crates/yarnspinner/tests/test_base/mod.rs index 7cf652d75..a0402ef26 100644 --- a/crates/yarnspinner/tests/test_base/mod.rs +++ b/crates/yarnspinner/tests/test_base/mod.rs @@ -152,6 +152,15 @@ impl TestBase { #[cfg(feature = "bevy")] let mut world = World::default(); + if let Some(test_plan) = self.test_plan.as_mut() { + while test_plan + .current_step() + .is_some_and(|step| !step.expected_step_type.is_blocking()) + { + test_plan.next(&mut self.dialogue); + } + } + while self.dialogue.can_continue() { #[cfg(feature = "bevy")] let events = self @@ -171,7 +180,7 @@ impl TestBase { let Some(test_plan) = self.test_plan.as_mut() else { continue; }; - test_plan.next(); + test_plan.next(&mut self.dialogue); assert_eq!( ExpectedStepType::Line, @@ -202,7 +211,7 @@ impl TestBase { continue; }; - test_plan.next(); + test_plan.next(&mut self.dialogue); assert_eq!( ExpectedStepType::Select, test_plan.next_expected_step, @@ -229,7 +238,8 @@ impl TestBase { let Some(test_plan) = self.test_plan.as_mut() else { continue; }; - test_plan.next(); + + test_plan.next(&mut self.dialogue); assert_eq!( ExpectedStepType::Command, test_plan.next_expected_step, @@ -255,7 +265,8 @@ impl TestBase { let Some(test_plan) = self.test_plan.as_mut() else { continue; }; - test_plan.next(); + + test_plan.next(&mut self.dialogue); assert_eq!( ExpectedStepType::Stop, test_plan.next_expected_step, diff --git a/crates/yarnspinner/tests/test_base/step.rs b/crates/yarnspinner/tests/test_base/step.rs index 21f342502..52e984338 100644 --- a/crates/yarnspinner/tests/test_base/step.rs +++ b/crates/yarnspinner/tests/test_base/step.rs @@ -58,6 +58,11 @@ impl Step { let variable_name = reader.read_next::(); let value = reader.read_next::(); + assert!( + variable_name.starts_with("$"), + "Variables must start with $" + ); + Self::with_value_and_type( StepValue::StringPair(variable_name, value), expected_step_type, diff --git a/crates/yarnspinner/tests/test_base/test_plan.rs b/crates/yarnspinner/tests/test_base/test_plan.rs index cc48724eb..e0cc44e2c 100644 --- a/crates/yarnspinner/tests/test_base/test_plan.rs +++ b/crates/yarnspinner/tests/test_base/test_plan.rs @@ -40,7 +40,7 @@ impl TestPlan { } } - pub fn next(&mut self) { + pub fn next(&mut self, dialogue: &mut Dialogue) { // step through the test plan until we hit an expectation to // see a line, option, or command. specifically, we're waiting // to see if we got a Line, Select, Command or Assert step @@ -76,8 +76,30 @@ impl TestPlan { self.next_expected_step = current_step.expected_step_type; return; } - ExpectedStepType::Set => todo!(), - ExpectedStepType::Run => todo!(), + ExpectedStepType::Set => { + let Some(StepValue::StringPair(var, value)) = current_step.value.clone() else { + panic!("Expected run line to be a pair of strings"); + }; + + // .unwrap() used to panic on error as this is used only in Test + let current_value = dialogue.variable_storage().get(&var).unwrap(); + let new_value = match current_value { + YarnValue::Number(_) => YarnValue::Number(value.parse::().unwrap()), + YarnValue::String(_) => YarnValue::String(value), + YarnValue::Boolean(_) => YarnValue::Boolean(value.parse::().unwrap()), + }; + + println!("INFO: Variable {} set to {}", var, new_value); + dialogue.variable_storage_mut().set(var, new_value).unwrap(); + } + ExpectedStepType::Run => { + let Some(StepValue::String(next_node)) = current_step.value.clone() else { + panic!("Expected run line to be a string"); + }; + + println!("INFO: Jumped to node {}", next_node); + let _ = dialogue.set_node(next_node); + } } } @@ -86,8 +108,8 @@ impl TestPlan { self.next_expected_step = ExpectedStepType::Stop; } - pub fn current_step(self) -> Step { - self.steps[self.current_test_plan_step].clone() + pub fn current_step(&self) -> Option { + self.steps.get(self.current_test_plan_step).cloned() } pub fn expect_line(mut self, line: impl Into) -> Self { From f2b0d3e5fb29ac676794a577c23c1b237b64bfa8 Mon Sep 17 00:00:00 2001 From: Galdormin Date: Sun, 1 Mar 2026 18:25:24 +0100 Subject: [PATCH 14/14] fix web build + move function to builder to library --- Cargo.lock | 232 ++---------------- crates/bevy_plugin/Cargo.toml | 25 +- .../src/dialogue_runner/builder.rs | 83 +------ crates/core/Cargo.toml | 5 +- crates/core/src/library.rs | 68 ++++- .../assets/dialogue/custom_function.yarn | 6 +- 6 files changed, 94 insertions(+), 325 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bff3d404f..db9cbf5b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -92,7 +92,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.3.3", + "getrandom", "once_cell", "version_check", "zerocopy", @@ -1033,7 +1033,7 @@ dependencies = [ "glam", "itertools 0.14.0", "libm", - "rand 0.9.2", + "rand", "rand_distr", "serde", "thiserror 2.0.17", @@ -1642,7 +1642,6 @@ dependencies = [ "bevy", "csv", "glob", - "rand 0.9.2", "serde", "sha2", "static_assertions", @@ -1660,7 +1659,7 @@ dependencies = [ "bevy_sprite3d", "bevy_yarnspinner", "bevy_yarnspinner_example_dialogue_view", - "getrandom 0.3.3", + "getrandom", ] [[package]] @@ -1920,17 +1919,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "chacha20" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" -dependencies = [ - "cfg-if", - "cpufeatures 0.3.0", - "rand_core 0.10.0", -] - [[package]] name = "clang-sys" version = "1.8.1" @@ -2178,15 +2166,6 @@ dependencies = [ "libc", ] -[[package]] -name = "cpufeatures" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" -dependencies = [ - "libc", -] - [[package]] name = "crc32fast" version = "1.5.0" @@ -2761,20 +2740,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "getrandom" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "rand_core 0.10.0", - "wasip2", - "wasip3", -] - [[package]] name = "gilrs" version = "0.11.0" @@ -2829,7 +2794,7 @@ dependencies = [ "bytemuck", "encase", "libm", - "rand 0.9.2", + "rand", "serde_core", ] @@ -3155,12 +3120,6 @@ dependencies = [ "syn", ] -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - [[package]] name = "image" version = "0.25.8" @@ -3304,7 +3263,7 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.3.3", + "getrandom", "libc", ] @@ -3370,12 +3329,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - [[package]] name = "lewton" version = "0.10.2" @@ -4472,18 +4425,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha", - "rand_core 0.9.3", -] - -[[package]] -name = "rand" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" -dependencies = [ - "chacha20", - "getrandom 0.4.1", - "rand_core 0.10.0", + "rand_core", ] [[package]] @@ -4493,7 +4435,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core", ] [[package]] @@ -4502,15 +4444,9 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.3", + "getrandom", ] -[[package]] -name = "rand_core" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" - [[package]] name = "rand_distr" version = "0.5.1" @@ -4518,7 +4454,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand 0.9.2", + "rand", ] [[package]] @@ -4777,12 +4713,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" - [[package]] name = "send_wrapper" version = "0.6.0" @@ -4839,7 +4769,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", + "cpufeatures", "digest", ] @@ -5127,7 +5057,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom 0.3.3", + "getrandom", "once_cell", "rustix 1.1.2", "windows-sys 0.61.2", @@ -5475,7 +5405,7 @@ version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.3.3", + "getrandom", "js-sys", "serde", "wasm-bindgen", @@ -5541,16 +5471,7 @@ version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen 0.46.0", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen 0.51.0", + "wit-bindgen", ] [[package]] @@ -5612,40 +5533,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags 2.9.4", - "hashbrown 0.15.5", - "indexmap", - "semver", -] - [[package]] name = "wayland-backend" version = "0.3.11" @@ -6611,94 +6498,6 @@ version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck", - "indexmap", - "prettyplease", - "syn", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags 2.9.4", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] - [[package]] name = "writeable" version = "0.5.5" @@ -6801,7 +6600,7 @@ dependencies = [ "crc32fast", "globset", "instant", - "rand 0.9.2", + "rand", "regex", "serde", "serde_json", @@ -6815,9 +6614,10 @@ name = "yarnspinner_core" version = "0.7.0" dependencies = [ "bevy", + "getrandom", "hashbrown 0.15.5", "prost", - "rand 0.10.0", + "rand", "serde", "static_assertions", "variadics_please", diff --git a/crates/bevy_plugin/Cargo.toml b/crates/bevy_plugin/Cargo.toml index 1931acc7e..7e60d79ec 100644 --- a/crates/bevy_plugin/Cargo.toml +++ b/crates/bevy_plugin/Cargo.toml @@ -4,36 +4,31 @@ version = "0.7.0" edition = "2024" repository = "https://github.com/YarnSpinnerTool/YarnSpinner-Rust" homepage = "https://docs.yarnspinner.dev/" -keywords = ["gamedev", "dialog", "yarn", "bevy"] -categories = ["game-development", "compilers"] -authors = ["Jan Hohenheim "] +keywords = [ "gamedev", "dialog", "yarn", "bevy" ] +categories = [ "game-development", "compilers" ] +authors = [ "Jan Hohenheim " ] license = "MIT OR Apache-2.0" -exclude = ["assets", "wasm"] +exclude = [ "assets", "wasm" ] description = "Bevy plugin for Yarn Spinner for Rust, friendly tool for writing game dialogue" readme = "../../readme.md" [features] -default = [] -audio_assets = ["bevy/bevy_audio", "bevy/vorbis"] +default = [ ] +audio_assets = [ "bevy/bevy_audio", "bevy/vorbis" ] [dependencies] anyhow = "1" csv = "1" -serde = { version = "1", features = ["derive"] } +serde = { version = "1", features = [ "derive" ] } yarnspinner_internal_shared = { path = "../internal_shared", version = "0.1.0" } -yarnspinner = { path = "../yarnspinner", features = [ - "bevy", - "serde", -], version = "0.7.0" } +yarnspinner = { path = "../yarnspinner", features = [ "bevy", "serde" ], version = "0.7.0" } sha2 = "0.10" -rand = { version = "0.9", features = ["small_rng"] } variadics_please = "1" - [dependencies.bevy] version = "0.18" default-features = false -features = ["bevy_asset", "multi_threaded", "bevy_log"] +features = [ "bevy_asset", "multi_threaded", "bevy_log" ] [dev-dependencies] tempfile = "3" @@ -42,7 +37,7 @@ static_assertions = "1.1.0" [dev-dependencies.bevy] version = "0.18" default-features = false -features = ["bevy_core_pipeline", "bevy_audio"] +features = [ "bevy_core_pipeline", "bevy_audio" ] [target.'cfg(all(not(target_arch = "wasm32"), not(target_os = "android")))'.dependencies] glob = "0.3.1" diff --git a/crates/bevy_plugin/src/dialogue_runner/builder.rs b/crates/bevy_plugin/src/dialogue_runner/builder.rs index e667f158e..1836ee7f9 100644 --- a/crates/bevy_plugin/src/dialogue_runner/builder.rs +++ b/crates/bevy_plugin/src/dialogue_runner/builder.rs @@ -4,7 +4,6 @@ use crate::line_provider::SharedTextProvider; use crate::prelude::*; use bevy::platform::collections::HashMap; use bevy::prelude::*; -use rand::{Rng, SeedableRng, rngs::SmallRng}; use std::any::{Any, TypeId}; use std::fmt::Debug; @@ -32,7 +31,7 @@ impl DialogueRunnerBuilder { yarn_project, )), asset_providers: HashMap::default(), - library: create_extended_standard_library(), + library: YarnLibrary::standard_library(), commands: YarnCommands::builtin_commands(commands), compilation: yarn_project.compilation().clone(), localizations: yarn_project.localizations().cloned(), @@ -119,83 +118,3 @@ impl DialogueRunnerBuilder { Ok(dialogue_runner) } } - -fn create_extended_standard_library() -> YarnLibrary { - let mut library = YarnLibrary::standard_library(); - library - .add_function("random", || SmallRng::from_os_rng().random_range(0.0..1.0)) - .add_function("random_range", |min: f32, max: f32| { - if let Some(min) = min.as_int() - && let Some(max_inclusive) = max.as_int() - { - return SmallRng::from_os_rng().random_range(min..=max_inclusive) as f32; - } - SmallRng::from_os_rng().random_range(min..max) - }) - .add_function("dice", |sides: u32| { - if sides == 0 { - return 1; - } - SmallRng::from_os_rng().random_range(1..=sides) - }) - .add_function("round", |num: f32| num.round() as i32) - .add_function("round_places", |num: f32, places: u32| { - num.round_places(places) - }) - .add_function("floor", |num: f32| num.floor() as i32) - .add_function("ceil", |num: f32| num.ceil() as i32) - .add_function("inc", |num: f32| { - if let Some(num) = num.as_int() { - num + 1 - } else { - num.ceil() as i32 - } - }) - .add_function("dec", |num: f32| { - if let Some(num) = num.as_int() { - num - 1 - } else { - num.floor() as i32 - } - }) - .add_function("decimal", |num: f32| num.fract()) - .add_function("int", |num: f32| num.trunc() as i32); - library -} - -trait FloatExt: Copy { - fn as_int(self) -> Option; - fn round_places(self, places: u32) -> Self; -} - -impl FloatExt for f32 { - fn as_int(self) -> Option { - (self.fract() <= f32::EPSILON).then_some(self as i32) - } - - fn round_places(self, places: u32) -> Self { - let factor = 10_u32.pow(places) as f32; - (self * factor).round() / factor - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn rounds_places() { - for (num, places, expected) in [ - (1.0, 0, 1.0), - (1.2, 1, 1.2), - (0.4, 0, 0.0), - (43.132, 0, 43.0), - (1.1, 2, 1.1), - (123.123, 3, 123.123), - (-10.3, 1, -10.3), - (-11.99, 1, -12.0), - ] { - assert_eq!(expected, num.round_places(places)); - } - } -} diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 3ffc517b7..6b670c3e0 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -9,6 +9,9 @@ authors = [ "Jan Hohenheim " ] license = "MIT OR Apache-2.0" description = "Core concepts for Yarn Spinner for Rust, the friendly tool for writing game dialogue" +[target.wasm32-unknown-unknown.dependencies] +getrandom = { version = "0.3", features = [ "wasm_js" ] } + [features] default = [ "std" ] std = [ "prost/std" ] @@ -16,7 +19,7 @@ serde = [ "dep:serde", "bevy?/serialize", "hashbrown/serde" ] bevy = [ "dep:bevy" ] [dependencies] -rand = { version = "0.10", default-features = false, features = [ "thread_rng" ] } +rand = { version = "0.9", default-features = false, features = [ "small_rng" ] } prost = { version = "0.12", default-features = false, features = [ "prost-derive" ] } serde = { version = "1", features = [ "derive" ], optional = true } bevy = { version = "0.18", default-features = false, optional = true, features = [ "std" ] } diff --git a/crates/core/src/library.rs b/crates/core/src/library.rs index 32cba35bf..caeab1ac4 100644 --- a/crates/core/src/library.rs +++ b/crates/core/src/library.rs @@ -5,6 +5,7 @@ use alloc::borrow::Cow; use core::fmt::Display; use hashbrown::hash_map; +use rand::{Rng, SeedableRng, rngs::SmallRng}; /// A collection of functions that can be called from Yarn scripts. /// @@ -77,19 +78,31 @@ impl Library { "number" => |value: YarnValue| f32::try_from(value).expect("Failed to convert a Yarn value to a number"), "bool" => |value: YarnValue| bool::try_from(value).expect("Failed to convert a Yarn value to a bool"), "format_invariant" => |value: f32| value.to_string(), - "random" => rand::random::, - "random_range" => |min: i32, max: i32| rand::random_range::(min..max), + "random" => || SmallRng::from_os_rng().random_range(0.0..1.0), + "random_range" => |min: f32, max: f32| { + if let Some(min) = min.as_int() + && let Some(max_inclusive) = max.as_int() + { + return SmallRng::from_os_rng().random_range(min..=max_inclusive) as f32; + } + SmallRng::from_os_rng().random_range(min..max) + }, "random_range_float" => |min: f32, max: f32| rand::random_range::(min..=max), - "dice" => |sides: u32| rand::random_range::(1..=sides), - "round" => |value: f32| value.round(), - // "round_places" => Cannot round_places in rust - "floor" => |value: f32| value.floor(), - "ceil" => |value: f32| value.ceil(), + "dice" => |sides: u32| { + if sides == 0 { + return 1; + } + SmallRng::from_os_rng().random_range(1..=sides) + }, + "round" => |value: f32| value.round() as i32, + "round_places" => |value: f32, places: u32| value.round_places(places), + "floor" => |value: f32| value.floor() as i32, + "ceil" => |value: f32| value.ceil() as i32, "inc" => |value: f32| value.floor() as i32 + 1, "dec" => |value: f32| value.ceil() as i32 - 1, "decimal" => |value: f32| value.fract(), - "int" => |value: f32| value.trunc(), - // "format" => TODO: Need to implement an equivalent to C# formatter + "int" => |value: f32| value.trunc() as i32, + // "format" => TODO: Hard to do without dedicated crate. Is it useful ? ); for r#type in [Type::Number, Type::String, Type::Boolean] { library.add_methods(r#type); @@ -225,3 +238,40 @@ macro_rules! yarn_library { }; } pub use yarn_library; + +trait FloatExt: Copy { + fn as_int(self) -> Option; + fn round_places(self, places: u32) -> Self; +} + +impl FloatExt for f32 { + fn as_int(self) -> Option { + (self.fract().abs() <= f32::EPSILON).then_some(self as i32) + } + + fn round_places(self, places: u32) -> Self { + let factor = 10_u32.pow(places) as f32; + (self * factor).round() / factor + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn rounds_places() { + for (num, places, expected) in [ + (1.0, 0, 1.0), + (1.2, 1, 1.2), + (0.4, 0, 0.0), + (43.132, 0, 43.0), + (1.1, 2, 1.1), + (123.123, 3, 123.123), + (-10.3, 1, -10.3), + (-11.99, 1, -12.0), + ] { + assert_eq!(expected, num.round_places(places)); + } + } +} diff --git a/examples/yarnspinner_without_bevy/assets/dialogue/custom_function.yarn b/examples/yarnspinner_without_bevy/assets/dialogue/custom_function.yarn index a08a8d9ea..1ef534835 100644 --- a/examples/yarnspinner_without_bevy/assets/dialogue/custom_function.yarn +++ b/examples/yarnspinner_without_bevy/assets/dialogue/custom_function.yarn @@ -1,6 +1,8 @@ title: CustomFunction --- -Rust functions can be registered into your dialogue's library to make them runnable via Yarn. -Let's take a look at a custom function now! +The following are some outputs of built-in functions. +random() = {random()} +random_range(1,10) = {random_range(1,10)} +There are more, but let's take a look at a custom function now. pow(2,3) = {pow(2,3)} ===